diff options
2 files changed, 25 insertions, 4 deletions
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/back/BackAnimationController.java b/libs/WindowManager/Shell/src/com/android/wm/shell/back/BackAnimationController.java index 9bd8531d33dc..78129c281fce 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/back/BackAnimationController.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/back/BackAnimationController.java @@ -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"); diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/back/BackAnimationControllerTest.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/back/BackAnimationControllerTest.java index 9ded6ea1d187..0d3f00d37801 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/back/BackAnimationControllerTest.java +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/back/BackAnimationControllerTest.java @@ -527,6 +527,23 @@ public class BackAnimationControllerTest extends ShellTestCase { } @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, mAnimationBackground); |