Merge "Speed up MockImeSession set-up and tear-down"
diff --git a/build/device_info_package.mk b/build/device_info_package.mk
index 5c290b0..ba4fbb0 100644
--- a/build/device_info_package.mk
+++ b/build/device_info_package.mk
@@ -42,7 +42,7 @@
 endif
 
 ifeq ($(DEVICE_INFO_TARGET_SDK),)
-DEVICE_INFO_TARGET_SDK := 8
+DEVICE_INFO_TARGET_SDK := 17
 endif
 
 # Add the base device info
diff --git a/common/host-side/manifest-generator/tests/src/com/android/compatibility/common/generator/ManifestGeneratorTest.java b/common/host-side/manifest-generator/tests/src/com/android/compatibility/common/generator/ManifestGeneratorTest.java
index aed5926..b68b34c 100644
--- a/common/host-side/manifest-generator/tests/src/com/android/compatibility/common/generator/ManifestGeneratorTest.java
+++ b/common/host-side/manifest-generator/tests/src/com/android/compatibility/common/generator/ManifestGeneratorTest.java
@@ -30,11 +30,11 @@
     private static final String PACKAGE = "test.package";
     private static final String INSTRUMENT = "test.package.TestInstrument";
     private static final String MIN_SDK = "8";
-    private static final String TARGET_SDK = "9";
+    private static final String TARGET_SDK = "17";
     private static final String MANIFEST = "<?xml version='1.0' encoding='UTF-8' standalone='yes' ?>\r\n"
         + "<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\" "
         + "package=\"test.package\">\r\n"
-        + "  <uses-sdk android:minSdkVersion=\"8\" android:targetSdkVersion=\"9\" />\r\n"
+        + "  <uses-sdk android:minSdkVersion=\"8\" android:targetSdkVersion=\"17\" />\r\n"
         + "%s"
         + "  <application>\r\n"
         + "%s"
diff --git a/common/host-side/tradefed/src/com/android/compatibility/common/tradefed/targetprep/MediaPreparer.java b/common/host-side/tradefed/src/com/android/compatibility/common/tradefed/targetprep/MediaPreparer.java
index cc48628..1bcc6f8 100644
--- a/common/host-side/tradefed/src/com/android/compatibility/common/tradefed/targetprep/MediaPreparer.java
+++ b/common/host-side/tradefed/src/com/android/compatibility/common/tradefed/targetprep/MediaPreparer.java
@@ -64,6 +64,10 @@
             description = "Only download media files; do not run instrumentation or copy files")
     protected boolean mMediaDownloadOnly = false;
 
+    @Option(name = "images-only",
+            description = "Only push images files to the device")
+    protected boolean mImagesOnly = false;
+
     /*
      * The pathnames of the device's directories that hold media files for the tests.
      * These depend on the device's mount point, which is retrieved in the MediaPreparer's run
@@ -73,6 +77,7 @@
      */
     protected String mBaseDeviceShortDir;
     protected String mBaseDeviceFullDir;
