diff options
| author | 2017-07-07 23:17:26 +0000 | |
|---|---|---|
| committer | 2017-07-07 23:17:26 +0000 | |
| commit | 654f917c174fbc70fb5a444da49d7ada5076978f (patch) | |
| tree | fd2758bc798e92c9c729ddd628b0a50ea834f5b8 | |
| parent | 6a4ab438b9ded85f132be6c2543de70231000c71 (diff) | |
| parent | d4b83f96f84fc97689b27c8b96486ad74086d4d4 (diff) | |
Merge "Don't remove starting window for visible app." into oc-dr1-dev
am: d4b83f96f8
Change-Id: I0be58fbdffafd87919fe259914af3855e3768b0f
3 files changed, 26 insertions, 5 deletions
diff --git a/services/core/java/com/android/server/am/ActivityRecord.java b/services/core/java/com/android/server/am/ActivityRecord.java index 68f4d0d99f93..6a8f6d35c7c0 100644 --- a/services/core/java/com/android/server/am/ActivityRecord.java +++ b/services/core/java/com/android/server/am/ActivityRecord.java @@ -2184,7 +2184,7 @@ final class ActivityRecord extends ConfigurationContainer implements AppWindowCo if (mStartingWindowState == STARTING_WINDOW_SHOWN && behindFullscreenActivity) { if (DEBUG_VISIBILITY) Slog.w(TAG_VISIBILITY, "Found orphaned starting window " + this); mStartingWindowState = STARTING_WINDOW_REMOVED; - mWindowContainerController.removeStartingWindow(); + mWindowContainerController.removeHiddenStartingWindow(); } } diff --git a/services/core/java/com/android/server/wm/AppWindowContainerController.java b/services/core/java/com/android/server/wm/AppWindowContainerController.java index cea8ee108201..86e130d723d8 100644 --- a/services/core/java/com/android/server/wm/AppWindowContainerController.java +++ b/services/core/java/com/android/server/wm/AppWindowContainerController.java @@ -647,7 +647,23 @@ public class AppWindowContainerController return mContainer.getTask().getConfiguration().orientation == snapshot.getOrientation(); } - public void removeStartingWindow() { + /** + * Remove starting window if the app is currently hidden. It is possible the starting window is + * part of its app exit transition animation in which case we delay hiding the app token. The + * method allows for removal when window manager has set the app token to hidden. + */ + public void removeHiddenStartingWindow() { + synchronized (mWindowMap) { + if (!mContainer.hidden) { + if (DEBUG_STARTING_WINDOW) Slog.v(TAG_WM, "Starting window app still visible." + + " Ignoring remove request."); + return; + } + removeStartingWindow(); + } + } + + void removeStartingWindow() { synchronized (mWindowMap) { if (mHandler.hasCallbacks(mRemoveStartingWindow)) { // Already scheduled. diff --git a/services/core/java/com/android/server/wm/AppWindowToken.java b/services/core/java/com/android/server/wm/AppWindowToken.java index ce44dab8fc09..839ee0ec7efd 100644 --- a/services/core/java/com/android/server/wm/AppWindowToken.java +++ b/services/core/java/com/android/server/wm/AppWindowToken.java @@ -441,6 +441,7 @@ class AppWindowToken extends WindowToken implements WindowManagerService.AppFree mChildren.get(i).mWinAnimator.hide("immediately hidden"); } SurfaceControl.closeTransaction(); + removeStartingWindow(); } if (!mService.mClosingApps.contains(this) && !mService.mOpeningApps.contains(this)) { @@ -518,6 +519,12 @@ class AppWindowToken extends WindowToken implements WindowManagerService.AppFree return super.checkCompleteDeferredRemoval(); } + private void removeStartingWindow() { + if (startingData != null && getController() != null) { + getController().removeStartingWindow(); + } + } + void onRemovedFromDisplay() { if (mRemovingFromDisplay) { return; @@ -545,9 +552,7 @@ class AppWindowToken extends WindowToken implements WindowManagerService.AppFree if (DEBUG_ADD_REMOVE || DEBUG_TOKEN_MOVEMENT) Slog.v(TAG_WM, "removeAppToken: " + this + " delayed=" + delayed + " Callers=" + Debug.getCallers(4)); - if (startingData != null && getController() != null) { - getController().removeStartingWindow(); - } + removeStartingWindow(); // If this window was animating, then we need to ensure that the app transition notifies // that animations have completed in WMS.handleAnimatingStoppedAndTransitionLocked(), so |