From bef2930f5a29655f6c403f2d5eefd4e99a733b04 Mon Sep 17 00:00:00 2001 From: Rohit Goyal Date: Thu, 29 Feb 2024 13:46:52 +0000 Subject: [PATCH] Bugfix: Remove widgets and deep shortcuts of app which gets archived. * Once app is archived, remove widgets and deep shortcuts corresponding to the app from the home screen. * However during backup & restore, widgets should not be removed if they are being restored. Test: verified bugfix locally. Bug: 326567866 Flag: ACONFIG com.android.launcher3.enable_support_for_archiving DEVELOPMENT Change-Id: Ib3a112aadc7bd901fd6a0ba86f472ec6acf8d626 --- .../launcher3/model/ShortcutsChangedTask.java | 8 +++++--- .../launcher3/util/PackageManagerHelper.java | 18 +++++++++++++++++- 2 files changed, 22 insertions(+), 4 deletions(-) diff --git a/src/com/android/launcher3/model/ShortcutsChangedTask.java b/src/com/android/launcher3/model/ShortcutsChangedTask.java index a6a04a7291..59dd1b1e09 100644 --- a/src/com/android/launcher3/model/ShortcutsChangedTask.java +++ b/src/com/android/launcher3/model/ShortcutsChangedTask.java @@ -78,10 +78,12 @@ public class ShortcutsChangedTask extends BaseModelUpdateTask { if (!matchingWorkspaceItems.isEmpty()) { if (mShortcuts.isEmpty()) { + PackageManagerHelper packageManagerHelper = new PackageManagerHelper( + app.getContext()); // Verify that the app is indeed installed. - if (!new PackageManagerHelper(app.getContext()) - .isAppInstalled(mPackageName, mUser)) { - // App is not installed, ignoring package events + if (!packageManagerHelper.isAppInstalled(mPackageName, mUser) + && !packageManagerHelper.isAppArchivedForUser(mPackageName, mUser)) { + // App is not installed or archived, ignoring package events return; } } diff --git a/src/com/android/launcher3/util/PackageManagerHelper.java b/src/com/android/launcher3/util/PackageManagerHelper.java index 11d8e970f0..606918e2ac 100644 --- a/src/com/android/launcher3/util/PackageManagerHelper.java +++ b/src/com/android/launcher3/util/PackageManagerHelper.java @@ -104,6 +104,21 @@ public class PackageManagerHelper { return info != null; } + /** + * Returns whether the target app is archived for a given user + */ + public boolean isAppArchivedForUser(@NonNull final String packageName, + @NonNull final UserHandle user) { + if (!Utilities.enableSupportForArchiving()) { + return false; + } + final ApplicationInfo info = getApplicationInfo( + // LauncherApps does not support long flags currently. Since archived apps are + // subset of uninstalled apps, this filter also includes archived apps. + packageName, user, PackageManager.MATCH_UNINSTALLED_PACKAGES); + return info != null && info.isArchived; + } + /** * Returns whether the target app is in archived state */ @@ -172,7 +187,7 @@ public class PackageManagerHelper { public void startDetailsActivityForInfo(ItemInfo info, Rect sourceBounds, Bundle opts) { if (info instanceof ItemInfoWithIcon && (((ItemInfoWithIcon) info).runtimeStatusFlags - & ItemInfoWithIcon.FLAG_INSTALL_SESSION_ACTIVE) != 0) { + & ItemInfoWithIcon.FLAG_INSTALL_SESSION_ACTIVE) != 0) { ItemInfoWithIcon appInfo = (ItemInfoWithIcon) info; mContext.startActivity(ApiWrapper.getAppMarketActivityIntent(mContext, appInfo.getTargetComponent().getPackageName(), Process.myUserHandle())); @@ -251,6 +266,7 @@ public class PackageManagerHelper { /** * Returns true if Launcher has the permission to access shortcuts. + * * @see LauncherApps#hasShortcutHostPermission() */ public static boolean hasShortcutsPermission(Context context) {