diff --git a/services/core/java/com/android/server/wm/ActivityRecord.java b/services/core/java/com/android/server/wm/ActivityRecord.java index e93f358029533..2b6193ddc43de 100644 --- a/services/core/java/com/android/server/wm/ActivityRecord.java +++ b/services/core/java/com/android/server/wm/ActivityRecord.java @@ -2676,7 +2676,9 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A private boolean transferSplashScreenIfNeeded() { if (finishing || !mHandleExitSplashScreen || mStartingSurface == null || mStartingWindow == null - || mTransferringSplashScreenState == TRANSFER_SPLASH_SCREEN_FINISH) { + || mTransferringSplashScreenState == TRANSFER_SPLASH_SCREEN_FINISH + // skip copy splash screen to client if it was resized + || (mStartingData != null && mStartingData.mResizedFromTransfer)) { return false; } if (isTransferringSplashScreen()) { diff --git a/services/core/java/com/android/server/wm/StartingData.java b/services/core/java/com/android/server/wm/StartingData.java index cff86add7efce..2b22d75693fe7 100644 --- a/services/core/java/com/android/server/wm/StartingData.java +++ b/services/core/java/com/android/server/wm/StartingData.java @@ -38,6 +38,10 @@ public abstract class StartingData { */ Task mAssociatedTask; + + /** Whether the starting window is resized from transfer across activities. */ + boolean mResizedFromTransfer; + /** Whether the starting window is drawn. */ boolean mIsDisplayed; diff --git a/services/core/java/com/android/server/wm/WindowState.java b/services/core/java/com/android/server/wm/WindowState.java index 0d4c2d631b2ce..dadb198d5a611 100644 --- a/services/core/java/com/android/server/wm/WindowState.java +++ b/services/core/java/com/android/server/wm/WindowState.java @@ -1935,7 +1935,9 @@ class WindowState extends WindowContainer implements WindowManagerP } final ActivityRecord atoken = mActivityRecord; if (atoken != null) { - return ((!isParentWindowHidden() && atoken.isVisible()) + final boolean isVisible = isStartingWindowAssociatedToTask() + ? mStartingData.mAssociatedTask.isVisible() : atoken.isVisible(); + return ((!isParentWindowHidden() && isVisible) || isAnimationRunningSelfOrParent()); } final WallpaperWindowToken wtoken = mToken.asWallpaperToken(); @@ -2330,6 +2332,13 @@ class WindowState extends WindowContainer implements WindowManagerP // IME surface association. (e.g. Attach IME surface on the display instead of the // app when the app bounds being letterboxed.) mDisplayContent.updateImeControlTarget(isImeLayeringTarget() /* updateImeParent */); + // Fix the starting window to task when Activity has changed. + if (mStartingData != null && mStartingData.mAssociatedTask == null + && !mTempConfiguration.windowConfiguration.getBounds().equals(getBounds())) { + mStartingData.mResizedFromTransfer = true; + // Lock the starting window to task, so it won't resize from transfer anymore. + mActivityRecord.associateStartingWindowWithTaskIfNeeded(); + } } } @@ -3902,7 +3911,7 @@ class WindowState extends WindowContainer implements WindowManagerP * LetterboxUiController#shouldShowLetterboxUi} for more context. */ boolean areAppWindowBoundsLetterboxed() { - return mActivityRecord != null + return mActivityRecord != null && !isStartingWindowAssociatedToTask() && (mActivityRecord.areBoundsLetterboxed() || isLetterboxedForDisplayCutout()); }