diff --git a/PREUPLOAD.cfg b/PREUPLOAD.cfg
index d32ebc0..247e4ea 100644
--- a/PREUPLOAD.cfg
+++ b/PREUPLOAD.cfg
@@ -24,3 +24,5 @@
                       tests/tests/view/
                       tests/tests/widget/
                       common/device-side/util/
+
+ktlint_hook = ${REPO_ROOT}/prebuilts/ktlint/ktlint.py -f ${PREUPLOAD_FILES}
diff --git a/tests/AlarmManager/AndroidTest.xml b/tests/AlarmManager/AndroidTest.xml
index a8c8955..f44ae93 100644
--- a/tests/AlarmManager/AndroidTest.xml
+++ b/tests/AlarmManager/AndroidTest.xml
@@ -17,6 +17,8 @@
 <configuration description="Config for CTS Alarm Manager test cases">
     <option name="test-suite-tag" value="cts" />
     <option name="config-descriptor:metadata" key="component" value="framework" />
+    <option name="config-descriptor:metadata" key="parameter" value="not_multi_abi" />
+    <option name="config-descriptor:metadata" key="parameter" value="instant_app" />
 
     <target_preparer class="com.android.tradefed.targetprep.suite.SuiteApkInstaller">
         <option name="cleanup-apks" value="true" />
diff --git a/tests/AlarmManager/src/android/alarmmanager/cts/AppStandbyTests.java b/tests/AlarmManager/src/android/alarmmanager/cts/AppStandbyTests.java
index ecd9792..e528968 100644
--- a/tests/AlarmManager/src/android/alarmmanager/cts/AppStandbyTests.java
+++ b/tests/AlarmManager/src/android/alarmmanager/cts/AppStandbyTests.java
@@ -32,6 +32,7 @@
 import android.content.IntentFilter;
 import android.os.BatteryManager;
 import android.os.SystemClock;
+import android.platform.test.annotations.AppModeFull;
 import android.support.test.InstrumentationRegistry;
 import android.support.test.filters.LargeTest;
 import android.support.test.runner.AndroidJUnit4;
@@ -54,6 +55,7 @@
 /**
  * Tests that app standby imposes the appropriate restrictions on alarms
  */