+    protected String mBaseDeviceImagesDir;
 
     /*
      * Variables set by the MediaPreparerListener during retrieval of maximum media file
@@ -162,18 +167,20 @@
      */
     protected boolean mediaFilesExistOnDevice(ITestDevice device)
             throws DeviceNotAvailableException {
-        for (Resolution resolution : RESOLUTIONS) {
-            if (resolution.width > mMaxRes.width) {
-                break; // no need to check for resolutions greater than this
-            }
-            String deviceShortFilePath = mBaseDeviceShortDir + resolution.toString();
-            String deviceFullFilePath = mBaseDeviceFullDir + resolution.toString();
-            if (!device.doesFileExist(deviceShortFilePath)
-                    || !device.doesFileExist(deviceFullFilePath)) {
-                return false;
+        if (!mImagesOnly) {
+            for (Resolution resolution : RESOLUTIONS) {
+                if (resolution.width > mMaxRes.width) {
+                    break; // no need to check for resolutions greater than this
+                }
+                String deviceShortFilePath = mBaseDeviceShortDir + resolution.toString();
+                String deviceFullFilePath = mBaseDeviceFullDir + resolution.toString();
+                if (!device.doesFileExist(deviceShortFilePath)
+                        || !device.doesFileExist(deviceFullFilePath)) {
+                    return false;
+                }
             }
         }
-        return true;
+        return device.doesFileExist(mBaseDeviceImagesDir);
     }
 
     /*
@@ -237,11 +244,19 @@
      * - are not already present on the device
      * - contain video files of a resolution less than or equal to the device's
      *       max video playback resolution
+     * - contain image files
      *
      * This method is exposed for unit testing.
      */
-    protected void copyMediaFiles(ITestDevice device)
-            throws DeviceNotAvailableException {
+    protected void copyMediaFiles(ITestDevice device) throws DeviceNotAvailableException {
+        if (!mImagesOnly) {
+            copyVideoFiles(device);
+        }
+        copyImagesFiles(device);
+    }
+
+    // copy video files of a resolution <= the device's maximum video playback resolution
+    protected void copyVideoFiles(ITestDevice device) throws DeviceNotAvailableException {
         for (Resolution resolution : RESOLUTIONS) {
             if (resolution.width > mMaxRes.width) {
                 logInfo("Media file copying complete");
@@ -268,11 +283,20 @@
         }
     }
 
+    // copy image files to the device
+    protected void copyImagesFiles(ITestDevice device) throws DeviceNotAvailableException {
+        if (!device.doesFileExist(mBaseDeviceImagesDir)) {
+            logInfo("Copying images files to device");
+            device.pushDir(new File(mLocalMediaPath, "images"), mBaseDeviceImagesDir);
+        }
+    }
+
     // Initialize directory strings where media files live on device
     protected void setMountPoint(ITestDevice device) {
         String mountPoint = device.getMountPoint(IDevice.MNT_EXTERNAL_STORAGE);
         mBaseDeviceShortDir = String.format("%s/test/bbb_short/", mountPoint);
         mBaseDeviceFullDir = String.format("%s/test/bbb_full/", mountPoint);
+        mBaseDeviceImagesDir = String.format("%s/test/images/", mountPoint);
     }
 
     @Override
@@ -285,7 +309,9 @@
         }
         if (!mMediaDownloadOnly) {
             setMountPoint(device);
-            setMaxRes(device, buildInfo);
+            if (!mImagesOnly) {
+                setMaxRes(device, buildInfo); // max resolution only applies to video files
+            }
             if (mediaFilesExistOnDevice(device)) {
                 // if files already on device, do nothing
                 logInfo("Media files found on the device");
diff --git a/common/host-side/tradefed/tests/src/com/android/compatibility/common/tradefed/UnitTests.java b/common/host-side/tradefed/tests/src/com/android/compatibility/common/tradefed/UnitTests.java
index 24bca49..960d788 100644
--- a/common/host-side/tradefed/tests/src/com/android/compatibility/common/tradefed/UnitTests.java
+++ b/common/host-side/tradefed/tests/src/com/android/compatibility/common/tradefed/UnitTests.java
@@ -30,6 +30,7 @@
 import com.android.compatibility.common.tradefed.result.ResultReporterBuildInfoTest;
 import com.android.compatibility.common.tradefed.result.ResultReporterTest;
 import com.android.compatibility.common.tradefed.result.SubPlanHelperTest;
+import com.android.compatibility.common.tradefed.targetprep.MediaPreparerTest;
 import com.android.compatibility.common.tradefed.targetprep.PropertyCheckTest;
 import com.android.compatibility.common.tradefed.targetprep.SettingsPreparerTest;
 import com.android.compatibility.common.tradefed.testtype.CompatibilityTestTest;
@@ -82,6 +83,7 @@
     SubPlanHelperTest.class,
 
     // targetprep
+    MediaPreparerTest.class,
     PropertyCheckTest.class,
     SettingsPreparerTest.class,
 
diff --git a/common/host-side/tradefed/tests/src/com/android/compatibility/common/tradefed/targetprep/MediaPreparerTest.java b/common/host-side/tradefed/tests/src/com/android/compatibility/common/tradefed/targetprep/MediaPreparerTest.java
index 05d328d..015ec2a 100644
--- a/common/host-side/tradefed/tests/src/com/android/compatibility/common/tradefed/targetprep/MediaPreparerTest.java
+++ b/common/host-side/tradefed/tests/src/com/android/compatibility/common/tradefed/targetprep/MediaPreparerTest.java
@@ -55,6 +55,7 @@
         mMediaPreparer.mMaxRes = MediaPreparer.DEFAULT_MAX_RESOLUTION;
         mMediaPreparer.mBaseDeviceShortDir = "/sdcard/test/bbb_short/";
         mMediaPreparer.mBaseDeviceFullDir = "/sdcard/test/bbb_full/";
+        mMediaPreparer.mBaseDeviceImagesDir = "/sdcard/test/images";
         for (MediaPreparer.Resolution resolution : MediaPreparer.RESOLUTIONS) {
             String shortFile = String.format("%s%s", mMediaPreparer.mBaseDeviceShortDir,
                     resolution.toString());
@@ -63,6 +64,8 @@
             EasyMock.expect(mMockDevice.doesFileExist(shortFile)).andReturn(true).once();
             EasyMock.expect(mMockDevice.doesFileExist(fullFile)).andReturn(true).once();
         }
+        EasyMock.expect(mMockDevice.doesFileExist(mMediaPreparer.mBaseDeviceImagesDir))
+                .andReturn(true).anyTimes();
         EasyMock.replay(mMockDevice);
         mMediaPreparer.copyMediaFiles(mMockDevice);
     }
@@ -71,6 +74,7 @@
         mMediaPreparer.mMaxRes = MediaPreparer.DEFAULT_MAX_RESOLUTION;
         mMediaPreparer.mBaseDeviceShortDir = "/sdcard/test/bbb_short/";
         mMediaPreparer.mBaseDeviceFullDir = "/sdcard/test/bbb_full/";
+        mMediaPreparer.mBaseDeviceImagesDir = "/sdcard/test/images";
         for (MediaPreparer.Resolution resolution : MediaPreparer.RESOLUTIONS) {
             String shortFile = String.format("%s%s", mMediaPreparer.mBaseDeviceShortDir,
                     resolution.toString());
@@ -79,6 +83,8 @@
             EasyMock.expect(mMockDevice.doesFileExist(shortFile)).andReturn(true).anyTimes();
             EasyMock.expect(mMockDevice.doesFileExist(fullFile)).andReturn(true).anyTimes();
         }
+        EasyMock.expect(mMockDevice.doesFileExist(mMediaPreparer.mBaseDeviceImagesDir))
+                .andReturn(true).anyTimes();
         EasyMock.replay(mMockDevice);
         assertTrue(mMediaPreparer.mediaFilesExistOnDevice(mMockDevice));
     }
diff --git a/hostsidetests/incident/src/com/android/server/cts/AlarmManagerIncidentTest.java b/hostsidetests/incident/src/com/android/server/cts/AlarmManagerIncidentTest.java
new file mode 100644
index 0000000..a3dc1d6
--- /dev/null
+++ b/hostsidetests/incident/src/com/android/server/cts/AlarmManagerIncidentTest.java
@@ -0,0 +1,205 @@
+/*
+ * Copyright (C) 2016 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;
+
+import com.android.server.AlarmClockMetadataProto;
+import com.android.server.AlarmManagerServiceProto;
+import com.android.server.AlarmProto;
+import com.android.server.BatchProto;
+import com.android.server.BroadcastStatsProto;
+import com.android.server.ConstantsProto;
+import com.android.server.FilterStatsProto;
+import com.android.server.ForceAppStandbyTrackerProto;
+import com.android.server.IdleDispatchEntryProto;
+import com.android.server.InFlightProto;
+import com.android.server.WakeupEventProto;
+import java.util.List;
+
+/**
+ * Test to check that the alarm manager service properly outputs its dump state.
+ */
+public class AlarmManagerIncidentTest extends ProtoDumpTestCase {
+    public void testAlarmManagerServiceDump() throws Exception {
+        final AlarmManagerServiceProto dump =
+                getDump(AlarmManagerServiceProto.parser(), "dumpsys alarm --proto");
+
+        // Times should be positive.
+        assertTrue(0 < dump.getCurrentTime());
+        assertTrue(0 < dump.getElapsedRealtime());
+        assertTrue(0 < dump.getLastTimeChangeClockTime());
+        assertTrue(0 < dump.getLastTimeChangeRealtime());
+
+        // ConstantsProto
+        ConstantsProto settings = dump.getSettings();
+        assertTrue(0 < settings.getMinFuturityDurationMs());
+        assertTrue(0 < settings.getMinIntervalDurationMs());
+        assertTrue(0 < settings.getListenerTimeoutDurationMs());
+        assertTrue(0 < settings.getAllowWhileIdleShortDurationMs());
+        assertTrue(0 < settings.getAllowWhileIdleLongDurationMs());
+        assertTrue(0 < settings.getAllowWhileIdleWhitelistDurationMs());
+
+        // ForceAppStandbyTrackerProto
+        ForceAppStandbyTrackerProto forceAppStandbyTracker = dump.getForceAppStandbyTracker();
+        for (int uid : forceAppStandbyTracker.getForegroundUidsList()) {
+            // 0 is technically a valid UID.
+            assertTrue(0 <= uid);
+        }
+        for (int aid : forceAppStandbyTracker.getPowerSaveWhitelistAppIdsList()) {
+            assertTrue(0 <= aid);
+        }
+        for (int aid : forceAppStandbyTracker.getTempPowerSaveWhitelistAppIdsList()) {
+            assertTrue(0 <= aid);
+        }
+        for (ForceAppStandbyTrackerProto.RunAnyInBackgroundRestrictedPackages r : forceAppStandbyTracker.getRunAnyInBackgroundRestrictedPackagesList()) {
+            assertTrue(0 <= r.getUid());
+        }
+
+        if (!dump.getIsInteractive()) {
+            // These are only valid if is_interactive is false.
+            assertTrue(0 < dump.getTimeSinceNonInteractiveMs());
+            assertTrue(0 < dump.getMaxWakeupDelayMs());
+            assertTrue(0 < dump.getTimeSinceLastDispatchMs());
+            // time_until_next_non_wakeup_delivery_ms could be negative if the delivery time is in the past.
+        }
+
+        assertTrue(0 < dump.getTimeUntilNextNonWakeupAlarmMs());
+        assertTrue(0 < dump.getTimeUntilNextWakeupMs());
+        assertTrue(0 < dump.getTimeSinceLastWakeupMs());
+        assertTrue(0 < dump.getTimeSinceLastWakeupSetMs());
+        assertTrue(0 <= dump.getTimeChangeEventCount());
+
+        for (int aid : dump.getDeviceIdleUserWhitelistAppIdsList()) {
+            assertTrue(0 <= aid);
+        }
+
+        // AlarmClockMetadataProto
+        for (AlarmClockMetadataProto ac : dump.getNextAlarmClockMetadataList()) {
+            assertTrue(0 <= ac.getUser());
+            assertTrue(0 < ac.getTriggerTimeMs());
+        }
+
+        for (BatchProto b : dump.getPendingAlarmBatchesList()) {
+            final long start = b.getStartRealtime();
+            final long end = b.getEndRealtime();
+            assertTrue("Batch start time (" + start+ ") is negative", 0 <= start);
+            assertTrue("Batch end time (" + end + ") is negative", 0 <= end);
+            assertTrue("Batch start time (" + start + ") is after its end time (" + end + ")",
+                start <= end);
+            testAlarmProtoList(b.getAlarmsList());
+        }
+
+        testAlarmProtoList(dump.getPendingUserBlockedBackgroundAlarmsList());
+
+        testAlarmProto(dump.getPendingIdleUntil());
+
+        testAlarmProtoList(dump.getPendingWhileIdleAlarmsList());
+
+        testAlarmProto(dump.getNextWakeFromIdle());
+
+        testAlarmProtoList(dump.getPastDueNonWakeupAlarmsList());
+
+        assertTrue(0 <= dump.getDelayedAlarmCount());
+        assertTrue(0 <= dump.getTotalDelayTimeMs());
+        assertTrue(0 <= dump.getMaxDelayDurationMs());
+        assertTrue(0 <= dump.getMaxNonInteractiveDurationMs());
+
+        assertTrue(0 <= dump.getBroadcastRefCount());
+        assertTrue(0 <= dump.getPendingIntentSendCount());
+        assertTrue(0 <= dump.getPendingIntentFinishCount());
+        assertTrue(0 <= dump.getListenerSendCount());
+        assertTrue(0 <= dump.getListenerFinishCount());
+
+        for (InFlightProto f : dump.getOutstandingDeliveriesList())  {
+            assertTrue(0 <= f.getUid());
+            assertTrue(0 < f.getWhenElapsedMs());
+            testBroadcastStatsProto(f.getBroadcastStats());
+            testFilterStatsProto(f.getFilterStats());
+        }
+
+        long awimds = dump.getAllowWhileIdleMinDurationMs();
+        assertTrue(awimds == settings.getAllowWhileIdleShortDurationMs()
+                || awimds == settings.getAllowWhileIdleLongDurationMs());
+
+        for (AlarmManagerServiceProto.LastAllowWhileIdleDispatch l : dump.getLastAllowWhileIdleDispatchTimesList()) {
+            assertTrue(0 <= l.getUid());
+            assertTrue(0 < l.getTimeMs());
+        }
+
+        for (AlarmManagerServiceProto.TopAlarm ta : dump.getTopAlarmsList()) {
+            assertTrue(0 <= ta.getUid());
+            testFilterStatsProto(ta.getFilter());
+        }
+
+        for (AlarmManagerServiceProto.AlarmStat as : dump.getAlarmStatsList()) {
+            testBroadcastStatsProto(as.getBroadcast());
+            for (FilterStatsProto f : as.getFiltersList()) {
+                testFilterStatsProto(f);
+            }
+        }
+
+        for (IdleDispatchEntryProto id : dump.getAllowWhileIdleDispatchesList()) {
+            assertTrue(0 <= id.getUid());
+            assertTrue(0 <= id.getEntryCreationRealtime());
+            assertTrue(0 <= id.getArgRealtime());
+        }
+
+        for (WakeupEventProto we : dump.getRecentWakeupHistoryList()) {
+            assertTrue(0 <= we.getUid());
+            assertTrue(0 <= we.getWhen());
+        }
+    }
+
+    private void testAlarmProtoList(List<AlarmProto> alarms) throws Exception {
+        for (AlarmProto a : alarms) {
+            testAlarmProto(a);
+        }
+    }
+
+    private void testAlarmProto(AlarmProto alarm) throws Exception {
+        assertNotNull(alarm);
+
+        // alarm.time_until_when_elapsed_ms can be negative if 'when' is in the past.
+        assertTrue(0 <= alarm.getWindowLengthMs());
+        assertTrue(0 <= alarm.getRepeatIntervalMs());
+        assertTrue(0 <= alarm.getCount());
+    }
+
+    private void testBroadcastStatsProto(BroadcastStatsProto broadcast) throws Exception {
+        assertNotNull(broadcast);
+
+        assertTrue(0 <= broadcast.getUid());
+        assertTrue(0 <= broadcast.getTotalFlightDurationMs());
+        assertTrue(0 <= broadcast.getCount());
+        assertTrue(0 <= broadcast.getWakeupCount());
+        assertTrue(0 <= broadcast.getStartTimeRealtime());
+        // Nesting should be non-negative.
+        assertTrue(0 <= broadcast.getNesting());
+    }
+
+    private void testFilterStatsProto(FilterStatsProto filter) throws Exception {
+        assertNotNull(filter);
+
+        assertTrue(0 <= filter.getLastFlightTimeRealtime());
+        assertTrue(0 <= filter.getTotalFlightDurationMs());
+        assertTrue(0 <= filter.getCount());
+        assertTrue(0 <= filter.getWakeupCount());
+        assertTrue(0 <= filter.getStartTimeRealtime());
+        // Nesting should be non-negative.
+        assertTrue(0 <= filter.getNesting());
+    }
+}
+
diff --git a/hostsidetests/inputmethodservice/common/src/android/inputmethodservice/cts/common/DeviceEventConstants.java b/hostsidetests/inputmethodservice/common/src/android/inputmethodservice/cts/common/DeviceEventConstants.java
index 89a21f2..307693a 100644
--- a/hostsidetests/inputmethodservice/common/src/android/inputmethodservice/cts/common/DeviceEventConstants.java
+++ b/hostsidetests/inputmethodservice/common/src/android/inputmethodservice/cts/common/DeviceEventConstants.java
@@ -80,14 +80,7 @@
         /**
          *  Param for {@link DeviceEventType#ON_START_INPUT}. Represents if IME is restarting.
          */
-        ON_START_INPUT_RESTARTING(DeviceEventType.ON_START_INPUT, "onStartInput.restarting"),
-
-        /**
-         *  Param for {@link DeviceEventType#ON_START_INPUT}. Represents if it's backed by a dummy
-         *  {@link android.view.inputmethod.InputConnection}.
-         */
-        ON_START_INPUT_DUMMY_INPUT_CONNECTION(DeviceEventType.ON_START_INPUT,
-                "onStartInput.dummyinputconnection");
+        ON_START_INPUT_RESTARTING(DeviceEventType.ON_START_INPUT, "onStartInput.restarting");
 
         private final DeviceEventType mType;
         private final String mName;
diff --git a/hostsidetests/inputmethodservice/deviceside/devicetest/src/android/inputmethodservice/cts/devicetest/InputMethodServiceDeviceTest.java b/hostsidetests/inputmethodservice/deviceside/devicetest/src/android/inputmethodservice/cts/devicetest/InputMethodServiceDeviceTest.java
index d9593a5..e5613ff 100644
--- a/hostsidetests/inputmethodservice/deviceside/devicetest/src/android/inputmethodservice/cts/devicetest/InputMethodServiceDeviceTest.java
+++ b/hostsidetests/inputmethodservice/deviceside/devicetest/src/android/inputmethodservice/cts/devicetest/InputMethodServiceDeviceTest.java
@@ -18,7 +18,6 @@
 
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertTrue;
 
 import static android.inputmethodservice.cts.DeviceEvent.isFrom;
@@ -73,7 +72,8 @@
 
         pollingCheck(() -> helper.queryAllEvents()
                         .collect(startingFrom(helper.isStartOfTest()))
-                        .anyMatch(isFrom(Ime1Constants.CLASS).and(isType(ON_CREATE))),
+                        .filter(isFrom(Ime1Constants.CLASS).and(isType(ON_CREATE)))
+                        .findAny().isPresent(),
                 TIMEOUT, "CtsInputMethod1.onCreate is called");
 
         final long startActivityTime = SystemClock.uptimeMillis();
@@ -81,7 +81,8 @@
 
         pollingCheck(() -> helper.queryAllEvents()
                         .filter(isNewerThan(startActivityTime))
-                        .anyMatch(isFrom(Ime1Constants.CLASS).and(isType(ON_START_INPUT))),
+                        .filter(isFrom(Ime1Constants.CLASS).and(isType(ON_START_INPUT)))
+                        .findAny().isPresent(),
                 TIMEOUT, "CtsInputMethod1.onStartInput is called");
     }
 
@@ -93,7 +94,8 @@
 
         pollingCheck(() -> helper.queryAllEvents()
                         .collect(startingFrom(helper.isStartOfTest()))
-                        .anyMatch(isFrom(Ime1Constants.CLASS).and(isType(ON_CREATE))),
+                        .filter(isFrom(Ime1Constants.CLASS).and(isType(ON_CREATE)))
+                        .findAny().isPresent(),
                 TIMEOUT, "CtsInputMethod1.onCreate is called");
 
         final long startActivityTime = SystemClock.uptimeMillis();
@@ -101,7 +103,8 @@
 
         pollingCheck(() -> helper.queryAllEvents()
                         .filter(isNewerThan(startActivityTime))
-                        .anyMatch(isFrom(Ime1Constants.CLASS).and(isType(ON_START_INPUT))),
+                        .filter(isFrom(Ime1Constants.CLASS).and(isType(ON_START_INPUT)))
+                        .findAny().isPresent(),
                 TIMEOUT, "CtsInputMethod1.onStartInput is called");
 
         helper.findUiObject(R.id.text_entry).click();
@@ -118,7 +121,8 @@
                 TIMEOUT, "CtsInputMethod2 is current IME");
         pollingCheck(() -> helper.queryAllEvents()
                         .filter(isNewerThan(switchImeTime))
-                        .anyMatch(isFrom(Ime1Constants.CLASS).and(isType(ON_DESTROY))),
+                        .filter(isFrom(Ime1Constants.CLASS).and(isType(ON_DESTROY)))
+                        .findAny().isPresent(),
                 TIMEOUT, "CtsInputMethod1.onDestroy is called");
         pollingCheck(() -> helper.queryAllEvents()
                         .filter(isNewerThan(switchImeTime))
@@ -153,11 +157,13 @@
         helper.findUiObject(R.id.search_view).click();
         pollingCheck(() -> helper.queryAllEvents()
                         .collect(startingFrom(helper.isStartOfTest()))
-                        .anyMatch(isFrom(Ime1Constants.CLASS).and(isType(SHOW_SOFT_INPUT))),
+                        .filter(isFrom(Ime1Constants.CLASS).and(isType(SHOW_SOFT_INPUT)))
+                        .findAny().isPresent(),
                 TIMEOUT, "CtsInputMethod1.showSoftInput is called");
         pollingCheck(() -> helper.queryAllEvents()
                         .collect(startingFrom(helper.isStartOfTest()))
-                        .anyMatch(isFrom(Ime1Constants.CLASS).and(isType(ON_START_INPUT))),
+                        .filter(isFrom(Ime1Constants.CLASS).and(isType(ON_START_INPUT)))
+                        .findAny().isPresent(),
                 TIMEOUT, "CtsInputMethod1.onStartInput is called");
     }
 
@@ -176,11 +182,13 @@
 
         pollingCheck(() -> helper.queryAllEvents()
                         .collect(startingFrom(helper.isStartOfTest()))
-                        .anyMatch(isFrom(Ime1Constants.CLASS).and(isType(ON_FINISH_INPUT))),
+                        .filter(isFrom(Ime1Constants.CLASS).and(isType(ON_FINISH_INPUT)))
+                        .findAny().isPresent(),
                 TIMEOUT, "CtsInputMethod1.onFinishInput is called");
         pollingCheck(() -> helper.queryAllEvents()
                         .collect(startingFrom(helper.isStartOfTest()))
-                        .anyMatch(isFrom(Ime1Constants.CLASS).and(isType(HIDE_SOFT_INPUT))),
+                        .filter(isFrom(Ime1Constants.CLASS).and(isType(HIDE_SOFT_INPUT)))
+                        .findAny().isPresent(),
                 TIMEOUT, "CtsInputMethod1.hideSoftInput is called");
     }
 
