Avoid intermediate orientation change

The onDescendantOrientationChanged in Task was used for reporting
requested orientation takes affect after display windowing mode
is changed. But when calling WMS#setWindowingMode, it will call
DC#reconfigureDisplayLocked that also updates orientation from
display so the task orientation can still propagate to display.

So just remove the invocation of onDescendantOrientationChanged
from task's config change. That prevents from reporting
intermediate orientation change when re-parenting multiple tasks
from multi-window to fullscreen.

Bug: 186657559
Test: TaskTests#testTaskOrientationOnDisplayWindowingModeChange
Change-Id: Ie722a4384829c2dab4ee4c35de6ffbbb4a0e4655
This commit is contained in:
Riddle Hsu
2021-05-03 14:51:24 +08:00
parent 285e375408
commit 0cadae1c71
2 changed files with 8 additions and 13 deletions

View File

@@ -2240,7 +2240,6 @@ class Task extends WindowContainer<WindowContainer> {
mTmpPrevBounds.set(getBounds());
final boolean wasInMultiWindowMode = inMultiWindowMode();
final boolean wasInPictureInPicture = inPinnedWindowingMode();
final int oldOrientation = getOrientation();
super.onConfigurationChanged(newParentConfig);
// Only need to update surface size here since the super method will handle updating
// surface position.
@@ -2283,11 +2282,6 @@ class Task extends WindowContainer<WindowContainer> {
mForceNotOrganized = false;
}
// Report orientation change such as changing from freeform to fullscreen.
if (oldOrientation != getOrientation()) {
onDescendantOrientationChanged(this);
}
saveLaunchingStateIfNeeded();
final boolean taskOrgChanged = updateTaskOrganizerState(false /* forceUpdate */);
if (taskOrgChanged) {

View File

@@ -62,7 +62,6 @@ import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.ArgumentMatchers.same;
import static org.mockito.Mockito.clearInvocations;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.reset;
import android.app.ActivityManager;
import android.app.TaskInfo;
@@ -1322,20 +1321,22 @@ public class TaskTests extends WindowTestsBase {
}
@Test
public void testNotifyOrientationChangeCausedByConfigurationChange() {
public void testTaskOrientationOnDisplayWindowingModeChange() {
// Skip unnecessary operations to speed up the test.
mAtm.deferWindowLayout();
final Task task = getTestTask();
final ActivityRecord activity = task.getTopMostActivity();
final DisplayContent display = task.getDisplayContent();
display.setWindowingMode(WINDOWING_MODE_FREEFORM);
mWm.setWindowingMode(display.mDisplayId, WINDOWING_MODE_FREEFORM);
activity.setRequestedOrientation(SCREEN_ORIENTATION_LANDSCAPE);
assertEquals(SCREEN_ORIENTATION_UNSET, task.getOrientation());
verify(display).onDescendantOrientationChanged(same(task));
reset(display);
assertEquals(SCREEN_ORIENTATION_UNSPECIFIED, display.getLastOrientation());
display.setWindowingMode(WINDOWING_MODE_FULLSCREEN);
mWm.setWindowingMode(display.mDisplayId, WINDOWING_MODE_FULLSCREEN);
assertEquals(SCREEN_ORIENTATION_LANDSCAPE, task.getOrientation());
verify(display).onDescendantOrientationChanged(same(task));
assertEquals(SCREEN_ORIENTATION_LANDSCAPE, display.getLastOrientation());
assertEquals(Configuration.ORIENTATION_LANDSCAPE, display.getConfiguration().orientation);
}
private Task getTestTask() {