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

В 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. Проверьте, отображаются ли целевые настройки в результатах поиска.
    При поиске по префиксу названия настройки будет найдена эта настройка.

Эти тесты Robolectric можно запустить, чтобы проверить реализацию функции:
packages/apps/Settings/tests/robotests/src/com/android/settings/search

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