Merge "DeviceInfo: Collect hidden physical camera characteristics" into rvc-dev
diff --git a/hostsidetests/appsecurity/src/android/appsecurity/cts/DocumentsTest.java b/hostsidetests/appsecurity/src/android/appsecurity/cts/DocumentsTest.java
index fc63925..fc97c75 100644
--- a/hostsidetests/appsecurity/src/android/appsecurity/cts/DocumentsTest.java
+++ b/hostsidetests/appsecurity/src/android/appsecurity/cts/DocumentsTest.java
@@ -28,6 +28,7 @@
  */
 public class DocumentsTest extends DocumentsTestCase {
     private static final String PROVIDER_PKG = "com.android.cts.documentprovider";
+    private static final String DUMMYIME_PKG = "com.android.cts.dummyime";
     private static final String PROVIDER_APK = "CtsDocumentProvider.apk";
     private static final String DUMMYIME_APK = "CtsDummyIme.apk";
 
@@ -48,7 +49,7 @@
         super.tearDown();
 
         getDevice().uninstallPackage(PROVIDER_PKG);
-        getDevice().uninstallPackage(DUMMYIME_APK);
+        getDevice().uninstallPackage(DUMMYIME_PKG);
     }
 
     public void testOpenSimple() throws Exception {
diff --git a/hostsidetests/appsecurity/test-apps/DocumentClient/src/com/android/cts/documentclient/DocumentsClientTest.java b/hostsidetests/appsecurity/test-apps/DocumentClient/src/com/android/cts/documentclient/DocumentsClientTest.java
index 40d8ff4..03746fe 100644
--- a/hostsidetests/appsecurity/test-apps/DocumentClient/src/com/android/cts/documentclient/DocumentsClientTest.java
+++ b/hostsidetests/appsecurity/test-apps/DocumentClient/src/com/android/cts/documentclient/DocumentsClientTest.java
@@ -713,6 +713,7 @@
 
         final Uri rootsUri = DocumentsContract.buildRootsUri(PROVIDER_PACKAGE);
         final Intent intent = new Intent(Intent.ACTION_VIEW);
+        intent.setPackage(getDocumentsUiPackageId());
         intent.setDataAndType(rootsUri, "vnd.android.document/root");
         mActivity.startActivity(intent);
         mDevice.waitForIdle();
diff --git a/hostsidetests/hdmicec/src/android/hdmicec/cts/CecMessage.java b/hostsidetests/hdmicec/src/android/hdmicec/cts/CecMessage.java
index 6437ec0..8d4ece1 100644
--- a/hostsidetests/hdmicec/src/android/hdmicec/cts/CecMessage.java
+++ b/hostsidetests/hdmicec/src/android/hdmicec/cts/CecMessage.java
@@ -67,4 +67,15 @@
     private CecMessage(int messageId) {
         this.messageId = messageId;
     }
+
+    public static String formatParams(long rawParam) {
+        StringBuilder params = new StringBuilder("");
+
+        do {
+            params.insert(0, ":" + String.format("%02x", rawParam % 256));
+            rawParam >>= 8;
+        } while (rawParam > 0);
+
+        return params.toString();
+    }
 }
