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

Commit 61fbcbcc authored by Bryce Lee's avatar Bryce Lee
Browse files

Do not allow Tasks to influence orientation under some conditions.

When all AppWindowTokens belonging to a Task are closing, it should
not be considered for orientation. Likewise, if a task is moving to
the bottom, it should also not be considered.

Change-Id: Ie387457c413d5360afbb0ac8edb112f81feab81b
Fixes: 35699615
Test: bit FrameworksServicesTests:com.android.server.wm.TaskStackTests#testClosingAppDifferentStackOrientation
Test: bit FrameworksServicesTests:com.android.server.wm.TaskStackTests#testMoveTaskToBackDifferentStackOrientation
Test: cts/hostsidetests/services/activityandwindowmanager/util/run-test CtsServicesHostTestCases android.server.cts.ActivityManagerAppConfigurationTests#testTaskCloseRestoreOrientation
Test: cts/hostsidetests/services/activityandwindowmanager/util/run-test CtsServicesHostTestCases android.server.cts.ActivityManagerAppConfigurationTests#testTaskMoveToBackOrientation
parent 9a4b2ab1
Loading
Loading
Loading
Loading
+6 −1
Original line number Diff line number Diff line
@@ -1170,7 +1170,12 @@ class AppWindowToken extends WindowToken implements WindowManagerService.AppFree
     */
    @Override
    int getOrientation() {
        if (fillsParent() && (isVisible() || mService.mOpeningApps.contains(this))) {
        // The {@link AppWindowToken} should only specify an orientation when it is not closing or
        // going to the bottom. Allowing closing {@link AppWindowToken} to participate can lead to
        // an Activity in another task being started in the wrong orientation during the transition.
        if (fillsParent()
                && !(sendingToBottom || mService.mClosingApps.contains(this))
                && (isVisible() || mService.mOpeningApps.contains(this))) {
            return mOrientation;
        }

+4 −0
Original line number Diff line number Diff line
@@ -22,6 +22,7 @@ import static android.app.ActivityManager.StackId.FREEFORM_WORKSPACE_STACK_ID;
import static android.content.pm.ActivityInfo.RESIZE_MODE_FORCE_RESIZABLE_LANDSCAPE_ONLY;
import static android.content.pm.ActivityInfo.RESIZE_MODE_FORCE_RESIZABLE_PRESERVE_ORIENTATION;
import static android.content.pm.ActivityInfo.RESIZE_MODE_FORCE_RESIZABLE_PORTRAIT_ONLY;
import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_UNSET;
import static com.android.server.EventLogTags.WM_TASK_REMOVED;
import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_STACK;
import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_TASK_MOVEMENT;
@@ -107,6 +108,9 @@ class Task extends WindowContainer<AppWindowToken> implements DimLayer.DimLayerU
        setController(controller);
        setBounds(bounds, overrideConfig);
        mTaskDescription = taskDescription;

        // Tasks have no set orientation value (including SCREEN_ORIENTATION_UNSPECIFIED).
        setOrientation(SCREEN_ORIENTATION_UNSET);
    }

    DisplayContent getDisplayContent() {
+42 −0
Original line number Diff line number Diff line
@@ -16,6 +16,9 @@

package com.android.server.wm;

import android.content.pm.ActivityInfo;
import android.view.WindowManager;
import android.view.WindowManager.LayoutParams;
import org.junit.Test;
import org.junit.runner.RunWith;

@@ -23,6 +26,9 @@ import android.platform.test.annotations.Presubmit;
import android.support.test.filters.SmallTest;
import android.support.test.runner.AndroidJUnit4;

import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE;
import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_PORTRAIT;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
@@ -57,6 +63,42 @@ public class TaskStackTests extends WindowTestsBase {
        assertEquals(stack.mChildren.get(1), task1);
    }

    @Test
    public void testClosingAppDifferentStackOrientation() throws Exception {
        final TaskStack stack = createTaskStackOnDisplay(sDisplayContent);
        final Task task1 = createTaskInStack(stack, 0 /* userId */);
        TestAppWindowToken appWindowToken1 = new TestAppWindowToken(sDisplayContent);
        task1.addChild(appWindowToken1, 0);
        appWindowToken1.setOrientation(SCREEN_ORIENTATION_LANDSCAPE);

        final Task task2 = createTaskInStack(stack, 1 /* userId */);
        TestAppWindowToken appWindowToken2 = new TestAppWindowToken(sDisplayContent);
        task2.addChild(appWindowToken2, 0);
        appWindowToken2.setOrientation(SCREEN_ORIENTATION_PORTRAIT);

        assertEquals(stack.getOrientation(), SCREEN_ORIENTATION_PORTRAIT);
        sWm.mClosingApps.add(appWindowToken2);
        assertEquals(stack.getOrientation(), SCREEN_ORIENTATION_LANDSCAPE);
    }

    @Test
    public void testMoveTaskToBackDifferentStackOrientation() throws Exception {
        final TaskStack stack = createTaskStackOnDisplay(sDisplayContent);
        final Task task1 = createTaskInStack(stack, 0 /* userId */);
        TestAppWindowToken appWindowToken1 = new TestAppWindowToken(sDisplayContent);
        task1.addChild(appWindowToken1, 0);
        appWindowToken1.setOrientation(SCREEN_ORIENTATION_LANDSCAPE);

        final Task task2 = createTaskInStack(stack, 1 /* userId */);
        TestAppWindowToken appWindowToken2 = new TestAppWindowToken(sDisplayContent);
        task2.addChild(appWindowToken2, 0);
        appWindowToken2.setOrientation(SCREEN_ORIENTATION_PORTRAIT);

        assertEquals(stack.getOrientation(), SCREEN_ORIENTATION_PORTRAIT);
        task2.setSendingToBottom(true);
        assertEquals(stack.getOrientation(), SCREEN_ORIENTATION_LANDSCAPE);
    }

    @Test
    public void testStackRemoveImmediately() throws Exception {
        final TaskStack stack = createTaskStackOnDisplay(sDisplayContent);