diff --git a/src/com/android/launcher3/model/PackageUpdatedTask.java b/src/com/android/launcher3/model/PackageUpdatedTask.java index 3c0a54a586..82b0f7c7d5 100644 --- a/src/com/android/launcher3/model/PackageUpdatedTask.java +++ b/src/com/android/launcher3/model/PackageUpdatedTask.java @@ -29,6 +29,7 @@ import android.os.UserHandle; import android.os.UserManager; import android.util.Log; +import com.android.launcher3.Launcher; import com.android.launcher3.LauncherAppState; import com.android.launcher3.LauncherSettings; import com.android.launcher3.LauncherSettings.Favorites; @@ -123,6 +124,14 @@ public class PackageUpdatedTask extends BaseModelUpdateTask { activitiesLists.put( packages[i], appsList.updatePackage(context, packages[i], mUser)); app.getWidgetCache().removePackage(packages[i], mUser); + + // The update may have changed which shortcuts/widgets are available. + // Refresh the widgets for the package if we have an activity running. + Launcher launcher = Launcher.ACTIVITY_TRACKER.getCreatedActivity(); + if (launcher != null) { + launcher.refreshAndBindWidgetsForPackageUser( + new PackageUserKey(packages[i], mUser)); + } } } // Since package was just updated, the target must be available now. 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 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 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 values() { + return mMap.values(); + } + } } \ No newline at end of file