From bf608722b933b5f72b58101cdc0f54e51f315d59 Mon Sep 17 00:00:00 2001 From: Pinyao Ting Date: Tue, 30 Jul 2019 11:50:54 -0700 Subject: [PATCH] Ensure each dot contains only relevant notification to the shortcut and displays system shortcut when long click on deep shortcut. In this CR we 1) for each shortcut, we filters the notifications to ensure we only get notifications with identical shortcutId. 2) allow system shortcut to be displayed when user long click on a DeepShortcut Bug: 132336512 Change-Id: Idc9eaed55e900ed4027a43ee9c3fd7dc6f4480b2 Merged-In: Idc9eaed55e900ed4027a43ee9c3fd7dc6f4480b2 --- .../shortcuts/DeepShortcutManager.java | 7 ++-- .../launcher3/popup/PopupDataProvider.java | 35 +++++++++++++++---- .../shortcuts/DeepShortcutManager.java | 29 ++++----------- 3 files changed, 41 insertions(+), 30 deletions(-) diff --git a/go/src/com/android/launcher3/shortcuts/DeepShortcutManager.java b/go/src/com/android/launcher3/shortcuts/DeepShortcutManager.java index 73adaa14fa..7fd4a9de06 100644 --- a/go/src/com/android/launcher3/shortcuts/DeepShortcutManager.java +++ b/go/src/com/android/launcher3/shortcuts/DeepShortcutManager.java @@ -53,11 +53,14 @@ public class DeepShortcutManager { return false; } - public static boolean supportsNotificationDots( - ItemInfo info, List notifications) { + public static boolean supportsDeepShortcuts(ItemInfo info) { return false; } + public static String getShortcutIdIfApplicable(ItemInfo info) { + return null; + } + public boolean wasLastCallSuccess() { return false; } diff --git a/src/com/android/launcher3/popup/PopupDataProvider.java b/src/com/android/launcher3/popup/PopupDataProvider.java index dd496b02bf..6e4883e419 100644 --- a/src/com/android/launcher3/popup/PopupDataProvider.java +++ b/src/com/android/launcher3/popup/PopupDataProvider.java @@ -38,6 +38,7 @@ import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.function.Predicate; +import java.util.stream.Collectors; import androidx.annotation.NonNull; import androidx.annotation.Nullable; @@ -130,7 +131,8 @@ public class PopupDataProvider implements NotificationListener.NotificationsChan for (PackageUserKey packageUserKey : mPackageUserToDotInfos.keySet()) { DotInfo prevDot = updatedDots.get(packageUserKey); DotInfo newDot = mPackageUserToDotInfos.get(packageUserKey); - if (prevDot == null) { + if (prevDot == null + || prevDot.getNotificationCount() != newDot.getNotificationCount()) { updatedDots.put(packageUserKey, newDot); } else { // No need to update the dot if it already existed (no visual change). @@ -156,7 +158,7 @@ public class PopupDataProvider implements NotificationListener.NotificationsChan } public int getShortcutCountForItem(ItemInfo info) { - if (!DeepShortcutManager.supportsShortcuts(info)) { + if (!DeepShortcutManager.supportsDeepShortcuts(info)) { return 0; } ComponentName component = info.getTargetComponent(); @@ -169,10 +171,16 @@ public class PopupDataProvider implements NotificationListener.NotificationsChan } public @Nullable DotInfo getDotInfoForItem(@NonNull ItemInfo info) { + if (!DeepShortcutManager.supportsShortcuts(info)) { + return null; + } DotInfo dotInfo = mPackageUserToDotInfos.get(PackageUserKey.fromItemInfo(info)); - List notifications = - dotInfo == null ? Collections.EMPTY_LIST : dotInfo.getNotificationKeys(); - if (!DeepShortcutManager.supportsNotificationDots(info, notifications)) { + if (dotInfo == null) { + return null; + } + List notifications = getNotificationsForItem( + info, dotInfo.getNotificationKeys()); + if (notifications.isEmpty()) { return null; } return dotInfo; @@ -180,7 +188,8 @@ public class PopupDataProvider implements NotificationListener.NotificationsChan public @NonNull List getNotificationKeysForItem(ItemInfo info) { DotInfo dotInfo = getDotInfoForItem(info); - return dotInfo == null ? Collections.EMPTY_LIST : dotInfo.getNotificationKeys(); + return dotInfo == null ? Collections.EMPTY_LIST + : getNotificationsForItem(info, dotInfo.getNotificationKeys()); } /** This makes a potentially expensive binder call and should be run on a background thread. */ @@ -229,6 +238,20 @@ public class PopupDataProvider implements NotificationListener.NotificationsChan return null; } + /** + * Returns a list of notifications that are relevant to given ItemInfo. + */ + public static @NonNull List getNotificationsForItem( + @NonNull ItemInfo info, @NonNull List notifications) { + String shortcutId = DeepShortcutManager.getShortcutIdIfApplicable(info); + if (shortcutId == null) { + return notifications; + } + return notifications.stream().filter((NotificationKeyData notification) -> + shortcutId.equals(notification.shortcutId) + ).collect(Collectors.toList()); + } + public interface PopupDataChangeListener { PopupDataChangeListener INSTANCE = new PopupDataChangeListener() { }; diff --git a/src_shortcuts_overrides/com/android/launcher3/shortcuts/DeepShortcutManager.java b/src_shortcuts_overrides/com/android/launcher3/shortcuts/DeepShortcutManager.java index f42bafe5e4..aec2badf27 100644 --- a/src_shortcuts_overrides/com/android/launcher3/shortcuts/DeepShortcutManager.java +++ b/src_shortcuts_overrides/com/android/launcher3/shortcuts/DeepShortcutManager.java @@ -30,7 +30,6 @@ 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; @@ -65,16 +64,16 @@ public class DeepShortcutManager { } public static boolean supportsShortcuts(ItemInfo info) { + return isActive(info) && (isApp(info) || isPinnedShortcut(info)); + } + + public static boolean supportsDeepShortcuts(ItemInfo info) { 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)); + public static String getShortcutIdIfApplicable(ItemInfo info) { + return isActive(info) && isPinnedShortcut(info) ? + ShortcutKey.fromItemInfo(info).getId() : null; } private static boolean isApp(ItemInfo info) { @@ -87,20 +86,6 @@ public class DeepShortcutManager { && 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; - } - public boolean wasLastCallSuccess() { return mWasLastCallSuccess; }