From d722f273237ed4c77ebf9a261cff776125d562e1 Mon Sep 17 00:00:00 2001 From: Christoph Studer Date: Tue, 2 Sep 2014 11:49:19 +0200 Subject: [PATCH] SysUI: Ignore group children when summary is present This is an optimization to avoid inflating Views for notifications we're not going to show and free up memory ASAP. No behavioral changes expected. Bug: 16302692 Change-Id: I5fa03dcc9ad9cae4afc7cd6102d7ea8bfbdcbfd5 --- .../systemui/statusbar/BaseStatusBar.java | 18 ++++++++++++++++++ .../systemui/statusbar/NotificationData.java | 16 +++++++++------- 2 files changed, 27 insertions(+), 7 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java index f04c8c84a411b..f36196639aed6 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java @@ -365,6 +365,24 @@ public abstract class BaseStatusBar extends SystemUI implements Notification n = sbn.getNotification(); boolean isUpdate = mNotificationData.get(sbn.getKey()) != null || isHeadsUp(sbn.getKey()); + + // Ignore children of notifications that have a summary, since we're not + // going to show them anyway. This is true also when the summary is canceled, + // because children are automatically canceled by NoMan in that case. + if (n.isGroupChild() && + mNotificationData.isGroupWithSummary(sbn.getGroupKey())) { + if (DEBUG) { + Log.d(TAG, "Ignoring group child due to existing summary: " + sbn); + } + + // Remove existing notification to avoid stale data. + if (isUpdate) { + removeNotification(sbn.getKey(), rankingMap); + } else { + mNotificationData.updateRanking(rankingMap); + } + return; + } if (isUpdate) { updateNotification(sbn, rankingMap); } else { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationData.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationData.java index 7e373363707dc..454041c8450a7 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationData.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationData.java @@ -89,6 +89,7 @@ public class NotificationData { private final ArrayMap mEntries = new ArrayMap<>(); private final ArrayList mSortedAndFiltered = new ArrayList<>(); + private ArraySet mGroupsWithSummaries = new ArraySet<>(); private RankingMap mRankingMap; private final Ranking mTmpRanking = new Ranking(); @@ -183,8 +184,8 @@ public class NotificationData { // anything changed, and this class should call back the UI so it updates itself. public void filterAndSort() { mSortedAndFiltered.clear(); + mGroupsWithSummaries.clear(); - ArraySet groupsWithSummaries = null; final int N = mEntries.size(); for (int i = 0; i < N; i++) { Entry entry = mEntries.valueAt(i); @@ -195,22 +196,19 @@ public class NotificationData { } if (sbn.getNotification().isGroupSummary()) { - if (groupsWithSummaries == null) { - groupsWithSummaries = new ArraySet<>(); - } - groupsWithSummaries.add(sbn.getGroupKey()); + mGroupsWithSummaries.add(sbn.getGroupKey()); } mSortedAndFiltered.add(entry); } // Second pass: Filter out group children with summary. - if (groupsWithSummaries != null) { + if (!mGroupsWithSummaries.isEmpty()) { final int M = mSortedAndFiltered.size(); for (int i = M - 1; i >= 0; i--) { Entry ent = mSortedAndFiltered.get(i); StatusBarNotification sbn = ent.notification; if (sbn.getNotification().isGroupChild() && - groupsWithSummaries.contains(sbn.getGroupKey())) { + mGroupsWithSummaries.contains(sbn.getGroupKey())) { mSortedAndFiltered.remove(i); } } @@ -219,6 +217,10 @@ public class NotificationData { Collections.sort(mSortedAndFiltered, mRankingComparator); } + public boolean isGroupWithSummary(String groupKey) { + return mGroupsWithSummaries.contains(groupKey); + } + private boolean shouldFilterOut(StatusBarNotification sbn) { if (!(mEnvironment.isDeviceProvisioned() || showNotificationEvenIfUnprovisioned(sbn))) {