Универсальный поиск

В Android 8.0 добавлены расширенные возможности поиска в меню «Настройки» . В этом документе описывается, как добавить параметр и обеспечить его правильную индексацию для поиска настроек.

Создание индексируемых настроек

Каждый фрагмент настроек, который необходимо проиндексировать, реализует интерфейс Indexable И требует статического поля:

public static final SearchIndexProvider SEARCH_INDEX_DATA_PROVIDER

После того как ваш фрагмент настроен для индексирования, добавьте его в SearchIndexableResources , расположенный по адресу:
packages/apps/Settings/src/com/android/settings/search/SearchIndexableResources.java

Дополнительные методы

Этот интерфейс SearchIndexProvider имеет четыре дополнительных метода.

getXmlResourcesToIndex

  • Переопределите это, если содержимое вашего фрагмента взято из: preference xml
  • Возвращает настройку XML в виде списка для индексации.

Пример ресурсов 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

  • Переопределите это, если содержимое вашего фрагмента НЕ из: preference xml
  • Возвращает список необработанных данных ( SearchIndexableRaw ), подлежащих индексации.

Пример необработанных данных:

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

  • Если ваш фрагмент — DashboardFragment , вам редко придется переопределять это.
  • Возвращает список ключей, соответствующих результатам, которые не должны отображаться для данного пользователя, устройства, конфигурации и т. д. Предоставленные здесь ключи должны соответствовать полю KEY в SearchIndexableResource и SearchIndexableRaw .
  • Например: «Использование данных» не должно отображаться для пользователей, у которых никогда не было SIM-карты в устройстве.

Пример неиндексируемых ключей:

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

Возвращает список контроллеров предпочтений, связанных с этим фрагментом. Этот список используется для формирования встроенных результатов, обновления неиндексируемых объектов и т. д.

Таким образом, все, что вы хотите отобразить в поиске, должно быть включено либо в getXmlResourcesToIndex , либо getRawDataToIndex .

Добавьте ключевые слова для своих настроек

Чтобы обеспечить удобство поиска параметра, добавьте ключевые слова, относящиеся к параметру, которые пользователь может использовать для поиска параметра.

Что следует учитывать при добавлении ключевых слов:

  • Ключевые слова — это список слов, которые пользователь не обязательно видит, но которые могут быть частью его мысленной модели того, как работает настройка.
  • Это слова, которые пользователь может ввести, чтобы перейти к вашим настройкам.
  • Они могут быть синонимами или могут использоваться любые слова, связанные с параметром.
  • Например, «без звука» можно использовать для поиска настройки громкости.

Избегайте дублирования

Если вы безоговорочно подавляете страницу настроек, удалите индексацию исходной страницы, чтобы избежать дублирования результатов.

  1. Найдите PreferenceFragment страницы, которую вы подавляете.
  2. Удалите SearchIndexProvider .

Валидация

Чтобы проверить возможность поиска новой настройки:

  1. Установите на устройство последнюю версию O.
  2. Переиндексируйте базу данных, выбрав:
  3. Настройки > Приложения и уведомления > Информация о приложениях > Настройки > Память > Очистить данные.
  4. Убедитесь, что целевые настройки отображаются в поиске.
    Поиск префикса названия параметра будет соответствовать ему.

Для проверки реализации этой функции можно запустить следующие робоэлектрические тесты:
packages/apps/Settings/tests/robotests/src/com/android/settings/search

Цель сборки: RunSettingsRoboTests