From 9e50a01e926ec2e4acd0114e081c725e92d0e514 Mon Sep 17 00:00:00 2001 From: Charlie Anderson Date: Fri, 21 Feb 2025 13:55:24 -0500 Subject: [PATCH] Simplify some package update logic around restoring archived/unarchived shortcuts - also avoids race condition where unarchived shortcut is not pinned in shortcut service after restore, and then marked as broken Bug: 375414891 Test: Launcher B&R w/ archiving Flag: com.android.launcher3.restore_archived_shortcuts Change-Id: I2b5331117be93d66e4acbded49b65cd5ce9f8f83 --- .../launcher3/model/PackageUpdatedTask.java | 30 +++++++++++-------- 1 file changed, 18 insertions(+), 12 deletions(-) diff --git a/src/com/android/launcher3/model/PackageUpdatedTask.java b/src/com/android/launcher3/model/PackageUpdatedTask.java index d1eceb905a..3cdb2500e1 100644 --- a/src/com/android/launcher3/model/PackageUpdatedTask.java +++ b/src/com/android/launcher3/model/PackageUpdatedTask.java @@ -239,25 +239,31 @@ public class PackageUpdatedTask implements ModelUpdateTask { boolean isTargetValid = !cn.getClassName().equals( IconCache.EMPTY_CLASS_NAME); if (itemInfo.itemType == ITEM_TYPE_DEEP_SHORTCUT) { + int requestQuery = ShortcutRequest.PINNED; + if (Flags.restoreArchivedShortcuts()) { + // Avoid race condition where shortcut service has no record of + // unarchived shortcut being pinned after restore. + // Launcher should be source-of-truth for if shortcut is pinned. + requestQuery = ShortcutRequest.ALL; + } List shortcut = new ShortcutRequest(context, mUser) .forPackage(cn.getPackageName(), itemInfo.getDeepShortcutId()) - .query(ShortcutRequest.PINNED); - if (shortcut.isEmpty() - && !(Flags.restoreArchivedShortcuts() - && !itemInfo.isArchived()) - ) { + .query(requestQuery); + if (shortcut.isEmpty()) { isTargetValid = false; if (DEBUG) { - Log.d(TAG, "Pinned Shortcut not found for updated" - + " package=" + itemInfo.getTargetPackage()); - } - } else if (!shortcut.isEmpty()) { - if (DEBUG) { - Log.d(TAG, "Found pinned shortcut for updated" + Log.d(TAG, "Shortcut not found for updated" + " package=" + itemInfo.getTargetPackage() - + ", isTargetValid=" + isTargetValid); + + ", isArchived=" + itemInfo.isArchived()); + } + } else { + if (DEBUG) { + Log.d(TAG, "Found shortcut for updated" + + " package=" + itemInfo.getTargetPackage() + + ", isTargetValid=" + isTargetValid + + ", isArchived=" + itemInfo.isArchived()); } itemInfo.updateFromDeepShortcutInfo(shortcut.get(0), context); infoUpdated = true;