diff options
author | Stevie Kideckel <kideckel@google.com> | 2021-06-17 10:54:49 +0000 |
---|---|---|
committer | Stevie Kideckel <kideckel@google.com> | 2021-06-17 13:08:53 +0000 |
commit | 69af278f8ad850896e7c8d64f814c91d0752c036 (patch) | |
tree | bd2d8073ce850370e8474e2455d00c84a1adf82a /src_shortcuts_overrides | |
parent | 358411a96a19de571f92cc62b2fa630eac3587a0 (diff) | |
download | Launcher3-69af278f8ad850896e7c8d64f814c91d0752c036.tar.gz |
Refresh widgets in the model when packages change
Fix: 191163748
Test: local sample app
Change-Id: Ic09ad11cabf6efa471fb6e685cb255c4a17493ee
Diffstat (limited to 'src_shortcuts_overrides')
-rw-r--r-- | src_shortcuts_overrides/com/android/launcher3/model/WidgetsModel.java | 53 |
1 files changed, 36 insertions, 17 deletions
diff --git a/src_shortcuts_overrides/com/android/launcher3/model/WidgetsModel.java b/src_shortcuts_overrides/com/android/launcher3/model/WidgetsModel.java index 51c5b12b6e..a66b031719 100644 --- a/src_shortcuts_overrides/com/android/launcher3/model/WidgetsModel.java +++ b/src_shortcuts_overrides/com/android/launcher3/model/WidgetsModel.java @@ -15,6 +15,7 @@ import android.os.UserHandle; import android.util.Log; import androidx.annotation.Nullable; +import androidx.collection.ArrayMap; import com.android.launcher3.AppFilter; import com.android.launcher3.InvariantDeviceProfile; @@ -37,6 +38,7 @@ import com.android.launcher3.widget.picker.WidgetsDiffReporter; import java.util.ArrayList; import java.util.Arrays; +import java.util.Collection; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -158,34 +160,29 @@ public class WidgetsModel { Log.d(TAG, "addWidgetsAndShortcuts, widgetsShortcuts#=" + rawWidgetsShortcuts.size()); } - // Temporary list for {@link PackageItemInfos} to avoid having to go through + // Temporary cache for {@link PackageItemInfos} to avoid having to go through // {@link mPackageItemInfos} to locate the key to be used for {@link #mWidgetsList} - HashMap<WidgetPackageOrCategoryKey, PackageItemInfo> tmpPackageItemInfos = new HashMap<>(); + PackageItemInfoCache packageItemInfoCache = new PackageItemInfoCache(); - // Clear the lists only if this is an update on all widgets and shortcuts. If packageUser - // isn't null, only updates the shortcuts and widgets for the app represented in - // packageUser. if (packageUser == null) { + // Clear the list if this is an update on all widgets and shortcuts. mWidgetsList.clear(); + } else { + // Otherwise, only clear the widgets and shortcuts for the changed package. + mWidgetsList.remove( + packageItemInfoCache.getOrCreate(new WidgetPackageOrCategoryKey(packageUser))); } + // add and update. mWidgetsList.putAll(rawWidgetsShortcuts.stream() .filter(new WidgetValidityCheck(app)) - .collect(Collectors.groupingBy(item -> { - WidgetPackageOrCategoryKey packageUserKey = getWidgetPackageOrCategoryKey(item); - PackageItemInfo pInfo = tmpPackageItemInfos.get(packageUserKey); - if (pInfo == null) { - pInfo = new PackageItemInfo(item.componentName.getPackageName(), - packageUserKey.mCategory); - pInfo.user = item.user; - tmpPackageItemInfos.put(packageUserKey, pInfo); - } - return pInfo; - }))); + .collect(Collectors.groupingBy(item -> + packageItemInfoCache.getOrCreate(getWidgetPackageOrCategoryKey(item)) + ))); // Update each package entry IconCache iconCache = app.getIconCache(); - for (PackageItemInfo p : tmpPackageItemInfos.values()) { + for (PackageItemInfo p : packageItemInfoCache.values()) { iconCache.getTitleAndIconForApp(p, true /* userLowResIcon */); } } @@ -289,6 +286,10 @@ public class WidgetsModel { public final UserHandle mUser; private final int mHashCode; + WidgetPackageOrCategoryKey(PackageUserKey key) { + this(key.mPackageName, key.mUser); + } + WidgetPackageOrCategoryKey(String packageName, UserHandle user) { this(packageName, PackageItemInfo.NO_CATEGORY, user); } @@ -310,4 +311,22 @@ public class WidgetsModel { return mHashCode; } } + + private static final class PackageItemInfoCache { + private final Map<WidgetPackageOrCategoryKey, PackageItemInfo> mMap = new ArrayMap<>(); + + PackageItemInfo getOrCreate(WidgetPackageOrCategoryKey key) { + PackageItemInfo pInfo = mMap.get(key); + if (pInfo == null) { + pInfo = new PackageItemInfo(key.mPackage, key.mCategory); + pInfo.user = key.mUser; + mMap.put(key, pInfo); + } + return pInfo; + } + + Collection<PackageItemInfo> values() { + return mMap.values(); + } + } }
\ No newline at end of file |