diff options
| -rw-r--r-- | packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java | 33 |
1 files changed, 27 insertions, 6 deletions
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java index 07ab6876e42b..e3ac9fe68709 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java @@ -473,6 +473,7 @@ public class StatusBar extends SystemUI implements DemoMode, int mSystemUiVisibility = View.SYSTEM_UI_FLAG_VISIBLE; private final Rect mLastFullscreenStackBounds = new Rect(); private final Rect mLastDockedStackBounds = new Rect(); + private final Rect mTmpRect = new Rect(); // last value sent to window manager private int mLastDispatchedSystemUiVisibility = ~View.SYSTEM_UI_FLAG_VISIBLE; @@ -1370,20 +1371,33 @@ public class StatusBar extends SystemUI implements DemoMode, int numChildren = mStackScroller.getChildCount(); final ArrayList<View> viewsToHide = new ArrayList<View>(numChildren); + final ArrayList<ExpandableNotificationRow> viewsToRemove = new ArrayList<>(numChildren); for (int i = 0; i < numChildren; i++) { final View child = mStackScroller.getChildAt(i); if (child instanceof ExpandableNotificationRow) { + ExpandableNotificationRow row = (ExpandableNotificationRow) child; + boolean parentVisible = false; + boolean hasClipBounds = child.getClipBounds(mTmpRect); if (mStackScroller.canChildBeDismissed(child)) { - if (child.getVisibility() == View.VISIBLE) { + viewsToRemove.add(row); + if (child.getVisibility() == View.VISIBLE + && (!hasClipBounds || mTmpRect.height() > 0)) { viewsToHide.add(child); + parentVisible = true; } + } else if (child.getVisibility() == View.VISIBLE + && (!hasClipBounds || mTmpRect.height() > 0)) { + parentVisible = true; } - ExpandableNotificationRow row = (ExpandableNotificationRow) child; List<ExpandableNotificationRow> children = row.getNotificationChildren(); - if (row.areChildrenExpanded() && children != null) { + if (children != null) { for (ExpandableNotificationRow childRow : children) { - if (mStackScroller.canChildBeDismissed(childRow)) { - if (childRow.getVisibility() == View.VISIBLE) { + viewsToRemove.add(childRow); + if (parentVisible && row.areChildrenExpanded() + && mStackScroller.canChildBeDismissed(childRow)) { + hasClipBounds = childRow.getClipBounds(mTmpRect); + if (childRow.getVisibility() == View.VISIBLE + && (!hasClipBounds || mTmpRect.height() > 0)) { viewsToHide.add(childRow); } } @@ -1391,7 +1405,7 @@ public class StatusBar extends SystemUI implements DemoMode, } } } - if (viewsToHide.isEmpty()) { + if (viewsToRemove.isEmpty()) { animateCollapsePanels(CommandQueue.FLAG_EXCLUDE_NONE); return; } @@ -1400,6 +1414,13 @@ public class StatusBar extends SystemUI implements DemoMode, @Override public void run() { mStackScroller.setDismissAllInProgress(false); + for (ExpandableNotificationRow rowToRemove : viewsToRemove) { + if (mStackScroller.canChildBeDismissed(rowToRemove)) { + removeNotification(rowToRemove.getEntry().key, null); + } else { + rowToRemove.resetTranslation(); + } + } try { mBarService.onClearAllNotifications(mCurrentUserId); } catch (Exception ex) { } |