@@ -195,7 +203,9 @@
         // we should've only one onStartInput call.
         pollingCheck(() -> helper.queryAllEvents()
                         .collect(startingFrom(helper.isStartOfTest()))
-                        .anyMatch(isFrom(Ime1Constants.CLASS).and(isType(ON_START_INPUT))),
+                        .filter(isFrom(Ime1Constants.CLASS).and(isType(ON_START_INPUT)))
+                        .findAny()
+                        .isPresent(),
                 TIMEOUT, "CtsInputMethod1.onStartInput is called");
         List<DeviceEvent> startInputEvents = helper.queryAllEvents()
                 .collect(startingFrom(helper.isStartOfTest()))
@@ -208,15 +218,10 @@
 
         // check if that single event didn't cause IME restart.
         final DeviceEvent event = startInputEvents.get(0);
-        final Boolean isRestarting = DeviceEvent.getEventParamBoolean(
+        Boolean isRestarting = DeviceEvent.getEventParamBoolean(
                         DeviceEventTypeParam.ON_START_INPUT_RESTARTING, event);
-        assertNotNull(isRestarting);
+        assertTrue(isRestarting != null);
         assertFalse(isRestarting);
-
-        final Boolean isDummyInputConnection = DeviceEvent.getEventParamBoolean(
-                DeviceEventTypeParam.ON_START_INPUT_DUMMY_INPUT_CONNECTION, event);
-        assertNotNull(isDummyInputConnection);
-        assertFalse(isDummyInputConnection);
     }
 
     /**
diff --git a/hostsidetests/inputmethodservice/deviceside/lib/src/android/inputmethodservice/cts/DeviceEvent.java b/hostsidetests/inputmethodservice/deviceside/lib/src/android/inputmethodservice/cts/DeviceEvent.java
index cd2c557..ff412ef 100644
--- a/hostsidetests/inputmethodservice/deviceside/lib/src/android/inputmethodservice/cts/DeviceEvent.java
+++ b/hostsidetests/inputmethodservice/deviceside/lib/src/android/inputmethodservice/cts/DeviceEvent.java
@@ -277,16 +277,19 @@
     public static Boolean getEventParamBoolean(
             DeviceEventTypeParam eventParam, final DeviceEvent event) {
         StringReader stringReader = new StringReader(event.paramsString);
-        try (JsonReader reader = new JsonReader(stringReader)) {
+        JsonReader reader = new JsonReader(stringReader);
+
+        try {
             reader.beginObject();
             while (reader.hasNext()) {
                 String name = reader.nextName();
                 if (name.equals(eventParam.getName())) {
                     Boolean value = reader.nextBoolean();
+                    reader.endObject();
                     return value;
                 }
-                reader.skipValue();
             }
+            reader.endObject();
         } catch (IOException e) {
             throw new RuntimeException("DeviceEvent.getEventParamBoolean() failed.", e);
         }
diff --git a/hostsidetests/inputmethodservice/deviceside/lib/src/android/inputmethodservice/cts/ime/CtsBaseInputMethod.java b/hostsidetests/inputmethodservice/deviceside/lib/src/android/inputmethodservice/cts/ime/CtsBaseInputMethod.java
index 3a99e71..b37873c 100644
--- a/hostsidetests/inputmethodservice/deviceside/lib/src/android/inputmethodservice/cts/ime/CtsBaseInputMethod.java
+++ b/hostsidetests/inputmethodservice/deviceside/lib/src/android/inputmethodservice/cts/ime/CtsBaseInputMethod.java
@@ -33,7 +33,6 @@
 import android.os.ResultReceiver;
 import android.util.Log;
 import android.view.inputmethod.EditorInfo;
-import android.view.inputmethod.InputBinding;
 import android.view.inputmethod.InputConnection;
 
 import java.util.function.Consumer;
@@ -81,19 +80,15 @@
 
     @Override
     public void onStartInput(EditorInfo editorInfo, boolean restarting) {
-        final boolean dummyConnection =
-                getCurrentInputConnection() == getCurrentInputBinding().getConnection();
         if (DEBUG) {
             Log.d(mLogTag, "onStartInput:"
                     + " editorInfo=" + editorInfo
-                    + " restarting=" + restarting
-                    + " dummyConnection=" + dummyConnection);
+                    + " restarting=" + restarting);
         }
 
         sendEvent(DeviceEvent.builder()
                 .setType(ON_START_INPUT)
-                .with(DeviceEventTypeParam.ON_START_INPUT_RESTARTING, restarting)
-                .with(DeviceEventTypeParam.ON_START_INPUT_DUMMY_INPUT_CONNECTION, dummyConnection));
+                .with(DeviceEventTypeParam.ON_START_INPUT_RESTARTING, restarting));
         super.onStartInput(editorInfo, restarting);
     }
 
diff --git a/run_unit_tests.sh b/run_unit_tests.sh
index 64ecf25..3f29832 100755
--- a/run_unit_tests.sh
+++ b/run_unit_tests.sh
@@ -44,7 +44,6 @@
     cts-tradefed-tests\
     compatibility-device-info-tests\
     compatibility-manifest-generator-tests
-    compatibility-host-media-preconditions-tests\
     CompatibilityTestApp"
 
 pushd ${CTS_DIR}/..
@@ -74,5 +73,3 @@
 ${CTS_DIR}/common/util/tests/run_tests.sh
 
 ${CTS_DIR}/tools/cts-tradefed/tests/run_tests.sh
-
-${CTS_DIR}/tests/tests/mediastress/preconditions/tests/run_tests.sh
diff --git a/tests/framework/base/activitymanager/src/android/server/am/ActivityManagerPinnedStackTests.java b/tests/framework/base/activitymanager/src/android/server/am/ActivityManagerPinnedStackTests.java
index 4b2086f..8312b9e 100644
--- a/tests/framework/base/activitymanager/src/android/server/am/ActivityManagerPinnedStackTests.java
+++ b/tests/framework/base/activitymanager/src/android/server/am/ActivityManagerPinnedStackTests.java
@@ -234,6 +234,7 @@
         setDeviceRotation(ROTATION_0);
     }
 
+    @Presubmit
     @Test
     public void testPinnedStackOutOfBoundsInsetsNonNegative() throws Exception {
         assumeTrue(supportsPip());
@@ -243,6 +244,7 @@
         // Launch an activity into the pinned stack
         launchActivity(PIP_ACTIVITY, EXTRA_ENTER_PIP, "true", EXTRA_TAP_TO_FINISH, "true");
         mAmWmState.waitForValidState(PIP_ACTIVITY, WINDOWING_MODE_PINNED, ACTIVITY_TYPE_STANDARD);
+        mAmWmState.waitForAppTransitionIdle();
 
         // Get the display dimensions
         WindowManagerState.WindowState windowState = getWindowState(PIP_ACTIVITY);
@@ -1119,15 +1121,15 @@
     }
 
     /** Test that reported display size corresponds to fullscreen after exiting PiP. */
