diff --git a/apps/CameraITS/tests/scene1/test_raw_exposure.py b/apps/CameraITS/tests/scene1/test_raw_exposure.py
index fa3c9ff..437b63f 100644
--- a/apps/CameraITS/tests/scene1/test_raw_exposure.py
+++ b/apps/CameraITS/tests/scene1/test_raw_exposure.py
@@ -26,8 +26,9 @@
 NUM_ISO_STEPS = 5
 SATURATION_TOL = 0.01
 BLK_LVL_TOL = 0.1
-# Test 3 steps per 2x exposure
-EXP_MULT = pow(2, 1.0/3)
+EXP_MULT_SHORT = pow(2, 1.0/3)  # Test 3 steps per 2x exposure
+EXP_MULT_LONG = pow(10, 1.0/3)  # Test 3 steps per 10x exposure
+EXP_LONG = 1E6  # 1ms
 INCREASING_THR = 0.99
 # slice captures into burst of SLICE_LEN requests
 SLICE_LEN = 10
@@ -67,7 +68,10 @@
         mult = 1.0
         while exp_min*mult < exp_max:
             e_test.append(int(exp_min*mult))
-            mult *= EXP_MULT
+            if exp_min*mult < EXP_LONG:
+                mult *= EXP_MULT_SHORT
+            else:
+                mult *= EXP_MULT_LONG
         if e_test[-1] < exp_max * INCREASING_THR:
             e_test.append(int(exp_max))
         e_test_ms = [e / 1000000.0 for e in e_test]
@@ -78,22 +82,21 @@
             reqs = [its.objects.manual_capture_request(s, e, 0) for e in e_test]
             # Capture raw in debug mode, rawStats otherwise
             caps = []
-            for i in range(len(reqs) / SLICE_LEN):
+            slice_len = SLICE_LEN
+            # Eliminate cap burst of 1: returns [[]], not [{}, ...]
+            while len(reqs) % slice_len == 1:
+                slice_len -= 1
+            # Break caps into smaller bursts
+            for i in range(len(reqs) / slice_len):
                 if debug:
-                    caps += cam.do_capture(reqs[i*SLICE_LEN:(i+1)*SLICE_LEN], cam.CAP_RAW)
+                    caps += cam.do_capture(reqs[i*slice_len:(i+1)*slice_len], cam.CAP_RAW)
                 else:
-                    caps += cam.do_capture(reqs[i*SLICE_LEN:(i+1)*SLICE_LEN], raw_stat_fmt)
-            last_n = len(reqs) % SLICE_LEN
-            if last_n == 1:
-                if debug:
-                    caps += [cam.do_capture(reqs[-last_n:], cam.CAP_RAW)]
-                else:
-                    caps += [cam.do_capture(reqs[-last_n:], raw_stat_fmt)]
-            elif last_n > 0:
-                if debug:
-                    caps += cam.do_capture(reqs[-last_n:], cam.CAP_RAW)
-                else:
-                    caps += cam.do_capture(reqs[-last_n:], raw_stat_fmt)
+                    caps += cam.do_capture(reqs[i*slice_len:(i+1)*slice_len], raw_stat_fmt)
+            last_n = len(reqs) % slice_len
+            if debug:
+                caps += cam.do_capture(reqs[-last_n:], cam.CAP_RAW)
+            else:
+                caps += cam.do_capture(reqs[-last_n:], raw_stat_fmt)
 
             # Measure the mean of each channel.
             # Each shot should be brighter (except underexposed/overexposed scene)
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/audio/peripheralprofile/ProfileManager.java b/apps/CtsVerifier/src/com/android/cts/verifier/audio/peripheralprofile/ProfileManager.java
index 043a280..a679c41 100644
--- a/apps/CtsVerifier/src/com/android/cts/verifier/audio/peripheralprofile/ProfileManager.java
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/audio/peripheralprofile/ProfileManager.java
@@ -49,7 +49,7 @@
             "<ProfileList Version=\"1.0.0\">" +
             "<PeripheralProfile ProfileName=\"AudioBox USB 96\" ProfileDescription=\"PreSonus AudioBox USB 96\" ProductName=\"USB-Audio - AudioBox USB 96\">" +
                 "<OutputDevInfo ChanCounts=\"2\" ChanPosMasks=\"12\" ChanIndexMasks=\"3\" Encodings=\"4\" SampleRates=\"44100,48000,88200,96000\"/>" +
-                "<InputDevInfo ChanCounts=\"1, 2\" ChanPosMasks=\"12, 16\" ChanIndexMasks=\"1,3\" Encodings=\"4\" SampleRates=\"44100,48000,88200,96000\"/>" +
+                "<InputDevInfo ChanCounts=\"1,2\" ChanPosMasks=\"12,16\" ChanIndexMasks=\"1,3\" Encodings=\"4\" SampleRates=\"44100,48000,88200,96000\"/>" +
             "</PeripheralProfile>" +
             "<PeripheralProfile ProfileName=\"AudioBox 44VSL\" ProfileDescription=\"Presonus AudioBox 44VSL\" ProductName=\"USB-Audio - AudioBox 44 VSL\">" +
                 "<OutputDevInfo ChanCounts=\"2,3,4\" ChanPosMasks=\"12\" ChanIndexMasks=\"3,7,15\" Encodings=\"4\" SampleRates=\"44100,48000,88200,96000\" />" +
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/camera/formats/CameraFormatsActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/camera/formats/CameraFormatsActivity.java
index 3421f65..07c598f 100755
--- a/apps/CtsVerifier/src/com/android/cts/verifier/camera/formats/CameraFormatsActivity.java
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/camera/formats/CameraFormatsActivity.java
@@ -110,29 +110,34 @@
     private static final int MENU_ID_PROGRESS = Menu.FIRST + 1;
 
     private class CameraCombination {
-        private final int cameraIndex;
-        private final int resolutionIndex;
-        private final int formatIndex;
+        private final int mCameraIndex;
+        private final int mResolutionIndex;
+        private final int mFormatIndex;
+        private final int mResolutionWidth;
+        private final int mResolutionHeight;
+        private final String mFormatName;
 
-        private CameraCombination(int cameraIndex, int resolutionIndex, int formatIndex) {
-            this.cameraIndex = cameraIndex;
-            this.resolutionIndex = resolutionIndex;
-            this.formatIndex = formatIndex;
+        private CameraCombination(int cameraIndex, int resolutionIndex, int formatIndex,
+            int resolutionWidth, int resolutionHeight, String formatName) {
+            this.mCameraIndex = cameraIndex;
+            this.mResolutionIndex = resolutionIndex;
+            this.mFormatIndex = formatIndex;
+            this.mResolutionWidth = resolutionWidth;
+            this.mResolutionHeight = resolutionHeight;
+            this.mFormatName = formatName;
         }
 
         @Override
         public String toString() {
-            return String.format("Camera %d, %dx%d, %s", cameraIndex,
-                mPreviewSizes.get(resolutionIndex).width,
-                mPreviewSizes.get(resolutionIndex).height,
-                mPreviewFormatNames.get(mPreviewFormats.get(formatIndex)));
+            return String.format("Camera %d, %dx%d, %s",
+                mCameraIndex, mResolutionWidth, mResolutionHeight, mFormatName);
         }
     }
 
     private static final Comparator<CameraCombination> COMPARATOR =
-        Comparator.<CameraCombination, Integer>comparing(c -> c.cameraIndex)
-            .thenComparing(c -> c.resolutionIndex)
-            .thenComparing(c -> c.formatIndex);
+        Comparator.<CameraCombination, Integer>comparing(c -> c.mCameraIndex)
+            .thenComparing(c -> c.mResolutionIndex)
+            .thenComparing(c -> c.mFormatIndex);
 
     @Override
     public void onCreate(Bundle savedInstanceState) {
@@ -211,7 +216,7 @@
      */
     private void setUntestedCombination() {
         Optional<CameraCombination> combination = mUntestedCombinations.stream().filter(
-            c -> c.cameraIndex == mCurrentCameraId).findFirst();
+            c -> c.mCameraIndex == mCurrentCameraId).findFirst();
         if (!combination.isPresent()) {
             Toast.makeText(this, "All Camera " + mCurrentCameraId + " tests are done.",
                 Toast.LENGTH_SHORT).show();
@@ -219,13 +224,13 @@
         }
 
         // There is untested combination for the current camera, set the next untested combination.
-        int mResolutionIndex = combination.get().resolutionIndex;
-        int mFormatIndex = combination.get().formatIndex;
+        int mNextResolutionIndex = combination.get().mResolutionIndex;
+        int mNextFormatIndex = combination.get().mFormatIndex;
 
-        mNextPreviewSize = mPreviewSizes.get(mResolutionIndex);
-        mResolutionSpinner.setSelection(mResolutionIndex);
-        mNextPreviewFormat = mPreviewFormats.get(mFormatIndex);
-        mFormatSpinner.setSelection(mFormatIndex);
+        mNextPreviewSize = mPreviewSizes.get(mNextResolutionIndex);
+        mResolutionSpinner.setSelection(mNextResolutionIndex);
+        mNextPreviewFormat = mPreviewFormats.get(mNextFormatIndex);
+        mFormatSpinner.setSelection(mNextFormatIndex);
     }
 
     @Override
@@ -423,7 +428,10 @@
         for (int resolutionIndex = 0; resolutionIndex < mPreviewSizes.size(); resolutionIndex++) {
             for (int formatIndex = 0; formatIndex < mPreviewFormats.size(); formatIndex++) {
                 CameraCombination combination = new CameraCombination(
-                    id, resolutionIndex, formatIndex);
+                    id, resolutionIndex, formatIndex,
+                    mPreviewSizes.get(resolutionIndex).width,
+                    mPreviewSizes.get(resolutionIndex).height,
+                    mPreviewFormatNames.get(mPreviewFormats.get(formatIndex)));
 
                 if (!mTestedCombinations.contains(combination)) {
                     mUntestedCombinations.add(combination);
@@ -628,7 +636,11 @@
                     CameraCombination combination = new CameraCombination(
                         mCurrentCameraId,
                         mResolutionSpinner.getSelectedItemPosition(),
-                        mFormatSpinner.getSelectedItemPosition());
+                        mFormatSpinner.getSelectedItemPosition(),
+                        mPreviewSizes.get(mResolutionSpinner.getSelectedItemPosition()).width,
+                        mPreviewSizes.get(mResolutionSpinner.getSelectedItemPosition()).height,
+                        mPreviewFormatNames.get(
+                            mPreviewFormats.get(mFormatSpinner.getSelectedItemPosition())));
 
                     mUntestedCombinations.remove(combination);
                     mTestedCombinations.add(combination);
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/managedprovisioning/DeviceOwnerPositiveTestActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/managedprovisioning/DeviceOwnerPositiveTestActivity.java
index 911e08a..93bb6a5 100644
--- a/apps/CtsVerifier/src/com/android/cts/verifier/managedprovisioning/DeviceOwnerPositiveTestActivity.java
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/managedprovisioning/DeviceOwnerPositiveTestActivity.java
@@ -186,17 +186,20 @@
         }
 
         // DISALLOW_AMBIENT_DISPLAY.
-        adapter.add(createInteractiveTestItem(this, DISALLOW_AMBIENT_DISPLAY_ID,
-                R.string.device_owner_disallow_ambient_display,
-                R.string.device_owner_disallow_ambient_display_info,
-                new ButtonInfo[] {
-                        new ButtonInfo(
-                                R.string.device_owner_user_restriction_set,
-                                CommandReceiverActivity.createSetUserRestrictionIntent(
-                                        UserManager.DISALLOW_AMBIENT_DISPLAY, true)),
-                        new ButtonInfo(
-                                R.string.device_owner_settings_go,
-                                new Intent(Settings.ACTION_DISPLAY_SETTINGS))}));
+        // TODO: After the ambient display feature flag is added in PackageManager (b/135591614),
+        // uncomment this test and run it only when ambient display is supported by the device.
+
+        // adapter.add(createInteractiveTestItem(this, DISALLOW_AMBIENT_DISPLAY_ID,
+        //         R.string.device_owner_disallow_ambient_display,
+        //         R.string.device_owner_disallow_ambient_display_info,
+        //         new ButtonInfo[] {
+        //                 new ButtonInfo(
+        //                         R.string.device_owner_user_restriction_set,
+        //                         CommandReceiverActivity.createSetUserRestrictionIntent(
+        //                                 UserManager.DISALLOW_AMBIENT_DISPLAY, true)),
+        //                 new ButtonInfo(
+        //                         R.string.device_owner_settings_go,
+        //                         new Intent(Settings.ACTION_DISPLAY_SETTINGS))}));
 
         // DISALLOW_CONFIG_VPN
         adapter.add(createInteractiveTestItem(this, DISALLOW_CONFIG_VPN_ID,
diff --git a/hostsidetests/appbinding/hostside/src/com/android/cts/appbinding/AppBindingHostTest.java b/hostsidetests/appbinding/hostside/src/com/android/cts/appbinding/AppBindingHostTest.java
old mode 100644
new mode 100755
index 327c9ab..87d90a3
--- a/hostsidetests/appbinding/hostside/src/com/android/cts/appbinding/AppBindingHostTest.java
+++ b/hostsidetests/appbinding/hostside/src/com/android/cts/appbinding/AppBindingHostTest.java
@@ -489,6 +489,11 @@
             return;
         }
 
+        if (!getDevice().isMultiUserSupported()) {
+            // device do not support multi-user.
+            return;
+        }
+
         installAndCheckBound(APK_1, PACKAGE_A, SERVICE_1, USER_SYSTEM);
 
         final int userId = getDevice().createUser("test-user");
diff --git a/hostsidetests/incident/src/com/android/server/cts/JobSchedulerIncidentTest.java b/hostsidetests/incident/src/com/android/server/cts/JobSchedulerIncidentTest.java
index 0430e58..9c8363c 100644
--- a/hostsidetests/incident/src/com/android/server/cts/JobSchedulerIncidentTest.java
+++ b/hostsidetests/incident/src/com/android/server/cts/JobSchedulerIncidentTest.java
@@ -185,7 +185,8 @@
         assertTrue(0 <= ji.getTriggerContentUpdateDelayMs());
         assertTrue(0 <= ji.getTriggerContentMaxDelayMs());
         testNetworkRequestProto(ji.getRequiredNetwork());
-        assertTrue(0 <= ji.getTotalNetworkBytes());
+        // JobInfo.NETWORK_BYTES_UNKNOWN (= -1) is a valid value.
+        assertTrue(-1 <= ji.getTotalNetworkBytes());
         assertTrue(0 <= ji.getMinLatencyMs());
         assertTrue(0 <= ji.getMaxExecutionDelayMs());
         JobStatusDumpProto.JobInfo.Backoff bp = ji.getBackoffPolicy();
diff --git a/hostsidetests/securitybulletin/AndroidTest.xml b/hostsidetests/securitybulletin/AndroidTest.xml
index b8d5799..38d8eaf 100644
--- a/hostsidetests/securitybulletin/AndroidTest.xml
+++ b/hostsidetests/securitybulletin/AndroidTest.xml
@@ -69,6 +69,7 @@
         <!--__________________-->
         <!-- Bulletin 2016-10 -->
         <!-- Please add tests solely from this bulletin below to avoid merge conflict -->
+        <option name="push" value="CVE-2016-3913->/data/local/tmp/CVE-2016-3913" />
 
         <!--__________________-->
         <!-- Bulletin 2016-11 -->
diff --git a/hostsidetests/securitybulletin/securityPatch/CVE-2016-3913/Android.mk b/hostsidetests/securitybulletin/securityPatch/CVE-2016-3913/Android.mk
new file mode 100644
index 0000000..e21a08e
--- /dev/null
+++ b/hostsidetests/securitybulletin/securityPatch/CVE-2016-3913/Android.mk
@@ -0,0 +1,35 @@
+# Copyright (C) 2019 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.
+
+LOCAL_PATH := $(call my-dir)
+
+include $(CLEAR_VARS)
+LOCAL_MODULE := CVE-2016-3913
+LOCAL_SRC_FILES := poc.cpp
+LOCAL_MULTILIB := both
+LOCAL_MODULE_STEM_32 := $(LOCAL_MODULE)32
+LOCAL_MODULE_STEM_64 := $(LOCAL_MODULE)64
+
+LOCAL_SHARED_LIBRARIES := \
+    libbinder \
+    libutils \
+    libmedia \
+
+# Tag this module as a cts test artifact
+LOCAL_COMPATIBILITY_SUITE := cts sts vts
+LOCAL_CTS_TEST_PACKAGE := android.security.cts
+
+LOCAL_ARM_MODE := arm
+LOCAL_CPPFLAGS += -Wall -Werror -Wno-unused-parameter
+include $(BUILD_CTS_EXECUTABLE)
diff --git a/hostsidetests/securitybulletin/securityPatch/CVE-2016-3913/poc.cpp b/hostsidetests/securitybulletin/securityPatch/CVE-2016-3913/poc.cpp
new file mode 100644
index 0000000..5d45862
--- /dev/null
+++ b/hostsidetests/securitybulletin/securityPatch/CVE-2016-3913/poc.cpp
@@ -0,0 +1,167 @@
+/**
+ * Copyright (C) 2019 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.
+ */
+
+#include <binder/IServiceManager.h>
+#include <media/IMediaHTTPService.h>
+#include <media/IMediaPlayer.h>
+#include <media/IMediaPlayerService.h>
+#include <media/VolumeShaper.h>
+#include <media/mediaplayer.h>
+
+using namespace android;
+using namespace android::media;
+
+class MyMediaPlayer : public BnInterface<IMediaPlayer> {
+ public:
+  status_t onTransact(uint32_t code, const Parcel &data, Parcel *reply,
+                      uint32_t flags = 0) {
+    return OK;
+  }
+  void disconnect() {}
+
+  status_t setDataSource(const sp<IMediaHTTPService> &httpService,
+                         const char *url,
+                         const KeyedVector<String8, String8> *headers) {
+    return OK;
+  }
+
+  status_t setDataSource(int fd, int64_t offset, int64_t length) { return OK; }
+
+  status_t setDataSource(const sp<IStreamSource> &source) { return OK; }
+
+  status_t setDataSource(const sp<IDataSource> &source) { return OK; }
+
+  status_t setVideoSurfaceTexture(
+      const sp<IGraphicBufferProducer> &bufferProducer) {
+    return OK;
+  }
+
+  status_t getBufferingSettings(BufferingSettings *buffering) {
+    return OK;
+  }
+
+  status_t setBufferingSettings(const BufferingSettings &buffering) {
+    return OK;
+  }
+
+  status_t prepareAsync() { return OK; }
+
+  status_t start() { return OK; }
+
+  status_t stop() { return OK; }
+
+  status_t pause() { return OK; }
+
+  status_t isPlaying(bool *state) { return OK; }
+
+  status_t setPlaybackSettings(const AudioPlaybackRate &rate) { return OK; }
+
+  status_t getPlaybackSettings(AudioPlaybackRate *rate) { return OK; }
+
+  status_t setSyncSettings(const AVSyncSettings &sync, float videoFpsHint) {
+    return OK;
+  }
+
+  status_t getSyncSettings(AVSyncSettings *sync, float *videoFps) { return OK; }
+
+  status_t seekTo(int msec, MediaPlayerSeekMode mode) { return OK; }
+
+  status_t getCurrentPosition(int *msec) { return OK; }
+
+  status_t getDuration(int *msec) { return OK; }
+
+  status_t notifyAt(int64_t mediaTimeUs) { return OK; }
+
+  status_t reset() { return OK; }
+
+  status_t setAudioStreamType(audio_stream_type_t stream) { return OK; }
+
+  status_t setLooping(int loop) { return OK; }
+
+  status_t setVolume(float leftVolume, float rightVolume) { return OK; }
+
+  status_t setAuxEffectSendLevel(float level) { return OK; }
+
+  status_t attachAuxEffect(int effectId) { return OK; }
+
+  status_t setParameter(int key, const Parcel &request) { return OK; }
+
+  status_t getParameter(int key, Parcel *reply) { return OK; }
+
+  status_t setRetransmitEndpoint(const struct sockaddr_in *endpoint) {
+    return OK;
+  }
+
+  status_t getRetransmitEndpoint(struct sockaddr_in *endpoint) { return OK; }
+
+  status_t setNextPlayer(const sp<IMediaPlayer> &player) { return OK; }
+
+  VolumeShaper::Status applyVolumeShaper(
+      const sp<VolumeShaper::Configuration> &configuration,
+      const sp<VolumeShaper::Operation> &operation) {
+    return (VolumeShaper::Status)OK;
+  }
+  sp<VolumeShaper::State> getVolumeShaperState(int id) { return NULL; }
+
+  status_t prepareDrm(const uint8_t uuid[16],
+                      const Vector<uint8_t> &drmSessionId) {
+    return OK;
+  }
+
+  status_t releaseDrm() { return OK; }
+
+  status_t invoke(const Parcel &request, Parcel *reply) { return OK; }
+
+  status_t setMetadataFilter(const Parcel &request) { return OK; }
+
+  status_t getMetadata(bool update_only, bool apply_filter, Parcel *reply) {
+    return OK;
+  }
+
+  status_t setOutputDevice(audio_port_handle_t deviceId) { return OK; }
+
+  status_t getRoutedDeviceId(audio_port_handle_t *deviceId) { return OK; }
+
+  status_t enableAudioDeviceCallback(bool enabled) { return OK; }
+};
+
+int main() {
+  sp<IBinder> binder =
+      defaultServiceManager()->getService(String16("media.player"));
+  sp<IMediaPlayerService> service = interface_cast<IMediaPlayerService>(binder);
+  sp<IMediaPlayer> player = service->create(
+      new MediaPlayer(), (audio_session_t)AUDIO_SESSION_ALLOCATE);
+
+  if (player == NULL) {
+    return EXIT_FAILURE;
+  }
+
+  sp<IMediaPlayer> localPlayer = new MyMediaPlayer();
+  if (localPlayer == NULL) {
+    return EXIT_FAILURE;
+  }
+
+  // set the data source to initialize mPlayer
+  player->setDataSource(NULL, "file:///test", NULL);
+
+  // Set the next player to a local instance of BnMediaPlayer.
+  // The remote side will construct a BpMediaPlayer object, and then
+  // unsafely cast it to a MediaPlayerService::Client.
+  // This will an out-of-bounds access on class members.
+  player->setNextPlayer(localPlayer);
+
+  return EXIT_SUCCESS;
+}
\ No newline at end of file
diff --git a/hostsidetests/securitybulletin/src/android/security/cts/Poc16_10.java b/hostsidetests/securitybulletin/src/android/security/cts/Poc16_10.java
new file mode 100644
index 0000000..98994e1
--- /dev/null
+++ b/hostsidetests/securitybulletin/src/android/security/cts/Poc16_10.java
@@ -0,0 +1,34 @@
+/**
+ * Copyright (C) 2019 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.security.cts;
+
+import android.platform.test.annotations.SecurityTest;
+
+@SecurityTest
+public class Poc16_10 extends SecurityTestCase {
+
+    /**
+     *  b/30204103
+     */
+    @SecurityTest(minPatchLevel = "2016-10")
+    public void testPocCVE_2016_3913() throws Exception {
+        AdbUtils.runCommandLine("logcat -c",getDevice());
+        AdbUtils.runPoc("CVE-2016-3913", getDevice(), 60);
+        String logcat = AdbUtils.runCommandLine("logcat -d", getDevice());
+        assertNotMatchesMultiLine("Fatal signal 11.*?/system/bin/mediaserver",logcat);
+    }
+}
diff --git a/hostsidetests/statsd/apps/statsdapp/AndroidManifest.xml b/hostsidetests/statsd/apps/statsdapp/AndroidManifest.xml
index 6398bd9..6f3a6e9 100644
--- a/hostsidetests/statsd/apps/statsdapp/AndroidManifest.xml
+++ b/hostsidetests/statsd/apps/statsdapp/AndroidManifest.xml
@@ -56,13 +56,6 @@
             </intent-filter>
         </activity>
 
-        <activity
-            android:name=".LmkActivity"
-            android:label="Lmk Test Activity"
-            android:launchMode="singleInstance"
-            android:process=":LmkProcess"
-            android:exported="true"
-            />
         <activity android:name=".DaveyActivity" android:exported="true" />
         <activity android:name=".HiddenApiUsedActivity" android:exported="true" />
         <activity
diff --git a/hostsidetests/statsd/apps/statsdapp/jni/alloc_stress_activity.cpp b/hostsidetests/statsd/apps/statsdapp/jni/alloc_stress_activity.cpp
index 463efe6..d207479 100644
--- a/hostsidetests/statsd/apps/statsdapp/jni/alloc_stress_activity.cpp
+++ b/hostsidetests/statsd/apps/statsdapp/jni/alloc_stress_activity.cpp
@@ -33,7 +33,7 @@
 size_t s = 4 * (1 << 20); // 4 MB
 extern "C"
 JNIEXPORT void JNICALL
-Java_com_android_server_cts_device_statsd_LmkActivity_cmain(JNIEnv* , jobject /* this */)
+Java_com_android_server_cts_device_statsd_StatsdCtsBackgroundService_cmain(JNIEnv* , jobject /* this */)
 {
     long long allocCount = 0;
     while (1) {
diff --git a/hostsidetests/statsd/apps/statsdapp/src/com/android/server/cts/device/statsd/LmkActivity.java b/hostsidetests/statsd/apps/statsdapp/src/com/android/server/cts/device/statsd/LmkActivity.java
deleted file mode 100644
index c3600a1..0000000
--- a/hostsidetests/statsd/apps/statsdapp/src/com/android/server/cts/device/statsd/LmkActivity.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Copyright (C) 2019 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 com.android.server.cts.device.statsd;
-
-import android.app.Activity;
-import android.os.Bundle;
-
-public class LmkActivity extends Activity {
-
-    static {
-        System.loadLibrary("lmkhelper");
-    }
-
-    @Override
-    protected void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-
-        new Thread(new Runnable() {
-            public void run() {
-                cmain();
-            }
-        }).start();
-
-    }
-
-    /**
-     *  Keep allocating memory until the process is killed by LMKD.
-     **/
-    public native void cmain();
-
-}
diff --git a/hostsidetests/statsd/apps/statsdapp/src/com/android/server/cts/device/statsd/StatsdCtsBackgroundService.java b/hostsidetests/statsd/apps/statsdapp/src/com/android/server/cts/device/statsd/StatsdCtsBackgroundService.java
index fc1c472..ad018f9 100644
--- a/hostsidetests/statsd/apps/statsdapp/src/com/android/server/cts/device/statsd/StatsdCtsBackgroundService.java
+++ b/hostsidetests/statsd/apps/statsdapp/src/com/android/server/cts/device/statsd/StatsdCtsBackgroundService.java
@@ -29,9 +29,14 @@
     public static final String KEY_ACTION = "action";
     public static final String ACTION_BACKGROUND_SLEEP = "action.background_sleep";
     public static final String ACTION_END_IMMEDIATELY = "action.end_immediately";
+    public static final String ACTION_LMK = "action.lmk";
 
     public static final int SLEEP_OF_ACTION_BACKGROUND_SLEEP = 2_000;
 
+    static {
+        System.loadLibrary("lmkhelper");
+    }
+
     public StatsdCtsBackgroundService() {
         super(StatsdCtsBackgroundService.class.getName());
     }
@@ -47,8 +52,16 @@
                 break;
             case ACTION_END_IMMEDIATELY:
                 break;
+            case ACTION_LMK:
+                new Thread(this::cmain).start();
+                break;
             default:
                 Log.e(TAG, "Intent had invalid action");
         }
     }
+
+    /**
+     *  Keep allocating memory until the process is killed by LMKD.
+     **/
+    public native void cmain();
 }
diff --git a/hostsidetests/statsd/src/android/cts/statsd/atom/DeviceAtomTestCase.java b/hostsidetests/statsd/src/android/cts/statsd/atom/DeviceAtomTestCase.java
index d09175e..ec6291d 100644
--- a/hostsidetests/statsd/src/android/cts/statsd/atom/DeviceAtomTestCase.java
+++ b/hostsidetests/statsd/src/android/cts/statsd/atom/DeviceAtomTestCase.java
@@ -35,9 +35,15 @@
             "com.android.server.cts.device.statsd";
     public static final String DEVICE_SIDE_TEST_FOREGROUND_SERVICE_NAME =
             "com.android.server.cts.device.statsd.StatsdCtsForegroundService";
+    private static final String DEVICE_SIDE_BG_SERVICE_COMPONENT =
+            "com.android.server.cts.device.statsd/.StatsdCtsBackgroundService";
     public static final long DEVICE_SIDE_TEST_PKG_HASH =
             Long.parseUnsignedLong("15694052924544098582");
 
+    // Constants from device side tests (not directly accessible here).
+    public static final String KEY_ACTION = "action";
+    public static final String ACTION_LMK = "action.lmk";
+
     public static final String CONFIG_NAME = "cts_config";
 
     @Override
@@ -189,6 +195,19 @@
                 "cmd deviceidle tempwhitelist %s", DEVICE_SIDE_TEST_PACKAGE));
     }
 
