Loading services/core/java/com/android/server/wm/ActivityRecord.java +13 −2 Original line number Diff line number Diff line Loading @@ -3717,8 +3717,14 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A final boolean endTask = task.getTopNonFinishingActivity() == null && !task.isClearingToReuseTask(); final WindowContainer<?> trigger = endTask ? task : this; final Transition newTransition = mTransitionController.requestCloseTransitionIfNeeded(endTask ? task : this); mTransitionController.requestCloseTransitionIfNeeded(trigger); if (newTransition != null) { newTransition.collectClose(trigger); } else if (mTransitionController.isCollecting()) { mTransitionController.getCollectingTransition().collectClose(trigger); } if (isState(RESUMED)) { if (endTask) { mAtmService.getTaskChangeNotificationController().notifyTaskRemovalStarted( Loading Loading @@ -4377,7 +4383,12 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A // closing the task. final WindowContainer trigger = remove && task != null && task.getChildCount() == 1 ? task : this; mTransitionController.requestCloseTransitionIfNeeded(trigger); final Transition newTransit = mTransitionController.requestCloseTransitionIfNeeded(trigger); if (newTransit != null) { newTransit.collectClose(trigger); } else if (mTransitionController.isCollecting()) { mTransitionController.getCollectingTransition().collectClose(trigger); } cleanUp(true /* cleanServices */, true /* setState */); if (remove) { if (mStartingData != null && mVisible && task != null) { Loading services/core/java/com/android/server/wm/ActivityTaskManagerService.java +1 −1 Original line number Diff line number Diff line Loading @@ -3665,7 +3665,7 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { } /** * Prepare to enter PiP mode after {@link TransitionController#requestStartTransition}. * Prepare to enter PiP mode after {@link TransitionController#requestStartDisplayTransition}. * * @param r activity auto entering pip * @return true if the activity is about to auto-enter pip or is already in pip mode. Loading services/core/java/com/android/server/wm/ActivityTaskSupervisor.java +14 −4 Original line number Diff line number Diff line Loading @@ -1598,9 +1598,14 @@ public class ActivityTaskSupervisor implements RecentTasks.Callbacks { } private void removePinnedRootTaskInSurfaceTransaction(Task rootTask) { rootTask.mTransitionController.requestTransitionIfNeeded(TRANSIT_TO_BACK, 0 /* flags */, rootTask, rootTask.mDisplayContent, null /* remoteTransition */, null /* displayChange */); final Transition transition = rootTask.mTransitionController.requestTransitionIfNeeded( TRANSIT_TO_BACK, 0 /* flags */, rootTask, rootTask.mDisplayContent); if (transition == null) { rootTask.mTransitionController.collect(rootTask); } else { transition.collect(rootTask); } /** * Workaround: Force-stop all the activities in the root pinned task before we reparent them * to the fullscreen root task. This is to guarantee that when we are removing a root task, Loading Loading @@ -1683,7 +1688,12 @@ public class ActivityTaskSupervisor implements RecentTasks.Callbacks { // Prevent recursion. return; } task.mTransitionController.requestCloseTransitionIfNeeded(task); final Transition transit = task.mTransitionController.requestCloseTransitionIfNeeded(task); if (transit != null) { transit.collectClose(task); } else if (task.mTransitionController.isCollecting()) { task.mTransitionController.getCollectingTransition().collectClose(task); } // Consume the stopping activities immediately so activity manager won't skip killing // the process because it is still foreground state, i.e. RESUMED -> PAUSING set from // removeActivities -> finishIfPossible. Loading services/core/java/com/android/server/wm/DisplayContent.java +62 −60 Original line number Diff line number Diff line Loading @@ -1625,22 +1625,23 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp if (configChanged) { mWaitingForConfig = true; if (mTransitionController.isShellTransitionsEnabled()) { if (mLastHasContent && mTransitionController.isShellTransitionsEnabled()) { final Rect startBounds = currentDisplayConfig.windowConfiguration.getBounds(); final Rect endBounds = mTmpConfiguration.windowConfiguration.getBounds(); final Transition transition = mTransitionController.getCollectingTransition(); final TransitionRequestInfo.DisplayChange change = transition != null ? null : new TransitionRequestInfo.DisplayChange(mDisplayId); if (change != null) { if (!mTransitionController.isCollecting()) { final TransitionRequestInfo.DisplayChange change = new TransitionRequestInfo.DisplayChange(mDisplayId); change.setStartAbsBounds(startBounds); change.setEndAbsBounds(endBounds); requestChangeTransition(changes, change); } else { final Transition transition = mTransitionController.getCollectingTransition(); transition.setKnownConfigChanges(this, changes); // A collecting transition is existed. The sync method must be set before // collecting this display, so WindowState#prepareSync can use the sync method. mTransitionController.setDisplaySyncMethod(startBounds, endBounds, this); collectDisplayChange(transition); } requestChangeTransitionIfNeeded(changes, change); } else if (mLastHasContent) { mWmService.startFreezingDisplay(0 /* exitAnim */, 0 /* enterAnim */, this); } Loading Loading @@ -3551,32 +3552,35 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp } /** * Requests to start a transition for the display configuration change. The given changes must * be non-zero. This method is no-op if the display has been collected. * Collects this display into an already-collecting transition. */ void requestChangeTransitionIfNeeded(@ActivityInfo.Config int changes, @Nullable TransitionRequestInfo.DisplayChange displayChange) { void collectDisplayChange(@NonNull Transition transition) { if (!mLastHasContent) return; final TransitionController controller = mTransitionController; if (controller.isCollecting()) { if (displayChange != null) { throw new IllegalArgumentException("Provided displayChange for non-new transition"); if (!transition.isCollecting()) { throw new IllegalArgumentException("Can only collect display change if transition" + " is collecting"); } if (!controller.isCollecting(this)) { controller.collect(this); if (!transition.mParticipants.contains(this)) { transition.collect(this); startAsyncRotationIfNeeded(); if (mFixedRotationLaunchingApp != null) { setSeamlessTransitionForFixedRotation(controller.getCollectingTransition()); setSeamlessTransitionForFixedRotation(transition); } } else if (mAsyncRotationController != null && !isRotationChanging()) { Slog.i(TAG, "Finish AsyncRotation for previous intermediate change"); finishAsyncRotationIfPossible(); } return; } final Transition t = controller.requestTransitionIfNeeded(TRANSIT_CHANGE, 0 /* flags */, this, this, null /* remoteTransition */, displayChange); if (t != null) { /** * Requests to start a transition for a display change. {@code changes} must be non-zero. */ void requestChangeTransition(@ActivityInfo.Config int changes, @Nullable TransitionRequestInfo.DisplayChange displayChange) { final TransitionController controller = mTransitionController; final Transition t = controller.requestStartDisplayTransition(TRANSIT_CHANGE, 0 /* flags */, this, null /* remoteTransition */, displayChange); t.collect(this); mAtmService.startPowerMode(POWER_MODE_REASON_CHANGE_DISPLAY); if (mAsyncRotationController != null) { // Give a chance to update the transform if the current rotation is changed when Loading @@ -3603,7 +3607,6 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp } t.setKnownConfigChanges(this, changes); } } private void setSeamlessTransitionForFixedRotation(Transition t) { t.setSeamlessRotation(this); Loading Loading @@ -5722,14 +5725,8 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp */ void requestTransitionAndLegacyPrepare(@WindowManager.TransitionType int transit, @WindowManager.TransitionFlags int flags) { requestTransitionAndLegacyPrepare(transit, flags, null /* trigger */); } /** @see #requestTransitionAndLegacyPrepare(int, int) */ void requestTransitionAndLegacyPrepare(@WindowManager.TransitionType int transit, @WindowManager.TransitionFlags int flags, @Nullable WindowContainer trigger) { prepareAppTransition(transit, flags); mTransitionController.requestTransitionIfNeeded(transit, flags, trigger, this); mTransitionController.requestTransitionIfNeeded(transit, flags, null /* trigger */, this); } void executeAppTransition() { Loading Loading @@ -6372,8 +6369,13 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp if (changes != 0) { Slog.i(TAG, "Override config changes=" + Integer.toHexString(changes) + " " + mTempConfig + " for displayId=" + mDisplayId); if (isReady() && mTransitionController.isShellTransitionsEnabled()) { requestChangeTransitionIfNeeded(changes, null /* displayChange */); if (isReady() && mTransitionController.isShellTransitionsEnabled() && mLastHasContent) { final Transition transition = mTransitionController.getCollectingTransition(); if (transition != null) { collectDisplayChange(transition); } else { requestChangeTransition(changes, null /* displayChange */); } } onRequestedOverrideConfigurationChanged(mTempConfig); Loading services/core/java/com/android/server/wm/DisplayRotation.java +11 −7 Original line number Diff line number Diff line Loading @@ -629,13 +629,17 @@ public class DisplayRotation { if (mDisplayContent.mTransitionController.isShellTransitionsEnabled()) { final boolean wasCollecting = mDisplayContent.mTransitionController.isCollecting(); final TransitionRequestInfo.DisplayChange change = wasCollecting ? null : new TransitionRequestInfo.DisplayChange(mDisplayContent.getDisplayId(), if (!wasCollecting) { if (mDisplayContent.getLastHasContent()) { final TransitionRequestInfo.DisplayChange change = new TransitionRequestInfo.DisplayChange(mDisplayContent.getDisplayId(), oldRotation, mRotation); mDisplayContent.requestChangeTransitionIfNeeded( mDisplayContent.requestChangeTransition( ActivityInfo.CONFIG_WINDOW_CONFIGURATION, change); if (wasCollecting) { } } else { mDisplayContent.collectDisplayChange( mDisplayContent.mTransitionController.getCollectingTransition()); // Use remote-rotation infra since the transition has already been requested // TODO(shell-transitions): Remove this once lifecycle management can cover all // rotation cases. Loading Loading
services/core/java/com/android/server/wm/ActivityRecord.java +13 −2 Original line number Diff line number Diff line Loading @@ -3717,8 +3717,14 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A final boolean endTask = task.getTopNonFinishingActivity() == null && !task.isClearingToReuseTask(); final WindowContainer<?> trigger = endTask ? task : this; final Transition newTransition = mTransitionController.requestCloseTransitionIfNeeded(endTask ? task : this); mTransitionController.requestCloseTransitionIfNeeded(trigger); if (newTransition != null) { newTransition.collectClose(trigger); } else if (mTransitionController.isCollecting()) { mTransitionController.getCollectingTransition().collectClose(trigger); } if (isState(RESUMED)) { if (endTask) { mAtmService.getTaskChangeNotificationController().notifyTaskRemovalStarted( Loading Loading @@ -4377,7 +4383,12 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A // closing the task. final WindowContainer trigger = remove && task != null && task.getChildCount() == 1 ? task : this; mTransitionController.requestCloseTransitionIfNeeded(trigger); final Transition newTransit = mTransitionController.requestCloseTransitionIfNeeded(trigger); if (newTransit != null) { newTransit.collectClose(trigger); } else if (mTransitionController.isCollecting()) { mTransitionController.getCollectingTransition().collectClose(trigger); } cleanUp(true /* cleanServices */, true /* setState */); if (remove) { if (mStartingData != null && mVisible && task != null) { Loading
services/core/java/com/android/server/wm/ActivityTaskManagerService.java +1 −1 Original line number Diff line number Diff line Loading @@ -3665,7 +3665,7 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { } /** * Prepare to enter PiP mode after {@link TransitionController#requestStartTransition}. * Prepare to enter PiP mode after {@link TransitionController#requestStartDisplayTransition}. * * @param r activity auto entering pip * @return true if the activity is about to auto-enter pip or is already in pip mode. Loading
services/core/java/com/android/server/wm/ActivityTaskSupervisor.java +14 −4 Original line number Diff line number Diff line Loading @@ -1598,9 +1598,14 @@ public class ActivityTaskSupervisor implements RecentTasks.Callbacks { } private void removePinnedRootTaskInSurfaceTransaction(Task rootTask) { rootTask.mTransitionController.requestTransitionIfNeeded(TRANSIT_TO_BACK, 0 /* flags */, rootTask, rootTask.mDisplayContent, null /* remoteTransition */, null /* displayChange */); final Transition transition = rootTask.mTransitionController.requestTransitionIfNeeded( TRANSIT_TO_BACK, 0 /* flags */, rootTask, rootTask.mDisplayContent); if (transition == null) { rootTask.mTransitionController.collect(rootTask); } else { transition.collect(rootTask); } /** * Workaround: Force-stop all the activities in the root pinned task before we reparent them * to the fullscreen root task. This is to guarantee that when we are removing a root task, Loading Loading @@ -1683,7 +1688,12 @@ public class ActivityTaskSupervisor implements RecentTasks.Callbacks { // Prevent recursion. return; } task.mTransitionController.requestCloseTransitionIfNeeded(task); final Transition transit = task.mTransitionController.requestCloseTransitionIfNeeded(task); if (transit != null) { transit.collectClose(task); } else if (task.mTransitionController.isCollecting()) { task.mTransitionController.getCollectingTransition().collectClose(task); } // Consume the stopping activities immediately so activity manager won't skip killing // the process because it is still foreground state, i.e. RESUMED -> PAUSING set from // removeActivities -> finishIfPossible. Loading
services/core/java/com/android/server/wm/DisplayContent.java +62 −60 Original line number Diff line number Diff line Loading @@ -1625,22 +1625,23 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp if (configChanged) { mWaitingForConfig = true; if (mTransitionController.isShellTransitionsEnabled()) { if (mLastHasContent && mTransitionController.isShellTransitionsEnabled()) { final Rect startBounds = currentDisplayConfig.windowConfiguration.getBounds(); final Rect endBounds = mTmpConfiguration.windowConfiguration.getBounds(); final Transition transition = mTransitionController.getCollectingTransition(); final TransitionRequestInfo.DisplayChange change = transition != null ? null : new TransitionRequestInfo.DisplayChange(mDisplayId); if (change != null) { if (!mTransitionController.isCollecting()) { final TransitionRequestInfo.DisplayChange change = new TransitionRequestInfo.DisplayChange(mDisplayId); change.setStartAbsBounds(startBounds); change.setEndAbsBounds(endBounds); requestChangeTransition(changes, change); } else { final Transition transition = mTransitionController.getCollectingTransition(); transition.setKnownConfigChanges(this, changes); // A collecting transition is existed. The sync method must be set before // collecting this display, so WindowState#prepareSync can use the sync method. mTransitionController.setDisplaySyncMethod(startBounds, endBounds, this); collectDisplayChange(transition); } requestChangeTransitionIfNeeded(changes, change); } else if (mLastHasContent) { mWmService.startFreezingDisplay(0 /* exitAnim */, 0 /* enterAnim */, this); } Loading Loading @@ -3551,32 +3552,35 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp } /** * Requests to start a transition for the display configuration change. The given changes must * be non-zero. This method is no-op if the display has been collected. * Collects this display into an already-collecting transition. */ void requestChangeTransitionIfNeeded(@ActivityInfo.Config int changes, @Nullable TransitionRequestInfo.DisplayChange displayChange) { void collectDisplayChange(@NonNull Transition transition) { if (!mLastHasContent) return; final TransitionController controller = mTransitionController; if (controller.isCollecting()) { if (displayChange != null) { throw new IllegalArgumentException("Provided displayChange for non-new transition"); if (!transition.isCollecting()) { throw new IllegalArgumentException("Can only collect display change if transition" + " is collecting"); } if (!controller.isCollecting(this)) { controller.collect(this); if (!transition.mParticipants.contains(this)) { transition.collect(this); startAsyncRotationIfNeeded(); if (mFixedRotationLaunchingApp != null) { setSeamlessTransitionForFixedRotation(controller.getCollectingTransition()); setSeamlessTransitionForFixedRotation(transition); } } else if (mAsyncRotationController != null && !isRotationChanging()) { Slog.i(TAG, "Finish AsyncRotation for previous intermediate change"); finishAsyncRotationIfPossible(); } return; } final Transition t = controller.requestTransitionIfNeeded(TRANSIT_CHANGE, 0 /* flags */, this, this, null /* remoteTransition */, displayChange); if (t != null) { /** * Requests to start a transition for a display change. {@code changes} must be non-zero. */ void requestChangeTransition(@ActivityInfo.Config int changes, @Nullable TransitionRequestInfo.DisplayChange displayChange) { final TransitionController controller = mTransitionController; final Transition t = controller.requestStartDisplayTransition(TRANSIT_CHANGE, 0 /* flags */, this, null /* remoteTransition */, displayChange); t.collect(this); mAtmService.startPowerMode(POWER_MODE_REASON_CHANGE_DISPLAY); if (mAsyncRotationController != null) { // Give a chance to update the transform if the current rotation is changed when Loading @@ -3603,7 +3607,6 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp } t.setKnownConfigChanges(this, changes); } } private void setSeamlessTransitionForFixedRotation(Transition t) { t.setSeamlessRotation(this); Loading Loading @@ -5722,14 +5725,8 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp */ void requestTransitionAndLegacyPrepare(@WindowManager.TransitionType int transit, @WindowManager.TransitionFlags int flags) { requestTransitionAndLegacyPrepare(transit, flags, null /* trigger */); } /** @see #requestTransitionAndLegacyPrepare(int, int) */ void requestTransitionAndLegacyPrepare(@WindowManager.TransitionType int transit, @WindowManager.TransitionFlags int flags, @Nullable WindowContainer trigger) { prepareAppTransition(transit, flags); mTransitionController.requestTransitionIfNeeded(transit, flags, trigger, this); mTransitionController.requestTransitionIfNeeded(transit, flags, null /* trigger */, this); } void executeAppTransition() { Loading Loading @@ -6372,8 +6369,13 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp if (changes != 0) { Slog.i(TAG, "Override config changes=" + Integer.toHexString(changes) + " " + mTempConfig + " for displayId=" + mDisplayId); if (isReady() && mTransitionController.isShellTransitionsEnabled()) { requestChangeTransitionIfNeeded(changes, null /* displayChange */); if (isReady() && mTransitionController.isShellTransitionsEnabled() && mLastHasContent) { final Transition transition = mTransitionController.getCollectingTransition(); if (transition != null) { collectDisplayChange(transition); } else { requestChangeTransition(changes, null /* displayChange */); } } onRequestedOverrideConfigurationChanged(mTempConfig); Loading
services/core/java/com/android/server/wm/DisplayRotation.java +11 −7 Original line number Diff line number Diff line Loading @@ -629,13 +629,17 @@ public class DisplayRotation { if (mDisplayContent.mTransitionController.isShellTransitionsEnabled()) { final boolean wasCollecting = mDisplayContent.mTransitionController.isCollecting(); final TransitionRequestInfo.DisplayChange change = wasCollecting ? null : new TransitionRequestInfo.DisplayChange(mDisplayContent.getDisplayId(), if (!wasCollecting) { if (mDisplayContent.getLastHasContent()) { final TransitionRequestInfo.DisplayChange change = new TransitionRequestInfo.DisplayChange(mDisplayContent.getDisplayId(), oldRotation, mRotation); mDisplayContent.requestChangeTransitionIfNeeded( mDisplayContent.requestChangeTransition( ActivityInfo.CONFIG_WINDOW_CONFIGURATION, change); if (wasCollecting) { } } else { mDisplayContent.collectDisplayChange( mDisplayContent.mTransitionController.getCollectingTransition()); // Use remote-rotation infra since the transition has already been requested // TODO(shell-transitions): Remove this once lifecycle management can cover all // rotation cases. Loading