Merge "Camera: Fix incorrect hardware level comparisions in CTS" into pie-cts-dev
diff --git a/apps/CameraITS/tests/scene0/test_param_sensitivity_burst.py b/apps/CameraITS/tests/scene0/test_param_sensitivity_burst.py
index dfd9ed8..b716141 100644
--- a/apps/CameraITS/tests/scene0/test_param_sensitivity_burst.py
+++ b/apps/CameraITS/tests/scene0/test_param_sensitivity_burst.py
@@ -19,7 +19,7 @@
 import its.target
 
 NUM_STEPS = 3
-ERROR_TOLERANCE = 0.97  # Allow ISO to be rounded down by 3%
+ERROR_TOLERANCE = 0.96  # Allow ISO to be rounded down by 4%
 
 
 def main():
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/camera/its/ItsService.java b/apps/CtsVerifier/src/com/android/cts/verifier/camera/its/ItsService.java
index fc2374e..ce07801 100644
--- a/apps/CtsVerifier/src/com/android/cts/verifier/camera/its/ItsService.java
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/camera/its/ItsService.java
@@ -359,7 +359,8 @@
                 // Initialize memory quota on this device
                 for (String camId : devices) {
                     CameraCharacteristics chars =  mCameraManager.getCameraCharacteristics(camId);
-                    Size maxYuvSize = ItsUtils.getYuvOutputSizes(chars)[0];
+                    Size maxYuvSize = ItsUtils.getMaxOutputSize(
+                            mCameraCharacteristics, ImageFormat.YUV_420_888);
                     // 4 bytes per pixel for RGBA8888 Bitmap and at least 3 Bitmaps per CDD
                     int quota = maxYuvSize.getWidth() * maxYuvSize.getHeight() * 4 * 3;
                     if (quota > mMemoryQuota) {
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/sensors/RVCVXCheckTestActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/sensors/RVCVXCheckTestActivity.java
index 789de68..9fbeba2 100644
--- a/apps/CtsVerifier/src/com/android/cts/verifier/sensors/RVCVXCheckTestActivity.java
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/sensors/RVCVXCheckTestActivity.java
@@ -167,7 +167,7 @@
 
             // acquire a partial wake lock just in case CPU fall asleep
             PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
-            PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK,
+            PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK,
                     "RVCVXCheckAnalyzer");
 
             wl.acquire();
diff --git a/hostsidetests/appsecurity/src/android/appsecurity/cts/AdoptableHostTest.java b/hostsidetests/appsecurity/src/android/appsecurity/cts/AdoptableHostTest.java
index ad98fa2..2e78272 100644
--- a/hostsidetests/appsecurity/src/android/appsecurity/cts/AdoptableHostTest.java
+++ b/hostsidetests/appsecurity/src/android/appsecurity/cts/AdoptableHostTest.java
@@ -117,6 +117,18 @@
             // Unmount, remount and verify
             getDevice().executeShellCommand("sm unmount " + vol.volId);
             getDevice().executeShellCommand("sm mount " + vol.volId);
+
+            int attempt = 0;
+            String pkgPath = getDevice().executeShellCommand("pm path " + PKG);
+            while ((pkgPath == null || pkgPath.isEmpty()) && attempt++ < 15) {
+                Thread.sleep(1000);
+                pkgPath = getDevice().executeShellCommand("pm path " + PKG);
+            }
+
+            if (pkgPath == null || pkgPath.isEmpty()) {
+                throw new AssertionError("Package not ready yet");
+            }
+
             runDeviceTests(PKG, CLASS, "testDataNotInternal");
             runDeviceTests(PKG, CLASS, "testDataRead");
             runDeviceTests(PKG, CLASS, "testNative");
diff --git a/hostsidetests/security/src/android/security/cts/SELinuxHostTest.java b/hostsidetests/security/src/android/security/cts/SELinuxHostTest.java
index 0041563..b32a054 100644
--- a/hostsidetests/security/src/android/security/cts/SELinuxHostTest.java
+++ b/hostsidetests/security/src/android/security/cts/SELinuxHostTest.java
@@ -891,6 +891,9 @@
      * @throws Exception
      */
     public void testCoredomainViolators() throws Exception {
+        if (!isFullTrebleDevice()) {
+            return;
+        }
         assertSepolicyTests("CoredomainViolations", "/treble_sepolicy_tests");
     }
 
diff --git a/tests/framework/base/activitymanager/app/AndroidManifest.xml b/tests/framework/base/activitymanager/app/AndroidManifest.xml
index c977b37..2b91190 100755
--- a/tests/framework/base/activitymanager/app/AndroidManifest.xml
+++ b/tests/framework/base/activitymanager/app/AndroidManifest.xml
@@ -179,10 +179,10 @@
                   android:resizeableActivity="true"
                   android:configChanges="orientation|screenSize|smallestScreenSize|screenLayout"
                   android:exported="true">
-                  <layout android:defaultWidth="25%"
-                          android:defaultHeight="35%"
+                  <layout android:defaultWidth="50%"
+                          android:defaultHeight="70%"
                           android:gravity="top|right"
-                          android:minWidth="90dp"
+                          android:minWidth="50dp"
                           android:minHeight="80dp"
                   />
         </activity>
@@ -190,10 +190,10 @@
                   android:resizeableActivity="true"
                   android:configChanges="orientation|screenSize|smallestScreenSize|screenLayout"
                   android:exported="true">
-                  <layout android:defaultWidth="25%"
-                          android:defaultHeight="35%"
+                  <layout android:defaultWidth="50%"
+                          android:defaultHeight="70%"
                           android:gravity="bottom|left"
-                          android:minWidth="90dp"
+                          android:minWidth="50dp"
                           android:minHeight="80dp"
                   />
         </activity>
diff --git a/tests/framework/base/activitymanager/src/android/server/am/ActivityManagerManifestLayoutTests.java b/tests/framework/base/activitymanager/src/android/server/am/ActivityManagerManifestLayoutTests.java
index 6b5c7c1..b491a9f 100644
--- a/tests/framework/base/activitymanager/src/android/server/am/ActivityManagerManifestLayoutTests.java
+++ b/tests/framework/base/activitymanager/src/android/server/am/ActivityManagerManifestLayoutTests.java
@@ -49,8 +49,8 @@
     // Test parameters
     private static final int DEFAULT_WIDTH_DP = 240;
     private static final int DEFAULT_HEIGHT_DP = 160;
-    private static final float DEFAULT_WIDTH_FRACTION = 0.25f;
-    private static final float DEFAULT_HEIGHT_FRACTION = 0.35f;
+    private static final float DEFAULT_WIDTH_FRACTION = 0.50f;
+    private static final float DEFAULT_HEIGHT_FRACTION = 0.70f;
     private static final int MIN_WIDTH_DP = 100;
     private static final int MIN_HEIGHT_DP = 80;
 
diff --git a/tests/sensor/src/android/hardware/cts/SensorParameterRangeTest.java b/tests/sensor/src/android/hardware/cts/SensorParameterRangeTest.java
index 44135bc..c1c9fab 100644
--- a/tests/sensor/src/android/hardware/cts/SensorParameterRangeTest.java
+++ b/tests/sensor/src/android/hardware/cts/SensorParameterRangeTest.java
@@ -77,23 +77,23 @@
 
     public void testAccelerometerRange() {
         checkSensorRangeAndFrequency(
-                mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),
+                Sensor.TYPE_ACCELEROMETER,
                 ACCELEROMETER_MAX_RANGE,
                 ACCELEROMETER_MIN_FREQUENCY,
                 ACCELEROMETER_MAX_FREQUENCY);
-  }
+    }
 
