diff --git a/services/core/java/com/android/server/wm/AsyncRotationController.java b/services/core/java/com/android/server/wm/AsyncRotationController.java index 7e783938d30af..01158779c24f9 100644 --- a/services/core/java/com/android/server/wm/AsyncRotationController.java +++ b/services/core/java/com/android/server/wm/AsyncRotationController.java @@ -185,6 +185,8 @@ class AsyncRotationController extends FadeAnimationController implements Consume } } else if (navigationBarCanMove || mTransitionOp == OP_CHANGE_MAY_SEAMLESS) { action = Operation.ACTION_SEAMLESS; + } else if (mDisplayContent.mTransitionController.mNavigationBarAttachedToApp) { + return; } mTargetWindowTokens.put(w.mToken, new Operation(action)); return; diff --git a/services/core/java/com/android/server/wm/Transition.java b/services/core/java/com/android/server/wm/Transition.java index f7550ca2fa8ef..845fc17049164 100644 --- a/services/core/java/com/android/server/wm/Transition.java +++ b/services/core/java/com/android/server/wm/Transition.java @@ -234,9 +234,6 @@ class Transition implements BLASTSyncEngine.TransactionReadyListener { private @TransitionState int mState = STATE_PENDING; private final ReadyTracker mReadyTracker = new ReadyTracker(); - // TODO(b/188595497): remove when not needed. - /** @see RecentsAnimationController#mNavigationBarAttachedToApp */ - private boolean mNavBarAttachedToApp = false; private int mRecentsDisplayId = INVALID_DISPLAY; /** The delay for light bar appearance animation. */ @@ -1780,7 +1777,7 @@ class Transition implements BLASTSyncEngine.TransactionReadyListener { if (navWindow == null || navWindow.mToken == null) { return; } - mNavBarAttachedToApp = true; + mController.mNavigationBarAttachedToApp = true; navWindow.mToken.cancelAnimation(); final SurfaceControl.Transaction t = navWindow.mToken.getPendingTransaction(); final SurfaceControl navSurfaceControl = navWindow.mToken.getSurfaceControl(); @@ -1802,8 +1799,10 @@ class Transition implements BLASTSyncEngine.TransactionReadyListener { /** @see RecentsAnimationController#restoreNavigationBarFromApp */ void legacyRestoreNavigationBarFromApp() { - if (!mNavBarAttachedToApp) return; - mNavBarAttachedToApp = false; + if (!mController.mNavigationBarAttachedToApp) { + return; + } + mController.mNavigationBarAttachedToApp = false; if (mRecentsDisplayId == INVALID_DISPLAY) { Slog.e(TAG, "Reparented navigation bar without a valid display"); @@ -1836,6 +1835,11 @@ class Transition implements BLASTSyncEngine.TransactionReadyListener { break; } + final AsyncRotationController asyncRotationController = dc.getAsyncRotationController(); + if (asyncRotationController != null) { + asyncRotationController.accept(navWindow); + } + if (animate) { final NavBarFadeAnimationController controller = new NavBarFadeAnimationController(dc); @@ -1844,6 +1848,9 @@ class Transition implements BLASTSyncEngine.TransactionReadyListener { // Reparent the SurfaceControl of nav bar token back. t.reparent(navToken.getSurfaceControl(), parent.getSurfaceControl()); } + + // To apply transactions. + dc.mWmService.scheduleAnimationLocked(); } private void reportStartReasonsToLogger() { diff --git a/services/core/java/com/android/server/wm/TransitionController.java b/services/core/java/com/android/server/wm/TransitionController.java index 0cb6f14b38f2c..359b353ba336b 100644 --- a/services/core/java/com/android/server/wm/TransitionController.java +++ b/services/core/java/com/android/server/wm/TransitionController.java @@ -206,6 +206,11 @@ class TransitionController { */ boolean mBuildingFinishLayers = false; + /** + * Whether the surface of navigation bar token is reparented to an app. + */ + boolean mNavigationBarAttachedToApp = false; + private boolean mAnimatingState = false; final Handler mLoggerHandler = FgThread.getHandler();