Update notification group mapping when group key changes
Tested by running: "runtest -x cts/tests/app/src/android/app/cts/NotificationManagerTest.java -m testAutogrouping_autogroupStaysUntilAllNotificationsCanceled" The test fails before this change, and passes afterwards. Also manually verified that the original bug that introduced this regression (b/65100024) remains fixed. Bug: 68215987 Change-Id: I4af198fd5257ad1dfab5e052c11f58ea84b5095a
This commit is contained in:
@@ -16,6 +16,8 @@
|
||||
|
||||
package com.android.launcher3.notification;
|
||||
|
||||
import static com.android.launcher3.SettingsActivity.NOTIFICATION_BADGING;
|
||||
|
||||
import android.annotation.TargetApi;
|
||||
import android.app.Notification;
|
||||
import android.app.NotificationChannel;
|
||||
@@ -43,8 +45,6 @@ import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
|
||||
import static com.android.launcher3.SettingsActivity.NOTIFICATION_BADGING;
|
||||
|
||||
/**
|
||||
* A {@link NotificationListenerService} that sends updates to its
|
||||
* {@link NotificationsChangedListener} when notifications are posted or canceled,
|
||||
@@ -71,6 +71,8 @@ public class NotificationListener extends NotificationListenerService {
|
||||
private final Ranking mTempRanking = new Ranking();
|
||||
/** Maps groupKey's to the corresponding group of notifications. */
|
||||
private final Map<String, NotificationGroup> mNotificationGroupMap = new HashMap<>();
|
||||
/** Maps keys to their corresponding current group key */
|
||||
private final Map<String, String> mNotificationGroupKeyMap = new HashMap<>();
|
||||
|
||||
private SettingsObserver mNotificationBadgingObserver;
|
||||
|
||||
@@ -258,6 +260,48 @@ public class NotificationListener extends NotificationListenerService {
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onNotificationRankingUpdate(RankingMap rankingMap) {
|
||||
super.onNotificationRankingUpdate(rankingMap);
|
||||
String[] keys = rankingMap.getOrderedKeys();
|
||||
for (StatusBarNotification sbn : getActiveNotifications(keys)) {
|
||||
updateGroupKeyIfNecessary(sbn);
|
||||
}
|
||||
}
|
||||
|
||||
private void updateGroupKeyIfNecessary(StatusBarNotification sbn) {
|
||||
String childKey = sbn.getKey();
|
||||
String oldGroupKey = mNotificationGroupKeyMap.get(childKey);
|
||||
String newGroupKey = sbn.getGroupKey();
|
||||
if (oldGroupKey == null || !oldGroupKey.equals(newGroupKey)) {
|
||||
// The group key has changed.
|
||||
mNotificationGroupKeyMap.put(childKey, newGroupKey);
|
||||
if (oldGroupKey != null && mNotificationGroupMap.containsKey(oldGroupKey)) {
|
||||
// Remove the child key from the old group.
|
||||
NotificationGroup oldGroup = mNotificationGroupMap.get(oldGroupKey);
|
||||
oldGroup.removeChildKey(childKey);
|
||||
if (oldGroup.isEmpty()) {
|
||||
mNotificationGroupMap.remove(oldGroupKey);
|
||||
}
|
||||
}
|
||||
}
|
||||
if (sbn.isGroup() && newGroupKey != null) {
|
||||
// Maintain group info so we can cancel the summary when the last child is canceled.
|
||||
NotificationGroup notificationGroup = mNotificationGroupMap.get(newGroupKey);
|
||||
if (notificationGroup == null) {
|
||||
notificationGroup = new NotificationGroup();
|
||||
mNotificationGroupMap.put(newGroupKey, notificationGroup);
|
||||
}
|
||||
boolean isGroupSummary = (sbn.getNotification().flags
|
||||
& Notification.FLAG_GROUP_SUMMARY) != 0;
|
||||
if (isGroupSummary) {
|
||||
notificationGroup.setGroupSummaryKey(childKey);
|
||||
} else {
|
||||
notificationGroup.addChildKey(childKey);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/** This makes a potentially expensive binder call and should be run on a background thread. */
|
||||
public List<StatusBarNotification> getNotificationsForKeys(List<NotificationKeyData> keys) {
|
||||
StatusBarNotification[] notifications = NotificationListener.this
|
||||
@@ -295,20 +339,7 @@ public class NotificationListener extends NotificationListenerService {
|
||||
private boolean shouldBeFilteredOut(StatusBarNotification sbn) {
|
||||
Notification notification = sbn.getNotification();
|
||||
|
||||
boolean isGroupHeader = (notification.flags & Notification.FLAG_GROUP_SUMMARY) != 0;
|
||||
if (sbn.isGroup()) {
|
||||
// Maintain group info so we can cancel the summary when the last child is canceled.
|
||||
NotificationGroup notificationGroup = mNotificationGroupMap.get(sbn.getGroupKey());
|
||||
if (notificationGroup == null) {
|
||||
notificationGroup = new NotificationGroup();
|
||||
mNotificationGroupMap.put(sbn.getGroupKey(), notificationGroup);
|
||||
}
|
||||
if (isGroupHeader) {
|
||||
notificationGroup.setGroupSummaryKey(sbn.getKey());
|
||||
} else {
|
||||
notificationGroup.addChildKey(sbn.getKey());
|
||||
}
|
||||
}
|
||||
updateGroupKeyIfNecessary(sbn);
|
||||
|
||||
getCurrentRanking().getRanking(sbn.getKey(), mTempRanking);
|
||||
if (!mTempRanking.canShowBadge()) {
|
||||
@@ -324,6 +355,7 @@ public class NotificationListener extends NotificationListenerService {
|
||||
CharSequence title = notification.extras.getCharSequence(Notification.EXTRA_TITLE);
|
||||
CharSequence text = notification.extras.getCharSequence(Notification.EXTRA_TEXT);
|
||||
boolean missingTitleAndText = TextUtils.isEmpty(title) && TextUtils.isEmpty(text);
|
||||
boolean isGroupHeader = (notification.flags & Notification.FLAG_GROUP_SUMMARY) != 0;
|
||||
return (isGroupHeader || missingTitleAndText);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user