Add Search / Indexing to Data Usage / Mobile Hotspots

- implement a BaseSearchIndexProvider and pass all the needed
strings to index (including the Wi-Fi SSIDs)

Change-Id: Ic7a640c76cd7c2af77585e87e216b283af61a29e
diff --git a/res/xml/data_usage_metered_prefs.xml b/res/xml/data_usage_metered_prefs.xml
index a0c6df4..5026a35 100644
--- a/res/xml/data_usage_metered_prefs.xml
+++ b/res/xml/data_usage_metered_prefs.xml
@@ -14,7 +14,8 @@
      limitations under the License.
 -->
 
-<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
+<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
+                  android:title="@string/display_settings">
 
     <Preference
         android:summary="@string/data_usage_metered_body"
diff --git a/src/com/android/settings/Utils.java b/src/com/android/settings/Utils.java
index 8bcd266..78d4098 100644
--- a/src/com/android/settings/Utils.java
+++ b/src/com/android/settings/Utils.java
@@ -66,7 +66,7 @@
 import java.util.List;
 import java.util.Locale;
 
-public class Utils {
+public final class Utils {
 
     /**
      * Set the preference's title to the matching activity's label.
diff --git a/src/com/android/settings/net/DataUsageMeteredSettings.java b/src/com/android/settings/net/DataUsageMeteredSettings.java
index fb000db..87358f6 100644
--- a/src/com/android/settings/net/DataUsageMeteredSettings.java
+++ b/src/com/android/settings/net/DataUsageMeteredSettings.java
@@ -22,6 +22,7 @@
 import static com.android.settings.DataUsageSummary.hasWifiRadio;
 
 import android.content.Context;
+import android.content.res.Resources;
 import android.net.NetworkPolicy;
 import android.net.NetworkPolicyManager;
 import android.net.NetworkTemplate;
@@ -31,15 +32,23 @@
 import android.preference.CheckBoxPreference;
 import android.preference.Preference;
 import android.preference.PreferenceCategory;
+import android.provider.SearchIndexableResource;
 import android.telephony.TelephonyManager;
 
 import com.android.settings.R;
 import com.android.settings.SettingsPreferenceFragment;
+import com.android.settings.search.BaseSearchIndexProvider;
+import com.android.settings.search.Indexable;
+import com.android.settings.search.SearchIndexableRaw;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
 
 /**
  * Panel to configure {@link NetworkPolicy#metered} for networks.
  */
-public class DataUsageMeteredSettings extends SettingsPreferenceFragment {
+public class DataUsageMeteredSettings extends SettingsPreferenceFragment implements Indexable {
 
     private static final boolean SHOW_MOBILE_CATEGORY = false;
 
@@ -141,4 +150,82 @@
             }
         }
     }
+
+    /**
+     * For search
+     */
+    public static final Indexable.SearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
+        new BaseSearchIndexProvider() {
+            @Override
+            public List<SearchIndexableRaw> getRawDataToIndex(Context context, boolean enabled) {
+                final List<SearchIndexableRaw> result = new ArrayList<SearchIndexableRaw>();
+                final Resources res = context.getResources();
+
+                // Add fragment title
+                SearchIndexableRaw data = new SearchIndexableRaw(context);
+                data.title = res.getString(R.string.data_usage_menu_metered);
+                data.screenTitle = res.getString(R.string.data_usage_menu_metered);
+                result.add(data);
+
+                // Body
+                data = new SearchIndexableRaw(context);
+                data.title = res.getString(R.string.data_usage_metered_body);
+                data.screenTitle = res.getString(R.string.data_usage_menu_metered);
+                result.add(data);
+
+                if (SHOW_MOBILE_CATEGORY && hasReadyMobileRadio(context)) {
+                    // Mobile networks category
+                    data = new SearchIndexableRaw(context);
+                    data.title = res.getString(R.string.data_usage_metered_mobile);
+                    data.screenTitle = res.getString(R.string.data_usage_menu_metered);
+                    result.add(data);
+
+                    final TelephonyManager tele = TelephonyManager.from(context);
+
+                    data = new SearchIndexableRaw(context);
+                    data.title = tele.getNetworkOperatorName();
+                    data.screenTitle = res.getString(R.string.data_usage_menu_metered);
+                    result.add(data);
+                }
+
+                // Wi-Fi networks category
+                data = new SearchIndexableRaw(context);
+                data.title = res.getString(R.string.data_usage_metered_wifi);
+                data.screenTitle = res.getString(R.string.data_usage_menu_metered);
+                result.add(data);
+
+                final WifiManager wifiManager =
+                        (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
+                if (hasWifiRadio(context) && wifiManager.isWifiEnabled()) {
+                    for (WifiConfiguration config : wifiManager.getConfiguredNetworks()) {
+                        if (config.SSID != null) {
+                            final String networkId = config.SSID;
+
+                            data = new SearchIndexableRaw(context);
+                            data.title = removeDoubleQuotes(networkId);
+                            data.screenTitle = res.getString(R.string.data_usage_menu_metered);
+                            result.add(data);
+                        }
+                    }
+                } else {
+                    data = new SearchIndexableRaw(context);
+                    data.title = res.getString(R.string.data_usage_metered_wifi_disabled);
+                    data.screenTitle = res.getString(R.string.data_usage_menu_metered);
+                    result.add(data);
+                }
+
+                return result;
+            }
+
+            @Override
+            public List<String> getNonIndexableKeys(Context context) {
+                final ArrayList<String> result = new ArrayList<String>();
+                if (!SHOW_MOBILE_CATEGORY || !hasReadyMobileRadio(context)) {
+                    result.add("mobile");
+                }
+
+                return result;
+            }
+        };
+
 }
diff --git a/src/com/android/settings/search/Ranking.java b/src/com/android/settings/search/Ranking.java
index 80ea83a..b3d90dd 100644
--- a/src/com/android/settings/search/Ranking.java
+++ b/src/com/android/settings/search/Ranking.java
@@ -34,6 +34,7 @@
 import com.android.settings.fuelgauge.PowerUsageSummary;
 import com.android.settings.inputmethod.InputMethodAndLanguageSettings;
 import com.android.settings.location.LocationSettings;
+import com.android.settings.net.DataUsageMeteredSettings;
 import com.android.settings.notification.NotificationDisplaySettings;
 import com.android.settings.notification.NotificationSettings;
 import com.android.settings.notification.OtherSoundSettings;
@@ -81,50 +82,71 @@
     private static HashMap<String, Integer> sBaseRankMap = new HashMap<String, Integer>();
 
     static {
+        // Wi-Fi
         sRankMap.put(WifiSettings.class.getName(), RANK_WIFI);
         sRankMap.put(AdvancedWifiSettings.class.getName(), RANK_WIFI);
 
+        // BT
         sRankMap.put(BluetoothSettings.class.getName(), RANK_BT);
 
+        // DataUsage
         sRankMap.put(DataUsageSummary.class.getName(), RANK_DATA_USAGE);
+        sRankMap.put(DataUsageMeteredSettings.class.getName(), RANK_DATA_USAGE);
 
+        // Other wireless settinfs
         sRankMap.put(WirelessSettings.class.getName(), RANK_WIRELESS);
 
+        // Home
         sRankMap.put(HomeSettings.class.getName(), RANK_HOME);
 
+        // Display
         sRankMap.put(DisplaySettings.class.getName(), RANK_DISPLAY);
 
+        // Wallpapers
         sRankMap.put(WallpaperTypeSettings.class.getName(), RANK_WALLPAPER);
 
+        // Notifications
         sRankMap.put(NotificationSettings.class.getName(), RANK_NOTIFICATIONS);
         sRankMap.put(NotificationDisplaySettings.class.getName(), RANK_NOTIFICATIONS);
         sRankMap.put(OtherSoundSettings.class.getName(), RANK_NOTIFICATIONS);
         sRankMap.put(ZenModeSettings.class.getName(), RANK_NOTIFICATIONS);
 
+        // Memory
         sRankMap.put(Memory.class.getName(), RANK_MEMORY);
 
+        // Battery
         sRankMap.put(PowerUsageSummary.class.getName(), RANK_POWER_USAGE);
         sRankMap.put(BatterySaverSettings.class.getName(), RANK_POWER_USAGE);
 
+        // Users
         sRankMap.put(UserSettings.class.getName(), RANK_USERS);
 
+        // Location
         sRankMap.put(LocationSettings.class.getName(), RANK_LOCATION);
 
+        // Security
         sRankMap.put(SecuritySettings.class.getName(), RANK_SECURITY);
         sRankMap.put(ChooseLockGeneric.ChooseLockGenericFragment.class.getName(), RANK_SECURITY);
 
+        // IMEs
         sRankMap.put(InputMethodAndLanguageSettings.class.getName(), RANK_IME);
 
+        // Privacy
         sRankMap.put(PrivacySettings.class.getName(), RANK_PRIVACY);
 
+        // Date / Time
         sRankMap.put(DateTimeSettings.class.getName(), RANK_DATE_TIME);
 
+        // Accessibility
         sRankMap.put(AccessibilitySettings.class.getName(), RANK_ACCESSIBILITY);
 
+        // Print
         sRankMap.put(PrintSettingsFragment.class.getName(), RANK_PRINTING);
 
+        // Development
         sRankMap.put(DevelopmentSettings.class.getName(), RANK_DEVELOPEMENT);
 
+        // Device infos
         sRankMap.put(DeviceInfoSettings.class.getName(), RANK_DEVICE_INFO);
 
         sBaseRankMap.put("com.android.settings", 0);
diff --git a/src/com/android/settings/search/SearchIndexableResources.java b/src/com/android/settings/search/SearchIndexableResources.java
index 086ebfc..5f380eb 100644
--- a/src/com/android/settings/search/SearchIndexableResources.java
+++ b/src/com/android/settings/search/SearchIndexableResources.java
@@ -37,6 +37,7 @@
 import com.android.settings.fuelgauge.PowerUsageSummary;
 import com.android.settings.inputmethod.InputMethodAndLanguageSettings;
 import com.android.settings.location.LocationSettings;
+import com.android.settings.net.DataUsageMeteredSettings;
 import com.android.settings.notification.NotificationDisplaySettings;
 import com.android.settings.notification.NotificationSettings;
 import com.android.settings.notification.OtherSoundSettings;
@@ -85,6 +86,13 @@
                         DataUsageSummary.class.getName(),
                         R.drawable.ic_settings_data_usage));
 
+        sResMap.put(DataUsageMeteredSettings.class.getName(),
+                new SearchIndexableResource(
+                        Ranking.getRankForClassName(DataUsageMeteredSettings.class.getName()),
+                        NO_DATA_RES_ID,
+                        DataUsageMeteredSettings.class.getName(),
+                        R.drawable.ic_settings_data_usage));
+
         sResMap.put(WirelessSettings.class.getName(),
                 new SearchIndexableResource(
                         Ranking.getRankForClassName(WirelessSettings.class.getName()),