From 48467438da74da11255ce68b6f3a2e936cf22f7a Mon Sep 17 00:00:00 2001 From: Jeremy Sim Date: Mon, 22 Jan 2024 17:50:12 +0800 Subject: [PATCH] Remove app pairs when their member apps are uninstalled This patch modifies PackageUpdatedTask.execute() to also remove app pairs when their member apps are uninstalled. Fixes: 316050282 Test: Install App A, create an app pair containing App A, uninstall App A. Flag: ACONFIG com.android.wm.shell.enable_app_pairs TEAMFOOD Change-Id: I8487a2dfcfc6d29bd55e88003d1950078c6e2e31 --- .../launcher3/model/PackageUpdatedTask.java | 14 +++++++++++--- .../android/launcher3/util/ItemInfoMatcher.java | 9 +++++++++ 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/src/com/android/launcher3/model/PackageUpdatedTask.java b/src/com/android/launcher3/model/PackageUpdatedTask.java index 069e96b456..529a8f9fac 100644 --- a/src/com/android/launcher3/model/PackageUpdatedTask.java +++ b/src/com/android/launcher3/model/PackageUpdatedTask.java @@ -353,9 +353,17 @@ public class PackageUpdatedTask extends BaseModelUpdateTask { } if (!removedPackages.isEmpty() || !removedComponents.isEmpty()) { - Predicate removeMatch = ItemInfoMatcher.ofPackages(removedPackages, mUser) - .or(ItemInfoMatcher.ofComponents(removedComponents, mUser)) - .and(ItemInfoMatcher.ofItemIds(forceKeepShortcuts).negate()); + // This predicate is used to mark an ItemInfo for removal if its package or component + // is marked for removal. + Predicate removeAppMatch = + ItemInfoMatcher.ofPackages(removedPackages, mUser) + .or(ItemInfoMatcher.ofComponents(removedComponents, mUser)) + .and(ItemInfoMatcher.ofItemIds(forceKeepShortcuts).negate()); + // This predicate is used to mark an app pair for removal if it contains an app marked + // for removal. + Predicate removeAppPairMatch = + ItemInfoMatcher.forAppPairMatch(removeAppMatch); + Predicate removeMatch = removeAppMatch.or(removeAppPairMatch); deleteAndBindComponentsRemoved(removeMatch, "removed because the corresponding package or component is removed. " + "mOp=" + mOp + " removedPackages=" + removedPackages.stream().collect( diff --git a/src/com/android/launcher3/util/ItemInfoMatcher.java b/src/com/android/launcher3/util/ItemInfoMatcher.java index b6af3140fa..307411151e 100644 --- a/src/com/android/launcher3/util/ItemInfoMatcher.java +++ b/src/com/android/launcher3/util/ItemInfoMatcher.java @@ -69,6 +69,15 @@ public abstract class ItemInfoMatcher { .anyMatch(childOperator); } + /** + * Returns a matcher for items within app pairs. + */ + public static Predicate forAppPairMatch(Predicate childOperator) { + Predicate isAppPair = info -> + info instanceof FolderInfo fi && fi.itemType == Favorites.ITEM_TYPE_APP_PAIR; + return isAppPair.and(forFolderMatch(childOperator)); + } + /** * Returns a matcher for items with provided ids */