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 */