Recherche universelle

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

Créer des paramètres indexables

Chaque fragment Settings qui doit être indexé implémente l'interface Indexable, ET nécessite le champ statique :

public static final SearchIndexProvider SEARCH_INDEX_DATA_PROVIDER

Une fois votre 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

  • Remplacez 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

  • Remplacez 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 de type DashboardFragment, vous devez rarement remplacer ce paramètre.
  • Renvoie une liste de clés correspondant à des 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, "Consommation des données" ne doit pas s'afficher pour les utilisateurs qui n'ont jamais eu 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 est utilisée pour former des résultats intégrés, mettre à jour les éléments non indexables, etc.

Ainsi, tout ce que vous souhaitez afficher dans la recherche doit être inclus dans getXmlResourcesToIndex ou getRawDataToIndex.

Ajoutez des mots clés à vos paramètres

Pour faciliter la recherche d'un paramètre, ajoutez des mots clés pertinents par rapport au paramètre qu'un utilisateur peut utiliser pour le rechercher.

Éléments à prendre en compte lors de l'ajout de 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 pour le fonctionnement du paramètre.
  • Il s'agit de mots que l'utilisateur est susceptible de saisir pour accéder à votre paramètre.
  • Il peut s'agir de synonymes ou de n'importe quel mot associé au paramètre.
  • Par exemple, "couper le son" peut être utilisé pour trouver le paramètre Volume.

Éviter les doublons

Si vous supprimez une page de paramètres de manière inconditionnelle, supprimez l'indexation de la page d'origine pour éviter la duplication des résultats.

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

Validation

Pour tester la possibilité de rechercher un nouveau paramètre:

  1. Installez une version récente d'O sur l'appareil.
  2. Pour réindexer la base de données, sélectionnez:
  3. Paramètres > Applications et notifications > Informations sur les applications > Paramètres > Stockage > Effacer les données
  4. Vérifiez que les paramètres de cible s'affichent dans la recherche.
    La recherche du préfixe du titre d'un paramètre correspond à celui-ci.

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 du build est: RunSettingsRoboTests