범용 검색

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인 경우 이를 재정의할 필요가 거의 없습니다.
  • 주어진 사용자, 기기, 구성 등에 표시되면 안 되는 결과에 상응하는 키 목록을 반환합니다. 여기서 제공된 키는 SearchIndexableResourceSearchIndexableRawKEY 필드와 일치해야 합니다.
  • 예를 들어 데이터 사용량은 기기에 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