diff --git a/hostsidetests/hdmicec/src/android/hdmicec/cts/playback/HdmiCecSystemAudioControlTest.java b/hostsidetests/hdmicec/src/android/hdmicec/cts/playback/HdmiCecSystemAudioControlTest.java
index 3ac2e5f..5162a27 100644
--- a/hostsidetests/hdmicec/src/android/hdmicec/cts/playback/HdmiCecSystemAudioControlTest.java
+++ b/hostsidetests/hdmicec/src/android/hdmicec/cts/playback/HdmiCecSystemAudioControlTest.java
@@ -64,6 +64,8 @@
     @Test
     public void cect_11_2_15_11_VolumeUpDownUserControlPressed() throws Exception {
         ITestDevice device = getDevice();
+        hdmiCecClient.sendCecMessage(CecDevice.AUDIO_SYSTEM, CecDevice.BROADCAST,
+                CecMessage.SET_SYSTEM_AUDIO_MODE, CecMessage.formatParams(1));
         device.executeShellCommand("input keyevent KEYCODE_VOLUME_UP");
         String message = hdmiCecClient.checkExpectedOutput(CecDevice.AUDIO_SYSTEM,
                 CecMessage.USER_CONTROL_PRESSED);
@@ -89,7 +91,9 @@
     @Test
     public void cect_11_2_15_12_MuteUserControlPressed() throws Exception {
         ITestDevice device = getDevice();
-        device.executeShellCommand("input keyevent KEYCODE_MUTE");
+        hdmiCecClient.sendCecMessage(CecDevice.AUDIO_SYSTEM, CecDevice.BROADCAST,
+                CecMessage.SET_SYSTEM_AUDIO_MODE, CecMessage.formatParams(1));
+        device.executeShellCommand("input keyevent KEYCODE_VOLUME_MUTE");
         String message = hdmiCecClient.checkExpectedOutput(CecDevice.AUDIO_SYSTEM,
                 CecMessage.USER_CONTROL_PRESSED);
         assertEquals(HdmiCecConstants.CEC_CONTROL_MUTE,
diff --git a/hostsidetests/packagemanager/dynamicmime/test/src/android/dynamicmime/testapp/preferred/PreferredActivitiesTest.java b/hostsidetests/packagemanager/dynamicmime/test/src/android/dynamicmime/testapp/preferred/PreferredActivitiesTest.java
index eb1a474..c9e25b0 100644
--- a/hostsidetests/packagemanager/dynamicmime/test/src/android/dynamicmime/testapp/preferred/PreferredActivitiesTest.java
+++ b/hostsidetests/packagemanager/dynamicmime/test/src/android/dynamicmime/testapp/preferred/PreferredActivitiesTest.java
@@ -28,8 +28,10 @@
 
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertNull;
+import static org.junit.Assume.assumeTrue;
 
 import android.content.Intent;
+import android.content.res.Resources;
 import android.dynamicmime.testapp.BaseDynamicMimeTest;
 import android.dynamicmime.testapp.assertions.MimeGroupAssertions;
 import android.dynamicmime.testapp.commands.MimeGroupCommands;
@@ -52,6 +54,9 @@
 
 @RunWith(AndroidJUnit4.class)
 public class PreferredActivitiesTest extends BaseDynamicMimeTest {
+    private static final String NAV_BAR_INTERACTION_MODE_RES_NAME = "config_navBarInteractionMode";
+    private static final int NAV_BAR_INTERACTION_MODE_GESTURAL = 2;
+
     private static final BySelector BUTTON_ALWAYS = By.res("android:id/button_always");
     private static final BySelector RESOLVER_DIALOG = By.res("android:id/contentPanel");
 
@@ -66,6 +71,17 @@
     @Before
     public void setUp() {
         Utils.installApk(APK_PREFERRED_APP);
+        assumeNavigationMode();
+    }
+
+    private void assumeNavigationMode() {
+        Resources res = context().getResources();
+        int navModeResId = res.getIdentifier(NAV_BAR_INTERACTION_MODE_RES_NAME, "integer",
+                "android");
+        int navMode = res.getInteger(navModeResId);
+
+        assumeTrue("Non-gesture navigation mode required",
+                navMode != NAV_BAR_INTERACTION_MODE_GESTURAL);
     }
 
     @After
diff --git a/hostsidetests/settings/app/DeviceOwnerApp/src/com/google/android/cts/deviceowner/DeviceOwnerTest.java b/hostsidetests/settings/app/DeviceOwnerApp/src/com/google/android/cts/deviceowner/DeviceOwnerTest.java
index 842d83a..3442ce1 100644
--- a/hostsidetests/settings/app/DeviceOwnerApp/src/com/google/android/cts/deviceowner/DeviceOwnerTest.java
+++ b/hostsidetests/settings/app/DeviceOwnerApp/src/com/google/android/cts/deviceowner/DeviceOwnerTest.java
@@ -77,6 +77,13 @@
         } catch (RemoteException e) {
             throw new RuntimeException("failed to freeze device orientation", e);
         }
+        wakeupDeviceAndPressHome();
+    }
+
+    private void wakeupDeviceAndPressHome() throws Exception {
+        mDevice.wakeUp();
+        mDevice.pressMenu();
+        mDevice.pressHome();
     }
 
     @Override
diff --git a/hostsidetests/statsd/src/android/cts/statsd/atom/AtomTestCase.java b/hostsidetests/statsd/src/android/cts/statsd/atom/AtomTestCase.java
index 51e24ea..317c0d4 100644
--- a/hostsidetests/statsd/src/android/cts/statsd/atom/AtomTestCase.java
+++ b/hostsidetests/statsd/src/android/cts/statsd/atom/AtomTestCase.java
@@ -241,7 +241,8 @@
           .addAllowedLogSource("AID_STATSD")
           .addAllowedLogSource(DeviceAtomTestCase.DEVICE_SIDE_TEST_PACKAGE)
           .addDefaultPullPackages("AID_RADIO")
-          .addDefaultPullPackages("AID_SYSTEM");
+          .addDefaultPullPackages("AID_SYSTEM")
+          .addWhitelistedAtomIds(Atom.APP_BREADCRUMB_REPORTED_FIELD_NUMBER);
     }
 
     protected void createAndUploadConfig(int atomTag) throws Exception {
diff --git a/libs/install/src/com/android/cts/install/lib/TestApp.java b/libs/install/src/com/android/cts/install/lib/TestApp.java
index bf7aa1e..cb77517 100644
--- a/libs/install/src/com/android/cts/install/lib/TestApp.java
+++ b/libs/install/src/com/android/cts/install/lib/TestApp.java
@@ -81,21 +81,33 @@
         mGetResourceStream = (res) -> TestApp.class.getClassLoader().getResourceAsStream(res);
     }
 
-    public TestApp(String name, String packageName, long versionCode, boolean isApex, File path) {
+    public TestApp(String name, String packageName, long versionCode, boolean isApex,
+            File[] paths) {
         mName = name;
         mPackageName = packageName;
         mVersionCode = versionCode;
-        mResourceNames = new String[] { path.getName() };
+        mResourceNames = new String[paths.length];
+        for (int i = 0; i < paths.length; ++i) {
+            mResourceNames[i] = paths[i].getName();
+        }
         mIsApex = isApex;
         mGetResourceStream = (res) -> {
             try {
-                return new FileInputStream(path);
-            } catch (FileNotFoundException e) {
-                return null;
+                for (int i = 0; i < paths.length; ++i) {
+                    if (paths[i].getName().equals(res)) {
+                        return new FileInputStream(paths[i]);
+                    }
+                }
+            } catch (FileNotFoundException ignore) {
             }
+            return null;
         };
     }
 
+    public TestApp(String name, String packageName, long versionCode, boolean isApex, File path) {
+        this(name, packageName, versionCode, isApex, new File[]{ path });
+    }
+
     public String getPackageName() {
         return mPackageName;
     }
diff --git a/tests/BlobStore/src/com/android/cts/blob/BlobStoreManagerTest.java b/tests/BlobStore/src/com/android/cts/blob/BlobStoreManagerTest.java
index 3599107..bb86844 100644
--- a/tests/BlobStore/src/com/android/cts/blob/BlobStoreManagerTest.java
+++ b/tests/BlobStore/src/com/android/cts/blob/BlobStoreManagerTest.java
@@ -65,6 +65,7 @@
 import java.io.OutputStream;
 import java.nio.charset.StandardCharsets;
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.Map;
 import java.util.Objects;
 import java.util.Random;
@@ -1621,6 +1622,72 @@
         }, Pair.create(KEY_MAX_BLOB_ACCESS_PERMITTED_PACKAGES, String.valueOf(1)));
     }
 
