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 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).

View File

@@ -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);

View File

@@ -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);