+    @Presubmit
     @Test
     public void testDisplayMetricsPinUnpin() throws Exception {
         assumeTrue(supportsPip());
 
         String logSeparator = clearLogcat();
         launchActivity(TEST_ACTIVITY);
-        final int defaultWindowingMode = WINDOWING_MODE_FULLSCREEN;
-        // TODO: Uncomment the line below after we start dumping AM to proto.
-        //final int defaultWindowingMode = mAmWmState.getAmState().getActivity(TEST_ACTIVITY).getWindowingMode();
+        final int defaultWindowingMode = mAmWmState.getAmState()
+                .getTaskByActivityName(TEST_ACTIVITY).getWindowingMode();
         final ReportedSizes initialSizes = getLastReportedSizesForActivity(TEST_ACTIVITY,
                 logSeparator);
         final Rect initialAppBounds = readAppBounds(TEST_ACTIVITY, logSeparator);
@@ -1137,6 +1139,7 @@
         logSeparator = clearLogcat();
         launchActivity(PIP_ACTIVITY, EXTRA_ENTER_PIP, "true");
         mAmWmState.waitForValidState(PIP_ACTIVITY, WINDOWING_MODE_PINNED, ACTIVITY_TYPE_STANDARD);
+        mAmWmState.waitForAppTransitionIdle();
         final ReportedSizes pinnedSizes = getLastReportedSizesForActivity(PIP_ACTIVITY,
                 logSeparator);
         final Rect pinnedAppBounds = readAppBounds(PIP_ACTIVITY, logSeparator);
diff --git a/tests/framework/base/windowmanager/src/android/server/wm/CrossAppDragAndDropTests.java b/tests/framework/base/windowmanager/src/android/server/wm/CrossAppDragAndDropTests.java
index e3c4b89..c9b8b17 100644
--- a/tests/framework/base/windowmanager/src/android/server/wm/CrossAppDragAndDropTests.java
+++ b/tests/framework/base/windowmanager/src/android/server/wm/CrossAppDragAndDropTests.java
@@ -113,9 +113,6 @@
     private static final String RESULT_EXCEPTION = "Exception";
     private static final String RESULT_NULL_DROP_PERMISSIONS = "Null DragAndDropPermissions";
 
-    private static final String AM_SUPPORTS_SPLIT_SCREEN_MULTIWINDOW =
-            "am supports-split-screen-multi-window";
-
     protected Context mContext;
     protected ActivityManager mAm;
     private UiDevice mDevice;
@@ -425,19 +422,11 @@
     }
 
     private static boolean supportsDragAndDrop() {
-        String supportsMultiwindow = executeShellCommand("am supports-multiwindow").trim();
-        if ("true".equals(supportsMultiwindow)) {
-            return true;
-        } else if ("false".equals(supportsMultiwindow)) {
-            return false;
-        } else {
-            throw new RuntimeException(
-                    "device does not support \"am supports-multiwindow\" shell command.");
-        }
+        return ActivityManager.supportsMultiWindow(InstrumentationRegistry.getContext());
     }
 
     private static boolean supportsSplitScreenMultiWindow() {
-        return !executeShellCommand(AM_SUPPORTS_SPLIT_SCREEN_MULTIWINDOW).startsWith("false");
+        return ActivityManager.supportsSplitScreenMultiWindow(InstrumentationRegistry.getContext());
     }
 
     private static boolean supportsFreeformMultiWindow() {
diff --git a/tests/inputmethod/Android.mk b/tests/inputmethod/Android.mk
index 979ad78..5fc491e 100644
--- a/tests/inputmethod/Android.mk
+++ b/tests/inputmethod/Android.mk
@@ -38,6 +38,8 @@
 
 LOCAL_PACKAGE_NAME := CtsInputMethodTestCases
 
+LOCAL_SDK_VERSION := test_current
+
 include $(BUILD_CTS_PACKAGE)
 
 include $(call all-makefiles-under,$(LOCAL_PATH))
diff --git a/tests/inputmethod/src/android/view/inputmethod/cts/BaseInputConnectionTest.java b/tests/inputmethod/src/android/view/inputmethod/cts/BaseInputConnectionTest.java
index d5ace2e..d3efc72 100644
--- a/tests/inputmethod/src/android/view/inputmethod/cts/BaseInputConnectionTest.java
+++ b/tests/inputmethod/src/android/view/inputmethod/cts/BaseInputConnectionTest.java
@@ -493,8 +493,8 @@
     public void testCloseConnection() {
         final CharSequence source = "0123456789";
         mConnection.commitText(source, source.length());
+        mConnection.setComposingRegion(2, 5);
         final Editable text = mConnection.getEditable();
-        BaseInputConnection.setComposingSpans(text, 2, 5);
         assertEquals(2, BaseInputConnection.getComposingSpanStart(text));
         assertEquals(5, BaseInputConnection.getComposingSpanEnd(text));
 
diff --git a/tests/inputmethod/src/android/view/inputmethod/cts/InputMethodInfoTest.java b/tests/inputmethod/src/android/view/inputmethod/cts/InputMethodInfoTest.java
index 2b5d7ed..b538d41 100644
--- a/tests/inputmethod/src/android/view/inputmethod/cts/InputMethodInfoTest.java
+++ b/tests/inputmethod/src/android/view/inputmethod/cts/InputMethodInfoTest.java
@@ -250,7 +250,7 @@
                     ApplicationInfo.FLAG_SYSTEM) {
                 continue;
             }
-            if (serviceInfo.encryptionAware) {
+            if (serviceInfo.directBootAware) {
                 hasEncryptionAwareInputMethod = true;
                 break;
             }
diff --git a/tests/inputmethod/src/android/view/inputmethod/cts/util/TestActivity.java b/tests/inputmethod/src/android/view/inputmethod/cts/util/TestActivity.java
index b23bdc1..2cb2253 100644
--- a/tests/inputmethod/src/android/view/inputmethod/cts/util/TestActivity.java
+++ b/tests/inputmethod/src/android/view/inputmethod/cts/util/TestActivity.java
@@ -16,10 +16,10 @@
 
 package android.view.inputmethod.cts.util;
 
-import android.annotation.NonNull;
 import android.app.Activity;
 import android.content.Intent;
 import android.os.Bundle;
+import android.support.annotation.NonNull;
 import android.support.test.InstrumentationRegistry;
 import android.view.View;
 
diff --git a/tests/tests/calendarcommon/AndroidManifest.xml b/tests/tests/calendarcommon/AndroidManifest.xml
index 4f21b18..951404a 100644
--- a/tests/tests/calendarcommon/AndroidManifest.xml
+++ b/tests/tests/calendarcommon/AndroidManifest.xml
@@ -30,7 +30,7 @@
             android:value="com.android.cts.runner.CtsTestRunListener" />
     </instrumentation>
 
-    <uses-sdk android:minSdkVersion="15" android:targetSdkVersion="15"></uses-sdk>
+    <uses-sdk android:minSdkVersion="15" android:targetSdkVersion="17"></uses-sdk>
 
 </manifest>
 
diff --git a/tests/tests/dpi2/AndroidManifest.xml b/tests/tests/dpi2/AndroidManifest.xml
index 689be29..f3d5be0 100644
--- a/tests/tests/dpi2/AndroidManifest.xml
+++ b/tests/tests/dpi2/AndroidManifest.xml
@@ -25,7 +25,7 @@
 
     <!-- target cupcake so we can test the default attributes get set
          properly for the screen size attributes. -->
-    <uses-sdk android:minSdkVersion="3" android:targetSdkVersion="3" />
+    <uses-sdk android:minSdkVersion="3" android:targetSdkVersion="17" />
 
     <instrumentation android:name="android.support.test.runner.AndroidJUnitRunner"
                      android:targetPackage="android.dpi2.cts"
diff --git a/tests/tests/dpi2/src/android/dpi2/cts/DefaultManifestAttributesCupcakeTest.java b/tests/tests/dpi2/src/android/dpi2/cts/DefaultManifestAttributesCupcakeTest.java
index 04db412..abb8d66 100644
--- a/tests/tests/dpi2/src/android/dpi2/cts/DefaultManifestAttributesCupcakeTest.java
+++ b/tests/tests/dpi2/src/android/dpi2/cts/DefaultManifestAttributesCupcakeTest.java
@@ -34,6 +34,6 @@
 
     // This is a sanity test to make sure that we're instrumenting the proper package
     public void testPackageHasExpectedSdkVersion() {
-        assertEquals(3, getAppInfo().targetSdkVersion);
+        assertEquals(3, getAppInfo().minSdkVersion);
     }
 }
diff --git a/tests/tests/media/AndroidTest.xml b/tests/tests/media/AndroidTest.xml
index 03d4770..8dbb0f0 100644
--- a/tests/tests/media/AndroidTest.xml
+++ b/tests/tests/media/AndroidTest.xml
@@ -15,6 +15,9 @@
 -->
 <configuration description="Config for CTS Media test cases">
     <option name="config-descriptor:metadata" key="component" value="media" />
+    <target_preparer class="com.android.compatibility.common.tradefed.targetprep.MediaPreparer">
+        <option name="images-only" value="true" />
+    </target_preparer>
     <target_preparer class="com.android.tradefed.targetprep.suite.SuiteApkInstaller">
         <option name="cleanup-apks" value="true" />
         <option name="test-file-name" value="CtsMediaTestCases.apk" />
diff --git a/tests/tests/slice/src/android/slice/cts/SliceProvider.java b/tests/tests/slice/src/android/slice/cts/SliceProvider.java
index 265ea67..3390427 100644
--- a/tests/tests/slice/src/android/slice/cts/SliceProvider.java
+++ b/tests/tests/slice/src/android/slice/cts/SliceProvider.java
@@ -48,8 +48,8 @@
                 PendingIntent broadcast = PendingIntent.getBroadcast(getContext(), 0,
                         new Intent(getContext().getPackageName() + ".action"), 0);
                 return builder.addAction(broadcast, subSlice, "action").build();
-            case "/color":
-                return new Slice.Builder(sliceUri).addColor(0xff121212, "color").build();
+            case "/int":
+                return new Slice.Builder(sliceUri).addInt(0xff121212, "int").build();
             case "/timestamp":
                 return new Slice.Builder(sliceUri).addTimestamp(43, "timestamp").build();
             case "/hints":
diff --git a/tests/tests/slice/src/android/slice/cts/SliceTest.java b/tests/tests/slice/src/android/slice/cts/SliceTest.java
index 8efcf4c..dcc0b94 100644
--- a/tests/tests/slice/src/android/slice/cts/SliceTest.java
+++ b/tests/tests/slice/src/android/slice/cts/SliceTest.java
@@ -150,16 +150,16 @@
     }
 
     @Test