+    @Test
+    public void testBlobHandleEquality() throws Exception {
+        // Check that BlobHandle objects are considered equal when digest, label, expiry time
+        // and tag are equal.
+        {
+            final BlobHandle blobHandle1 = BlobHandle.createWithSha256("digest".getBytes(),
+                    "Dummy blob", 1111L, "tag");
+            final BlobHandle blobHandle2 = BlobHandle.createWithSha256("digest".getBytes(),
+                    "Dummy blob", 1111L, "tag");
+            assertThat(blobHandle1).isEqualTo(blobHandle2);
+        }
+
+        // Check that BlobHandle objects are not equal if digests are not equal.
+        {
+            final BlobHandle blobHandle1 = BlobHandle.createWithSha256("digest1".getBytes(),
+                    "Dummy blob", 1111L, "tag");
+            final BlobHandle blobHandle2 = BlobHandle.createWithSha256("digest2".getBytes(),
+                    "Dummy blob", 1111L, "tag");
+            assertThat(blobHandle1).isNotEqualTo(blobHandle2);
+        }
+
+        // Check that BlobHandle objects are not equal if expiry times are not equal.
+        {
+            final BlobHandle blobHandle1 = BlobHandle.createWithSha256("digest".getBytes(),
+                    "Dummy blob", 1111L, "tag");
+            final BlobHandle blobHandle2 = BlobHandle.createWithSha256("digest".getBytes(),
+                    "Dummy blob", 1112L, "tag");
+            assertThat(blobHandle1).isNotEqualTo(blobHandle2);
+        }
+
+        // Check that BlobHandle objects are not equal if labels are not equal.
+        {
+            final BlobHandle blobHandle1 = BlobHandle.createWithSha256("digest".getBytes(),
+                    "Dummy blob1", 1111L, "tag");
+            final BlobHandle blobHandle2 = BlobHandle.createWithSha256("digest".getBytes(),
+                    "Dummy blob2", 1111L, "tag");
+            assertThat(blobHandle1).isNotEqualTo(blobHandle2);
+        }
+
+        // Check that BlobHandle objects are not equal if tags are not equal.
+        {
+            final BlobHandle blobHandle1 = BlobHandle.createWithSha256("digest".getBytes(),
+                    "Dummy blob", 1111L, "tag1");
+            final BlobHandle blobHandle2 = BlobHandle.createWithSha256("digest".getBytes(),
+                    "Dummy blob", 1111L, "tag2");
+            assertThat(blobHandle1).isNotEqualTo(blobHandle2);
+        }
+    }
+
+    @Test
+    public void testBlobHandleCreation() throws Exception {
+        // Creating a BlobHandle with label > 100 chars will fail
+        {
+            final CharSequence label = String.join("", Collections.nCopies(101, "a"));
+            assertThrows(IllegalArgumentException.class,
+                    () -> BlobHandle.createWithSha256("digest".getBytes(), label, 1111L, "tag"));
+        }
+
+        // Creating a BlobHandle with tag > 128 chars will fail
+        {
+            final String tag = String.join("", Collections.nCopies(129, "a"));
+            assertThrows(IllegalArgumentException.class,
+                    () -> BlobHandle.createWithSha256("digest".getBytes(), "label", 1111L, tag));
+        }
+    }
+
     private static void runWithKeyValues(ThrowingRunnable runnable,
             Pair<String, String>... keyValues) throws Exception {
         final Map<String, String> previousValues = new ArrayMap();
diff --git a/tests/accessibilityservice/src/android/accessibilityservice/cts/TouchExplorerTest.java b/tests/accessibilityservice/src/android/accessibilityservice/cts/TouchExplorerTest.java
index 56d5240..80a3054 100644
--- a/tests/accessibilityservice/src/android/accessibilityservice/cts/TouchExplorerTest.java
+++ b/tests/accessibilityservice/src/android/accessibilityservice/cts/TouchExplorerTest.java
@@ -291,28 +291,6 @@
     }
 
     /**
-     * Test the case where we want to long click on the item that has accessibility focus. Note that
-     * this test does not request that double tap and hold be dispatched to the accessibility
-     * service, meaning that it will be handled by the framework and the view will be long clicked.
-     */
-    @Test
-    @AppModeFull
-    public void testDoubleTapAndHoldAccessibilityFocus_performsLongClick() {
-        if (!mHasTouchscreen || !mScreenBigEnough) return;
-        syncAccessibilityFocusToInputFocus();
-        dispatch(doubleTapAndHold(mTapLocation));
-        mHoverListener.assertNonePropagated();
-        // The click should not be delivered via touch events in this case.
-        mTouchListener.assertNonePropagated();
-        mService.assertPropagated(
-                TYPE_VIEW_ACCESSIBILITY_FOCUSED,
-                TYPE_TOUCH_INTERACTION_START,
-                TYPE_VIEW_LONG_CLICKED,
-                TYPE_TOUCH_INTERACTION_END);
-        mLongClickListener.assertLongClicked(mView);
-    }
-
-    /**
      * Test the case where we double tap and hold but there is no accessibility focus. Nothing
      * should happen.
      */
