From b2236108aefc29cb0cc0b4554a584116c06949f0 Mon Sep 17 00:00:00 2001 From: Selim Cinek Date: Thu, 22 Dec 2016 16:39:54 +0100 Subject: [PATCH] Fixed a bug where notifications could stay expanded When expanding and locking the screen, the notification could be stuck in a userlocked state and therefore look expanded even on the lock screen. Another case where this could happen was when there was a race between locking the screen and collapsing a group. Merged-In: I4f359d727013ee8c9e4174d2855896ba8d3d1a0b Change-Id: I4f359d727013ee8c9e4174d2855896ba8d3d1a0b Test: have group on locked shade, expand, click on middle space during expansion Bug: 33614507 --- .../src/com/android/systemui/ExpandHelper.java | 39 +++++++++++++++------- .../stack/NotificationStackScrollLayout.java | 13 ++++++++ 2 files changed, 40 insertions(+), 12 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/ExpandHelper.java b/packages/SystemUI/src/com/android/systemui/ExpandHelper.java index 7a5e32227db1..8141b288ddee 100644 --- a/packages/SystemUI/src/com/android/systemui/ExpandHelper.java +++ b/packages/SystemUI/src/com/android/systemui/ExpandHelper.java @@ -326,7 +326,8 @@ public class ExpandHelper implements Gefingerpoken { case MotionEvent.ACTION_CANCEL: case MotionEvent.ACTION_UP: if (DEBUG) Log.d(TAG, "up/cancel"); - finishExpanding(false, getCurrentVelocity()); + finishExpanding(ev.getActionMasked() == MotionEvent.ACTION_CANCEL /* forceAbort */, + getCurrentVelocity()); clearView(); break; } @@ -390,7 +391,8 @@ public class ExpandHelper implements Gefingerpoken { @Override public boolean onTouchEvent(MotionEvent ev) { - if (!isEnabled()) { + if (!isEnabled() && !mExpanding) { + // In case we're expanding we still want to finish the current motion. return false; } trackVelocity(ev); @@ -485,7 +487,8 @@ public class ExpandHelper implements Gefingerpoken { case MotionEvent.ACTION_UP: case MotionEvent.ACTION_CANCEL: if (DEBUG) Log.d(TAG, "up/cancel"); - finishExpanding(false, getCurrentVelocity()); + finishExpanding(!isEnabled() || ev.getActionMasked() == MotionEvent.ACTION_CANCEL, + getCurrentVelocity()); clearView(); break; } @@ -526,28 +529,37 @@ public class ExpandHelper implements Gefingerpoken { return true; } - private void finishExpanding(boolean force, float velocity) { + /** + * Finish the current expand motion + * @param forceAbort whether the expansion should be forcefully aborted and returned to the old + * state + * @param velocity the velocity this was expanded/ collapsed with + */ + private void finishExpanding(boolean forceAbort, float velocity) { if (!mExpanding) return; if (DEBUG) Log.d(TAG, "scale in finishing on view: " + mResizedView); float currentHeight = mScaler.getHeight(); - float h = mScaler.getHeight(); final boolean wasClosed = (mOldHeight == mSmallSize); boolean nowExpanded; - int naturalHeight = mScaler.getNaturalHeight(); - if (wasClosed) { - nowExpanded = (force || currentHeight > mOldHeight && velocity >= 0); + if (!forceAbort) { + if (wasClosed) { + nowExpanded = currentHeight > mOldHeight && velocity >= 0; + } else { + nowExpanded = currentHeight >= mOldHeight || velocity > 0; + } + nowExpanded |= mNaturalHeight == mSmallSize; } else { - nowExpanded = !force && (currentHeight >= mOldHeight || velocity > 0); + nowExpanded = !wasClosed; } - nowExpanded |= mNaturalHeight == mSmallSize; if (mScaleAnimation.isRunning()) { mScaleAnimation.cancel(); } mCallback.expansionStateChanged(false); + int naturalHeight = mScaler.getNaturalHeight(); float targetHeight = nowExpanded ? naturalHeight : mSmallSize; - if (targetHeight != currentHeight) { + if (targetHeight != currentHeight && mEnabled) { mScaleAnimation.setFloatValues(targetHeight); mScaleAnimation.setupStartValues(); final View scaledView = mResizedView; @@ -575,6 +587,9 @@ public class ExpandHelper implements Gefingerpoken { mFlingAnimationUtils.apply(mScaleAnimation, currentHeight, targetHeight, velocity); mScaleAnimation.start(); } else { + if (targetHeight != currentHeight) { + mScaler.setHeight(targetHeight); + } mCallback.setUserExpandedChild(mResizedView, nowExpanded); mCallback.setUserLockedChild(mResizedView, false); } @@ -597,7 +612,7 @@ public class ExpandHelper implements Gefingerpoken { * Use this to abort any pending expansions in progress. */ public void cancel() { - finishExpanding(true, 0f /* velocity */); + finishExpanding(true /* forceAbort */, 0f /* velocity */); clearView(); // reset the gesture detector 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 a6fe4382475e..8c26ff8b6be2 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationStackScrollLayout.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationStackScrollLayout.java @@ -1023,6 +1023,19 @@ public class NotificationStackScrollLayout extends ViewGroup public void setUserExpandedChild(View v, boolean userExpanded) { if (v instanceof ExpandableNotificationRow) { ExpandableNotificationRow row = (ExpandableNotificationRow) v; + if (userExpanded && onKeyguard()) { + // Due to a race when locking the screen while touching, a notification may be + // expanded even after we went back to keyguard. An example of this happens if + // you click in the empty space while expanding a group. + + // We also need to un-user lock it here, since otherwise the content height + // calculated might be wrong. We also can't invert the two calls since + // un-userlocking it will trigger a layout switch in the content view. + row.setUserLocked(false); + updateContentHeight(); + notifyHeightChangeListener(row); + return; + } row.setUserExpanded(userExpanded, true /* allowChildrenExpansion */); row.onExpandedByGesture(userExpanded); } -- 2.11.0