Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit b2236108 authored by Selim Cinek's avatar Selim Cinek
Browse files

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
parent 45c9ba9c
Loading
Loading
Loading
Loading
+27 −12
Original line number Diff line number Diff line
@@ -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 (!forceAbort) {
            if (wasClosed) {
            nowExpanded = (force || currentHeight > mOldHeight && velocity >= 0);
                nowExpanded = currentHeight > mOldHeight && velocity >= 0;
            } else {
            nowExpanded = !force && (currentHeight >= mOldHeight || velocity > 0);
                nowExpanded = currentHeight >= mOldHeight || velocity > 0;
            }
            nowExpanded |= mNaturalHeight == mSmallSize;
        } else {
            nowExpanded = !wasClosed;
        }
        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
+13 −0
Original line number Diff line number Diff line
@@ -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);
        }