Listen to category changes in preference fragment.

Bug: 31781480
Test: make RunSettingsRoboTests
Change-Id: I702e524eb3a9e40b653e112dba80d620be3bc9bb
diff --git a/src/com/android/settings/dashboard/DashboardFeatureProvider.java b/src/com/android/settings/dashboard/DashboardFeatureProvider.java
index 148127e..bbf5bf1 100644
--- a/src/com/android/settings/dashboard/DashboardFeatureProvider.java
+++ b/src/com/android/settings/dashboard/DashboardFeatureProvider.java
@@ -51,4 +51,9 @@
      * group 200, and so on.
      */
     int getPriorityGroup(Tile tile);
+
+    /**
+     * Returns an unique string key for the tile.
+     */
+    String getDashboardKeyForTile(Tile tile);
 }
diff --git a/src/com/android/settings/dashboard/DashboardFeatureProviderImpl.java b/src/com/android/settings/dashboard/DashboardFeatureProviderImpl.java
index 836bfb0..a41ae18 100644
--- a/src/com/android/settings/dashboard/DashboardFeatureProviderImpl.java
+++ b/src/com/android/settings/dashboard/DashboardFeatureProviderImpl.java
@@ -16,6 +16,7 @@
 
 package com.android.settings.dashboard;
 
+import android.content.ComponentName;
 import android.content.Context;
 
 import com.android.settingslib.drawer.CategoryKey;
@@ -30,6 +31,8 @@
  */
 public class DashboardFeatureProviderImpl implements DashboardFeatureProvider {
 
+    private static final String DASHBOARD_TILE_PREF_KEY_PREFIX = "dashboard_tile_pref_";
+
     protected final Context mContext;
 
     private final CategoryManager mCategoryManager;
@@ -63,4 +66,15 @@
     public int getPriorityGroup(Tile tile) {
         return tile.priority / 100;
     }
+
+    @Override
+    public String getDashboardKeyForTile(Tile tile) {
+        if (tile == null || tile.intent == null) {
+            return null;
+        }
+        final StringBuilder sb = new StringBuilder(DASHBOARD_TILE_PREF_KEY_PREFIX);
+        final ComponentName component = tile.intent.getComponent();
+        sb.append(component.getClassName());
+        return sb.toString();
+    }
 }
diff --git a/src/com/android/settings/system/SystemDashboardFragment.java b/src/com/android/settings/system/SystemDashboardFragment.java
index ab8cc8d..21bedf9 100644
--- a/src/com/android/settings/system/SystemDashboardFragment.java
+++ b/src/com/android/settings/system/SystemDashboardFragment.java
@@ -15,11 +15,14 @@
  */
 package com.android.settings.system;
 
+import android.app.Activity;
 import android.content.Context;
 import android.os.Bundle;
 import android.os.UserManager;
 import android.support.v7.preference.Preference;
 import android.support.v7.preference.PreferenceScreen;
+import android.text.TextUtils;
+import android.util.Log;
 
 import com.android.settings.R;
 import com.android.settings.SettingsPreferenceFragment;
@@ -27,12 +30,17 @@
 import com.android.settings.dashboard.DashboardTilePreference;
 import com.android.settings.deviceinfo.SystemUpdatePreferenceController;
 import com.android.settings.overlay.FeatureFactory;
+import com.android.settings.search.Indexable;
 import com.android.settingslib.drawer.DashboardCategory;
+import com.android.settingslib.drawer.SettingsDrawerActivity;
 import com.android.settingslib.drawer.Tile;
 
 import java.util.List;
 
-public class SystemDashboardFragment extends SettingsPreferenceFragment {
+public class SystemDashboardFragment extends SettingsPreferenceFragment
+        implements SettingsDrawerActivity.CategoryListener, Indexable {
+
+    private static final String TAG = "SystemDashboardFrag";
 
     private DashboardFeatureProvider mDashboardFeatureProvider;
     private SystemUpdatePreferenceController mSystemUpdatePreferenceController;
@@ -52,11 +60,18 @@
     }
 
     @Override
+    public void onStart() {
+        super.onStart();
+        final Activity activity = getActivity();
+        if (activity instanceof SettingsDrawerActivity) {
+            ((SettingsDrawerActivity) activity).addCategoryListener(this);
+        }
+    }
+
+    @Override
     public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
         super.onCreatePreferences(savedInstanceState, rootKey);
-        addPreferencesFromResource(R.xml.system_dashboard_fragment);
-        mSystemUpdatePreferenceController.displayPreference(getPreferenceScreen());
-        addDashboardCategoryAsPreference();
+        refreshAllPreferences();
     }
 
     @Override
@@ -66,17 +81,46 @@
         return handled || super.onPreferenceTreeClick(preference);
     }
 
+    @Override
+    public void onStop() {
+        super.onStop();
+        final Activity activity = getActivity();
+        if (activity instanceof SettingsDrawerActivity) {
+            ((SettingsDrawerActivity) activity).remCategoryListener(this);
+        }
+    }
+
+    @Override
+    public void onCategoriesChanged() {
+        refreshAllPreferences();
+    }
+
     /**
-     * Adds dynamic tiles for system category onto PreferenceScreen.
+     * Refresh preference items using system category dashboard items.
      */
-    private void addDashboardCategoryAsPreference() {
+    private void refreshAllPreferences() {
+        PreferenceScreen screen = getPreferenceScreen();
+        if (screen != null) {
+            screen.removeAll();
+        }
+
         final Context context = getContext();
-        final PreferenceScreen screen = getPreferenceScreen();
         final DashboardCategory category = mDashboardFeatureProvider.getTilesForSystemCategory();
         final List<Tile> tiles = category.tiles;
+
+        addPreferencesFromResource(R.xml.system_dashboard_fragment);
+        screen = getPreferenceScreen();
+        mSystemUpdatePreferenceController.displayPreference(getPreferenceScreen());
+
         for (Tile tile : tiles) {
-            final DashboardTilePreference pref = new DashboardTilePreference(context);
+            final String key = mDashboardFeatureProvider.getDashboardKeyForTile(tile);
+            if (TextUtils.isEmpty(key)) {
+                Log.d(TAG, "tile does not contain a key, skipping " + tile);
+                continue;
+            }
+            final Preference pref = new DashboardTilePreference(context);
             pref.setTitle(tile.title);
+            pref.setKey(key);
             pref.setSummary(tile.summary);
             if (tile.icon != null) {
                 pref.setIcon(tile.icon.loadDrawable(context));
@@ -91,5 +135,4 @@
             screen.addPreference(pref);
         }
     }
-
-}
\ No newline at end of file
+}