Merge "Ensure each dot contains only relevant notification to the shortcut and displays system shortcut when long click on deep shortcut." into ub-launcher3-qt-qpr1-dev

This commit is contained in:
Pinyao Ting
2019-08-01 16:51:57 +00:00
committed by Android (Google) Code Review
3 changed files with 41 additions and 30 deletions
@@ -53,11 +53,14 @@ public class DeepShortcutManager {
return false;
}
public static boolean supportsNotificationDots(
ItemInfo info, List<NotificationKeyData> notifications) {
public static boolean supportsDeepShortcuts(ItemInfo info) {
return false;
}
public static String getShortcutIdIfApplicable(ItemInfo info) {
return null;
}
public boolean wasLastCallSuccess() {
return false;
}
@@ -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<NotificationKeyData> notifications =
dotInfo == null ? Collections.EMPTY_LIST : dotInfo.getNotificationKeys();
if (!DeepShortcutManager.supportsNotificationDots(info, notifications)) {
if (dotInfo == null) {
return null;
}
List<NotificationKeyData> 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<NotificationKeyData> 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<NotificationKeyData> getNotificationsForItem(
@NonNull ItemInfo info, @NonNull List<NotificationKeyData> 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() { };
@@ -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<NotificationKeyData> 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<NotificationKeyData> 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;
}