Merge "Revert "Allow opening activity to specify orientation.""
diff --git a/services/core/java/com/android/server/am/ActivityRecord.java b/services/core/java/com/android/server/am/ActivityRecord.java
index 38b36a6..baf7772 100644
--- a/services/core/java/com/android/server/am/ActivityRecord.java
+++ b/services/core/java/com/android/server/am/ActivityRecord.java
@@ -1899,22 +1899,11 @@
                 task.taskId, requestedOrientation);
     }
 
-    /**
-     * Set the last reported global configuration to the client. Should be called whenever a new
-     * global configuration is sent to the client for this activity.
-     */
-    void setLastReportedGlobalConfiguration(@NonNull Configuration config) {
+    // TODO: now used only in one place to address race-condition. Remove when that will be fixed.
+    void setLastReportedConfiguration(@NonNull Configuration config) {
         mLastReportedConfiguration.setTo(config);
     }
 
-    /**
-     * Set the last reported merged configuration to the client. Should be called whenever a new
-     * merged configuration is sent to the client for this activity.
-     */
-    void setLastReportedMergedOverrideConfiguration(@NonNull Configuration config) {
-        mLastReportedOverrideConfiguration.setTo(config);
-    }
-
     /** Call when override config was sent to the Window Manager to update internal records. */
     void onOverrideConfigurationSent() {
         mLastReportedOverrideConfiguration.setTo(task.getMergedOverrideConfiguration());
diff --git a/services/core/java/com/android/server/am/ActivityStackSupervisor.java b/services/core/java/com/android/server/am/ActivityStackSupervisor.java
index 33a9586..4411794 100644
--- a/services/core/java/com/android/server/am/ActivityStackSupervisor.java
+++ b/services/core/java/com/android/server/am/ActivityStackSupervisor.java
@@ -1333,18 +1333,10 @@
             // Because we could be starting an Activity in the system process this may not go across
             // a Binder interface which would create a new Configuration. Consequently we have to
             // always create a new Configuration here.
-
-            final Configuration globalConfiguration =
-                new Configuration(mService.getGlobalConfiguration());
-            r.setLastReportedGlobalConfiguration(globalConfiguration);
-            final Configuration mergedOverrideConfiguration =
-                new Configuration(task.getMergedOverrideConfiguration());
-            r.setLastReportedMergedOverrideConfiguration(mergedOverrideConfiguration);
-
             app.thread.scheduleLaunchActivity(new Intent(r.intent), r.appToken,
                     System.identityHashCode(r), r.info,
-                    globalConfiguration,
-                    mergedOverrideConfiguration, r.compat,
+                    new Configuration(mService.getGlobalConfiguration()),
+                    new Configuration(task.getMergedOverrideConfiguration()), r.compat,
                     r.launchedFromPackage, task.voiceInteractor, app.repProcState, r.icicle,
                     r.persistentState, results, newIntents, !andResume,
                     mService.isNextTransitionForward(), profilerInfo);
@@ -1739,7 +1731,7 @@
             // We'll update with whatever configuration it now says
             // it used to launch.
             if (config != null) {
-                r.setLastReportedGlobalConfiguration(config);
+                r.setLastReportedConfiguration(config);
             }
 
             // We are now idle.  If someone is waiting for a thumbnail from
diff --git a/services/core/java/com/android/server/wm/AppWindowToken.java b/services/core/java/com/android/server/wm/AppWindowToken.java
index d643769..bcc720d 100644
--- a/services/core/java/com/android/server/wm/AppWindowToken.java
+++ b/services/core/java/com/android/server/wm/AppWindowToken.java
@@ -1151,11 +1151,10 @@
      */
     @Override
     int getOrientation() {
-        if (fillsParent() && (isVisible() || mService.mOpeningApps.contains(this))) {
-            return mOrientation;
+        if (hidden || hiddenRequested) {
+            return SCREEN_ORIENTATION_UNSET;
         }
-
-        return SCREEN_ORIENTATION_UNSET;
+        return mOrientation;
     }
 
     /** Returns the app's preferred orientation regardless of its currently visibility state. */
diff --git a/services/core/java/com/android/server/wm/WindowContainer.java b/services/core/java/com/android/server/wm/WindowContainer.java
index 5e25da3..5b96263 100644
--- a/services/core/java/com/android/server/wm/WindowContainer.java
+++ b/services/core/java/com/android/server/wm/WindowContainer.java
@@ -510,13 +510,14 @@
      * specification...
      */
     int getOrientation() {
-        if (!fillsParent()) {
-            // Ignore containers that don't completely fills their parents.
+
+        if (!fillsParent() || !isVisible()) {
+            // Ignore invisible containers or containers that don't completely fills their parents.
             return SCREEN_ORIENTATION_UNSET;
         }
 
-        // The container fills its parent and is visible so we can use it orientation if it has one
-        // specified; otherwise we prefer to use the orientation of its topmost child that has one
+        // The container fills its parent so we can use it orientation if it has one specified,
+        // otherwise we prefer to use the orientation of its topmost child that has one
         // specified and fall back on this container's unset or unspecified value as a candidate
         // if none of the children have a better candidate for the orientation.
         if (mOrientation != SCREEN_ORIENTATION_UNSET
diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java
index 779ac57..9b96523 100644
--- a/services/core/java/com/android/server/wm/WindowManagerService.java
+++ b/services/core/java/com/android/server/wm/WindowManagerService.java
@@ -2442,15 +2442,6 @@
         }
     }
 
-    /**
-     * Updates the device orientation from the present app tokens.
-     *
-     * Note: A place this is method called is before an {@link android.app.Activity} starts to
-     * ensure that it is created in the proper orientation. It is imperative that the present
-     * {@link AppWindowToken} specify that they can influence the orientation, accomplished with the
-     * override of {@link WindowContainer#canSpecifyOrientation()}. Visibility changes only will not
-     * guarantee this as other operations (such as freezing the screen) can defer these operations.
-     */
     @Override
     public Configuration updateOrientationFromAppTokens(Configuration currentConfig,
             IBinder freezeThisOneIfNeeded, int displayId) {
diff --git a/services/tests/servicestests/src/com/android/server/wm/WindowContainerTests.java b/services/tests/servicestests/src/com/android/server/wm/WindowContainerTests.java
index 4f9cd95..4f740ac 100644
--- a/services/tests/servicestests/src/com/android/server/wm/WindowContainerTests.java
+++ b/services/tests/servicestests/src/com/android/server/wm/WindowContainerTests.java
@@ -388,32 +388,6 @@
     }
 
     @Test
-    public void testGetOrientation_childSpecified() throws Exception {
-        testGetOrientation_childSpecifiedConfig(false, SCREEN_ORIENTATION_LANDSCAPE,
-            SCREEN_ORIENTATION_LANDSCAPE);
-        testGetOrientation_childSpecifiedConfig(false, SCREEN_ORIENTATION_UNSET,
-            SCREEN_ORIENTATION_UNSET);
-    }
-
-    private void testGetOrientation_childSpecifiedConfig(boolean childVisible, int childOrientation,
-        int expectedOrientation) {
-        final TestWindowContainerBuilder builder = new TestWindowContainerBuilder();
-        final TestWindowContainer root = builder.setLayer(0).build();
-        root.setFillsParent(true);
-
-        builder.setIsVisible(childVisible);
-
-        if (childOrientation != SCREEN_ORIENTATION_UNSET) {
-            builder.setOrientation(childOrientation);
-        }
-
-        final TestWindowContainer child1 = root.addChildWindow(builder);
-        child1.setFillsParent(true);
-
-        assertTrue(root.getOrientation() == expectedOrientation);
-    }
-
-    @Test
     public void testGetOrientation_Unset() throws Exception {
         final TestWindowContainerBuilder builder = new TestWindowContainerBuilder();
         final TestWindowContainer root = builder.setLayer(0).setIsVisible(true).build();
@@ -433,17 +407,18 @@
         invisibleChild1VisibleAndSet.setOrientation(SCREEN_ORIENTATION_LANDSCAPE);
         // Landscape well because the container is visible and that is what we set on it above.
         assertEquals(SCREEN_ORIENTATION_LANDSCAPE, invisibleChild1VisibleAndSet.getOrientation());
-        // Landscape because even though the container isn't visible it has a child that is
-        // specifying it can influence the orientation by being visible.
-        assertEquals(SCREEN_ORIENTATION_LANDSCAPE, invisible.getOrientation());
-        // Landscape because the grandchild is visible and therefore can participate.
-        assertEquals(SCREEN_ORIENTATION_LANDSCAPE, root.getOrientation());
+        // Unset because the container isn't visible even though it has a child that thinks it is
+        // visible.
+        assertEquals(SCREEN_ORIENTATION_UNSET, invisible.getOrientation());
+        // Unspecified because we are visible and we didn't specify an orientation and there isn't
+        // a visible child.
+        assertEquals(SCREEN_ORIENTATION_UNSPECIFIED, root.getOrientation());
 
         builder.setIsVisible(true).setLayer(-3);
         final TestWindowContainer visibleUnset = root.addChildWindow(builder);
         visibleUnset.setOrientation(SCREEN_ORIENTATION_UNSET);
         assertEquals(SCREEN_ORIENTATION_UNSET, visibleUnset.getOrientation());
-        assertEquals(SCREEN_ORIENTATION_LANDSCAPE, root.getOrientation());
+        assertEquals(SCREEN_ORIENTATION_UNSPECIFIED, root.getOrientation());
 
     }
 
@@ -715,7 +690,6 @@
         private boolean mIsAnimating;
         private boolean mIsVisible;
         private boolean mFillsParent;
-        private Integer mOrientation;
 
         private boolean mOnParentSetCalled;
 
@@ -734,13 +708,11 @@
             return 1;
         };
 
-        TestWindowContainer(int layer, boolean isAnimating, boolean isVisible,
-            Integer orientation) {
+        TestWindowContainer(int layer, boolean isAnimating, boolean isVisible) {
             mLayer = layer;
             mIsAnimating = isAnimating;
             mIsVisible = isVisible;
             mFillsParent = true;
-            mOrientation = orientation;
         }
 
         TestWindowContainer getParentWindow() {
@@ -786,11 +758,6 @@
         }
 
         @Override
-        int getOrientation() {
-            return mOrientation != null ? mOrientation : super.getOrientation();
-        }
-
-        @Override
         boolean fillsParent() {
             return mFillsParent;
         }
@@ -804,7 +771,6 @@
         private int mLayer;
         private boolean mIsAnimating;
         private boolean mIsVisible;
-        private Integer mOrientation;
 
         public TestWindowContainerBuilder() {
             reset();
@@ -825,21 +791,15 @@
             return this;
         }
 
-        TestWindowContainerBuilder setOrientation(int orientation) {
-            mOrientation = orientation;
-            return this;
-        }
-
         TestWindowContainerBuilder reset() {
             mLayer = 0;
             mIsAnimating = false;
             mIsVisible = false;
-            mOrientation = null;
             return this;
         }
 
         TestWindowContainer build() {
-            return new TestWindowContainer(mLayer, mIsAnimating, mIsVisible, mOrientation);
+            return new TestWindowContainer(mLayer, mIsAnimating, mIsVisible);
         }
     }
 }