ব্যবহারকারীর ব্যস্ততা পরিমাপ করুন

এই নির্দেশিকা ব্যাখ্যা করে কিভাবে 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);
}