ユニバーサル検索

Android 8.0 には、設定メニューの拡張検索機能が追加されています。このドキュメントでは、設定を追加して、設定検索に適切にインデックス登録されるようにする方法を説明します。

インデックス登録できる設定の作成

インデックス登録が必要な各設定フラグメントには、Indexable インターフェースの実装と、次の静的項目が必要です。

public static final SearchIndexProvider SEARCH_INDEX_DATA_PROVIDER

インデックス登録用にフラグメントを設定したら、以下の場所にある SearchIndexableResources に追加します。
packages/apps/Settings/src/com/android/settings/search/SearchIndexableResources.java

オプションのメソッド

この SearchIndexProvider インターフェースにはオプションのメソッドが 4 つあります。

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 である場合、これをオーバーライドする必要はほとんどありません。
  • 指定のユーザー、デバイス、設定などについて表示されない結果に対応するキーのリストが返されます。ここで提供されるキーは、SearchIndexableResourceSearchIndexableRaw の KEY 項目に一致する必要があります。
  • たとえば、デバイスに 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