diff options
| -rw-r--r-- | services/core/java/com/android/server/wm/KeyguardController.java | 4 | ||||
| -rw-r--r-- | services/core/java/com/android/server/wm/RootWindowContainer.java | 40 |
2 files changed, 31 insertions, 13 deletions
diff --git a/services/core/java/com/android/server/wm/KeyguardController.java b/services/core/java/com/android/server/wm/KeyguardController.java index 3208ae3aa97d..672ebf10dcf0 100644 --- a/services/core/java/com/android/server/wm/KeyguardController.java +++ b/services/core/java/com/android/server/wm/KeyguardController.java @@ -66,6 +66,8 @@ class KeyguardController { private static final String TAG = TAG_WITH_CLASS_NAME ? "KeyguardController" : TAG_ATM; + static final String KEYGUARD_SLEEP_TOKEN_TAG = "keyguard"; + private final ActivityTaskSupervisor mTaskSupervisor; private WindowManagerService mWindowManager; private boolean mKeyguardShowing; @@ -82,7 +84,7 @@ class KeyguardController { ActivityTaskSupervisor taskSupervisor) { mService = service; mTaskSupervisor = taskSupervisor; - mSleepTokenAcquirer = mService.new SleepTokenAcquirerImpl("keyguard"); + mSleepTokenAcquirer = mService.new SleepTokenAcquirerImpl(KEYGUARD_SLEEP_TOKEN_TAG); } void setWindowManager(WindowManagerService windowManager) { diff --git a/services/core/java/com/android/server/wm/RootWindowContainer.java b/services/core/java/com/android/server/wm/RootWindowContainer.java index 32147215834f..b6e0d8de31f4 100644 --- a/services/core/java/com/android/server/wm/RootWindowContainer.java +++ b/services/core/java/com/android/server/wm/RootWindowContainer.java @@ -66,6 +66,7 @@ import static com.android.server.wm.ActivityTaskSupervisor.ON_TOP; import static com.android.server.wm.ActivityTaskSupervisor.PRESERVE_WINDOWS; import static com.android.server.wm.ActivityTaskSupervisor.dumpHistoryList; import static com.android.server.wm.ActivityTaskSupervisor.printThisActivity; +import static com.android.server.wm.KeyguardController.KEYGUARD_SLEEP_TOKEN_TAG; import static com.android.server.wm.RootWindowContainerProto.IS_HOME_RECENTS_COMPONENT; import static com.android.server.wm.RootWindowContainerProto.KEYGUARD_CONTROLLER; import static com.android.server.wm.RootWindowContainerProto.WINDOW_CONTAINER; @@ -2048,7 +2049,7 @@ class RootWindowContainer extends WindowContainer<DisplayContent> /** * Move root task with all its existing content to specified task display area. * - * @param rootTaskId Id of root task to move. + * @param rootTaskId Id of root task to move. * @param taskDisplayArea The task display area to move root task to. * @param onTop Indicates whether container should be place on top or on bottom. */ @@ -2086,9 +2087,9 @@ class RootWindowContainer extends WindowContainer<DisplayContent> /** * Move root task with all its existing content to specified display. * - * @param rootTaskId Id of root task to move. - * @param displayId Id of display to move root task to. - * @param onTop Indicates whether container should be place on top or on bottom. + * @param rootTaskId Id of root task to move. + * @param displayId Id of display to move root task to. + * @param onTop Indicates whether container should be place on top or on bottom. */ void moveRootTaskToDisplay(int rootTaskId, int displayId, boolean onTop) { final DisplayContent displayContent = getDisplayContentOrCreate(displayId); @@ -2171,7 +2172,7 @@ class RootWindowContainer extends WindowContainer<DisplayContent> final ActivityRecord oldTopActivity = task.getTopMostActivity(); if (oldTopActivity != null && oldTopActivity.isState(STOPPED) && task.getDisplayContent().mAppTransition.containsTransitRequest( - TRANSIT_TO_BACK)) { + TRANSIT_TO_BACK)) { task.getDisplayContent().mClosingApps.add(oldTopActivity); oldTopActivity.mRequestForceTransition = true; } @@ -2664,13 +2665,28 @@ class RootWindowContainer extends WindowContainer<DisplayContent> } mSleepTokens.remove(token.mHashKey); final DisplayContent display = getDisplayContent(token.mDisplayId); - if (display != null) { - display.mAllSleepTokens.remove(token); - if (display.mAllSleepTokens.isEmpty()) { - mService.updateSleepIfNeededLocked(); - if (token.mTag.equals(DISPLAY_OFF_SLEEP_TOKEN_TAG)) { - display.mSkipAppTransitionAnimation = true; - } + if (display == null) { + Slog.d(TAG, "Remove sleep token for non-existing display: " + token + " from " + + Debug.getCallers(6)); + return; + } + + display.mAllSleepTokens.remove(token); + if (display.mAllSleepTokens.isEmpty()) { + mService.updateSleepIfNeededLocked(); + // Assuming no lock screen is set and a user launches an activity, turns off the screen + // and turn on the screen again, then the launched activity should be displayed on the + // screen without app transition animation. When the screen turns on, both keyguard + // sleep token and display off sleep token are removed, but the order is + // non-deterministic. + // Note: Display#mSkipAppTransitionAnimation will be ignored when keyguard related + // transition exists, so this affects only when no lock screen is set. Otherwise + // keyguard going away animation will be played. + // See also AppTransitionController#getTransitCompatType for more details. + if ((!mTaskSupervisor.getKeyguardController().isDisplayOccluded(display.mDisplayId) + && token.mTag.equals(KEYGUARD_SLEEP_TOKEN_TAG)) + || token.mTag.equals(DISPLAY_OFF_SLEEP_TOKEN_TAG)) { + display.mSkipAppTransitionAnimation = true; } } } |