Merge "Not allowing foreground services to be cleared as children" into nyc-mr2-dev

This commit is contained in:
Selim Cinek
2017-01-17 22:57:08 +00:00
committed by Android (Google) Code Review
3 changed files with 34 additions and 21 deletions

View File

@@ -394,20 +394,6 @@ public class NotificationData {
return false; 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? // Q: What kinds of notifications should show during setup?
// A: Almost none! Only things coming from the system (package is "android") that also // 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). // have special "kind" tags marking them as relevant for setup (see below).

View File

@@ -1196,8 +1196,10 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode,
List<ExpandableNotificationRow> children = row.getNotificationChildren(); List<ExpandableNotificationRow> children = row.getNotificationChildren();
if (row.areChildrenExpanded() && children != null) { if (row.areChildrenExpanded() && children != null) {
for (ExpandableNotificationRow childRow : children) { for (ExpandableNotificationRow childRow : children) {
if (childRow.getVisibility() == View.VISIBLE) { if (mStackScroller.canChildBeDismissed(childRow)) {
viewsToHide.add(childRow); if (childRow.getVisibility() == View.VISIBLE) {
viewsToHide.add(childRow);
}
} }
} }
} }
@@ -1682,8 +1684,15 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode,
} }
List<ExpandableNotificationRow> notificationChildren = List<ExpandableNotificationRow> notificationChildren =
entry.row.getNotificationChildren(); entry.row.getNotificationChildren();
ArrayList<ExpandableNotificationRow> toRemove = new ArrayList<>(notificationChildren); ArrayList<ExpandableNotificationRow> toRemove = new ArrayList<>();
for (int i = 0; i < toRemove.size(); i++) { 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); toRemove.get(i).setKeepInParent(true);
// we need to set this state earlier as otherwise we might generate some weird // we need to set this state earlier as otherwise we might generate some weird
// animations // animations
@@ -1949,10 +1958,27 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode,
private void updateClearAll() { private void updateClearAll() {
boolean showDismissView = boolean showDismissView =
mState != StatusBarState.KEYGUARD && mState != StatusBarState.KEYGUARD &&
mNotificationData.hasActiveClearableNotifications(); hasActiveClearableNotifications();
mStackScroller.updateDismissView(showDismissView); 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() { private void updateEmptyShadeView() {
boolean showEmptyShade = boolean showEmptyShade =
mState != StatusBarState.KEYGUARD && mState != StatusBarState.KEYGUARD &&
@@ -1999,7 +2025,7 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode,
if (SPEW) { if (SPEW) {
final boolean clearable = hasActiveNotifications() && final boolean clearable = hasActiveNotifications() &&
mNotificationData.hasActiveClearableNotifications(); hasActiveClearableNotifications();
Log.d(TAG, "setAreThereNotifications: N=" + Log.d(TAG, "setAreThereNotifications: N=" +
mNotificationData.getActiveNotifications().size() + " any=" + mNotificationData.getActiveNotifications().size() + " any=" +
hasActiveNotifications() + " clearable=" + clearable); hasActiveNotifications() + " clearable=" + clearable);

View File

@@ -3576,7 +3576,8 @@ public class NotificationManagerService extends SystemService {
NotificationRecord childR = mNotificationList.get(i); NotificationRecord childR = mNotificationList.get(i);
StatusBarNotification childSbn = childR.sbn; StatusBarNotification childSbn = childR.sbn;
if ((childSbn.isGroup() && !childSbn.getNotification().isGroupSummary()) && 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(), EventLogTags.writeNotificationCancel(callingUid, callingPid, pkg, childSbn.getId(),
childSbn.getTag(), userId, 0, 0, reason, listenerName); childSbn.getTag(), userId, 0, 0, reason, listenerName);
mNotificationList.remove(i); mNotificationList.remove(i);