उपयोगकर्ता से जुड़ने का तरीका समझना

इस गाइड में, Chrome के कस्टम टैब के लिए यूज़र ऐक्टिविटी के सिग्नल को मेज़र करने का तरीका बताया गया है. अगर आपका ऐप्लिकेशन, अपने उपयोगकर्ताओं को नियमित तौर पर वेब कॉन्टेंट के लिंक दिखाता है, जैसे कि न्यूज़ फ़ीड में, तो यह जानना ज़रूरी हो सकता है कि उपयोगकर्ताओं को कौनसे लिंक काम के लगते हैं और कौनसे नहीं. कस्टम टैब में, नेविगेशन की संख्या, स्क्रोल के दिशा में हुए बदलाव, और स्क्रोल की गहराई के हिसाब से, सेशन के हिसाब से उपयोगकर्ता के जुड़ाव को मेज़र किया जा सकता है. दर्शकों की दिलचस्पी से जुड़े सिग्नल का इस्तेमाल करने के लिए, GitHub पर कस्टम टैब का डेमो ऐप्लिकेशन देखें.

कस्टम टैब में यूज़र ऐक्टिविटी के सिग्नल का डेमो.

कस्टम टैब, उपयोगकर्ता के जुड़ाव को मेज़र करने के लिए दो अलग-अलग कॉलबैक उपलब्ध कराते हैं:

  • "NAVIGATION_STARTED" या "NAVIGATION_FINISHED" जैसे बुनियादी नेविगेशन इवेंट को ट्रैक करने के लिए, CustomTabsCallback.
  • EngagementSignalsCallback: पेज पर उपयोगकर्ता के जुड़ाव को ट्रैक करने के लिए. जैसे, स्क्रोल करने की दिशा या स्क्रोल करने का प्रतिशत.

दोनों के लिए, चालू CustomTabsServiceConnection की ज़रूरत होती है. CustomTabsService से कनेक्ट करने का तरीका जानने के लिए, CustomTabsService से जुड़ी पिछली गाइड देखें.

उपयोगकर्ता ऐक्टिविटी को मेज़र करने के लिए, पहले एक CustomTabsCallback और एक EngagementSignalsCallback इंस्टेंस बनाएं. CustomTabsCallback को एक navigationEvent कॉन्स्टेंट मिलता है, जिसमें यह बताया जाता है कि किस तरह का नेविगेशन हुआ:

private CustomTabsCallback mCustomTabsCallback = new CustomTabsCallback() {
    @Override
    public void onNavigationEvent(int navigationEvent, @Nullable Bundle extras) {
        String event;
        switch (navigationEvent) {
            case CustomTabsCallback.NAVIGATION_ABORTED:
                event = "NAVIGATION_ABORTED";
                break;
            case CustomTabsCallback.NAVIGATION_FAILED:
                event = "NAVIGATION_FAILED";
                break;
            case CustomTabsCallback.NAVIGATION_FINISHED:
                event = "NAVIGATION_FINISHED";
                break;
            case CustomTabsCallback.NAVIGATION_STARTED:
                event = "NAVIGATION_STARTED";
                break;
            case CustomTabsCallback.TAB_SHOWN:
                event = "TAB_SHOWN";
                break;
            case CustomTabsCallback.TAB_HIDDEN:
                event = "TAB_HIDDEN";
                break;
            default:
                event = String.valueOf(navigationEvent);
        }
        Log.d(TAG, "onNavigationEvent (navigationEvent=" + event + ')');
        mTextNavigation.setText("onNavigationEvent " + event);
    }
};

EngagementSignalsCallback में तीन अलग-अलग कॉलबैक काम करते हैं:

onVerticalScrollEvent()
जब भी उपयोगकर्ता स्क्रोल की दिशा बदलता है, तब इसे कॉल किया जाता है, जहां isDirectionUp (पहला आर्ग्युमेंट) निर्देश को बताता है.
  1. onGreatestScrollPercentageIncreased: कस्टम टैब, स्क्रोल डेप्थ को 5% के इंटरवल में सिग्नल करता है. यह सिग्नल 100% तक तब होता है, जब उपयोगकर्ता पेज पर सबसे नीचे पहुंच जाता है. कॉलबैक सिर्फ़ तब शुरू होता है, जब उपयोगकर्ता स्क्रोल करना बंद कर देता है. हर नए नेविगेशन के साथ, यह वैल्यू 0% पर रीसेट हो जाती है.
  2. onSessionEnded: कस्टम टैब, यूज़र ऐक्टिविटी के सिग्नल भेजना बंद करने पर यह इवेंट ट्रिगर करता है. उदाहरण के लिए, जब उपयोगकर्ता कस्टम टैब बंद कर देता है. अगर उपयोगकर्ता ने पेज के साथ किसी भी तरह से इंटरैक्ट किया है, तो didUserInteract सही होगा. जैसे, स्क्रोल करना, बटन पर क्लिक करना वगैरह.
