Change PixelCopyTest to handle more cases

In particular this change suppresses fix-to-user-rotation before running
tests so that they can always rotate display by setting app requested
orientation. It also makes some activities in CtsViewTests to handle
additional configuration changes that may happen due to display
rotation so that the activity won't be restarted accidentally.

Bug: 160030571
Test: atest PixelCopyTest
Change-Id: I730717014317dbd3568bfaef7be32d837e73db4e
Merged-In: I730717014317dbd3568bfaef7be32d837e73db4e
diff --git a/tests/tests/view/AndroidManifest.xml b/tests/tests/view/AndroidManifest.xml
index 174e5dc..344375e 100644
--- a/tests/tests/view/AndroidManifest.xml
+++ b/tests/tests/view/AndroidManifest.xml
@@ -174,14 +174,14 @@
                   android:screenOrientation="portrait"
                   android:rotationAnimation="jumpcut"
                   android:theme="@android:style/Theme.DeviceDefault.NoActionBar"
-                  android:configChanges="orientation|screenSize" />
+                  android:configChanges="orientation|screenSize|screenLayout|smallestScreenSize" />
 
         <activity android:name="android.view.cts.PixelCopyWideGamutViewProducerActivity"
                   android:label="PixelCopyWideGamutViewProducerActivity"
                   android:screenOrientation="portrait"
                   android:rotationAnimation="jumpcut"
                   android:theme="@android:style/Theme.DeviceDefault.NoActionBar"
-                  android:configChanges="orientation|screenSize"
+                  android:configChanges="orientation|screenSize|screenLayout|smallestScreenSize"
                   android:colorMode="wideColorGamut" />
 
         <activity android:name="android.view.cts.PixelCopyViewProducerDialogActivity"
@@ -189,7 +189,7 @@
                   android:screenOrientation="portrait"
                   android:rotationAnimation="jumpcut"
                   android:theme="@android:style/Theme.Material.Dialog.NoActionBar"
-                  android:configChanges="orientation|screenSize" />
+                  android:configChanges="orientation|screenSize|screenLayout|smallestScreenSize" />
 
         <activity android:name="android.view.cts.FocusFinderCtsActivity"
                   android:screenOrientation="locked"
diff --git a/tests/tests/view/src/android/view/cts/PixelCopyTest.java b/tests/tests/view/src/android/view/cts/PixelCopyTest.java
index 85c4094..99e4da8 100644
--- a/tests/tests/view/src/android/view/cts/PixelCopyTest.java
+++ b/tests/tests/view/src/android/view/cts/PixelCopyTest.java
@@ -42,6 +42,7 @@
 import android.view.View;
 import android.view.Window;
 import android.view.WindowManager;
+import android.view.cts.util.DisableFixToUserRotationRule;
 
 import androidx.test.InstrumentationRegistry;
 import androidx.test.filters.LargeTest;
@@ -70,6 +71,10 @@
     private static final String TAG = "PixelCopyTests";
 
     @Rule
+    public DisableFixToUserRotationRule mDisableFixToUserRotationRule =
+            new DisableFixToUserRotationRule();
+
+    @Rule
     public ActivityTestRule<PixelCopyGLProducerCtsActivity> mGLSurfaceViewActivityRule =
             new ActivityTestRule<>(PixelCopyGLProducerCtsActivity.class, false, false);
 
diff --git a/tests/tests/view/src/android/view/cts/util/DisableFixToUserRotationRule.java b/tests/tests/view/src/android/view/cts/util/DisableFixToUserRotationRule.java
new file mode 100644
index 0000000..43bc27c
--- /dev/null
+++ b/tests/tests/view/src/android/view/cts/util/DisableFixToUserRotationRule.java
@@ -0,0 +1,75 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.view.cts.util;
+
+import android.app.UiAutomation;
+import android.os.ParcelFileDescriptor;
+import android.util.Log;
+
+import androidx.test.platform.app.InstrumentationRegistry;
+
+import org.junit.rules.TestRule;
+import org.junit.runner.Description;
+import org.junit.runners.model.Statement;
+
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.io.Reader;
+
+public class DisableFixToUserRotationRule implements TestRule {
+    private static final String TAG = "DisableFixToUserRotationRule";
+    private static final String COMMAND = "cmd window set-fix-to-user-rotation ";
+
+    private final UiAutomation mUiAutomation;
+
+    public DisableFixToUserRotationRule() {
+        mUiAutomation = InstrumentationRegistry.getInstrumentation().getUiAutomation();
+    }
+
+    @Override
+    public Statement apply(Statement base, Description description) {
+        return new Statement() {
+            @Override
+            public void evaluate() throws Throwable {
+                executeShellCommandAndPrint(COMMAND + "disabled");
+                try {
+                    base.evaluate();
+                } finally {
+                    executeShellCommandAndPrint(COMMAND + "default");
+                }
+            }
+        };
+    }
+
+    private void executeShellCommandAndPrint(String cmd) {
+        ParcelFileDescriptor pfd = mUiAutomation.executeShellCommand(cmd);
+        StringBuilder builder = new StringBuilder();
+        char[] buffer = new char[256];
+        int charRead;
+        try (Reader reader =
+                     new InputStreamReader(new ParcelFileDescriptor.AutoCloseInputStream(pfd))) {
+            while ((charRead = reader.read(buffer)) > 0) {
+                builder.append(buffer, 0, charRead);
+            }
+        } catch (IOException e) {
+            throw new RuntimeException(e);
+        }
+
+        Log.i(TAG, "Command: " + cmd + " Output: " + builder);
+    }
+
+}