diff options
| author | 2024-01-11 13:14:02 +0800 | |
|---|---|---|
| committer | 2024-01-11 13:14:02 +0800 | |
| commit | ccd1c01be7e25fa6f7c7c830fd6684e6714a1de5 (patch) | |
| tree | 6e8064bc4727a1b103246d884397011d1c6866a9 | |
| parent | 6b300d7a8b26855e6dce278cf16e7588616fd5eb (diff) | |
Fixes two BackAnimationController crash from window focus change.
1. Shell side is waiting for animation but got window focus changed,
so mBackNavigationInfo will be reset. Keep previous navigation type
incase shell receive onAnimationCancelled later.
2. Core should preventing from cause window focus change during
startBackNavigation, it's allowed to happen after BackNavigationInfo
return to shell.
Bug: 319293969
Test: presubmit
Change-Id: I9061db055003f661e585fdc647f0bf17be6f9081
| -rw-r--r-- | libs/WindowManager/Shell/src/com/android/wm/shell/back/BackAnimationController.java | 9 | ||||
| -rw-r--r-- | services/core/java/com/android/server/wm/BackNavigationController.java | 4 |
2 files changed, 11 insertions, 2 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 a49823648d01..e5a39c447ffa 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 @@ -176,6 +176,10 @@ public class BackAnimationController implements RemoteCallable<BackAnimationCont private StatusBarCustomizer mCustomizer; private boolean mTrackingLatency; + // Keep previous navigation type before remove mBackNavigationInfo. + @BackNavigationInfo.BackTargetType + private int mPreviousNavigationType; + public BackAnimationController( @NonNull ShellInit shellInit, @NonNull ShellController shellController, @@ -861,6 +865,7 @@ public class BackAnimationController implements RemoteCallable<BackAnimationCont mShellBackAnimationRegistry.resetDefaultCrossActivity(); cancelLatencyTracking(); if (mBackNavigationInfo != null) { + mPreviousNavigationType = mBackNavigationInfo.getType(); mBackNavigationInfo.onBackNavigationFinished(triggerBack); mBackNavigationInfo = null; } @@ -965,7 +970,9 @@ public class BackAnimationController implements RemoteCallable<BackAnimationCont mShellExecutor.execute( () -> { if (!mShellBackAnimationRegistry.cancel( - mBackNavigationInfo.getType())) { + mBackNavigationInfo != null + ? mBackNavigationInfo.getType() + : mPreviousNavigationType)) { return; } if (!mBackGestureStarted) { diff --git a/services/core/java/com/android/server/wm/BackNavigationController.java b/services/core/java/com/android/server/wm/BackNavigationController.java index 22d17b596c4c..7bbe5d55df57 100644 --- a/services/core/java/com/android/server/wm/BackNavigationController.java +++ b/services/core/java/com/android/server/wm/BackNavigationController.java @@ -1594,7 +1594,9 @@ class BackNavigationController { // skip commitVisibility call in setVisibility cause the activity won't visible here. // Call it again to make sure the activity could be visible while handling the pending // animation. - activity.commitVisibility(true, true); + // Do not performLayout during prepare animation, because it could cause focus window + // change. Let that happen after the BackNavigationInfo has returned to shell. + activity.commitVisibility(true, false /* performLayout */); activity.mTransitionController.mSnapshotController .mActivitySnapshotController.addOnBackPressedActivity(activity); } |