diff --git a/tests/autofillservice/src/android/autofillservice/cts/inline/DatasetFilteringInlineTest.java b/tests/autofillservice/src/android/autofillservice/cts/inline/DatasetFilteringInlineTest.java
index e303321..036e744 100644
--- a/tests/autofillservice/src/android/autofillservice/cts/inline/DatasetFilteringInlineTest.java
+++ b/tests/autofillservice/src/android/autofillservice/cts/inline/DatasetFilteringInlineTest.java
@@ -22,11 +22,19 @@
 import android.autofillservice.cts.DatasetFilteringTest;
 import android.autofillservice.cts.Helper;
 
+import org.junit.rules.TestRule;
+
 public class DatasetFilteringInlineTest extends DatasetFilteringTest {
     public DatasetFilteringInlineTest() {
         super(getInlineUiBot());
     }
 
+
+    @Override
+    public TestRule getMainTestRule() {
+        return InlineUiBot.annotateRule(super.getMainTestRule());
+    }
+
     @Override
     protected boolean isInlineMode() {
         return true;
diff --git a/tests/autofillservice/src/android/autofillservice/cts/inline/InlineAugmentedLoginActivityTest.java b/tests/autofillservice/src/android/autofillservice/cts/inline/InlineAugmentedLoginActivityTest.java
index d645834..332c645 100644
--- a/tests/autofillservice/src/android/autofillservice/cts/inline/InlineAugmentedLoginActivityTest.java
+++ b/tests/autofillservice/src/android/autofillservice/cts/inline/InlineAugmentedLoginActivityTest.java
@@ -43,6 +43,7 @@
 import android.widget.EditText;
 
 import org.junit.Test;
+import org.junit.rules.TestRule;
 
 import java.util.List;
 
@@ -66,6 +67,11 @@
         };
     }
 