-    public void testColor() {
-        Uri uri = BASE_URI.buildUpon().appendPath("color").build();
+    public void testInt() {
+        Uri uri = BASE_URI.buildUpon().appendPath("int").build();
         Slice s = Slice.bindSlice(mContext.getContentResolver(), uri,
                 Collections.emptyList());
         assertEquals(uri, s.getUri());
         assertEquals(1, s.getItems().size());
 
         SliceItem item = s.getItems().get(0);
-        assertEquals(SliceItem.FORMAT_COLOR, item.getFormat());
-        assertEquals(0xff121212, item.getColor());
+        assertEquals(SliceItem.FORMAT_INT, item.getFormat());
+        assertEquals(0xff121212, item.getInt());
     }
 
     @Test
diff --git a/tests/tests/telephony/src/android/telephony/cts/CellInfoTest.java b/tests/tests/telephony/src/android/telephony/cts/CellInfoTest.java
index a1423af..a074783 100644
--- a/tests/tests/telephony/src/android/telephony/cts/CellInfoTest.java
+++ b/tests/tests/telephony/src/android/telephony/cts/CellInfoTest.java
@@ -110,6 +110,11 @@
     }
 
     private void verifyCdmaInfo(CellInfoCdma cdma) {
+        String alphaLong = (String) cdma.getCellIdentity().getOperatorAlphaLong();
+        assertNotNull("getOperatorAlphaLong() returns NULL!", alphaLong);
+        String alphaShort = (String) cdma.getCellIdentity().getOperatorAlphaShort();
+        assertNotNull("getOperatorAlphaShort() returns NULL!", alphaShort);
+
         int level = cdma.getCellSignalStrength().getLevel();
         assertTrue("getLevel() out of range [0,4], level=" + level, level >=0 && level <= 4);
     }
