From 559dd806d7899dc384ad9f6d95915755cefbb13f Mon Sep 17 00:00:00 2001 From: Pinyao Ting Date: Thu, 25 Jul 2019 20:26:54 -0700 Subject: [PATCH] show dot on shortcut when incoming notification contains exactly the same shortcut id Bug: 132336512 Change-Id: Iddf4cfe8ad60c12e8de8b171bed392f1bb0a6761 --- .../shortcuts/DeepShortcutManager.java | 6 +++ .../launcher3/popup/PopupDataProvider.java | 11 +++-- .../shortcuts/DeepShortcutManager.java | 45 +++++++++++++++++-- 3 files changed, 54 insertions(+), 8 deletions(-) diff --git a/go/src/com/android/launcher3/shortcuts/DeepShortcutManager.java b/go/src/com/android/launcher3/shortcuts/DeepShortcutManager.java index c20ed129ce..6997974b4d 100644 --- a/go/src/com/android/launcher3/shortcuts/DeepShortcutManager.java +++ b/go/src/com/android/launcher3/shortcuts/DeepShortcutManager.java @@ -25,6 +25,7 @@ import android.os.Bundle; import android.os.UserHandle; import com.android.launcher3.ItemInfo; +import com.android.launcher3.notification.NotificationKeyData; import java.util.ArrayList; import java.util.List; @@ -48,6 +49,11 @@ public class DeepShortcutManager { return false; } + public static boolean supportsNotificationDots( + ItemInfo info, List notifications) { + return false; + } + /** * Queries for the shortcuts with the package name and provided ids. * diff --git a/src/com/android/launcher3/popup/PopupDataProvider.java b/src/com/android/launcher3/popup/PopupDataProvider.java index 2d301ac008..dd496b02bf 100644 --- a/src/com/android/launcher3/popup/PopupDataProvider.java +++ b/src/com/android/launcher3/popup/PopupDataProvider.java @@ -40,6 +40,7 @@ import java.util.Map; import java.util.function.Predicate; import androidx.annotation.NonNull; +import androidx.annotation.Nullable; /** * Provides data for the popup menu that appears after long-clicking on apps. @@ -167,12 +168,14 @@ public class PopupDataProvider implements NotificationListener.NotificationsChan return count == null ? 0 : count; } - public DotInfo getDotInfoForItem(ItemInfo info) { - if (!DeepShortcutManager.supportsShortcuts(info)) { + public @Nullable DotInfo getDotInfoForItem(@NonNull ItemInfo info) { + DotInfo dotInfo = mPackageUserToDotInfos.get(PackageUserKey.fromItemInfo(info)); + List notifications = + dotInfo == null ? Collections.EMPTY_LIST : dotInfo.getNotificationKeys(); + if (!DeepShortcutManager.supportsNotificationDots(info, notifications)) { return null; } - - return mPackageUserToDotInfos.get(PackageUserKey.fromItemInfo(info)); + return dotInfo; } public @NonNull List getNotificationKeysForItem(ItemInfo info) { diff --git a/src_shortcuts_overrides/com/android/launcher3/shortcuts/DeepShortcutManager.java b/src_shortcuts_overrides/com/android/launcher3/shortcuts/DeepShortcutManager.java index 84a59b2280..4e71b23c87 100644 --- a/src_shortcuts_overrides/com/android/launcher3/shortcuts/DeepShortcutManager.java +++ b/src_shortcuts_overrides/com/android/launcher3/shortcuts/DeepShortcutManager.java @@ -30,6 +30,7 @@ import android.util.Log; import com.android.launcher3.ItemInfo; import com.android.launcher3.LauncherSettings; import com.android.launcher3.WorkspaceItemInfo; +import com.android.launcher3.notification.NotificationKeyData; import java.util.ArrayList; import java.util.Collections; @@ -60,10 +61,40 @@ public class DeepShortcutManager { } public static boolean supportsShortcuts(ItemInfo info) { - boolean isItemPromise = info instanceof WorkspaceItemInfo - && ((WorkspaceItemInfo) info).hasPromiseIconUi(); - return info.itemType == LauncherSettings.Favorites.ITEM_TYPE_APPLICATION - && !info.isDisabled() && !isItemPromise; + return isActive(info) && isApp(info); + } + + public static boolean supportsNotificationDots( + ItemInfo info, List notifications) { + if (!isActive(info)) { + return false; + } + return isApp(info) || (isPinnedShortcut(info) + && shouldShowNotificationDotForPinnedShortcut(info, notifications)); + } + + private static boolean isApp(ItemInfo info) { + return info.itemType == LauncherSettings.Favorites.ITEM_TYPE_APPLICATION; + } + + private static boolean isPinnedShortcut(ItemInfo info) { + return info.itemType == LauncherSettings.Favorites.ITEM_TYPE_DEEP_SHORTCUT + && info.container != ItemInfo.NO_ID + && info instanceof WorkspaceItemInfo; + } + + private static boolean shouldShowNotificationDotForPinnedShortcut( + ItemInfo info, List notifications) { + String shortcutId = ((WorkspaceItemInfo) info).getDeepShortcutId(); + if (shortcutId == null) { + return false; + } + for (NotificationKeyData notification : notifications) { + if (shortcutId.equals(notification.shortcutId)) { + return true; + } + } + return false; } /** @@ -166,6 +197,12 @@ public class DeepShortcutManager { return shortcutIds; } + private static boolean isActive(ItemInfo info) { + boolean isLoading = info instanceof WorkspaceItemInfo + && ((WorkspaceItemInfo) info).hasPromiseIconUi(); + return !isLoading && !info.isDisabled(); + } + /** * Query the system server for all the shortcuts matching the given parameters. * If packageName == null, we query for all shortcuts with the passed flags, regardless of app.