+    /**
+     * Runs a (background) service to perform the given action.
+     * @param actionValue the action code constants indicating the desired action to perform.
+     */
+    protected void executeBackgroundService(String actionValue) throws Exception {
+        allowBackgroundServices();
+        getDevice().executeShellCommand(String.format(
+                "am startservice -n '%s' -e %s %s",
+                DEVICE_SIDE_BG_SERVICE_COMPONENT,
+                KEY_ACTION, actionValue));
+    }
+
+
     /** Make the test app standby-active so it can run syncs and jobs immediately. */
     protected void allowImmediateSyncs() throws Exception {
         getDevice().executeShellCommand("am set-standby-bucket "
diff --git a/hostsidetests/statsd/src/android/cts/statsd/atom/ProcStateTestCase.java b/hostsidetests/statsd/src/android/cts/statsd/atom/ProcStateTestCase.java
index cd65a37..2fa4233 100644
--- a/hostsidetests/statsd/src/android/cts/statsd/atom/ProcStateTestCase.java
+++ b/hostsidetests/statsd/src/android/cts/statsd/atom/ProcStateTestCase.java
@@ -35,15 +35,12 @@
 
   private static final String TAG = "Statsd.ProcStateTestCase";
 
-  private static final String DEVICE_SIDE_BG_SERVICE_COMPONENT
-          = "com.android.server.cts.device.statsd/.StatsdCtsBackgroundService";
   private static final String DEVICE_SIDE_FG_ACTIVITY_COMPONENT
           = "com.android.server.cts.device.statsd/.StatsdCtsForegroundActivity";
   private static final String DEVICE_SIDE_FG_SERVICE_COMPONENT
           = "com.android.server.cts.device.statsd/.StatsdCtsForegroundService";
 
   // Constants from the device-side tests (not directly accessible here).
-  public static final String KEY_ACTION = "action";
   public static final String ACTION_END_IMMEDIATELY = "action.end_immediately";
   public static final String ACTION_BACKGROUND_SLEEP = "action.background_sleep";
   public static final String ACTION_SLEEP_WHILE_TOP = "action.sleep_top";
@@ -56,17 +53,6 @@
   public static final int SLEEP_OF_ACTION_BACKGROUND_SLEEP = 2_000;
   public static final int SLEEP_OF_FOREGROUND_SERVICE = 2_000;
 
-  /**
-   * Runs a (background) service to perform the given action.
-   * @param actionValue the action code constants indicating the desired action to perform.
-   */
-  protected void executeBackgroundService(String actionValue) throws Exception {
-    allowBackgroundServices();
-    getDevice().executeShellCommand(String.format(
-            "am startservice -n '%s' -e %s %s",
-            DEVICE_SIDE_BG_SERVICE_COMPONENT,
-            KEY_ACTION, actionValue));
-  }
 
   /**
    * Runs an activity (in the foreground) to perform the given action.
diff --git a/hostsidetests/statsd/src/android/cts/statsd/atom/UidAtomTests.java b/hostsidetests/statsd/src/android/cts/statsd/atom/UidAtomTests.java
index 80d36a9..918f794 100644
--- a/hostsidetests/statsd/src/android/cts/statsd/atom/UidAtomTests.java
+++ b/hostsidetests/statsd/src/android/cts/statsd/atom/UidAtomTests.java
@@ -98,7 +98,8 @@
 
         Thread.sleep(WAIT_TIME_SHORT);
 
-        runActivity("LmkActivity", null, null, 5_000);
+        executeBackgroundService(ACTION_LMK);
+        Thread.sleep(5_000);
 
         // Sorted list of events in order in which they occurred.
         List<EventMetricData> data = getEventMetricDataList();
@@ -107,8 +108,8 @@
         assertTrue(data.get(0).getAtom().hasLmkKillOccurred());
         LmkKillOccurred atom = data.get(0).getAtom().getLmkKillOccurred();
         assertEquals(getUid(), atom.getUid());
-        assertEquals(DEVICE_SIDE_TEST_PACKAGE + ":LmkProcess", atom.getProcessName());
-        assertEquals(0, atom.getOomAdjScore());
+        assertEquals(DEVICE_SIDE_TEST_PACKAGE, atom.getProcessName());
+        assertTrue(500 <= atom.getOomAdjScore());
     }
 
     public void testAppCrashOccurred() throws Exception {
diff --git a/hostsidetests/statsd/src/android/cts/statsd/metric/MetricActivationTests.java b/hostsidetests/statsd/src/android/cts/statsd/metric/MetricActivationTests.java
index bd94615..fc069b1 100644
--- a/hostsidetests/statsd/src/android/cts/statsd/metric/MetricActivationTests.java
+++ b/hostsidetests/statsd/src/android/cts/statsd/metric/MetricActivationTests.java
@@ -46,34 +46,13 @@
     private final int metric3MatcherId = 3;
 
     private final int act1MatcherId = 10;
-    private final int act1TtlSecs = 40;
     private final int act1CancelMatcherId = -10;
 
     private final int act2MatcherId = 20;
-    private final int act2TtlSecs = 60;
     private final int act2CancelMatcherId = -20;
 
 
-    /**
-     * Metric 1:
-     *     Activation 1:
-     *         - Ttl: 40 seconds
-     *         - Type: IMMEDIATE
-     *     Activation 2:
-     *         - Ttl: 60 seconds
-     *         - Type: ON_BOOT
-     *
-     * Metric 2:
-     *     Activation 1:
-     *         - Ttl: 40 seconds
-     *         - Type: ON_BOOT
-     *     Activation 2:
-     *         - Ttl: 60 seconds
-     *         - Type: IMMEDIATE
-     *
-     * Metric 3: No activations; always active
-     **/
-    private StatsdConfig.Builder createConfig() {
+    private StatsdConfig.Builder createConfig(final int act1TtlSecs, final int act2TtlSecs) {
         AtomMatcher metric1Matcher =
                 MetricsUtils.simpleAtomMatcher(metric1MatcherId, metric1MatcherId);
         AtomMatcher metric2Matcher =
@@ -151,17 +130,34 @@
                 .addMetricActivation(metric2Activation);
     }
 
-    @Override
-    protected void setUp() throws Exception {
-        super.setUp();
-        uploadConfig(createConfig());
-    }
-
+    /**
+     * Metric 1:
+     *     Activation 1:
+     *         - Ttl: 5 seconds
+     *         - Type: IMMEDIATE
+     *     Activation 2:
+     *         - Ttl: 8 seconds
+     *         - Type: ON_BOOT
+     *
+     * Metric 2:
+     *     Activation 1:
+     *         - Ttl: 5 seconds
+     *         - Type: ON_BOOT
+     *     Activation 2:
+     *         - Ttl: 8 seconds
+     *         - Type: IMMEDIATE
+     *
+     * Metric 3: No activations; always active
+     **/
     public void testCancellation() throws Exception {
         if (statsdDisabled()) {
             return;
         }
 
+        final int act1TtlSecs = 5;
+        final int act2TtlSecs = 8;
+        uploadConfig(createConfig(act1TtlSecs, act2TtlSecs));
+
         // Ignored, metric not active.
         doAppBreadcrumbReported(metric1MatcherId);
         Thread.sleep(10L);
@@ -235,14 +231,37 @@
         verifyMetrics(report, 4, 0, 1);
     }
 
+    /**
+     * Metric 1:
+     *     Activation 1:
+     *         - Ttl: 100 seconds
+     *         - Type: IMMEDIATE
+     *     Activation 2:
+     *         - Ttl: 200 seconds
+     *         - Type: ON_BOOT
+     *
+     * Metric 2:
+     *     Activation 1:
+     *         - Ttl: 100 seconds
+     *         - Type: ON_BOOT
+     *     Activation 2:
+     *         - Ttl: 200 seconds
+     *         - Type: IMMEDIATE
+     *
+     * Metric 3: No activations; always active
+     **/
     public void testRestart() throws Exception {
         if (statsdDisabled()) {
             return;
         }
 
+        final int act1TtlSecs = 100;
+        final int act2TtlSecs = 200;
+        uploadConfig(createConfig(act1TtlSecs, act2TtlSecs));
+
         // Trigger Metric 1 Activation 1 and Metric 2 Activation 1.
         // Time remaining:
-        // Metric 1 Activation 1: 30 seconds
+        // Metric 1 Activation 1: 100 seconds
         // Metric 1 Activation 2: 0 seconds
         // Metric 2 Activation 1: 0 seconds (will activate after boot)
         // Metric 2 Activation 2: 0 seconds
@@ -255,9 +274,9 @@
         logAllMetrics();
 
         // Time remaining:
-        // Metric 1 Activation 1: 30 seconds
+        // Metric 1 Activation 1: 100 seconds
         // Metric 1 Activation 2: 0 seconds
-        // Metric 2 Activation 1: 30 seconds
+        // Metric 2 Activation 1: 100 seconds
         // Metric 2 Activation 2: 0 seconds
         rebootDeviceAndWaitUntilReady();
 
@@ -271,7 +290,7 @@
         // Metric 1 Activation 2: 0 seconds
         // Metric 2 Activation 1: 0 seconds
         // Metric 2 Activation 2: 0 seconds
-        Thread.sleep(30_000L);
+        Thread.sleep(act1TtlSecs * 1000L);
 
         // Metric 1 event ignored, Activation 1 expired.
         // Metric 2 event ignored, Activation 1 expired.
@@ -283,7 +302,7 @@
         // Metric 1 Activation 1: 0 seconds
         // Metric 1 Activation 2: 0 seconds (will activate after boot)
         // Metric 2 Activation 1: 0 seconds
-        // Metric 2 Activation 2: 50 seconds
+        // Metric 2 Activation 2: 200 seconds
         doAppBreadcrumbReported(act2MatcherId);
         Thread.sleep(10L);
 
@@ -294,10 +313,10 @@
 
         // Trigger Metric 1 Activation 1 and Metric 2 Activation 1.
         // Time remaining:
-        // Metric 1 Activation 1: 30 seconds
+        // Metric 1 Activation 1: 100 seconds
         // Metric 1 Activation 2: 0 seconds (will activate after boot)
         // Metric 2 Activation 1: 0 seconds (will activate after boot)
-        // Metric 2 Activation 2: 50 seconds
+        // Metric 2 Activation 2: 200 seconds
         doAppBreadcrumbReported(act1MatcherId);
         Thread.sleep(10L);
 
@@ -307,17 +326,17 @@
         logAllMetrics();
 
         // Time remaining:
-        // Metric 1 Activation 1: 20 seconds
+        // Metric 1 Activation 1: 50 seconds
         // Metric 1 Activation 2: 0 seconds (will activate after boot)
         // Metric 2 Activation 1: 0 seconds (will activate after boot)
-        // Metric 2 Activation 2: 40 seconds
-        Thread.sleep(10_000L);
+        // Metric 2 Activation 2: 150 seconds
+        Thread.sleep(act1TtlSecs * 1000L / 2);
 
         // Time remaining:
-        // Metric 1 Activation 1: 20 seconds
-        // Metric 1 Activation 2: 50 seconds
-        // Metric 2 Activation 1: 30 seconds
-        // Metric 2 Activation 2: 40 seconds
+        // Metric 1 Activation 1: 50 seconds
+        // Metric 1 Activation 2: 200 seconds
+        // Metric 2 Activation 1: 100 seconds
+        // Metric 2 Activation 2: 150 seconds
         rebootDeviceAndWaitUntilReady();
 
         // Fourth logged event for Metric 1.
@@ -328,10 +347,10 @@
         // Expire Metric 1 Activation 1.
         // Time remaining:
         // Metric 1 Activation 1: 0 seconds
-        // Metric 1 Activation 2: 30 seconds
-        // Metric 2 Activation 1: 10 seconds
-        // Metric 2 Activation 2: 20 seconds
-        Thread.sleep(20_000L);
+        // Metric 1 Activation 2: 150 seconds
+        // Metric 2 Activation 1: 50 seconds
+        // Metric 2 Activation 2: 100 seconds
+        Thread.sleep(act1TtlSecs * 1000L / 2);
 
         // Fifth logged event for Metric 1.
         // Fifth logged event for Metric 2.
@@ -344,7 +363,7 @@
         // Metric 1 Activation 2: 0 seconds
         // Metric 2 Activation 1: 0 seconds
         // Metric 2 Activation 2: 0 seconds
-        Thread.sleep(30_000L);
+        Thread.sleep(act2TtlSecs * 1000L);
 
         // Metric 1 event ignored.
         // Metric 2 event ignored.
@@ -367,14 +386,37 @@
         verifyMetrics(report, 2, 2, 3);
     }
 
+    /**
+     * Metric 1:
+     *     Activation 1:
+     *         - Ttl: 100 seconds
+     *         - Type: IMMEDIATE
+     *     Activation 2:
+     *         - Ttl: 200 seconds
+     *         - Type: ON_BOOT
+     *
+     * Metric 2:
+     *     Activation 1:
+     *         - Ttl: 100 seconds
+     *         - Type: ON_BOOT
+     *     Activation 2:
+     *         - Ttl: 200 seconds
+     *         - Type: IMMEDIATE
+     *
+     * Metric 3: No activations; always active
+     **/
     public void testMultipleActivations() throws Exception {
         if (statsdDisabled()) {
             return;
         }
 
+        final int act1TtlSecs = 100;
+        final int act2TtlSecs = 200;
+        uploadConfig(createConfig(act1TtlSecs, act2TtlSecs));
+
         // Trigger Metric 1 Activation 1 and Metric 2 Activation 1.
         // Time remaining:
-        // Metric 1 Activation 1: 40 seconds
+        // Metric 1 Activation 1: 100 seconds
         // Metric 1 Activation 2: 0 seconds
         // Metric 2 Activation 1: 0 seconds (will activate after boot)
         // Metric 2 Activation 2: 0 seconds
@@ -387,11 +429,11 @@
         logAllMetrics();
 
         // Time remaining:
-        // Metric 1 Activation 1: 30 seconds
+        // Metric 1 Activation 1: 50 seconds
         // Metric 1 Activation 2: 0 seconds
         // Metric 2 Activation 1: 0 seconds (will activate after boot)
         // Metric 2 Activation 2: 0 seconds
-        Thread.sleep(10_000L);
+        Thread.sleep(act1TtlSecs * 1000L / 2);
 
         // Second logged event for Metric 1.
         // Metric 2 event ignored, will activate after boot.
@@ -400,7 +442,7 @@
 
         // Trigger Metric 1 Activation 1 and Metric 2 Activation 1.
         // Time remaining:
-        // Metric 1 Activation 1: 30 seconds
+        // Metric 1 Activation 1: 100 seconds
         // Metric 1 Activation 2: 0 seconds
         // Metric 2 Activation 1: 0 seconds (will activate after boot)
         // Metric 2 Activation 2: 0 seconds
@@ -413,9 +455,9 @@
         logAllMetrics();
 
         // Time remaining:
-        // Metric 1 Activation 1: 40 seconds
+        // Metric 1 Activation 1: 100 seconds
         // Metric 1 Activation 2: 0 seconds
-        // Metric 2 Activation 1: 40 seconds
+        // Metric 2 Activation 1: 100 seconds
         // Metric 2 Activation 2: 0 seconds
         rebootDeviceAndWaitUntilReady();
 
@@ -426,9 +468,9 @@
 
         // Trigger Metric 1 Activation 1 and Metric 2 Activation 1.
         // Time remaining:
-        // Metric 1 Activation 1: 40 seconds
+        // Metric 1 Activation 1: 100 seconds
         // Metric 1 Activation 2: 0 seconds
-        // Metric 2 Activation 1: 40 seconds
+        // Metric 2 Activation 1: 100 seconds
         // Metric 2 Activation 2: 0 seconds
         doAppBreadcrumbReported(act1MatcherId);
         Thread.sleep(10L);
@@ -444,7 +486,7 @@
         // Metric 1 Activation 2: 0 seconds
         // Metric 2 Activation 1: 0 seconds
         // Metric 2 Activation 2: 0 seconds
-        Thread.sleep(40_000);
+        Thread.sleep(act1TtlSecs * 1000L);
 
         // Metric 1 event ignored.
         // Metric 2 event ignored.
diff --git a/tests/app/Android.mk b/tests/app/Android.mk
index aa7eafe..8051d83 100644
--- a/tests/app/Android.mk
+++ b/tests/app/Android.mk
@@ -32,6 +32,7 @@
     ctstestserver \
     mockito-target-minus-junit4 \
     androidx.test.rules \
+    androidx.test.ext.junit \
     platform-test-annotations \
     cts-wm-util \
     androidx.test.rules \
diff --git a/tests/app/src/android/app/cts/ActivityManagerMemoryClassTest.java b/tests/app/src/android/app/cts/ActivityManagerMemoryClassTest.java
index a4808ed..a49f4a5 100644
--- a/tests/app/src/android/app/cts/ActivityManagerMemoryClassTest.java
+++ b/tests/app/src/android/app/cts/ActivityManagerMemoryClassTest.java
@@ -75,8 +75,10 @@
             expectedMemorySizeForWatch.put(DisplayMetrics.DENSITY_400, 56);
             expectedMemorySizeForWatch.put(DisplayMetrics.DENSITY_420, 64);
             expectedMemorySizeForWatch.put(DisplayMetrics.DENSITY_440, 88);
+            expectedMemorySizeForWatch.put(DisplayMetrics.DENSITY_450, 88);
             expectedMemorySizeForWatch.put(DisplayMetrics.DENSITY_XXHIGH, 88);
             expectedMemorySizeForWatch.put(DisplayMetrics.DENSITY_560, 112);
+            expectedMemorySizeForWatch.put(DisplayMetrics.DENSITY_600, 138);
             expectedMemorySizeForWatch.put(DisplayMetrics.DENSITY_XXXHIGH, 154);
         }
 
@@ -98,8 +100,10 @@
             expectedMemorySizeForSmallNormalScreen.put(DisplayMetrics.DENSITY_400, 96);
             expectedMemorySizeForSmallNormalScreen.put(DisplayMetrics.DENSITY_420, 112);
             expectedMemorySizeForSmallNormalScreen.put(DisplayMetrics.DENSITY_440, 128);
+            expectedMemorySizeForSmallNormalScreen.put(DisplayMetrics.DENSITY_450, 128);
             expectedMemorySizeForSmallNormalScreen.put(DisplayMetrics.DENSITY_XXHIGH, 128);
             expectedMemorySizeForSmallNormalScreen.put(DisplayMetrics.DENSITY_560, 192);
+            expectedMemorySizeForSmallNormalScreen.put(DisplayMetrics.DENSITY_600, 228);
             expectedMemorySizeForSmallNormalScreen.put(DisplayMetrics.DENSITY_XXXHIGH, 256);
         }
 
@@ -121,8 +125,10 @@
             expectedMemorySizeForLargeScreen.put(DisplayMetrics.DENSITY_400, 192);
             expectedMemorySizeForLargeScreen.put(DisplayMetrics.DENSITY_420, 228);
             expectedMemorySizeForLargeScreen.put(DisplayMetrics.DENSITY_440, 256);
+            expectedMemorySizeForLargeScreen.put(DisplayMetrics.DENSITY_450, 256);
             expectedMemorySizeForLargeScreen.put(DisplayMetrics.DENSITY_XXHIGH, 256);
             expectedMemorySizeForLargeScreen.put(DisplayMetrics.DENSITY_560, 384);
+            expectedMemorySizeForLargeScreen.put(DisplayMetrics.DENSITY_600, 448);
             expectedMemorySizeForLargeScreen.put(DisplayMetrics.DENSITY_XXXHIGH, 512);
         }
 
@@ -144,8 +150,10 @@
             expectedMemorySizeForXLargeScreen.put(DisplayMetrics.DENSITY_400, 288);
             expectedMemorySizeForXLargeScreen.put(DisplayMetrics.DENSITY_420, 336);
             expectedMemorySizeForXLargeScreen.put(DisplayMetrics.DENSITY_440, 384);
+            expectedMemorySizeForXLargeScreen.put(DisplayMetrics.DENSITY_450, 384);
             expectedMemorySizeForXLargeScreen.put(DisplayMetrics.DENSITY_XXHIGH, 384);
             expectedMemorySizeForXLargeScreen.put(DisplayMetrics.DENSITY_560, 576);
+            expectedMemorySizeForXLargeScreen.put(DisplayMetrics.DENSITY_600, 672);
             expectedMemorySizeForXLargeScreen.put(DisplayMetrics.DENSITY_XXXHIGH, 768);
         }
 
diff --git a/tests/app/src/android/app/cts/DialogTest.java b/tests/app/src/android/app/cts/DialogTest.java
index 6cf088e..00837f6 100755
--- a/tests/app/src/android/app/cts/DialogTest.java
+++ b/tests/app/src/android/app/cts/DialogTest.java
@@ -57,11 +57,13 @@
 import android.view.WindowManager;
 import android.widget.LinearLayout;
 
-import androidx.test.InstrumentationRegistry;
+
 import androidx.test.annotation.UiThreadTest;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
 import androidx.test.filters.FlakyTest;
+import androidx.test.platform.app.InstrumentationRegistry;
 import androidx.test.rule.ActivityTestRule;
-import androidx.test.runner.AndroidJUnit4;
+
 
 import com.android.compatibility.common.util.PollingCheck;
 
@@ -474,7 +476,6 @@
         return event;
     }
 
-    @FlakyTest(bugId = 133760851)
     @Test
     public void testTouchEvent() {
         startDialogActivity(DialogStubActivity.TEST_ONSTART_AND_ONSTOP);
@@ -491,18 +492,14 @@
         assertNull(d.touchEvent);
         assertFalse(d.isOnTouchEventCalled);
 
-        // Send a touch event outside the dialog window.  Expect the event to be ignored
+        // Tap outside the dialog window.  Expect the event to be ignored
         // because closeOnTouchOutside is false.
         d.setCanceledOnTouchOutside(false);
 
-        long now = SystemClock.uptimeMillis();
-        MotionEvent touchMotionEvent = sendTouchEvent(now, MotionEvent.ACTION_DOWN, x, y);
+        long downTime = SystemClock.uptimeMillis();
 
-        new PollingCheck(TEST_TIMEOUT) {
-            protected boolean check() {
-                return !d.dispatchTouchEventResult;
-            }
-        }.run();
+        sendTouchEvent(downTime, MotionEvent.ACTION_DOWN, x, y).recycle();
+        MotionEvent touchMotionEvent = sendTouchEvent(downTime, MotionEvent.ACTION_UP, x, y);
 
         assertMotionEventEquals(touchMotionEvent, d.touchEvent);
         assertTrue(d.isOnTouchEventCalled);
@@ -510,8 +507,6 @@
         d.isOnTouchEventCalled = false;
         assertTrue(d.isShowing());
         touchMotionEvent.recycle();
-        // Send ACTION_UP to keep the event stream consistent
-        sendTouchEvent(now, MotionEvent.ACTION_UP, x, y).recycle();
 
         if (mContext.getPackageManager().hasSystemFeature(PackageManager.FEATURE_WATCH)) {
             // Watch activities cover the entire screen, so there is no way to touch outside.
@@ -520,23 +515,17 @@
 
         // Send a touch event outside the dialog window. Expect the dialog to be dismissed
         // because closeOnTouchOutside is true.
-
         d.setCanceledOnTouchOutside(true);
-        now = SystemClock.uptimeMillis();
-        touchMotionEvent = sendTouchEvent(now, MotionEvent.ACTION_DOWN, x, y);
+        downTime = SystemClock.uptimeMillis();
 
-        new PollingCheck(TEST_TIMEOUT) {
-            protected boolean check() {
-                return d.dispatchTouchEventResult;
-            }
-        }.run();
+        sendTouchEvent(downTime, MotionEvent.ACTION_DOWN, x, y).recycle();
+        touchMotionEvent = sendTouchEvent(downTime, MotionEvent.ACTION_UP, x, y);
 
         assertMotionEventEquals(touchMotionEvent, d.touchEvent);
         assertTrue(d.isOnTouchEventCalled);
         assertMotionEventEquals(touchMotionEvent, d.onTouchEvent);
         assertFalse(d.isShowing());
         touchMotionEvent.recycle();
-        sendTouchEvent(now, MotionEvent.ACTION_UP, x, y).recycle();
     }
 
     @Test
diff --git a/tests/camera/utils/src/android/hardware/camera2/cts/CameraTestUtils.java b/tests/camera/utils/src/android/hardware/camera2/cts/CameraTestUtils.java
index e555a17..e408cb5 100644
--- a/tests/camera/utils/src/android/hardware/camera2/cts/CameraTestUtils.java
+++ b/tests/camera/utils/src/android/hardware/camera2/cts/CameraTestUtils.java
@@ -2014,6 +2014,7 @@
             } else {
                 Size effectivePlaneSize = getEffectivePlaneSizeForImage(src, i);
                 int srcRowByteCount = srcRowStride;
+                int dstRowByteCount = dstRowStride;
                 byte[] srcDataRow = new byte[srcRowByteCount];
 
                 if (srcPixStride == dstPixStride) {
@@ -2029,11 +2030,11 @@
                             }
                         }
                         srcBuffer.get(srcDataRow, /*offset*/0, srcRowByteCount);
