OSDN Git Service

Update summary correctly in Settings dashboard.
authorFan Zhang <zhfan@google.com>
Wed, 3 Aug 2016 21:47:01 +0000 (14:47 -0700)
committerFan Zhang <zhfan@google.com>
Wed, 3 Aug 2016 22:50:39 +0000 (15:50 -0700)
Bug: 30490325

SummaryLoader needs DashboardCategory to update summary and it currently
ask for it from DashboardAdapter. But DashboardCategory is not always
available in DashboardAdapter. When SummaryLoader wants to get category
from adapter before adapter is ready, it won't have it, causing summary
to appear blank sometimes.

The fix is to get category from data source directly.

Change-Id: I9d7f676954d1cece42d6e03748ab7aa35357f8b7

src/com/android/settings/dashboard/DashboardAdapter.java
src/com/android/settings/dashboard/SummaryLoader.java

index ecf6497..ca68a74 100644 (file)
@@ -15,7 +15,6 @@
  */
 package com.android.settings.dashboard;
 
-import android.content.ComponentName;
 import android.content.Context;
 import android.content.pm.PackageManager;
 import android.graphics.drawable.Drawable;
@@ -110,21 +109,6 @@ public class DashboardAdapter extends RecyclerView.Adapter<DashboardAdapter.Dash
         return mSuggestions;
     }
 
-    public Tile getTile(ComponentName component) {
-        if (mCategories == null) {
-            return null;
-        }
-        for (int i = 0; i < mCategories.size(); i++) {
-            for (int j = 0; j < mCategories.get(i).tiles.size(); j++) {
-                Tile tile = mCategories.get(i).tiles.get(j);
-                if (component.equals(tile.intent.getComponent())) {
-                    return tile;
-                }
-            }
-        }
-        return null;
-    }
-
     public void setCategoriesAndSuggestions(List<DashboardCategory> categories,
             List<Tile> suggestions) {
         mSuggestions = suggestions;
index 778d620..4232852 100644 (file)
@@ -28,8 +28,10 @@ import android.os.Process;
 import android.util.ArrayMap;
 import android.util.ArraySet;
 import android.util.Log;
+
 import com.android.settings.SettingsActivity;
 import com.android.settingslib.drawer.DashboardCategory;
+import com.android.settingslib.drawer.SettingsDrawerActivity;
 import com.android.settingslib.drawer.Tile;
 
 import java.lang.reflect.Field;
@@ -87,9 +89,24 @@ public class SummaryLoader {
             public void run() {
                 // Since tiles are not always cached (like on locale change for instance),
                 // we need to always get the latest one.
-                Tile tile = mAdapter.getTile(component);
-                if (tile == null) return;
-                if (DEBUG) Log.d(TAG, "setSummary " + tile.title + " - " + summary);
+                if (!(mActivity instanceof SettingsDrawerActivity)) {
+                    if (DEBUG) {
+                        Log.d(TAG, "Can't get category list.");
+                    }
+                    return;
+                }
+                final List<DashboardCategory> categories =
+                        ((SettingsDrawerActivity) mActivity).getDashboardCategories();
+                final Tile tile = getTileFromCategory(categories, component);
+                if (tile == null) {
+                    if (DEBUG) {
+                        Log.d(TAG, "Can't find tile for " + component);
+                    }
+                    return;
+                }
+                if (DEBUG) {
+                    Log.d(TAG, "setSummary " + tile.title + " - " + summary);
+                }
                 tile.summary = summary;
                 mAdapter.notifyChanged(tile);
             }
@@ -187,6 +204,27 @@ public class SummaryLoader {
         }
     }
 
+    private Tile getTileFromCategory(List<DashboardCategory> categories, ComponentName component) {
+        if (categories == null) {
+            if (DEBUG) {
+                Log.d(TAG, "Category is null, can't find tile");
+            }
+            return null;
+        }
+        final int categorySize = categories.size();
+        for (int i = 0; i < categorySize; i++) {
+            final DashboardCategory category = categories.get(i);
+            final int tileCount = category.tiles.size();
+            for (int j = 0; j < tileCount; j++) {
+                final Tile tile = category.tiles.get(j);
+                if (component.equals(tile.intent.getComponent())) {
+                    return tile;
+                }
+            }
+        }
+        return null;
+    }
+
     public interface SummaryProvider {
         void setListening(boolean listening);
     }