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:
@@ -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) {
|
||||
|
||||
@@ -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() {
|
||||
|
||||
Reference in New Issue
Block a user