diff options
author | Vinit Nayak <peanutbutter@google.com> | 2019-08-05 15:26:39 -0700 |
---|---|---|
committer | Vinit Nayak <peanutbutter@google.com> | 2019-08-08 11:11:03 -0700 |
commit | 268e4ff95c03aa825b0f2ac3d39743a6e248b655 (patch) | |
tree | 703cc4a4a279c1748fafc6245b7566d5f7c28589 /quickstep/src | |
parent | e529a86fbd2eaf7b13575af6b6adf0eb6e25e45c (diff) | |
download | android_packages_apps_Trebuchet-268e4ff95c03aa825b0f2ac3d39743a6e248b655.tar.gz android_packages_apps_Trebuchet-268e4ff95c03aa825b0f2ac3d39743a6e248b655.tar.bz2 android_packages_apps_Trebuchet-268e4ff95c03aa825b0f2ac3d39743a6e248b655.zip |
Remove activityInfo from cache on package uninstall
We were keeping stale activityInfo objects from
package manager after an application got uninstalled.
We also were not removing task icons from the
cache after they were removed, which meant killing an
app and then re-opening would put 2 entries in the cache
since the two had unique process IDs.
fixes: 137731960
Test: Download app from play store, open it,
go to overview and observe that correct icon showing.
Uninstall it, download same app again, open it, and
in overview confirm that correct app icon is still showing
Change-Id: Icf482b0ad0ae66c10d52547582d8eeb2a544fb88
Diffstat (limited to 'quickstep/src')
-rw-r--r-- | quickstep/src/com/android/quickstep/RecentsModel.java | 20 | ||||
-rw-r--r-- | quickstep/src/com/android/quickstep/TaskIconCache.java | 20 |
2 files changed, 38 insertions, 2 deletions
diff --git a/quickstep/src/com/android/quickstep/RecentsModel.java b/quickstep/src/com/android/quickstep/RecentsModel.java index d7b1e8b85..d9ecdcd56 100644 --- a/quickstep/src/com/android/quickstep/RecentsModel.java +++ b/quickstep/src/com/android/quickstep/RecentsModel.java @@ -25,9 +25,12 @@ import android.os.Build; import android.os.HandlerThread; import android.os.Process; import android.os.RemoteException; +import android.os.UserHandle; import android.util.Log; import com.android.launcher3.MainThreadExecutor; +import com.android.launcher3.compat.LauncherAppsCompat; +import com.android.launcher3.compat.LauncherAppsCompat.OnAppsChangedCallbackCompat; import com.android.launcher3.util.MainThreadInitializedObject; import com.android.systemui.shared.recents.ISystemUiProxy; import com.android.systemui.shared.recents.model.Task; @@ -71,6 +74,7 @@ public class RecentsModel extends TaskStackChangeListener { mIconCache = new TaskIconCache(context, loaderThread.getLooper()); mThumbnailCache = new TaskThumbnailCache(context, loaderThread.getLooper()); ActivityManagerWrapper.getInstance().registerTaskStackListener(this); + setupPackageListener(); } public TaskIconCache getIconCache() { @@ -169,6 +173,7 @@ public class RecentsModel extends TaskStackChangeListener { public void onTaskRemoved(int taskId) { Task.TaskKey dummyKey = new Task.TaskKey(taskId, 0, null, null, 0, 0); mThumbnailCache.remove(dummyKey); + mIconCache.onTaskRemoved(dummyKey); } public void setSystemUiProxy(ISystemUiProxy systemUiProxy) { @@ -203,6 +208,21 @@ public class RecentsModel extends TaskStackChangeListener { } } + private void setupPackageListener() { + LauncherAppsCompat.getInstance(mContext) + .addOnAppsChangedCallback(new OnAppsChangedCallbackCompat() { + @Override + public void onPackageRemoved(String packageName, UserHandle user) { + mIconCache.invalidatePackage(packageName); + } + + @Override + public void onPackageChanged(String packageName, UserHandle user) { + mIconCache.invalidatePackage(packageName); + } + }); + } + public void addThumbnailChangeListener(TaskThumbnailChangeListener listener) { mThumbnailChangeListeners.add(listener); } diff --git a/quickstep/src/com/android/quickstep/TaskIconCache.java b/quickstep/src/com/android/quickstep/TaskIconCache.java index 07af9b385..5e0195806 100644 --- a/quickstep/src/com/android/quickstep/TaskIconCache.java +++ b/quickstep/src/com/android/quickstep/TaskIconCache.java @@ -31,17 +31,18 @@ import com.android.launcher3.MainThreadExecutor; import com.android.launcher3.R; import com.android.launcher3.Utilities; import com.android.launcher3.icons.cache.HandlerRunnable; -import com.android.launcher3.uioverrides.RecentsUiFactory; import com.android.launcher3.util.Preconditions; import com.android.systemui.shared.recents.model.Task; +import com.android.systemui.shared.recents.model.Task.TaskKey; import com.android.systemui.shared.recents.model.TaskKeyLruCache; import com.android.systemui.shared.system.ActivityManagerWrapper; +import java.util.Map; import java.util.function.Consumer; /** * Manages the caching of task icons and related data. - * TODO: This class should later be merged into IconCache. + * TODO(b/138944598): This class should later be merged into IconCache. */ public class TaskIconCache { @@ -149,6 +150,21 @@ public class TaskIconCache { return label; } + + void onTaskRemoved(TaskKey taskKey) { + mIconCache.remove(taskKey); + } + + void invalidatePackage(String packageName) { + // TODO(b/138944598): Merge this class into IconCache so we can do this at the base level + Map<ComponentName, ActivityInfo> activityInfoCache = mActivityInfoCache.snapshot(); + for (ComponentName cn : activityInfoCache.keySet()) { + if (cn.getPackageName().equals(packageName)) { + mActivityInfoCache.remove(cn); + } + } + } + public static abstract class IconLoadRequest extends HandlerRunnable { IconLoadRequest(Handler handler) { super(handler, null); |