Merge "Only check canSpecifyOrientation at leaf Task" into sc-dev
diff --git a/services/core/java/com/android/server/wm/Task.java b/services/core/java/com/android/server/wm/Task.java
index ea9f2c0..194350d 100644
--- a/services/core/java/com/android/server/wm/Task.java
+++ b/services/core/java/com/android/server/wm/Task.java
@@ -3291,11 +3291,22 @@
 
     @Override
     boolean handlesOrientationChangeFromDescendant() {
-        return super.handlesOrientationChangeFromDescendant()
-                // Display won't rotate for the orientation request if the Task/TaskDisplayArea
-                // can't specify orientation.
-                && canSpecifyOrientation()
-                && getDisplayArea().canSpecifyOrientation();
+        if (!super.handlesOrientationChangeFromDescendant()) {
+            return false;
+        }
+
+        // At task level, we want to check canSpecifyOrientation() based on the top activity type.
+        // Do this only on leaf Task, so that the result is not affecting by the sibling leaf Task.
+        // Otherwise, root Task will use the result from the top leaf Task, and all its child
+        // leaf Tasks will rely on that from super.handlesOrientationChangeFromDescendant().
+        if (!isLeafTask()) {
+            return true;
+        }
+
+        // Check for leaf Task.
+        // Display won't rotate for the orientation request if the Task/TaskDisplayArea
+        // can't specify orientation.
+        return canSpecifyOrientation() && getDisplayArea().canSpecifyOrientation();
     }
 
     void resize(boolean relayout, boolean forced) {
diff --git a/services/tests/wmtests/src/com/android/server/wm/TaskTests.java b/services/tests/wmtests/src/com/android/server/wm/TaskTests.java
index c3eb5c4..ecb8b60 100644
--- a/services/tests/wmtests/src/com/android/server/wm/TaskTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/TaskTests.java
@@ -16,8 +16,11 @@
 
 package com.android.server.wm;
 
+import static android.app.WindowConfiguration.ACTIVITY_TYPE_HOME;
+import static android.app.WindowConfiguration.ACTIVITY_TYPE_STANDARD;
 import static android.app.WindowConfiguration.WINDOWING_MODE_FREEFORM;
 import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN;
+import static android.app.WindowConfiguration.WINDOWING_MODE_MULTI_WINDOW;
 import static android.app.WindowConfiguration.WINDOWING_MODE_UNDEFINED;
 
 import static com.android.dx.mockito.inline.extended.ExtendedMockito.doReturn;
@@ -257,4 +260,21 @@
         task.resolveOverrideConfiguration(parentConfig);
         assertThat(resolvedOverride.getWindowingMode()).isEqualTo(WINDOWING_MODE_UNDEFINED);
     }
+
+    @Test
+    public void testHandlesOrientationChangeFromDescendant() {
+        final Task rootTask = createTaskStackOnDisplay(WINDOWING_MODE_MULTI_WINDOW,
+                ACTIVITY_TYPE_STANDARD, mDisplayContent);
+        final Task leafTask1 = createTaskInStack(rootTask, 0 /* userId */);
+        final Task leafTask2 = createTaskInStack(rootTask, 0 /* userId */);
+        leafTask1.getWindowConfiguration().setActivityType(ACTIVITY_TYPE_HOME);
+        leafTask2.getWindowConfiguration().setActivityType(ACTIVITY_TYPE_STANDARD);
+
+        assertEquals(leafTask2, rootTask.getTopChild());
+        assertTrue(rootTask.handlesOrientationChangeFromDescendant());
+        // Treat orientation request from home as handled.
+        assertTrue(leafTask1.handlesOrientationChangeFromDescendant());
+        // Orientation request from standard activity in multi window will not be handled.
+        assertFalse(leafTask2.handlesOrientationChangeFromDescendant());
+    }
 }