diff options
author | 2024-09-13 03:40:24 +0000 | |
---|---|---|
committer | 2024-09-13 04:04:19 +0000 | |
commit | e534e81fe1b1047077eb5adf76b33620a65f5f84 (patch) | |
tree | 13e721eecd4a0c1a5912bdd2cf3346c7d4f87af7 | |
parent | fa07bc40e06ec647ec759d9f5108cf90a71b1c94 (diff) |
Avoid remove starting window too early when playing multiple transitions
The app window would choose sync transaction for prepareSurfaceLocked
if there are more than one transacition hasn't handled in shell, so the
app window would only commit visilble after all start transactions
applied. Defer remove starting window until the transaction commit count
to zero.
Flag: EXEMPT bugfix
Bug: 362347290
Test: verify starting window won't stuck from normal launch.
Change-Id: I756e4f9930f8a91023c0e7da10f632da8839d745
-rw-r--r-- | services/core/java/com/android/server/wm/ActivityRecord.java | 12 | ||||
-rw-r--r-- | services/core/java/com/android/server/wm/StartingData.java | 4 |
2 files changed, 9 insertions, 7 deletions
diff --git a/services/core/java/com/android/server/wm/ActivityRecord.java b/services/core/java/com/android/server/wm/ActivityRecord.java index ff6f021f52a7..9da79360c902 100644 --- a/services/core/java/com/android/server/wm/ActivityRecord.java +++ b/services/core/java/com/android/server/wm/ActivityRecord.java @@ -2641,7 +2641,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A return true; } // Only do transfer after transaction has done when starting window exist. - if (mStartingData != null && mStartingData.mWaitForSyncTransactionCommit) { + if (mStartingData != null && mStartingData.mWaitForSyncTransactionCommitCount > 0) { mStartingData.mRemoveAfterTransaction = AFTER_TRANSACTION_COPY_TO_CLIENT; return true; } @@ -2804,9 +2804,11 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A @Override void waitForSyncTransactionCommit(ArraySet<WindowContainer> wcAwaitingCommit) { + // Only add once per transition. + final boolean added = wcAwaitingCommit.contains(this); super.waitForSyncTransactionCommit(wcAwaitingCommit); - if (mStartingData != null) { - mStartingData.mWaitForSyncTransactionCommit = true; + if (!added && mStartingData != null) { + mStartingData.mWaitForSyncTransactionCommitCount++; } } @@ -2817,7 +2819,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A return; } final StartingData lastData = mStartingData; - lastData.mWaitForSyncTransactionCommit = false; + lastData.mWaitForSyncTransactionCommitCount--; if (lastData.mRemoveAfterTransaction == AFTER_TRANSACTION_REMOVE_DIRECTLY) { removeStartingWindowAnimation(lastData.mPrepareRemoveAnimation); } else if (lastData.mRemoveAfterTransaction == AFTER_TRANSACTION_COPY_TO_CLIENT) { @@ -2847,7 +2849,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A final boolean animate; final boolean hasImeSurface; if (mStartingData != null) { - if (mStartingData.mWaitForSyncTransactionCommit + if (mStartingData.mWaitForSyncTransactionCommitCount > 0 || mSyncState != SYNC_STATE_NONE) { mStartingData.mRemoveAfterTransaction = AFTER_TRANSACTION_REMOVE_DIRECTLY; mStartingData.mPrepareRemoveAnimation = prepareAnimation; diff --git a/services/core/java/com/android/server/wm/StartingData.java b/services/core/java/com/android/server/wm/StartingData.java index 24fb20731c43..22c7e8c98808 100644 --- a/services/core/java/com/android/server/wm/StartingData.java +++ b/services/core/java/com/android/server/wm/StartingData.java @@ -69,7 +69,7 @@ public abstract class StartingData { * Note this isn't equal to transition playing, the period should be * Sync finishNow -> Start transaction apply. */ - boolean mWaitForSyncTransactionCommit; + int mWaitForSyncTransactionCommitCount; /** * For Shell transition. @@ -112,7 +112,7 @@ public abstract class StartingData { public String toString() { return getClass().getSimpleName() + "{" + Integer.toHexString(System.identityHashCode(this)) - + " waitForSyncTransactionCommit=" + mWaitForSyncTransactionCommit + + " mWaitForSyncTransactionCommitCount=" + mWaitForSyncTransactionCommitCount + " removeAfterTransaction= " + mRemoveAfterTransaction + "}"; } |