-                        dstBuffer.put(srcDataRow, /*offset*/0, srcRowByteCount);
+                        dstBuffer.put(srcDataRow, /*offset*/0,
+                                Math.min(srcRowByteCount, dstRowByteCount));
                     }
                 } else {
                     // Row by row per pixel copy case
-                    int dstRowByteCount = dstRowStride;
                     byte[] dstDataRow = new byte[dstRowByteCount];
                     for (int row = 0; row < effectivePlaneSize.getHeight(); row++) {
                         if (row == effectivePlaneSize.getHeight() - 1) {
@@ -2152,12 +2153,12 @@
             rhsBuffer = rhsPlanes[i].getBuffer();
             lhsBuffer.rewind();
             rhsBuffer.rewind();
-            // Special case for YUV420_888 buffer with different chroma layout
-            if (lhsImg.getFormat() == ImageFormat.YUV_420_888 && (i != 0) &&
+            // Special case for YUV420_888 buffer with different layout
+            if (lhsImg.getFormat() == ImageFormat.YUV_420_888 &&
                     (lhsPlanes[i].getPixelStride() != rhsPlanes[i].getPixelStride() ||
                      lhsPlanes[i].getRowStride() != rhsPlanes[i].getRowStride())) {
-                int width = lhsImg.getWidth() / 2;
-                int height = lhsImg.getHeight() / 2;
+                int width = getEffectivePlaneSizeForImage(lhsImg, i).getWidth();
+                int height = getEffectivePlaneSizeForImage(lhsImg, i).getHeight();
                 int rowSizeL = lhsPlanes[i].getRowStride();
                 int rowSizeR = rhsPlanes[i].getRowStride();
                 byte[] lhsRow = new byte[rowSizeL];
diff --git a/tests/framework/base/windowmanager/src/android/server/wm/MultiDisplayTestBase.java b/tests/framework/base/windowmanager/src/android/server/wm/MultiDisplayTestBase.java
index 7cab036..32a20ae 100644
--- a/tests/framework/base/windowmanager/src/android/server/wm/MultiDisplayTestBase.java
+++ b/tests/framework/base/windowmanager/src/android/server/wm/MultiDisplayTestBase.java
@@ -242,10 +242,6 @@
     protected void tapOnDisplayCenter(int displayId) {
         final Rect bounds = mAmWmState.getWmState().getDisplay(displayId).getDisplayRect();
         tapOnDisplay(bounds.centerX(), bounds.centerY(), displayId);
-        // This is needed after a tap in multi-display to ensure that the display focus has really
-        // changed, if needed. The call to syncInputTransaction will wait until focus change has
-        // propagated from WMS to native input before returning.
-        getInstrumentation().getUiAutomation().syncInputTransactions();
     }
 
     /**
diff --git a/tests/inputmethod/mockime/Android.mk b/tests/inputmethod/mockime/Android.mk
index d0b1eec..346e316 100644
--- a/tests/inputmethod/mockime/Android.mk
+++ b/tests/inputmethod/mockime/Android.mk
@@ -19,7 +19,7 @@
 LOCAL_MODULE := CtsMockInputMethodLib
 LOCAL_MODULE_TAGS := tests
 
-LOCAL_SDK_VERSION := current
+LOCAL_SDK_VERSION := test_current
 
 # TODO: ideally we should split MockIme source files into three categories
 #       1) common, 2) common + IME-only, and 3) common + client-only.
@@ -47,7 +47,7 @@
 
 LOCAL_PROGUARD_ENABLED := disabled
 
-LOCAL_SDK_VERSION := current
+LOCAL_SDK_VERSION := test_current
 LOCAL_MIN_SDK_VERSION := 19
 
 # tag this module as a cts test artifact
diff --git a/tests/inputmethod/mockime/src/com/android/cts/mockime/MockImeSession.java b/tests/inputmethod/mockime/src/com/android/cts/mockime/MockImeSession.java
index 2608be2..8ad306b 100644
--- a/tests/inputmethod/mockime/src/com/android/cts/mockime/MockImeSession.java
+++ b/tests/inputmethod/mockime/src/com/android/cts/mockime/MockImeSession.java
@@ -18,6 +18,8 @@
 
 import static androidx.test.platform.app.InstrumentationRegistry.getInstrumentation;
 
+import static org.junit.Assume.assumeFalse;
+
 import android.app.UiAutomation;
 import android.content.BroadcastReceiver;
 import android.content.ComponentName;
@@ -38,6 +40,7 @@
 import android.view.inputmethod.InputConnection;
 import android.view.inputmethod.InputContentInfo;
 import android.view.inputmethod.InputMethodManager;
+import android.view.inputmethod.InputMethodSystemProperty;
 
 import androidx.annotation.GuardedBy;
 import androidx.annotation.NonNull;
@@ -235,6 +238,11 @@
             @NonNull Context context,
             @NonNull UiAutomation uiAutomation,
             @Nullable ImeSettings.Builder imeSettings) throws Exception {
+        // Currently, MockIme doesn't fully support multi-client IME. Skip tests until it does.
+        // TODO: Re-enable when MockIme supports multi-client IME.
+        assumeFalse("MockIme session doesn't support Multi-Client IME, skip it",
+                InputMethodSystemProperty.MULTI_CLIENT_IME_ENABLED);
+
         final MockImeSession client = new MockImeSession(context, uiAutomation);
         client.initialize(imeSettings);
         return client;
diff --git a/tests/tests/assist/AndroidTest.xml b/tests/tests/assist/AndroidTest.xml
index 60cbbe6..3c08038 100644
--- a/tests/tests/assist/AndroidTest.xml
+++ b/tests/tests/assist/AndroidTest.xml
@@ -18,9 +18,15 @@
     <option name="config-descriptor:metadata" key="component" value="framework" />
     <option name="config-descriptor:metadata" key="parameter" value="instant_app" />
     <option name="config-descriptor:metadata" key="parameter" value="not_multi_abi" />
+
+    <!-- Force service to be installed as non-instant mode, always -->
+    <target_preparer class="com.android.tradefed.targetprep.suite.SuiteApkInstaller">
+        <option name="cleanup-apks" value="true"/>
+        <option name="force-install-mode" value="FULL"/>
+        <option name="test-file-name" value="CtsAssistService.apk" />
+    </target_preparer>
     <target_preparer class="com.android.tradefed.targetprep.suite.SuiteApkInstaller">
         <option name="cleanup-apks" value="true" />
-        <option name="test-file-name" value="CtsAssistService.apk" />
         <option name="test-file-name" value="CtsAssistApp.apk" />
         <option name="test-file-name" value="CtsAssistTestCases.apk" />
     </target_preparer>
diff --git a/tests/tests/assist/OWNERS b/tests/tests/assist/OWNERS
index d924ccc..77c59df 100644
--- a/tests/tests/assist/OWNERS
+++ b/tests/tests/assist/OWNERS
@@ -1,2 +1 @@
 # Bug component: 351486
-felipeal@google.com
diff --git a/tests/tests/assist/common/Android.bp b/tests/tests/assist/common/Android.bp
new file mode 100644
index 0000000..35bfbb1
--- /dev/null
+++ b/tests/tests/assist/common/Android.bp
@@ -0,0 +1,19 @@
+// Copyright (C) 2015 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.
+
+java_library {
+    name: "CtsAssistCommon",
+    srcs: ["src/**/*.java"],
+    sdk_version: "test_current",
+}
diff --git a/tests/tests/assist/common/Android.mk b/tests/tests/assist/common/Android.mk
deleted file mode 100644
index 88c90ee..0000000
--- a/tests/tests/assist/common/Android.mk
+++ /dev/null
@@ -1,30 +0,0 @@
-# Copyright (C) 2015 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.
-
-LOCAL_PATH:= $(call my-dir)
-
-include $(CLEAR_VARS)
-
-# don't include this package in any target
-LOCAL_MODULE_TAGS := optional
-# and when built explicitly put it in the data partition
-LOCAL_MODULE_PATH := $(TARGET_OUT_DATA_APPS)
-
-LOCAL_SRC_FILES := $(call all-java-files-under, src)
-
-LOCAL_MODULE := CtsAssistCommon
-
-LOCAL_SDK_VERSION := current
-
-include $(BUILD_STATIC_JAVA_LIBRARY)
diff --git a/tests/tests/assist/common/src/android/assist/common/AutoResetLatch.java b/tests/tests/assist/common/src/android/assist/common/AutoResetLatch.java
new file mode 100644
index 0000000..f358120
--- /dev/null
+++ b/tests/tests/assist/common/src/android/assist/common/AutoResetLatch.java
@@ -0,0 +1,58 @@
+/*
+ * Copyright (C) 2019 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.assist.common;
+
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * A [CountDownLatch] that resets itself to [mCount] after every await call.
+ */
+public class AutoResetLatch {
+
+    private final int mCount;
+    private CountDownLatch mLatch;
+
+    public AutoResetLatch() {
+        this(1);
+    }
+
+    public AutoResetLatch(int count) {
+        mCount = count;
+        mLatch = new CountDownLatch(count);
+    }
+
+    public void await() throws InterruptedException {
+        try {
+            mLatch.await();
+        } finally {
+            mLatch = new CountDownLatch(mCount);
+        }
+    }
+
+    public boolean await(long timeout, TimeUnit unit) throws InterruptedException {
+        try {
+            return mLatch.await(timeout, unit);
+        } finally {
+            mLatch = new CountDownLatch(mCount);
+        }
+    }
+
+    public void countDown() {
+        mLatch.countDown();
+    }
+}
diff --git a/tests/tests/assist/common/src/android/assist/common/BaseRemoteCallbackActivity.java b/tests/tests/assist/common/src/android/assist/common/BaseRemoteCallbackActivity.java
new file mode 100644
index 0000000..8f9e9d3
--- /dev/null
+++ b/tests/tests/assist/common/src/android/assist/common/BaseRemoteCallbackActivity.java
@@ -0,0 +1,77 @@
+/*
+ * Copyright (C) 2019 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.assist.common;
+
+import android.app.Activity;
+import android.os.Bundle;
+import android.os.Handler;
+import android.os.Looper;
+import android.os.RemoteCallback;
+
+public class BaseRemoteCallbackActivity extends Activity {
+
+    private RemoteCallback mRemoteCallback;
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        registerReceivingCallback();
+    }
+
+    protected void notify(String action) {
+        RemoteCallback callback = getIntent().getParcelableExtra(Utils.EXTRA_REMOTE_CALLBACK);
+
+        if (callback == null) {
+            throw new IllegalStateException("Test ran expecting " + action
+                    + " but did not register callback");
+        } else {
+            Bundle bundle = new Bundle();
+            bundle.putString(Utils.EXTRA_REMOTE_CALLBACK_ACTION, action);
+            callback.sendResult(bundle);
+        }
+    }
+
+    protected void registerReceivingCallback() {
+        RemoteCallback remoteCallback = getIntent().getParcelableExtra(Utils.EXTRA_REMOTE_CALLBACK_RECEIVING);
+        if (remoteCallback == null) {
+            return;
+
+        }
+
+        mRemoteCallback = new RemoteCallback((results) -> {
+            String action = results.getString(Utils.EXTRA_REMOTE_CALLBACK_ACTION);
+            if (action.equals(Utils.ACTION_END_OF_TEST)) {
+                if (!isFinishing()) {
+                    finish();
+                }
+            } else {
+                onReceivedEventFromCaller(results, action);
+            }
+        }, new Handler(Looper.getMainLooper()));
+
+        Bundle bundle = new Bundle();
+        bundle.putString(Utils.EXTRA_REMOTE_CALLBACK_ACTION, Utils.EXTRA_REMOTE_CALLBACK_RECEIVING_ACTION);
+        bundle.putParcelable(Utils.EXTRA_REMOTE_CALLBACK_RECEIVING, mRemoteCallback);
+        remoteCallback.sendResult(bundle);
+    }
+
+    /**
+     * React to events from the calling test. Called from the main thread.
+     */
+    protected void onReceivedEventFromCaller(Bundle results, String action) {
+    }
+}
diff --git a/tests/tests/assist/common/src/android/assist/common/Utils.java b/tests/tests/assist/common/src/android/assist/common/Utils.java
index 349574b..50e4d42 100755
--- a/tests/tests/assist/common/src/android/assist/common/Utils.java
+++ b/tests/tests/assist/common/src/android/assist/common/Utils.java
@@ -36,6 +36,7 @@
     public static final String BROADCAST_ASSIST_DATA_INTENT = ACTION_PREFIX + "ASSIST_DATA";
     public static final String BROADCAST_INTENT_START_ASSIST = ACTION_PREFIX + "START_ASSIST";
     public static final String ASSIST_RECEIVER_REGISTERED = ACTION_PREFIX + "ASSIST_READY";
+    public static final String ACTION_END_OF_TEST = ACTION_PREFIX + "END_OF_TEST";
 
     public static final String ACTION_INVALIDATE = "invalidate_action";
     public static final String GET_CONTENT_VIEW_HEIGHT = ACTION_PREFIX + "GET_CONTENT_VIEW_HEIGHT";
@@ -68,11 +69,10 @@
     public static final String GAINED_FOCUS = ACTION_PREFIX + "focus_changed";
     public static final String LOST_FOCUS = ACTION_PREFIX + "lost_focus";
 
-    /** Flag Secure Test intent constants */
-    public static final String FLAG_SECURE_HASRESUMED = ACTION_PREFIX + "flag_secure_hasResumed";
     public static final String APP_3P_HASRESUMED = ACTION_PREFIX + "app_3p_hasResumed";
     public static final String APP_3P_HASDRAWED = ACTION_PREFIX + "app_3p_hasDrawed";
-    public static final String TEST_ACTIVITY_LOADED = ACTION_PREFIX + "test_activity_hasResumed";
+    public static final String TEST_ACTIVITY_DESTROY = ACTION_PREFIX + "test_activity_destroy";
+    public static final String TEST_ACTIVITY_WEBVIEW_LOADED = ACTION_PREFIX + "test_activity_webview_hasResumed";
 
     // Notice: timeout belows have to be long because some devices / form factors (like car) are
     // slower.
@@ -93,9 +93,11 @@
      * Extras used to pass RemoteCallback objects responsible for IPC between test, app, and
      * service.
      */
-    public static final String EXTRA_CALLBACK_CONTEXT_READY = "extra_callback_context_ready";
-    public static final String EXTRA_CALLBACK_ACTIVITY_RESUMED = "extra_callback_activity_resumed";
-    public static final String EXTRA_CALLBACK_ACTIVITY_DRAWED = "extra_callback_activity_drawed";
+    public static final String EXTRA_REMOTE_CALLBACK = "extra_remote_callback";
+    public static final String EXTRA_REMOTE_CALLBACK_ACTION = "extra_remote_callback_action";
+
+    public static final String EXTRA_REMOTE_CALLBACK_RECEIVING = "extra_remote_callback_receiving";
+    public static final String EXTRA_REMOTE_CALLBACK_RECEIVING_ACTION = "extra_remote_callback_receiving_action";
 
     /** Test name suffixes */
     public static final String ASSIST_STRUCTURE = "ASSIST_STRUCTURE";
@@ -113,6 +115,7 @@
 
     /** Session intent constants */
     public static final String HIDE_SESSION = "android.intent.action.hide_session";
+    public static final String HIDE_SESSION_COMPLETE = "android.intent.action.hide_session_complete";
 
     /** Lifecycle activity intent constants */
     /** Session intent constants */
@@ -176,30 +179,6 @@
         }
     }
 
-    /** The shim activity that starts the service associated with each test. */
-    public static final String getTestActivity(String testCaseType) {
-        switch (testCaseType) {
-            case DISABLE_CONTEXT:
-                // doesn't need to wait for activity to resume
-                // can be activated on top of any non-secure activity.
-                return "service.DisableContextActivity";
-            case ASSIST_STRUCTURE:
-            case FLAG_SECURE:
-            case LIFECYCLE:
-            case LIFECYCLE_NOUI:
-            case SCREENSHOT:
-            case EXTRA_ASSIST:
-            case VERIFY_CONTENT_VIEW:
-            case TEXTVIEW:
-            case LARGE_VIEW_HIERARCHY:
-            case WEBVIEW:
-            case FOCUS_CHANGE:
-                return "service.DelayedAssistantActivity";
-            default:
-                return "";
-        }
-    }
-
     /**
      * The test app associated with each test.
      */
@@ -207,8 +186,6 @@
         switch (testCaseType) {
             case ASSIST_STRUCTURE:
             case LARGE_VIEW_HIERARCHY:
-                return new ComponentName(
-                        "android.assist.testapp", "android.assist.testapp.TestApp");
             case DISABLE_CONTEXT:
                 return new ComponentName(
                         "android.assist.testapp", "android.assist.testapp.TestApp");
@@ -240,6 +217,14 @@
     }
 
     /**
+     * Sets the proper action used to launch an activity in the testapp package.
+     */
+    public static void setTestAppAction(Intent intent, String testCaseName) {
+        intent.putExtra(Utils.TESTCASE_TYPE, testCaseName);
+        intent.setAction("android.intent.action.TEST_APP_" + testCaseName);
+    }
+
+    /**
      * Returns the amount of time to wait for assist data.
      */
     public static final int getAssistDataTimeout(String testCaseType) {
@@ -278,4 +263,10 @@
     public static int getExpectedUid(Bundle extras) {
         return extras.getInt(MY_UID_EXTRA);
     }
+
+    public static Bundle bundleOfRemoteAction(String action) {
+        Bundle bundle = new Bundle();
+        bundle.putString(Utils.EXTRA_REMOTE_CALLBACK_ACTION, action);
+        return bundle;
+    }
 }
diff --git a/tests/tests/assist/service/AndroidManifest.xml b/tests/tests/assist/service/AndroidManifest.xml
index 6f01d3d..05da5fd 100644
--- a/tests/tests/assist/service/AndroidManifest.xml
+++ b/tests/tests/assist/service/AndroidManifest.xml
@@ -23,24 +23,28 @@
     <application>
       <uses-library android:name="android.test.runner" />
       <service android:name=".MainInteractionService"
-              android:label="CTS test voice interaction service"
-              android:permission="android.permission.BIND_VOICE_INTERACTION"
-              android:process=":interactor"
-              android:exported="true">
+               android:label="CTS test voice interaction service"
+               android:permission="android.permission.BIND_VOICE_INTERACTION"
+               android:process=":interactor"
+               android:exported="true"
+               android:visibleToInstantApps="true">
           <meta-data android:name="android.voice_interaction"
                      android:resource="@xml/interaction_service" />
           <intent-filter>
               <action android:name="android.service.voice.VoiceInteractionService" />
           </intent-filter>
       </service>
-      <activity android:name=".DisableContextActivity" >
+      <activity android:name=".DisableContextActivity"
+                android:visibleToInstantApps="true">
           <intent-filter>
               <action android:name="android.intent.action.START_TEST_DISABLE_CONTEXT" />
               <category android:name="android.intent.category.DEFAULT" />
           </intent-filter>
       </activity>
       <activity android:name=".DelayedAssistantActivity"
-                android:label="Delay Assistant Start Activity">
+                android:label="Delay Assistant Start Activity"
+                android:exported="true"
+                android:visibleToInstantApps="true">
           <intent-filter>
               <action android:name="android.intent.action.START_TEST_ASSIST_STRUCTURE" />
               <action android:name="android.intent.action.START_TEST_LIFECYCLE" />
@@ -50,6 +54,9 @@
               <action android:name="android.intent.action.START_TEST_EXTRA_ASSIST" />
               <action android:name="android.intent.action.START_TEST_TEXTVIEW" />
               <action android:name="android.intent.action.START_TEST_LARGE_VIEW_HIERARCHY" />
+              <action android:name="android.intent.action.START_TEST_VERIFY_CONTENT_VIEW" />
+              <action android:name="android.intent.action.START_TEST_FOCUS_CHANGE" />
+              <action android:name="android.intent.action.START_TEST_WEBVIEW" />
               <category android:name="android.intent.category.DEFAULT" />
           </intent-filter>
       </activity>
diff --git a/tests/tests/assist/service/src/android/assist/service/DelayedAssistantActivity.java b/tests/tests/assist/service/src/android/assist/service/DelayedAssistantActivity.java
index ddf43bd..d68106a 100644
--- a/tests/tests/assist/service/src/android/assist/service/DelayedAssistantActivity.java
+++ b/tests/tests/assist/service/src/android/assist/service/DelayedAssistantActivity.java
@@ -16,19 +16,22 @@
 
 package android.assist.service;
 
-import android.app.Activity;
+import android.assist.common.BaseRemoteCallbackActivity;
 import android.assist.common.Utils;
-import android.content.Intent;
 import android.content.ComponentName;
+import android.content.Intent;
 import android.os.Bundle;
+import android.os.RemoteCallback;
 import android.util.Log;
 
-public class DelayedAssistantActivity extends Activity {
+public class DelayedAssistantActivity extends BaseRemoteCallbackActivity {
     static final String TAG = "DelayedAssistantActivity";
 
     @Override
     public void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
+        RemoteCallback remoteCallback = getIntent().getParcelableExtra(Utils.EXTRA_REMOTE_CALLBACK);
+
         Intent intent = new Intent();
         intent.setComponent(new ComponentName(this, MainInteractionService.class));
         intent.putExtra(Utils.EXTRA_REGISTER_RECEIVER, true);
@@ -37,8 +40,15 @@
                 getIntent().getIntExtra(Utils.DISPLAY_WIDTH_KEY, 0));
         intent.putExtra(Utils.DISPLAY_HEIGHT_KEY,
                 getIntent().getIntExtra(Utils.DISPLAY_HEIGHT_KEY, 0));
+        intent.putExtra(Utils.EXTRA_REMOTE_CALLBACK, remoteCallback);
         finish();
         ComponentName serviceName = startService(intent);
         Log.i(TAG, "Started service: " + serviceName);
     }
+
+    @Override
+    protected void onDestroy() {
+        super.onDestroy();
+        notify(Utils.TEST_ACTIVITY_DESTROY);
+    }
 }
diff --git a/tests/tests/assist/service/src/android/assist/service/DisableContextActivity.java b/tests/tests/assist/service/src/android/assist/service/DisableContextActivity.java
index 2fd540b..c02370e 100644
--- a/tests/tests/assist/service/src/android/assist/service/DisableContextActivity.java
+++ b/tests/tests/assist/service/src/android/assist/service/DisableContextActivity.java
@@ -16,27 +16,32 @@
 
 package android.assist.service;
 
-import android.app.Activity;
-import android.content.Intent;
+import android.assist.common.BaseRemoteCallbackActivity;
+import android.assist.common.Utils;
 import android.content.ComponentName;
-import android.os.Bundle;
+import android.content.Intent;
+import android.os.RemoteCallback;
 import android.util.Log;
 
-public class DisableContextActivity extends Activity {
+public class DisableContextActivity extends BaseRemoteCallbackActivity {
     static final String TAG = "DisableContextActivity";
 
     @Override
-    public void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-    }
-
-    @Override
     public void onStart() {
         super.onStart();
+
+        RemoteCallback remoteCallback = getIntent().getParcelableExtra(Utils.EXTRA_REMOTE_CALLBACK);
         Intent intent = new Intent();
         intent.setComponent(new ComponentName(this, MainInteractionService.class));
+        intent.putExtra(Utils.EXTRA_REMOTE_CALLBACK, remoteCallback);
         Log.i(TAG, "Starting service.");
         finish();
         startService(intent);
     }
+
+    @Override
+    protected void onDestroy() {
+        super.onDestroy();
+        notify(Utils.TEST_ACTIVITY_DESTROY);
+    }
 }
diff --git a/tests/tests/assist/service/src/android/assist/service/MainInteractionService.java b/tests/tests/assist/service/src/android/assist/service/MainInteractionService.java
index 3aa8261..d5e3a6d 100644
--- a/tests/tests/assist/service/src/android/assist/service/MainInteractionService.java
+++ b/tests/tests/assist/service/src/android/assist/service/MainInteractionService.java
@@ -19,6 +19,7 @@
 import static android.service.voice.VoiceInteractionSession.SHOW_WITH_ASSIST;
 import static android.service.voice.VoiceInteractionSession.SHOW_WITH_SCREENSHOT;
 
+import android.assist.common.AutoResetLatch;
 import android.assist.common.Utils;
 import android.content.BroadcastReceiver;
 import android.content.ComponentName;
@@ -31,17 +32,14 @@
 import android.service.voice.VoiceInteractionSession;
 import android.util.Log;
 
-import java.lang.Exception;
-import java.lang.Override;
-import java.util.concurrent.CountDownLatch;
-import java.util.concurrent.TimeUnit;
-
 public class MainInteractionService extends VoiceInteractionService {
     static final String TAG = "MainInteractionService";
     private Intent mIntent;
     private boolean mReady = false;
-    private BroadcastReceiver mBroadcastReceiver, mResumeReceiver;
-    private CountDownLatch mResumeLatch;
+    private BroadcastReceiver mBroadcastReceiver;
+    private AutoResetLatch mResumeLatch = new AutoResetLatch();
+
+    private RemoteCallback mRemoteCallback;
 
     @Override
     public void onCreate() {
@@ -60,10 +58,22 @@
     public int onStartCommand(Intent intent, int flags, int startId) {
         Log.i(TAG, "onStartCommand received - intent: " + intent);
         mIntent = intent;
+        mRemoteCallback = mIntent.getParcelableExtra(Utils.EXTRA_REMOTE_CALLBACK);
         maybeStart();
         return START_NOT_STICKY;
     }
 
+    protected void notify(String action) {
+        if (mRemoteCallback == null) {
+            throw new IllegalStateException("Test ran expecting " + action + " but did not register"
+                    + "callback");
+        } else {
+            Bundle bundle = new Bundle();
+            bundle.putString(Utils.EXTRA_REMOTE_CALLBACK_ACTION, action);
+            mRemoteCallback.sendResult(bundle);
+        }
+    }
+
     private void maybeStart() {
         if (mIntent == null || !mReady) {
             Log.wtf(TAG, "Can't start session because either intent is null or onReady() "
@@ -71,28 +81,25 @@
         } else {
             if (isActiveService(this, new ComponentName(this, getClass()))) {
                 if (mIntent.getBooleanExtra(Utils.EXTRA_REGISTER_RECEIVER, false)) {
-                    mResumeLatch = new CountDownLatch(1);
                     if (mBroadcastReceiver == null) {
                         mBroadcastReceiver = new MainInteractionServiceBroadcastReceiver();
                         IntentFilter filter = new IntentFilter();
                         filter.addAction(Utils.BROADCAST_INTENT_START_ASSIST);
-                        registerReceiver(mBroadcastReceiver, filter);
+                        registerReceiver(mBroadcastReceiver, filter,
+                                Context.RECEIVER_VISIBLE_TO_INSTANT_APPS);
                         Log.i(TAG, "Registered receiver to start session later");
-
-                        IntentFilter resumeFilter = new IntentFilter(Utils.APP_3P_HASRESUMED);
-                        mResumeReceiver = new MainServiceAppResumeReceiver();
-                        registerReceiver(mResumeReceiver, resumeFilter);
-                        Log.i(TAG, "Registered receiver for resuming activity");
                     }
-                    sendBroadcast(new Intent(Utils.ASSIST_RECEIVER_REGISTERED));
-              } else {
-                  Log.i(TAG, "Yay! about to start session");
-                  Bundle bundle = new Bundle();
-                  bundle.putString(Utils.TESTCASE_TYPE,
-                          mIntent.getStringExtra(Utils.TESTCASE_TYPE));
-                  showSession(bundle, VoiceInteractionSession.SHOW_WITH_ASSIST |
-                      VoiceInteractionSession.SHOW_WITH_SCREENSHOT);
-              }
+                    notify(Utils.ASSIST_RECEIVER_REGISTERED);
+                } else {
+                    Log.i(TAG, "Yay! about to start session");
+                    Bundle bundle = new Bundle();
+                    bundle.putString(Utils.TESTCASE_TYPE,
+                            mIntent.getStringExtra(Utils.TESTCASE_TYPE));
+                    bundle.putParcelable(Utils.EXTRA_REMOTE_CALLBACK,
+                            mIntent.getParcelableExtra(Utils.EXTRA_REMOTE_CALLBACK));
+                    showSession(bundle, VoiceInteractionSession.SHOW_WITH_ASSIST |
+                            VoiceInteractionSession.SHOW_WITH_SCREENSHOT);
+                }
             } else {
                 Log.wtf(TAG, "**** Not starting MainInteractionService because" +
                         " it is not set as the current voice interaction service");
@@ -104,53 +111,20 @@
         @Override
         public void onReceive(Context context, Intent intent) {
             Log.i(TAG, "Received broadcast to start session now: " + intent);
-            if (intent.getAction().equals(Utils.BROADCAST_INTENT_START_ASSIST)) {
+            String action = intent.getAction();
+            if (action.equals(Utils.BROADCAST_INTENT_START_ASSIST)) {
                 String testCaseName = intent.getStringExtra(Utils.TESTCASE_TYPE);
-                Log.i(TAG, "trying to start 3p activity: " + testCaseName);
                 Bundle extras = intent.getExtras();
                 if (extras == null) {
                     extras = new Bundle();
                 }
-                RemoteCallback contextReadycallback = intent
-                        .getParcelableExtra(Utils.EXTRA_CALLBACK_CONTEXT_READY);
-                extras.putParcelable(Utils.EXTRA_CALLBACK_CONTEXT_READY, contextReadycallback);
-                if (testCaseName.equals(Utils.SCREENSHOT)) {
-                    try {
-                        // extra info to pass along to 3p activity.
 
-                        Intent intent3p = new Intent();
-                        Log.i(TAG, "starting the 3p app again");
-                        intent3p.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
-                        intent3p.setAction("android.intent.action.TEST_APP_" + testCaseName);
-                        intent3p.setComponent(Utils.getTestAppComponent(testCaseName));
-                        intent3p.putExtras(extras);
-                        startActivity(intent3p);
-                        if (!MainInteractionService.this.mResumeLatch
-                                .await(Utils.ACTIVITY_ONRESUME_TIMEOUT_MS, TimeUnit.MILLISECONDS)) {
-                            Log.i(TAG, "waited for 3p activity to resume");
-                        }
-                    } catch (Exception e) {
-                        Log.i(TAG, "failed so reload 3p app: " + e.toString());
-                    }
-                }
                 extras.putString(Utils.TESTCASE_TYPE, mIntent.getStringExtra(Utils.TESTCASE_TYPE));
+                extras.putParcelable(Utils.EXTRA_REMOTE_CALLBACK, mRemoteCallback);
                 MainInteractionService.this.showSession(
                         extras, SHOW_WITH_ASSIST | SHOW_WITH_SCREENSHOT);
-            }
-        }
-    }
-
-    private class MainServiceAppResumeReceiver extends BroadcastReceiver {
-        @Override
-        public void onReceive(Context context, Intent intent) {
-            if (intent.getAction().equals(Utils.APP_3P_HASRESUMED)) {
-                Log.i(MainInteractionService.TAG,
-                    "3p activity has resumed in this new receiver");
-                if (MainInteractionService.this.mResumeLatch != null) {
-                    MainInteractionService.this.mResumeLatch.countDown();
-                } else {
-                    Log.i(TAG, "mResumeLatch was null");
-                }
+            } else {
+                Log.e(TAG, "MainInteractionServiceBroadcastReceiver: invalid action " + action);
             }
         }
     }
@@ -161,4 +135,4 @@
             unregisterReceiver(mBroadcastReceiver);
         }
     }
-}
\ No newline at end of file
+}
diff --git a/tests/tests/assist/service/src/android/assist/service/MainInteractionSession.java b/tests/tests/assist/service/src/android/assist/service/MainInteractionSession.java
index 068a4a8..f349971 100644
--- a/tests/tests/assist/service/src/android/assist/service/MainInteractionSession.java
+++ b/tests/tests/assist/service/src/android/assist/service/MainInteractionSession.java
@@ -18,35 +18,25 @@
 
 import android.app.assist.AssistContent;
 import android.app.assist.AssistStructure;
-import android.assist.service.R;
+import android.assist.common.Utils;
 import android.content.BroadcastReceiver;
 import android.content.Context;
 import android.content.Intent;
 import android.content.IntentFilter;
 import android.graphics.Bitmap;
-import android.graphics.Color;
-
 import android.graphics.Point;
 import android.os.Bundle;
 import android.os.RemoteCallback;
 import android.service.voice.VoiceInteractionSession;
-import android.util.DisplayMetrics;
 import android.util.Log;
 import android.view.Display;
 import android.view.LayoutInflater;
 import android.view.View;
 import android.view.ViewTreeObserver;
 
-import java.io.ByteArrayOutputStream;
-import java.util.Date;
-
-import android.assist.common.Utils;
-import android.view.WindowManager;
-
 public class MainInteractionSession extends VoiceInteractionSession {
     static final String TAG = "MainInteractionSession";
 
-    Intent mStartIntent;
     Context mContext;
     Bundle mAssistData = new Bundle();
 
@@ -58,7 +48,7 @@
     private BroadcastReceiver mReceiver;
     private String mTestName;
     private View mContentView;
-    private RemoteCallback mContextReadyCallback;
+    private RemoteCallback mRemoteCallback;
 
     MainInteractionSession(Context context) {
         super(context);
@@ -75,11 +65,15 @@
                 if (action.equals(Utils.HIDE_SESSION)) {
                     hide();
                 }
+
+                Bundle bundle = new Bundle();
+                bundle.putString(Utils.EXTRA_REMOTE_CALLBACK_ACTION, Utils.HIDE_SESSION_COMPLETE);
+                mRemoteCallback.sendResult(bundle);
             }
         };
         IntentFilter filter = new IntentFilter();
         filter.addAction(Utils.HIDE_SESSION);
-        mContext.registerReceiver(mReceiver, filter);
+        mContext.registerReceiver(mReceiver, filter, Context.RECEIVER_VISIBLE_TO_INSTANT_APPS);
     }
 
     @Override