@@ -123,6 +128,29 @@
         // Physical cell id should be within [0, 503].
         assertTrue("getPci() out of range [0, 503], pci=" + pci, pci >= 0 && pci <= 503);
 
+        String alphaLong = (String) lte.getCellIdentity().getOperatorAlphaLong();
+        assertNotNull("getOperatorAlphaLong() returns NULL!", alphaLong);
+        String alphaShort = (String) lte.getCellIdentity().getOperatorAlphaShort();
+        assertNotNull("getOperatorAlphaShort() returns NULL!", alphaShort);
+
+        String mccStr = lte.getCellIdentity().getMccStr();
+        // mccStr is set as NULL if empty, unknown or invalid.
+        assertTrue("getMccStr() out of range [0, 999], mcc=" + mccStr,
+                mccStr == null || mccStr.matches("^[0-9]{3}$"));
+        String mncStr = lte.getCellIdentity().getMncStr();
+        // mncStr is set as NULL if empty, unknown or invalid.
+        assertTrue("getMncStr() out of range [0, 999], mnc=" + mncStr,
+                mncStr == null || mncStr.matches("^[0-9]{2,3}$"));
+
+        int mcc = lte.getCellIdentity().getMcc();
+        // getMcc() returns Integer.MAX_VALUE if mccStr is null.
+        assertTrue("getMcc() out of range [0, 999], mcc=" + mcc,
+                (mcc >= 0 && mcc <= 999) || mcc == Integer.MAX_VALUE);
+        int mnc = lte.getCellIdentity().getMnc();
+        // getMnc() returns Integer.MAX_VALUE if mccStr is null.
+        assertTrue("getMnc() out of range [0, 999], mnc=" + mnc,
+                (mnc >= 0 && mnc <= 999) || mnc == Integer.MAX_VALUE);
+
         int earfcn = lte.getCellIdentity().getEarfcn();
         // Reference 3GPP 36.101 Table 5.7.3-1
         assertTrue("getEarfcn() out of range [0,47000], earfcn=" + earfcn,
@@ -162,6 +190,29 @@
         assertTrue("getUarfcn() out of range [400,11000], uarfcn=" + uarfcn,
             uarfcn >= 400 && uarfcn <= 11000);
 
+        String alphaLong = (String) wcdma.getCellIdentity().getOperatorAlphaLong();
+        assertNotNull("getOperatorAlphaLong() returns NULL!", alphaLong);
+        String alphaShort = (String) wcdma.getCellIdentity().getOperatorAlphaShort();
+        assertNotNull("getOperatorAlphaShort() returns NULL!", alphaShort);
+
+        String mccStr = wcdma.getCellIdentity().getMccStr();
+        // mccStr is set as NULL if empty, unknown or invalid.
+        assertTrue("getMccStr() out of range [0, 999], mcc=" + mccStr,
+                mccStr == null || mccStr.matches("^[0-9]{3}$"));
+        String mncStr = wcdma.getCellIdentity().getMncStr();
+        // mncStr is set as NULL if empty, unknown or invalid.
+        assertTrue("getMncStr() out of range [0, 999], mnc=" + mncStr,
+                mncStr == null || mncStr.matches("^[0-9]{2,3}$"));
+
+        int mcc = wcdma.getCellIdentity().getMcc();
+        // getMcc() returns Integer.MAX_VALUE if mccStr is null.
+        assertTrue("getMcc() out of range [0, 999], mcc=" + mcc,
+                (mcc >= 0 && mcc <= 999) || mcc == Integer.MAX_VALUE);
+        int mnc = wcdma.getCellIdentity().getMnc();
+        // getMnc() returns Integer.MAX_VALUE if mccStr is null.
+        assertTrue("getMnc() out of range [0, 999], mnc=" + mnc,
+                (mnc >= 0 && mnc <= 999) || mnc == Integer.MAX_VALUE);
+
         int level = wcdma.getCellSignalStrength().getLevel();
         assertTrue("getLevel() out of range [0,4], level=" + level, level >=0 && level <= 4);
     }
