OSDN Git Service

Fix updateIconBadges() in All Apps
authorTony Wickham <twickham@google.com>
Tue, 25 Apr 2017 21:13:20 +0000 (14:13 -0700)
committerTony Wickham <twickham@google.com>
Wed, 26 Apr 2017 15:39:12 +0000 (08:39 -0700)
Instead of notifyItemChanged(), we iterate over children of the
RecyclerView itself and call applyBadgeState() on affected icons.
This is the same logic we do for the workspace.

Issues this fixes:
- Icons flash when dismissing notifications
- Badge reappears on the icon while popup is open

Change-Id: I5c69d5c6bd47630c0241666b5f7f6f7ca97118f9

src/com/android/launcher3/allapps/AllAppsContainerView.java

index cc5fa8c..2c7d156 100644 (file)
@@ -37,6 +37,7 @@ import android.view.ViewGroup;
 
 import com.android.launcher3.AppInfo;
 import com.android.launcher3.BaseContainerView;
+import com.android.launcher3.BubbleTextView;
 import com.android.launcher3.DeleteDropTarget;
 import com.android.launcher3.DeviceProfile;
 import com.android.launcher3.DragSource;
@@ -485,11 +486,15 @@ public class AllAppsContainerView extends BaseContainerView implements DragSourc
 
     public void updateIconBadges(Set<PackageUserKey> updatedBadges) {
         final PackageUserKey packageUserKey = new PackageUserKey(null, null);
-        for (AlphabeticalAppsList.AdapterItem app : mApps.getAdapterItems()) {
-            if (app.appInfo != null && packageUserKey.updateFromItemInfo(app.appInfo)) {
-                if (updatedBadges.contains(packageUserKey)) {
-                    mAdapter.notifyItemChanged(app.position);
-                }
+        final int n = mAppsRecyclerView.getChildCount();
+        for (int i = 0; i < n; i++) {
+            View child = mAppsRecyclerView.getChildAt(i);
+            if (!(child instanceof BubbleTextView) || !(child.getTag() instanceof ItemInfo)) {
+                continue;
+            }
+            ItemInfo info = (ItemInfo) child.getTag();
+            if (packageUserKey.updateFromItemInfo(info) && updatedBadges.contains(packageUserKey)) {
+                ((BubbleTextView) child).applyBadgeState(info, true /* animate */);
             }
         }
     }