+@AppModeFull
 @LargeTest
 @RunWith(AndroidJUnit4.class)
 public class AppStandbyTests {
diff --git a/tests/AlarmManager/src/android/alarmmanager/cts/BackgroundRestrictedAlarmsTest.java b/tests/AlarmManager/src/android/alarmmanager/cts/BackgroundRestrictedAlarmsTest.java
index f36b07f..524508c 100644
--- a/tests/AlarmManager/src/android/alarmmanager/cts/BackgroundRestrictedAlarmsTest.java
+++ b/tests/AlarmManager/src/android/alarmmanager/cts/BackgroundRestrictedAlarmsTest.java
@@ -19,8 +19,8 @@
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
 
-import android.alarmmanager.alarmtestapp.cts.TestAlarmScheduler;
 import android.alarmmanager.alarmtestapp.cts.TestAlarmReceiver;
+import android.alarmmanager.alarmtestapp.cts.TestAlarmScheduler;
 import android.app.AlarmManager;
 import android.content.BroadcastReceiver;
 import android.content.ComponentName;
@@ -28,6 +28,7 @@
 import android.content.Intent;
 import android.content.IntentFilter;
 import android.os.SystemClock;
+import android.platform.test.annotations.AppModeFull;
 import android.support.test.InstrumentationRegistry;
 import android.support.test.filters.LargeTest;
 import android.support.test.runner.AndroidJUnit4;
@@ -45,6 +46,7 @@
  * Tests that apps put in forced app standby by the user do not get to run alarms while in the
  * background
  */
+@AppModeFull
 @LargeTest
 @RunWith(AndroidJUnit4.class)
 public class BackgroundRestrictedAlarmsTest {
diff --git a/tests/AlarmManager/src/android/alarmmanager/cts/InstantAppsTests.java b/tests/AlarmManager/src/android/alarmmanager/cts/InstantAppsTests.java
new file mode 100644
index 0000000..959df85
--- /dev/null
+++ b/tests/AlarmManager/src/android/alarmmanager/cts/InstantAppsTests.java
@@ -0,0 +1,89 @@
+/*
+ * 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.alarmmanager.cts;
+
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assume.assumeTrue;
+
+import android.app.AlarmManager;
+import android.content.Context;
+import android.os.SystemClock;
+import android.platform.test.annotations.AppModeInstant;
+import android.support.test.InstrumentationRegistry;
+import android.support.test.runner.AndroidJUnit4;
+
+import com.android.compatibility.common.util.SystemUtil;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * Tests that alarm manager works as expected with instant apps
+ */
+@AppModeInstant
+@RunWith(AndroidJUnit4.class)
+public class InstantAppsTests {
+    private static final String TAG = "AlarmManagerInstantTests";
+
+    private AlarmManager mAlarmManager;
+    private Context mContext;
+
+    @Before
+    public void setUp() {
+        mContext = InstrumentationRegistry.getTargetContext();
+        mAlarmManager = mContext.getSystemService(AlarmManager.class);
+        assumeTrue(mContext.getPackageManager().isInstantApp());
+        updateAlarmManagerSettings();
+    }
+
+    @Test
+    public void elapsedRealtimeAlarm() throws Exception {
+        final long futurity = 2500;
+        final long triggerElapsed = SystemClock.elapsedRealtime() + futurity;
+        final CountDownLatch latch = new CountDownLatch(1);
+        mAlarmManager.setExact(AlarmManager.ELAPSED_REALTIME, triggerElapsed, TAG,
+                () -> latch.countDown(), null);
+        Thread.sleep(futurity);
+        assertTrue("Alarm did not fire as expected", latch.await(500, TimeUnit.MILLISECONDS));
+    }
+
+    @Test
+    public void rtcAlarm() throws Exception {
+        final long futurity = 2500;
+        final long triggerRtc = System.currentTimeMillis() + futurity;
+        final CountDownLatch latch = new CountDownLatch(1);
+        mAlarmManager.setExact(AlarmManager.RTC, triggerRtc, TAG, () -> latch.countDown(), null);
+        Thread.sleep(futurity);
+        assertTrue("Alarm did not fire as expected", latch.await(500, TimeUnit.MILLISECONDS));
+    }
+
+    @After
+    public void deleteAlarmManagerSettings() {
+        SystemUtil.runShellCommand("settings delete global alarm_manager_constants");
+    }
+
+    private void updateAlarmManagerSettings() {
+        final StringBuffer cmd = new StringBuffer("settings put global alarm_manager_constants ");
+        cmd.append("min_futurity=0");
+        SystemUtil.runShellCommand(cmd.toString());
+    }
+}
diff --git a/tests/app/src/android/app/cts/AdjustmentTest.java b/tests/app/src/android/app/cts/AdjustmentTest.java
new file mode 100644
index 0000000..8d65d3d
--- /dev/null
+++ b/tests/app/src/android/app/cts/AdjustmentTest.java
@@ -0,0 +1,85 @@
+/*
+ * 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.app.cts;
+
+
+import android.os.Bundle;
+import android.os.Parcel;
+import android.service.notification.Adjustment;
+import android.test.AndroidTestCase;
+import android.util.Log;
+
+public class AdjustmentTest extends AndroidTestCase {
+    private static final String ADJ_PACKAGE = "com.foo.bar";
+    private static final String ADJ_KEY = "foo_key";
+    private static final String ADJ_EXPLANATION = "I just feel like adjusting this";
+    private static final int ADJ_USER = 47;
+
+    private final Bundle mSignals = new Bundle();
+
+    private Adjustment mAdjustment;
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+
+        mSignals.putString("foobar", "Hello, world!");
+        mSignals.putInt("chirp", 47);
+        mAdjustment = new Adjustment(ADJ_PACKAGE, ADJ_KEY, mSignals, ADJ_EXPLANATION, ADJ_USER);
+    }
+
+    public void testGetPackage() {
+        assertEquals(ADJ_PACKAGE, mAdjustment.getPackage());
+    }
+
+    public void testGetKey() {
+        assertEquals(ADJ_KEY, mAdjustment.getKey());
+    }
+
+    public void testGetExplanation() {
+        assertEquals(ADJ_EXPLANATION, mAdjustment.getExplanation());
+    }
+
+    public void testGetUser() {
+        assertEquals(ADJ_USER, mAdjustment.getUser());
+    }
+
+    public void testGetSignals() {
+        assertEquals(mSignals, mAdjustment.getSignals());
+        assertEquals("Hello, world!", mAdjustment.getSignals().getString("foobar"));
+        assertEquals(47, mAdjustment.getSignals().getInt("chirp"));
+    }
+
+    public void testDescribeContents() {
+        assertEquals(0, mAdjustment.describeContents());
+    }
+
+    public void testParcelling() {
+        final Parcel outParcel = Parcel.obtain();
+        mAdjustment.writeToParcel(outParcel, 0);
+        outParcel.setDataPosition(0);
+        final Adjustment unparceled = Adjustment.CREATOR.createFromParcel(outParcel);
+
+        assertEquals(mAdjustment.getPackage(), unparceled.getPackage());
+        assertEquals(mAdjustment.getKey(), unparceled.getKey());
+        assertEquals(mAdjustment.getExplanation(), unparceled.getExplanation());
+        assertEquals(mAdjustment.getUser(), unparceled.getUser());
+
+        assertEquals("Hello, world!", unparceled.getSignals().getString("foobar"));
+        assertEquals(47, unparceled.getSignals().getInt("chirp"));
+    }
+}
diff --git a/tests/app/src/android/app/cts/NotificationCarExtenderTest.java b/tests/app/src/android/app/cts/NotificationCarExtenderTest.java
new file mode 100644
index 0000000..20bf336
--- /dev/null
+++ b/tests/app/src/android/app/cts/NotificationCarExtenderTest.java
@@ -0,0 +1,138 @@
+ /*
+ * 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.app.cts;
+
+import android.app.Notification;
+import android.app.Notification.CarExtender;
+import android.app.Notification.CarExtender.Builder;
+import android.app.Notification.CarExtender.UnreadConversation;
+import android.app.PendingIntent;
+import android.app.RemoteInput;
+import android.content.Context;
+import android.content.Intent;
+import android.graphics.Bitmap;
+import android.graphics.Bitmap.Config;
+import android.test.AndroidTestCase;
+
+public class NotificationCarExtenderTest extends AndroidTestCase {
+
+    private Context mContext;
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+        mContext = getContext();
+    }
+
+    public void testCarExtender_EmptyConstructor() {
+        CarExtender extender = new Notification.CarExtender();
+        assertNotNull(extender);
+        assertEquals(Notification.COLOR_DEFAULT, extender.getColor());
+        assertEquals(null, extender.getLargeIcon());
+        assertEquals(null, extender.getUnreadConversation());
+    }
+
+    public void testCarExtender_Constructor() {
+        Notification notification = new Notification();
+        CarExtender extender = new Notification.CarExtender(notification);
+        assertNotNull(extender);
+        assertEquals(Notification.COLOR_DEFAULT, extender.getColor());
+        assertEquals(null, extender.getLargeIcon());
+        assertEquals(null, extender.getUnreadConversation());
+    }
+
+    public void testCarExtender() {
+        final int testColor = 11;
+        final Bitmap testIcon = Bitmap.createBitmap(100, 100, Config.ARGB_8888);
+        final UnreadConversation testConversation =
+            new Builder("testParticipant")
+                .addMessage("testMessage")
+                .setLatestTimestamp(System.currentTimeMillis())
+                .build();
+
+        CarExtender extender = new Notification.CarExtender()
+            .setColor(testColor)
+            .setLargeIcon(testIcon)
+            .setUnreadConversation(testConversation);
+
+        assertEquals(testColor, extender.getColor());
+        assertEquals(testIcon, extender.getLargeIcon());
+        assertEquals(testConversation, extender.getUnreadConversation());
+    }
+
+    public void testCarExtender_extend() {
+        final int testColor = 11;
+        final Bitmap testIcon = Bitmap.createBitmap(100, 100, Config.ARGB_8888);
+        final UnreadConversation testConversation =
+            new Builder("testParticipant")
+                .addMessage("testMessage")
+                .setLatestTimestamp(System.currentTimeMillis())
+                .build();
+        Notification.Builder notifBuilder = new Notification.Builder(mContext, "test id")
+            .setSmallIcon(1);
+        CarExtender extender = new Notification.CarExtender()
+            .setColor(testColor)
+            .setLargeIcon(testIcon)
+            .setUnreadConversation(testConversation);
+
+        extender.extend(notifBuilder);
+
+        Notification notification = notifBuilder.build();
+
+        CarExtender receiveCarExtender = new CarExtender(notification);
+
+        assertNotNull(receiveCarExtender);
+        assertEquals(testColor, receiveCarExtender.getColor());
+        assertEquals(testIcon, receiveCarExtender.getLargeIcon());
+        assertEquals(1, receiveCarExtender.getUnreadConversation().getMessages().length);
+        assertEquals(testConversation.getMessages().length,
+            receiveCarExtender.getUnreadConversation().getMessages().length);
+        assertEquals(testConversation.getMessages()[0],
+            receiveCarExtender.getUnreadConversation().getMessages()[0]);
+    }
+
+    public void testCarExtender_UnreadConversationAndBuilder() {
+        final long testTime = System.currentTimeMillis();
+        final String testMessage = "testMessage";
+        final String testParticipant = "testParticipant";
+        final Intent testIntent = new Intent("testIntent");
+        final PendingIntent testPendingIntent =
+            PendingIntent.getBroadcast(mContext, 0, testIntent,
+            PendingIntent.FLAG_CANCEL_CURRENT);
+        final PendingIntent testReplyPendingIntent =
+            PendingIntent.getBroadcast(mContext, 0, testIntent,
+                PendingIntent.FLAG_UPDATE_CURRENT);
+        final RemoteInput testRemoteInput = new RemoteInput.Builder("key").build();
+
+        final UnreadConversation testConversation =
+            new Builder(testParticipant)
+                .setLatestTimestamp(testTime)
+                .addMessage(testMessage)
+                .setReadPendingIntent(testPendingIntent)
+                .setReplyAction(testReplyPendingIntent, testRemoteInput)
+                .build();
+
+        assertEquals(testTime, testConversation.getLatestTimestamp());
+        assertEquals(1, testConversation.getMessages().length);
+        assertEquals(testMessage, testConversation.getMessages()[0]);
+        assertEquals(testParticipant, testConversation.getParticipant());
+        assertEquals(1, testConversation.getParticipants().length);
+        assertEquals(testParticipant, testConversation.getParticipants()[0]);
+        assertEquals(testPendingIntent, testConversation.getReadPendingIntent());
+        assertEquals(testRemoteInput, testConversation.getRemoteInput());
+        assertEquals(testPendingIntent, testConversation.getReplyPendingIntent());
+    }
+}
diff --git a/tests/autofillservice/src/android/autofillservice/cts/AutoFillServiceTestCase.java b/tests/autofillservice/src/android/autofillservice/cts/AutoFillServiceTestCase.java
index 6997453..40d1e4e 100644
--- a/tests/autofillservice/src/android/autofillservice/cts/AutoFillServiceTestCase.java
+++ b/tests/autofillservice/src/android/autofillservice/cts/AutoFillServiceTestCase.java
@@ -19,7 +19,6 @@
 import static android.autofillservice.cts.Helper.getContext;
 import static android.autofillservice.cts.InstrumentedAutoFillService.SERVICE_NAME;
 import static android.content.Context.CLIPBOARD_SERVICE;
-import static android.provider.Settings.Global.AUTOFILL_SMART_SUGGESTION_EMULATION_FLAGS;
 
 import static com.android.compatibility.common.util.ShellUtils.runShellCommand;
 
@@ -39,9 +38,7 @@
 import com.android.compatibility.common.util.RequiredFeatureRule;
 import com.android.compatibility.common.util.RetryRule;
 import com.android.compatibility.common.util.SafeCleanerRule;
-import com.android.compatibility.common.util.SettingsStateChangerRule;
 import com.android.compatibility.common.util.SettingsStateKeeperRule;
-import com.android.compatibility.common.util.SettingsUtils;
 import com.android.compatibility.common.util.TestNameUtils;
 
 import org.junit.Before;
@@ -205,10 +202,11 @@
                 // mRetryRule should be closest to the main test as possible
                 .around(mRetryRule)
                 //
-                // Augmented Autofill should be disabled by default
-                .around(new SettingsStateChangerRule(sContext, SettingsUtils.NAMESPACE_GLOBAL,
-                        AUTOFILL_SMART_SUGGESTION_EMULATION_FLAGS,
-                        Integer.toString(getSmartSuggestionMode())))
+                // TODO(b/124006095): must use DeviceConfig rule
+//                // Augmented Autofill should be disabled by default
+//                .around(new SettingsStateChangerRule(sContext, SettingsUtils.NAMESPACE_GLOBAL,
+//                        AUTOFILL_SMART_SUGGESTION_EMULATION_FLAGS,
+//                        Integer.toString(getSmartSuggestionMode())))
                 //
                 // Finally, let subclasses add their own rules (like ActivityTestRule)
                 .around(getMainTestRule());
diff --git a/tests/tests/role/CtsRoleTestApp/AndroidManifest.xml b/tests/tests/role/CtsRoleTestApp/AndroidManifest.xml
index 03f9513..7f096cc 100644
--- a/tests/tests/role/CtsRoleTestApp/AndroidManifest.xml
+++ b/tests/tests/role/CtsRoleTestApp/AndroidManifest.xml
@@ -38,14 +38,6 @@
                 <data android:scheme="tel" />
             </intent-filter>
         </activity>
-        <service
-            android:name=".DialerInCallService"
-            android:permission="android.permission.BIND_INCALL_SERVICE">
-            <intent-filter>
-                <action android:name="android.telecom.InCallService" />
-            </intent-filter>
-            <meta-data android:name="android.telecom.IN_CALL_SERVICE_UI" android:value="true" />
-        </service>
 
         <!-- Sms -->
         <activity android:name=".SmsSendToActivity">
diff --git a/tests/tests/telephony/current/src/android/telephony/cts/AvailableNetworkInfoTest.java b/tests/tests/telephony/current/src/android/telephony/cts/AvailableNetworkInfoTest.java
new file mode 100644
index 0000000..1af3391
--- /dev/null
+++ b/tests/tests/telephony/current/src/android/telephony/cts/AvailableNetworkInfoTest.java
@@ -0,0 +1,48 @@
+/*
+ * 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.telephony.cts;
+
+import android.os.Parcel;
+import android.telephony.AvailableNetworkInfo;
+import android.test.AndroidTestCase;
+import java.util.ArrayList;
+import java.util.List;
+
+public class AvailableNetworkInfoTest extends AndroidTestCase {
+    private static final String OPERATOR_MCCMNC_1 = "123456";
+    private static final String OPERATOR_MCCMNC_2 = "246135";
+    private static final int SUB_ID = 123;
+
+    public void testAvailableNetworkInfo() {
+        List<String> mccMncs = new ArrayList<String>();
+        mccMncs.add(OPERATOR_MCCMNC_1);
+        mccMncs.add(OPERATOR_MCCMNC_2);
+
+        AvailableNetworkInfo availableNetworkInfo = new AvailableNetworkInfo(SUB_ID,
+                AvailableNetworkInfo.PRIORITY_HIGH, mccMncs);
+        assertEquals(0, availableNetworkInfo.describeContents());
+        assertEquals(SUB_ID, availableNetworkInfo.getSubId());
+        assertEquals(AvailableNetworkInfo.PRIORITY_HIGH, availableNetworkInfo.getPriority());
+        assertEquals(mccMncs, availableNetworkInfo.getMccMncs());
+
+        Parcel availableNetworkInfoParcel = Parcel.obtain();
+        availableNetworkInfo.writeToParcel(availableNetworkInfoParcel, 0);
+        availableNetworkInfoParcel.setDataPosition(0);
+        AvailableNetworkInfo tempAvailableNetworkInfo =
+                AvailableNetworkInfo.CREATOR.createFromParcel(availableNetworkInfoParcel);
+        assertTrue(tempAvailableNetworkInfo.equals(availableNetworkInfo));
+    }
+}
diff --git a/tests/tests/telephony/current/src/android/telephony/cts/TelephonyManagerTest.java b/tests/tests/telephony/current/src/android/telephony/cts/TelephonyManagerTest.java
index 7081b8b..698b885 100644
--- a/tests/tests/telephony/current/src/android/telephony/cts/TelephonyManagerTest.java
+++ b/tests/tests/telephony/current/src/android/telephony/cts/TelephonyManagerTest.java
@@ -39,6 +39,7 @@
 import android.telecom.PhoneAccountHandle;
 import android.telecom.TelecomManager;
 import android.telephony.AccessNetworkConstants;
+import android.telephony.AvailableNetworkInfo;
 import android.telephony.CellLocation;
 import android.telephony.NetworkRegistrationState;
 import android.telephony.PhoneStateListener;
@@ -59,6 +60,7 @@
 import org.junit.Test;
 import org.junit.runner.RunWith;
 
+import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
 import java.util.Map;
@@ -1036,6 +1038,90 @@
         assertThat(raf).isNotEqualTo(TelephonyManager.NETWORK_TYPE_BITMASK_UNKNOWN);
     }
 
+    /**
+     * Tests {@link TelephonyManager#setPreferredOpportunisticDataSubscription} and
+     * {@link TelephonyManager#getPreferredOpportunisticDataSubscription}
+     */
+    @Test
+    public void testPreferredOpportunisticDataSubscription() {
+        int randomSubId = 1;
+        if (!mPackageManager.hasSystemFeature(PackageManager.FEATURE_TELEPHONY)) {
+            return;
+        }
+        int subId =
+            ShellIdentityUtils.invokeMethodWithShellPermissions(mTelephonyManager,
+                (tm) -> tm.getPreferredOpportunisticDataSubscription());
+        assertThat(subId).isEqualTo(SubscriptionManager.DEFAULT_SUBSCRIPTION_ID);
+        List<SubscriptionInfo> subscriptionInfoList =
+                    ShellIdentityUtils.invokeMethodWithShellPermissions(mSubscriptionManager,
+                            (tm) -> tm.getOpportunisticSubscriptions());
+        if (subscriptionInfoList == null || subscriptionInfoList.size() == 0) {
+            boolean res = ShellIdentityUtils.invokeMethodWithShellPermissions(mTelephonyManager,
+                    (tm) -> tm.setPreferredOpportunisticDataSubscription(randomSubId));
+            assertThat(res).isEqualTo(false);
+            subId = ShellIdentityUtils.invokeMethodWithShellPermissions(mTelephonyManager,
+                    (tm) -> tm.getPreferredOpportunisticDataSubscription());
+            assertThat(subId).isEqualTo(SubscriptionManager.DEFAULT_SUBSCRIPTION_ID);
+
+        } else {
+            boolean res = ShellIdentityUtils.invokeMethodWithShellPermissions(mTelephonyManager,
+                    (tm) -> tm.setPreferredOpportunisticDataSubscription(
+                            subscriptionInfoList.get(0).getSubscriptionId()));
+            assertThat(res).isEqualTo(true);
+            ShellIdentityUtils.invokeMethodWithShellPermissions(mTelephonyManager,
+                (tm) -> tm.getPreferredOpportunisticDataSubscription());
+            assertThat(subId).isEqualTo(subscriptionInfoList.get(0).getSubscriptionId());
+        }
+
+        boolean result = ShellIdentityUtils.invokeMethodWithShellPermissions(mTelephonyManager,
+                (tm) -> tm.setPreferredOpportunisticDataSubscription(
+                        SubscriptionManager.DEFAULT_SUBSCRIPTION_ID));
+        assertThat(result).isEqualTo(true);
+        subId = ShellIdentityUtils.invokeMethodWithShellPermissions(mTelephonyManager,
+            (tm) -> tm.getPreferredOpportunisticDataSubscription());
+        assertThat(subId).isEqualTo(SubscriptionManager.DEFAULT_SUBSCRIPTION_ID);
+    }
+
+    /**
+     * Tests {@link TelephonyManager#updateAvailableNetworks}
+     */
+    @Test
+    public void testUpdateAvailableNetworks() {
+        int randomSubId = 1;
+        if (!mPackageManager.hasSystemFeature(PackageManager.FEATURE_TELEPHONY)) {
+            return;
+        }
+
+        List<SubscriptionInfo> subscriptionInfoList =
+            ShellIdentityUtils.invokeMethodWithShellPermissions(mSubscriptionManager,
+                (tm) -> tm.getOpportunisticSubscriptions());
+        List<String> mccMncs = new ArrayList<String>();
+        List<AvailableNetworkInfo> availableNetworkInfos = new ArrayList<AvailableNetworkInfo>();
+        if (subscriptionInfoList == null || subscriptionInfoList.size() == 0
+                || !mSubscriptionManager.isActiveSubscriptionId(
+                        subscriptionInfoList.get(0).getSubscriptionId())) {
+            AvailableNetworkInfo availableNetworkInfo = new AvailableNetworkInfo(randomSubId,
+                    AvailableNetworkInfo.PRIORITY_HIGH, mccMncs);
+            availableNetworkInfos.add(availableNetworkInfo);
+            boolean res = ShellIdentityUtils.invokeMethodWithShellPermissions(mTelephonyManager,
+                    (tm) -> tm.updateAvailableNetworks(availableNetworkInfos));
+            assertThat(res).isEqualTo(false);
+        } else {
+            AvailableNetworkInfo availableNetworkInfo = new AvailableNetworkInfo(
+                    subscriptionInfoList.get(0).getSubscriptionId(),
+                    AvailableNetworkInfo.PRIORITY_HIGH, mccMncs);
+            availableNetworkInfos.add(availableNetworkInfo);
+            boolean res = ShellIdentityUtils.invokeMethodWithShellPermissions(mTelephonyManager,
+                (tm) -> tm.updateAvailableNetworks(availableNetworkInfos));
+            assertThat(res).isEqualTo(true);
+            availableNetworkInfos.clear();
+            res = ShellIdentityUtils.invokeMethodWithShellPermissions(mTelephonyManager,
+                (tm) -> tm.updateAvailableNetworks(availableNetworkInfos));
+            assertThat(res).isEqualTo(true);
+        }
+    }
+
+
     public static void waitForMs(long ms) {
         try {
             Thread.sleep(ms);
diff --git a/tests/tests/view/AndroidManifest.xml b/tests/tests/view/AndroidManifest.xml
index 925f3e2..2c03228 100644
--- a/tests/tests/view/AndroidManifest.xml
+++ b/tests/tests/view/AndroidManifest.xml
@@ -33,7 +33,7 @@
 
         <activity android:name="android.app.Activity"
                   android:label="Empty Activity"
-                  android:theme="@style/ViewStyleTestTheme">
+                  android:theme="@style/ViewAttributeTestTheme">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN"/>
                 <category android:name="android.intent.category.FRAMEWORK_INSTRUMENTATION_TEST" />
diff --git a/tests/tests/view/res/layout/view_style_layout.xml b/tests/tests/view/res/layout/view_attribute_layout.xml
similarity index 100%
rename from tests/tests/view/res/layout/view_style_layout.xml
rename to tests/tests/view/res/layout/view_attribute_layout.xml
diff --git a/tests/tests/view/res/values/styles.xml b/tests/tests/view/res/values/styles.xml
index ab984e8..5b832c6 100644
--- a/tests/tests/view/res/values/styles.xml
+++ b/tests/tests/view/res/values/styles.xml
@@ -188,7 +188,7 @@
         <item name="android:windowAnimationStyle">@null</item>
     </style>
 
-    <style name="ViewStyleTestTheme" parent="@android:Theme.Material">
+    <style name="ViewAttributeTestTheme" parent="@android:Theme.Material">
         <item name="android:buttonStyle">@style/MyButtonStyle</item>
     </style>
 
diff --git a/tests/tests/view/src/android/view/cts/ViewStyleTest.java b/tests/tests/view/src/android/view/cts/ViewAttributeTest.java
similarity index 82%
rename from tests/tests/view/src/android/view/cts/ViewStyleTest.java
rename to tests/tests/view/src/android/view/cts/ViewAttributeTest.java
index 866e8b6..02766d9 100644
--- a/tests/tests/view/src/android/view/cts/ViewStyleTest.java
+++ b/tests/tests/view/src/android/view/cts/ViewAttributeTest.java
@@ -42,7 +42,7 @@
 
 @MediumTest
 @RunWith(AndroidJUnit4.class)
-public class ViewStyleTest {
+public class ViewAttributeTest {
 
     @Rule
     public ActivityTestRule<Activity> mActivityRule =
@@ -72,7 +72,8 @@
     public void testGetExplicitStyle() {
         Context context = InstrumentationRegistry.getTargetContext();
         LayoutInflater inflater = LayoutInflater.from(context);
-        LinearLayout rootView = (LinearLayout) inflater.inflate(R.layout.view_style_layout, null);
+        LinearLayout rootView =
+                (LinearLayout) inflater.inflate(R.layout.view_attribute_layout, null);
         View view1 = rootView.findViewById(R.id.view1);
         assertEquals(R.style.ExplicitStyle1, view1.getExplicitStyle());
 
@@ -89,12 +90,17 @@
     @Test
     public void testGetAttributeResolutionStack() {
         LayoutInflater inflater = LayoutInflater.from(mActivityRule.getActivity());
-        LinearLayout rootView = (LinearLayout) inflater.inflate(R.layout.view_style_layout, null);
+        LinearLayout rootView =
+                (LinearLayout) inflater.inflate(R.layout.view_attribute_layout, null);
+        List<Integer> stackRootView = rootView.getAttributeResolutionStack();
+        assertEquals(1, stackRootView.size());
+        assertEquals(R.layout.view_attribute_layout, stackRootView.get(0).intValue());
+
         // View that has an explicit style ExplicitStyle1 set via style = ...
         View view1 = rootView.findViewById(R.id.view1);
         List<Integer> stackView1 = view1.getAttributeResolutionStack();
         assertEquals(3, stackView1.size());
-        assertEquals(R.layout.view_style_layout, stackView1.get(0).intValue());
+        assertEquals(R.layout.view_attribute_layout, stackView1.get(0).intValue());
         assertEquals(R.style.ExplicitStyle1, stackView1.get(1).intValue());
         assertEquals(R.style.ParentOfExplicitStyle1, stackView1.get(2).intValue());
 
@@ -103,7 +109,7 @@
         Button button1 = rootView.findViewById(R.id.button1);
         List<Integer> stackButton1 = button1.getAttributeResolutionStack();
         assertEquals(3, stackButton1.size());
-        assertEquals(R.layout.view_style_layout, stackButton1.get(0).intValue());
+        assertEquals(R.layout.view_attribute_layout, stackButton1.get(0).intValue());
         assertEquals(R.style.MyButtonStyle, stackButton1.get(1).intValue());
         assertEquals(R.style.MyButtonStyleParent, stackButton1.get(2).intValue());
 
@@ -112,7 +118,7 @@
         Button button2 = rootView.findViewById(R.id.button2);
         List<Integer> stackButton2 = button2.getAttributeResolutionStack();
         assertEquals(5, stackButton2.size());
-        assertEquals(R.layout.view_style_layout, stackButton2.get(0).intValue());
+        assertEquals(R.layout.view_attribute_layout, stackButton2.get(0).intValue());
         assertEquals(R.style.ExplicitStyle1, stackButton2.get(1).intValue());
         assertEquals(R.style.ParentOfExplicitStyle1, stackButton2.get(2).intValue());
         assertEquals(R.style.MyButtonStyle, stackButton2.get(3).intValue());
@@ -122,16 +128,20 @@
     @Test
     public void testGetAttributeSourceResourceMap() {
         LayoutInflater inflater = LayoutInflater.from(mActivityRule.getActivity());
-        LinearLayout rootView = (LinearLayout) inflater.inflate(R.layout.view_style_layout, null);
+        LinearLayout rootView =
+                (LinearLayout) inflater.inflate(R.layout.view_attribute_layout, null);
+        Map<Integer, Integer> attributeMapRootView = rootView.getAttributeSourceResourceMap();
+        assertEquals(R.layout.view_attribute_layout,
+                (attributeMapRootView.get(android.R.attr.orientation)).intValue());
+
         // View that has an explicit style ExplicitStyle1 set via style = ...
         View view1 = rootView.findViewById(R.id.view1);
         Map<Integer, Integer> attributeMapView1 = view1.getAttributeSourceResourceMap();
-        assertEquals(9, attributeMapView1.size());
         assertEquals(R.style.ExplicitStyle1,
                 (attributeMapView1.get(android.R.attr.padding)).intValue());
         assertEquals(R.style.ParentOfExplicitStyle1,
                 (attributeMapView1.get(android.R.attr.paddingLeft)).intValue());
-        assertEquals(R.layout.view_style_layout,
+        assertEquals(R.layout.view_attribute_layout,
                 (attributeMapView1.get(android.R.attr.paddingTop)).intValue());
     }
 }
diff --git a/tests/tests/widget/AndroidManifest.xml b/tests/tests/widget/AndroidManifest.xml
index e7929e0..df712eb 100644
--- a/tests/tests/widget/AndroidManifest.xml
+++ b/tests/tests/widget/AndroidManifest.xml
@@ -558,6 +558,15 @@
             </intent-filter>
         </activity>
 
+        <activity android:name="android.app.Activity"
+                  android:label="Activity"
+                  android:theme="@style/WidgetAttributeTestTheme">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="android.intent.category.FRAMEWORK_INSTRUMENTATION_TEST" />
+            </intent-filter>
+        </activity>
+
         <activity android:name="android.app.ActivityGroup"
             android:label="ActivityGroup" />
 
diff --git a/tests/tests/widget/res/layout/widget_attribute_layout.xml b/tests/tests/widget/res/layout/widget_attribute_layout.xml
new file mode 100644
index 0000000..f858548
--- /dev/null
+++ b/tests/tests/widget/res/layout/widget_attribute_layout.xml
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  ~ 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
+  -->
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+              android:orientation="vertical"
+              android:layout_width="match_parent"
+              android:layout_height="match_parent">
+    <ProgressBar
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:id="@+id/progress_bar"
+        android:minWidth="7dp"
+        android:maxWidth="10dp"
+        android:progressTint="#ff00ff"
+        style="@style/ExplicitStyle1" />
+
+    <Switch android:layout_width="match_parent"
+          android:layout_height="match_parent"
+          android:id="@+id/switch_view"
+          android:switchPadding="5dp"
+          style="@style/ExplicitStyle2" />
+
+    <Toolbar android:layout_width="match_parent"
+          android:layout_height="match_parent"
+          android:id="@+id/toolbar_view" />
+
+    <View android:layout_width="match_parent"
+          android:layout_height="match_parent"
+          android:id="@+id/view4"
+          style="?android:attr/textAppearanceLarge"/>
+
+    <Button android:layout_width="match_parent"
+            android:layout_height="match_parent"
+            android:id="@+id/button1" />
+
+    <Button android:layout_width="match_parent"
+            android:layout_height="match_parent"
+            android:id="@+id/button2"
+            style="@style/ExplicitStyle1" />
+</LinearLayout>
\ No newline at end of file
diff --git a/tests/tests/widget/res/values/styles.xml b/tests/tests/widget/res/values/styles.xml
index b35ba64..3966207 100644
--- a/tests/tests/widget/res/values/styles.xml
+++ b/tests/tests/widget/res/values/styles.xml
@@ -416,4 +416,29 @@
     <style name="TextView_FontXmlResource">
         <item name="android:fontFamily">@font/samplexmlfont</item>
     </style>
+
+    <style name="WidgetAttributeTestTheme" parent="@android:Theme.Material">
+        <item name="android:toolbarStyle">@style/MyToolbarStyle</item>
+    </style>
+
+    <style name="MyToolbarStyle" parent="@style/MyToolbarStyleParent">
+        <item name="android:titleMarginEnd">3dp</item>
+    </style>
+
+    <style name="MyToolbarStyleParent">
+        <item name="android:titleMarginStart">6dp</item>
+    </style>
+
+    <style name="ExplicitStyle1" parent="@style/ParentOfExplicitStyle1">
+        <item name="android:padding">1dp</item>
+        <item name="android:progress">5</item>
+        <item name="android:max">50</item>
+    </style>
+
+    <style name="ParentOfExplicitStyle1">
+        <item name="android:paddingLeft">2dp</item>
+        <item name="android:mirrorForRtl">true</item>
+    </style>
+
+    <style name="ExplicitStyle2" />
 </resources>
diff --git a/tests/tests/widget/src/android/widget/cts/WidgetAttributeTest.kt b/tests/tests/widget/src/android/widget/cts/WidgetAttributeTest.kt
new file mode 100644
index 0000000..071a0ae
--- /dev/null
+++ b/tests/tests/widget/src/android/widget/cts/WidgetAttributeTest.kt
@@ -0,0 +1,100 @@
+/*
+ * 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.widget.cts
+
+import android.app.Activity
+import android.support.test.InstrumentationRegistry
+import android.support.test.filters.MediumTest
+import android.support.test.rule.ActivityTestRule
+import android.support.test.runner.AndroidJUnit4
+import android.support.test.uiautomator.UiDevice
+import android.view.LayoutInflater
+import android.widget.LinearLayout
+import android.widget.ProgressBar
+import android.widget.Switch
+import android.widget.Toolbar
+import org.junit.After
+import org.junit.Assert.assertEquals
+import org.junit.Before
+import org.junit.Rule
+import org.junit.Test
+import org.junit.runner.RunWith
+
+@MediumTest
+@RunWith(AndroidJUnit4::class)
+class WidgetAttributeTest {
+    companion object {
+        const val DISABLE_SHELL_COMMAND =
+                "settings delete global debug_view_attributes_application_package"
+        const val ENABLE_SHELL_COMMAND =
+                "settings put global debug_view_attributes_application_package android.widget.cts"
+    }
+
+    @get:Rule
+    val activityRule = ActivityTestRule<Activity>(Activity::class.java, true, false)
+    private lateinit var uiDevice: UiDevice
+
+    @Before
+    fun setUp() {
+        uiDevice = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation())
+        uiDevice.executeShellCommand(ENABLE_SHELL_COMMAND)
+        activityRule.launchActivity(null)
+    }
+
+    @After
+    fun tearDown() {
+        uiDevice.executeShellCommand(DISABLE_SHELL_COMMAND)
+    }
+
+    @Test
+    fun testGetAttributeSourceResourceMap() {
+        val inflater = LayoutInflater.from(activityRule.getActivity())
+        val rootView = inflater.inflate(R.layout.widget_attribute_layout, null) as LinearLayout
+
+        // ProgressBar that has an explicit style ExplicitStyle1 set via style = ...
+        val progressBar = rootView.findViewById<ProgressBar>(R.id.progress_bar)
+        val attributeMapProgressBar = progressBar!!.attributeSourceResourceMap
+        assertEquals(R.layout.widget_attribute_layout,
+                attributeMapProgressBar[android.R.attr.minWidth]!!.toInt())
+        assertEquals(R.layout.widget_attribute_layout,
+                attributeMapProgressBar[android.R.attr.maxWidth]!!.toInt())
+        assertEquals(R.layout.widget_attribute_layout,
+                attributeMapProgressBar[android.R.attr.progressTint]!!.toInt())
+        assertEquals(R.style.ExplicitStyle1,
+                attributeMapProgressBar[android.R.attr.progress]!!.toInt())
+        assertEquals(R.style.ExplicitStyle1,
+                attributeMapProgressBar[android.R.attr.padding]!!.toInt())
+        assertEquals(R.style.ExplicitStyle1,
+                attributeMapProgressBar[android.R.attr.max]!!.toInt())
+        assertEquals(R.style.ParentOfExplicitStyle1,
+                attributeMapProgressBar[android.R.attr.mirrorForRtl]!!.toInt())
+
+        // Switch that has an explicit style ExplicitStyle2 set via style = ...
+        val switch = rootView.findViewById<Switch>(R.id.switch_view)
+        val attributeMapSwitch = switch!!.attributeSourceResourceMap
+        assertEquals(R.layout.widget_attribute_layout,
+                attributeMapSwitch[android.R.attr.switchPadding]!!.toInt())
+
+        // Toolbar that has MyToolbarStyle set via the theme android:toolbarStyle = ...
+        val toolbar = rootView.findViewById<Toolbar>(R.id.toolbar_view)
+        val attributeMapToobar = toolbar!!.attributeSourceResourceMap
+        assertEquals(R.style.MyToolbarStyle,
+                attributeMapToobar[android.R.attr.titleMarginEnd]!!.toInt())
+        assertEquals(R.style.MyToolbarStyleParent,
+                attributeMapToobar[android.R.attr.titleMarginStart]!!.toInt())
+    }
+}
\ No newline at end of file
