Recherche universelle

Android 8.0 ajoute des fonctionnalités de recherche étendues au menu Paramètres. Ce document explique comment ajouter un paramètre et vous assurer qu'il est correctement indexé pour la recherche dans les paramètres.

Créer des paramètres indexables

Chaque fragment de paramètres à indexer implémente l'interface Indexable ET nécessite le champ statique:

public static final SearchIndexProvider SEARCH_INDEX_DATA_PROVIDER

Une fois le fragment configuré pour l'indexation, ajoutez-le à SearchIndexableResources, disponible à l'adresse:
packages/apps/Settings/src/com/android/settings/search/SearchIndexableResources.java

Méthodes facultatives

Cette interface SearchIndexProvider comporte quatre méthodes facultatives.

getXmlResourcesToIndex

  • Forcez cette valeur si le contenu de votre fragment provient de: preference xml
  • Renvoie une préférence XML sous forme de liste à indexer.

Exemple de ressources XML:

public List<SearchIndexableResource> getXmlResourcesToIndex(Context context, boolean enabled) {
    ArrayList<SearchIndexableResource> result =  new ArrayList<SearchIndexableResource>();
SearchIndexableResource sir = new SearchIndexableResource(context);
	sir.xmlResId = R.xml.display_settings;
	result.add(sir);

    return result;
}

getRawDataToIndex

  • Ignorez cette valeur si le contenu de votre fragment ne provient PAS de: preference xml
  • Renvoie une liste de données brutes (SearchIndexableRaw) à indexer.

Exemple de données brutes:

public List<SearchIndexableRaw> getRawDataToIndex(Context context, boolean enabled) {
              final List<SearchIndexableRaw> result = new ArrayList<>();
              final Resources res = context.getResources();

              // Add fragment title
       SearchIndexableRaw data = new SearchIndexableRaw(context);
       data.title = res.getString(R.string.wifi_settings);
       data.screenTitle = res.getString(R.string.wifi_settings);
       data.keywords = res.getString(R.string.keywords_wifi);
       data.key = DATA_KEY_REFERENCE;
       result.add(data);

       return result;
}

getNonIndexableKeys

  • Si votre fragment est un DashboardFragment, vous n'avez que rarement besoin de le remplacer.
  • Renvoie une liste de clés correspondant aux résultats qui ne doivent pas s'afficher pour l'utilisateur, l'appareil, la configuration, etc. donnés. Les clés fournies ici doivent correspondre au champ KEY dans SearchIndexableResource et SearchIndexableRaw.
  • Par exemple, la consommation de données ne doit pas s'afficher pour les utilisateurs qui n'ont jamais inséré de carte SIM dans leur appareil.

Exemple de clés non indexables:

public List<String> getNonIndexableKeys(Context context) {
      final List<String> keys = super.getNonIndexableKeys(context);
              if (!checkIntentAction(context, "android.settings.TERMS")) {
                  keys.add(KEY_TERMS);
              }
              if (!checkIntentAction(context, "android.settings.LICENSE")) {
                  keys.add(KEY_LICENSE);
              }
              if (!checkIntentAction(context, "android.settings.COPYRIGHT")) {
                  keys.add(KEY_COPYRIGHT);
              }
              if (!checkIntentAction(context, "android.settings.WEBVIEW_LICENSE")) {
                  keys.add(KEY_WEBVIEW_LICENSE);
              }
              return keys;
}

getPreferenceControllers

Renvoie une liste de contrôleurs de préférences associés à ce fragment. Cette liste permet de créer des résultats intégrés, de mettre à jour les éléments non indexables, etc.

Par conséquent, tout ce que vous souhaitez afficher dans la recherche doit être inclus dans getXmlResourcesToIndex ou getRawDataToIndex.

Ajouter des mots clés pour vos paramètres

Pour vous assurer qu'un paramètre est facilement accessible par recherche, ajoutez des mots clés pertinents pour le paramètre qu'un utilisateur peut utiliser pour le rechercher.

Éléments à prendre en compte lorsque vous ajoutez des mots clés:

  • Les mots clés sont une liste de mots que l'utilisateur ne voit pas nécessairement, mais qui peuvent faire partie de son modèle mental sur le fonctionnement du paramètre.
  • Il s'agit des mots que l'utilisateur peut saisir pour accéder à votre paramètre.
  • Il peut s'agir de synonymes ou de tout mot associé au paramètre.
  • Par exemple, vous pouvez utiliser "couper le son" pour trouver le paramètre de volume.

Éviter les doublons

Si vous supprimez une page de paramètres sans condition, supprimez l'indexation de la page d'origine pour éviter de dupliquer les résultats.

  1. Recherchez l'PreferenceFragment de la page que vous supprimez.
  2. Supprimez SearchIndexProvider.

Validation

Pour tester la rechercheabilité d'un nouveau paramètre:

  1. Installez une version récente d'O sur l'appareil.
  2. Réindexez la base de données en sélectionnant:
  3. Paramètres > Applications et notifications > Informations sur les applications > Paramètres > Espace de stockage > Effacer les données
  4. Vérifiez que les paramètres de ciblage s'affichent dans la recherche.
    Rechercher un préfixe du titre d'un paramètre permet de le faire correspondre.

Ces tests Robolectric peuvent être exécutés pour valider l'implémentation de cette fonctionnalité:
packages/apps/Settings/tests/robotests/src/com/android/settings/search

La cible de compilation est: RunSettingsRoboTests