Évaluer l'intérêt des utilisateurs

Ce guide explique comment mesurer les signaux d'engagement pour les onglets personnalisés Chrome. Si votre application présente régulièrement des liens vers du contenu Web à ses utilisateurs (dans un flux d'actualités, par exemple), il peut être important d'identifier les liens qui sont utiles ou non. Dans les onglets personnalisés, vous pouvez mesurer l'engagement utilisateur spécifique à une session en fonction du nombre de navigations, des changements de direction et de la profondeur du défilement. Pour voir concrètement les signaux d'engagement, consultez l'application de démonstration des onglets personnalisés sur GitHub.

Démonstration des signaux d'engagement dans l'onglet personnalisé

Les onglets personnalisés fournissent deux rappels différents pour mesurer l'engagement utilisateur:

  • CustomTabsCallback pour suivre les événements de navigation de base, tels que "NAVIGATION_STARTED" ou "NAVIGATION_FINISHED".
  • EngagementSignalsCallback pour suivre l'engagement utilisateur spécifique à une page, comme la direction ou le pourcentage de défilement.

Les deux nécessitent un CustomTabsServiceConnection actif. Consultez le guide CustomTabsService précédent pour savoir comment vous connecter à un CustomTabsService.

Pour mesurer l'engagement utilisateur, commencez par créer une instance CustomTabsCallback et une instance EngagementSignalsCallback. CustomTabsCallback reçoit une constante navigationEvent décrivant le type de navigation qui s'est produit:

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 accepte trois rappels différents:

onVerticalScrollEvent()
Appelée chaque fois que l'utilisateur change de direction de défilement, où isDirectionUp (le premier argument) indique la direction.
  1. onGreatestScrollPercentageIncreased: l'onglet personnalisé indique la profondeur de défilement par intervalles de 5 %, jusqu'à 100% lorsque l'utilisateur a atteint le bas de la page. Le rappel n'est invoqué que lorsque l'utilisateur arrête le défilement. La valeur est réinitialisée à 0% à chaque nouvelle navigation.
  2. onSessionEnded: l'onglet personnalisé déclenche cet événement lorsqu'il n'envoie plus de signaux d'engagement (par exemple, après que l'utilisateur a fermé l'onglet personnalisé). didUserInteract est défini sur "true" si l'utilisateur a interagi avec la page de quelque manière que ce soit (défilement, clic sur un bouton, etc.).
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 et EngagementSignalsCallback nécessitent une connexion active au service Onglet personnalisé. Une fois le service connecté, vous pouvez créer un CustomTabsSession en appelant CustomTabsClient.newSession() et en transmettant CustomTabsCallback.

Vous devez ensuite appeler isEngagementSignalsApiAvailable() pour vérifier si les signaux d'engagement sont compatibles avec le navigateur actuel. S'ils sont compatibles, vous pouvez enregistrer vos EngagementSignalsCallback via 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;
    }
};

Il ne vous reste plus qu'à lier 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);
}