From d13956475e97da9de83f6519eab514770118e7af Mon Sep 17 00:00:00 2001 From: Selim Cinek Date: Thu, 28 Apr 2016 12:22:42 -0700 Subject: [PATCH] Made the dismissal of notifications snappier The notifications now dismiss as soon as the finger is lifted from the screen and we don't wait until it's fully translated. Change-Id: I2a37e019ce628ccf77e12bf8756bd05e549eca61 Fixes: 27418846 --- .../statusbar/ExpandableNotificationRow.java | 4 ++ .../systemui/statusbar/ExpandableView.java | 9 +++ .../statusbar/phone/PhoneStatusBar.java | 3 +- .../stack/NotificationStackScrollLayout.java | 62 +++++++++++++++---- .../statusbar/stack/StackStateAnimator.java | 6 +- 5 files changed, 69 insertions(+), 15 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableNotificationRow.java b/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableNotificationRow.java index af48c9f901d92..1b31edb2ac16b 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableNotificationRow.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableNotificationRow.java @@ -669,6 +669,10 @@ public class ExpandableNotificationRow extends ActivatableNotificationView { mRemoved = removed; } + public NotificationChildrenContainer getChildrenContainer() { + return mChildrenContainer; + } + public interface ExpansionLogger { public void logNotificationExpansion(String key, boolean userAction, boolean expanded); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableView.java b/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableView.java index 6dcd61f259f36..a5d65d2102680 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableView.java @@ -44,6 +44,7 @@ public abstract class ExpandableView extends FrameLayout { private int mMinClipTopAmount = 0; private boolean mClipToActualHeight = true; private boolean mChangingPosition = false; + private ViewGroup mTransientContainer; public ExpandableView(Context context, AttributeSet attrs) { super(context, attrs); @@ -416,6 +417,14 @@ public abstract class ExpandableView extends FrameLayout { return mChangingPosition; } + public void setTransientContainer(ViewGroup transientContainer) { + mTransientContainer = transientContainer; + } + + public ViewGroup getTransientContainer() { + return mTransientContainer; + } + /** * A listener notifying when {@link #getActualHeight} changes. */ 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 c660cd8c634e4..9b4e8ef564c95 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java @@ -1736,7 +1736,8 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, if (mNotificationData.get(remove.getStatusBarNotification().getKey()) == null) { // We only want to add an animation if the view is completely removed // otherwise it's just a transfer - mStackScroller.notifyGroupChildRemoved(remove); + mStackScroller.notifyGroupChildRemoved(remove, + parent.getChildrenContainer()); } } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationStackScrollLayout.java b/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationStackScrollLayout.java index 13d5a669a3ef3..4c8f27d5fa8c2 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationStackScrollLayout.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationStackScrollLayout.java @@ -686,6 +686,17 @@ public class NotificationStackScrollLayout extends ViewGroup } public void onChildDismissed(View v) { + ExpandableNotificationRow row = (ExpandableNotificationRow) v; + if (!row.isDismissed()) { + handleChildDismissed(v); + } + ViewGroup transientContainer = row.getTransientContainer(); + if (transientContainer != null) { + transientContainer.removeTransientView(v); + } + } + + private void handleChildDismissed(View v) { if (mDismissAllInProgress) { return; } @@ -2058,7 +2069,7 @@ public class NotificationStackScrollLayout extends ViewGroup // we only call our internal methods if this is actually a removal and not just a // notification which becomes a child notification if (!mChildTransferInProgress) { - onViewRemovedInternal(child); + onViewRemovedInternal(child, this); } } @@ -2070,24 +2081,30 @@ public class NotificationStackScrollLayout extends ViewGroup } } - private void onViewRemovedInternal(View child) { + private void onViewRemovedInternal(View child, ViewGroup transientContainer) { if (mChangePositionInProgress) { // This is only a position change, don't do anything special return; } - ((ExpandableView) child).setOnHeightChangedListener(null); + ExpandableView expandableView = (ExpandableView) child; + expandableView.setOnHeightChangedListener(null); mCurrentStackScrollState.removeViewStateForView(child); - updateScrollStateForRemovedChild((ExpandableView) child); + updateScrollStateForRemovedChild(expandableView); boolean animationGenerated = generateRemoveAnimation(child); - if (animationGenerated && !mSwipedOutViews.contains(child)) { - // Add this view to an overlay in order to ensure that it will still be temporary - // drawn when removed - getOverlay().add(child); + if (animationGenerated) { + if (!mSwipedOutViews.contains(child)) { + getOverlay().add(child); + } else if (Math.abs(expandableView.getTranslation()) != expandableView.getWidth()) { + transientContainer.addTransientView(child, 0); + expandableView.setTransientContainer(transientContainer); + } + } else { + mSwipedOutViews.remove(child); } updateAnimationState(false, child); // Make sure the clipRect we might have set is removed - ((ExpandableView) child).setClipTopOptimization(0); + expandableView.setClipTopOptimization(0); } private boolean isChildInGroup(View child) { @@ -2264,8 +2281,8 @@ public class NotificationStackScrollLayout extends ViewGroup } } - public void notifyGroupChildRemoved(View row) { - onViewRemovedInternal(row); + public void notifyGroupChildRemoved(View row, ViewGroup childrenContainer) { + onViewRemovedInternal(row, childrenContainer); } public void notifyGroupChildAdded(View row) { @@ -2472,8 +2489,8 @@ public class NotificationStackScrollLayout extends ViewGroup // we need to know the view after this one event.viewAfterChangingView = getFirstChildBelowTranlsationY(child.getTranslationY()); mAnimationEvents.add(event); + mSwipedOutViews.remove(child); } - mSwipedOutViews.clear(); mChildrenToRemoveAnimated.clear(); } @@ -2746,11 +2763,25 @@ public class NotificationStackScrollLayout extends ViewGroup mOwnScrollY = 0; mPhoneStatusBar.resetUserExpandedStates(); - // lets make sure nothing is in the overlay anymore + // lets make sure nothing is in the overlay / transient anymore + clearTransientViews(this); + for (int i = 0; i < getChildCount(); i++) { + ExpandableView child = (ExpandableView) getChildAt(i); + if (child instanceof ExpandableNotificationRow) { + ExpandableNotificationRow row = (ExpandableNotificationRow) child; + clearTransientViews(row.getChildrenContainer()); + } + } getOverlay().clear(); } } + private void clearTransientViews(ViewGroup viewGroup) { + while (viewGroup != null && viewGroup.getTransientViewCount() != 0) { + viewGroup.removeTransientView(getTransientView(0)); + } + } + public void onPanelTrackingStarted() { mPanelTracking = true; } @@ -3573,6 +3604,11 @@ public class NotificationStackScrollLayout extends ViewGroup public void dismissChild(final View view, float velocity, boolean useAccelerateInterpolator) { super.dismissChild(view, velocity, useAccelerateInterpolator); + if (mIsExpanded) { + // We don't want to quick-dismiss when it's a heads up as this might lead to closing + // of the panel early. + handleChildDismissed(view); + } handleGearCoveredOrDismissed(); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/stack/StackStateAnimator.java b/packages/SystemUI/src/com/android/systemui/statusbar/stack/StackStateAnimator.java index dba5bbd27a7a7..f49067dbcaf6e 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/stack/StackStateAnimator.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/stack/StackStateAnimator.java @@ -865,8 +865,12 @@ public class StackStateAnimator { } else if (event.animationType == NotificationStackScrollLayout.AnimationEvent.ANIMATION_TYPE_REMOVE_SWIPED_OUT) { // A race condition can trigger the view to be added to the overlay even though - // it is swiped out. So let's remove it + // it was fully swiped out. So let's remove it mHostLayout.getOverlay().remove(changingView); + if (Math.abs(changingView.getTranslation()) == changingView.getWidth() + && changingView.getTransientContainer() != null) { + changingView.getTransientContainer().removeTransientView(changingView); + } } else if (event.animationType == NotificationStackScrollLayout .AnimationEvent.ANIMATION_TYPE_GROUP_EXPANSION_CHANGED) { ExpandableNotificationRow row = (ExpandableNotificationRow) event.changingView;