Merge "Respect the orientation of a home activity in the process of launching when split-screen enabled." into rvc-dev
diff --git a/services/core/java/com/android/server/wm/TaskDisplayArea.java b/services/core/java/com/android/server/wm/TaskDisplayArea.java
index 7b69038..e230807 100644
--- a/services/core/java/com/android/server/wm/TaskDisplayArea.java
+++ b/services/core/java/com/android/server/wm/TaskDisplayArea.java
@@ -564,16 +564,23 @@
             // Apps and their containers are not allowed to specify an orientation while using
             // root tasks...except for the home stack if it is not resizable and currently
             // visible (top of) its root task.
-            if (mRootHomeTask != null && mRootHomeTask.isVisible()
-                    && !mRootHomeTask.isResizeable()) {
+            if (mRootHomeTask != null && !mRootHomeTask.isResizeable()) {
                 // Manually nest one-level because because getOrientation() checks fillsParent()
                 // which checks that requestedOverrideBounds() is empty. However, in this case,
                 // it is not empty because it's been overridden to maintain the fullscreen size
                 // within a smaller split-root.
                 final Task topHomeTask = mRootHomeTask.getTopMostTask();
-                final int orientation = topHomeTask.getOrientation();
-                if (orientation != SCREEN_ORIENTATION_UNSET) {
-                    return orientation;
+                final ActivityRecord topHomeActivity = topHomeTask.getTopNonFinishingActivity();
+                // If a home activity is in the process of launching and isn't yet visible we
+                // should still respect the stack's preferred orientation to ensure rotation occurs
+                // before the home activity finishes launching.
+                final boolean isHomeActivityLaunching = topHomeActivity != null
+                        && topHomeActivity.mVisibleRequested;
+                if (topHomeTask.isVisible() || isHomeActivityLaunching) {
+                    final int orientation = topHomeTask.getOrientation();
+                    if (orientation != SCREEN_ORIENTATION_UNSET) {
+                        return orientation;
+                    }
                 }
             }
             return SCREEN_ORIENTATION_UNSPECIFIED;
diff --git a/services/tests/wmtests/src/com/android/server/wm/TaskDisplayAreaTests.java b/services/tests/wmtests/src/com/android/server/wm/TaskDisplayAreaTests.java
index 786f8d8..8c3661b 100644
--- a/services/tests/wmtests/src/com/android/server/wm/TaskDisplayAreaTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/TaskDisplayAreaTests.java
@@ -28,14 +28,17 @@
 import static android.app.WindowConfiguration.WINDOWING_MODE_SPLIT_SCREEN_PRIMARY;
 import static android.app.WindowConfiguration.WINDOWING_MODE_SPLIT_SCREEN_SECONDARY;
 import static android.app.WindowConfiguration.WINDOWING_MODE_UNDEFINED;
+import static android.content.pm.ActivityInfo.RESIZE_MODE_UNRESIZEABLE;
 
 import static com.android.dx.mockito.inline.extended.ExtendedMockito.doReturn;
 import static com.android.dx.mockito.inline.extended.ExtendedMockito.spyOn;
+import static com.android.server.wm.ActivityStack.ActivityState.RESUMED;
 
 import static com.google.common.truth.Truth.assertThat;
 
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertTrue;
 import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.ArgumentMatchers.anyBoolean;
@@ -207,6 +210,40 @@
                 false /* reuseCandidate */);
     }
 
+    @Test
+    public void testGetOrientation_nonResizableHomeStackWithHomeActivityPendingVisibilityChange() {
+        final RootWindowContainer rootWindowContainer = mWm.mAtmService.mRootWindowContainer;
+        final TaskDisplayArea defaultTaskDisplayArea =
+                rootWindowContainer.getDefaultTaskDisplayArea();
+
+        final ActivityStack rootHomeTask = defaultTaskDisplayArea.getRootHomeTask();
+        rootHomeTask.mResizeMode = RESIZE_MODE_UNRESIZEABLE;
+
+        final ActivityStack primarySplitTask =
+                new ActivityTestsBase.StackBuilder(rootWindowContainer)
+                .setTaskDisplayArea(defaultTaskDisplayArea)
+                .setWindowingMode(WINDOWING_MODE_SPLIT_SCREEN_PRIMARY)
+                .setActivityType(ACTIVITY_TYPE_STANDARD)
+                .setOnTop(true)
+                .setCreateActivity(true)
+                .build();
+        ActivityRecord primarySplitActivity = primarySplitTask.getTopNonFinishingActivity();
+        assertNotNull(primarySplitActivity);
+        primarySplitActivity.setState(RESUMED,
+                "testGetOrientation_nonResizableHomeStackWithHomeActivityPendingVisibilityChange");
+
+        ActivityRecord homeActivity = rootHomeTask.getTopNonFinishingActivity();
+        if (homeActivity == null) {
+            homeActivity = new ActivityTestsBase.ActivityBuilder(mWm.mAtmService)
+                    .setStack(rootHomeTask).setCreateTask(true).build();
+        }
+        homeActivity.setVisible(false);
+        homeActivity.mVisibleRequested = true;
+        assertFalse(rootHomeTask.isVisible());
+
+        assertEquals(rootWindowContainer.getOrientation(), rootHomeTask.getOrientation());
+    }
+
     private void assertGetOrCreateStack(int windowingMode, int activityType, Task candidateTask,
             boolean reuseCandidate) {
         final TaskDisplayArea taskDisplayArea = candidateTask.getDisplayArea();