Intégration de l'application associée à l'Association express

L'Association express permet aux applications associées OEM d'être profondément intégrées à l'association et à l'expérience d'utilisation. Plusieurs points d'intégration peuvent éventuellement être utilisés pour engager les utilisateurs une fois l'association express terminée.

Installation lors de la première utilisation

L'Association express permet aux utilisateurs de télécharger l'application associée pour leur casque lors de la dernière étape de l'expérience OOBE. L'utilisateur reçoit une notification lui indiquant que l'association est terminée et qu'il peut soit télécharger l'application si elle n'est pas déjà installée, soit l'ouvrir et commencer à l'utiliser.

Pour commencer à utiliser cette fonctionnalité, ajoutez le nom de package de votre application associée aux détails de l'appareil dans la console.

Les applications associées lancées par l'Association express incluent un élément de données supplémentaire:

  • android.bluetooth.device.extra.DEVICE : appareil Bluetooth qui a déclenché la notification.

Intégration des tranches de paramètres

Les segments d'application peuvent être fournis par une application associée pour améliorer davantage les options disponibles sur la page des paramètres Bluetooth d'un appareil.

Un SliceProvider doit être implémenté par une application associée pour fournir ces tranches de paramètres. Deux types de segments sont disponibles: un segment OOBE et des éléments de paramètres génériques. La tranche OOBE doit être incluse si l'utilisateur n'a pas encore configuré le casque dans l'application associée, et les tranches restantes doivent toujours l'être (voir l'exemple de code ci-dessous) :

@Nullable
@Override
public Slice onBindSlice(Uri sliceUri) {
  String address = sliceUri.getQueryParameter("addr");
  if (address == null) {
    return null;
  }
  String path = sliceUri.getPathSegments().get(/* index= */ 0);
  if ("settings_slice".equals(path)) {
    return createSettingSlice(sliceUri, address);
  } else if ("oobe_slice".equals(path)) {
    return createOobeReminderSlice(sliceUri, address);
  }
  return null;
}

oobe_slice permet de rappeler aux utilisateurs de terminer la configuration de leur appareil, s'ils ne l'ont pas encore fait dans l'application associée. L'application associée ne doit pas fournir à nouveau le segment une fois que l'utilisateur a terminé la configuration de l'appareil.

@Nullable
private Slice createOobeReminderSlice(Uri sliceUri, String address) {
  if (!deviceHasGoneThroughOobe(address)) {
    ListBuilder listBuilder =
        new ListBuilder(context, sliceUri, ListBuilder.INFINITY);
    addOobeSlice(listBuilder, context, address);
    return listBuilder.build();
  }
  return null;
}

private static void addOobeSlice(
    ListBuilder listBuilder, Context context, String address) {
  listBuilder.addRow(
      createRow(
          context,
          R.drawable.icon_oobe,
          R.string.title_oobe,
          R.string.summary_oobe,
          R.string.label_oobe,
          createOobePendingIntent(context, address)));
}

setting_slice permet aux applications associées de fournir des liens vers des paramètres couramment utilisés.

private Slice createSettingSlice(Uri sliceUri, String address) {
  ListBuilder listBuilder =
      new ListBuilder(context, sliceUri, ListBuilder.INFINITY);
  // TODO: Add your customized slice here.
  addRow1(listBuilder, context, address);
  addRow2(listBuilder, context, address);
  return listBuilder.build();
}

private static void addRow1(
    ListBuilder listBuilder, Context context, String address) {
  listBuilder.addRow(
      createRow(
          context,
          R.drawable.fp_slice_row1_icon,
          R.string.fp_slice_row1_title_gestures,
          R.string.fp_slice_row1_summary_gestures,
          R.string.fp_slice_row1_label_gestures,
          createPendingIntent(context, address)));
}

private static void addRow2(
    ListBuilder listBuilder, Context context, String address) {
  ...
}

Chaque segment doit comporter un titre, un sous-titre, une icône et une action.

private static RowBuilder createRow(
    Context context,
    @DrawableRes int iconId,
    @StringRes int titleId,
    @StringRes int summaryId,
    @StringRes int actionTitleId,
    PendingIntent pendingIntent) {
  SliceAction action =
      SliceAction.createDeeplink(
          pendingIntent,
          IconCompat.createWithResource(context, iconId),
          ListBuilder.ICON_IMAGE,
          context.getString(actionTitleId));
  return new RowBuilder()
      .setTitleItem(
          IconCompat.createWithResource(context, iconId),
          ListBuilder.ICON_IMAGE)
      .setTitle(context.getString(titleId))
      .setSubtitle(context.getString(summaryId))
      .setPrimaryAction(action);
}

Ajoutez les éléments suivants à la console après avoir implémenté SliceProvider pour permettre au service Association express de vérifier qu'il communique avec la bonne application:

Intent de mise à jour du micrologiciel

Lorsque la version du micrologiciel d'un appareil connecté est obsolète ou qu'elle est différente de celle configurée dans la console de l'appareil, l'Association express envoie une notification à l'application associée avec un intent com.google.android.gms.nearby.fastpair.ACTION_FIRMWARE_UPDATE_BROADCAST après la vérification de la version du micrologiciel. L'intent contient les informations supplémentaires suivantes:

  • com.google.android.gms.nearby.fastpair.EXTRA_LOCAL_FIRMWARE_VERSION, la version du micrologiciel de l'appareil connecté
  • com.google.android.gms.nearby.fastpair.EXTRA_UPDATE_NOTIFICATION_SHOWN, défini sur true si l'Association express a affiché une notification