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

Commit 8ebf322e authored by Shan Huang's avatar Shan Huang
Browse files

Don't dispatch onBackCancelled if start is not dispatched.

Bug: 329491664
Fixes: 329491664
Test: long press on the edge of all-apps (built from SysUI-Studio). Make
sure there's no crashes.
Test: atest BackAnimationControllerTest

Change-Id: I0d28373b3341e6637dfaf0adaf7b3ddf0196f69b
parent 0f6a4de2
Loading
Loading
Loading
Loading
+8 −4
Original line number Diff line number Diff line
@@ -670,7 +670,11 @@ public class BackAnimationController implements RemoteCallable<BackAnimationCont
        }
    }

    private void dispatchOnBackCancelled(IOnBackInvokedCallback callback) {
    private void tryDispatchOnBackCancelled(IOnBackInvokedCallback callback) {
        if (!mOnBackStartDispatched) {
            Log.e(TAG, "Skipping dispatching onBackCancelled. Start was never dispatched.");
            return;
        }
        if (callback == null) {
            return;
        }
@@ -729,7 +733,7 @@ public class BackAnimationController implements RemoteCallable<BackAnimationCont
            if (touchTracker.getTriggerBack()) {
                dispatchOrAnimateOnBackInvoked(callback, touchTracker);
            } else {
                dispatchOnBackCancelled(callback);
                tryDispatchOnBackCancelled(callback);
            }
        }
        finishBackNavigation(touchTracker.getTriggerBack());
@@ -808,7 +812,7 @@ public class BackAnimationController implements RemoteCallable<BackAnimationCont
        if (mCurrentTracker.getTriggerBack()) {
            dispatchOrAnimateOnBackInvoked(mActiveCallback, mCurrentTracker);
        } else {
            dispatchOnBackCancelled(mActiveCallback);
            tryDispatchOnBackCancelled(mActiveCallback);
        }
    }

@@ -846,7 +850,7 @@ public class BackAnimationController implements RemoteCallable<BackAnimationCont
        if (mCurrentTracker.isInInitialState()) {
            if (mBackGestureStarted) {
                mBackGestureStarted = false;
                dispatchOnBackCancelled(mActiveCallback);
                tryDispatchOnBackCancelled(mActiveCallback);
                finishBackNavigation(false);
                ProtoLog.d(WM_SHELL_BACK_PREVIEW,
                        "resetTouchTracker -> reset an unfinished gesture");
+17 −0
Original line number Diff line number Diff line
@@ -526,6 +526,23 @@ public class BackAnimationControllerTest extends ShellTestCase {
        verify(mAnimatorCallback, never()).onBackInvoked();
    }

    @Test
    public void skipsCancelWithoutStart() throws RemoteException {
        final int type = BackNavigationInfo.TYPE_CALLBACK;
        final ResultListener result = new ResultListener();
        createNavigationInfo(new BackNavigationInfo.Builder()
                .setType(type)
                .setOnBackInvokedCallback(mAppCallback)
                .setOnBackNavigationDone(new RemoteCallback(result)));
        doMotionEvent(MotionEvent.ACTION_CANCEL, 0);
        mShellExecutor.flushAll();

        verify(mAppCallback, never()).onBackStarted(any());
        verify(mAppCallback, never()).onBackProgressed(any());
        verify(mAppCallback, never()).onBackInvoked();
        verify(mAppCallback, never()).onBackCancelled();
    }

    @Test
    public void testBackToActivity() throws RemoteException {
        final CrossActivityBackAnimation animation = new CrossActivityBackAnimation(mContext,