From 36b02233fa8a5121e9fabaf5ac447c7ff4bb20a8 Mon Sep 17 00:00:00 2001 From: Selim Cinek Date: Wed, 11 May 2016 23:07:05 -0400 Subject: [PATCH] Fixed a bug with auto cancelling When clicking on a suppressed child and the child is autocancelled we need to cancel the summary as well for them if it also has the flag to auto cancel. Change-Id: I25bfa7ad79afd406cc647ad6683d0b49c949f909 Fixes: 28642637 --- .../systemui/statusbar/BaseStatusBar.java | 86 +++++++++++++++---- .../phone/NotificationGroupManager.java | 6 +- .../statusbar/phone/PhoneStatusBar.java | 2 + 3 files changed, 78 insertions(+), 16 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java index 593e170ab5a8f..e66dc74c7958b 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java @@ -956,32 +956,39 @@ public abstract class BaseStatusBar extends SystemUI implements protected View bindVetoButtonClickListener(View row, final StatusBarNotification n) { View vetoButton = row.findViewById(R.id.veto); - final String _pkg = n.getPackageName(); - final String _tag = n.getTag(); - final int _id = n.getId(); - final int _userId = n.getUserId(); vetoButton.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { // Accessibility feedback v.announceForAccessibility( mContext.getString(R.string.accessibility_notification_dismissed)); - try { - mBarService.onNotificationClear(_pkg, _tag, _id, _userId); - if (FORCE_REMOTE_INPUT_HISTORY - && mKeysKeptForRemoteInput.contains(n.getKey())) { - removeNotification(n.getKey(), null); - mKeysKeptForRemoteInput.remove(n.getKey()); - } - - } catch (RemoteException ex) { - // system process is dead if we're here. - } + performRemoveNotification(n, false /* removeView */); } }); vetoButton.setImportantForAccessibility(View.IMPORTANT_FOR_ACCESSIBILITY_NO); return vetoButton; } + private void performRemoveNotification(StatusBarNotification n, boolean removeView) { + final String pkg = n.getPackageName(); + final String tag = n.getTag(); + final int id = n.getId(); + final int userId = n.getUserId(); + try { + mBarService.onNotificationClear(pkg, tag, id, userId); + if (FORCE_REMOTE_INPUT_HISTORY + && mKeysKeptForRemoteInput.contains(n.getKey())) { + mKeysKeptForRemoteInput.remove(n.getKey()); + removeView = true; + } + if (removeView) { + removeNotification(n.getKey(), null); + } + + } catch (RemoteException ex) { + // system process is dead if we're here. + } + } + protected void applyColorsAndBackgrounds(StatusBarNotification sbn, NotificationData.Entry entry) { @@ -1826,6 +1833,13 @@ public abstract class BaseStatusBar extends SystemUI implements }, afterKeyguardGone); } + public void addPostCollapseAction(Runnable r) { + } + + public boolean isCollapsing() { + return false; + } + private final class NotificationClicker implements View.OnClickListener { public void onClick(final View v) { if (!(v instanceof ExpandableNotificationRow)) { @@ -1875,6 +1889,15 @@ public abstract class BaseStatusBar extends SystemUI implements HeadsUpManager.setIsClickedNotification(row, true); mHeadsUpManager.releaseImmediately(notificationKey); } + StatusBarNotification parentToCancel = null; + if (shouldAutoCancel(sbn) && mGroupManager.isOnlyChildInGroup(sbn)) { + StatusBarNotification summarySbn = mGroupManager.getLogicalGroupSummary(sbn) + .getStatusBarNotification(); + if (shouldAutoCancel(summarySbn)) { + parentToCancel = summarySbn; + } + } + final StatusBarNotification parentToCancelFinal = parentToCancel; new Thread() { @Override public void run() { @@ -1930,6 +1953,28 @@ public abstract class BaseStatusBar extends SystemUI implements } catch (RemoteException ex) { // system process is dead if we're here. } + if (parentToCancelFinal != null) { + // We have to post it to the UI thread for synchronization + mHandler.post(new Runnable() { + @Override + public void run() { + Runnable removeRunnable = new Runnable() { + @Override + public void run() { + performRemoveNotification(parentToCancelFinal, + true); + } + }; + if (isCollapsing()) { + // To avoid lags we're only performing the remove + // after the shade was collapsed + addPostCollapseAction(removeRunnable); + } else { + removeRunnable.run(); + } + } + }); + } } }.start(); @@ -1943,6 +1988,17 @@ public abstract class BaseStatusBar extends SystemUI implements }, afterKeyguardGone); } + private boolean shouldAutoCancel(StatusBarNotification sbn) { + int flags = sbn.getNotification().flags; + if ((flags & Notification.FLAG_AUTO_CANCEL) != Notification.FLAG_AUTO_CANCEL) { + return false; + } + if ((flags & Notification.FLAG_FOREGROUND_SERVICE) != 0) { + return false; + } + return true; + } + public void register(ExpandableNotificationRow row, StatusBarNotification sbn) { Notification notification = sbn.getNotification(); if (notification.contentIntent != null || notification.fullScreenIntent != null) { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationGroupManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationGroupManager.java index 270b6edbe367f..7a9b2645374b5 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationGroupManager.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationGroupManager.java @@ -215,7 +215,11 @@ public class NotificationGroupManager implements HeadsUpManager.OnHeadsUpChanged public boolean isOnlyChildInSuppressedGroup(StatusBarNotification sbn) { return isGroupSuppressed(sbn.getGroupKey()) - && !sbn.getNotification().isGroupSummary() + && isOnlyChildInGroup(sbn); + } + + public boolean isOnlyChildInGroup(StatusBarNotification sbn) { + return !sbn.getNotification().isGroupSummary() && getTotalNumberOfChildren(sbn) == 1; } 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 4bb97974b88be..73648387d2352 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java @@ -3828,10 +3828,12 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, updateMediaMetaData(true /* metaDataChanged */, true); } + @Override public boolean isCollapsing() { return mNotificationPanel.isCollapsing(); } + @Override public void addPostCollapseAction(Runnable r) { mPostCollapseRunnables.add(r); }