Pesquisa universal

O Android 8.0 adiciona mais recursos de pesquisa ao menu Configurações. Este documento descreve como adicionar uma configuração e garantir que ela seja devidamente indexada para pesquisa de configurações.

Criar configurações indexáveis

Cada fragmento de configurações que precisa ser indexado implementa a interface Indexable E exige o campo estático:

public static final SearchIndexProvider SEARCH_INDEX_DATA_PROVIDER

Depois de configurar o fragmento para indexação, adicione-o ao SearchIndexableResources encontrado em:
packages/apps/Settings/src/com/android/settings/search/SearchIndexableResources.java

Métodos opcionais

Essa interface SearchIndexProvider tem quatro métodos opcionais.

getXmlResourcesToIndex

  • Modifique isso se o conteúdo do fragmento for de: preference xml
  • Retorna uma preferência XML como uma lista a ser indexada.

Exemplo 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

  • Modifique isso se o conteúdo do fragmento NÃO for de: preference xml
  • Retorna uma lista de dados brutos (SearchIndexableRaw) a serem indexados.

Exemplo de dados brutos:

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

  • Se o fragmento for um DashboardFragment, raramente será necessário substituí-lo.
  • Retorna uma lista de chaves que corresponde aos resultados que não aparecem para determinado usuário, dispositivo, configuração etc.As chaves fornecidas aqui precisam corresponder ao campo KEY em SearchIndexableResource e SearchIndexableRaw.
  • Por exemplo: o uso de dados não deve ser exibido para usuários que nunca tiveram um chip no dispositivo.

Exemplo de chaves não indexáveis:

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

Retorna uma lista de controladores de preferência associados a este fragmento. Essa lista é usada para formar resultados inline, atualizar itens não indexáveis etc.

Assim, tudo o que você quiser que apareça na pesquisa precisa ser incluído em getXmlResourcesToIndex ou getRawDataToIndex.

Adicionar palavras-chave para suas configurações

Para garantir que uma configuração seja facilmente pesquisável, adicione palavras-chave relevantes para a configuração que um usuário pode usar para pesquisá-la.

Considerações ao adicionar palavras-chave:

  • Palavras-chave são uma lista de termos que o usuário não necessariamente vê, mas que podem fazer parte do modelo mental de como a configuração funciona.
  • São palavras que o usuário pode digitar para acessar sua configuração.
  • Podem ser sinônimos ou qualquer palavra associada à configuração.
  • Por exemplo, a opção "Desativar som" pode ser usada para encontrar a configuração de volume.

Evitar duplicação

Se você estiver suprimindo incondicionalmente uma página de configurações, remova a indexação da página original para evitar a duplicação de resultados.

  1. Localize o PreferenceFragment da página que você está suprimindo.
  2. Remova a SearchIndexProvider.

Validação

Para testar o potencial de pesquisa de uma nova configuração:

  1. Instale uma versão recente do O no dispositivo.
  2. Reindexe o banco de dados selecionando:
  3. Configurações > Apps e notificações > Informações dos apps > Configurações > Armazenamento > Limpar dados
  4. Verifique se as configurações de destino aparecem na pesquisa.
    A pesquisa pelo prefixo do título de uma configuração fará a correspondência.

Estes testes Robolectric podem ser executados para validar a implementação desse recurso:
packages/apps/Settings/tests/robotests/src/com/android/settings/search

O destino do build é: RunSettingsRoboTests