Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 0cadae1c authored by Riddle Hsu's avatar Riddle Hsu
Browse files

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
parent 285e3754
Loading
Loading
Loading
Loading
+0 −6
Original line number Diff line number Diff line
@@ -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) {
+8 −7
Original line number Diff line number Diff line
@@ -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() {