diff options
| -rw-r--r-- | services/core/java/com/android/server/wm/ActivityRecord.java | 40 | ||||
| -rw-r--r-- | services/core/java/com/android/server/wm/StartingData.java | 20 |
2 files changed, 48 insertions, 12 deletions
diff --git a/services/core/java/com/android/server/wm/ActivityRecord.java b/services/core/java/com/android/server/wm/ActivityRecord.java index 2160ce1be729..c6a2e0e51227 100644 --- a/services/core/java/com/android/server/wm/ActivityRecord.java +++ b/services/core/java/com/android/server/wm/ActivityRecord.java @@ -2821,6 +2821,27 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A } } + @Override + void waitForSyncTransactionCommit(ArraySet<WindowContainer> wcAwaitingCommit) { + super.waitForSyncTransactionCommit(wcAwaitingCommit); + if (mStartingData != null) { + mStartingData.mWaitForSyncTransactionCommit = true; + } + } + + @Override + void onSyncTransactionCommitted(SurfaceControl.Transaction t) { + super.onSyncTransactionCommitted(t); + if (mStartingData == null) { + return; + } + mStartingData.mWaitForSyncTransactionCommit = false; + if (mStartingData.mRemoveAfterTransaction) { + mStartingData.mRemoveAfterTransaction = false; + removeStartingWindowAnimation(mStartingData.mPrepareRemoveAnimation); + } + } + void removeStartingWindowAnimation(boolean prepareAnimation) { mTransferringSplashScreenState = TRANSFER_SPLASH_SCREEN_IDLE; if (task != null) { @@ -2843,6 +2864,12 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A final WindowState startingWindow = mStartingWindow; final boolean animate; if (mStartingData != null) { + if (mStartingData.mWaitForSyncTransactionCommit + || mTransitionController.inCollectingTransition(startingWindow)) { + mStartingData.mRemoveAfterTransaction = true; + mStartingData.mPrepareRemoveAnimation = prepareAnimation; + return; + } animate = prepareAnimation && mStartingData.needRevealAnimation() && mStartingWindow.isVisibleByPolicy(); ProtoLog.v(WM_DEBUG_STARTING_WINDOW, "Schedule remove starting %s startingWindow=%s" @@ -2863,18 +2890,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A this); return; } - - if (animate && mTransitionController.inCollectingTransition(startingWindow)) { - // Defer remove starting window after transition start. - // The surface of app window could really show after the transition finish. - startingWindow.mSyncTransaction.addTransactionCommittedListener(Runnable::run, () -> { - synchronized (mAtmService.mGlobalLock) { - surface.remove(true); - } - }); - } else { - surface.remove(animate); - } + surface.remove(animate); } /** diff --git a/services/core/java/com/android/server/wm/StartingData.java b/services/core/java/com/android/server/wm/StartingData.java index 300a894d15c9..cff86add7efc 100644 --- a/services/core/java/com/android/server/wm/StartingData.java +++ b/services/core/java/com/android/server/wm/StartingData.java @@ -41,6 +41,26 @@ public abstract class StartingData { /** Whether the starting window is drawn. */ boolean mIsDisplayed; + /** + * For Shell transition. + * There will be a transition happen on attached activity, do not remove starting window during + * this period, because the transaction to show app window may not apply before remove starting + * window. + * Note this isn't equal to transition playing, the period should be + * Sync finishNow -> Start transaction apply. + */ + boolean mWaitForSyncTransactionCommit; + + /** + * For Shell transition. + * This starting window should be removed after applying the start transaction of transition, + * which ensures the app window has shown. + */ + boolean mRemoveAfterTransaction; + + /** Whether to prepare the removal animation. */ + boolean mPrepareRemoveAnimation; + protected StartingData(WindowManagerService service, int typeParams) { mService = service; mTypeParams = typeParams; |