Collect tasks when windowing mode of parent display changes

When the windowing mode of a display is updated, the tasks in it
can change, but it's not collected now.

Bug: 225295924
Test: manual
Change-Id: Ief58575e99f51afe6ecfe79dd270d67863cfa0ea
This commit is contained in:
Kazuki Takise
2022-07-12 18:17:07 +09:00
parent 9fcf0aac75
commit 88f0f08bbf
4 changed files with 23 additions and 11 deletions

View File

@@ -549,7 +549,7 @@ public class DisplayRotation {
// Go through all tasks and collect them before the rotation
// TODO(shell-transitions): move collect() to onConfigurationChange once wallpaper
// handling is synchronized.
mDisplayContent.mTransitionController.collectForDisplayChange(mDisplayContent,
mDisplayContent.mTransitionController.collectForDisplayAreaChange(mDisplayContent,
null /* use collecting transition */);
}
mService.mAtmService.deferWindowLayout();

View File

@@ -101,7 +101,7 @@ public class PhysicalDisplaySwitchTransitionLauncher {
if (t != null) {
mDisplayContent.mAtmService.startLaunchPowerMode(POWER_MODE_REASON_CHANGE_DISPLAY);
mTransitionController.collectForDisplayChange(mDisplayContent, t);
mTransitionController.collectForDisplayAreaChange(mDisplayContent, t);
mTransition = t;
}
}

View File

@@ -460,23 +460,26 @@ class TransitionController {
* Collects the window containers which need to be synced with the changing display (e.g.
* rotating) to the given transition or the current collecting transition.
*/
void collectForDisplayChange(@NonNull DisplayContent dc, @Nullable Transition incoming) {
void collectForDisplayAreaChange(@NonNull DisplayArea<?> wc, @Nullable Transition incoming) {
if (incoming == null) incoming = mCollectingTransition;
if (incoming == null) return;
final Transition transition = incoming;
// Collect all visible tasks.
dc.forAllLeafTasks(task -> {
wc.forAllLeafTasks(task -> {
if (task.isVisible()) {
transition.collect(task);
}
}, true /* traverseTopToBottom */);
// Collect all visible non-app windows which need to be drawn before the animation starts.
dc.forAllWindows(w -> {
if (w.mActivityRecord == null && w.isVisible() && !isCollecting(w.mToken)
&& dc.shouldSyncRotationChange(w)) {
transition.collect(w.mToken);
}
}, true /* traverseTopToBottom */);
final DisplayContent dc = wc.asDisplayContent();
if (dc != null) {
wc.forAllWindows(w -> {
if (w.mActivityRecord == null && w.isVisible() && !isCollecting(w.mToken)
&& dc.shouldSyncRotationChange(w)) {
transition.collect(w.mToken);
}
}, true /* traverseTopToBottom */);
}
}
/** @see Transition#mStatusBarTransitionDelay */

View File

@@ -397,7 +397,7 @@ class WindowOrganizerController extends IWindowOrganizerController.Stub
// Go through all tasks and collect them before the rotation
// TODO(shell-transitions): move collect() to onConfigurationChange once
// wallpaper handling is synchronized.
dc.mTransitionController.collectForDisplayChange(dc, transition);
dc.mTransitionController.collectForDisplayAreaChange(dc, transition);
dc.sendNewConfiguration();
effects |= TRANSACT_EFFECTS_LIFECYCLE;
}
@@ -421,6 +421,15 @@ class WindowOrganizerController extends IWindowOrganizerController.Stub
addToSyncSet(syncId, wc);
}
if (transition != null) transition.collect(wc);
final DisplayArea da = wc.asDisplayArea();
// Only check DisplayArea here as a similar thing is done for DisplayContent above.
if (da != null && wc.asDisplayContent() == null
&& entry.getValue().getWindowingMode() != da.getWindowingMode()) {
// Go through all tasks and collect them before changing the windowing mode of a
// display-level container.
// TODO(shell-transitions): handle this more elegantly.
da.mTransitionController.collectForDisplayAreaChange(da, transition);
}
if ((entry.getValue().getChangeMask()
& WindowContainerTransaction.Change.CHANGE_FORCE_NO_PIP) != 0) {