Búsqueda universal

Android 8.0 agrega capacidades de búsqueda expandidas para el menú de Configuración. En este documento, se describe cómo agregar un parámetro de configuración y asegurarte de que se indexe correctamente para la búsqueda de configuración.

Crear configuración indexable

Cada fragmento de Settings que debe indexarse implementa la interfaz Indexable Y requiere el campo estático:

public static final SearchIndexProvider SEARCH_INDEX_DATA_PROVIDER

Una vez que hayas configurado tu fragmento para la indexación, agrégalo a SearchIndexableResources, que se encuentra en:
packages/apps/Settings/src/com/android/settings/search/SearchIndexableResources.java

Métodos opcionales

Esta interfaz SearchIndexProvider tiene cuatro métodos opcionales.

getXmlResourcesToIndex.

  • Anula esta acción si el contenido de tu fragmento es de: preference xml
  • Muestra una preferencia XML como una lista que se indexará.

Ejemplo de recursos 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

  • Anula esta acción si el contenido de tu fragmento NO es de: preference xml
  • Muestra una lista de datos sin procesar (SearchIndexableRaw) que se indexarán.

Ejemplo de datos sin procesar:

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 tu fragmento es una DashboardFragment, rara vez tendrás que anular esto.
  • Muestra una lista de claves que corresponde a los resultados que no se deben mostrar para el usuario, el dispositivo, la configuración, etc. determinado. Las claves proporcionadas aquí deben coincidir con el campo KEY en SearchIndexableResource y SearchIndexableRaw.
  • Por ejemplo, el uso de datos no debería mostrarse a los usuarios que nunca tuvieron una tarjeta SIM en su dispositivo.

Ejemplo de claves no 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

Muestra una lista de controladores de preferencias asociados con este fragmento. Esta lista se usa para formar resultados intercalados, actualizar los elementos no indexables, etcétera.

Por lo tanto, todo lo que deseas que aparezca en la búsqueda debe incluirse en getXmlResourcesToIndex o getRawDataToIndex.

Agregar palabras clave para su configuración

Para garantizar que un parámetro de configuración se pueda buscar fácilmente, agrega palabras clave que sean relevantes para la configuración que un usuario podría usar para buscarla.

Aspectos que debes tener en cuenta al agregar palabras clave:

  • Las palabras clave son una lista de palabras que el usuario no necesariamente ve, pero que pueden ser parte de su modelo mental de cómo funciona la configuración.
  • Estas son palabras que el usuario podría escribir para acceder a tu configuración.
  • Pueden ser sinónimos o cualquier palabra asociada al parámetro de configuración.
  • Por ejemplo, es posible que se use "silencio" para encontrar la configuración del volumen.

Evita la duplicación

Si suprimes una página de configuración de forma incondicional, quita la indexación de la página original para evitar la duplicación de resultados.

  1. Busca el PreferenceFragment de la página que deseas suprimir.
  2. Quita el SearchIndexProvider.

Validación

Para probar la capacidad de búsqueda de un parámetro de configuración nuevo, haz lo siguiente:

  1. Instala una versión reciente de O en el dispositivo.
  2. Selecciona lo siguiente para volver a indexar la base de datos:
  3. Configuración > Apps y notificaciones > Información de las apps > Configuración > Almacenamiento > Borrar datos
  4. Verifica que la configuración objetivo aparezca en la búsqueda.
    Si buscas un prefijo del título de un parámetro de configuración, se coincidirá.

Estas pruebas robóticas se pueden ejecutar para validar la implementación de esta función:
packages/apps/Settings/tests/robotests/src/com/android/settings/search

El destino de compilación es RunSettingsRoboTests