+    @Override
+    public TestRule getMainTestRule() {
+        return InlineUiBot.annotateRule(super.getMainTestRule());
+    }
+
     @Test
     public void testAugmentedAutoFill_oneDatasetThenFilled() throws Exception {
         // Set services
diff --git a/tests/autofillservice/src/android/autofillservice/cts/inline/InlineAuthenticationTest.java b/tests/autofillservice/src/android/autofillservice/cts/inline/InlineAuthenticationTest.java
index 43c2abc..5c63891 100644
--- a/tests/autofillservice/src/android/autofillservice/cts/inline/InlineAuthenticationTest.java
+++ b/tests/autofillservice/src/android/autofillservice/cts/inline/InlineAuthenticationTest.java
@@ -38,6 +38,7 @@
 import android.platform.test.annotations.AppModeFull;
 
 import org.junit.Test;
+import org.junit.rules.TestRule;
 
 import java.util.regex.Pattern;
 
@@ -61,6 +62,11 @@
         Helper.enableAutofillService(getContext(), SERVICE_NAME);
     }
 
+    @Override
+    public TestRule getMainTestRule() {
+        return InlineUiBot.annotateRule(super.getMainTestRule());
+    }
+
     @Test
     public void testDatasetAuthTwoFields() throws Exception {
         datasetAuthTwoFields(/* cancelFirstAttempt */ false);
diff --git a/tests/autofillservice/src/android/autofillservice/cts/inline/InlineFillEventHistoryTest.java b/tests/autofillservice/src/android/autofillservice/cts/inline/InlineFillEventHistoryTest.java
index feba57c..595b7ea 100644
--- a/tests/autofillservice/src/android/autofillservice/cts/inline/InlineFillEventHistoryTest.java
+++ b/tests/autofillservice/src/android/autofillservice/cts/inline/InlineFillEventHistoryTest.java
@@ -39,6 +39,7 @@
 import android.support.test.uiautomator.UiObject2;
 
 import org.junit.Test;
+import org.junit.rules.TestRule;
 
 import java.util.List;
 
@@ -62,6 +63,11 @@
         Helper.enableAutofillService(getContext(), SERVICE_NAME);
     }
 
