Loading core/java/android/view/WindowManager.java +9 −0 Original line number Diff line number Diff line Loading @@ -635,6 +635,14 @@ public interface WindowManager extends ViewManager { */ int TRANSIT_FLAG_AVOID_MOVE_TO_FRONT = (1 << 16); // 0x10000 /** * Transition flag: Indicates that the transition involves a display level change * (i.e, disconnect). * @hide */ int TRANSIT_FLAG_DISPLAY_LEVEL_TRANSITION = (1 << 17); // 0x20000 /** * @hide */ Loading @@ -656,6 +664,7 @@ public interface WindowManager extends ViewManager { TRANSIT_FLAG_PHYSICAL_DISPLAY_SWITCH, TRANSIT_FLAG_AOD_APPEARING, TRANSIT_FLAG_AVOID_MOVE_TO_FRONT, TRANSIT_FLAG_DISPLAY_LEVEL_TRANSITION }) @Retention(RetentionPolicy.SOURCE) @interface TransitionFlags {} Loading services/core/java/com/android/server/wm/RootWindowContainer.java +21 −5 Original line number Diff line number Diff line Loading @@ -32,6 +32,7 @@ import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_SUSTAINED_PER import static android.view.WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG; import static android.view.WindowManager.LayoutParams.TYPE_NOTIFICATION_SHADE; import static android.view.WindowManager.TRANSIT_CLOSE; import static android.view.WindowManager.TRANSIT_FLAG_DISPLAY_LEVEL_TRANSITION; import static android.view.WindowManager.TRANSIT_FLAG_KEYGUARD_OCCLUDING; import static android.view.WindowManager.TRANSIT_NONE; import static android.view.WindowManager.TRANSIT_PIP; Loading Loading @@ -2806,10 +2807,11 @@ class RootWindowContainer extends WindowContainer<DisplayContent> return; } if (DesktopExperienceFlags.ENABLE_DISPLAY_DISCONNECT_INTERACTION.isTrue()) { final Transition transition = new Transition(TRANSIT_CLOSE, 0 /* flags */, mTransitionController, mWmService.mSyncEngine); final Transition transition = new Transition(TRANSIT_CLOSE, TRANSIT_FLAG_DISPLAY_LEVEL_TRANSITION, mTransitionController, mWmService.mSyncEngine); mTransitionController.startCollectOrQueue(transition, (deferred) -> { transition.collect(displayContent); transition.collectExistenceChange(displayContent); transition.setAllReady(); TransitionRequestInfo.DisplayChange displayChange = new TransitionRequestInfo.DisplayChange(displayId); Loading @@ -2819,12 +2821,26 @@ class RootWindowContainer extends WindowContainer<DisplayContent> mTransitionController.requestStartTransition(transition, null /* startTask */, null /* remoteTransition */, displayChange); mTransitionController.mStateValidators.add(() -> { // Ensure the display content is removed even if the transition does not // successfully finish. removeDisplayContent(displayContent); }); }); } else { displayContent.remove(); mWmService.mPossibleDisplayInfoMapper.removePossibleDisplayInfos(displayId); removeDisplayContent(displayContent); } } } private void removeDisplayContent(DisplayContent displayContent) { if (displayContent.isRemoving() || displayContent.isRemoved()) { Slog.e(TAG, "DisplayContent already removed or removing."); return; } displayContent.remove(); mWmService.mPossibleDisplayInfoMapper .removePossibleDisplayInfos(displayContent.mDisplayId); } @Override Loading services/core/java/com/android/server/wm/TransitionController.java +5 −3 Original line number Diff line number Diff line Loading @@ -19,6 +19,7 @@ package com.android.server.wm; import static android.view.WindowManager.KEYGUARD_VISIBILITY_TRANSIT_FLAGS; import static android.view.WindowManager.TRANSIT_CHANGE; import static android.view.WindowManager.TRANSIT_CLOSE; import static android.view.WindowManager.TRANSIT_FLAG_DISPLAY_LEVEL_TRANSITION; import static android.view.WindowManager.TRANSIT_NONE; import static com.android.server.wm.ActivityTaskManagerService.POWER_MODE_REASON_CHANGE_DISPLAY; Loading Loading @@ -1513,9 +1514,10 @@ class TransitionController { private void queueTransition(Transition transit, OnStartCollect onStartCollect) { final QueuedTransition queuedTransition = new QueuedTransition(transit, onStartCollect); // If we queue a transition while a collecting transition is still not formally started, // then check if collecting transition is changing a display if (mCollectingTransition != null && !mCollectingTransition.hasStarted()) { // If we queue a non-display transition while a collecting transition is still not // formally started, then check if collecting transition is changing a display if ((transit.getFlags() & TRANSIT_FLAG_DISPLAY_LEVEL_TRANSITION) == 0 && mCollectingTransition != null && !mCollectingTransition.hasStarted()) { for (int i = 0; i < mCollectingTransition.mParticipants.size(); i++) { if (mCollectingTransition.mParticipants.valueAt(i).asDisplayContent() != null) { queuedTransition.mShouldNoopUponDequeue = true; Loading Loading
core/java/android/view/WindowManager.java +9 −0 Original line number Diff line number Diff line Loading @@ -635,6 +635,14 @@ public interface WindowManager extends ViewManager { */ int TRANSIT_FLAG_AVOID_MOVE_TO_FRONT = (1 << 16); // 0x10000 /** * Transition flag: Indicates that the transition involves a display level change * (i.e, disconnect). * @hide */ int TRANSIT_FLAG_DISPLAY_LEVEL_TRANSITION = (1 << 17); // 0x20000 /** * @hide */ Loading @@ -656,6 +664,7 @@ public interface WindowManager extends ViewManager { TRANSIT_FLAG_PHYSICAL_DISPLAY_SWITCH, TRANSIT_FLAG_AOD_APPEARING, TRANSIT_FLAG_AVOID_MOVE_TO_FRONT, TRANSIT_FLAG_DISPLAY_LEVEL_TRANSITION }) @Retention(RetentionPolicy.SOURCE) @interface TransitionFlags {} Loading
services/core/java/com/android/server/wm/RootWindowContainer.java +21 −5 Original line number Diff line number Diff line Loading @@ -32,6 +32,7 @@ import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_SUSTAINED_PER import static android.view.WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG; import static android.view.WindowManager.LayoutParams.TYPE_NOTIFICATION_SHADE; import static android.view.WindowManager.TRANSIT_CLOSE; import static android.view.WindowManager.TRANSIT_FLAG_DISPLAY_LEVEL_TRANSITION; import static android.view.WindowManager.TRANSIT_FLAG_KEYGUARD_OCCLUDING; import static android.view.WindowManager.TRANSIT_NONE; import static android.view.WindowManager.TRANSIT_PIP; Loading Loading @@ -2806,10 +2807,11 @@ class RootWindowContainer extends WindowContainer<DisplayContent> return; } if (DesktopExperienceFlags.ENABLE_DISPLAY_DISCONNECT_INTERACTION.isTrue()) { final Transition transition = new Transition(TRANSIT_CLOSE, 0 /* flags */, mTransitionController, mWmService.mSyncEngine); final Transition transition = new Transition(TRANSIT_CLOSE, TRANSIT_FLAG_DISPLAY_LEVEL_TRANSITION, mTransitionController, mWmService.mSyncEngine); mTransitionController.startCollectOrQueue(transition, (deferred) -> { transition.collect(displayContent); transition.collectExistenceChange(displayContent); transition.setAllReady(); TransitionRequestInfo.DisplayChange displayChange = new TransitionRequestInfo.DisplayChange(displayId); Loading @@ -2819,12 +2821,26 @@ class RootWindowContainer extends WindowContainer<DisplayContent> mTransitionController.requestStartTransition(transition, null /* startTask */, null /* remoteTransition */, displayChange); mTransitionController.mStateValidators.add(() -> { // Ensure the display content is removed even if the transition does not // successfully finish. removeDisplayContent(displayContent); }); }); } else { displayContent.remove(); mWmService.mPossibleDisplayInfoMapper.removePossibleDisplayInfos(displayId); removeDisplayContent(displayContent); } } } private void removeDisplayContent(DisplayContent displayContent) { if (displayContent.isRemoving() || displayContent.isRemoved()) { Slog.e(TAG, "DisplayContent already removed or removing."); return; } displayContent.remove(); mWmService.mPossibleDisplayInfoMapper .removePossibleDisplayInfos(displayContent.mDisplayId); } @Override Loading
services/core/java/com/android/server/wm/TransitionController.java +5 −3 Original line number Diff line number Diff line Loading @@ -19,6 +19,7 @@ package com.android.server.wm; import static android.view.WindowManager.KEYGUARD_VISIBILITY_TRANSIT_FLAGS; import static android.view.WindowManager.TRANSIT_CHANGE; import static android.view.WindowManager.TRANSIT_CLOSE; import static android.view.WindowManager.TRANSIT_FLAG_DISPLAY_LEVEL_TRANSITION; import static android.view.WindowManager.TRANSIT_NONE; import static com.android.server.wm.ActivityTaskManagerService.POWER_MODE_REASON_CHANGE_DISPLAY; Loading Loading @@ -1513,9 +1514,10 @@ class TransitionController { private void queueTransition(Transition transit, OnStartCollect onStartCollect) { final QueuedTransition queuedTransition = new QueuedTransition(transit, onStartCollect); // If we queue a transition while a collecting transition is still not formally started, // then check if collecting transition is changing a display if (mCollectingTransition != null && !mCollectingTransition.hasStarted()) { // If we queue a non-display transition while a collecting transition is still not // formally started, then check if collecting transition is changing a display if ((transit.getFlags() & TRANSIT_FLAG_DISPLAY_LEVEL_TRANSITION) == 0 && mCollectingTransition != null && !mCollectingTransition.hasStarted()) { for (int i = 0; i < mCollectingTransition.mParticipants.size(); i++) { if (mCollectingTransition.mParticipants.valueAt(i).asDisplayContent() != null) { queuedTransition.mShouldNoopUponDequeue = true; Loading