-  public void testGyroscopeRange() {
+    public void testGyroscopeRange() {
         checkSensorRangeAndFrequency(
-                mSensorManager.getDefaultSensor(Sensor.TYPE_GYROSCOPE),
+                Sensor.TYPE_GYROSCOPE,
                 GYRO_MAX_RANGE,
                 GYRO_MIN_FREQUENCY,
                 GYRO_MAX_FREQUENCY);
-  }
+    }
 
     public void testMagnetometerRange() {
         checkSensorRangeAndFrequency(
-                mSensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD),
+                Sensor.TYPE_MAGNETIC_FIELD,
                 MAGNETOMETER_MAX_RANGE,
                 MAGNETOMETER_MIN_FREQUENCY,
                 MAGNETOMETER_MAX_FREQUENCY);
@@ -102,7 +102,7 @@
     public void testPressureRange() {
         if (mHasHifiSensors) {
             checkSensorRangeAndFrequency(
-                    mSensorManager.getDefaultSensor(Sensor.TYPE_PRESSURE),
+                    Sensor.TYPE_PRESSURE,
                     PRESSURE_MAX_RANGE,
                     PRESSURE_MIN_FREQUENCY,
                     PRESSURE_MAX_FREQUENCY);
@@ -110,8 +110,14 @@
     }
 
     private void checkSensorRangeAndFrequency(
-          Sensor sensor, double maxRange, double minFrequency, double maxFrequency) {
+          int sensorType, double maxRange, double minFrequency, double maxFrequency) {
         if (!mHasHifiSensors && !mVrModeHighPerformance) return;
+
+        Sensor sensor = mSensorManager.getDefaultSensor(sensorType);
+        if (sensor == null) {
+            fail(String.format("Must support sensor type %d", sensorType));
+        }
+
         assertTrue(String.format("%s Range actual=%.2f expected=%.2f %s",
                     sensor.getName(), sensor.getMaximumRange(), maxRange,
                     SensorCtsHelper.getUnitsForSensor(sensor)),
diff --git a/tests/tests/car/AndroidManifest.xml b/tests/tests/car/AndroidManifest.xml
index 76e2e3c..2a52f2e 100644
--- a/tests/tests/car/AndroidManifest.xml
+++ b/tests/tests/car/AndroidManifest.xml
@@ -22,6 +22,12 @@
 
     <application>
         <uses-library android:name="android.test.runner" />
+        <activity android:name=".drivingstate.DistractionOptimizedActivity">
+            <meta-data android:name="distractionOptimized" android:value="true"/>
+        </activity>
+        <activity android:name=".drivingstate.NonDistractionOptimizedActivity">
+            <meta-data android:name="distractionOptimized" android:value="false"/>
+        </activity>
     </application>
 
     <instrumentation android:name="android.support.test.runner.AndroidJUnitRunner"
diff --git a/tests/tests/car/src/android/car/cts/CarPackageManagerTest.java b/tests/tests/car/src/android/car/cts/CarPackageManagerTest.java
index 0c3aebc..ec79572 100644
--- a/tests/tests/car/src/android/car/cts/CarPackageManagerTest.java
+++ b/tests/tests/car/src/android/car/cts/CarPackageManagerTest.java
@@ -82,50 +82,19 @@
        } catch (IllegalArgumentException expected) {
            // Expected.
        }
-   }
-
-    @Test
-    public void testSystemActivitiesAllowed() throws CarNotConnectedException {
-        Context context = InstrumentationRegistry.getInstrumentation().getTargetContext();
-        List<PackageInfo> packages = context.getPackageManager().getInstalledPackages(
-                PackageManager.GET_ACTIVITIES | PackageManager.GET_META_DATA);
-
-        for (PackageInfo info : packages) {
-            if (info.applicationInfo == null) {
-                continue;
-            }
-            if ((info.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0 ||
-                    ((info.applicationInfo.flags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP) != 0)) {
-
-                Bundle metaData = info.applicationInfo.metaData;
-                if (metaData == null || metaData.getInt(METADATA_ATTRIBUTE, 0) == 0) {
-                    continue;  // No car metadata, ignoring this app.
-                }
-
-                if (info.activities != null && info.activities.length > 0) {
-                    String activity = info.activities[0].name;
-                    String packageName = info.packageName;
-                    assertTrue("Failed for package: " + packageName + ", activity: " + activity,
-                            mCarPm.isActivityDistractionOptimized(packageName, activity));
-                }
-            }
-        }
     }
 
     @Test
-    @Ignore // Enable when b/120125891 is fixed
-    public void testServiceDistractionOptimized() throws Exception {
-        assertFalse(mCarPm.isServiceDistractionOptimized("com.basic.package", ""));
-        assertTrue(mCarPm.isServiceDistractionOptimized("com.android.settings", "Any"));
-        assertTrue(mCarPm.isServiceDistractionOptimized("com.android.settings", ""));
-        assertTrue(mCarPm.isServiceDistractionOptimized("com.android.settings", null));
-
-        try {
-            mCarPm.isServiceDistractionOptimized(null, "Any");
-            fail();
-        } catch (IllegalArgumentException expected) {
-            // Expected.
-        }
+    public void testDistractionOptimizedActivityIsAllowed() throws CarNotConnectedException {
+        // This test relies on test activity in installed apk, and AndroidManifest declaration.
+        assertTrue(mCarPm.isActivityDistractionOptimized("android.car.cts",
+                "android.car.cts.drivingstate.DistractionOptimizedActivity"));
     }
 
+    @Test
+    public void testNonDistractionOptimizedActivityNotAllowed() throws CarNotConnectedException {
+        // This test relies on test activity in installed apk, and AndroidManifest declaration.
+        assertFalse(mCarPm.isActivityDistractionOptimized("android.car.cts",
+                "android.car.cts.drivingstate.NonDistractionOptimizedActivity"));
+    }
 }
diff --git a/tests/tests/car/src/android/car/cts/drivingstate/DistractionOptimizedActivity.java b/tests/tests/car/src/android/car/cts/drivingstate/DistractionOptimizedActivity.java
new file mode 100644
index 0000000..00440b6
--- /dev/null
+++ b/tests/tests/car/src/android/car/cts/drivingstate/DistractionOptimizedActivity.java
@@ -0,0 +1,6 @@
+package android.car.cts.drivingstate;
+
+import android.app.Activity;
+
+public class DistractionOptimizedActivity extends Activity {
+}
\ No newline at end of file
diff --git a/tests/tests/car/src/android/car/cts/drivingstate/NonDistractionOptimizedActivity.java b/tests/tests/car/src/android/car/cts/drivingstate/NonDistractionOptimizedActivity.java
new file mode 100644
index 0000000..0c75a3a
--- /dev/null
+++ b/tests/tests/car/src/android/car/cts/drivingstate/NonDistractionOptimizedActivity.java
@@ -0,0 +1,6 @@
+package android.car.cts.drivingstate;
+
+import android.app.Activity;
+
+public class NonDistractionOptimizedActivity extends Activity {
+}
diff --git a/tests/tests/location/src/android/location/cts/TestMeasurementUtil.java b/tests/tests/location/src/android/location/cts/TestMeasurementUtil.java
index 222591b..26aedf8 100644
--- a/tests/tests/location/src/android/location/cts/TestMeasurementUtil.java
+++ b/tests/tests/location/src/android/location/cts/TestMeasurementUtil.java
@@ -68,6 +68,7 @@
     // android/hardware/libhardware/include/hardware/gps.h
     public static final Set<Integer> GNSS_NAVIGATION_MESSAGE_TYPE =
         new HashSet<Integer>(Arrays.asList(
+            GnssNavigationMessage.TYPE_UNKNOWN,
             GnssNavigationMessage.TYPE_GPS_L1CA,
             GnssNavigationMessage.TYPE_GPS_L2CNAV,
             GnssNavigationMessage.TYPE_GPS_L5CNAV,
diff --git a/tests/tests/media/src/android/media/cts/DecoderTest.java b/tests/tests/media/src/android/media/cts/DecoderTest.java
index 2193d33..6192c0f 100755
--- a/tests/tests/media/src/android/media/cts/DecoderTest.java
+++ b/tests/tests/media/src/android/media/cts/DecoderTest.java
@@ -2442,7 +2442,19 @@
         // start decode loop
         MediaCodec.BufferInfo info = new MediaCodec.BufferInfo();
 
-        final long kTimeOutUs = 5000; // 5ms timeout
+        MediaFormat outFormat = codec.getOutputFormat();
+        long kTimeOutUs = 5000; // 5ms timeout
+        String outMime = format.getString(MediaFormat.KEY_MIME);
+        if ((surface == null) && (outMime != null) && outMime.startsWith("video/")) {
+            int outWidth = outFormat.getInteger(MediaFormat.KEY_WIDTH);
+            int outHeight = outFormat.getInteger(MediaFormat.KEY_HEIGHT);
+            // in the 4K decoding case in byte buffer mode, set kTimeOutUs to 10ms as decode may
+            // involve a memcpy
+            if (outWidth * outHeight >= 8000000) {
+                kTimeOutUs = 10000;
+            }
+        }
+
         boolean sawInputEOS = false;
         boolean sawOutputEOS = false;
         int deadDecoderCounter = 0;
diff --git a/tests/tests/os/src/android/os/cts/EnvironmentTest.java b/tests/tests/os/src/android/os/cts/EnvironmentTest.java
index 6f259c3..0f2ac62 100644
--- a/tests/tests/os/src/android/os/cts/EnvironmentTest.java
+++ b/tests/tests/os/src/android/os/cts/EnvironmentTest.java
@@ -81,14 +81,17 @@
         // inodes can result in wasted space.
         final long maxsize = stat.f_blocks * stat.f_frsize;
         final long maxInodes = maxsize / 4096;
-        final long minsize = stat.f_bavail * stat.f_frsize;
-        final long minInodes = minsize / 32768;
+        // Assuming the smallest storage would be 4GB, min # of free inodes
+        // in EXT4/F2FS must be larger than 128k for Android to work properly.
+        final long minInodes = 128 * 1024;
 
-        if (stat.f_ffree >= minInodes && stat.f_ffree <= maxInodes) {
+        if (stat.f_ffree >= minInodes && stat.f_ffree <= maxInodes
+            && stat.f_favail <= stat.f_ffree) {
             // Sweet, sounds great!
         } else {
-            fail("Number of inodes " + stat.f_ffree + " not within sane range for partition of "
-                    + minsize + "," + maxsize + " bytes; expected [" + minInodes + "," + maxInodes + "]");
+            fail("Number of inodes " + stat.f_ffree + "/" + stat.f_favail
+              + " not within sane range for partition of " + maxsize + " bytes; expected ["
+              + minInodes + "," + maxInodes + "]");
         }
     }
 }
diff --git a/tests/tests/view/src/android/view/cts/WindowTest.java b/tests/tests/view/src/android/view/cts/WindowTest.java
index 41ad595..94b3ceb 100644
--- a/tests/tests/view/src/android/view/cts/WindowTest.java
+++ b/tests/tests/view/src/android/view/cts/WindowTest.java
@@ -704,8 +704,6 @@
                 mPresentation.button1.getWidth() / 2,
                 mPresentation.button1.getY() + mPresentation.button1.getHeight() / 2);
         assertTrue(waitingSemaphore.tryAcquire(5, TimeUnit.SECONDS));
-
-        destroyPresentation();
     }
 
     private void checkPresentationButtonFocus(final boolean button1Focused,
diff --git a/tests/tests/webkit/src/android/webkit/cts/WebViewSslTest.java b/tests/tests/webkit/src/android/webkit/cts/WebViewSslTest.java
index 688fc33..08de524 100644
--- a/tests/tests/webkit/src/android/webkit/cts/WebViewSslTest.java
+++ b/tests/tests/webkit/src/android/webkit/cts/WebViewSslTest.java
@@ -731,12 +731,23 @@
         mOnUiThread.clearSslPreferences();
         mOnUiThread.loadUrlAndWaitForCompletion(url);
         // Page NOT loaded OK...
-        // In this case, we must NOT have received the onReceivedSslError callback as that is for
-        // recoverable (e.g. server auth) errors, whereas failing mandatory client auth is non-
-        // recoverable and should drop straight through to a load error.
-        assertFalse(webViewClient.wasOnReceivedSslErrorCalled());
-        assertFalse(TestHtmlConstants.HELLO_WORLD_TITLE.equals(mOnUiThread.getTitle()));
-        assertEquals(WebViewClient.ERROR_FAILED_SSL_HANDSHAKE, webViewClient.onReceivedErrorCode());
+        //
+        // In this test, we expect both a recoverable and non-recoverable error:
+        //
+        //  1. WebView does not trust the test server's certificate. This is a recoverable error, so
+        //     WebView invokes #onReceivedSslError (and the WebViewClient calls #proceed). We don't
+        //     specifically intend to test this part of the scenario, but we can't easily mock out
+        //     WebView's certificate roots.
+        //  2. WebView proceeds with the handshake without providing client authentication. The
+        //     server fails the client. This is non-recoverable, so WebView invokes
+        //     #onReceivedError.
+        //
+        // We only assert the second error, since earlier WebView versions had a bug in which
+        // WebView hit error 2 first, which prevented it from hitting error 1.
+        assertFalse("Title should not be updated, since page load should have failed",
+                TestHtmlConstants.HELLO_WORLD_TITLE.equals(mOnUiThread.getTitle()));
+        assertEquals("Expected ERROR_FAILED_SSL_HANDSHAKE in onReceivedError",
+                WebViewClient.ERROR_FAILED_SSL_HANDSHAKE, webViewClient.onReceivedErrorCode());
     }
 
     public void testProceedClientCertRequest() throws Throwable {