@@ -183,6 +234,29 @@
         assertTrue("getArfcn() out of range [0,1024], arfcn=" + arfcn,
             arfcn >= 0 && arfcn <= 1024);
 
+        String alphaLong = (String) gsm.getCellIdentity().getOperatorAlphaLong();
+        assertNotNull("getOperatorAlphaLong() returns NULL!", alphaLong);
+        String alphaShort = (String) gsm.getCellIdentity().getOperatorAlphaShort();
+        assertNotNull("getOperatorAlphaShort() returns NULL!", alphaShort);
+
+        String mccStr = gsm.getCellIdentity().getMccStr();
+        // mccStr is set as NULL if empty, unknown or invalid.
+        assertTrue("getMccStr() out of range [0, 999], mcc=" + mccStr,
+                mccStr == null || mccStr.matches("^[0-9]{3}$"));
+        String mncStr = gsm.getCellIdentity().getMncStr();
+        // mncStr is set as NULL if empty, unknown or invalid.
+        assertTrue("getMncStr() out of range [0, 999], mnc=" + mncStr,
+                mncStr == null || mncStr.matches("^[0-9]{2,3}$"));
+
+        int mcc = gsm.getCellIdentity().getMcc();
+        // getMcc() returns Integer.MAX_VALUE if mccStr is null.
+        assertTrue("getMcc() out of range [0, 999], mcc=" + mcc,
+                (mcc >= 0 && mcc <= 999) || mcc == Integer.MAX_VALUE);
+        int mnc = gsm.getCellIdentity().getMnc();
+        // getMnc() returns Integer.MAX_VALUE if mccStr is null.
+        assertTrue("getMnc() out of range [0, 999], mnc=" + mnc,
+                (mnc >= 0 && mnc <= 999) || mnc == Integer.MAX_VALUE);
+
         int level = gsm.getCellSignalStrength().getLevel();
         assertTrue("getLevel() out of range [0,4], level=" + level, level >=0 && level <= 4);