חיפוש אוניברסלי

ב-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

יעד ה-build הוא: RunSettingsRoboTests