diff options
3 files changed, 34 insertions, 21 deletions
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationData.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationData.java index 05a9fc762595..3052bf6a0617 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationData.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationData.java @@ -394,20 +394,6 @@ public class NotificationData { return false; } - /** - * Return whether there are any clearable notifications (that aren't errors). - */ - public boolean hasActiveClearableNotifications() { - for (Entry e : mSortedAndFiltered) { - if (e.getContentView() != null) { // the view successfully inflated - if (e.notification.isClearable()) { - return true; - } - } - } - return false; - } - // Q: What kinds of notifications should show during setup? // A: Almost none! Only things coming from the system (package is "android") that also // have special "kind" tags marking them as relevant for setup (see below). diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java index ece990331434..49d2cc091f23 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java @@ -1196,8 +1196,10 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, List<ExpandableNotificationRow> children = row.getNotificationChildren(); if (row.areChildrenExpanded() && children != null) { for (ExpandableNotificationRow childRow : children) { - if (childRow.getVisibility() == View.VISIBLE) { - viewsToHide.add(childRow); + if (mStackScroller.canChildBeDismissed(childRow)) { + if (childRow.getVisibility() == View.VISIBLE) { + viewsToHide.add(childRow); + } } } } @@ -1682,8 +1684,15 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, } List<ExpandableNotificationRow> notificationChildren = entry.row.getNotificationChildren(); - ArrayList<ExpandableNotificationRow> toRemove = new ArrayList<>(notificationChildren); - for (int i = 0; i < toRemove.size(); i++) { + ArrayList<ExpandableNotificationRow> toRemove = new ArrayList<>(); + for (int i = 0; i < notificationChildren.size(); i++) { + ExpandableNotificationRow row = notificationChildren.get(i); + if ((row.getStatusBarNotification().getNotification().flags + & Notification.FLAG_FOREGROUND_SERVICE) != 0) { + // the child is a forground service notification which we can't remove! + continue; + } + toRemove.add(row); toRemove.get(i).setKeepInParent(true); // we need to set this state earlier as otherwise we might generate some weird // animations @@ -1949,10 +1958,27 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, private void updateClearAll() { boolean showDismissView = mState != StatusBarState.KEYGUARD && - mNotificationData.hasActiveClearableNotifications(); + hasActiveClearableNotifications(); mStackScroller.updateDismissView(showDismissView); } + /** + * Return whether there are any clearable notifications + */ + private boolean hasActiveClearableNotifications() { + int childCount = mStackScroller.getChildCount(); + for (int i = 0; i < childCount; i++) { + View child = mStackScroller.getChildAt(i); + if (!(child instanceof ExpandableNotificationRow)) { + continue; + } + if (((ExpandableNotificationRow) child).canViewBeDismissed()) { + return true; + } + } + return false; + } + private void updateEmptyShadeView() { boolean showEmptyShade = mState != StatusBarState.KEYGUARD && @@ -1999,7 +2025,7 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, if (SPEW) { final boolean clearable = hasActiveNotifications() && - mNotificationData.hasActiveClearableNotifications(); + hasActiveClearableNotifications(); Log.d(TAG, "setAreThereNotifications: N=" + mNotificationData.getActiveNotifications().size() + " any=" + hasActiveNotifications() + " clearable=" + clearable); diff --git a/services/core/java/com/android/server/notification/NotificationManagerService.java b/services/core/java/com/android/server/notification/NotificationManagerService.java index d31c7b54cee5..4c81ad1f0d08 100644 --- a/services/core/java/com/android/server/notification/NotificationManagerService.java +++ b/services/core/java/com/android/server/notification/NotificationManagerService.java @@ -3576,7 +3576,8 @@ public class NotificationManagerService extends SystemService { NotificationRecord childR = mNotificationList.get(i); StatusBarNotification childSbn = childR.sbn; if ((childSbn.isGroup() && !childSbn.getNotification().isGroupSummary()) && - childR.getGroupKey().equals(r.getGroupKey())) { + childR.getGroupKey().equals(r.getGroupKey()) + && (childR.getFlags() & Notification.FLAG_FOREGROUND_SERVICE) == 0) { EventLogTags.writeNotificationCancel(callingUid, callingPid, pkg, childSbn.getId(), childSbn.getTag(), userId, 0, 0, reason, listenerName); mNotificationList.remove(i); |