diff options
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 */); |