Fix missing legacy change transition on display info changed

Before, we remove the changing window from transition onDisplayChanged
even if it is a display info change on the same display. Now, we only do
that when the window is moved from the old display.

Fix: 251001013
Test: atest WmTests:WindowContainerTests
Change-Id: Id3ab6db47dad8e2541a14b5529694c290e4d2b66
This commit is contained in:
Chris Li
2022-12-09 12:21:11 +08:00
parent 99a763bf13
commit 7a67089554
2 changed files with 25 additions and 2 deletions

View File

@@ -1020,10 +1020,11 @@ class WindowContainer<E extends WindowContainer> extends ConfigurationContainer<
* @param dc The display this container is on after changes.
*/
void onDisplayChanged(DisplayContent dc) {
if (mDisplayContent != null) {
if (mDisplayContent != null && mDisplayContent != dc) {
// Cancel any change transition queued-up for this container on the old display when
// this container is moved from the old display.
mDisplayContent.mClosingChangingContainers.remove(this);
if (mDisplayContent.mChangingContainers.remove(this)) {
// Cancel any change transition queued-up for this container on the old display.
mSurfaceFreezer.unfreeze(getSyncTransaction());
}
}

View File

@@ -868,6 +868,28 @@ public class WindowContainerTests extends WindowTestsBase {
assertEquals(newDc, activity.mDisplayContent);
}
@Test
public void testOnDisplayChanged_cleanupChanging() {
final Task task = createTask(mDisplayContent);
spyOn(task.mSurfaceFreezer);
mDisplayContent.mChangingContainers.add(task);
// Don't remove the changing transition of this window when it is still the old display.
// This happens on display info changed.
task.onDisplayChanged(mDisplayContent);
assertTrue(mDisplayContent.mChangingContainers.contains(task));
verify(task.mSurfaceFreezer, never()).unfreeze(any());
// Remove the changing transition of this window when it is moved or reparented from the old
// display.
final DisplayContent newDc = createNewDisplay();
task.onDisplayChanged(newDc);
assertFalse(mDisplayContent.mChangingContainers.contains(task));
verify(task.mSurfaceFreezer).unfreeze(any());
}
@Test
public void testHandleCompleteDeferredRemoval() {
final DisplayContent displayContent = createNewDisplay();