+    @Override
+    public TestRule getMainTestRule() {
+        return InlineUiBot.annotateRule(super.getMainTestRule());
+    }
+
     @Test
     public void testOneDatasetAndSave() throws Exception {
         enableService();
diff --git a/tests/autofillservice/src/android/autofillservice/cts/inline/InlineFilteringTest.java b/tests/autofillservice/src/android/autofillservice/cts/inline/InlineFilteringTest.java
index e9675b1..c761d02 100644
--- a/tests/autofillservice/src/android/autofillservice/cts/inline/InlineFilteringTest.java
+++ b/tests/autofillservice/src/android/autofillservice/cts/inline/InlineFilteringTest.java
@@ -26,6 +26,7 @@
 import android.autofillservice.cts.Helper;
 
 import org.junit.Test;
+import org.junit.rules.TestRule;
 
 // TODO: Move any tests needed from here into DatasetFilteringInlineTest.
 /**
@@ -45,6 +46,11 @@
         Helper.enableAutofillService(getContext(), SERVICE_NAME);
     }
 
+    @Override
+    public TestRule getMainTestRule() {
+        return InlineUiBot.annotateRule(super.getMainTestRule());
+    }
+
     @Test
     public void testFiltering_filtersByPrefix() throws Exception {
         enableService();
diff --git a/tests/autofillservice/src/android/autofillservice/cts/inline/InlineLoginActivityTest.java b/tests/autofillservice/src/android/autofillservice/cts/inline/InlineLoginActivityTest.java
index eff7b97..6aff0d5 100644
--- a/tests/autofillservice/src/android/autofillservice/cts/inline/InlineLoginActivityTest.java
+++ b/tests/autofillservice/src/android/autofillservice/cts/inline/InlineLoginActivityTest.java
@@ -48,6 +48,7 @@
 import com.android.cts.mockime.MockImeSession;
 
 import org.junit.Test;
+import org.junit.rules.TestRule;
 
 public class InlineLoginActivityTest extends LoginActivityCommonTestCase {
 
@@ -67,6 +68,11 @@
         return true;
     }
 
+    @Override
+    public TestRule getMainTestRule() {
+        return InlineUiBot.annotateRule(super.getMainTestRule());
+    }
+
     @Test
     public void testAutofill_disjointDatasets() throws Exception {
         // Set service.
diff --git a/tests/autofillservice/src/android/autofillservice/cts/inline/InlineSimpleSaveActivityTest.java b/tests/autofillservice/src/android/autofillservice/cts/inline/InlineSimpleSaveActivityTest.java
index c2b5515..42f4f16 100644
--- a/tests/autofillservice/src/android/autofillservice/cts/inline/InlineSimpleSaveActivityTest.java
+++ b/tests/autofillservice/src/android/autofillservice/cts/inline/InlineSimpleSaveActivityTest.java
@@ -36,6 +36,7 @@
 import androidx.annotation.NonNull;
 
 import org.junit.Test;
+import org.junit.rules.TestRule;
 
 public class InlineSimpleSaveActivityTest
         extends AutoFillServiceTestCase.AutoActivityLaunch<SimpleSaveActivity> {
@@ -63,6 +64,11 @@
         };
     }
 
+    @Override
+    public TestRule getMainTestRule() {
+        return InlineUiBot.annotateRule(super.getMainTestRule());
+    }
+
     @Test
     public void testAutofillSave() throws Exception {
         // Set service.
diff --git a/tests/autofillservice/src/android/autofillservice/cts/inline/InlineUiBot.java b/tests/autofillservice/src/android/autofillservice/cts/inline/InlineUiBot.java
index ca8e473..af53383 100644
--- a/tests/autofillservice/src/android/autofillservice/cts/inline/InlineUiBot.java
+++ b/tests/autofillservice/src/android/autofillservice/cts/inline/InlineUiBot.java
@@ -21,14 +21,19 @@
 import static android.autofillservice.cts.Timeouts.UI_TIMEOUT;
 
 import android.autofillservice.cts.UiBot;
+import android.content.pm.PackageManager;
 import android.support.test.uiautomator.By;
 import android.support.test.uiautomator.BySelector;
 import android.support.test.uiautomator.Direction;
 import android.support.test.uiautomator.UiObject2;
 
+import com.android.compatibility.common.util.RequiredFeatureRule;
 import com.android.compatibility.common.util.Timeout;
 import com.android.cts.mockime.MockIme;
 
+import org.junit.rules.RuleChain;
+import org.junit.rules.TestRule;
+
 /**
  * UiBot for the inline suggestion.
  */
@@ -39,6 +44,9 @@
 
     private static final BySelector SUGGESTION_STRIP_SELECTOR = By.desc(SUGGESTION_STRIP_DESC);
 
+    private static final RequiredFeatureRule REQUIRES_IME_RULE = new RequiredFeatureRule(
+            PackageManager.FEATURE_INPUT_METHODS);
+
     public InlineUiBot() {
         this(UI_TIMEOUT);
     }
@@ -47,6 +55,10 @@
         super(defaultTimeout);
     }
 
