From 6c459219b0bcd6181a45a4bb3ae140264fc9e146 Mon Sep 17 00:00:00 2001 From: Wale Ogunwale Date: Wed, 17 May 2017 08:56:03 -0700 Subject: [PATCH] Reset hidden state of AppToken that was cleared due to starting window If a starting window is tranferred to a token from another token that is visible, we also make the receiving token visible, however we don't reset the start when the starting window is tranferred out again when no other windows were added to the token. We now do. Fixes: 38317227 Test: Launch Audible app music player and verify the LibraryActivity token isn't in the visible state. Change-Id: I0186c79aa24d64362f742229d60c75eb0c1a3f97 --- .../com/android/server/wm/AppWindowToken.java | 26 ++++++++++++++----- 1 file changed, 19 insertions(+), 7 deletions(-) diff --git a/services/core/java/com/android/server/wm/AppWindowToken.java b/services/core/java/com/android/server/wm/AppWindowToken.java index 57b0fe2c04d95..52eb2fb01d791 100644 --- a/services/core/java/com/android/server/wm/AppWindowToken.java +++ b/services/core/java/com/android/server/wm/AppWindowToken.java @@ -53,7 +53,6 @@ import android.app.Activity; import android.content.res.Configuration; import android.graphics.Rect; import android.os.Binder; -import android.os.Build; import android.os.Debug; import android.os.IBinder; import android.os.SystemClock; @@ -155,6 +154,9 @@ class AppWindowToken extends WindowToken implements WindowManagerService.AppFree StartingSurface startingSurface; boolean startingDisplayed; boolean startingMoved; + // True if the hidden state of this token was forced to false due to a transferred starting + // window. + private boolean mHiddenSetFromTransferredStartingWindow; boolean firstWindowDrawn; private final WindowState.UpdateReportedVisibilityResults mReportedVisibilityResults = new WindowState.UpdateReportedVisibilityResults(); @@ -185,7 +187,7 @@ class AppWindowToken extends WindowToken implements WindowManagerService.AppFree ArrayDeque mFrozenBounds = new ArrayDeque<>(); ArrayDeque mFrozenMergedConfig = new ArrayDeque<>(); - private boolean mDisbalePreviewScreenshots; + private boolean mDisablePreviewScreenshots; Task mLastParent; @@ -790,11 +792,17 @@ class AppWindowToken extends WindowToken implements WindowManagerService.AppFree if (getController() != null) { getController().removeStartingWindow(); } - } else if (mChildren.size() == 0 && startingData != null) { + } else if (mChildren.size() == 0) { // If this is the last window and we had requested a starting transition window, // well there is no point now. if (DEBUG_STARTING_WINDOW) Slog.v(TAG_WM, "Nulling last startingData"); startingData = null; + if (mHiddenSetFromTransferredStartingWindow) { + // We set the hidden state to false for the token from a transferred starting window. + // We now reset it back to true since the starting window was the last window in the + // token. + hidden = true; + } } else if (mChildren.size() == 1 && startingSurface != null && !isRelaunching()) { // If this is the last window except for a starting transition window, // we need to get rid of the starting transition. @@ -1171,6 +1179,7 @@ class AppWindowToken extends WindowToken implements WindowManagerService.AppFree "Removing starting " + tStartingWindow + " from " + fromToken); fromToken.removeChild(tStartingWindow); fromToken.postWindowRemoveStartingWindowCleanup(tStartingWindow); + fromToken.mHiddenSetFromTransferredStartingWindow = false; addWindow(tStartingWindow); // Propagate other interesting state between the tokens. If the old token is displayed, @@ -1186,6 +1195,7 @@ class AppWindowToken extends WindowToken implements WindowManagerService.AppFree if (!fromToken.hidden) { hidden = false; hiddenRequested = false; + mHiddenSetFromTransferredStartingWindow = true; } setClientHidden(fromToken.mClientHidden); fromToken.mAppAnimator.transferCurrentAnimation( @@ -1544,7 +1554,7 @@ class AppWindowToken extends WindowToken implements WindowManagerService.AppFree * See {@link Activity#setDisablePreviewScreenshots}. */ void setDisablePreviewScreenshots(boolean disable) { - mDisbalePreviewScreenshots = disable; + mDisablePreviewScreenshots = disable; } /** @@ -1556,7 +1566,7 @@ class AppWindowToken extends WindowToken implements WindowManagerService.AppFree * screenshot. */ boolean shouldUseAppThemeSnapshot() { - return mDisbalePreviewScreenshots || forAllWindows(w -> (w.mAttrs.flags & FLAG_SECURE) != 0, + return mDisablePreviewScreenshots || forAllWindows(w -> (w.mAttrs.flags & FLAG_SECURE) != 0, true /* topToBottom */); } @@ -1604,11 +1614,13 @@ class AppWindowToken extends WindowToken implements WindowManagerService.AppFree pw.print(" mIsExiting="); pw.println(mIsExiting); } if (startingWindow != null || startingSurface != null - || startingDisplayed || startingMoved) { + || startingDisplayed || startingMoved || mHiddenSetFromTransferredStartingWindow) { pw.print(prefix); pw.print("startingWindow="); pw.print(startingWindow); pw.print(" startingSurface="); pw.print(startingSurface); pw.print(" startingDisplayed="); pw.print(startingDisplayed); - pw.print(" startingMoved="); pw.println(startingMoved); + pw.print(" startingMoved="); pw.print(startingMoved); + pw.println(" mHiddenSetFromTransferredStartingWindow=" + + mHiddenSetFromTransferredStartingWindow); } if (!mFrozenBounds.isEmpty()) { pw.print(prefix); pw.print("mFrozenBounds="); pw.println(mFrozenBounds);