Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 9447e887 authored by Pinyao Ting's avatar Pinyao Ting Committed by Android (Google) Code Review
Browse files

Merge "Ensure each dot contains only relevant notification to the shortcut and...

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
parents d33894c7 bf608722
Loading
Loading
Loading
Loading
+5 −2
Original line number Diff line number Diff line
@@ -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;
    }
+29 −6
Original line number Diff line number Diff line
@@ -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() { };
+7 −22
Original line number Diff line number Diff line
@@ -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);
        return isActive(info) && (isApp(info) || isPinnedShortcut(info));
    }

    public static boolean supportsNotificationDots(
            ItemInfo info, List<NotificationKeyData> notifications) {
        if (!isActive(info)) {
            return false;
    public static boolean supportsDeepShortcuts(ItemInfo info) {
        return isActive(info) && isApp(info);
    }
        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;
    }