Mengukur interaksi pengguna

Panduan ini menjelaskan cara mengukur sinyal interaksi untuk Tab khusus Chrome. Jika aplikasi Anda secara rutin menampilkan link ke konten web kepada penggunanya, misalnya di feed berita, penting untuk mengetahui link mana yang dianggap berharga dan tidak penting oleh pengguna. Di Tab Khusus, Anda dapat mengukur engagement pengguna khusus sesi melalui jumlah navigasi, perubahan arah scroll, dan kedalaman scroll. Untuk melihat cara kerja sinyal interaksi, lihat aplikasi demo Tab Khusus di GitHub.

Demo sinyal interaksi Tab Khusus.

Tab Khusus menyediakan dua callback yang berbeda untuk mengukur interaksi pengguna:

  • CustomTabsCallback untuk melacak peristiwa navigasi dasar, seperti "NAVIGATION_STARTED" atau "NAVIGATION_FINISHED".
  • EngagementSignalsCallback untuk melacak engagement pengguna khusus halaman, seperti arah scroll atau persentase scroll.

Keduanya memerlukan CustomTabsServiceConnection aktif. Lihat panduan CustomTabsService sebelumnya untuk mengetahui detail tentang cara menghubungkan ke CustomTabsService.

Untuk mengukur engagement pengguna, buat instance CustomTabsCallback dan EngagementSignalsCallback terlebih dahulu. CustomTabsCallback menerima konstanta navigationEvent yang menjelaskan jenis navigasi yang terjadi:

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 mendukung tiga callback yang berbeda:

onVerticalScrollEvent()
Dipanggil setiap kali pengguna mengubah arah scroll, dengan isDirectionUp (argumen pertama) menunjukkan arah.
  1. onGreatestScrollPercentageIncreased: kedalaman scroll sinyal Tab Khusus dalam interval 5% hingga 100% saat pengguna telah mencapai bagian bawah halaman. Callback hanya dipanggil setelah pengguna berhenti men-scroll. Nilainya direset ke 0% pada setiap navigasi baru.
  2. onSessionEnded: Tab Khusus mengaktifkan peristiwa ini saat berhenti mengirim sinyal interaksi (misalnya, setelah pengguna menutup Tab Khusus). didUserInteract akan bernilai benar (true) jika pengguna berinteraksi dengan halaman dengan cara apa pun (men-scroll, mengklik tombol, dll.).
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 dan EngagementSignalsCallback memerlukan koneksi layanan Tab Khusus yang aktif. Setelah layanan terhubung, Anda dapat membuat CustomTabsSession baru dengan memanggil CustomTabsClient.newSession() dan meneruskan CustomTabsCallback.

Setelah itu, Anda harus memanggil isEngagementSignalsApiAvailable() untuk memeriksa apakah sinyal engagement didukung oleh browser saat ini. Jika didukung, Anda dapat mendaftarkan EngagementSignalsCallback Anda melalui CustomTabsSession.setEngagementSignalsCallback().

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;
    }
};

Satu-satunya hal yang perlu dilakukan adalah mengikat 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);
}