From 30637e41c9497576fa644c5ac0bf0864d3a52c5f Mon Sep 17 00:00:00 2001 From: "dongwan0605.kim" Date: Wed, 2 Mar 2016 17:16:47 +0900 Subject: [PATCH] Fix to snap notification view back when not clearable while updating When a notification is being removed by swiping action, actual removing will be performed after the swiping animation ends. And also, it is same when removing notifications with button. The actual removing will be performed after collapsing of status bar. But before actual removing, the notification flags can be updated to not clearable, and then the notification view can be remain out of display by X-translation animation. Therefore, fix to snap the notification view back when updating if it is not clearable and need to be come back. Change-Id: I005a9a8ac82bb513a47b5b8afc430bbe4880b52e --- .../src/com/android/systemui/SwipeHelper.java | 50 ++++++++++++++++++- .../systemui/statusbar/BaseStatusBar.java | 6 +++ .../stack/NotificationStackScrollLayout.java | 5 ++ 3 files changed, 60 insertions(+), 1 deletion(-) diff --git a/packages/SystemUI/src/com/android/systemui/SwipeHelper.java b/packages/SystemUI/src/com/android/systemui/SwipeHelper.java index 81ba23f27f23d..a08b2c1198d81 100644 --- a/packages/SystemUI/src/com/android/systemui/SwipeHelper.java +++ b/packages/SystemUI/src/com/android/systemui/SwipeHelper.java @@ -34,6 +34,8 @@ import android.view.accessibility.AccessibilityEvent; import com.android.systemui.classifier.FalsingManager; import com.android.systemui.statusbar.FlingAnimationUtils; +import java.util.HashMap; + public class SwipeHelper implements Gefingerpoken { static final String TAG = "com.android.systemui.SwipeHelper"; private static final boolean DEBUG = false; @@ -70,6 +72,7 @@ public class SwipeHelper implements Gefingerpoken { private float mInitialTouchPos; private float mPerpendicularInitialTouchPos; private boolean mDragging; + private boolean mSnappingChild; private View mCurrView; private boolean mCanCurrViewBeDimissed; private float mDensityScale; @@ -85,6 +88,8 @@ public class SwipeHelper implements Gefingerpoken { private boolean mTouchAboveFalsingThreshold; private boolean mDisableHwLayers; + private HashMap mDismissPendingMap = new HashMap<>(); + public SwipeHelper(int swipeDirection, Callback callback, Context context) { mCallback = callback; mHandler = new Handler(); @@ -252,6 +257,7 @@ public class SwipeHelper implements Gefingerpoken { case MotionEvent.ACTION_DOWN: mTouchAboveFalsingThreshold = false; mDragging = false; + mSnappingChild = false; mLongPressSent = false; mVelocityTracker.clear(); mCurrView = mCallback.getChildAtPosition(ev); @@ -391,9 +397,18 @@ public class SwipeHelper implements Gefingerpoken { anim.setStartDelay(delay); } anim.addListener(new AnimatorListenerAdapter() { + private boolean mCancelled; + + public void onAnimationCancel(Animator animation) { + mCancelled = true; + } + public void onAnimationEnd(Animator animation) { updateSwipeProgressFromOffset(animView, canBeDismissed); - mCallback.onChildDismissed(animView); + mDismissPendingMap.remove(animView); + if (!mCancelled) { + mCallback.onChildDismissed(animView); + } if (endAction != null) { endAction.run(); } @@ -402,7 +417,9 @@ public class SwipeHelper implements Gefingerpoken { } } }); + prepareDismissAnimation(animView, anim); + mDismissPendingMap.put(animView, anim); anim.start(); } @@ -429,11 +446,13 @@ public class SwipeHelper implements Gefingerpoken { anim.setDuration(duration); anim.addListener(new AnimatorListenerAdapter() { public void onAnimationEnd(Animator animator) { + mSnappingChild = false; updateSwipeProgressFromOffset(animView, canBeDismissed); mCallback.onChildSnappedBack(animView, targetLeft); } }); prepareSnapBackAnimation(animView, anim); + mSnappingChild = true; anim.start(); } @@ -466,6 +485,33 @@ public class SwipeHelper implements Gefingerpoken { updateSwipeProgressFromOffset(animView, canBeDismissed); } + private void snapChildInstantly(final View view) { + final boolean canAnimViewBeDismissed = mCallback.canChildBeDismissed(view); + setTranslation(view, 0); + updateSwipeProgressFromOffset(view, canAnimViewBeDismissed); + } + + public void snapChildIfNeeded(final View view, boolean animate) { + if ((mDragging && mCurrView == view) || mSnappingChild) { + return; + } + boolean needToSnap = false; + Animator dismissPendingAnim = mDismissPendingMap.get(view); + if (dismissPendingAnim != null) { + needToSnap = true; + dismissPendingAnim.cancel(); + } else if (getTranslation(view) != 0) { + needToSnap = true; + } + if (needToSnap) { + if (animate) { + snapChild(view, 0 /* targetLeft */, 0.0f /* velocity */); + } else { + snapChildInstantly(view); + } + } + } + public boolean onTouchEvent(MotionEvent ev) { if (mLongPressSent) { return true; @@ -532,7 +578,9 @@ public class SwipeHelper implements Gefingerpoken { mCallback.onDragCancelled(mCurrView); snapChild(mCurrView, 0 /* leftTarget */, velocity); } + mCurrView = null; } + mDragging = false; break; } return true; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java index 143f1601e21a3..d2c3120532c15 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java @@ -2160,6 +2160,12 @@ public abstract class BaseStatusBar extends SystemUI implements // swipe-dismissable) bindVetoButtonClickListener(entry.row, notification); + if (!notification.isClearable()) { + // The user may have performed a dismiss action on the notification, since it's + // not clearable we should snap it back. + mStackScroller.snapViewIfNeeded(entry.row); + } + if (DEBUG) { // Is this for you? boolean isForCurrentUser = isNotificationForCurrentProfiles(notification); 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 d9b78a2f09fc2..2b5e1f7ab02df 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationStackScrollLayout.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationStackScrollLayout.java @@ -943,6 +943,11 @@ public class NotificationStackScrollLayout extends ViewGroup mSwipeHelper.dismissChild(child, 0, endRunnable, delay, true, duration); } + public void snapViewIfNeeded(View child) { + boolean animate = mIsExpanded || isPinnedHeadsUp(child); + mSwipeHelper.snapChildIfNeeded(child, animate); + } + @Override public boolean onTouchEvent(MotionEvent ev) { boolean isCancelOrUp = ev.getActionMasked() == MotionEvent.ACTION_CANCEL