@@ -109,7 +103,7 @@
         mCurColor = args.getInt(Utils.SCREENSHOT_COLOR_KEY);
         mDisplayHeight = args.getInt(Utils.DISPLAY_HEIGHT_KEY);
         mDisplayWidth = args.getInt(Utils.DISPLAY_WIDTH_KEY);
-        mContextReadyCallback = args.getParcelable(Utils.EXTRA_CALLBACK_CONTEXT_READY);
+        mRemoteCallback = args.getParcelable(Utils.EXTRA_REMOTE_CALLBACK);
         super.onShow(args, showFlags);
         if (mContentView == null) return; // Happens when ui is not enabled.
         mContentView.getViewTreeObserver().addOnPreDrawListener(
@@ -120,11 +114,12 @@
                     Display d = mContentView.getDisplay();
                     Point displayPoint = new Point();
                     d.getRealSize(displayPoint);
-                    Intent intent = new Intent(Utils.BROADCAST_CONTENT_VIEW_HEIGHT);
-                    intent.putExtra(Utils.EXTRA_CONTENT_VIEW_HEIGHT, mContentView.getHeight());
-                    intent.putExtra(Utils.EXTRA_CONTENT_VIEW_WIDTH, mContentView.getWidth());
-                    intent.putExtra(Utils.EXTRA_DISPLAY_POINT, displayPoint);
-                    mContext.sendBroadcast(intent);
+                    Bundle bundle = new Bundle();
+                    bundle.putString(Utils.EXTRA_REMOTE_CALLBACK_ACTION, Utils.BROADCAST_CONTENT_VIEW_HEIGHT);
+                    bundle.putInt(Utils.EXTRA_CONTENT_VIEW_HEIGHT, mContentView.getHeight());
+                    bundle.putInt(Utils.EXTRA_CONTENT_VIEW_WIDTH, mContentView.getWidth());
+                    bundle.putParcelable(Utils.EXTRA_DISPLAY_POINT, displayPoint);
+                    mRemoteCallback.sendResult(bundle);
                     return true;
                 }
             });
