summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/NotificationData.java14
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java38
-rw-r--r--services/core/java/com/android/server/notification/NotificationManagerService.java3
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);