private EngagementSignalsCallback mEngagementSignalsCallback = new EngagementSignalsCallback() {
    @Override
    public void onVerticalScrollEvent(boolean isDirectionUp, @NonNull Bundle extras) {
        Log.d(TAG, "onVerticalScrollEvent (isDirectionUp=" + isDirectionUp + ')');
        mTextVerticalScroll.setText("vertical scroll " + (isDirectionUp ? "UP️" : "DOWN"));
    }

    @Override
    public void onGreatestScrollPercentageIncreased(int scrollPercentage, @NonNull Bundle extras) {
        Log.d(TAG, "scroll percentage: " + scrollPercentage + "%");
        mTextGreatestPercentage.setText("scroll percentage: " + scrollPercentage + "%");
    }

    @Override
    public void onSessionEnded(boolean didUserInteract, @NonNull Bundle extras) {
        Log.d(TAG, "onSessionEnded (didUserInteract=" + didUserInteract + ')');
        mTextSessionEnd.setText(didUserInteract ? "session ended with user interaction" : "session ended without user interaction");
    }
};

CustomTabsCallback और EngagementSignalsCallback, दोनों के लिए कस्टम टैब सेवा का चालू कनेक्शन ज़रूरी है. सेवा कनेक्ट होने के बाद, CustomTabsClient.newSession() को कॉल करके और CustomTabsCallback को पास करके, नया CustomTabsSession बनाया जा सकता है.

इसके बाद, आपको isEngagementSignalsApiAvailable() को कॉल करके यह देखना चाहिए कि मौजूदा ब्राउज़र पर यूज़र ऐक्टिविटी के सिग्नल काम करते हैं या नहीं. अगर ये सुविधाएं काम करती हैं, तो CustomTabsSession.setEngagementSignalsCallback() की मदद से अपना EngagementSignalsCallback रजिस्टर किया जा सकता है.

private CustomTabsClient mCustomTabsClient;
private CustomTabsSession mCustomTabsSession;

private final CustomTabsServiceConnection mServiceConnectionCallback = new CustomTabsServiceConnection() {

    @Override
    public void onCustomTabsServiceConnected(@NonNull ComponentName name, @NonNull CustomTabsClient client) {
        mCustomTabsClient = client;
        mCustomTabsSession = mCustomTabsClient.newSession(mCustomTabsCallback);
        try {
            boolean engagementSignalsApiAvailable = mCustomTabsSession.isEngagementSignalsApiAvailable(Bundle.EMPTY);
            if (!engagementSignalsApiAvailable) {
                Log.d(TAG, "CustomTab Engagement signals not available, make sure to use the " +
                        "latest Chrome version and enable via chrome://flags/#cct-real-time-engagement-signals");
                return;
            }
            mCustomTabsSession.setEngagementSignalsCallback(mEngagementSignalsCallback, Bundle.EMPTY);
        } catch (RemoteException e) {
            Log.w(TAG, "The Service died while responding to the request.", e);
        } catch (UnsupportedOperationException e) {
            Log.w(TAG, "Engagement Signals API isn't supported by the browser.", e);
        }
    }

    @Override
    public void onServiceDisconnected(ComponentName name) {
        mCustomTabsClient = null;
        mConnection = null;
        mCustomTabsSession = null;
    }
};

अब सिर्फ़ CustomTabsService को बांधना बाकी है:

@Override
protected void onStart() {
    super.onStart();
    bindCustomTabsService();
}

private void bindCustomTabsService() {
    String packageName = CustomTabsHelper.getPackageNameToUse(this);
    if (packageName == null) return;
    CustomTabsClient.bindCustomTabsService(this, packageName, mConnection);
}