@@ -215,17 +210,10 @@
         } else if (!hasReceivedScreenshot) {
             Log.i(TAG, "waiting for screenshot before broadcasting results");
         } else {
-            if (mContextReadyCallback != null) {
-                Log.i(TAG, "maybeBroadcastResults(): calling callback " + mContextReadyCallback);
-                mContextReadyCallback.sendResult(mAssistData);
-            } else {
-                // TODO(b/133431034): should only use callbacks
-                Log.w(TAG, "maybeBroadcastResults(): no callback; broadcasting instead");
-                Intent intent = new Intent(Utils.BROADCAST_ASSIST_DATA_INTENT);
-                intent.putExtras(mAssistData);
-                Log.i(TAG, "broadcasting: " + intent+ ", Bundle = " + mAssistData);
-                mContext.sendBroadcast(intent);
-            }
+            Bundle bundle = new Bundle();
+            bundle.putString(Utils.EXTRA_REMOTE_CALLBACK_ACTION, Utils.BROADCAST_ASSIST_DATA_INTENT);
+            bundle.putAll(mAssistData);
+            mRemoteCallback.sendResult(bundle);
 
             hasReceivedAssistData = false;
             hasReceivedScreenshot = false;
diff --git a/tests/tests/assist/src/android/assist/cts/AssistStructureTest.java b/tests/tests/assist/src/android/assist/cts/AssistStructureTest.java
index 70669e5..0506bc9 100755
--- a/tests/tests/assist/src/android/assist/cts/AssistStructureTest.java
+++ b/tests/tests/assist/src/android/assist/cts/AssistStructureTest.java
@@ -16,14 +16,10 @@
 
 package android.assist.cts;
 
+import android.assist.common.AutoResetLatch;
 import android.assist.common.Utils;
-import android.content.BroadcastReceiver;
-import android.content.Context;
-import android.content.Intent;
-import android.content.IntentFilter;
 import android.util.Log;
 
-import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.TimeUnit;
 
 
@@ -35,50 +31,20 @@
     private static final String TAG = "AssistStructureTest";
     private static final String TEST_CASE_TYPE = Utils.ASSIST_STRUCTURE;
 
-    private final CountDownLatch mHasDrawedLatch = new CountDownLatch(1);
+    private AutoResetLatch mHasDrawedLatch;
 
     @Override
     protected void setUp() throws Exception {
         super.setUp();
-        setUpAndRegisterReceiver();
+        mHasDrawedLatch = new AutoResetLatch(1);
+        mActionLatchReceiver = new ActionLatchReceiver(Utils.APP_3P_HASDRAWED, mHasDrawedLatch);
         startTestActivity(TEST_CASE_TYPE);
     }
-
-    @Override
-    public void tearDown() throws Exception {
-        super.tearDown();
-        if (mReceiver != null) {
-            mContext.unregisterReceiver(mReceiver);
-            mReceiver = null;
-        }
-    }
-
-    private void setUpAndRegisterReceiver() {
-        if (mReceiver != null) {
-            mContext.unregisterReceiver(mReceiver);
-        }
-        mReceiver = new AssistStructureTestBroadcastReceiver();
-        IntentFilter filter = new IntentFilter();
-        filter.addAction(Utils.APP_3P_HASRESUMED);
-        filter.addAction(Utils.APP_3P_HASDRAWED);
-        filter.addAction(Utils.ASSIST_RECEIVER_REGISTERED);
-        mContext.registerReceiver(mReceiver, filter);
-    }
-
-    private void waitForOnResume() throws Exception {
-        Log.i(TAG, "waiting for onResume() before continuing");
-        if (!mHasResumedLatch.await(Utils.ACTIVITY_ONRESUME_TIMEOUT_MS, TimeUnit.MILLISECONDS)) {
-            fail("Activity failed to resume in " + Utils.ACTIVITY_ONRESUME_TIMEOUT_MS + "msec");
-        }
-
-    }
-
     private void waitForOnDraw() throws Exception {
         Log.i(TAG, "waiting for onDraw() before continuing");
         if (!mHasDrawedLatch.await(Utils.ACTIVITY_ONRESUME_TIMEOUT_MS, TimeUnit.MILLISECONDS)) {
             fail("Activity failed to draw in " + Utils.ACTIVITY_ONRESUME_TIMEOUT_MS + "msec");
         }
-
     }
 
     public void testAssistStructure() throws Throwable {
@@ -86,40 +52,16 @@
             Log.d(TAG, "Not running assist tests - voice_recognizers feature is not supported");
             return;
         }
-        start3pApp(TEST_CASE_TYPE, mHasDrawedLatch);
+        start3pApp(TEST_CASE_TYPE);
         startTest(TEST_CASE_TYPE);
-        waitForAssistantToBeReady(mReadyLatch);
-        waitForOnResume();
+        waitForAssistantToBeReady();
         waitForOnDraw();
-        final CountDownLatch latch = startSession();
+        final AutoResetLatch latch = startSession();
         waitForContext(latch);
         getInstrumentation().waitForIdleSync();
-        runTestOnUiThread(new Runnable() {
-            @Override
-            public void run() {
-                verifyAssistDataNullness(false, false, false, false);
-                verifyAssistStructure(Utils.getTestAppComponent(TEST_CASE_TYPE), false /*FLAG_SECURE set*/);
-            }
+        runTestOnUiThread(() -> {
+            verifyAssistDataNullness(false, false, false, false);
+            verifyAssistStructure(Utils.getTestAppComponent(TEST_CASE_TYPE), false /*FLAG_SECURE set*/);
         });
     }
-
-    private class AssistStructureTestBroadcastReceiver extends BroadcastReceiver {
-        @Override
-        public void onReceive(Context context, Intent intent) {
-            String action = intent.getAction();
-            if (action.equals(Utils.APP_3P_HASRESUMED)) {
-                if (mHasResumedLatch != null) {
-                    mHasResumedLatch.countDown();
-                }
-            } else if (action.equals(Utils.ASSIST_RECEIVER_REGISTERED)) {
-                if (mReadyLatch != null) {
-                    mReadyLatch.countDown();
-                }
-            }else if (action.equals(Utils.APP_3P_HASDRAWED)) {
-                if (mHasDrawedLatch != null) {
-                    mHasDrawedLatch.countDown();
-                }
-            }
-        }
-    }
 }
diff --git a/tests/tests/assist/src/android/assist/cts/AssistTestBase.java b/tests/tests/assist/src/android/assist/cts/AssistTestBase.java
index 438d905..dfb95dd 100644
--- a/tests/tests/assist/src/android/assist/cts/AssistTestBase.java
+++ b/tests/tests/assist/src/android/assist/cts/AssistTestBase.java
@@ -22,21 +22,21 @@
 import android.app.assist.AssistContent;
 import android.app.assist.AssistStructure;
 import android.app.assist.AssistStructure.ViewNode;
+import android.assist.common.AutoResetLatch;
 import android.assist.common.Utils;
-import android.content.BroadcastReceiver;
 import android.content.ComponentName;
 import android.content.Context;
 import android.content.Intent;
-import android.content.IntentFilter;
-import android.graphics.Bitmap;
 import android.graphics.Point;
 import android.os.Bundle;
+import android.os.Handler;
+import android.os.HandlerThread;
 import android.os.LocaleList;
 import android.os.RemoteCallback;
-import android.os.SystemClock;
 import android.provider.Settings;
 import android.test.ActivityInstrumentationTestCase2;
 import android.util.Log;
+import android.util.Pair;
 import android.view.Display;
 import android.view.View;
 import android.view.ViewGroup;
@@ -45,11 +45,13 @@
 import android.widget.TextView;
 
 import com.android.compatibility.common.util.SettingsUtils;
-import com.android.compatibility.common.util.SystemUtil;
 
-import java.util.concurrent.CountDownLatch;
+import java.util.HashMap;
+import java.util.Map;
 import java.util.concurrent.TimeUnit;
 
+import javax.annotation.Nullable;
+
 public class AssistTestBase extends ActivityInstrumentationTestCase2<TestStartActivity> {
     private static final String TAG = "AssistTestBase";
 
@@ -68,13 +70,24 @@
     protected AssistContent mAssistContent;
     protected AssistStructure mAssistStructure;
     protected boolean mScreenshot;
-    protected Bitmap mAppScreenshot;
-    protected BroadcastReceiver mReceiver;
     protected Bundle mAssistBundle;
     protected Context mContext;
-    protected final CountDownLatch mReadyLatch = new CountDownLatch(1);
-    protected final CountDownLatch mHasResumedLatch = new CountDownLatch(1);
-    private CountDownLatch mAssistDataReceivedLatch;
+    private AutoResetLatch mReadyLatch = new AutoResetLatch(1);
+    private AutoResetLatch mHas3pResumedLatch = new AutoResetLatch(1);
+    private AutoResetLatch mHasTestDestroyedLatch = new AutoResetLatch(1);
+    private AutoResetLatch mSessionCompletedLatch = new AutoResetLatch(1);
+    protected AutoResetLatch mAssistDataReceivedLatch = new AutoResetLatch();
+
+    protected ActionLatchReceiver mActionLatchReceiver;
+
+    private final RemoteCallback mRemoteCallback = new RemoteCallback((result) -> {
+        String action = result.getString(Utils.EXTRA_REMOTE_CALLBACK_ACTION);
+        mActionLatchReceiver.onAction(result, action);
+    });
+
+    @Nullable
+    protected RemoteCallback m3pActivityCallback;
+    private RemoteCallback m3pCallbackReceiving;
 
     protected boolean mScreenshotMatches;
     private Point mDisplaySize;
@@ -103,25 +116,19 @@
         mAssistContent = null;
         mAssistBundle = null;
 
-        if (mReceiver != null) {
-            mContext.unregisterReceiver(mReceiver);
-        }
-        mReceiver = new TestResultsReceiver();
-        mContext.registerReceiver(mReceiver,
-            new IntentFilter(Utils.BROADCAST_ASSIST_DATA_INTENT));
+        mActionLatchReceiver = new ActionLatchReceiver();
 
         prepareDevice();
+        registerForAsyncReceivingCallback();
     }
 
     @Override
     protected void tearDown() throws Exception {
         mTestActivity.finish();
         mContext.sendBroadcast(new Intent(Utils.HIDE_SESSION));
-        if (mReceiver != null) {
-            mContext.unregisterReceiver(mReceiver);
-            mReceiver = null;
-        }
+        m3pCallbackReceiving.sendResult(Utils.bundleOfRemoteAction(Utils.ACTION_END_OF_TEST));
         super.tearDown();
+        mSessionCompletedLatch.await(3, TimeUnit.SECONDS);
     }
 
     private void prepareDevice() throws Exception {
@@ -134,28 +141,66 @@
         runShellCommand("wm dismiss-keyguard");
     }
 
-    protected void startTest(String testName) {
-        mTestActivity.startTest(testName);
+    private void registerForAsyncReceivingCallback() {
+        HandlerThread handlerThread = new HandlerThread("AssistTestCallbackReceivingThread");
+        handlerThread.start();
+        Handler handler = new Handler(handlerThread.getLooper());
+
+        m3pCallbackReceiving = new RemoteCallback((results) -> {
+            String action = results.getString(Utils.EXTRA_REMOTE_CALLBACK_ACTION);
+            if (action.equals(Utils.EXTRA_REMOTE_CALLBACK_RECEIVING_ACTION)) {
+                m3pActivityCallback = results.getParcelable(Utils.EXTRA_REMOTE_CALLBACK_RECEIVING);
+            }
+        }, handler);
     }
 
-    protected void start3pApp(String testName) {
-        start3pApp(testName, /* hasDrawedLatch= */ null);
+    protected void startTest(String testName) throws Exception {
+        Log.i(TAG, "Starting test activity for TestCaseType = " + testName);
+        Intent intent = new Intent();
+        intent.putExtra(Utils.TESTCASE_TYPE, testName);
+        intent.setAction("android.intent.action.START_TEST_" + testName);
+        intent.putExtra(Utils.EXTRA_REMOTE_CALLBACK, mRemoteCallback);
+        intent.addFlags(Intent.FLAG_ACTIVITY_MATCH_EXTERNAL);
+
+        mTestActivity.startActivity(intent);
+        waitForTestActivityOnDestroy();
     }
 
-    protected void start3pApp(String testName, CountDownLatch hasDrawedLatch) {
-        mTestActivity.start3pApp(testName, mHasResumedLatch, hasDrawedLatch);
+    protected void start3pApp(String testCaseName) throws Exception {
+        start3pApp(testCaseName, null);
+    }
+
+    protected void start3pApp(String testCaseName, Bundle extras) throws Exception {
+        Intent intent = new Intent();
+        intent.putExtra(Utils.TESTCASE_TYPE, testCaseName);
+        Utils.setTestAppAction(intent, testCaseName);
+        intent.putExtra(Utils.EXTRA_REMOTE_CALLBACK, mRemoteCallback);
+        intent.addFlags(Intent.FLAG_ACTIVITY_MATCH_EXTERNAL);
+        intent.putExtra(Utils.EXTRA_REMOTE_CALLBACK_RECEIVING, m3pCallbackReceiving);
+        if (extras != null) {
+            intent.putExtras(extras);
+        }
+
+        mTestActivity.startActivity(intent);
+        waitForOnResume();
     }
 
     /**
      * Starts the shim service activity
      */
     protected void startTestActivity(String testName) {
+        RemoteCallback remoteCallback = new RemoteCallback((result) -> {
+            String action = result.getString(Utils.EXTRA_REMOTE_CALLBACK_ACTION);
+            if (mActionLatchReceiver != null) {
+                mActionLatchReceiver.onAction(result, action);
+            }
+        });
+
         Intent intent = new Intent();
         mTestName = testName;
         intent.setAction("android.intent.action.TEST_START_ACTIVITY_" + testName);
-        intent.setComponent(new ComponentName(getInstrumentation().getContext(),
-                TestStartActivity.class));
         intent.putExtra(Utils.TESTCASE_TYPE, testName);
+        intent.putExtra(Utils.EXTRA_REMOTE_CALLBACK, remoteCallback);
         setActivityIntent(intent);
         mTestActivity = getActivity();
         mActivityManager = (ActivityManager) mContext.getSystemService(Context.ACTIVITY_SERVICE);
@@ -164,33 +209,42 @@
     /**
      * Called when waiting for Assistant's Broadcast Receiver to be setup
      */
-    public void waitForAssistantToBeReady(CountDownLatch latch) throws Exception {
+    protected void waitForAssistantToBeReady() throws Exception {
         Log.i(TAG, "waiting for assistant to be ready before continuing");
-        if (!latch.await(Utils.TIMEOUT_MS, TimeUnit.MILLISECONDS)) {
+        if (!mReadyLatch.await(Utils.TIMEOUT_MS, TimeUnit.MILLISECONDS)) {
             fail("Assistant was not ready before timeout of: " + Utils.TIMEOUT_MS + "msec");
         }
     }
 
+    private void waitForOnResume() throws Exception {
+        Log.i(TAG, "waiting for onResume() before continuing");
+        if (!mHas3pResumedLatch.await(Utils.ACTIVITY_ONRESUME_TIMEOUT_MS, TimeUnit.MILLISECONDS)) {
+            fail("Activity failed to resume in " + Utils.ACTIVITY_ONRESUME_TIMEOUT_MS + "msec");
+        }
+    }
+
+    private void waitForTestActivityOnDestroy() throws Exception {
+        Log.i(TAG, "waiting for mTestActivity onDestroy() before continuing");
+        if (!mHasTestDestroyedLatch.await(Utils.ACTIVITY_ONRESUME_TIMEOUT_MS, TimeUnit.MILLISECONDS)) {
+            fail("mTestActivity failed to destroy in " + Utils.ACTIVITY_ONRESUME_TIMEOUT_MS + "msec");
+        }
+    }
+
     /**
      * Send broadcast to MainInteractionService to start a session
      */
-    protected CountDownLatch startSession() {
+    protected AutoResetLatch startSession() {
         return startSession(mTestName, new Bundle());
     }
 
-    protected CountDownLatch startSession(String testName, Bundle extras) {
+    protected AutoResetLatch startSession(String testName, Bundle extras) {
         Intent intent = new Intent(Utils.BROADCAST_INTENT_START_ASSIST);
         Log.i(TAG, "passed in class test name is: " + testName);
         intent.putExtra(Utils.TESTCASE_TYPE, testName);
         addDimensionsToIntent(intent);
         intent.putExtras(extras);
-        mAssistDataReceivedLatch = new CountDownLatch(1);
-        final RemoteCallback contextReadyCallback = new RemoteCallback((result) -> {
-            Log.v(TAG, "Service called contextReady callback for " + testName + " RESULT: " + result);
-            setAssistResults(result);
-            mAssistDataReceivedLatch.countDown();
-        });
-        intent.putExtra(Utils.EXTRA_CALLBACK_CONTEXT_READY, contextReadyCallback);
+        intent.putExtra(Utils.EXTRA_REMOTE_CALLBACK, mRemoteCallback);
+        intent.setPackage("android.assist.service");
 
         mContext.sendBroadcast(intent);
         return mAssistDataReceivedLatch;
@@ -209,24 +263,7 @@
         intent.putExtra(Utils.DISPLAY_HEIGHT_KEY, mDisplaySize.y);
     }
 
-    /**
-     * Called after startTestActivity. Includes check for receiving context.
-     */
-    protected boolean waitForBroadcast() throws Exception {
-        mAssistDataReceivedLatch = new CountDownLatch(1);
-        start3pApp(mTestName);
-        startTest(mTestName);
-        return waitForContext(mAssistDataReceivedLatch);
-    }
-
-    protected boolean waitForContext(CountDownLatch sessionLatch) throws Exception {
-        if (mReceiver != null) {
-            mContext.unregisterReceiver(mReceiver);
-        }
-        mReceiver = new TestResultsReceiver();
-        mContext.registerReceiver(mReceiver,
-                new IntentFilter(Utils.BROADCAST_ASSIST_DATA_INTENT));
-
+    protected boolean waitForContext(AutoResetLatch sessionLatch) throws Exception {
         if (!sessionLatch.await(Utils.getAssistDataTimeout(mTestName), TimeUnit.MILLISECONDS)) {
             fail("Fail to receive broadcast in " + Utils.getAssistDataTimeout(mTestName) + "msec");
         }
@@ -417,12 +454,12 @@
         }
     }
 
-    /** 
+    /**
      * Return true if the expected strings are found in the WebView, else fail.
      */
     private boolean traverseWebViewForText(ViewNode parentNode) {
         boolean textFound = false;
-        if (parentNode.getText() != null 
+        if (parentNode.getText() != null
                 && parentNode.getText().toString().equals(Utils.WEBVIEW_HTML_GREETING)) {
             return true;
         }
@@ -541,33 +578,12 @@
         }
     }
 
-    // TODO(b/133431034): remove?
-    class TestResultsReceiver extends BroadcastReceiver {
-        @Override
-        public void onReceive(Context context, Intent intent) {
-            if (intent.getAction().equalsIgnoreCase(Utils.BROADCAST_ASSIST_DATA_INTENT)) {
-                Log.i(TAG, "Received broadcast with assist data.");
-                Bundle assistData = intent.getExtras();
-                AssistTestBase.this.setAssistResults(assistData);
-
-                if (mAssistDataReceivedLatch != null) {
-                    Log.i(AssistTestBase.TAG, "counting down latch. received assist data.");
-                    mAssistDataReceivedLatch.countDown();
-                }
-            } else if (intent.getAction().equals(Utils.APP_3P_HASRESUMED)) {
-                if (mHasResumedLatch != null) {
-                    mHasResumedLatch.countDown();
-                }
-            }
-        }
-    }
-
     protected void setAssistResults(Bundle assistData) {
         mAssistBundle = assistData.getBundle(Utils.ASSIST_BUNDLE_KEY);
         mAssistStructure = assistData.getParcelable(Utils.ASSIST_STRUCTURE_KEY);
         mAssistContent = assistData.getParcelable(Utils.ASSIST_CONTENT_KEY);
 
-        mScreenshot =assistData.getBoolean(Utils.ASSIST_SCREENSHOT_KEY, false);
+        mScreenshot = assistData.getBoolean(Utils.ASSIST_SCREENSHOT_KEY, false);
 
         mScreenshotMatches = assistData.getBoolean(Utils.COMPARE_SCREENSHOT_KEY, false);
     }
@@ -603,4 +619,44 @@
             return "screenshot_" + (value.equals("1") ? "enabled" : "disabled");
         }
     }
+
+    public class ActionLatchReceiver {
+
+        private final Map<String, AutoResetLatch> entries = new HashMap<>();
+
+        protected ActionLatchReceiver(Pair<String, AutoResetLatch>... entries) {
+            for (Pair<String, AutoResetLatch> entry : entries) {
+                if (entry.second == null) {
+                    throw new IllegalArgumentException("Test cannot pass in a null latch");
+                }
+                this.entries.put(entry.first, entry.second);
+            }
+
+            this.entries.put(Utils.HIDE_SESSION_COMPLETE, mSessionCompletedLatch);
+            this.entries.put(Utils.APP_3P_HASRESUMED, mHas3pResumedLatch);
+            this.entries.put(Utils.TEST_ACTIVITY_DESTROY, mHasTestDestroyedLatch);
+            this.entries.put(Utils.ASSIST_RECEIVER_REGISTERED, mReadyLatch);
+            this.entries.put(Utils.BROADCAST_ASSIST_DATA_INTENT, mAssistDataReceivedLatch);
+        }
+
+        protected ActionLatchReceiver(String action, AutoResetLatch latch) {
+            this(Pair.create(action, latch));
+        }
+
+        protected void onAction(Bundle bundle, String action) {
+            switch (action) {
+                case Utils.BROADCAST_ASSIST_DATA_INTENT:
+                    AssistTestBase.this.setAssistResults(bundle);
+                    // fall-through
+                default:
+                    AutoResetLatch latch = entries.get(action);
+                    if (latch == null) {
+                        Log.e(TAG, this.getClass() + ": invalid action " + action);
+                    } else {
+                        latch.countDown();
+                    }
+                    break;
+            }
+        }
+    }
 }
diff --git a/tests/tests/assist/src/android/assist/cts/AssistantContentViewTest.java b/tests/tests/assist/src/android/assist/cts/AssistantContentViewTest.java
index cb09270..a4a28d7 100644
--- a/tests/tests/assist/src/android/assist/cts/AssistantContentViewTest.java
+++ b/tests/tests/assist/src/android/assist/cts/AssistantContentViewTest.java
@@ -16,49 +16,31 @@
 
 package android.assist.cts;
 
+import android.assist.common.AutoResetLatch;
 import android.assist.common.Utils;
-import android.content.BroadcastReceiver;
-import android.content.Context;
-import android.content.Intent;
-import android.content.IntentFilter;
 import android.graphics.Point;
+import android.os.Bundle;
 import android.util.Log;
 
-import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.TimeUnit;
 
 /** Test verifying the Content View of the Assistant */
 public class AssistantContentViewTest extends AssistTestBase {
     private static final String TAG = "ContentViewTest";
-    private final CountDownLatch mContentViewLatch = new CountDownLatch(1);
-    private Intent mIntent;
+    private AutoResetLatch mContentViewLatch = new AutoResetLatch(1);
+    private Bundle mBundle;
 
     @Override
     public void setUp() throws Exception {
         super.setUp();
-        setUpAndRegisterReceiver();
+        mActionLatchReceiver = new AssistantReceiver();
         startTestActivity(Utils.VERIFY_CONTENT_VIEW);
     }
 
     @Override
     public void tearDown() throws Exception {
+        mBundle = null;
         super.tearDown();
-        if (mReceiver != null) {
-            mContext.unregisterReceiver(mReceiver);
-            mReceiver = null;
-        }
-    }
-
-    private void setUpAndRegisterReceiver() {
-        if (mReceiver != null) {
-            mContext.unregisterReceiver(mReceiver);
-        }
-        mReceiver = new AssistantContentViewReceiver();
-        IntentFilter filter = new IntentFilter();
-        filter.addAction(Utils.BROADCAST_CONTENT_VIEW_HEIGHT);
-        filter.addAction(Utils.ASSIST_RECEIVER_REGISTERED);
-        mContext.registerReceiver(mReceiver, filter);
-
     }
 
     private void waitForContentView() throws Exception {
@@ -74,30 +56,26 @@
           return;
         }
         startTest(Utils.VERIFY_CONTENT_VIEW);
-        waitForAssistantToBeReady(mReadyLatch);
+        waitForAssistantToBeReady();
         startSession();
         waitForContentView();
-        int height = mIntent.getIntExtra(Utils.EXTRA_CONTENT_VIEW_HEIGHT, 0);
-        int width = mIntent.getIntExtra(Utils.EXTRA_CONTENT_VIEW_WIDTH, 0);
-        Point displayPoint = (Point) mIntent.getParcelableExtra(Utils.EXTRA_DISPLAY_POINT);
+        int height = mBundle.getInt(Utils.EXTRA_CONTENT_VIEW_HEIGHT, 0);
+        int width = mBundle.getInt(Utils.EXTRA_CONTENT_VIEW_WIDTH, 0);
+        Point displayPoint = mBundle.getParcelable(Utils.EXTRA_DISPLAY_POINT);
         assertEquals(displayPoint.y, height);
         assertEquals(displayPoint.x, width);
     }
 
-    private class AssistantContentViewReceiver extends BroadcastReceiver {
+    private class AssistantReceiver extends ActionLatchReceiver {
+
+        AssistantReceiver() {
+            super(Utils.BROADCAST_CONTENT_VIEW_HEIGHT, mContentViewLatch);
+        }
+
         @Override
-        public void onReceive(Context context, Intent intent) {
-            String action = intent.getAction();
-            if (action.equals(Utils.BROADCAST_CONTENT_VIEW_HEIGHT)) {
-                mIntent = intent;
-                if (mContentViewLatch != null) {
-                    mContentViewLatch.countDown();
-                }
-            } else if (action.equals(Utils.ASSIST_RECEIVER_REGISTERED)) {
-                if (mReadyLatch != null) {
-                    mReadyLatch.countDown();
-                }
-            }
+        protected void onAction(Bundle bundle, String action) {
+            mBundle = bundle;
+            super.onAction(bundle, action);
         }
     }
 }
diff --git a/tests/tests/assist/src/android/assist/cts/DisableContextTest.java b/tests/tests/assist/src/android/assist/cts/DisableContextTest.java
index 90788a0..11e404f 100644
--- a/tests/tests/assist/src/android/assist/cts/DisableContextTest.java
+++ b/tests/tests/assist/src/android/assist/cts/DisableContextTest.java
@@ -17,16 +17,9 @@
 package android.assist.cts;
 
 import android.assist.common.Utils;
-import android.assist.cts.AssistTestBase.ScreenshotEnabled;
-import android.assist.cts.AssistTestBase.StructureEnabled;
-import android.content.Context;
 import android.util.Log;
 
-import com.android.compatibility.common.util.SettingsUtils;
-import com.android.compatibility.common.util.SystemUtil;
-
 /** Test we receive proper assist data when context is disabled or enabled */
-
 public class DisableContextTest extends AssistTestBase {
     static final String TAG = "DisableContextTest";
 
@@ -53,15 +46,14 @@
         // Both settings off
         Log.i(TAG, "DisableContext: Screenshot OFF, Context OFF");
         setFeaturesEnabled(StructureEnabled.FALSE, ScreenshotEnabled.FALSE);
-        waitForBroadcast();
+        startTest(TEST_CASE_TYPE);
+        waitForContext(mAssistDataReceivedLatch);
 
         logContextAndScreenshotSetting();
         verifyAssistDataNullness(true, true, true, true);
     }
 
-    // TODO(b/133379285) need to figure out a way to finish the activity so this class can run
-    // multiple tests
-    public void disabled_TestContextOff() throws Exception {
+    public void testContextOff() throws Exception {
         if (!mContext.getPackageManager().hasSystemFeature(FEATURE_VOICE_RECOGNIZERS)) {
             Log.d(TAG, "Not running assist tests - voice_recognizers feature is not supported");
             return;
@@ -69,15 +61,14 @@
         // Screenshot off, context on
         Log.i(TAG, "DisableContext: Screenshot OFF, Context ON");
         setFeaturesEnabled(StructureEnabled.TRUE, ScreenshotEnabled.FALSE);
-        waitForBroadcast();
+        startTest(TEST_CASE_TYPE);
+        waitForContext(mAssistDataReceivedLatch);
 
         logContextAndScreenshotSetting();
         verifyAssistDataNullness(false, false, false, true);
     }
 
-    // TODO(b/133379285) need to figure out a way to finish the activity so this class can run
-    // multiple tests
-    public void disabled_testScreenshotOff() throws Exception {
+    public void testScreenshotOff() throws Exception {
         if (!mContext.getPackageManager().hasSystemFeature(FEATURE_VOICE_RECOGNIZERS)) {
             Log.d(TAG, "Not running assist tests - voice_recognizers feature is not supported");
             return;
@@ -85,7 +76,8 @@
         // Context off, screenshot on
         Log.i(TAG, "DisableContext: Screenshot ON, Context OFF");
         setFeaturesEnabled(StructureEnabled.FALSE, ScreenshotEnabled.TRUE);
-        waitForBroadcast();
+        startTest(TEST_CASE_TYPE);
+        waitForContext(mAssistDataReceivedLatch);
 
         logContextAndScreenshotSetting();
         verifyAssistDataNullness(true, true, true, true);
diff --git a/tests/tests/assist/src/android/assist/cts/ExtraAssistDataTest.java b/tests/tests/assist/src/android/assist/cts/ExtraAssistDataTest.java
index b5e799e..2acf4e3 100644
--- a/tests/tests/assist/src/android/assist/cts/ExtraAssistDataTest.java
+++ b/tests/tests/assist/src/android/assist/cts/ExtraAssistDataTest.java
@@ -15,18 +15,12 @@
  */
 package android.assist.cts;
 
+import android.assist.common.AutoResetLatch;
 import android.assist.common.Utils;
-import android.content.BroadcastReceiver;
-import android.content.Context;
 import android.content.Intent;
-import android.content.IntentFilter;
 import android.os.Bundle;
-import android.os.Process;
 import android.util.Log;
 
-import java.util.concurrent.CountDownLatch;
-import java.util.concurrent.TimeUnit;
-
 public class ExtraAssistDataTest extends AssistTestBase {
     private static final String TAG = "ExtraAssistDataTest";
     private static final String TEST_CASE_TYPE = Utils.EXTRA_ASSIST;
@@ -34,40 +28,18 @@
     @Override
     public void setUp() throws Exception {
         super.setUp();
-        setUpAndRegisterReceiver();
         startTestActivity(TEST_CASE_TYPE);
     }
 
-    @Override
-    public void tearDown() throws Exception {
-        super.tearDown();
-        if (mReceiver != null) {
-            mContext.unregisterReceiver(mReceiver);
-            mReceiver = null;
-        }
-    }
-
-    private void setUpAndRegisterReceiver() {
-        if (mReceiver != null) {
-            mContext.unregisterReceiver(mReceiver);
-        }
-        mReceiver = new ExtraAssistDataReceiver();
-        IntentFilter filter = new IntentFilter();
-        filter.addAction(Utils.APP_3P_HASRESUMED);
-        filter.addAction(Utils.ASSIST_RECEIVER_REGISTERED);
-        mContext.registerReceiver(mReceiver, filter);
-    }
-
     public void testAssistContentAndAssistData() throws Exception {
         if (mActivityManager.isLowRamDevice()) {
             Log.d(TAG, "Not running assist tests on low-RAM device.");
             return;
         }
         startTest(TEST_CASE_TYPE);
-        waitForAssistantToBeReady(mReadyLatch);
+        waitForAssistantToBeReady();
         start3pApp(TEST_CASE_TYPE);
-        waitForOnResume();
-        final CountDownLatch latch = startSession();
+        final AutoResetLatch latch = startSession();
         waitForContext(latch);
         verifyAssistDataNullness(false, false, false, false);
 
@@ -89,29 +61,5 @@
         int expectedUid = Utils.getExpectedUid(extraAssistBundle);
         int actualUid = mAssistBundle.getInt(Intent.EXTRA_ASSIST_UID);
         assertEquals("Wrong value for EXTRA_ASSIST_UID", expectedUid, actualUid);
-
-    }
-
-    private void waitForOnResume() throws Exception {
-        Log.i(TAG, "waiting for onResume() before continuing");
-        if (!mHasResumedLatch.await(Utils.ACTIVITY_ONRESUME_TIMEOUT_MS, TimeUnit.MILLISECONDS)) {
-            fail("Activity failed to resume in " + Utils.ACTIVITY_ONRESUME_TIMEOUT_MS + "msec");
-        }
-    }
-
-    private class ExtraAssistDataReceiver extends BroadcastReceiver {
-        @Override
-        public void onReceive(Context context, Intent intent) {
-            String action = intent.getAction();
-            if (action.equals(Utils.APP_3P_HASRESUMED)) {
-                if (mHasResumedLatch != null) {
-                    mHasResumedLatch.countDown();
-                }
-            } else if (action.equals(Utils.ASSIST_RECEIVER_REGISTERED)) {
-                if (mReadyLatch != null) {
-                    mReadyLatch.countDown();
-                }
-            }
-        }
     }
 }
diff --git a/tests/tests/assist/src/android/assist/cts/FlagSecureTest.java b/tests/tests/assist/src/android/assist/cts/FlagSecureTest.java
index 2d5a989..97573d8 100644
--- a/tests/tests/assist/src/android/assist/cts/FlagSecureTest.java
+++ b/tests/tests/assist/src/android/assist/cts/FlagSecureTest.java
@@ -16,16 +16,10 @@
 
 package android.assist.cts;
 
+import android.assist.common.AutoResetLatch;
 import android.assist.common.Utils;
-import android.content.BroadcastReceiver;
-import android.content.Context;
-import android.content.Intent;
-import android.content.IntentFilter;
 import android.util.Log;
 
-import java.util.concurrent.CountDownLatch;
-import java.util.concurrent.TimeUnit;
-
 /**
  * Test we receive proper assist data (root assistStructure with no children) when the assistant is
  * invoked on an app with FLAG_SECURE set.
@@ -38,66 +32,21 @@
     @Override
     public void setUp() throws Exception {
         super.setUp();
-        setUpAndRegisterReceiver();
         startTestActivity(TEST_CASE_TYPE);
     }
 
-    @Override
-    public void tearDown() throws Exception {
-        super.tearDown();
-        if (mReceiver != null) {
-            mContext.unregisterReceiver(mReceiver);
-            mReceiver = null;
-        }
-    }
-
-    private void setUpAndRegisterReceiver() {
-        if (mReceiver != null) {
-            mContext.unregisterReceiver(mReceiver);
-        }
-        mReceiver = new FlagSecureTestBroadcastReceiver();
-        IntentFilter filter = new IntentFilter();
-        filter.addAction(Utils.FLAG_SECURE_HASRESUMED);
-        filter.addAction(Utils.ASSIST_RECEIVER_REGISTERED);
-        mContext.registerReceiver(mReceiver, filter);
-    }
-
-    private void waitForOnResume() throws Exception {
-        Log.i(TAG, "waiting for onResume() before continuing");
-        if (!mHasResumedLatch.await(Utils.ACTIVITY_ONRESUME_TIMEOUT_MS, TimeUnit.MILLISECONDS)) {
-            fail("Activity failed to resume in " + Utils.ACTIVITY_ONRESUME_TIMEOUT_MS + "msec");
-        }
-    }
-
     public void testSecureActivity() throws Exception {
         if (!mContext.getPackageManager().hasSystemFeature(FEATURE_VOICE_RECOGNIZERS)) {
             Log.d(TAG, "Not running assist tests - voice_recognizers feature is not supported");
             return;
         }
         startTest(TEST_CASE_TYPE);
-        waitForAssistantToBeReady(mReadyLatch);
+        waitForAssistantToBeReady();
         start3pApp(TEST_CASE_TYPE);
-        waitForOnResume();
-        final CountDownLatch latch = startSession();
+        final AutoResetLatch latch = startSession();
         waitForContext(latch);
         verifyAssistDataNullness(false, false, false, false);
         // verify that we have only the root window and not its children.
         verifyAssistStructure(Utils.getTestAppComponent(TEST_CASE_TYPE), true);
     }
-
-    private class FlagSecureTestBroadcastReceiver extends BroadcastReceiver {
-        @Override
-        public void onReceive(Context context, Intent intent) {
-            String action = intent.getAction();
-            if (action.equals(Utils.FLAG_SECURE_HASRESUMED)) {
-                if (mHasResumedLatch != null) {
-                    mHasResumedLatch.countDown();
-                }
-            } else if (action.equals(Utils.ASSIST_RECEIVER_REGISTERED)) {
-                if (mReadyLatch != null) {
-                    mReadyLatch.countDown();
-                }
-            }
-        }
-    }
 }
diff --git a/tests/tests/assist/src/android/assist/cts/FocusChangeTest.java b/tests/tests/assist/src/android/assist/cts/FocusChangeTest.java
index e42b0d0..bc63a43 100644
--- a/tests/tests/assist/src/android/assist/cts/FocusChangeTest.java
+++ b/tests/tests/assist/src/android/assist/cts/FocusChangeTest.java
@@ -16,53 +16,31 @@
 
 package android.assist.cts;
 
+import android.assist.common.AutoResetLatch;
 import android.assist.common.Utils;
-import android.content.BroadcastReceiver;
-import android.content.Context;
-import android.content.Intent;
-import android.content.IntentFilter;
 import android.util.Log;
+import android.util.Pair;
 
-import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.TimeUnit;
 
 /** Test that triggering the Assistant causes the underlying Activity to lose focus **/
-
 public class FocusChangeTest extends AssistTestBase {
     private static final String TAG = "FocusChangeTest";
     private static final String TEST_CASE_TYPE = Utils.FOCUS_CHANGE;
 
-    private final CountDownLatch mHasGainedFocusLatch = new CountDownLatch(1);
-    private final CountDownLatch mHasLostFocusLatch = new CountDownLatch(1);
+    private AutoResetLatch mHasGainedFocusLatch = new AutoResetLatch(1);
+    private AutoResetLatch mHasLostFocusLatch = new AutoResetLatch(1);
 
     @Override
     public void setUp() throws Exception {
         super.setUp();
-        setUpAndRegisterReceiver();
+        mActionLatchReceiver = new ActionLatchReceiver(
+                Pair.create(Utils.GAINED_FOCUS, mHasGainedFocusLatch),
+                Pair.create(Utils.LOST_FOCUS, mHasLostFocusLatch)
+        );
         startTestActivity(TEST_CASE_TYPE);
     }
 
-    @Override
-    public void tearDown() throws Exception {
-        super.tearDown();
-        if (mReceiver != null) {
-            mContext.unregisterReceiver(mReceiver);
-            mReceiver = null;
-        }
-    }
-
-    private void setUpAndRegisterReceiver() {
-        if (mReceiver != null) {
-            mContext.unregisterReceiver(mReceiver);
-        }
-        mReceiver = new FocusChangeTestReceiver();
-        IntentFilter filter = new IntentFilter();
-        filter.addAction(Utils.GAINED_FOCUS);
-        filter.addAction(Utils.LOST_FOCUS);
-        filter.addAction(Utils.ASSIST_RECEIVER_REGISTERED);
-        mContext.registerReceiver(mReceiver, filter);
-    }
-
     private void waitToGainFocus() throws Exception {
         Log.i(TAG, "Waiting for the underlying activity to gain focus before continuing.");
         if (!mHasGainedFocusLatch.await(Utils.TIMEOUT_MS, TimeUnit.MILLISECONDS)) {
@@ -74,7 +52,7 @@
         Log.i(TAG, "Waiting for the underlying activity to lose focus.");
         if (!mHasLostFocusLatch.await(Utils.TIMEOUT_MS, TimeUnit.MILLISECONDS)) {
             fail("Activity maintained focus despite the Assistant Firing"
-                 + Utils.TIMEOUT_MS + "msec.");
+                    + Utils.TIMEOUT_MS + "msec.");
         }
     }
 
@@ -84,26 +62,10 @@
             return;
         }
         startTest(TEST_CASE_TYPE);
-        waitForAssistantToBeReady(mReadyLatch);
+        waitForAssistantToBeReady();
         start3pApp(TEST_CASE_TYPE);
         waitToGainFocus();
         startSession();
         waitToLoseFocus();
     }
-
-    private class FocusChangeTestReceiver extends BroadcastReceiver {
-        @Override
-        public void onReceive(Context context, Intent intent) {
-            String action = intent.getAction();
-            if (action.equals(Utils.GAINED_FOCUS) && mHasGainedFocusLatch != null) {
-                mHasGainedFocusLatch.countDown();
-            } else if (action.equals(Utils.LOST_FOCUS) && mHasLostFocusLatch != null) {
-                mHasLostFocusLatch.countDown();
-            } else if (action.equals(Utils.ASSIST_RECEIVER_REGISTERED)) {
-                if (mReadyLatch != null) {
-                    mReadyLatch.countDown();
-                }
-            }
-        }
-    }
 }
diff --git a/tests/tests/assist/src/android/assist/cts/LargeViewHierarchyTest.java b/tests/tests/assist/src/android/assist/cts/LargeViewHierarchyTest.java
index cf2a47c..05a473e 100644
--- a/tests/tests/assist/src/android/assist/cts/LargeViewHierarchyTest.java
+++ b/tests/tests/assist/src/android/assist/cts/LargeViewHierarchyTest.java
@@ -16,20 +16,13 @@
 
 package android.assist.cts;
 
+import android.assist.common.AutoResetLatch;
 import android.assist.common.Utils;
-import android.content.BroadcastReceiver;
-import android.content.Context;
-import android.content.Intent;
-import android.content.IntentFilter;
 import android.util.Log;
 
-import java.util.concurrent.CountDownLatch;
-import java.util.concurrent.TimeUnit;
-
 /**
  *  Test that the AssistStructure returned is properly formatted.
  */
-
 public class LargeViewHierarchyTest extends AssistTestBase {
     private static final String TAG = "LargeViewHierarchyTest";
     private static final String TEST_CASE_TYPE = Utils.LARGE_VIEW_HIERARCHY;
@@ -37,37 +30,9 @@
     @Override
     protected void setUp() throws Exception {
         super.setUp();
-        setUpAndRegisterReceiver();
         startTestActivity(TEST_CASE_TYPE);
     }
 
-    @Override
-    public void tearDown() throws Exception {
-        super.tearDown();
-        if (mReceiver != null) {
-            mContext.unregisterReceiver(mReceiver);
-            mReceiver = null;
-        }
-    }
-
-    private void setUpAndRegisterReceiver() {
-        if (mReceiver != null) {
-            mContext.unregisterReceiver(mReceiver);
-        }
-        mReceiver = new LargeViewTestBroadcastReceiver();
-        IntentFilter filter = new IntentFilter();
-        filter.addAction(Utils.APP_3P_HASRESUMED);
-        filter.addAction(Utils.ASSIST_RECEIVER_REGISTERED);
-        mContext.registerReceiver(mReceiver, filter);
-    }
-
-    private void waitForOnResume() throws Exception {
-        Log.i(TAG, "waiting for onResume() before continuing");
-        if (!mHasResumedLatch.await(Utils.ACTIVITY_ONRESUME_TIMEOUT_MS, TimeUnit.MILLISECONDS)) {
-            fail("Activity failed to resume in " + Utils.ACTIVITY_ONRESUME_TIMEOUT_MS + "msec");
-        }
-    }
-
     public void testTextView() throws Exception {
         if (mActivityManager.isLowRamDevice()) {
             Log.d(TAG, "Not running assist tests on low-RAM device.");
@@ -75,25 +40,12 @@
         }
         start3pApp(TEST_CASE_TYPE);
         startTest(TEST_CASE_TYPE);
-        waitForAssistantToBeReady(mReadyLatch);
-        waitForOnResume();
-        final CountDownLatch latch = startSession();
+        waitForAssistantToBeReady();
+        final AutoResetLatch latch = startSession();
         waitForContext(latch);
         verifyAssistDataNullness(false, false, false, false);
 
         verifyAssistStructure(Utils.getTestAppComponent(TEST_CASE_TYPE),
                 false /*FLAG_SECURE set*/);
     }
-
-    private class LargeViewTestBroadcastReceiver extends BroadcastReceiver {
-        @Override
-        public void onReceive(Context context, Intent intent) {
-            String action = intent.getAction();
-            if (action.equals(Utils.APP_3P_HASRESUMED) && mHasResumedLatch != null) {
-                mHasResumedLatch.countDown();
-            } else if (action.equals(Utils.ASSIST_RECEIVER_REGISTERED) && mReadyLatch != null) {
-                mReadyLatch.countDown();
-            }
-        }
-    }
 }
diff --git a/tests/tests/assist/src/android/assist/cts/LifecycleTest.java b/tests/tests/assist/src/android/assist/cts/LifecycleTest.java
index 037d534..c35f8f0 100644
--- a/tests/tests/assist/src/android/assist/cts/LifecycleTest.java
+++ b/tests/tests/assist/src/android/assist/cts/LifecycleTest.java
@@ -16,21 +16,16 @@
 
 package android.assist.cts;
 
+import android.assist.common.AutoResetLatch;
 import android.assist.common.Utils;
-import android.content.BroadcastReceiver;
-import android.content.Context;
-import android.content.Intent;
-import android.content.IntentFilter;
+import android.os.Bundle;
 import android.util.Log;
 
-import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.TimeUnit;
 
 /** Test we receive proper assist data when context is disabled or enabled */
-
 public class LifecycleTest extends AssistTestBase {
     private static final String TAG = "LifecycleTest";
-    private static final String ACTION_HAS_RESUMED = Utils.LIFECYCLE_HASRESUMED;
     private static final String ACTION_HAS_FOCUS = Utils.LIFECYCLE_HASFOCUS;
     private static final String ACTION_LOST_FOCUS = Utils.LIFECYCLE_LOSTFOCUS;
     private static final String ACTION_ON_PAUSE = Utils.LIFECYCLE_ONPAUSE;
@@ -39,46 +34,20 @@
 
     private static final String TEST_CASE_TYPE = Utils.LIFECYCLE;
 
-    private BroadcastReceiver mLifecycleTestBroadcastReceiver;
-    private final CountDownLatch mHasFocusLatch = new CountDownLatch(1);
-    private final CountDownLatch mLostFocusLatch = new CountDownLatch(1);
-    private final CountDownLatch mActivityLifecycleLatch = new CountDownLatch(1);
-    private final CountDownLatch mDestroyLatch = new CountDownLatch(1);
+    private AutoResetLatch mHasFocusLatch = new AutoResetLatch(1);
+    private AutoResetLatch mLostFocusLatch = new AutoResetLatch(1);
+    private AutoResetLatch mActivityLifecycleLatch = new AutoResetLatch(1);
+    private AutoResetLatch mDestroyLatch = new AutoResetLatch(1);
     private boolean mLostFocusIsLifecycle;
 
     @Override
     public void setUp() throws Exception {
         super.setUp();
-        mLifecycleTestBroadcastReceiver = new LifecycleTestReceiver();
-        IntentFilter filter = new IntentFilter();
-        filter.addAction(ACTION_HAS_RESUMED);
-        filter.addAction(ACTION_HAS_FOCUS);
-        filter.addAction(ACTION_LOST_FOCUS);
-        filter.addAction(ACTION_ON_PAUSE);
-        filter.addAction(ACTION_ON_STOP);
-        filter.addAction(ACTION_ON_DESTROY);
-        filter.addAction(Utils.ASSIST_RECEIVER_REGISTERED);
-        mContext.registerReceiver(mLifecycleTestBroadcastReceiver, filter);
+        mActionLatchReceiver = new LifecycleTestReceiver();
         mLostFocusIsLifecycle = false;
         startTestActivity(TEST_CASE_TYPE);
     }
 
-    @Override
-    public void tearDown() throws Exception {
-        super.tearDown();
-        if (mLifecycleTestBroadcastReceiver != null) {
-            mContext.unregisterReceiver(mLifecycleTestBroadcastReceiver);
-            mLifecycleTestBroadcastReceiver = null;
-        }
-    }
-
-    private void waitForOnResume() throws Exception {
-        Log.i(TAG, "waiting for onResume() before continuing");
-        if (!mHasResumedLatch.await(Utils.ACTIVITY_ONRESUME_TIMEOUT_MS, TimeUnit.MILLISECONDS)) {
-            fail("Activity failed to resume in " + Utils.ACTIVITY_ONRESUME_TIMEOUT_MS + "msec");
-        }
-    }
-
     private void waitForHasFocus() throws Exception {
         Log.i(TAG, "waiting for window focus gain before continuing");
         if (!mHasFocusLatch.await(Utils.ACTIVITY_ONRESUME_TIMEOUT_MS, TimeUnit.MILLISECONDS)) {
@@ -112,11 +81,10 @@
             return;
         }
         startTest(TEST_CASE_TYPE);
-        waitForAssistantToBeReady(mReadyLatch);
+        waitForAssistantToBeReady();
         start3pApp(TEST_CASE_TYPE);
-        waitForOnResume();
         waitForHasFocus();
-        final CountDownLatch latch = startSession();
+        final AutoResetLatch latch = startSession();
         waitForContext(latch);
         // Since there is no UI, focus should not be lost.  We are counting focus lost as
         // a lifecycle event in this case.
@@ -124,7 +92,11 @@
         // calling the above (RACY!!!).
         waitForLostFocus();
         waitAndSeeIfLifecycleMethodsAreTriggered();
-        mContext.sendBroadcast(new Intent(Utils.HIDE_LIFECYCLE_ACTIVITY));
+
+        Bundle bundle = new Bundle();
+        bundle.putString(Utils.EXTRA_REMOTE_CALLBACK_ACTION, Utils.HIDE_LIFECYCLE_ACTIVITY);
+        m3pActivityCallback.sendResult(bundle);
+
         waitForDestroy();
     }
 
@@ -135,26 +107,27 @@
         }
         mLostFocusIsLifecycle = true;
         startTest(Utils.LIFECYCLE_NOUI);
-        waitForAssistantToBeReady(mReadyLatch);
+        waitForAssistantToBeReady();
         start3pApp(Utils.LIFECYCLE_NOUI);
-        waitForOnResume();
         waitForHasFocus();
-        final CountDownLatch latch = startSession();
+        final AutoResetLatch latch = startSession();
         waitForContext(latch);
         // Do this after waitForContext(), since we don't start looking for context until
         // calling the above (RACY!!!).
         waitAndSeeIfLifecycleMethodsAreTriggered();
-        mContext.sendBroadcast(new Intent(Utils.HIDE_LIFECYCLE_ACTIVITY));
+
+        Bundle bundle = new Bundle();
+        bundle.putString(Utils.EXTRA_REMOTE_CALLBACK_ACTION, Utils.HIDE_LIFECYCLE_ACTIVITY);
+        m3pActivityCallback.sendResult(bundle);
+
         waitForDestroy();
     }
 
-    private class LifecycleTestReceiver extends BroadcastReceiver {
+    private class LifecycleTestReceiver extends ActionLatchReceiver {
+
         @Override
-        public void onReceive(Context context, Intent intent) {
-            String action = intent.getAction();
-            if (action.equals(ACTION_HAS_RESUMED) && mHasResumedLatch != null) {
-                mHasResumedLatch.countDown();
-            } else if (action.equals(ACTION_HAS_FOCUS) && mHasFocusLatch != null) {
+        protected void onAction(Bundle bundle, String action) {
+            if (action.equals(ACTION_HAS_FOCUS) && mHasFocusLatch != null) {
                 mHasFocusLatch.countDown();
             } else if (action.equals(ACTION_LOST_FOCUS) && mLostFocusLatch != null) {
                 if (mLostFocusIsLifecycle) {
@@ -169,10 +142,8 @@
             } else if (action.equals(ACTION_ON_DESTROY) && mActivityLifecycleLatch != null) {
                 mActivityLifecycleLatch.countDown();
                 mDestroyLatch.countDown();
-            } else if (action.equals(Utils.ASSIST_RECEIVER_REGISTERED)) {
-                if (mReadyLatch != null) {
-                    mReadyLatch.countDown();
-                }
+            } else {
+                super.onAction(bundle, action);
             }
         }
     }
diff --git a/tests/tests/assist/src/android/assist/cts/ScreenshotTest.java b/tests/tests/assist/src/android/assist/cts/ScreenshotTest.java
index e24ef54..9458cf3 100644
--- a/tests/tests/assist/src/android/assist/cts/ScreenshotTest.java
+++ b/tests/tests/assist/src/android/assist/cts/ScreenshotTest.java
@@ -16,58 +16,38 @@
 
 package android.assist.cts;
 
+import android.assist.common.AutoResetLatch;
 import android.assist.common.Utils;
-import android.content.BroadcastReceiver;
-import android.content.Context;
-import android.content.Intent;
-import android.content.IntentFilter;
 import android.graphics.Color;
 import android.os.Bundle;
 import android.util.Log;
 
-import java.util.concurrent.CountDownLatch;
-import java.util.concurrent.TimeUnit;
-
 public class ScreenshotTest extends AssistTestBase {
     static final String TAG = "ScreenshotTest";
 
     private static final String TEST_CASE_TYPE = Utils.SCREENSHOT;
 
-    private BroadcastReceiver mScreenshotActivityReceiver;
-
     @Override
     protected void setUp() throws Exception {
         super.setUp();
-        // set up receiver
-        mScreenshotActivityReceiver = new ScreenshotTestReceiver();
-        IntentFilter filter = new IntentFilter();
-        filter.addAction(Utils.ASSIST_RECEIVER_REGISTERED);
-        filter.addAction(Utils.APP_3P_HASRESUMED);
-        mContext.registerReceiver(mScreenshotActivityReceiver, filter);
-
         // start test start activity
         startTestActivity(TEST_CASE_TYPE);
     }
 
-    @Override
-    protected void tearDown() throws Exception {
-        if (mScreenshotActivityReceiver != null) {
-            mContext.unregisterReceiver(mScreenshotActivityReceiver);
-        }
-        super.tearDown();
-    }
-
     public void testRedScreenshot() throws Exception {
         if (mActivityManager.isLowRamDevice()) {
             Log.d(TAG, "Not running assist tests on low-RAM device.");
             return;
         }
-        Log.i(TAG, "Starting screenshot test");
-        startTest(TEST_CASE_TYPE);
-        Log.i(TAG, "start waitForAssistantToBeReady()");
-        waitForAssistantToBeReady(mReadyLatch);
 
-        waitForActivityResumeAndAssist(Color.RED);
+        startTest(TEST_CASE_TYPE);
+        waitForAssistantToBeReady();
+
+        Bundle bundle = new Bundle();
+        bundle.putInt(Utils.SCREENSHOT_COLOR_KEY, Color.RED);
+        start3pApp(TEST_CASE_TYPE, bundle);
+
+        delayAndStartSession(Color.RED);
         verifyAssistDataNullness(false, false, false, false);
         assertTrue(mScreenshotMatches);
     }
@@ -77,12 +57,15 @@
             Log.d(TAG, "Not running assist tests on low-RAM device.");
             return;
         }
-        Log.i(TAG, "Starting screenshot test");
-        startTest(TEST_CASE_TYPE);
-        Log.i(TAG, "start waitForAssistantToBeReady()");
-        waitForAssistantToBeReady(mReadyLatch);
 
-        waitForActivityResumeAndAssist(Color.GREEN);
+        startTest(TEST_CASE_TYPE);
+        waitForAssistantToBeReady();
+
+        Bundle bundle = new Bundle();
+        bundle.putInt(Utils.SCREENSHOT_COLOR_KEY, Color.GREEN);
+        start3pApp(TEST_CASE_TYPE, bundle);
+
+        delayAndStartSession(Color.GREEN);
         verifyAssistDataNullness(false, false, false, false);
         assertTrue(mScreenshotMatches);
     }
@@ -92,42 +75,28 @@
             Log.d(TAG, "Not running assist tests on low-RAM device.");
             return;
         }
-        Log.i(TAG, "Starting screenshot test");
-        startTest(TEST_CASE_TYPE);
-        Log.i(TAG, "start waitForAssistantToBeReady()");
-        waitForAssistantToBeReady(mReadyLatch);
 
-        waitForActivityResumeAndAssist(Color.BLUE);
+        startTest(TEST_CASE_TYPE);
+        waitForAssistantToBeReady();
+
+        Bundle bundle = new Bundle();
+        bundle.putInt(Utils.SCREENSHOT_COLOR_KEY, Color.BLUE);
+        start3pApp(TEST_CASE_TYPE, bundle);
+
+        delayAndStartSession(Color.BLUE);
         verifyAssistDataNullness(false, false, false, false);
         assertTrue(mScreenshotMatches);
     }
 
-    private void waitForActivityResumeAndAssist(int color) throws Exception {
+    private void delayAndStartSession(int color) throws Exception {
+        // Screenshot testing requires the entire screen to settle, including layout requests
+        // and any animations. The time is arbitrary as there is no good event for knowing when
+        // the Activity has settled.
+        Thread.sleep(350);
+
         Bundle extras = new Bundle();
         extras.putInt(Utils.SCREENSHOT_COLOR_KEY, color);
-        final CountDownLatch latch = startSession(TEST_CASE_TYPE, extras);
-        Log.i(TAG, "waiting for onResume() before continuing.");
-        if (!mHasResumedLatch.await(Utils.ACTIVITY_ONRESUME_TIMEOUT_MS, TimeUnit.MILLISECONDS)) {
-            fail("activity failed to resume in " + Utils.ACTIVITY_ONRESUME_TIMEOUT_MS + "msec");
-        }
+        final AutoResetLatch latch = startSession(TEST_CASE_TYPE, extras);
         waitForContext(latch);
     }
-
-    private class ScreenshotTestReceiver extends BroadcastReceiver {
-        @Override
-        public void onReceive(Context context, Intent intent) {
-            String action = intent.getAction();
-            Log.i(ScreenshotTest.TAG, "Got some broadcast: " + action);
-            if (action.equals(Utils.ASSIST_RECEIVER_REGISTERED)) {
-                Log.i(ScreenshotTest.TAG, "Received assist receiver is registered.");
-                if (mReadyLatch != null) {
-                    mReadyLatch.countDown();
-                }
-            } else if (action.equals(Utils.APP_3P_HASRESUMED)) {
-                if (mHasResumedLatch != null) {
-                    mHasResumedLatch.countDown();
-                }
-            }
-        }
-    }
 }
diff --git a/tests/tests/assist/src/android/assist/cts/TestStartActivity.java b/tests/tests/assist/src/android/assist/cts/TestStartActivity.java
index 80c6e48..eebf30d 100644
--- a/tests/tests/assist/src/android/assist/cts/TestStartActivity.java
+++ b/tests/tests/assist/src/android/assist/cts/TestStartActivity.java
@@ -16,9 +16,8 @@
 
 package android.assist.cts;
 
-import android.app.Activity;
+import android.assist.common.BaseRemoteCallbackActivity;
 import android.assist.common.Utils;
-import android.content.ComponentName;
 import android.content.Intent;
 import android.content.pm.PackageManager;
 import android.os.Bundle;
@@ -30,9 +29,7 @@
 import android.widget.ScrollView;
 import android.widget.TextView;
 
-import java.util.concurrent.CountDownLatch;
-
-public class TestStartActivity extends Activity {
+public class TestStartActivity extends BaseRemoteCallbackActivity {
     static final String TAG = "TestStartActivity";
 
     private ScrollView mScrollView;
@@ -51,8 +48,8 @@
                 return;
             case Utils.TEXTVIEW:
                 setContentView(R.layout.text_view);
-                mTextView =  (TextView) findViewById(R.id.text_view);
-                mScrollView = (ScrollView) findViewById(R.id.scroll_view);
+                mTextView = findViewById(R.id.text_view);
+                mScrollView = findViewById(R.id.scroll_view);
                 setTitle(R.string.textViewActivityTitle);
                 return;
             case Utils.LARGE_VIEW_HIERARCHY:
@@ -64,11 +61,11 @@
                         PackageManager.FEATURE_WEBVIEW)) {
                     setContentView(R.layout.webview);
                     setTitle(R.string.webViewActivityTitle);
-                    WebView webview = (WebView) findViewById(R.id.webview);
+                    WebView webview = findViewById(R.id.webview);
                     webview.setWebViewClient(new WebViewClient() {
                         @Override
                         public void onPageFinished(WebView view, String url) {
-                            sendBroadcast(new Intent(Utils.TEST_ACTIVITY_LOADED));
+                            TestStartActivity.this.notify(Utils.TEST_ACTIVITY_WEBVIEW_LOADED);
                         }
                     });
                     webview.loadData(Utils.WEBVIEW_HTML, "text/html", "UTF-8");
@@ -83,35 +80,6 @@
         Log.i(TAG, " in onResume");
     }
 
-    public void startTest(String testCaseName) {
-        Log.i(TAG, "Starting test activity for TestCaseType = " + testCaseName);
-        Intent intent = new Intent();
-        intent.putExtra(Utils.TESTCASE_TYPE, testCaseName);
-        intent.setAction("android.intent.action.START_TEST_" + testCaseName);
-        intent.setComponent(new ComponentName("android.assist.service",
-                "android.assist." + Utils.getTestActivity(testCaseName)));
-        startActivity(intent);
-    }
-
-    public void start3pApp(String testCaseName, CountDownLatch resumedLatch,
-            CountDownLatch drawedLatch) {
-        final RemoteCallback resumedCallback = new RemoteCallback((result) -> {
-            Log.v(TAG, "Testapp called resumed callback for " + testCaseName);
-            resumedLatch.countDown();
-        });
-        final RemoteCallback drawedCallback = new RemoteCallback((result) -> {
-            Log.v(TAG, "Testapp called drawed callback for " + testCaseName);
-            drawedLatch.countDown();
-        });
-        Intent intent = new Intent();
-        intent.putExtra(Utils.TESTCASE_TYPE, testCaseName);
-        intent.setAction("android.intent.action.TEST_APP_" + testCaseName);
-        intent.setComponent(Utils.getTestAppComponent(testCaseName));
-        intent.putExtra(Utils.EXTRA_CALLBACK_ACTIVITY_RESUMED, resumedCallback);
-        intent.putExtra(Utils.EXTRA_CALLBACK_ACTIVITY_DRAWED, drawedCallback);
-        startActivity(intent);
-    }
-
     @Override
     protected void onPause() {
         Log.i(TAG, " in onPause");
@@ -143,22 +111,26 @@
 
     public void scrollText(int scrollX, int scrollY, boolean scrollTextView,
             boolean scrollScrollView) {
-        if (scrollTextView) {
-            if (scrollX < 0 || scrollY < 0) {
-                scrollX = mTextView.getWidth();
-                scrollY = mTextView.getLayout().getLineTop(mTextView.getLineCount()) - mTextView.getHeight();
-            }
-            Log.i(TAG, "Scrolling text view to " + scrollX + ", " + scrollY);
-            mTextView.scrollTo(scrollX, scrollY);
-        } else if (scrollScrollView) {
-            if (scrollX < 0 || scrollY < 0) {
-                Log.i(TAG, "Scrolling scroll view to bottom right");
-                mScrollView.fullScroll(View.FOCUS_DOWN);
-                mScrollView.fullScroll(View.FOCUS_RIGHT);
-            } else {
-                Log.i(TAG, "Scrolling scroll view to " + scrollX + ", " + scrollY);
-                mScrollView.scrollTo(scrollX, scrollY);
-            }
+        if (scrollX < 0 || scrollY < 0) {
+            scrollX = mTextView.getWidth();
+            scrollY = mTextView.getLayout().getLineTop(mTextView.getLineCount()) - mTextView.getHeight();
         }
+        int finalScrollX = scrollX;
+        int finalScrollY = scrollY;
+        runOnUiThread(() -> {
+            if (scrollTextView) {
+                Log.i(TAG, "Scrolling text view to " + finalScrollX + ", " + finalScrollY);
+                mTextView.scrollTo(finalScrollX, finalScrollY);
+            } else if (scrollScrollView) {
+                if (finalScrollX < 0 || finalScrollY < 0) {
+                    Log.i(TAG, "Scrolling scroll view to bottom right");
+                    mScrollView.fullScroll(View.FOCUS_DOWN);
+                    mScrollView.fullScroll(View.FOCUS_RIGHT);
+                } else {
+                    Log.i(TAG, "Scrolling scroll view to " + finalScrollX + ", " + finalScrollY);
+                    mScrollView.scrollTo(finalScrollX, finalScrollY);
+                }
+            }
+        });
     }
 }
diff --git a/tests/tests/assist/src/android/assist/cts/TextViewTest.java b/tests/tests/assist/src/android/assist/cts/TextViewTest.java
index a3ef572..6b06442 100644
--- a/tests/tests/assist/src/android/assist/cts/TextViewTest.java
+++ b/tests/tests/assist/src/android/assist/cts/TextViewTest.java
@@ -16,20 +16,14 @@
 
 package android.assist.cts;
 
+import android.assist.common.AutoResetLatch;
 import android.assist.common.Utils;
-import android.content.BroadcastReceiver;
-import android.content.Context;
-import android.content.Intent;
-import android.content.IntentFilter;
+import android.os.Bundle;
 import android.util.Log;
 
-import java.util.concurrent.CountDownLatch;
-import java.util.concurrent.TimeUnit;
-
 /**
  *  Test that the AssistStructure returned is properly formatted.
  */
-
 public class TextViewTest extends AssistTestBase {
     private static final String TAG = "TextViewTest";
     private static final String TEST_CASE_TYPE = Utils.TEXTVIEW;
@@ -37,50 +31,22 @@
     @Override
     protected void setUp() throws Exception {
         super.setUp();
-        setUpAndRegisterReceiver();
         startTestActivity(TEST_CASE_TYPE);
     }
 
-    @Override
-    public void tearDown() throws Exception {
-        super.tearDown();
-        if (mReceiver != null) {
-            mContext.unregisterReceiver(mReceiver);
-            mReceiver = null;
-        }
-    }
-
-    private void setUpAndRegisterReceiver() {
-        if (mReceiver != null) {
-            mContext.unregisterReceiver(mReceiver);
-        }
-        mReceiver = new TextViewTestBroadcastReceiver();
-        IntentFilter filter = new IntentFilter();
-        filter.addAction(Utils.APP_3P_HASRESUMED);
-        filter.addAction(Utils.ASSIST_RECEIVER_REGISTERED);
-        mContext.registerReceiver(mReceiver, filter);
-    }
-
-    private void waitForOnResume() throws Exception {
-        Log.i(TAG, "waiting for onResume() before continuing");
-        if (!mHasResumedLatch.await(Utils.ACTIVITY_ONRESUME_TIMEOUT_MS, TimeUnit.MILLISECONDS)) {
-            fail("Activity failed to resume in " + Utils.ACTIVITY_ONRESUME_TIMEOUT_MS + "msec");
-        }
-    }
-
     public void testTextView() throws Exception {
         if (mActivityManager.isLowRamDevice()) {
             Log.d(TAG, "Not running assist tests on low-RAM device.");
             return;
         }
+
         start3pApp(TEST_CASE_TYPE);
         scrollTestApp(0, 0, true, false);
 
         // Verify that the text view contains the right text
         startTest(TEST_CASE_TYPE);
-        waitForAssistantToBeReady(mReadyLatch);
-        waitForOnResume();
-        final CountDownLatch latch1 = startSession();
+        waitForAssistantToBeReady();
+        final AutoResetLatch latch1 = startSession();
         waitForContext(latch1);
         verifyAssistDataNullness(false, false, false, false);
 
@@ -89,39 +55,38 @@
 
         // Verify that the scroll position of the text view is accurate after scrolling.
         scrollTestApp(10, 50, true /* scrollTextView */, false /* scrollScrollView */);
-        waitForOnResume();
-        final CountDownLatch latch2 = startSession();
+        final AutoResetLatch latch2 = startSession();
         waitForContext(latch2);
         verifyAssistStructure(Utils.getTestAppComponent(TEST_CASE_TYPE), false);
 
         scrollTestApp(-1, -1, true, false);
-        waitForOnResume();
-        final CountDownLatch latch3 = startSession();
+        final AutoResetLatch latch3 = startSession();
         waitForContext(latch3);
         verifyAssistStructure(Utils.getTestAppComponent(TEST_CASE_TYPE), false);
 
         scrollTestApp(0, 0, true, true);
-        waitForOnResume();
-        final CountDownLatch latch4 = startSession();
+        final AutoResetLatch latch4 = startSession();
         waitForContext(latch4);
         verifyAssistStructure(Utils.getTestAppComponent(TEST_CASE_TYPE), false);
 
         scrollTestApp(10, 50, false, true);
-        waitForOnResume();
-        final CountDownLatch latch5 = startSession();
+        final AutoResetLatch latch5 = startSession();
         waitForContext(latch5);
         verifyAssistStructure(Utils.getTestAppComponent(TEST_CASE_TYPE), false);
     }
 
-    private class TextViewTestBroadcastReceiver extends BroadcastReceiver {
-        @Override
-        public void onReceive(Context context, Intent intent) {
-            String action = intent.getAction();
-            if (action.equals(Utils.APP_3P_HASRESUMED) && mHasResumedLatch != null) {
-                mHasResumedLatch.countDown();
-            } else if (action.equals(Utils.ASSIST_RECEIVER_REGISTERED) &&  mReadyLatch != null) {
-                mReadyLatch.countDown();
-            }
+    @Override
+    protected void scrollTestApp(int scrollX, int scrollY, boolean scrollTextView,
+            boolean scrollScrollView) {
+        super.scrollTestApp(scrollX, scrollY, scrollTextView, scrollScrollView);
+        Bundle bundle = new Bundle();
+        if (scrollTextView) {
+            bundle.putString(Utils.EXTRA_REMOTE_CALLBACK_ACTION, Utils.SCROLL_TEXTVIEW_ACTION);
+        } else if (scrollScrollView) {
+            bundle.putString(Utils.EXTRA_REMOTE_CALLBACK_ACTION, Utils.SCROLL_SCROLLVIEW_ACTION);
         }
+        bundle.putInt(Utils.SCROLL_X_POSITION, scrollX);
+        bundle.putInt(Utils.SCROLL_Y_POSITION, scrollY);
+        m3pActivityCallback.sendResult(bundle);
     }
 }
diff --git a/tests/tests/assist/src/android/assist/cts/WebViewTest.java b/tests/tests/assist/src/android/assist/cts/WebViewTest.java
index a38362d..c913c82 100644
--- a/tests/tests/assist/src/android/assist/cts/WebViewTest.java
+++ b/tests/tests/assist/src/android/assist/cts/WebViewTest.java
@@ -16,68 +16,33 @@
 
 package android.assist.cts;
 
+import android.assist.common.AutoResetLatch;
 import android.assist.common.Utils;
-import android.content.BroadcastReceiver;
-import android.content.Context;
-import android.content.Intent;
-import android.content.IntentFilter;
 import android.content.pm.PackageManager;
-import android.os.LocaleList;
 import android.util.Log;
 
-import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.TimeUnit;
 
 /**
  *  Test that the AssistStructure returned is properly formatted.
  */
-
 public class WebViewTest extends AssistTestBase {
     private static final String TAG = "WebViewTest";
     private static final String TEST_CASE_TYPE = Utils.WEBVIEW;
 
-    private boolean mWebViewSupported;
-    private final CountDownLatch mTestWebViewLatch = new CountDownLatch(1);
+    private final AutoResetLatch mTestWebViewLatch = new AutoResetLatch();
 
     @Override
     protected void setUp() throws Exception {
         super.setUp();
-        setUpAndRegisterReceiver();
+        mActionLatchReceiver = new ActionLatchReceiver(Utils.TEST_ACTIVITY_WEBVIEW_LOADED, mTestWebViewLatch);
         startTestActivity(TEST_CASE_TYPE);
     }
 
-    @Override
-    public void tearDown() throws Exception {
-        super.tearDown();
-        if (mReceiver != null) {
-            mContext.unregisterReceiver(mReceiver);
-            mReceiver = null;
-        }
-    }
-
-    private void setUpAndRegisterReceiver() {
-        if (mReceiver != null) {
-            mContext.unregisterReceiver(mReceiver);
-        }
-        mReceiver = new WebViewTestBroadcastReceiver();
-        IntentFilter filter = new IntentFilter();
-        filter.addAction(Utils.APP_3P_HASRESUMED);
-        filter.addAction(Utils.ASSIST_RECEIVER_REGISTERED);
-        filter.addAction(Utils.TEST_ACTIVITY_LOADED);
-        mContext.registerReceiver(mReceiver, filter);
-    }
-
-    private void waitForOnResume() throws Exception {
-        Log.i(TAG, "waiting for onResume() before continuing");
-        if (!mHasResumedLatch.await(Utils.ACTIVITY_ONRESUME_TIMEOUT_MS, TimeUnit.MILLISECONDS)) {
-            fail("Activity failed to resume in " + Utils.ACTIVITY_ONRESUME_TIMEOUT_MS + "msec");
-        }
-    }
-
     private void waitForTestActivity() throws Exception {
         Log.i(TAG, "waiting for webview in test activity to load");
         if (!mTestWebViewLatch.await(Utils.ACTIVITY_ONRESUME_TIMEOUT_MS, TimeUnit.MILLISECONDS)) {
-            // wait for webView to load completely.
+            fail("failed to receive load web view in " + Utils.TIMEOUT_MS + "msec");
         }
     }
 
@@ -91,10 +56,13 @@
         }
         start3pApp(TEST_CASE_TYPE);
         startTest(TEST_CASE_TYPE);
-        waitForAssistantToBeReady(mReadyLatch);
-        waitForOnResume();
+        waitForAssistantToBeReady();
         waitForTestActivity();
-        final CountDownLatch latch = startSession();
+
+        // WebView doesn't render fast enough before test runs, so use some arbirary delay
+        Thread.sleep(350);
+
+        final AutoResetLatch latch = startSession();
         waitForContext(latch);
         verifyAssistDataNullness(false, false, false, false);
         verifyAssistStructure(Utils.getTestAppComponent(TEST_CASE_TYPE),
@@ -102,18 +70,4 @@
         verifyAssistStructureHasWebDomain(Utils.WEBVIEW_HTML_DOMAIN);
         verifyAssistStructureHasLocaleList(Utils.WEBVIEW_LOCALE_LIST);
     }
-
-    private class WebViewTestBroadcastReceiver extends BroadcastReceiver {
-        @Override
-        public void onReceive(Context context, Intent intent) {
-            String action = intent.getAction();
-            if (action.equals(Utils.APP_3P_HASRESUMED) && mHasResumedLatch != null) {
-                mHasResumedLatch.countDown();
-            } else if (action.equals(Utils.ASSIST_RECEIVER_REGISTERED) && mReadyLatch != null) {
-                mReadyLatch.countDown();
-            } else if (action.equals(Utils.TEST_ACTIVITY_LOADED) && mTestWebViewLatch != null) {
-                mTestWebViewLatch.countDown();
-            }
-        }
-    }
 }
diff --git a/tests/tests/assist/testapp/AndroidManifest.xml b/tests/tests/assist/testapp/AndroidManifest.xml
index ee4c68f..513d27a 100644
--- a/tests/tests/assist/testapp/AndroidManifest.xml
+++ b/tests/tests/assist/testapp/AndroidManifest.xml
@@ -27,18 +27,11 @@
                 android:label="Assist Structure Test Activity">
           <intent-filter>
               <action android:name="android.intent.action.TEST_APP_ASSIST_STRUCTURE" />
-              <action android:name="android.intent.action.TEST_APP_LARGE_VIEWHIERARCHY" />
+              <action android:name="android.intent.action.TEST_APP_LARGE_VIEW_HIERARCHY" />
               <category android:name="android.intent.category.DEFAULT" />
               <category android:name="android.intent.category.VOICE" />
           </intent-filter>
         </activity>
-        <activity android:name=".DisableContextActivity"
-            android:label="Disable Context Test Activity">
-            <intent-filter>
-                <action android:name="android.intent.action.TEST_APP_DISABLE_CONTEXT" />
-                <category android:name="android.intent.category.DEFAULT" />
-            </intent-filter>
-        </activity>
         <activity android:name=".SecureActivity"
                   android:label="Secure Test Activity">
             <intent-filter>
@@ -51,6 +44,7 @@
                   android:label="Life Cycle Check Activity">
             <intent-filter>
                 <action android:name="android.intent.action.TEST_APP_LIFECYCLE" />
+                <action android:name="android.intent.action.TEST_APP_LIFECYCLE_NOUI" />
                 <category android:name="android.intent.category.DEFAULT" />
                 <category android:name="android.intent.category.VOICE" />
             </intent-filter>
diff --git a/tests/tests/assist/testapp/src/android/assist/testapp/BaseThirdPartyActivity.java b/tests/tests/assist/testapp/src/android/assist/testapp/BaseThirdPartyActivity.java
new file mode 100644
index 0000000..5296a77
--- /dev/null
+++ b/tests/tests/assist/testapp/src/android/assist/testapp/BaseThirdPartyActivity.java
@@ -0,0 +1,41 @@
+/*
+ * Copyright (C) 2019 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.assist.testapp;
+
+import android.assist.common.BaseRemoteCallbackActivity;
+import android.assist.common.Utils;
+import android.os.Bundle;
+import android.view.View;
+import android.view.ViewTreeObserver;
+
+public class BaseThirdPartyActivity extends BaseRemoteCallbackActivity {
+
+    @Override
+    protected void onResume() {
+        super.onResume();
+
+        final View layout = findViewById(android.R.id.content);
+        ViewTreeObserver vto = layout.getViewTreeObserver();
+        vto.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
+            @Override
+            public void onGlobalLayout() {
+                layout.getViewTreeObserver().removeOnGlobalLayoutListener(this);
+                BaseThirdPartyActivity.this.notify(Utils.APP_3P_HASRESUMED);
+            }
+        });
+    }
+}
diff --git a/tests/tests/assist/testapp/src/android/assist/testapp/ExtraAssistDataActivity.java b/tests/tests/assist/testapp/src/android/assist/testapp/ExtraAssistDataActivity.java
index 4b4c909..6173005 100644
--- a/tests/tests/assist/testapp/src/android/assist/testapp/ExtraAssistDataActivity.java
+++ b/tests/tests/assist/testapp/src/android/assist/testapp/ExtraAssistDataActivity.java
@@ -15,10 +15,8 @@
  */
 package android.assist.testapp;
 
-import android.app.Activity;
 import android.app.assist.AssistContent;
 import android.assist.common.Utils;
-import android.content.Intent;
 import android.os.Bundle;
 import android.util.Log;
 
@@ -27,7 +25,7 @@
  * provide extra information to the assistant. Verify that the data passed from the activity matches
  * the data received in {@link android.service.voice.VoiceInteractionSession}.
  */
-public class ExtraAssistDataActivity extends Activity {
+public class ExtraAssistDataActivity extends BaseThirdPartyActivity {
     private static final String TAG = "ExtraAssistDataActivity";
 
     @Override
@@ -47,10 +45,4 @@
             Log.i(TAG, "Failed to get Structured JSON to put into the AssistContent.");
         }
     }
-
-    @Override
-    public void onResume() {
-        super.onResume();
-        sendBroadcast(new Intent(Utils.APP_3P_HASRESUMED));
-    }
-}
\ No newline at end of file
+}
diff --git a/tests/tests/assist/testapp/src/android/assist/testapp/FocusChangeActivity.java b/tests/tests/assist/testapp/src/android/assist/testapp/FocusChangeActivity.java
index 4ab24ed..d4893c4 100644
--- a/tests/tests/assist/testapp/src/android/assist/testapp/FocusChangeActivity.java
+++ b/tests/tests/assist/testapp/src/android/assist/testapp/FocusChangeActivity.java
@@ -16,12 +16,10 @@
 
 package android.assist.testapp;
 
-import android.app.Activity;
 import android.assist.common.Utils;
-import android.content.Intent;
 import android.util.Log;
 
-public class FocusChangeActivity extends Activity {
+public class FocusChangeActivity extends BaseThirdPartyActivity {
     private static final String TAG = "FocusChangeActivity";
     private boolean mGainedFocus = false;
 
@@ -30,10 +28,10 @@
         if (hasFocus && !mGainedFocus) {
             mGainedFocus = true;
             Log.i(TAG, "gained focus");
-            sendBroadcast(new Intent(Utils.GAINED_FOCUS));
+            notify(Utils.GAINED_FOCUS);
         } else if (!hasFocus && mGainedFocus) {
             Log.i(TAG, "lost focus");
-            sendBroadcast(new Intent(Utils.LOST_FOCUS));
+            notify(Utils.LOST_FOCUS);
         }
     }
 }
diff --git a/tests/tests/assist/testapp/src/android/assist/testapp/LifecycleActivity.java b/tests/tests/assist/testapp/src/android/assist/testapp/LifecycleActivity.java
index 0602d3f..9f76bbe 100644
--- a/tests/tests/assist/testapp/src/android/assist/testapp/LifecycleActivity.java
+++ b/tests/tests/assist/testapp/src/android/assist/testapp/LifecycleActivity.java
@@ -16,42 +16,25 @@
 
 package android.assist.testapp;
 
-import android.app.Activity;
-import android.content.BroadcastReceiver;
-import android.content.Context;
-import android.content.Intent;
-import android.content.IntentFilter;
+import android.assist.common.Utils;
 import android.os.Bundle;
 import android.util.Log;
 
-public class LifecycleActivity extends Activity {
+public class LifecycleActivity extends BaseThirdPartyActivity {
     private static final String TAG = "LifecycleActivity";
 
-    private BroadcastReceiver mReceiver;
-
     @Override
     public void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         Log.i(TAG, "LifecycleActivity created");
-        mReceiver = new BroadcastReceiver() {
-            @Override
-            public void onReceive(Context context, Intent intent) {
-                String action = intent.getAction();
-                if (action.equals("android.intent.action.hide_lifecycle_activity")) {
-                    finish();
-                }
-            }
-        };
-        IntentFilter filter = new IntentFilter();
-        filter.addAction("android.intent.action.hide_lifecycle_activity");
-        registerReceiver(mReceiver, filter);
     }
 
     @Override
-    protected void onResume() {
-        super.onResume();
-        Log.i(TAG, "Activity has resumed");
-        sendBroadcast(new Intent("android.intent.action.lifecycle_hasResumed"));
+    protected void onReceivedEventFromCaller(Bundle results, String action) {
+        super.onReceivedEventFromCaller(results, action);
+        if (action.equals(Utils.HIDE_LIFECYCLE_ACTIVITY)) {
+            finish();
+        }
     }
 
     @Override
@@ -59,31 +42,30 @@
         super.onWindowFocusChanged(hasFocus);
         Log.i(TAG, "Activity focus changed: " + hasFocus);
         if (hasFocus) {
-            sendBroadcast(new Intent("android.intent.action.lifecycle_hasFocus"));
+            notify("android.intent.action.lifecycle_hasFocus");
         } else {
-            sendBroadcast(new Intent("android.intent.action.lifecycle_lostFocus"));
+            notify("android.intent.action.lifecycle_lostFocus");
         }
     }
 
     @Override
     protected void onPause() {
         Log.i(TAG, "activity was paused");
-        sendBroadcast(new Intent("android.intent.action.lifecycle_onpause"));
+        notify("android.intent.action.lifecycle_onpause");
         super.onPause();
     }
 
     @Override
     protected void onStop() {
         Log.i(TAG, "activity was stopped");
-        sendBroadcast(new Intent("android.intent.action.lifecycle_onstop"));
+        notify("android.intent.action.lifecycle_onstop");
         super.onStop();
     }
 
     @Override
     protected void onDestroy() {
         Log.i(TAG, "activity was destroyed");
-        sendBroadcast(new Intent("android.intent.action.lifecycle_ondestroy"));
-        unregisterReceiver(mReceiver);
+        notify("android.intent.action.lifecycle_ondestroy");
         super.onDestroy();
     }
 }
diff --git a/tests/tests/assist/testapp/src/android/assist/testapp/ScreenshotActivity.java b/tests/tests/assist/testapp/src/android/assist/testapp/ScreenshotActivity.java
index fb08e77..6cf7ef6 100644
--- a/tests/tests/assist/testapp/src/android/assist/testapp/ScreenshotActivity.java
+++ b/tests/tests/assist/testapp/src/android/assist/testapp/ScreenshotActivity.java
@@ -15,15 +15,13 @@
  */
 package android.assist.testapp;
 
-import android.app.Activity;
 import android.assist.common.Utils;
-import android.content.Intent;
 import android.graphics.Color;
 import android.os.Bundle;
 import android.util.Log;
 import android.view.View;
 
-public class ScreenshotActivity extends Activity {
+public class ScreenshotActivity extends BaseThirdPartyActivity {
     static final String TAG = "ScreenshotActivity";
 
     @Override
@@ -31,21 +29,11 @@
         super.onCreate(savedInstanceState);
         Log.i(TAG, "ScreenshotActivity created");
         setContentView(R.layout.screenshot_activity);
-    }
 
-    @Override
-    public void onResume() {
-        Log.i(TAG, " in onResume");
-        super.onResume();
         int backgroundColor = getIntent().getIntExtra(Utils.SCREENSHOT_COLOR_KEY, Color.WHITE);
         View view = findViewById(R.id.screenshot_activity);
         view.setBackgroundColor(backgroundColor);
         view.requestLayout();
-
-        // Tell service activity is in foreground.
-        Intent intent = new Intent(Utils.APP_3P_HASRESUMED);
-        sendBroadcast(intent);
-        Log.i(TAG, "Resumed broadcast sent.");
     }
 
     @Override
diff --git a/tests/tests/assist/testapp/src/android/assist/testapp/SecureActivity.java b/tests/tests/assist/testapp/src/android/assist/testapp/SecureActivity.java
index 0f812b7..ae41aca 100644
--- a/tests/tests/assist/testapp/src/android/assist/testapp/SecureActivity.java
+++ b/tests/tests/assist/testapp/src/android/assist/testapp/SecureActivity.java
@@ -16,17 +16,11 @@
 
 package android.assist.testapp;
 
-import android.app.Activity;
-import android.assist.common.Utils;
-import android.content.Intent;
 import android.os.Bundle;
 import android.util.Log;
-import android.view.View;
-import android.view.ViewTreeObserver;
-import android.view.ViewTreeObserver.OnGlobalLayoutListener;
 import android.view.WindowManager;
 
-public class SecureActivity extends Activity {
+public class SecureActivity extends BaseThirdPartyActivity {
     static final String TAG = "SecureActivity";
     @Override
     public void onCreate(Bundle savedInstanceState) {
@@ -36,19 +30,4 @@
         getWindow().setFlags(WindowManager.LayoutParams.FLAG_SECURE,
             WindowManager.LayoutParams.FLAG_SECURE);
     }
-
-    @Override
-    protected void onResume() {
-        super.onResume();
-        Log.i(TAG, "Activity has resumed");
-        final View layout = findViewById(android.R.id.content);
-        ViewTreeObserver vto = layout.getViewTreeObserver();
-        vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
-            @Override
-            public void onGlobalLayout() {
-                layout.getViewTreeObserver().removeOnGlobalLayoutListener(this);
-                sendBroadcast(new Intent(Utils.FLAG_SECURE_HASRESUMED));
-            }
-        });
-    }
 }
diff --git a/tests/tests/assist/testapp/src/android/assist/testapp/TestApp.java b/tests/tests/assist/testapp/src/android/assist/testapp/TestApp.java
index 7865c4d..c094435 100755
--- a/tests/tests/assist/testapp/src/android/assist/testapp/TestApp.java
+++ b/tests/tests/assist/testapp/src/android/assist/testapp/TestApp.java
@@ -16,29 +16,19 @@
 
 package android.assist.testapp;
 
-import android.app.Activity;
 import android.assist.common.Utils;
-import android.content.Intent;
 import android.os.Bundle;
-import android.os.RemoteCallback;
 import android.util.Log;
-import android.view.View;
-import android.view.ViewTreeObserver;
-import android.view.ViewTreeObserver.OnGlobalLayoutListener;
 
-public class TestApp extends Activity {
+public class TestApp extends BaseThirdPartyActivity {
     static final String TAG = "TestApp";
 
     private String mTestCaseName;
-    private RemoteCallback mResumedCallback;
-    private RemoteCallback mDrawedCallback;
 
     @Override
     public void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         Log.i(TAG, "TestApp created: " + getIntent());
-        mResumedCallback = getIntent().getParcelableExtra(Utils.EXTRA_CALLBACK_ACTIVITY_RESUMED);
-        mDrawedCallback = getIntent().getParcelableExtra(Utils.EXTRA_CALLBACK_ACTIVITY_DRAWED);
         mTestCaseName = getIntent().getStringExtra(Utils.TESTCASE_TYPE);
         switch (mTestCaseName) {
             case Utils.LARGE_VIEW_HIERARCHY:
@@ -50,38 +40,9 @@
     }
 
     @Override
-    public void onResume() {
-        super.onResume();
-        Log.i(TAG, "TestApp has resumed");
-        final View layout = findViewById(android.R.id.content);
-        ViewTreeObserver vto = layout.getViewTreeObserver();
-        vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
-            @Override
-            public void onGlobalLayout() {
-                layout.getViewTreeObserver().removeOnGlobalLayoutListener(this);
-                if (mResumedCallback != null) {
-                    Log.i(TAG, "onGlobalLayout(): notifying callback");
-                    mResumedCallback.sendResult(/* result= */ null);
-                } else {
-                    // TODO(b/133431034): should only use callbacks
-                    Log.w(TAG, "No resume callback onGlobalLayout(); broadcasting instead");
-                    sendBroadcast(new Intent(Utils.APP_3P_HASRESUMED));
-                }
-            }
-        });
-    }
-
-    @Override
     public void onEnterAnimationComplete() {
         Log.i(TAG, "TestApp onEnterAnimationComplete ");
-        if (mDrawedCallback != null) {
-            Log.i(TAG, "onEnterAnimationComplete(): notifying callback");
-            mDrawedCallback.sendResult(/* result= */ null);
-        } else {
-            // TODO(b/133431034): should only use callbacks
-            Log.w(TAG, "No resume callback onEnterAnimationComplete(); broadcasting instead");
-            sendBroadcast(new Intent(Utils.APP_3P_HASDRAWED));
-        }
+        notify(Utils.APP_3P_HASDRAWED);
     }
 
-}
\ No newline at end of file
+}
diff --git a/tests/tests/assist/testapp/src/android/assist/testapp/TextViewActivity.java b/tests/tests/assist/testapp/src/android/assist/testapp/TextViewActivity.java
index c031292..d7a32bb 100644
--- a/tests/tests/assist/testapp/src/android/assist/testapp/TextViewActivity.java
+++ b/tests/tests/assist/testapp/src/android/assist/testapp/TextViewActivity.java
@@ -16,25 +16,17 @@
 
 package android.assist.testapp;
 
-import android.app.Activity;
 import android.assist.common.Utils;
-import android.content.BroadcastReceiver;
-import android.content.Context;
-import android.content.Intent;
-import android.content.IntentFilter;
 import android.os.Bundle;
 import android.text.method.ScrollingMovementMethod;
 import android.util.Log;
 import android.view.View;
-import android.view.ViewTreeObserver;
-import android.view.ViewTreeObserver.OnGlobalLayoutListener;
 import android.widget.ScrollView;
 import android.widget.TextView;
 
-public class TextViewActivity extends Activity {
+public class TextViewActivity extends BaseThirdPartyActivity {
     static final String TAG = "TextViewActivity";
 
-    private BroadcastReceiver mReceiver;
     private TextView mTextView;
     private ScrollView mScrollView;
 
@@ -43,68 +35,38 @@
         super.onCreate(savedInstanceState);
         Log.i(TAG, "TextViewActivity created");
         setContentView(R.layout.text_view);
-        mScrollView = (ScrollView) findViewById(R.id.scroll_view);
-        mTextView = (TextView) findViewById(R.id.text_view);
+        mScrollView = findViewById(R.id.scroll_view);
+        mTextView = findViewById(R.id.text_view);
         mTextView.setMovementMethod(new ScrollingMovementMethod());
     }
 
     @Override
-    public void onResume() {
-        super.onResume();
-        Log.i(TAG, "TextViewActivity has resumed");
+    protected void onReceivedEventFromCaller(Bundle results, String action) {
+        super.onReceivedEventFromCaller(results, action);
 
-        mReceiver = new ScrollReceiver();
-        IntentFilter filter = new IntentFilter();
-        filter.addAction(Utils.SCROLL_TEXTVIEW_ACTION);
-        filter.addAction(Utils.SCROLL_SCROLLVIEW_ACTION);
-        registerReceiver(mReceiver, filter);
-
-        final View layout = findViewById(android.R.id.content);
-        ViewTreeObserver vto = layout.getViewTreeObserver();
-        vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
-            @Override
-            public void onGlobalLayout() {
-                layout.getViewTreeObserver().removeOnGlobalLayoutListener(this);
-                sendBroadcast(new Intent(Utils.APP_3P_HASRESUMED));
+        int scrollX, scrollY;
+        scrollX = results.getInt(Utils.SCROLL_X_POSITION, 0);
+        scrollY = results.getInt(Utils.SCROLL_Y_POSITION, 0);
+        if (action.equals(Utils.SCROLL_TEXTVIEW_ACTION)) {
+            Log.i(TAG, "Scrolling textview to (" + scrollX + "," + scrollY + ")");
+            if (scrollX < 0 || scrollY < 0) {
+                // Scroll to bottom as negative positions are not possible.
+                scrollX = mTextView.getWidth();
+                scrollY = mTextView.getLayout().getLineTop(mTextView.getLineCount())
+                        - mTextView.getHeight();
             }
-        });
-    }
-
-    @Override
-    public void onPause() {
-        if (mReceiver != null) {
-            unregisterReceiver(mReceiver);
-        }
-        super.onPause();
-    }
-
-    class ScrollReceiver extends BroadcastReceiver {
-        @Override
-        public void onReceive(Context context, Intent intent) {
-            int scrollX, scrollY;
-            scrollX = intent.getIntExtra(Utils.SCROLL_X_POSITION, 0);
-            scrollY = intent.getIntExtra(Utils.SCROLL_Y_POSITION, 0);
-            if (intent.getAction().equals(Utils.SCROLL_TEXTVIEW_ACTION)) {
-                Log.i(TAG, "Scrolling textview to (" + scrollX + "," + scrollY + ")");
-                if (scrollX < 0 || scrollY < 0) {
-                    // Scroll to bottom as negative positions are not possible.
-                    scrollX = mTextView.getWidth();
-                    scrollY = mTextView.getLayout().getLineTop(mTextView.getLineCount())
-                            - mTextView.getHeight();
-                }
-                TextViewActivity.this.mTextView.scrollTo(scrollX, scrollY);
-            } else if (intent.getAction().equals(Utils.SCROLL_SCROLLVIEW_ACTION)) {
-                Log.i(TAG, "Scrolling scrollview to (" + scrollX + "," + scrollY + ")");
-                if (scrollX < 0 || scrollY < 0) {
-                    // Scroll to bottom
-                    TextViewActivity.this.mScrollView.fullScroll(View.FOCUS_DOWN);
-                    TextViewActivity.this.mScrollView.fullScroll(View.FOCUS_RIGHT);
-                } else {
-                    TextViewActivity.this.mScrollView.scrollTo(scrollX, scrollY);
-                }
+            TextViewActivity.this.mTextView.scrollTo(scrollX, scrollY);
+        } else if (action.equals(Utils.SCROLL_SCROLLVIEW_ACTION)) {
+            Log.i(TAG, "Scrolling scrollview to (" + scrollX + "," + scrollY + ")");
+            if (scrollX < 0 || scrollY < 0) {
+                // Scroll to bottom
+                TextViewActivity.this.mScrollView.fullScroll(View.FOCUS_DOWN);
+                TextViewActivity.this.mScrollView.fullScroll(View.FOCUS_RIGHT);
+            } else {
+                TextViewActivity.this.mScrollView.scrollTo(scrollX, scrollY);
             }
-            Log.i(TAG, "the max height of this textview is: " + mTextView.getHeight());
-            Log.i(TAG, "the max line count of this text view is: " + mTextView.getMaxLines());
         }
+        Log.i(TAG, "the max height of this textview is: " + mTextView.getHeight());
+        Log.i(TAG, "the max line count of this text view is: " + mTextView.getMaxLines());
     }
-}
\ No newline at end of file
+}
diff --git a/tests/tests/assist/testapp/src/android/assist/testapp/WebViewActivity.java b/tests/tests/assist/testapp/src/android/assist/testapp/WebViewActivity.java
index c62bf97..f092a0e 100644
--- a/tests/tests/assist/testapp/src/android/assist/testapp/WebViewActivity.java
+++ b/tests/tests/assist/testapp/src/android/assist/testapp/WebViewActivity.java
@@ -16,32 +16,26 @@
 
 package android.assist.testapp;
 
-import android.app.Activity;
 import android.assist.common.MyWebView;
 import android.assist.common.Utils;
-import android.content.Context;
-import android.content.Intent;
 import android.os.Bundle;
 import android.util.Log;
 import android.webkit.WebView;
 import android.webkit.WebViewClient;
 
-public class WebViewActivity extends Activity {
+public class WebViewActivity extends BaseThirdPartyActivity {
     static final String TAG = "WebViewActivity";
 
-    private String mTestCaseName;
-
     @Override
     public void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         Log.i(TAG, "TestApp created");
-        mTestCaseName = getIntent().getStringExtra(Utils.TESTCASE_TYPE);
         setContentView(R.layout.webview);
-        MyWebView webview = (MyWebView) findViewById(R.id.webview);
+        MyWebView webview = findViewById(R.id.webview);
         webview.setWebViewClient(new WebViewClient() {
             @Override
-            public void onPageFinished(WebView view, String url){
-                sendBroadcast(new Intent(Utils.APP_3P_HASRESUMED));
+            public void onPageFinished(WebView view, String url) {
+                WebViewActivity.this.notify(Utils.APP_3P_HASRESUMED);
             }
         });
         webview.myLoadData(Utils.WEBVIEW_HTML_URL, Utils.WEBVIEW_HTML, "text/html", "UTF-8");
diff --git a/tests/tests/car/src/android/car/cts/CarInfoManagerTest.java b/tests/tests/car/src/android/car/cts/CarInfoManagerTest.java
index fc4571c..e3ca341 100644
--- a/tests/tests/car/src/android/car/cts/CarInfoManagerTest.java
+++ b/tests/tests/car/src/android/car/cts/CarInfoManagerTest.java
@@ -42,6 +42,10 @@
 public class CarInfoManagerTest extends CarApiTestBase {
 
     private CarInfoManager mCarInfoManager;
+    // SCAME EvConnectorType in VHAL
+    private static final int SCAME = 11;
+    // GBT_DC EvConnectorType in VHAL
+    private static final int GBT_DC = 10;
 
     @Before
     public void setUp() throws Exception {
@@ -112,7 +116,8 @@
             Arrays.asList(EvConnectorType.UNKNOWN, EvConnectorType.J1772, EvConnectorType.MENNEKES,
                 EvConnectorType.CHADEMO, EvConnectorType.COMBO_1, EvConnectorType.COMBO_2,
                 EvConnectorType.TESLA_ROADSTER, EvConnectorType.TESLA_HPWC,
-                EvConnectorType.TESLA_SUPERCHARGER, EvConnectorType.GBT, EvConnectorType.OTHER);
+                EvConnectorType.TESLA_SUPERCHARGER, EvConnectorType.GBT, EvConnectorType.OTHER,
+                SCAME, GBT_DC);
 
         for (int result : actualResults) {
             assertThat(expectedResults).contains(result);
diff --git a/tests/tests/carrierapi/src/android/carrierapi/cts/CarrierApiTest.java b/tests/tests/carrierapi/src/android/carrierapi/cts/CarrierApiTest.java
index 3ad6fee..379edc5 100644
--- a/tests/tests/carrierapi/src/android/carrierapi/cts/CarrierApiTest.java
+++ b/tests/tests/carrierapi/src/android/carrierapi/cts/CarrierApiTest.java
@@ -593,7 +593,7 @@
         // {@link TelephonyManager#iccOpenLogicalChannel} sends a Manage Channel (open) APDU
         // followed by a Select APDU with the given AID and p2 values. See Open Mobile API
         // Specification v3.2 Section 6.2.7.h and TS 102 221 for details.
-        int p2 = 0;
+        int p2 = 0x0C; // '0C' for no data returned (TS 102 221 Section 11.1.1.2)
         response = mTelephonyManager.iccOpenLogicalChannel("", p2);
         verifyValidIccOpenLogicalChannelResponse(response);
         mTelephonyManager.iccCloseLogicalChannel(response.getChannel());
diff --git a/tests/tests/dpi/src/android/dpi/cts/ConfigurationTest.java b/tests/tests/dpi/src/android/dpi/cts/ConfigurationTest.java
index 1278f1e..7e29288 100644
--- a/tests/tests/dpi/src/android/dpi/cts/ConfigurationTest.java
+++ b/tests/tests/dpi/src/android/dpi/cts/ConfigurationTest.java
@@ -84,8 +84,10 @@
         allowedDensities.add(DisplayMetrics.DENSITY_400);
         allowedDensities.add(DisplayMetrics.DENSITY_420);
         allowedDensities.add(DisplayMetrics.DENSITY_440);
+        allowedDensities.add(DisplayMetrics.DENSITY_450);
         allowedDensities.add(DisplayMetrics.DENSITY_XXHIGH);
         allowedDensities.add(DisplayMetrics.DENSITY_560);
+        allowedDensities.add(DisplayMetrics.DENSITY_600);
         allowedDensities.add(DisplayMetrics.DENSITY_XXXHIGH);
         assertTrue("DisplayMetrics.DENSITY_DEVICE_STABLE must be one of the DisplayMetrics.DENSITY_* values: "
                 + allowedDensities, allowedDensities.contains(DisplayMetrics.DENSITY_DEVICE_STABLE));
diff --git a/tests/tests/graphics/src/android/graphics/drawable/cts/ColorStateListDrawableTest.java b/tests/tests/graphics/src/android/graphics/drawable/cts/ColorStateListDrawableTest.java
index 1455255..562504c 100644
--- a/tests/tests/graphics/src/android/graphics/drawable/cts/ColorStateListDrawableTest.java
+++ b/tests/tests/graphics/src/android/graphics/drawable/cts/ColorStateListDrawableTest.java
@@ -24,6 +24,7 @@
 
 import android.R;
 import android.content.res.ColorStateList;
+import android.graphics.Bitmap;
 import android.graphics.Canvas;
 import android.graphics.Color;
 import android.graphics.ColorFilter;
@@ -68,8 +69,22 @@
 
     @Test
     public void testDraw() {
-        Canvas c = new Canvas();
-        mDrawable.draw(c);
+        Bitmap bitmap = Bitmap.createBitmap(1, 1, Bitmap.Config.ARGB_8888);
+
+        try {
+            Canvas canvas = new Canvas(bitmap);
+            mDrawable.setBounds(0, 0, 1, 1);
+
+            mDrawable.setState(STATE_RED);
+            mDrawable.draw(canvas);
+            assertEquals(Color.RED, bitmap.getPixel(0, 0));
+
+            mDrawable.setState(STATE_BLUE);
+            mDrawable.draw(canvas);
+            assertEquals(Color.BLUE, bitmap.getPixel(0, 0));
+        } finally {
+            bitmap.recycle();
+        }
     }
 
     @Test
diff --git a/tests/tests/graphics/src/android/graphics/drawable/cts/LayerDrawableTest.java b/tests/tests/graphics/src/android/graphics/drawable/cts/LayerDrawableTest.java
index ba841c7..4cbddcb 100644
--- a/tests/tests/graphics/src/android/graphics/drawable/cts/LayerDrawableTest.java
+++ b/tests/tests/graphics/src/android/graphics/drawable/cts/LayerDrawableTest.java
@@ -1513,6 +1513,16 @@
         assertEquals(height, dr.getIntrinsicHeight());
     }
 
+    @Test
+    public void testIsProjectedWithNullLayer() {
+        try {
+            LayerDrawable dr = new LayerDrawable(new Drawable[] {null});
+            dr.isProjected();
+        } catch (NullPointerException excep) {
+            fail("isProjected should support null child layer drawables");
+        }
+    }
+
     // Since Mockito can't mock or spy on protected methods, we have a custom extension
     // of Drawable to track calls to protected methods. This class also has empty implementations
     // of the base abstract methods. In addition, this class also updates its padding on every
diff --git a/tests/tests/location/src/android/location/cts/GnssPseudorangeVerificationTest.java b/tests/tests/location/src/android/location/cts/GnssPseudorangeVerificationTest.java
index 7e999be..0e6843d 100644
--- a/tests/tests/location/src/android/location/cts/GnssPseudorangeVerificationTest.java
+++ b/tests/tests/location/src/android/location/cts/GnssPseudorangeVerificationTest.java
@@ -41,20 +41,24 @@
   private static final int MIN_SATELLITES_REQUIREMENT = 4;
   private static final double SECONDS_PER_NANO = 1.0e-9;
 
-  // GPS/GLONASS: according to http://cdn.intechopen.com/pdfs-wm/27712.pdf, the pseudorange in time
-  // is 65-83 ms, which is 18 ms range.
-  // GLONASS: orbit is a bit closer than GPS, so we add 0.003ms to the range, hence deltaiSeconds
-  // should be in the range of [0.0, 0.021] seconds.
-  // QZSS and BEIDOU: they have higher orbit, which will result in a small svTime, the deltai can be
-  // calculated as follows:
-  // assume a = QZSS/BEIDOU orbit Semi-Major Axis(42,164km for QZSS);
-  // b = GLONASS orbit Semi-Major Axis (25,508km);
-  // c = Speed of light (299,792km/s);
-  // e = earth radius (6,378km);
-  // in the extremely case of QZSS is on the horizon and GLONASS is on the 90 degree top
-  // max difference should be (sqrt(a^2-e^2) - (b-e))/c,
-  // which is around 0.076s.
-  private static final double PSEUDORANGE_THRESHOLD_IN_SEC = 0.021;
+    // GPS/GLONASS: according to http://cdn.intechopen.com/pdfs-wm/27712.pdf, the pseudorange in
+    // time
+    // is 65-83 ms, which is 18 ms range.
+    // GLONASS: orbit is a bit closer than GPS, so we add 0.003ms to the range, hence deltaiSeconds
+    // should be in the range of [0.0, 0.021] seconds.
+    // QZSS and BEIDOU: they have higher orbit, which will result in a small svTime, the deltai
+    // can be
+    // calculated as follows:
+    // assume a = QZSS/BEIDOU orbit Semi-Major Axis(42,164km for QZSS);
+    // b = GLONASS orbit Semi-Major Axis (25,508km);
+    // c = Speed of light (299,792km/s);
+    // e = earth radius (6,378km);
+    // in the extremely case of QZSS is on the horizon and GLONASS is on the 90 degree top
+    // max difference should be (sqrt(a^2-e^2) - (b-e))/c,
+    // which is around 0.076s.
+    // 2 Galileo satellites (E14 & E18) have elliptical orbits, so Galileo can have up-to 48ms of
+    // spread.
+    private static final double PSEUDORANGE_THRESHOLD_IN_SEC = 0.048;
   // Geosync constellations have a longer range vs typical MEO orbits
   // that are the short end of the range.
   private static final double PSEUDORANGE_THRESHOLD_BEIDOU_QZSS_IN_SEC = 0.076;
@@ -174,23 +178,27 @@
     return measurementConstellationMap;
   }
 
-  private ArrayList<GnssMeasurement> filterMeasurements(Collection<GnssMeasurement> measurements) {
-    ArrayList<GnssMeasurement> filteredMeasurement = new ArrayList<>();
-    for (GnssMeasurement measurement: measurements){
-      int constellationType = measurement.getConstellationType();
-      if (constellationType == GnssStatus.CONSTELLATION_GLONASS) {
-        if ((measurement.getState()
-            & (measurement.STATE_GLO_TOD_DECODED | measurement.STATE_GLO_TOD_KNOWN)) != 0) {
-          filteredMeasurement.add(measurement);
+    private static ArrayList<GnssMeasurement> filterMeasurements(
+            Collection<GnssMeasurement> measurements) {
+        ArrayList<GnssMeasurement> filteredMeasurement = new ArrayList<>();
+        for (GnssMeasurement measurement : measurements) {
+            int constellationType = measurement.getConstellationType();
+            if ((measurement.getState() & GnssMeasurement.STATE_CODE_LOCK) == 0) {
+                continue;
+            }
+            if (constellationType == GnssStatus.CONSTELLATION_GLONASS) {
+                if ((measurement.getState()
+                        & (GnssMeasurement.STATE_GLO_TOD_DECODED
+                        | GnssMeasurement.STATE_GLO_TOD_KNOWN)) != 0) {
+                    filteredMeasurement.add(measurement);
+                }
+            } else if ((measurement.getState() & (GnssMeasurement.STATE_TOW_DECODED
+                    | GnssMeasurement.STATE_TOW_KNOWN)) != 0) {
+                filteredMeasurement.add(measurement);
+            }
         }
-      }
-      else if ((measurement.getState()
-            & (measurement.STATE_TOW_DECODED | measurement.STATE_TOW_KNOWN)) != 0) {
-          filteredMeasurement.add(measurement);
-        }
+        return filteredMeasurement;
     }
-    return filteredMeasurement;
-  }
 
   /**
    * Uses the common reception time approach to calculate pseudorange time
diff --git a/tests/tests/media/src/android/media/cts/DecodeEditEncodeTest.java b/tests/tests/media/src/android/media/cts/DecodeEditEncodeTest.java
index 1ceb025..0803da3 100644
--- a/tests/tests/media/src/android/media/cts/DecodeEditEncodeTest.java
+++ b/tests/tests/media/src/android/media/cts/DecodeEditEncodeTest.java
@@ -57,6 +57,7 @@
     private static final String MIME_TYPE = MediaFormat.MIMETYPE_VIDEO_AVC;
     private static final int FRAME_RATE = 15;               // 15fps
     private static final int IFRAME_INTERVAL = 10;          // 10 seconds between I-frames
+    private static final String KEY_ALLOW_FRAME_DROP = "allow-frame-drop";
 
     // movie length, in frames
     private static final int NUM_FRAMES = 30;               // two seconds of video
@@ -418,9 +419,17 @@
             decoder = MediaCodec.createDecoderByType(MIME_TYPE);
             outputSurface = new OutputSurface();
             outputSurface.changeFragmentShader(FRAGMENT_SHADER);
+            // do not allow frame drops
+            inputFormat.setInteger(KEY_ALLOW_FRAME_DROP, 0);
+
             decoder.configure(inputFormat, outputSurface.getSurface(), null, 0);
             decoder.start();
 
+            // verify that we are not dropping frames
+            inputFormat = decoder.getInputFormat();
+            assertEquals("Could not prevent frame dropping",
+                         0, inputFormat.getInteger(KEY_ALLOW_FRAME_DROP));
+
             editVideoData(inputData, decoder, outputSurface, inputSurface, encoder, outputData);
         } finally {
             if (VERBOSE) Log.d(TAG, "shutting down encoder, decoder");
@@ -617,6 +626,7 @@
 
             MediaFormat format = inputData.getMediaFormat();
             decoder = MediaCodec.createDecoderByType(MIME_TYPE);
+            format.setInteger(KEY_ALLOW_FRAME_DROP, 0);
             decoder.configure(format, surface.getSurface(), null, 0);
             decoder.start();
 
@@ -829,7 +839,7 @@
          * Gets the MediaFormat that was used by the encoder.
          */
         public MediaFormat getMediaFormat() {
-            return mMediaFormat;
+            return new MediaFormat(mMediaFormat);
         }
 
         /**
diff --git a/tests/tests/media/src/android/media/cts/MediaCodecListTest.java b/tests/tests/media/src/android/media/cts/MediaCodecListTest.java
index 29cec3f..90cd301 100644
--- a/tests/tests/media/src/android/media/cts/MediaCodecListTest.java
+++ b/tests/tests/media/src/android/media/cts/MediaCodecListTest.java
@@ -794,6 +794,13 @@
                                 covered);
                     }
                 }
+                // non-standard points should not be covered by any other performance point
+                for (VideoCapabilities.PerformancePoint pp2 : points) {
+                    // using object equality to determine otherness
+                    assertFalse(pp2 + " for " + info.getCanonicalName()
+                            + " for media type " + mediaType + " covers " + pp,
+                            pp2 != pp && pp2.covers(pp));
+                }
             }
         }
     }
diff --git a/tests/tests/media/src/android/media/cts/StreamingMediaPlayerTest.java b/tests/tests/media/src/android/media/cts/StreamingMediaPlayerTest.java
index 789d1ba..ede1711 100644
--- a/tests/tests/media/src/android/media/cts/StreamingMediaPlayerTest.java
+++ b/tests/tests/media/src/android/media/cts/StreamingMediaPlayerTest.java
@@ -237,9 +237,15 @@
         if (!MediaUtils.checkDecoder(MediaFormat.MIMETYPE_VIDEO_AVC)) {
             return; // skip
         }
+        MediaFormat format = MediaFormat.createVideoFormat(MediaFormat.MIMETYPE_VIDEO_AVC, 1920, 1080);
+        String[] decoderNames = MediaUtils.getDecoderNames(false, format);
 
-        // Play stream for 60 seconds
-        localHlsTest("unmuxed_1500k/index.m3u8", 60 * 1000, -1, false /*isAudioOnly*/);
+        if (decoderNames.length == 0) {
+            MediaUtils.skipTest("No decoders for " + format);
+        } else {
+            // Play stream for 60 seconds
+            localHlsTest("unmuxed_1500k/index.m3u8", 60 * 1000, -1, false /*isAudioOnly*/);
+        }
     }
 
 
diff --git a/tests/tests/net/src/android/net/cts/ConnectivityManagerTest.java b/tests/tests/net/src/android/net/cts/ConnectivityManagerTest.java
index 8c9bf6e..e9deec9 100644
--- a/tests/tests/net/src/android/net/cts/ConnectivityManagerTest.java
+++ b/tests/tests/net/src/android/net/cts/ConnectivityManagerTest.java
@@ -35,6 +35,7 @@
 
 import static com.android.compatibility.common.util.SystemUtil.runShellCommand;
 
+import android.annotation.NonNull;
 import android.app.Instrumentation;
 import android.app.PendingIntent;
 import android.app.UiAutomation;
@@ -59,6 +60,7 @@
 import android.net.cts.util.CtsNetUtils;
 import android.net.util.KeepaliveUtils;
 import android.net.wifi.WifiManager;
+import android.os.Build;
 import android.os.Looper;
 import android.os.MessageQueue;
 import android.os.SystemClock;
@@ -99,6 +101,7 @@
 import java.util.concurrent.Executor;
 import java.util.concurrent.LinkedBlockingQueue;
 import java.util.concurrent.TimeUnit;
+import java.util.function.Supplier;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
@@ -113,6 +116,8 @@
     private static final int CONNECT_TIMEOUT_MS = 2000;
     private static final int KEEPALIVE_CALLBACK_TIMEOUT_MS = 2000;
     private static final int KEEPALIVE_SOCKET_TIMEOUT_MS = 5000;
+    private static final int INTERVAL_KEEPALIVE_RETRY_MS = 500;
+    private static final int MAX_KEEPALIVE_RETRY_COUNT = 3;
     private static final int MIN_KEEPALIVE_INTERVAL = 10;
     private static final int NETWORK_CHANGE_METEREDNESS_TIMEOUT = 5000;
     private static final int NUM_TRIES_MULTIPATH_PREF_CHECK = 20;
@@ -120,6 +125,10 @@
     // device could have only one interface: data, wifi.
     private static final int MIN_NUM_NETWORK_TYPES = 1;
 
+    // Minimum supported keepalive counts for wifi and cellular.
+    public static final int MIN_SUPPORTED_CELLULAR_KEEPALIVE_COUNT = 1;
+    public static final int MIN_SUPPORTED_WIFI_KEEPALIVE_COUNT = 3;
+
     private Context mContext;
     private Instrumentation mInstrumentation;
     private ConnectivityManager mCm;
@@ -839,8 +848,7 @@
         return s;
     }
 
-    private int getSupportedKeepalivesFromRes() throws Exception {
-        final Network network = ensureWifiConnected();
+    private int getSupportedKeepalivesForNet(@NonNull Network network) throws Exception {
         final NetworkCapabilities nc = mCm.getNetworkCapabilities(network);
 
         // Get number of supported concurrent keepalives for testing network.
@@ -914,34 +922,46 @@
      * keepalives is set to 0.
      */
     @AppModeFull(reason = "Cannot get WifiManager in instant app mode")
-    public void testKeepaliveUnsupported() throws Exception {
-        if (getSupportedKeepalivesFromRes() != 0) return;
+    public void testKeepaliveWifiUnsupported() throws Exception {
+        if (!mPackageManager.hasSystemFeature(FEATURE_WIFI)) {
+            Log.i(TAG, "testKeepaliveUnsupported cannot execute unless device"
+                    + " supports WiFi");
+            return;
+        }
+
+        final Network network = ensureWifiConnected();
+        if (getSupportedKeepalivesForNet(network) != 0) return;
 
         adoptShellPermissionIdentity();
 
-        assertEquals(0, createConcurrentSocketKeepalives(1, 0));
-        assertEquals(0, createConcurrentSocketKeepalives(0, 1));
+        assertEquals(0, createConcurrentSocketKeepalives(network, 1, 0));
+        assertEquals(0, createConcurrentSocketKeepalives(network, 0, 1));
 
         dropShellPermissionIdentity();
     }
 
     @AppModeFull(reason = "Cannot get WifiManager in instant app mode")
     public void testCreateTcpKeepalive() throws Exception {
+        if (!mPackageManager.hasSystemFeature(FEATURE_WIFI)) {
+            Log.i(TAG, "testCreateTcpKeepalive cannot execute unless device supports WiFi");
+            return;
+        }
+
         adoptShellPermissionIdentity();
 
-        if (getSupportedKeepalivesFromRes() == 0) return;
+        final Network network = ensureWifiConnected();
+        if (getSupportedKeepalivesForNet(network) == 0) return;
         // If kernel < 4.8 then it doesn't support TCP keepalive, but it might still support
         // NAT-T keepalive. If keepalive limits from resource overlay is not zero, TCP keepalive
         // needs to be supported except if the kernel doesn't support it.
         if (!isTcpKeepaliveSupportedByKernel()) {
             // Sanity check to ensure the callback result is expected.
-            assertEquals(0, createConcurrentSocketKeepalives(0, 1));
+            assertEquals(0, createConcurrentSocketKeepalives(network, 0, 1));
             Log.i(TAG, "testCreateTcpKeepalive is skipped for kernel "
                     + VintfRuntimeInfo.getKernelVersion());
             return;
         }
 
-        final Network network = ensureWifiConnected();
         final byte[] requestBytes = CtsNetUtils.HTTP_REQUEST.getBytes("UTF-8");
         // So far only ipv4 tcp keepalive offload is supported.
         // TODO: add test case for ipv6 tcp keepalive offload when it is supported.
@@ -1007,80 +1027,102 @@
         }
     }
 
-    /**
-     * Creates concurrent keepalives until the specified counts of each type of keepalives are
-     * reached or the expected error callbacks are received for each type of keepalives.
-     *
-     * @return the total number of keepalives created.
-     */
-    private int createConcurrentSocketKeepalives(int nattCount, int tcpCount) throws Exception {
-        final Network network = ensureWifiConnected();
-
+    private ArrayList<SocketKeepalive> createConcurrentKeepalivesOfType(
+            int requestCount, @NonNull TestSocketKeepaliveCallback callback,
+            Supplier<SocketKeepalive> kaFactory) {
         final ArrayList<SocketKeepalive> kalist = new ArrayList<>();
-        final TestSocketKeepaliveCallback callback = new TestSocketKeepaliveCallback();
-        final Executor executor = mContext.getMainExecutor();
 
-        // Create concurrent TCP keepalives.
-        for (int i = 0; i < tcpCount; i++) {
-            // Assert that TCP connections can be established on wifi. The file descriptor of tcp
-            // sockets will be duplicated and kept valid in service side if the keepalives are
-            // successfully started.
-            try (Socket tcpSocket = getConnectedSocket(network, TEST_HOST, HTTP_PORT,
-                        0 /* Unused */, AF_INET)) {
-                final SocketKeepalive ka = mCm.createSocketKeepalive(network, tcpSocket, executor,
-                        callback);
-                ka.start(MIN_KEEPALIVE_INTERVAL);
-                TestSocketKeepaliveCallback.CallbackValue cv = callback.pollCallback();
-                assertNotNull(cv);
-                if (cv.callbackType == TestSocketKeepaliveCallback.CallbackType.ON_ERROR) {
-                    if (i == 0 && cv.error == SocketKeepalive.ERROR_UNSUPPORTED) {
-                        // Unsupported.
-                        break;
-                    } else if (i != 0 && cv.error == SocketKeepalive.ERROR_INSUFFICIENT_RESOURCES) {
-                        // Limit reached.
-                        break;
-                    }
-                }
-                if (cv.callbackType == TestSocketKeepaliveCallback.CallbackType.ON_STARTED) {
-                    kalist.add(ka);
-                } else {
-                    fail("Unexpected error when creating " + (i + 1) + " TCP keepalives: " + cv);
-                }
-            }
-        }
+        int remainingRetries = MAX_KEEPALIVE_RETRY_COUNT;
 
-        // Assert that a Nat-T socket can be created.
-        final IpSecManager mIpSec = (IpSecManager) mContext.getSystemService(Context.IPSEC_SERVICE);
-        final UdpEncapsulationSocket nattSocket = mIpSec.openUdpEncapsulationSocket();
-
-        final InetAddress srcAddr = getFirstV4Address(network);
-        final InetAddress dstAddr = getAddrByName(TEST_HOST, AF_INET);
-        assertNotNull(srcAddr);
-        assertNotNull(dstAddr);
-
-        // Test concurrent Nat-T keepalives.
-        for (int i = 0; i < nattCount; i++) {
-            final SocketKeepalive ka = mCm.createSocketKeepalive(network, nattSocket,
-                    srcAddr, dstAddr, executor, callback);
+        // Test concurrent keepalives with the given supplier.
+        while (kalist.size() < requestCount) {
+            final SocketKeepalive ka = kaFactory.get();
             ka.start(MIN_KEEPALIVE_INTERVAL);
             TestSocketKeepaliveCallback.CallbackValue cv = callback.pollCallback();
             assertNotNull(cv);
             if (cv.callbackType == TestSocketKeepaliveCallback.CallbackType.ON_ERROR) {
-                if (i == 0 && cv.error == SocketKeepalive.ERROR_UNSUPPORTED) {
+                if (kalist.size() == 0 && cv.error == SocketKeepalive.ERROR_UNSUPPORTED) {
                     // Unsupported.
                     break;
-                } else if (i != 0 && cv.error == SocketKeepalive.ERROR_INSUFFICIENT_RESOURCES) {
-                    // Limit reached.
+                } else if (cv.error == SocketKeepalive.ERROR_INSUFFICIENT_RESOURCES) {
+                    // Limit reached or temporary unavailable due to stopped slot is not yet
+                    // released.
+                    if (remainingRetries > 0) {
+                        SystemClock.sleep(INTERVAL_KEEPALIVE_RETRY_MS);
+                        remainingRetries--;
+                        continue;
+                    }
                     break;
                 }
             }
             if (cv.callbackType == TestSocketKeepaliveCallback.CallbackType.ON_STARTED) {
                 kalist.add(ka);
             } else {
-                fail("Unexpected error when creating " + (i + 1) + " Nat-T keepalives: " + cv);
+                fail("Unexpected error when creating " + (kalist.size() + 1) + " "
+                        + ka.getClass().getSimpleName() + ": " + cv);
             }
         }
 
+        return kalist;
+    }
+
+    private @NonNull ArrayList<SocketKeepalive> createConcurrentNattSocketKeepalives(
+            @NonNull Network network, int requestCount,
+            @NonNull TestSocketKeepaliveCallback callback)  throws Exception {
+
+        final Executor executor = mContext.getMainExecutor();
+
+        // Initialize a real NaT-T socket.
+        final IpSecManager mIpSec = (IpSecManager) mContext.getSystemService(Context.IPSEC_SERVICE);
+        final UdpEncapsulationSocket nattSocket = mIpSec.openUdpEncapsulationSocket();
+        final InetAddress srcAddr = getFirstV4Address(network);
+        final InetAddress dstAddr = getAddrByName(TEST_HOST, AF_INET);
+        assertNotNull(srcAddr);
+        assertNotNull(dstAddr);
+
+        // Test concurrent Nat-T keepalives.
+        final ArrayList<SocketKeepalive> result = createConcurrentKeepalivesOfType(requestCount,
+                callback, () -> mCm.createSocketKeepalive(network, nattSocket,
+                        srcAddr, dstAddr, executor, callback));
+
+        nattSocket.close();
+        return result;
+    }
+
+    private @NonNull ArrayList<SocketKeepalive> createConcurrentTcpSocketKeepalives(
+            @NonNull Network network, int requestCount,
+            @NonNull TestSocketKeepaliveCallback callback) {
+        final Executor executor = mContext.getMainExecutor();
+
+        // Create concurrent TCP keepalives.
+        return createConcurrentKeepalivesOfType(requestCount, callback, () -> {
+            // Assert that TCP connections can be established. The file descriptor of tcp
+            // sockets will be duplicated and kept valid in service side if the keepalives are
+            // successfully started.
+            try (Socket tcpSocket = getConnectedSocket(network, TEST_HOST, HTTP_PORT,
+                    0 /* Unused */, AF_INET)) {
+                return mCm.createSocketKeepalive(network, tcpSocket, executor, callback);
+            } catch (Exception e) {
+                fail("Unexpected error when creating TCP socket: " + e);
+            }
+            return null;
+        });
+    }
+
+    /**
+     * Creates concurrent keepalives until the specified counts of each type of keepalives are
+     * reached or the expected error callbacks are received for each type of keepalives.
+     *
+     * @return the total number of keepalives created.
+     */
+    private int createConcurrentSocketKeepalives(
+            @NonNull Network network, int nattCount, int tcpCount) throws Exception {
+        final ArrayList<SocketKeepalive> kalist = new ArrayList<>();
+        final TestSocketKeepaliveCallback callback = new TestSocketKeepaliveCallback();
+
+        kalist.addAll(createConcurrentNattSocketKeepalives(network, nattCount, callback));
+        kalist.addAll(createConcurrentTcpSocketKeepalives(network, tcpCount, callback));
+
         final int ret = kalist.size();
 
         // Clean up.
@@ -1089,7 +1131,6 @@
             callback.expectStopped();
         }
         kalist.clear();
-        nattSocket.close();
 
         return ret;
     }
@@ -1099,8 +1140,15 @@
      * get leaked after iterations.
      */
     @AppModeFull(reason = "Cannot get WifiManager in instant app mode")
-    public void testSocketKeepaliveLimit() throws Exception {
-        final int supported = getSupportedKeepalivesFromRes();
+    public void testSocketKeepaliveLimitWifi() throws Exception {
+        if (!mPackageManager.hasSystemFeature(FEATURE_WIFI)) {
+            Log.i(TAG, "testSocketKeepaliveLimitWifi cannot execute unless device"
+                    + " supports WiFi");
+            return;
+        }
+
+        final Network network = ensureWifiConnected();
+        final int supported = getSupportedKeepalivesForNet(network);
         if (supported == 0) {
             return;
         }
@@ -1108,25 +1156,25 @@
         adoptShellPermissionIdentity();
 
         // Verifies that the supported keepalive slots meet MIN_SUPPORTED_KEEPALIVE_COUNT.
-        assertGreaterOrEqual(supported, KeepaliveUtils.MIN_SUPPORTED_KEEPALIVE_COUNT);
+        assertGreaterOrEqual(supported, MIN_SUPPORTED_WIFI_KEEPALIVE_COUNT);
 
         // Verifies that Nat-T keepalives can be established.
-        assertEquals(supported, createConcurrentSocketKeepalives(supported + 1, 0));
+        assertEquals(supported, createConcurrentSocketKeepalives(network, supported + 1, 0));
         // Verifies that keepalives don't get leaked in second round.
-        assertEquals(supported, createConcurrentSocketKeepalives(supported + 1, 0));
+        assertEquals(supported, createConcurrentSocketKeepalives(network, supported, 0));
 
         // If kernel < 4.8 then it doesn't support TCP keepalive, but it might still support
         // NAT-T keepalive. Test below cases only if TCP keepalive is supported by kernel.
         if (isTcpKeepaliveSupportedByKernel()) {
-            assertEquals(supported, createConcurrentSocketKeepalives(0, supported + 1));
+            assertEquals(supported, createConcurrentSocketKeepalives(network, 0, supported + 1));
 
             // Verifies that different types can be established at the same time.
-            assertEquals(supported, createConcurrentSocketKeepalives(
+            assertEquals(supported, createConcurrentSocketKeepalives(network,
                     supported / 2, supported - supported / 2));
 
             // Verifies that keepalives don't get leaked in second round.
-            assertEquals(supported, createConcurrentSocketKeepalives(0, supported + 1));
-            assertEquals(supported, createConcurrentSocketKeepalives(
+            assertEquals(supported, createConcurrentSocketKeepalives(network, 0, supported));
+            assertEquals(supported, createConcurrentSocketKeepalives(network,
                     supported / 2, supported - supported / 2));
         }
 
@@ -1134,11 +1182,53 @@
     }
 
     /**
+     * Verifies that the concurrent keepalive slots meet the minimum telephony requirement, and
+     * don't get leaked after iterations.
+     */
+    @AppModeFull(reason = "Cannot request network in instant app mode")
+    public void testSocketKeepaliveLimitTelephony() throws Exception {
+        if (!mPackageManager.hasSystemFeature(FEATURE_TELEPHONY)) {
+            Log.i(TAG, "testSocketKeepaliveLimitTelephony cannot execute unless device"
+                    + " supports telephony");
+            return;
+        }
+
+        final int firstSdk = Build.VERSION.FIRST_SDK_INT;
+        if (firstSdk < Build.VERSION_CODES.Q) {
+            Log.i(TAG, "testSocketKeepaliveLimitTelephony: skip test for devices launching"
+                    + " before Q: " + firstSdk);
+            return;
+        }
+
+        final Network network = mCtsNetUtils.connectToCell();
+        final int supported = getSupportedKeepalivesForNet(network);
+
+        adoptShellPermissionIdentity();
+
+        // Verifies that the supported keepalive slots meet minimum requirement.
+        assertGreaterOrEqual(supported, MIN_SUPPORTED_CELLULAR_KEEPALIVE_COUNT);
+
+        // Verifies that Nat-T keepalives can be established.
+        assertEquals(supported, createConcurrentSocketKeepalives(network, supported + 1, 0));
+        // Verifies that keepalives don't get leaked in second round.
+        assertEquals(supported, createConcurrentSocketKeepalives(network, supported, 0));
+
+        dropShellPermissionIdentity();
+    }
+
+    /**
      * Verifies that the keepalive slots are limited as customized for unprivileged requests.
      */
     @AppModeFull(reason = "Cannot get WifiManager in instant app mode")
     public void testSocketKeepaliveUnprivileged() throws Exception {
-        final int supported = getSupportedKeepalivesFromRes();
+        if (!mPackageManager.hasSystemFeature(FEATURE_WIFI)) {
+            Log.i(TAG, "testSocketKeepaliveUnprivileged cannot execute unless device"
+                    + " supports WiFi");
+            return;
+        }
+
+        final Network network = ensureWifiConnected();
+        final int supported = getSupportedKeepalivesForNet(network);
         if (supported == 0) {
             return;
         }
@@ -1154,7 +1244,8 @@
         assertGreaterOrEqual(supported, allowedUnprivilegedPerUid);
         final int expectedUnprivileged =
                 Math.min(allowedUnprivilegedPerUid, supported - reservedPrivilegedSlots);
-        assertEquals(expectedUnprivileged, createConcurrentSocketKeepalives(supported + 1, 0));
+        assertEquals(expectedUnprivileged,
+                createConcurrentSocketKeepalives(network, supported + 1, 0));
     }
 
     private static void assertGreaterOrEqual(long greater, long lesser) {
diff --git a/tests/tests/permission2/src/android/permission2/cts/RestrictedPermissionsTest.java b/tests/tests/permission2/src/android/permission2/cts/RestrictedPermissionsTest.java
index 78d2e08..e06bfbd 100644
--- a/tests/tests/permission2/src/android/permission2/cts/RestrictedPermissionsTest.java
+++ b/tests/tests/permission2/src/android/permission2/cts/RestrictedPermissionsTest.java
@@ -275,7 +275,7 @@
                 null);
 
         // All restricted permission should be whitelisted.
-        assertAllRestrictedPermissionWhitelisted();
+        eventually(this::assertAllRestrictedPermissionWhitelisted);
 
         // Some restricted permission should be granted.
         assertAllRestrictedPermissionGranted();
@@ -597,14 +597,52 @@
 
     @Test
     @AppModeFull
-    public void onSideLoadAllRestrictedPermissionsWhitelisted() throws Exception {
-        installRestrictedPermissionUserApp();
+    public void onSideLoadRestrictedPermissionsWhitelistingDefault() throws Exception {
+        installRestrictedPermissionUserApp(new SessionParams(SessionParams.MODE_FULL_INSTALL));
 
-        // All restricted permissions whitelisted on side-load.
-        assertAllRestrictedPermissionWhitelisted();
+        // All restricted permissions whitelisted on side-load by default
+        eventually(this::assertAllRestrictedPermissionWhitelisted);
     }
 
-    private static void installRestrictedPermissionUserApp() throws Exception {
+    @Test
+    @AppModeFull
+    public void onSideLoadAllRestrictedPermissionsWhitelisted() throws Exception {
+        SessionParams params = new SessionParams(SessionParams.MODE_FULL_INSTALL);
+        params.setWhitelistedRestrictedPermissions(SessionParams.RESTRICTED_PERMISSIONS_ALL);
+
+        installRestrictedPermissionUserApp(params);
+
+        eventually(this::assertAllRestrictedPermissionWhitelisted);
+    }
+
+    @Test
+    @AppModeFull
+    public void onSideLoadWhitelistSomePermissions() throws Exception {
+        Set<String> whitelistedPermissions = new ArraySet<>();
+        whitelistedPermissions.add(Manifest.permission.SEND_SMS);
+        whitelistedPermissions.add(Manifest.permission.READ_CALL_LOG);
+
+        SessionParams params = new SessionParams(SessionParams.MODE_FULL_INSTALL);
+        params.setWhitelistedRestrictedPermissions(whitelistedPermissions);
+
+        installRestrictedPermissionUserApp(params);
+
+        eventually(() -> assertRestrictedPermissionWhitelisted(whitelistedPermissions));
+    }
+
+    @Test
+    @AppModeFull
+    public void onSideLoadWhitelistNoPermissions() throws Exception {
+        SessionParams params = new SessionParams(SessionParams.MODE_FULL_INSTALL);
+        params.setWhitelistedRestrictedPermissions(Collections.emptySet());
+
+        installRestrictedPermissionUserApp(params);
+
+        eventually(this::assertNoRestrictedPermissionWhitelisted);
+    }
+
+    private static void installRestrictedPermissionUserApp(@NonNull SessionParams params)
+            throws Exception {
         final CountDownLatch installLatch = new CountDownLatch(1);
 
         // Create an install result receiver.
@@ -627,8 +665,6 @@
             // Create a session.
             final PackageInstaller packageInstaller = getContext()
                     .getPackageManager().getPackageInstaller();
-            final SessionParams params = new SessionParams(
-                    SessionParams.MODE_FULL_INSTALL);
             final int sessionId = packageInstaller.createSession(params);
             final Session session = packageInstaller.openSession(sessionId);
 
@@ -862,8 +898,8 @@
                         | PackageManager.FLAG_PERMISSION_WHITELIST_UPGRADE);
 
             assertThat(whitelistedPermissions).isNotNull();
-            assertThat(whitelistedPermissions).containsExactlyElementsIn(
-                    expectedWhitelistedPermissions);
+            assertThat(whitelistedPermissions).named("Whitelisted permissions")
+                    .containsExactlyElementsIn(expectedWhitelistedPermissions);
 
             // Also assert that apps ops are properly set
             for (String permission : getRestrictedPermissionsOfApp()) {
@@ -1019,6 +1055,17 @@
                         getContext().getUser());
             }
         });
+
+        // Mark all permissions as reviewed as for pre-22 apps the restriction state might not be
+        // applied until reviewed
+        runWithShellPermissionIdentity(() -> {
+            final PackageManager packageManager = getContext().getPackageManager();
+            for (String permission : getRestrictedPermissionsOfApp()) {
+                packageManager.updatePermissionFlags(permission, PKG,
+                        PackageManager.FLAG_PERMISSION_REVIEW_REQUIRED, 0,
+                        getContext().getUser());
+            }
+        });
     }
 
     @After
diff --git a/tests/tests/security/src/android/security/cts/StagefrightTest.java b/tests/tests/security/src/android/security/cts/StagefrightTest.java
index a39941c..50f7a2f 100644
--- a/tests/tests/security/src/android/security/cts/StagefrightTest.java
+++ b/tests/tests/security/src/android/security/cts/StagefrightTest.java
@@ -1192,21 +1192,6 @@
                 // and see if more errors show up.
                 SystemClock.sleep(1000);
             }
-            if (what == MediaPlayer.MEDIA_ERROR_SERVER_DIED) {
-                JSONArray crashes = getCrashReport(getName(), 5000);
-                if (crashes == null) {
-                    Log.e(TAG, "Crash results not found for test " + getName());
-                    return what;
-                } else if (CrashUtils.detectCrash(validProcessNames, true, crashes)) {
-                    return what;
-                } else {
-                    Log.i(TAG, "Crash ignored due to no security crash found for test " +
-                        getName());
-                    // 0 is the code for no error.
-                    return 0;
-                }
-
-            }
             return what;
         }
 
diff --git a/tests/tests/uirendering/src/android/uirendering/cts/testclasses/ViewAnimationUtilsTests.java b/tests/tests/uirendering/src/android/uirendering/cts/testclasses/ViewAnimationUtilsTests.java
index 90fc1dd..fd65c97 100644
--- a/tests/tests/uirendering/src/android/uirendering/cts/testclasses/ViewAnimationUtilsTests.java
+++ b/tests/tests/uirendering/src/android/uirendering/cts/testclasses/ViewAnimationUtilsTests.java
@@ -41,6 +41,6 @@
                             .start();
                 }, true)
                 .runWithVerifier(new GoldenImageVerifier(getActivity(),
-                        R.drawable.golden_blue_circle, new MSSIMComparer(0.99)));
+                        R.drawable.golden_blue_circle, new MSSIMComparer(0.85)));
     }
 }
diff --git a/tests/tests/widget/src/android/widget/cts/AutoCompleteTextViewTest.java b/tests/tests/widget/src/android/widget/cts/AutoCompleteTextViewTest.java
index 529582a..0f65c88 100644
--- a/tests/tests/widget/src/android/widget/cts/AutoCompleteTextViewTest.java
+++ b/tests/tests/widget/src/android/widget/cts/AutoCompleteTextViewTest.java
@@ -443,14 +443,23 @@
             mAutoCompleteTextView.refreshAutoCompleteResults();
         });
 
-        assertThat(getAutoCompleteSuggestions()).containsExactly("testTwo");
+        PollingCheck.waitFor(() -> {
+            List<Object> autoCompleteSuggestions = getAutoCompleteSuggestions();
+            return (autoCompleteSuggestions.size() == 1)
+                    && autoCompleteSuggestions.contains("testTwo");
+        });
 
         WidgetTestUtils.runOnMainAndDrawSync(mActivityRule, mAutoCompleteTextView, () -> {
             mAdapter.add("testThree");
             mAutoCompleteTextView.refreshAutoCompleteResults();
         });
 
-        assertThat(getAutoCompleteSuggestions()).containsExactly("testTwo", "testThree");
+        PollingCheck.waitFor(() -> {
+            List<Object> autoCompleteSuggestions = getAutoCompleteSuggestions();
+            return (autoCompleteSuggestions.size() == 2)
+                    && autoCompleteSuggestions.contains("testTwo")
+                    && autoCompleteSuggestions.contains("testThree");
+        });
     }
 
     @Test
diff --git a/tests/tests/widget/src/android/widget/cts/SpinnerTest.java b/tests/tests/widget/src/android/widget/cts/SpinnerTest.java
index 404605e..3c4192c 100644
--- a/tests/tests/widget/src/android/widget/cts/SpinnerTest.java
+++ b/tests/tests/widget/src/android/widget/cts/SpinnerTest.java
@@ -414,7 +414,9 @@
                         mActivity.getDrawable(R.drawable.yellow_fill)));
 
         // Use instrumentation to emulate a tap on the spinner to bring down its popup
-        CtsTouchUtils.emulateTapOnViewCenter(mInstrumentation, mActivityRule, mSpinnerDropdownMode);
+        WidgetTestUtils.runOnMainAndDrawSync(mActivityRule, mSpinnerDropdownMode, () -> {
+            mSpinnerDropdownMode.performClick();
+        });
         // Verify that we're showing the popup
         PollingCheck.waitFor(() -> mSpinnerDropdownMode.isPopupShowing());
         // And test its fill
