diff options
| author | 2017-03-10 14:14:03 -0800 | |
|---|---|---|
| committer | 2017-03-22 09:29:59 -0700 | |
| commit | 61fbcbcc94d1ca949afae47ec0ec7a8da80aadef (patch) | |
| tree | 766c44bc0378e73c52be5ed15d2e6a544b4cdd53 | |
| parent | 9a4b2ab18cc54d954f6d6a3981af10ec13acbb0b (diff) | |
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
3 files changed, 52 insertions, 1 deletions
diff --git a/services/core/java/com/android/server/wm/AppWindowToken.java b/services/core/java/com/android/server/wm/AppWindowToken.java index a474316a7b3b..ad73f4658036 100644 --- a/services/core/java/com/android/server/wm/AppWindowToken.java +++ b/services/core/java/com/android/server/wm/AppWindowToken.java @@ -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; } diff --git a/services/core/java/com/android/server/wm/Task.java b/services/core/java/com/android/server/wm/Task.java index 9e4d60ac2f97..3ffb093ba386 100644 --- a/services/core/java/com/android/server/wm/Task.java +++ b/services/core/java/com/android/server/wm/Task.java @@ -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() { diff --git a/services/tests/servicestests/src/com/android/server/wm/TaskStackTests.java b/services/tests/servicestests/src/com/android/server/wm/TaskStackTests.java index 1c6903337ed4..3ce3df1557dd 100644 --- a/services/tests/servicestests/src/com/android/server/wm/TaskStackTests.java +++ b/services/tests/servicestests/src/com/android/server/wm/TaskStackTests.java @@ -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; @@ -58,6 +64,42 @@ public class TaskStackTests extends WindowTestsBase { } @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); final Task task = createTaskInStack(stack, 0 /* userId */); |