+    public static RuleChain annotateRule(TestRule rule) {
+        return RuleChain.outerRule(REQUIRES_IME_RULE).around(rule);
+    }
+
     @Override
     public void assertNoDatasets() throws Exception {
         assertNoDatasetsEver();
diff --git a/tests/autofillservice/src/android/autofillservice/cts/inline/InlineWebViewActivityTest.java b/tests/autofillservice/src/android/autofillservice/cts/inline/InlineWebViewActivityTest.java
index d5f0503..63cf648 100644
--- a/tests/autofillservice/src/android/autofillservice/cts/inline/InlineWebViewActivityTest.java
+++ b/tests/autofillservice/src/android/autofillservice/cts/inline/InlineWebViewActivityTest.java
@@ -40,6 +40,7 @@
 import android.view.ViewStructure.HtmlInfo;
 
 import org.junit.Test;
+import org.junit.rules.TestRule;
 
 public class InlineWebViewActivityTest extends AbstractWebViewTestCase<WebViewActivity> {
 
@@ -77,6 +78,11 @@
         return true;
     }
 
+    @Override
+    public TestRule getMainTestRule() {
+        return InlineUiBot.annotateRule(super.getMainTestRule());
+    }
+
     @Test
     public void testAutofillNoDatasets() throws Exception {
         // Set service.
diff --git a/tests/framework/base/windowmanager/src/android/server/wm/SurfaceControlTest.java b/tests/framework/base/windowmanager/src/android/server/wm/SurfaceControlTest.java
index e3566b9..d0aa669 100644
--- a/tests/framework/base/windowmanager/src/android/server/wm/SurfaceControlTest.java
+++ b/tests/framework/base/windowmanager/src/android/server/wm/SurfaceControlTest.java
@@ -102,7 +102,7 @@
     public void testSameSurface() {
         final SurfaceControl.Builder b = new SurfaceControl.Builder();
         final SurfaceControl sc = b.setName("CTS").build();
-        SurfaceControl copy = new SurfaceControl(sc);
+        SurfaceControl copy = new SurfaceControl(sc, "SurfaceControlTest.testSameSurface");
         assertTrue(copy.isSameSurface(sc));
         sc.release();
         copy.release();
diff --git a/tests/tests/content/HelloWorldApp/AndroidManifest.xml b/tests/tests/content/HelloWorldApp/AndroidManifest.xml
index f7c6c23..f195701 100644
--- a/tests/tests/content/HelloWorldApp/AndroidManifest.xml
+++ b/tests/tests/content/HelloWorldApp/AndroidManifest.xml
@@ -4,6 +4,7 @@
 
     <application
         android:allowBackup="true"
+        android:debuggable="true"
         android:icon="@mipmap/ic_launcher"
         android:label="@string/app_name"
         android:roundIcon="@mipmap/ic_launcher_round"
diff --git a/tests/tests/media/src/android/media/cts/DecoderTest.java b/tests/tests/media/src/android/media/cts/DecoderTest.java
index 62c6012..8c90275 100644
--- a/tests/tests/media/src/android/media/cts/DecoderTest.java
+++ b/tests/tests/media/src/android/media/cts/DecoderTest.java
@@ -35,6 +35,7 @@
 import android.media.MediaCodecInfo.CodecCapabilities;
 import android.media.MediaExtractor;
 import android.media.MediaFormat;
+import android.os.Build;
 import android.platform.test.annotations.AppModeFull;
 import android.util.Log;
 import android.view.Display;
@@ -42,6 +43,7 @@
 import android.net.Uri;
 import android.os.Bundle;
 
+import com.android.compatibility.common.util.ApiLevelUtil;
 import com.android.compatibility.common.util.CddTest;
 import com.android.compatibility.common.util.DeviceReportLog;
 import com.android.compatibility.common.util.DynamicConfigDeviceSide;
@@ -50,6 +52,8 @@
 import com.android.compatibility.common.util.ResultType;
 import com.android.compatibility.common.util.ResultUnit;
 
+import androidx.test.filters.SdkSuppress;
+
 import java.io.BufferedInputStream;
 import java.io.IOException;
 import java.io.InputStream;
@@ -70,6 +74,7 @@
 public class DecoderTest extends MediaPlayerTestBase {
     private static final String TAG = "DecoderTest";
     private static final String REPORT_LOG_NAME = "CtsMediaTestCases";
+    private static boolean mIsAtLeastR = ApiLevelUtil.isAtLeast(Build.VERSION_CODES.R);
 
     private static final int RESET_MODE_NONE = 0;
     private static final int RESET_MODE_RECONFIGURE = 1;
@@ -274,6 +279,8 @@
     private void verifyChannelsAndRates(String[] mimetypes, int[] sampleRates,
                                        int[] channelMasks) throws Exception {
 
+        if (!MediaUtils.check(mIsAtLeastR, "test invalid before Android 11")) return;
+
         for (String mimetype : mimetypes) {
             // ensure we find a codec for all listed mime/channel/rate combinations
             MediaCodecList mcl = new MediaCodecList(MediaCodecList.ALL_CODECS);
@@ -3579,6 +3586,7 @@
         return pm.hasSystemFeature(PackageManager.FEATURE_VR_MODE_HIGH_PERFORMANCE);
     }
 
+    @SdkSuppress(minSdkVersion = Build.VERSION_CODES.R)
     public void testLowLatencyVp9At1280x720() throws Exception {
         testLowLatencyVideo(
                 R.raw.video_1280x720_webm_vp9_csd_309kbps_25fps_vorbis_stereo_128kbps_48000hz, 300,
@@ -3588,6 +3596,7 @@
                 true /* useNdk */);
     }
 
+    @SdkSuppress(minSdkVersion = Build.VERSION_CODES.R)
     public void testLowLatencyVp9At1920x1080() throws Exception {
         testLowLatencyVideo(
                 R.raw.bbb_s2_1920x1080_webm_vp9_0p41_10mbps_60fps_vorbis_6ch_384kbps_22050hz, 300,
@@ -3597,6 +3606,7 @@
                 true /* useNdk */);
     }
 
+    @SdkSuppress(minSdkVersion = Build.VERSION_CODES.R)
     public void testLowLatencyVp9At3840x2160() throws Exception {
         testLowLatencyVideo(
                 R.raw.bbb_s2_3840x2160_webm_vp9_0p51_20mbps_60fps_vorbis_6ch_384kbps_32000hz, 300,
diff --git a/tests/tests/permission/src/android/permission/cts/PermissionGroupChange.java b/tests/tests/permission/src/android/permission/cts/PermissionGroupChange.java
index 1466cb8..37a448b 100644
--- a/tests/tests/permission/src/android/permission/cts/PermissionGroupChange.java
+++ b/tests/tests/permission/src/android/permission/cts/PermissionGroupChange.java
@@ -30,7 +30,9 @@
 import android.content.Intent;
 import android.content.pm.PackageInfo;
 import android.content.pm.PackageManager;
+import android.content.res.Resources;
 import android.platform.test.annotations.SecurityTest;
+import android.support.test.uiautomator.By;
 import android.support.test.uiautomator.UiDevice;
 import android.support.test.uiautomator.UiScrollable;
 import android.support.test.uiautomator.UiSelector;
@@ -53,6 +55,7 @@
 
     private Context mContext;
     private UiDevice mUiDevice;
+    private String mAllowButtonText = null;
 
     @Before
     public void setContextAndUiDevice() {
@@ -100,8 +103,15 @@
     }
 
     protected void clickAllowButton() throws Exception {
-        mUiDevice.findObject(new UiSelector().resourceId(
-                "com.android.permissioncontroller:id/permission_allow_button")).click();
+        if (mContext.getPackageManager().hasSystemFeature(PackageManager.FEATURE_AUTOMOTIVE)) {
+            if (mAllowButtonText == null) {
+                mAllowButtonText = getPermissionControllerString("grant_dialog_button_allow");
+            }
+            mUiDevice.findObject(By.text(mAllowButtonText)).click();
+        } else {
+            mUiDevice.findObject(By.res(
+                    "com.android.permissioncontroller:id/permission_allow_button")).click();
+        }
     }
 
     private void grantPermissionViaUi() throws Throwable {
@@ -174,6 +184,15 @@
         }
     }
 
+    private String getPermissionControllerString(String res)
+            throws PackageManager.NameNotFoundException {
+        Resources permissionControllerResources = mContext.createPackageContext(
+                mContext.getPackageManager().getPermissionControllerPackageName(), 0)
+                .getResources();
+        return permissionControllerResources.getString(permissionControllerResources
+                .getIdentifier(res, "string", "com.android.permissioncontroller"));
+    }
+
     private interface ThrowingRunnable {
         void run() throws Throwable;
     }
diff --git a/tests/tests/permission3/src/android/permission3/cts/BasePermissionTest.kt b/tests/tests/permission3/src/android/permission3/cts/BasePermissionTest.kt
index f4f97f71..5cd5c4f 100644
--- a/tests/tests/permission3/src/android/permission3/cts/BasePermissionTest.kt
+++ b/tests/tests/permission3/src/android/permission3/cts/BasePermissionTest.kt
@@ -21,10 +21,6 @@
 import android.content.Context
 import android.content.Intent
 import android.content.pm.PackageManager
-import android.content.pm.PackageManager.MATCH_DIRECT_BOOT_AWARE
-import android.content.pm.PackageManager.MATCH_DIRECT_BOOT_UNAWARE
-import android.content.pm.PackageManager.MATCH_SYSTEM_ONLY
-import android.content.pm.ResolveInfo
 import android.content.res.Resources
 import android.provider.Settings
 import android.support.test.uiautomator.By
@@ -58,7 +54,7 @@
     protected val uiDevice: UiDevice = UiDevice.getInstance(instrumentation)
     protected val packageManager: PackageManager = context.packageManager
     private val mPermissionControllerResources: Resources = context.createPackageContext(
-            getPermissionControllerPackageName(), 0).resources
+            context.packageManager.permissionControllerPackageName, 0).resources
 
     @get:Rule
     val activityRule = ActivityTestRule(StartForFutureActivity::class.java, false, false)
@@ -98,23 +94,6 @@
             mPermissionControllerResources.getString(mPermissionControllerResources
                     .getIdentifier(res, "string", "com.android.permissioncontroller"))
 
-    private fun getPermissionControllerPackageName(): String {
-        val intent = Intent("android.intent.action.MANAGE_PERMISSIONS")
-        intent.addCategory(Intent.CATEGORY_DEFAULT)
-        val packageManager: PackageManager = context.getPackageManager()
-        val matches: List<ResolveInfo> = packageManager.queryIntentActivities(intent,
-                MATCH_SYSTEM_ONLY or MATCH_DIRECT_BOOT_AWARE or MATCH_DIRECT_BOOT_UNAWARE)
-        return if (matches.size == 1) {
-            val resolveInfo: ResolveInfo = matches[0]
-            if (!resolveInfo.activityInfo.applicationInfo.isPrivilegedApp()) {
-                throw RuntimeException("The permissions manager must be a privileged app")
-            }
-            matches[0].activityInfo.packageName
-        } else {
-            throw RuntimeException("There must be exactly one permissions manager; found $matches")
-        }
-    }
-
     protected fun installPackage(
         apkPath: String,
         reinstall: Boolean = false,