Merge "Fix CtsTelephonyTestCases:PhoneNumberUtilsTest--testCallMethods fails due to PhoneNumberUtils MIN_MATCH set to 11 for China region ship" into froyo
diff --git a/tests/appsecurity-tests/src/com/android/cts/appsecurity/AppSecurityTests.java b/tests/appsecurity-tests/src/com/android/cts/appsecurity/AppSecurityTests.java
index f528ee1..e34e3e8 100644
--- a/tests/appsecurity-tests/src/com/android/cts/appsecurity/AppSecurityTests.java
+++ b/tests/appsecurity-tests/src/com/android/cts/appsecurity/AppSecurityTests.java
@@ -22,6 +22,7 @@
 import junit.framework.Test;
 
 import com.android.ddmlib.Log;
+import com.android.ddmlib.Log.LogLevel;
 import com.android.ddmlib.testrunner.ITestRunListener;
 import com.android.ddmlib.testrunner.RemoteAndroidTestRunner;
 import com.android.ddmlib.testrunner.TestIdentifier;
@@ -48,6 +49,12 @@
     // testAppFailAccessPrivateData constants
     private static final String APP_WITH_DATA_APK = "CtsAppWithData.apk";
     private static final String APP_WITH_DATA_PKG = "com.android.cts.appwithdata";
+    private static final String APP_WITH_DATA_CLASS =
+            "com.android.cts.appwithdata.CreatePrivateDataTest";
+    private static final String APP_WITH_DATA_CREATE_METHOD =
+            "testCreatePrivateData";
+    private static final String APP_WITH_DATA_CHECK_NOEXIST_METHOD =
+            "testEnsurePrivateDataNotExist";
     private static final String APP_ACCESS_DATA_APK = "CtsAppAccessData.apk";
     private static final String APP_ACCESS_DATA_PKG = "com.android.cts.appaccessdata";
 
@@ -138,7 +145,8 @@
                     false);
             assertNull("failed to install app with data", installResult);
             // run appwithdata's tests to create private data
-            assertTrue("failed to create app's private data", runDeviceTests(APP_WITH_DATA_PKG));
+            assertTrue("failed to create app's private data", runDeviceTests(APP_WITH_DATA_PKG,
+                    APP_WITH_DATA_CLASS, APP_WITH_DATA_CREATE_METHOD));
 
             installResult = getDevice().installPackage(getTestAppFilePath(APP_ACCESS_DATA_APK),
                     false);
@@ -153,6 +161,37 @@
     }
 
     /**
+     * Test that uninstall of an app removes its private data.
+     */
+    public void testUninstallRemovesData() throws IOException {
+        Log.i(LOG_TAG, "Uninstalling app, verifying data is removed.");
+        try {
+            // cleanup test app that might be installed from previous partial test run
+            getDevice().uninstallPackage(APP_WITH_DATA_PKG);
+
+            String installResult = getDevice().installPackage(getTestAppFilePath(APP_WITH_DATA_APK),
+                    false);
+            assertNull("failed to install app with data", installResult);
+            // run appwithdata's tests to create private data
+            assertTrue("failed to create app's private data", runDeviceTests(APP_WITH_DATA_PKG,
+                    APP_WITH_DATA_CLASS, APP_WITH_DATA_CREATE_METHOD));
+
+            getDevice().uninstallPackage(APP_WITH_DATA_PKG);
+
+            installResult = getDevice().installPackage(getTestAppFilePath(APP_WITH_DATA_APK),
+                    false);
+            assertNull("failed to install app with data second time", installResult);
+            // run appwithdata's 'check if file exists' test
+            assertTrue("app's private data still exists after install", runDeviceTests(
+                    APP_WITH_DATA_PKG, APP_WITH_DATA_CLASS, APP_WITH_DATA_CHECK_NOEXIST_METHOD));
+
+        }
+        finally {
+            getDevice().uninstallPackage(APP_WITH_DATA_PKG);
+        }
+    }
+
+    /**
      * Test that an app cannot instrument another app that is signed with different certificate.
      */
     public void testInstrumentationDiffCert() throws IOException {
@@ -227,7 +266,17 @@
      * @return <code>true</code> if all tests passed.
      */
     private boolean runDeviceTests(String pkgName) {
-        CollectingTestRunListener listener = doRunTests(pkgName);
+    	return runDeviceTests(pkgName, null, null);
+    }
+
+    /**
+     * Helper method that will the specified packages tests on device.
+     *
+     * @param pkgName Android application package for tests
+     * @return <code>true</code> if all tests passed.
+     */
+    private boolean runDeviceTests(String pkgName, String testClassName, String testMethodName) {
+        CollectingTestRunListener listener = doRunTests(pkgName, testClassName, testMethodName);
         return listener.didAllTestsPass();
     }
 
@@ -236,8 +285,12 @@
      * @param pkgName Android application package for tests
      * @return the {@link CollectingTestRunListener}
      */
-    private CollectingTestRunListener doRunTests(String pkgName) {
+    private CollectingTestRunListener doRunTests(String pkgName, String testClassName,
+            String testMethodName) {
         RemoteAndroidTestRunner testRunner = new RemoteAndroidTestRunner(pkgName, getDevice());
+        if (testClassName != null && testMethodName != null) {
+            testRunner.setMethodName(testClassName, testMethodName);
+        }
         CollectingTestRunListener listener = new CollectingTestRunListener();
         testRunner.run(listener);
         return listener;
@@ -254,7 +307,8 @@
 
         public void testFailed(TestFailure status, TestIdentifier test,
                 String trace) {
-            Log.w(LOG_TAG, String.format("%s#%s failed: %s", test.getClassName(),
+            Log.logAndDisplay(LogLevel.WARN, LOG_TAG, String.format("%s#%s failed: %s",
+                    test.getClassName(),
                     test.getTestName(), trace));
             mAllTestsPassed = false;
         }
@@ -264,7 +318,8 @@
         }
 
         public void testRunFailed(String errorMessage) {
-            Log.w(LOG_TAG, String.format("test run failed: %s", errorMessage));
+            Log.logAndDisplay(LogLevel.WARN, LOG_TAG, String.format("test run failed: %s",
+                    errorMessage));
             mAllTestsPassed = false;
             mTestRunErrorMessage = errorMessage;
         }
diff --git a/tests/appsecurity-tests/test-apps/AppWithData/src/com/android/cts/appwithdata/CreatePrivateDataTest.java b/tests/appsecurity-tests/test-apps/AppWithData/src/com/android/cts/appwithdata/CreatePrivateDataTest.java
index de8cb78..d77a872 100644
--- a/tests/appsecurity-tests/test-apps/AppWithData/src/com/android/cts/appwithdata/CreatePrivateDataTest.java
+++ b/tests/appsecurity-tests/test-apps/AppWithData/src/com/android/cts/appwithdata/CreatePrivateDataTest.java
@@ -44,5 +44,14 @@
                 Context.MODE_PRIVATE);
         outputStream.write("file contents".getBytes());
         outputStream.close();
+        assertTrue(getContext().getFileStreamPath(PRIVATE_FILE_NAME).exists());
+    }
+
+    /**
+     * Check to ensure the private file created in testCreatePrivateData does not exist.
+     * Used to check that uninstall of an app deletes the app's data.
+     */
+    public void testEnsurePrivateDataNotExist() throws IOException {
+        assertFalse(getContext().getFileStreamPath(PRIVATE_FILE_NAME).exists());
     }
 }
diff --git a/tests/src/android/view/cts/WindowStubActivity.java b/tests/src/android/view/cts/WindowStubActivity.java
old mode 100644
new mode 100755
index 24a971f..502c947
--- a/tests/src/android/view/cts/WindowStubActivity.java
+++ b/tests/src/android/view/cts/WindowStubActivity.java
@@ -39,8 +39,8 @@
 
     @Override
     public boolean onCreateOptionsMenu(Menu menu) {
-        menu.add(Menu.NONE, Menu.NONE, Menu.NONE, "Quit").setAlphabeticShortcut('q');
-        menu.add(Menu.NONE, Menu.NONE, Menu.NONE, "Action").setAlphabeticShortcut('a');
+        menu.add(Menu.NONE, Menu.NONE, Menu.NONE, "Quit").setShortcut('1', 'q');
+        menu.add(Menu.NONE, Menu.NONE, Menu.NONE, "Action").setShortcut('2', 'a');
         mIsOnCreateOptionsMenuCalled = true;
         return super.onCreateOptionsMenu(menu);
     }
diff --git a/tests/tests/app/src/android/app/cts/DialogTest.java b/tests/tests/app/src/android/app/cts/DialogTest.java
index 4d02896..28c2c20 100644
--- a/tests/tests/app/src/android/app/cts/DialogTest.java
+++ b/tests/tests/app/src/android/app/cts/DialogTest.java
@@ -36,6 +36,7 @@
 import android.os.Looper;
 import android.os.Message;
 import android.test.ActivityInstrumentationTestCase2;
+import android.view.animation.cts.DelayedCheck;
 import android.view.KeyEvent;
 import android.view.LayoutInflater;
 import android.view.MenuItem;
@@ -60,6 +61,7 @@
     private static final float MOTION_X = -20.0f;
     private static final float MOTION_Y = -20.0f;
     private static final String STUB_ACTIVITY_PACKAGE = "com.android.cts.stub";
+    private static final long TEST_TIMEOUT = 1000L;
 
     /**
      *  please refer to Dialog
@@ -698,7 +700,12 @@
         });
         mInstrumentation.waitForIdleSync();
 
-        assertTrue(d.isOnWindowFocusChangedCalled);
+        // Wait until TestDialog#OnWindowFocusChanged() is called
+        new DelayedCheck(TEST_TIMEOUT) {
+            protected boolean check() {
+                return d.isOnWindowFocusChangedCalled;
+            }
+        }.run();
     }
 
     @TestTargets({
diff --git a/tests/tests/app/src/android/app/cts/InstrumentationTest.java b/tests/tests/app/src/android/app/cts/InstrumentationTest.java
index 5ce33a0..fce9972 100644
--- a/tests/tests/app/src/android/app/cts/InstrumentationTest.java
+++ b/tests/tests/app/src/android/app/cts/InstrumentationTest.java
@@ -71,8 +71,8 @@
         final long eventTime = SystemClock.uptimeMillis();
         // use coordinates for MotionEvent that do not include the status bar
         // TODO: is there a more deterministic way to get these values
-        final long x = 50;
-        final long y = 50;
+        final long x = 55;
+        final long y = 55;
         final int metaState = 0;
         mMotionEvent = MotionEvent.obtain(downTime, eventTime, MotionEvent.ACTION_DOWN, x, y,
                 metaState);
diff --git a/tests/tests/content/src/android/content/cts/AvailableIntentsTest.java b/tests/tests/content/src/android/content/cts/AvailableIntentsTest.java
index b08e953..bd8c260 100644
--- a/tests/tests/content/src/android/content/cts/AvailableIntentsTest.java
+++ b/tests/tests/content/src/android/content/cts/AvailableIntentsTest.java
@@ -147,9 +147,12 @@
         args = {java.lang.String.class, android.net.Uri.class}
     )
     public void testDialPhoneNumber() {
-        Uri uri = Uri.parse("tel:(212)5551212");
-        Intent intent = new Intent(Intent.ACTION_DIAL, uri);
-        assertCanBeHandled(intent);
+        PackageManager packageManager = mContext.getPackageManager();
+        if (packageManager.hasSystemFeature(PackageManager.FEATURE_TELEPHONY)) {
+            Uri uri = Uri.parse("tel:(212)5551212");
+            Intent intent = new Intent(Intent.ACTION_DIAL, uri);
+            assertCanBeHandled(intent);
+        }
     }
 
     /**
@@ -161,8 +164,11 @@
         args = {java.lang.String.class, android.net.Uri.class}
     )
     public void testDialVoicemail() {
-        Uri uri = Uri.parse("voicemail:");
-        Intent intent = new Intent(Intent.ACTION_DIAL, uri);
-        assertCanBeHandled(intent);
+        PackageManager packageManager = mContext.getPackageManager();
+        if (packageManager.hasSystemFeature(PackageManager.FEATURE_TELEPHONY)) {
+            Uri uri = Uri.parse("voicemail:");
+            Intent intent = new Intent(Intent.ACTION_DIAL, uri);
+            assertCanBeHandled(intent);
+        }
     }
 }
diff --git a/tests/tests/content/src/android/content/cts/ContentResolverSyncTestCase.java b/tests/tests/content/src/android/content/cts/ContentResolverSyncTestCase.java
index 032f10a..ecad3e4 100644
--- a/tests/tests/content/src/android/content/cts/ContentResolverSyncTestCase.java
+++ b/tests/tests/content/src/android/content/cts/ContentResolverSyncTestCase.java
@@ -211,12 +211,13 @@
     /**
      * Test if we can set and get the MasterSyncAutomatically switch
      */
-    public void testGetAndSetMasterSyncAutomatically() {
+    public void testGetAndSetMasterSyncAutomatically() throws Exception {
         ContentResolver.setMasterSyncAutomatically(true);
         assertEquals(true, ContentResolver.getMasterSyncAutomatically());
 
         ContentResolver.setMasterSyncAutomatically(false);
         assertEquals(false, ContentResolver.getMasterSyncAutomatically());
+        Thread.sleep(3000);
     }
 
     /**
diff --git a/tests/tests/dpi/src/android/dpi/cts/ConfigurationTest.java b/tests/tests/dpi/src/android/dpi/cts/ConfigurationTest.java
index f038c4b..069cf80 100644
--- a/tests/tests/dpi/src/android/dpi/cts/ConfigurationTest.java
+++ b/tests/tests/dpi/src/android/dpi/cts/ConfigurationTest.java
@@ -179,6 +179,7 @@
      * HVGA      | medium (141-190) | normal
      * WVGA      | high (191-250)   | normal
      * FWVGA     | high (191-250)   | normal
+     * QHD       | high (191-250)   | normal
      * WSVGA     | high (191-250)   | large
 
      * VGA       | medium (141-190) | large
@@ -192,7 +193,7 @@
         // QVGA      | low (100-140)    | small
         new ScreenConfiguration(240, 320, Density.LOW, Configuration.SCREENLAYOUT_SIZE_SMALL),
         // WQVGA     | low (100-140)    | normal
-        new ScreenConfiguration(240, 320, Density.LOW, Configuration.SCREENLAYOUT_SIZE_SMALL, true),
+        new ScreenConfiguration(240, 400, Density.LOW, Configuration.SCREENLAYOUT_SIZE_NORMAL),
         // HVGA      | medium (141-190) | normal
         new ScreenConfiguration(480, 320, Density.MEDIUM, Configuration.SCREENLAYOUT_SIZE_NORMAL),
         new ScreenConfiguration(640, 240, Density.MEDIUM, Configuration.SCREENLAYOUT_SIZE_NORMAL),
@@ -200,6 +201,8 @@
         new ScreenConfiguration(640, 480, Density.HIGH, Configuration.SCREENLAYOUT_SIZE_NORMAL, true),
         // FWVGA     | high (191-250)   | normal
         new ScreenConfiguration(864, 480, Density.HIGH, Configuration.SCREENLAYOUT_SIZE_NORMAL),
+        // QHD     | high (191-250)   | normal
+        new ScreenConfiguration(960, 540, Density.HIGH, Configuration.SCREENLAYOUT_SIZE_NORMAL),
         // WSVGA     | high (191-250)   | large
         new ScreenConfiguration(1024, 600, Density.HIGH, Configuration.SCREENLAYOUT_SIZE_LARGE),
 
diff --git a/tests/tests/graphics/src/android/opengl/cts/OpenGlEsVersionTest.java b/tests/tests/graphics/src/android/opengl/cts/OpenGlEsVersionTest.java
index f1acd87..3ebc567 100644
--- a/tests/tests/graphics/src/android/opengl/cts/OpenGlEsVersionTest.java
+++ b/tests/tests/graphics/src/android/opengl/cts/OpenGlEsVersionTest.java
@@ -83,33 +83,42 @@
         EGLDisplay display = egl.eglGetDisplay(EGL10.EGL_DEFAULT_DISPLAY);
         int[] numConfigs = new int[1];
 
-        if (egl.eglGetConfigs(display, null, 0, numConfigs)) {
-            EGLConfig[] configs = new EGLConfig[numConfigs[0]];
-            if (egl.eglGetConfigs(display, configs, numConfigs[0], numConfigs)) {
-                int[] value = new int[1];
-                for (int i = 0; i < numConfigs[0]; i++) {
-                    if (egl.eglGetConfigAttrib(display, configs[i],
-                            EGL10.EGL_RENDERABLE_TYPE, value)) {
-                        if ((value[0] & EGL_OPENGL_ES2_BIT) == EGL_OPENGL_ES2_BIT) {
-                            return 2;
+        if (egl.eglInitialize(display, null)) {
+            try {
+                if (egl.eglGetConfigs(display, null, 0, numConfigs)) {
+                    EGLConfig[] configs = new EGLConfig[numConfigs[0]];
+                    if (egl.eglGetConfigs(display, configs, numConfigs[0], numConfigs)) {
+                        int[] value = new int[1];
+                        for (int i = 0; i < numConfigs[0]; i++) {
+                            if (egl.eglGetConfigAttrib(display, configs[i],
+                                    EGL10.EGL_RENDERABLE_TYPE, value)) {
+                                if ((value[0] & EGL_OPENGL_ES2_BIT) == EGL_OPENGL_ES2_BIT) {
+                                    return 2;
+                                }
+                            } else {
+                                Log.w(TAG, "Getting config attribute with "
+                                        + "EGL10#eglGetConfigAttrib failed "
+                                        + "(" + i + "/" + numConfigs[0] + "): "
+                                        + egl.eglGetError());
+                            }
                         }
+                        return 1;
                     } else {
-                        Log.w(TAG, "Getting config attribute with "
-                                + "EGL10#eglGetConfigAttrib failed "
-                                + "(" + i + "/" + numConfigs[0] + "): "
+                        Log.e(TAG, "Getting configs with EGL10#eglGetConfigs failed: "
                                 + egl.eglGetError());
+                        return -1;
                     }
+                } else {
+                    Log.e(TAG, "Getting number of configs with EGL10#eglGetConfigs failed: "
+                            + egl.eglGetError());
+                    return -2;
                 }
-                return 1;
-            } else {
-                Log.e(TAG, "Getting configs with EGL10#eglGetConfigs failed: "
-                        + egl.eglGetError());
-                return -1;
-            }
+              } finally {
+                  egl.eglTerminate(display);
+              }
         } else {
-            Log.e(TAG, "Getting number of configs with EGL10#eglGetConfigs failed: "
-                    + egl.eglGetError());
-            return -2;
+            Log.e(TAG, "Couldn't initialize EGL.");
+            return -3;
         }
     }
 
diff --git a/tests/tests/media/src/android/media/cts/AudioManagerTest.java b/tests/tests/media/src/android/media/cts/AudioManagerTest.java
index 3de8a51..cfa9293 100644
--- a/tests/tests/media/src/android/media/cts/AudioManagerTest.java
+++ b/tests/tests/media/src/android/media/cts/AudioManagerTest.java
@@ -575,7 +575,8 @@
                 mAudioManager.setStreamVolume(streams[i], 1, FLAG_SHOW_UI);
                 mAudioManager.adjustStreamVolume(streams[i], ADJUST_LOWER, FLAG_ALLOW_RINGER_MODES);
                 // lowering the volume should have changed the ringer mode
-                assertEquals(RINGER_MODE_VIBRATE, mAudioManager.getRingerMode());
+                assertTrue(mAudioManager.getRingerMode() == RINGER_MODE_VIBRATE ||
+                        mAudioManager.getRingerMode() == RINGER_MODE_SILENT);
                 mAudioManager.adjustStreamVolume(streams[i], ADJUST_LOWER, FLAG_ALLOW_RINGER_MODES);
                 // adjusting the volume to zero should result in either silent or vibrate mode
                 assertTrue(mAudioManager.getRingerMode() == RINGER_MODE_VIBRATE ||
diff --git a/tests/tests/media/src/android/media/cts/AudioTrackTest.java b/tests/tests/media/src/android/media/cts/AudioTrackTest.java
index 12cfcad..0316ef9 100644
--- a/tests/tests/media/src/android/media/cts/AudioTrackTest.java
+++ b/tests/tests/media/src/android/media/cts/AudioTrackTest.java
@@ -29,7 +29,7 @@
 @TestTargetClass(AudioTrack.class)
 public class AudioTrackTest extends AndroidTestCase {
     private String TAG = "AudioTrackTest";
-    private final long WAIT_MSEC = 100;
+    private final long WAIT_MSEC = 200;
     private final int OFFSET_DEFAULT = 0;
     private final int OFFSET_NEGATIVE = -10;
 
@@ -394,8 +394,8 @@
         // -------- initialization --------------
         int minBuffSize = AudioTrack.getMinBufferSize(TEST_SR, TEST_CONF, TEST_FORMAT);
         AudioTrack track = new AudioTrack(TEST_STREAM_TYPE, TEST_SR, TEST_CONF, TEST_FORMAT,
-                minBuffSize, TEST_MODE);
-        byte data[] = new byte[minBuffSize / 2];
+                2 * minBuffSize, TEST_MODE);
+        byte data[] = new byte[minBuffSize];
         // -------- test --------------
         assertTrue(TEST_NAME, track.getState() == AudioTrack.STATE_INITIALIZED);
         track.write(data, OFFSET_DEFAULT, data.length);
@@ -453,8 +453,8 @@
         // -------- initialization --------------
         int minBuffSize = AudioTrack.getMinBufferSize(TEST_SR, TEST_CONF, TEST_FORMAT);
         AudioTrack track = new AudioTrack(TEST_STREAM_TYPE, TEST_SR, TEST_CONF, TEST_FORMAT,
-                minBuffSize, TEST_MODE);
-        byte data[] = new byte[minBuffSize / 2];
+                2 * minBuffSize, TEST_MODE);
+        byte data[] = new byte[minBuffSize];
         // -------- test --------------
         assertTrue(TEST_NAME, track.getState() == AudioTrack.STATE_INITIALIZED);
         track.write(data, OFFSET_DEFAULT, data.length);
@@ -519,8 +519,8 @@
         // -------- initialization --------------
         int minBuffSize = AudioTrack.getMinBufferSize(TEST_SR, TEST_CONF, TEST_FORMAT);
         AudioTrack track = new AudioTrack(TEST_STREAM_TYPE, TEST_SR, TEST_CONF, TEST_FORMAT,
-                minBuffSize, TEST_MODE);
-        byte data[] = new byte[minBuffSize / 2];
+                2 * minBuffSize, TEST_MODE);
+        byte data[] = new byte[minBuffSize];
         // -------- test --------------
         assertTrue(TEST_NAME, track.getState() == AudioTrack.STATE_INITIALIZED);
         track.write(data, OFFSET_DEFAULT, data.length);
@@ -586,8 +586,8 @@
         // -------- initialization --------------
         int minBuffSize = AudioTrack.getMinBufferSize(TEST_SR, TEST_CONF, TEST_FORMAT);
         AudioTrack track = new AudioTrack(TEST_STREAM_TYPE, TEST_SR, TEST_CONF, TEST_FORMAT,
-                minBuffSize, TEST_MODE);
-        byte data[] = new byte[minBuffSize / 2];
+                2 * minBuffSize, TEST_MODE);
+        byte data[] = new byte[minBuffSize];
         // -------- test --------------
         assertTrue(TEST_NAME, track.getState() == AudioTrack.STATE_INITIALIZED);
         track.write(data, OFFSET_DEFAULT, data.length);
@@ -661,8 +661,8 @@
         // -------- initialization --------------
         int minBuffSize = AudioTrack.getMinBufferSize(TEST_SR, TEST_CONF, TEST_FORMAT);
         AudioTrack track = new AudioTrack(TEST_STREAM_TYPE, TEST_SR, TEST_CONF, TEST_FORMAT,
-                minBuffSize, TEST_MODE);
-        byte data[] = new byte[minBuffSize / 2];
+                2 * minBuffSize, TEST_MODE);
+        byte data[] = new byte[minBuffSize];
         // -------- test --------------
         track.write(data, OFFSET_DEFAULT, data.length);
         track.write(data, OFFSET_DEFAULT, data.length);
@@ -728,8 +728,8 @@
         // -------- initialization --------------
         int minBuffSize = AudioTrack.getMinBufferSize(TEST_SR, TEST_CONF, TEST_FORMAT);
         AudioTrack track = new AudioTrack(TEST_STREAM_TYPE, TEST_SR, TEST_CONF, TEST_FORMAT,
-                minBuffSize, TEST_MODE);
-        byte data[] = new byte[minBuffSize / 2];
+                2 * minBuffSize, TEST_MODE);
+        byte data[] = new byte[minBuffSize];
         // -------- test --------------
         track.write(data, OFFSET_DEFAULT, data.length);
         track.write(data, OFFSET_DEFAULT, data.length);
@@ -790,8 +790,8 @@
         // -------- initialization --------------
         int minBuffSize = AudioTrack.getMinBufferSize(TEST_SR, TEST_CONF, TEST_FORMAT);
         AudioTrack track = new AudioTrack(TEST_STREAM_TYPE, TEST_SR, TEST_CONF, TEST_FORMAT,
-                minBuffSize, TEST_MODE);
-        byte data[] = new byte[minBuffSize / 2];
+                2 * minBuffSize, TEST_MODE);
+        byte data[] = new byte[minBuffSize];
         // -------- test --------------
 
         track.write(data, OFFSET_DEFAULT, data.length);
@@ -848,8 +848,8 @@
         // -------- initialization --------------
         int minBuffSize = AudioTrack.getMinBufferSize(TEST_SR, TEST_CONF, TEST_FORMAT);
         AudioTrack track = new AudioTrack(TEST_STREAM_TYPE, TEST_SR, TEST_CONF, TEST_FORMAT,
-                minBuffSize, TEST_MODE);
-        byte data[] = new byte[minBuffSize / 2];
+                2 * minBuffSize, TEST_MODE);
+        byte data[] = new byte[minBuffSize];
         // -------- test --------------
         track.write(data, OFFSET_DEFAULT, data.length);
         track.write(data, OFFSET_DEFAULT, data.length);
@@ -964,8 +964,8 @@
         // -------- initialization --------------
         int minBuffSize = AudioTrack.getMinBufferSize(TEST_SR, TEST_CONF, TEST_FORMAT);
         AudioTrack track = new AudioTrack(TEST_STREAM_TYPE, TEST_SR, TEST_CONF, TEST_FORMAT,
-                minBuffSize, TEST_MODE);
-        byte data[] = new byte[minBuffSize / 2];
+                2 * minBuffSize, TEST_MODE);
+        byte data[] = new byte[minBuffSize];
         int outputSR = AudioTrack.getNativeOutputSampleRate(TEST_STREAM_TYPE);
         // -------- test --------------
         track.write(data, OFFSET_DEFAULT, data.length);
@@ -1028,8 +1028,8 @@
         // -------- initialization --------------
         int minBuffSize = AudioTrack.getMinBufferSize(TEST_SR, TEST_CONF, TEST_FORMAT);
         AudioTrack track = new AudioTrack(TEST_STREAM_TYPE, TEST_SR, TEST_CONF, TEST_FORMAT,
-                minBuffSize, TEST_MODE);
-        byte data[] = new byte[minBuffSize / 2];
+                2 * minBuffSize, TEST_MODE);
+        byte data[] = new byte[minBuffSize];
         // -------- test --------------
         track.write(data, OFFSET_DEFAULT, data.length);
         track.write(data, OFFSET_DEFAULT, data.length);
@@ -2620,4 +2620,4 @@
         }
     }
 
-}
\ No newline at end of file
+}
diff --git a/tests/tests/media/src/android/media/cts/MediaRecorderTest.java b/tests/tests/media/src/android/media/cts/MediaRecorderTest.java
index e5dc1ff..78c8ed9 100644
--- a/tests/tests/media/src/android/media/cts/MediaRecorderTest.java
+++ b/tests/tests/media/src/android/media/cts/MediaRecorderTest.java
@@ -37,6 +37,7 @@
 public class MediaRecorderTest extends ActivityInstrumentationTestCase2<MediaStubActivity> {
 
     private final String OUTPUT_PATH;
+    private final String OUTPUT_PATH2;
     private static final int RECORD_TIME = 3000;
     private static final int VIDEO_WIDTH = 320;
     private static final int VIDEO_HEIGHT = 240;
@@ -46,6 +47,7 @@
     private boolean mOnInfoCalled;
     private boolean mOnErrorCalled;
     private File mOutFile;
+    private File mOutFile2;
     private Camera mCamera;
 
     /*
@@ -61,11 +63,14 @@
         super("com.android.cts.stub", MediaStubActivity.class);
         OUTPUT_PATH = new File(Environment.getExternalStorageDirectory(),
                 "record.out").getAbsolutePath();
+        OUTPUT_PATH2 = new File(Environment.getExternalStorageDirectory(),
+                "record2.out").getAbsolutePath();
     }
 
     @Override
     protected void setUp() throws Exception {
         mOutFile = new File(OUTPUT_PATH);
+        mOutFile2 = new File(OUTPUT_PATH2);
         mMediaRecorder.reset();
         mMediaRecorder.setOutputFile(OUTPUT_PATH);
         mMediaRecorder.setOnInfoListener(new OnInfoListener() {
@@ -87,6 +92,9 @@
         if (mOutFile != null && mOutFile.exists()) {
             mOutFile.delete();
         }
+        if (mOutFile2 != null && mOutFile2.exists()) {
+            mOutFile2.delete();
+        }
         if (mCamera != null)  {
             mCamera.release();
         }
@@ -250,15 +258,16 @@
     public void testRecorderVideo() throws Exception {
         mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
         mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.DEFAULT);
+        mMediaRecorder.setOutputFile(OUTPUT_PATH2);
         mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.DEFAULT);
         mMediaRecorder.setPreviewDisplay(getActivity().getSurfaceHolder().getSurface());
         mMediaRecorder.setVideoFrameRate(FRAME_RATE);
         mMediaRecorder.setVideoSize(VIDEO_WIDTH, VIDEO_HEIGHT);
-        FileOutputStream fos = new FileOutputStream(OUTPUT_PATH);
+        FileOutputStream fos = new FileOutputStream(OUTPUT_PATH2);
         FileDescriptor fd = fos.getFD();
         mMediaRecorder.setOutputFile(fd);
         long maxFileSize = MAX_FILE_SIZE * 10;
-        recordMedia(maxFileSize);
+        recordMedia(maxFileSize, mOutFile2);
     }
 
     @TestTargets({
@@ -317,8 +326,9 @@
         mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
         assertEquals(0, mMediaRecorder.getMaxAmplitude());
         mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
+        mMediaRecorder.setOutputFile(OUTPUT_PATH);
         mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
-        recordMedia(MAX_FILE_SIZE);
+        recordMedia(MAX_FILE_SIZE, mOutFile);
     }
 
     @TestTargets({
@@ -431,22 +441,21 @@
         mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
         mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
 
-        recordMedia(MAX_FILE_SIZE);
+        recordMedia(MAX_FILE_SIZE, mOutFile);
         // TODO: how can we trigger a recording error?
         assertFalse(mOnErrorCalled);
     }
 
-    private void recordMedia(long maxFileSize) throws Exception {
+    private void recordMedia(long maxFileSize, File outFile) throws Exception {
         mMediaRecorder.setMaxFileSize(maxFileSize);
         mMediaRecorder.prepare();
         mMediaRecorder.start();
         Thread.sleep(RECORD_TIME);
         mMediaRecorder.stop();
-        assertTrue(mOutFile.exists());
+        assertTrue(outFile.exists());
         // The max file size is always guaranteed.
         // We just make sure that the margin is not too big
-        assertTrue(mOutFile.length() < 1.1 * maxFileSize);
-        assertTrue(mOutFile.length() > 0);
+        assertTrue(outFile.length() < 1.1 * maxFileSize);
+        assertTrue(outFile.length() > 0);
     }
-
 }
diff --git a/tests/tests/net/src/android/net/cts/ConnectivityManagerTest.java b/tests/tests/net/src/android/net/cts/ConnectivityManagerTest.java
index edcea9a..3b85e9f 100644
--- a/tests/tests/net/src/android/net/cts/ConnectivityManagerTest.java
+++ b/tests/tests/net/src/android/net/cts/ConnectivityManagerTest.java
@@ -22,20 +22,35 @@
 import dalvik.annotation.TestTargets;
 import dalvik.annotation.ToBeFixed;
 
+import android.content.BroadcastReceiver;
 import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.content.pm.PackageManager;
 import android.net.ConnectivityManager;
 import android.net.NetworkInfo;
 import android.net.NetworkInfo.DetailedState;
 import android.net.NetworkInfo.State;
+import android.net.wifi.WifiManager;
 import android.test.AndroidTestCase;
+import android.util.Log;
+
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
 
 @TestTargetClass(ConnectivityManager.class)
 public class ConnectivityManagerTest extends AndroidTestCase {
 
+    private static final String TAG = ConnectivityManagerTest.class.getSimpleName();
+
+    private static final String FEATURE_ENABLE_HIPRI = "enableHIPRI";
+
     public static final int TYPE_MOBILE = ConnectivityManager.TYPE_MOBILE;
     public static final int TYPE_WIFI = ConnectivityManager.TYPE_WIFI;
     private static final int HOST_ADDRESS = 0x7f000001;// represent ip 127.0.0.1
     private ConnectivityManager mCm;
+    private WifiManager mWifiManager;
+    private PackageManager mPackageManager;
     // must include both mobile data + wifi
     private static final int MIN_NUM_NETWORK_TYPES = 2;
 
@@ -43,6 +58,8 @@
     protected void setUp() throws Exception {
         super.setUp();
         mCm = (ConnectivityManager) getContext().getSystemService(Context.CONNECTIVITY_SERVICE);
+        mWifiManager = (WifiManager) getContext().getSystemService(Context.WIFI_SERVICE);
+        mPackageManager = getContext().getPackageManager();
     }
 
     @TestTargetNew(
@@ -204,8 +221,8 @@
 
         NetworkInfo[] ni = mCm.getAllNetworkInfo();
         for (NetworkInfo n : ni) {
-            // make sure network is up
-            if (n.isConnected()) {
+            // make sure network is up (except WIFI due to always fail)
+            if (n.isConnected() && (n.getType() != TYPE_WIFI)) {
                 assertTrue(mCm.requestRouteToHost(n.getType(), HOST_ADDRESS));
             }
         }
@@ -235,4 +252,91 @@
     public void testTest() {
         mCm.getBackgroundDataSetting();
     }
+
+    /** Test that hipri can be brought up when Wifi is enabled. */
+    public void testStartUsingNetworkFeature_enableHipri() throws Exception {
+        if (!mPackageManager.hasSystemFeature(PackageManager.FEATURE_TELEPHONY)
+                || !mPackageManager.hasSystemFeature(PackageManager.FEATURE_WIFI)) {
+            // This test requires a mobile data connection and WiFi.
+            return;
+        }
+
+        boolean isWifiConnected = mWifiManager.isWifiEnabled()
+                && mWifiManager.getConnectionInfo().getSSID() != null;
+
+        try {
+            // Make sure WiFi is connected to an access point.
+            if (!isWifiConnected) {
+                connectToWifi();
+            }
+
+            // Register a receiver that will capture the connectivity change for hipri.
+            ConnectivityActionReceiver receiver =
+                    new ConnectivityActionReceiver(ConnectivityManager.TYPE_MOBILE_HIPRI);
+            IntentFilter filter = new IntentFilter();
+            filter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);
+            mContext.registerReceiver(receiver, filter);
+
+            // Try to start using the hipri feature...
+            int result = mCm.startUsingNetworkFeature(ConnectivityManager.TYPE_MOBILE,
+                    FEATURE_ENABLE_HIPRI);
+            assertTrue("Couldn't start using the HIPRI feature.", result != -1);
+
+            // Check that the ConnectivityManager reported that it connected using hipri...
+            assertTrue("Couldn't connect using hipri...", receiver.waitForConnection());
+
+            assertTrue("Couldn't requestRouteToHost using HIPRI.",
+                    mCm.requestRouteToHost(ConnectivityManager.TYPE_MOBILE_HIPRI, HOST_ADDRESS));
+
+        } catch (InterruptedException e) {
+            fail("Broadcast receiver waiting for ConnectivityManager interrupted.");
+        } finally {
+            mCm.stopUsingNetworkFeature(ConnectivityManager.TYPE_MOBILE,
+                    FEATURE_ENABLE_HIPRI);
+            if (!isWifiConnected) {
+                mWifiManager.setWifiEnabled(false);
+            }
+        }
+    }
+
+    private void connectToWifi() throws InterruptedException {
+        ConnectivityActionReceiver receiver =
+                new ConnectivityActionReceiver(ConnectivityManager.TYPE_WIFI);
+        IntentFilter filter = new IntentFilter();
+        filter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);
+        mContext.registerReceiver(receiver, filter);
+
+        assertTrue(mWifiManager.setWifiEnabled(true));
+        assertTrue("Wifi must be configured to connect to an access point for this test.",
+                receiver.waitForConnection());
+
+        mContext.unregisterReceiver(receiver);
+    }
+
+    /** Receiver that captures the last connectivity change's network type and state. */
+    private class ConnectivityActionReceiver extends BroadcastReceiver {
+
+        private final CountDownLatch mReceiveLatch = new CountDownLatch(1);
+
+        private final int mNetworkType;
+
+        ConnectivityActionReceiver(int networkType) {
+            mNetworkType = networkType;
+        }
+
+        public void onReceive(Context context, Intent intent) {
+            NetworkInfo networkInfo = intent.getExtras()
+                    .getParcelable(ConnectivityManager.EXTRA_NETWORK_INFO);
+            int networkType = networkInfo.getType();
+            State networkState = networkInfo.getState();
+            Log.i(TAG, "Network type: " + networkType + " state: " + networkState);
+            if (networkType == mNetworkType && networkInfo.getState() == State.CONNECTED) {
+                mReceiveLatch.countDown();
+            }
+        }
+
+        public boolean waitForConnection() throws InterruptedException {
+            return mReceiveLatch.await(10, TimeUnit.SECONDS);
+        }
+    }
 }
diff --git a/tests/tests/net/src/android/net/wifi/cts/WifiInfoTest.java b/tests/tests/net/src/android/net/wifi/cts/WifiInfoTest.java
index 42243c8..d6d7d8e 100644
--- a/tests/tests/net/src/android/net/wifi/cts/WifiInfoTest.java
+++ b/tests/tests/net/src/android/net/wifi/cts/WifiInfoTest.java
@@ -20,7 +20,6 @@
 import dalvik.annotation.TestTargetClass;
 import dalvik.annotation.TestTargetNew;
 import dalvik.annotation.TestTargets;
-import dalvik.annotation.ToBeFixed;
 
 import android.content.BroadcastReceiver;
 import android.content.Context;
@@ -168,8 +167,6 @@
             args = {}
         )
     })
-    @ToBeFixed(bug="1871573", explanation="android.net.wifi.WifiInfo#getNetworkId() return -1 when"
-        + " there is wifi connection")
     public void testWifiInfoProperties() throws Exception {
         // this test case should in Wifi environment
         WifiInfo wifiInfo = mWifiManager.getConnectionInfo();
@@ -187,8 +184,7 @@
         wifiInfo.getMacAddress();
         setWifiEnabled(false);
         Thread.sleep(DURATION);
-        wifiInfo = mWifiManager.getConnectionInfo();
-        assertEquals(-1, wifiInfo.getNetworkId());
+        assertEquals(WifiManager.WIFI_STATE_DISABLED, mWifiManager.getWifiState());
     }
 
 }
diff --git a/tests/tests/os/src/android/os/cts/BuildVersionTest.java b/tests/tests/os/src/android/os/cts/BuildVersionTest.java
index 61e1837..bbea5b7 100644
--- a/tests/tests/os/src/android/os/cts/BuildVersionTest.java
+++ b/tests/tests/os/src/android/os/cts/BuildVersionTest.java
@@ -21,19 +21,28 @@
 import android.os.Build;
 import android.util.Log;
 
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.Set;
+
 import junit.framework.TestCase;
 
 @TestTargetClass(Build.VERSION.class)
 public class BuildVersionTest extends TestCase {
 
     private static final String LOG_TAG = "BuildVersionTest";
-    private static final String EXPECTED_RELEASE = "2.2.1";
-    private static final String EXPECTED_SDK = "8";
+    private static final Set<String> EXPECTED_RELEASES =
+        new HashSet<String>(Arrays.asList("2.2", "2.2.1", "2.2.2"));
+    private static final int EXPECTED_SDK = 8;
 
     public void testReleaseVersion() {
         // Applications may rely on the exact release version
-        assertEquals(EXPECTED_RELEASE, Build.VERSION.RELEASE);
-        assertEquals(EXPECTED_SDK, Build.VERSION.SDK);
+        assertTrue("Your Build.VERSION.RELEASE of " + Build.VERSION.RELEASE
+                + " was not one of the following: " + EXPECTED_RELEASES,
+                        EXPECTED_RELEASES.contains(Build.VERSION.RELEASE));
+
+        assertEquals("" + EXPECTED_SDK, Build.VERSION.SDK);
+        assertEquals(EXPECTED_SDK, Build.VERSION.SDK_INT);
     }
 
     /**
diff --git a/tests/tests/permission/src/android/permission/cts/NoActivityRelatedPermissionTest.java b/tests/tests/permission/src/android/permission/cts/NoActivityRelatedPermissionTest.java
index 39da4b6..2d11883 100644
--- a/tests/tests/permission/src/android/permission/cts/NoActivityRelatedPermissionTest.java
+++ b/tests/tests/permission/src/android/permission/cts/NoActivityRelatedPermissionTest.java
@@ -16,19 +16,14 @@
 
 package android.permission.cts;
 
-import dalvik.annotation.BrokenTest;
 import dalvik.annotation.TestTargetClass;
 
 import android.app.Activity;
 import android.app.ActivityManager;
-import android.app.AlertDialog;
 import android.content.Context;
 import android.test.ActivityInstrumentationTestCase2;
 import android.test.UiThreadTest;
 import android.test.suitebuilder.annotation.MediumTest;
-import android.test.suitebuilder.annotation.Suppress;
-import android.view.WindowManager;
-import android.view.WindowManager.BadTokenException;
 
 /**
  * Verify the Activity related operations require specific permissions.
@@ -50,47 +45,6 @@
     }
 
     /**
-     * Verify that adding window of different types in Window Manager requires permissions.
-     * <p>Requires Permission:
-     *   {@link android.Manifest.permission#SYSTEM_ALERT_WINDOW}.
-     */
-    @UiThreadTest
-    @MediumTest
-    @Suppress
-    @BrokenTest("This test passes, but crashes the UI thread later on. See issues 1909470, 1910487")
-    public void testSystemAlertWindow() {
-        final int[] types = new int[] {
-                WindowManager.LayoutParams.TYPE_PHONE,
-                WindowManager.LayoutParams.TYPE_PRIORITY_PHONE,
-                WindowManager.LayoutParams.TYPE_SYSTEM_ALERT,
-                WindowManager.LayoutParams.TYPE_SYSTEM_ERROR,
-                WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY,
-            };
-
-        AlertDialog dialog = (AlertDialog) (mActivity.getDialog());
-        // Use normal window type will success
-        dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_APPLICATION);
-        dialog.show();
-
-        // Test special window types which need to be check SYSTEM_ALERT_WINDOW
-        // permission.
-        for (int i = 0; i < types.length; i++) {
-            dialog = (AlertDialog) (mActivity.getDialog());
-            dialog.getWindow().setType(types[i]);
-            try {
-                dialog.show();
-                // This throws an exception as expected, but only after already adding
-                // a new view to the view hierarchy. This later results in a NullPointerException
-                // when the activity gets destroyed. Since that crashes the UI thread and causes
-                // test runs to abort, this test is currently excluded.
-                fail("Add dialog to Window Manager did not throw BadTokenException as expected");
-            } catch (BadTokenException e) {
-                // Expected
-            }
-        }
-    }
-
-    /**
      * Verify that setting Activity's persistent attribute requires permissions.
      * <p>Requires Permission:
      *   {@link android.Manifest.permission#PERSISTENT_ACTIVITY}.
diff --git a/tests/tests/permission/src/android/permission/cts/NoCallPermissionTest.java b/tests/tests/permission/src/android/permission/cts/NoCallPermissionTest.java
index 6e86967..88d5f1c 100644
--- a/tests/tests/permission/src/android/permission/cts/NoCallPermissionTest.java
+++ b/tests/tests/permission/src/android/permission/cts/NoCallPermissionTest.java
@@ -17,6 +17,7 @@
 package android.permission.cts;
 
 import android.content.Intent;
+import android.content.pm.PackageManager;
 import android.net.Uri;
 import android.test.AndroidTestCase;
 import android.test.suitebuilder.annotation.SmallTest;
@@ -33,14 +34,17 @@
      */
     @SmallTest
     public void testActionCall() {
-        Uri uri = Uri.parse("tel:123456");
-        Intent intent = new Intent(Intent.ACTION_CALL, uri);
-        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
-        try {
-            mContext.startActivity(intent);
-            fail("startActivity(Intent.ACTION_CALL) did not throw SecurityException as expected");
-        } catch (SecurityException e) {
-            // expected
+        PackageManager packageManager = getContext().getPackageManager();
+        if (packageManager.hasSystemFeature(PackageManager.FEATURE_TELEPHONY)) {
+            Uri uri = Uri.parse("tel:123456");
+            Intent intent = new Intent(Intent.ACTION_CALL, uri);
+            intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+            try {
+                mContext.startActivity(intent);
+                fail("startActivity(Intent.ACTION_CALL) did not throw SecurityException as expected");
+            } catch (SecurityException e) {
+                // expected
+            }
         }
     }
 
@@ -51,17 +55,20 @@
      */
     @SmallTest
     public void testCallVoicemail() {
-        try {
-            //Intent intent = new Intent(Intent.ACTION_CALL_PRIVILEGED,
-            Intent intent = new Intent("android.intent.action.CALL_PRIVILEGED",
-                    Uri.fromParts("voicemail", "", null));
-            intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
-            mContext.startActivity(intent);
-            fail("startActivity(Intent.ACTION_CALL_PRIVILEGED) did not throw SecurityException as expected");
-        } catch (SecurityException e) {
-            // expected
+        PackageManager packageManager = getContext().getPackageManager();
+        if (packageManager.hasSystemFeature(PackageManager.FEATURE_TELEPHONY)) {
+            try {
+                //Intent intent = new Intent(Intent.ACTION_CALL_PRIVILEGED,
+                Intent intent = new Intent("android.intent.action.CALL_PRIVILEGED",
+                        Uri.fromParts("voicemail", "", null));
+                intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+                mContext.startActivity(intent);
+                fail("startActivity(Intent.ACTION_CALL_PRIVILEGED) did not throw SecurityException as expected");
+            } catch (SecurityException e) {
+                // expected
+            }
         }
-    }
+     }
 
     /**
      * Verify that Intent.ACTION_CALL_PRIVILEGED requires permissions.
@@ -70,14 +77,19 @@
      */
     @SmallTest
     public void testCall911() {
-        //Intent intent = new Intent(Intent.ACTION_CALL_PRIVILEGED, Uri.parse("tel:911"));
-        Intent intent = new Intent("android.intent.action.CALL_PRIVILEGED", Uri.parse("tel:911"));
-        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
-        try {
-            mContext.startActivity(intent);
-            fail("startActivity(Intent.ACTION_CALL_PRIVILEGED) did not throw SecurityException as expected");
-        } catch (SecurityException e) {
-            // expected
+        PackageManager packageManager = getContext().getPackageManager();
+        if (packageManager.hasSystemFeature(PackageManager.FEATURE_TELEPHONY)) {
+            //Intent intent = new Intent(Intent.ACTION_CALL_PRIVILEGED, Uri.parse("tel:911"));
+            Intent intent = new Intent("android.intent.action.CALL_PRIVILEGED",
+                    Uri.parse("tel:911"));
+            intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+            try {
+                mContext.startActivity(intent);
+                fail("startActivity(Intent.ACTION_CALL_PRIVILEGED) did not throw " +
+                        "SecurityException as expected");
+            } catch (SecurityException e) {
+               // expected
+           }
         }
     }
 
diff --git a/tests/tests/permission2/src/android/permission2/cts/NoReceiveSmsPermissionTest.java b/tests/tests/permission2/src/android/permission2/cts/NoReceiveSmsPermissionTest.java
index 7b14db7..f34e380 100755
--- a/tests/tests/permission2/src/android/permission2/cts/NoReceiveSmsPermissionTest.java
+++ b/tests/tests/permission2/src/android/permission2/cts/NoReceiveSmsPermissionTest.java
@@ -22,6 +22,7 @@
 import android.content.Context;
 import android.content.Intent;
 import android.content.IntentFilter;
+import android.content.pm.PackageManager;
 import android.telephony.SmsManager;
 import android.telephony.TelephonyManager;
 import android.test.AndroidTestCase;
@@ -51,6 +52,11 @@
      * Note: this test requires that the device under test reports a valid phone number
      */
     public void testReceiveTextMessage() {
+        PackageManager packageManager = mContext.getPackageManager();
+        if (!packageManager.hasSystemFeature(PackageManager.FEATURE_TELEPHONY)) {
+            return;
+        }
+
         // register our test receiver to receive SMSs. This won't throw a SecurityException,
         // so test needs to wait to determine if it actual receives an SMS
         // admittedly, this is a weak verification
diff --git a/tests/tests/telephony/src/android/telephony/cts/SmsManagerTest.java b/tests/tests/telephony/src/android/telephony/cts/SmsManagerTest.java
index 3f75f94..c201fb7 100644
--- a/tests/tests/telephony/src/android/telephony/cts/SmsManagerTest.java
+++ b/tests/tests/telephony/src/android/telephony/cts/SmsManagerTest.java
@@ -16,20 +16,24 @@
 
 package android.telephony.cts;
 
-import java.util.ArrayList;
+import dalvik.annotation.TestLevel;
+import dalvik.annotation.TestTargetClass;
+import dalvik.annotation.TestTargetNew;
+import dalvik.annotation.TestTargets;
 
 import android.app.PendingIntent;
 import android.content.BroadcastReceiver;
 import android.content.Context;
 import android.content.Intent;
 import android.content.IntentFilter;
-import android.telephony.TelephonyManager;
+import android.content.pm.PackageManager;
 import android.telephony.SmsManager;
+import android.telephony.TelephonyManager;
 import android.test.AndroidTestCase;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
 
 /**
  * Tests for {@link android.telephony.SmsManager}.
@@ -50,6 +54,18 @@
     private static final String SMS_SEND_ACTION = "CTS_SMS_SEND_ACTION";
     private static final String SMS_DELIVERY_ACTION = "CTS_SMS_DELIVERY_ACTION";
 
+    // List of network operators that doesn't support Data(binary) SMS message
+    private static final List<String> UNSUPPORT_DATA_SMS_MESSAGES =
+            Arrays.asList(
+                    "44010"    // NTT DOCOMO
+            );
+
+    // List of network operators that doesn't support Maltipart SMS message
+    private static final List<String> UNSUPPORT_MULTIPART_SMS_MESSAGES =
+            Arrays.asList(
+                    "44010"    // NTT DOCOMO
+            );
+
     private TelephonyManager mTelephonyManager;
     private String mDestAddr;
     private String mText;
@@ -104,6 +120,12 @@
         )
     })
     public void testSendMessages() throws InterruptedException {
+        PackageManager packageManager = mContext.getPackageManager();
+        if (!packageManager.hasSystemFeature(PackageManager.FEATURE_TELEPHONY)) {
+            return;
+        }
+
+        String mccmnc = mTelephonyManager.getSimOperator();
 
         mSendIntent = new Intent(SMS_SEND_ACTION);
         mDeliveryIntent = new Intent(SMS_DELIVERY_ACTION);
@@ -129,27 +151,37 @@
         }
 
         // send data sms
-        byte[] data = mText.getBytes();
-        short port = 19989;
+        if (!UNSUPPORT_DATA_SMS_MESSAGES.contains(mccmnc)) {
+            byte[] data = mText.getBytes();
+            short port = 19989;
 
-        init();
-        sendDataMessage(mDestAddr, port, data, mSentIntent, mDeliveredIntent);
-        mSendReceiver.waitForCalls(1, TIME_OUT);
-        mDeliveryReceiver.waitForCalls(1, TIME_OUT);
+            init();
+            sendDataMessage(mDestAddr, port, data, mSentIntent, mDeliveredIntent);
+            mSendReceiver.waitForCalls(1, TIME_OUT);
+            mDeliveryReceiver.waitForCalls(1, TIME_OUT);
+        } else {
+            // This GSM network doesn't support Data(binary) SMS message.
+            // Skip the test.
+        }
 
         // send multi parts text sms
-        init();
-        ArrayList<String> parts = divideMessage(LONG_TEXT);
-        int numParts = parts.size();
-        ArrayList<PendingIntent> sentIntents = new ArrayList<PendingIntent>();
-        ArrayList<PendingIntent> deliveryIntents = new ArrayList<PendingIntent>();
-        for (int i = 0; i < numParts; i++) {
-            sentIntents.add(PendingIntent.getBroadcast(getContext(), 0, mSendIntent, 0));
-            deliveryIntents.add(PendingIntent.getBroadcast(getContext(), 0, mDeliveryIntent, 0));
+        if (!UNSUPPORT_MULTIPART_SMS_MESSAGES.contains(mccmnc)) {
+            init();
+            ArrayList<String> parts = divideMessage(LONG_TEXT);
+            int numParts = parts.size();
+            ArrayList<PendingIntent> sentIntents = new ArrayList<PendingIntent>();
+            ArrayList<PendingIntent> deliveryIntents = new ArrayList<PendingIntent>();
+            for (int i = 0; i < numParts; i++) {
+                sentIntents.add(PendingIntent.getBroadcast(getContext(), 0, mSendIntent, 0));
+                deliveryIntents.add(PendingIntent.getBroadcast(getContext(), 0, mDeliveryIntent, 0));
+            }
+            sendMultiPartTextMessage(mDestAddr, parts, sentIntents, deliveryIntents);
+            mSendReceiver.waitForCalls(numParts, TIME_OUT);
+            mDeliveryReceiver.waitForCalls(numParts, TIME_OUT);
+        } else {
+            // This GSM network doesn't support Multipart SMS message.
+            // Skip the test.
         }
-        sendMultiPartTextMessage(mDestAddr, parts, sentIntents, deliveryIntents);
-        mSendReceiver.waitForCalls(numParts, TIME_OUT);
-        mDeliveryReceiver.waitForCalls(numParts, TIME_OUT);
     }
 
     private void init() {
diff --git a/tests/tests/text/src/android/text/method/cts/MultiTapKeyListenerTest.java b/tests/tests/text/src/android/text/method/cts/MultiTapKeyListenerTest.java
old mode 100644
new mode 100755
index 175047e..d9bf6d9
--- a/tests/tests/text/src/android/text/method/cts/MultiTapKeyListenerTest.java
+++ b/tests/tests/text/src/android/text/method/cts/MultiTapKeyListenerTest.java
@@ -176,8 +176,7 @@
         callOnKeyDown(keyListener, KeyEvent.KEYCODE_1, 1);
         assertEquals("Hi.", mTextView.getText().toString());
 
-        callOnKeyDown(keyListener, KeyEvent.KEYCODE_POUND, 1);
-        assertEquals("Hi. ", mTextView.getText().toString());
+        addSpace();
 
         callOnKeyDown(keyListener, KeyEvent.KEYCODE_2, 2);
         assertEquals("Hi. B", mTextView.getText().toString());
@@ -201,8 +200,7 @@
         callOnKeyDown(keyListener, KeyEvent.KEYCODE_4, 3);
         assertEquals("Hi", mTextView.getText().toString());
 
-        callOnKeyDown(keyListener, KeyEvent.KEYCODE_POUND, 1);
-        assertEquals("Hi ", mTextView.getText().toString());
+        addSpace();
 
         callOnKeyDown(keyListener, KeyEvent.KEYCODE_2, 2);
         assertEquals("Hi B", mTextView.getText().toString());
@@ -245,6 +243,15 @@
         }
     }
 
+    private void addSpace() {
+        mActivity.runOnUiThread(new Runnable() {
+            public void run() {
+                mTextView.append(" ");
+            }
+        });
+        mInstrumentation.waitForIdleSync();
+    }
+
     @TestTargetNew(
         level = TestLevel.COMPLETE,
         method = "getInstance",
diff --git a/tests/tests/text/src/android/text/method/cts/PasswordTransformationMethodTest.java b/tests/tests/text/src/android/text/method/cts/PasswordTransformationMethodTest.java
old mode 100644
new mode 100755
index 6058cdd..ed7be70
--- a/tests/tests/text/src/android/text/method/cts/PasswordTransformationMethodTest.java
+++ b/tests/tests/text/src/android/text/method/cts/PasswordTransformationMethodTest.java
@@ -28,6 +28,7 @@
 import android.test.ActivityInstrumentationTestCase2;
 import android.text.Editable;
 import android.text.method.PasswordTransformationMethod;
+import android.view.KeyCharacterMap;
 import android.view.View;
 import android.view.animation.cts.DelayedCheck;
 import android.widget.Button;
@@ -145,7 +146,16 @@
         });
 
         mMethod.reset();
-        sendKeys("H E 2*L O");
+        // 12-key support
+        KeyCharacterMap keymap
+                = KeyCharacterMap.load(KeyCharacterMap.BUILT_IN_KEYBOARD);
+        if (keymap.getKeyboardType() == KeyCharacterMap.NUMERIC) {
+            // "HELLO" in case of 12-key(NUMERIC) keyboard
+            sendKeys("6*4 6*3 7*5 DPAD_RIGHT 7*5 7*6 DPAD_RIGHT");
+        }
+        else {
+            sendKeys("H E 2*L O");
+        }
         assertTrue(mMethod.hasCalledBeforeTextChanged());
         assertTrue(mMethod.hasCalledOnTextChanged());
         assertTrue(mMethod.hasCalledAfterTextChanged());
diff --git a/tests/tests/view/src/android/view/cts/VelocityTrackerTest.java b/tests/tests/view/src/android/view/cts/VelocityTrackerTest.java
index 3ba3a9b..35254b6 100644
--- a/tests/tests/view/src/android/view/cts/VelocityTrackerTest.java
+++ b/tests/tests/view/src/android/view/cts/VelocityTrackerTest.java
@@ -96,10 +96,10 @@
         VelocityTracker vt = VelocityTracker.obtain();
         assertNotNull(vt);
 
-        MotionEvent me = MotionEvent.obtain(0L, 1, 1, .0f, .0f, 0);
+        MotionEvent me = MotionEvent.obtain(0L, 10, 1, .0f, .0f, 0);
 
         vt.clear();
-        me.addBatch(2L, 2, 2, .0f, .0f, 0);
+        me.addBatch(20L, 20, 20, .0f, .0f, 0);
         vt.addMovement(me);
         vt.computeCurrentVelocity(1);
         XVelocity = 2.0f;
@@ -112,7 +112,7 @@
         assertEquals(XVelocity, vt.getXVelocity(), ERROR_TOLERANCE);
         assertEquals(YVelocity, vt.getYVelocity(), ERROR_TOLERANCE);
 
-        for (int i = 3; i < 10; i++) {
+        for (int i = 30; i < 100; i += 10) {
             me.addBatch((long)i, (float)i, (float)i, .0f, .0f, 0);
         }
         vt.clear();
@@ -124,7 +124,7 @@
         assertEquals(YVelocity, vt.getYVelocity(), ERROR_TOLERANCE);
 
         vt.clear();
-        me.addBatch(10L, 10, 10, .0f, .0f, 0);
+        me.addBatch(100L, 100, 100, .0f, .0f, 0);
         vt.addMovement(me);
         vt.computeCurrentVelocity(1);
         XVelocity = 1.1562872f;
diff --git a/tests/tests/view/src/android/view/cts/ViewTest.java b/tests/tests/view/src/android/view/cts/ViewTest.java
index 77624e8..74a5f8c 100644
--- a/tests/tests/view/src/android/view/cts/ViewTest.java
+++ b/tests/tests/view/src/android/view/cts/ViewTest.java
@@ -571,6 +571,7 @@
         runTestOnUiThread(new Runnable() {
             public void run() {
                 view.requestLayout();
+                view.invalidate();
             }
         });
         getInstrumentation().waitForIdleSync();
@@ -2276,8 +2277,14 @@
         assertFalse(view.hasWindowFocus());
 
         // mAttachInfo is not null
-        view = mActivity.findViewById(R.id.fit_windows);
-        assertTrue(view.hasWindowFocus());
+        final View view2 = mActivity.findViewById(R.id.fit_windows);
+        // Wait until the window has been focused.
+        new DelayedCheck(TIMEOUT_DELTA) {
+            @Override
+            protected boolean check() {
+                return view2.hasWindowFocus();
+            }
+        }.run();
     }
 
     @TestTargetNew(
@@ -3946,6 +3953,7 @@
                 fitWindowsView.requestFocus();
             }
         });
+        getInstrumentation().waitForIdleSync();
         assertTrue(mockView.isFocusableInTouchMode());
         assertFalse(fitWindowsView.isFocusableInTouchMode());
         assertTrue(mockView.isFocusable());
@@ -3963,12 +3971,14 @@
                 mockView.requestFocus();
             }
         });
+        getInstrumentation().waitForIdleSync();
         assertTrue(mockView.isFocused());
         runTestOnUiThread(new Runnable() {
             public void run() {
                 fitWindowsView.requestFocus();
             }
         });
+        getInstrumentation().waitForIdleSync();
         assertFalse(fitWindowsView.isFocused());
         assertTrue(mockView.isInTouchMode());
         assertTrue(fitWindowsView.isInTouchMode());
@@ -3982,6 +3992,7 @@
                 fitWindowsView.requestFocus();
             }
         });
+        getInstrumentation().waitForIdleSync();
         assertFalse(mockView.isFocused());
         assertTrue(fitWindowsView.isFocused());
         assertFalse(mockView.isInTouchMode());
@@ -4438,6 +4449,14 @@
 
         viewGroup.addView(editText);
         editText.requestFocus();
+
+        new DelayedCheck(TIMEOUT_DELTA) {
+            @Override
+            protected boolean check() {
+                return editText.isFocused();
+            }
+        }.run();
+
         imm.showSoftInput(editText, 0);
         assertTrue(editText.hasCalledOnCreateInputConnection());
         assertTrue(editText.hasCalledOnCheckIsTextEditor());
diff --git a/tests/tests/view/src/android/view/cts/WindowTest.java b/tests/tests/view/src/android/view/cts/WindowTest.java
old mode 100644
new mode 100755
index 527f444..c851a19
--- a/tests/tests/view/src/android/view/cts/WindowTest.java
+++ b/tests/tests/view/src/android/view/cts/WindowTest.java
@@ -39,6 +39,7 @@
 import android.util.DisplayMetrics;
 import android.view.accessibility.AccessibilityEvent;
 import android.view.Gravity;
+import android.view.KeyCharacterMap;
 import android.view.KeyEvent;
 import android.view.LayoutInflater;
 import android.view.Menu;
@@ -578,10 +579,19 @@
             }
         });
         mInstrumentation.waitForIdleSync();
-        assertTrue(mWindow.isShortcutKey(KeyEvent.KEYCODE_Q, new KeyEvent(KeyEvent.ACTION_DOWN,
-                KeyEvent.KEYCODE_Q)));
-        assertFalse(mWindow.isShortcutKey(KeyEvent.KEYCODE_F, new KeyEvent(KeyEvent.ACTION_DOWN,
-                KeyEvent.KEYCODE_F)));
+        KeyCharacterMap keymap
+                = KeyCharacterMap.load(KeyCharacterMap.BUILT_IN_KEYBOARD);
+        if (keymap.getKeyboardType() == KeyCharacterMap.NUMERIC) {
+            assertTrue(mWindow.isShortcutKey(KeyEvent.KEYCODE_1, new KeyEvent(KeyEvent.ACTION_DOWN,
+                    KeyEvent.KEYCODE_1)));
+            assertFalse(mWindow.isShortcutKey(KeyEvent.KEYCODE_5, new KeyEvent(KeyEvent.ACTION_DOWN,
+                    KeyEvent.KEYCODE_5)));
+        } else {
+            assertTrue(mWindow.isShortcutKey(KeyEvent.KEYCODE_Q, new KeyEvent(KeyEvent.ACTION_DOWN,
+                    KeyEvent.KEYCODE_Q)));
+            assertFalse(mWindow.isShortcutKey(KeyEvent.KEYCODE_F, new KeyEvent(KeyEvent.ACTION_DOWN,
+                    KeyEvent.KEYCODE_F)));
+        }
     }
 
     @TestTargets({
diff --git a/tests/tests/view/src/android/view/inputmethod/cts/BaseInputConnectionTest.java b/tests/tests/view/src/android/view/inputmethod/cts/BaseInputConnectionTest.java
old mode 100644
new mode 100755
index f5f2286..1ec2003
--- a/tests/tests/view/src/android/view/inputmethod/cts/BaseInputConnectionTest.java
+++ b/tests/tests/view/src/android/view/inputmethod/cts/BaseInputConnectionTest.java
@@ -31,6 +31,7 @@
 import android.text.Spannable;
 import android.text.SpannableString;
 import android.text.TextUtils;
+import android.view.KeyCharacterMap;
 import android.view.KeyEvent;
 import android.view.View;
 import android.view.Window;
@@ -325,7 +326,17 @@
         args = {KeyEvent.class}
     )
     public void testSendKeyEvent() {
-        mConnection.sendKeyEvent(new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_Q));
+        // 12-key support
+        KeyCharacterMap keymap
+                = KeyCharacterMap.load(KeyCharacterMap.BUILT_IN_KEYBOARD);
+        if (keymap.getKeyboardType() == KeyCharacterMap.NUMERIC) {
+            // 'Q' in case of 12-key(NUMERIC) keyboard
+            mConnection.sendKeyEvent(new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_7));
+            mConnection.sendKeyEvent(new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_7));
+        }
+        else {
+            mConnection.sendKeyEvent(new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_Q));
+        }
         new DelayedCheck() {
             @Override
             protected boolean check() {
diff --git a/tests/tests/webkit/src/android/webkit/cts/CacheManagerTest.java b/tests/tests/webkit/src/android/webkit/cts/CacheManagerTest.java
index 3e9a073..5a62c9b 100644
--- a/tests/tests/webkit/src/android/webkit/cts/CacheManagerTest.java
+++ b/tests/tests/webkit/src/android/webkit/cts/CacheManagerTest.java
@@ -32,6 +32,7 @@
 
 @TestTargetClass(android.webkit.CacheManager.class)
 public class CacheManagerTest extends ActivityInstrumentationTestCase2<WebViewStubActivity> {
+    private static final long CACHEMANAGER_INIT_TIMEOUT = 5000l;
     private static final long NETWORK_OPERATION_DELAY = 10000l;
 
     private WebView mWebView;
@@ -96,6 +97,14 @@
         mWebServer = new CtsTestServer(getActivity());
         final String url = mWebServer.getAssetUrl(TestHtmlConstants.EMBEDDED_IMG_URL);
 
+        // Wait for CacheManager#init() finish.
+        new DelayedCheck(CACHEMANAGER_INIT_TIMEOUT) {
+            @Override
+            protected boolean check() {
+                return CacheManager.getCacheFileBaseDir() != null;
+            }
+        }.run();
+
         mWebView.clearCache(true);
         new DelayedCheck(NETWORK_OPERATION_DELAY) {
             @Override
diff --git a/tests/tests/webkit/src/android/webkit/cts/WebChromeClientTest.java b/tests/tests/webkit/src/android/webkit/cts/WebChromeClientTest.java
index b95f9c2..795ed61 100644
--- a/tests/tests/webkit/src/android/webkit/cts/WebChromeClientTest.java
+++ b/tests/tests/webkit/src/android/webkit/cts/WebChromeClientTest.java
@@ -126,7 +126,7 @@
         WebIconDatabase mIconDb = WebIconDatabase.getInstance();
         String dbPath = getActivity().getFilesDir().toString() + "/icons";
         mIconDb.open(dbPath);
-        Thread.sleep(250);
+        Thread.sleep(3000);
         mIconDb.removeAllIcons();
 
         assertFalse(webChromeClient.hadOnReceivedIcon());
diff --git a/tests/tests/webkit/src/android/webkit/cts/WebViewClientTest.java b/tests/tests/webkit/src/android/webkit/cts/WebViewClientTest.java
index 49d68c6..0de14e7 100644
--- a/tests/tests/webkit/src/android/webkit/cts/WebViewClientTest.java
+++ b/tests/tests/webkit/src/android/webkit/cts/WebViewClientTest.java
@@ -31,7 +31,8 @@
 import android.webkit.WebSettings;
 import android.webkit.WebView;
 import android.webkit.WebViewClient;
-
+import android.webkit.WebChromeClient;
+ 
 @TestTargetClass(android.webkit.WebViewClient.class)
 public class WebViewClientTest extends ActivityInstrumentationTestCase2<WebViewStubActivity> {
     private static final long TEST_TIMEOUT = 5000;
@@ -47,6 +48,7 @@
     protected void setUp() throws Exception {
         super.setUp();
         mWebView = getActivity().getWebView();
+        mWebView.setWebChromeClient(new WebChromeClient());
     }
 
     @Override
diff --git a/tests/tests/widget/src/android/widget/cts/AdapterViewTest.java b/tests/tests/widget/src/android/widget/cts/AdapterViewTest.java
old mode 100644
new mode 100755
index 97a5753..12815b2
--- a/tests/tests/widget/src/android/widget/cts/AdapterViewTest.java
+++ b/tests/tests/widget/src/android/widget/cts/AdapterViewTest.java
@@ -310,8 +310,9 @@
         setArrayAdapter(mAdapterView);
 
         // LastVisiblePosition should be adapter's getCount - 1,by mocking method
-        // TODO: the +50 is a gross hack
-        mAdapterView.layout(0, 0, LAYOUT_WIDTH, LAYOUT_HEIGHT+50);
+        float density = mActivity.getResources().getDisplayMetrics().density;
+        int bottom = (int) (LAYOUT_HEIGHT * density);
+        mAdapterView.layout(0, 0, LAYOUT_WIDTH, bottom);
         assertEquals(FRUIT.length - 1, mAdapterView.getLastVisiblePosition());
     }
 
diff --git a/tests/tests/widget/src/android/widget/cts/AutoCompleteTextViewTest.java b/tests/tests/widget/src/android/widget/cts/AutoCompleteTextViewTest.java
old mode 100644
new mode 100755
index a8c9ae0..40e1c74
--- a/tests/tests/widget/src/android/widget/cts/AutoCompleteTextViewTest.java
+++ b/tests/tests/widget/src/android/widget/cts/AutoCompleteTextViewTest.java
@@ -29,6 +29,7 @@
 import android.test.UiThreadTest;
 import android.util.AttributeSet;
 import android.util.Xml;
+import android.view.KeyCharacterMap;
 import android.view.KeyEvent;
 import android.view.View;
 import android.view.ViewGroup;
@@ -64,6 +65,7 @@
     /** The m instrumentation. */
     private Instrumentation mInstrumentation;
     private AutoCompleteTextView mAutoCompleteTextView;
+    private boolean mNumeric = false;
     ArrayAdapter<String> mAdapter;
     private final String[] WORDS = new String[] { "testOne", "testTwo", "testThree", "testFour" };
     boolean isOnFilterComplete = false;
@@ -95,6 +97,11 @@
                 .findViewById(R.id.autocompletetv_edit);
         mAdapter = new ArrayAdapter<String>(mActivity,
                 android.R.layout.simple_dropdown_item_1line, WORDS);
+        KeyCharacterMap keymap
+                = KeyCharacterMap.load(KeyCharacterMap.BUILT_IN_KEYBOARD);
+        if (keymap.getKeyboardType() == KeyCharacterMap.NUMERIC) {
+            mNumeric = true;
+        }
     }
 
     @TestTargets({
@@ -501,7 +508,13 @@
 
         inflatePopup();
         assertTrue(mAutoCompleteTextView.isPopupShowing());
-        String testString = "tes";
+        String testString = "";
+        if (mNumeric) {
+            // "tes" in case of 12-key(NUMERIC) keyboard
+            testString = "8337777";
+        } else {
+            testString = "tes";
+        }
         // Test the filter if the input string is not long enough to threshold
         runTestOnUiThread(new Runnable() {
             public void run() {
@@ -517,7 +530,12 @@
 
         inflatePopup();
         assertTrue(mAutoCompleteTextView.isPopupShowing());
-        testString = "that";
+        if (mNumeric) {
+            // "that" in case of 12-key(NUMERIC) keyboard
+            testString = "84428";
+        } else {
+            testString = "that";
+        }
         mInstrumentation.sendStringSync(testString);
         assertFalse(mAutoCompleteTextView.isPopupShowing());
 
@@ -529,7 +547,12 @@
                 mAutoCompleteTextView.setText("");
             }
         });
-        mInstrumentation.sendStringSync("test");
+        if (mNumeric) {
+            // "test" in case of 12-key(NUMERIC) keyboard
+            mInstrumentation.sendStringSync("83377778");
+        } else {
+            mInstrumentation.sendStringSync("test");
+        }
         assertTrue(mAutoCompleteTextView.hasFocus());
         assertTrue(mAutoCompleteTextView.hasWindowFocus());
         // give some time for UI to settle
@@ -594,10 +617,18 @@
 
         // performFiltering will be indirectly invoked by onKeyDown
         assertNull(filter.getResult());
-        mInstrumentation.sendStringSync(STRING_TEST);
-        // give some time for UI to settle
-        Thread.sleep(100);
-        assertEquals(STRING_TEST, filter.getResult());
+        // 12-key support
+        if (mNumeric) {
+            // "numeric" in case of 12-key(NUMERIC) keyboard
+            mInstrumentation.sendStringSync("6688633777444222");
+            Thread.sleep(100);
+            assertEquals("numeric", filter.getResult());
+        } else {
+            mInstrumentation.sendStringSync(STRING_TEST);
+            // give some time for UI to settle
+            Thread.sleep(100);
+            assertEquals(STRING_TEST, filter.getResult());
+        }
     }
 
     @TestTargets({
diff --git a/tests/tests/widget/src/android/widget/cts/DialerFilterTest.java b/tests/tests/widget/src/android/widget/cts/DialerFilterTest.java
old mode 100644
new mode 100755
index 0b436b2..661d257
--- a/tests/tests/widget/src/android/widget/cts/DialerFilterTest.java
+++ b/tests/tests/widget/src/android/widget/cts/DialerFilterTest.java
@@ -37,6 +37,7 @@
 import android.util.AttributeSet;
 import android.util.Log;
 import android.util.Xml;
+import android.view.KeyCharacterMap;
 import android.view.KeyEvent;
 import android.widget.DialerFilter;
 import android.widget.EditText;
@@ -129,7 +130,16 @@
         });
         mInstrumentation.waitForIdleSync();
 
-        mInstrumentation.sendStringSync("adg");
+        // 12-key support
+        KeyCharacterMap keymap
+                = KeyCharacterMap.load(KeyCharacterMap.BUILT_IN_KEYBOARD);
+        if (keymap.getKeyboardType() == KeyCharacterMap.NUMERIC) {
+            // "adg" in case of 12-key(NUMERIC) keyboard
+            mInstrumentation.sendStringSync("234");
+        }
+        else {
+            mInstrumentation.sendStringSync("adg");
+        }
         assertEquals("ADG", mDialerFilter.getLetters().toString());
         assertEquals("", mDialerFilter.getDigits().toString());
 
@@ -141,7 +151,14 @@
         });
         mInstrumentation.waitForIdleSync();
 
-        mInstrumentation.sendStringSync("adg");
+        // 12-key support
+        if (keymap.getKeyboardType() == KeyCharacterMap.NUMERIC) {
+            // "adg" in case of 12-key(NUMERIC) keyboard
+            mInstrumentation.sendStringSync("234");
+        }
+        else {
+            mInstrumentation.sendStringSync("adg");
+        }
         assertEquals("ADG", mDialerFilter.getLetters().toString());
         // A, D, K may map to numbers on some keyboards. Don't test.
 
diff --git a/tools/dx-tests/Android.mk b/tools/dx-tests/Android.mk
index 9dee47d..9bdef58 100644
--- a/tools/dx-tests/Android.mk
+++ b/tools/dx-tests/Android.mk
@@ -38,7 +38,7 @@
 	@echo "Copy: $(PRIVATE_MODULE) ($@)"
 	$(copy-file-to-new-target)
 	$(hide) chmod 755 $@
-	@$(PRIVATE_CURRENT_MODULE_SCRIPT) "$(PRIVATE_BASE)" "$(HOST_JAVAC)" "$(PRIVATE_INTERMEDIATES)" "$(HOST_OUT_JAVA_LIBRARIES)/dx.jar:$(HOST_OUT_JAVA_LIBRARIES)/cfassembler.jar"
+	@$(PRIVATE_CURRENT_MODULE_SCRIPT) "$(PRIVATE_BASE)" "$(HOST_JAVAC)" "$(PRIVATE_INTERMEDIATES)" "$(HOST_OUT_JAVA_LIBRARIES)/dx.jar:$(HOST_OUT_JAVA_LIBRARIES)/cfassembler.jar" "$(HOST_OUT)"
 
 # cfassembler host module
 #============================================================
diff --git a/tools/dx-tests/etc/compileall b/tools/dx-tests/etc/compileall
index 42b198e..cb95b4e 100755
--- a/tools/dx-tests/etc/compileall
+++ b/tools/dx-tests/etc/compileall
@@ -54,6 +54,7 @@
 javac=$2
 tmpdir=$3 # ANDROID_BUILD_TOP/$3
 dxjarpath=$4
+outdir=$5
 project_src=$project_home/src
 project_lib=$project_home/lib
 project_data=$project_home/data
@@ -103,7 +104,7 @@
 javac -d $javac_out -classpath $project_lib/junit.jar:$javac_out -sourcepath $mainfilesdir \@$mainfileslist
 
 # now copy relevant data from intermediates dir to its final destination
-fdest=$ANDROID_BUILD_TOP/out/target/common/cts/dxconverter
+fdest=$outdir/cts/dxconverter
 mkdir -p $fdest/data
 acp -r $javac_out $fdest/
 acp $mainfilesdir/data/scriptdata $fdest/data/scriptdata
diff --git a/tools/dx-tests/etc/starttests b/tools/dx-tests/etc/starttests
index e43a00a..afa55a8 100755
--- a/tools/dx-tests/etc/starttests
+++ b/tools/dx-tests/etc/starttests
@@ -74,7 +74,7 @@
 debug_opts="-Xcheck:jni"
 exe=$base/system/bin/dalvikvm
 bpath=$framework/core.jar
-BASEDIR=$ANDROID_BUILD_TOP/out/target/common/cts/dxconverter
+BASEDIR=$progdir/../cts/dxconverter
 
 echo "--------------------------------------------------"
 echo "DX Converter Test Suite"
diff --git a/tools/host/src/com/android/cts/Version.java b/tools/host/src/com/android/cts/Version.java
index c1b5d39..4fd2529 100644
--- a/tools/host/src/com/android/cts/Version.java
+++ b/tools/host/src/com/android/cts/Version.java
@@ -18,7 +18,7 @@
 
 public class Version {
     // The CTS version string
-    private static final String version = "2.2_r4";
+    private static final String version = "2.2_r5";
 
     private Version() {
         // no instances allowed
diff --git a/tools/utils/CollectAllTests.java b/tools/utils/CollectAllTests.java
index 7628ba2..539cf8d 100644
--- a/tools/utils/CollectAllTests.java
+++ b/tools/utils/CollectAllTests.java
@@ -302,6 +302,11 @@
         return getAnnotation(testClass, testName, SUPPRESSED_TEST) != null;
     }
 
+    private boolean hasSideEffects(final Class<? extends TestCase> testClass,
+            final String testName) {
+        return getAnnotation(testClass, testName, SIDE_EFFECT) != null;
+    }
+
     private String getAnnotation(final Class<? extends TestCase> testClass,
             final String testName, final String annotationName) {
         try {
@@ -349,6 +354,9 @@
         } else if (isSuppressed(test.getClass(), testName)) {
             System.out.println("ignoring suppressed test: " + test);
             return;
+        } else if (hasSideEffects(test.getClass(), testName)) {
+            System.out.println("ignoring test with side effects: " + test);
+            return;
         }
 
         if (!testName.startsWith("test")) {
diff --git a/tools/utils/DescriptionGenerator.java b/tools/utils/DescriptionGenerator.java
index 99be6dc..2d58543 100644
--- a/tools/utils/DescriptionGenerator.java
+++ b/tools/utils/DescriptionGenerator.java
@@ -65,6 +65,7 @@
     static final String HOST_CONTROLLER = "dalvik.annotation.HostController";
     static final String KNOWN_FAILURE = "dalvik.annotation.KnownFailure";
     static final String BROKEN_TEST = "dalvik.annotation.BrokenTest";
+    static final String SIDE_EFFECT = "dalvik.annotation.SideEffect";
     static final String SUPPRESSED_TEST = "android.test.suitebuilder.annotation.Suppress";
 
     static final String JUNIT_TEST_CASE_CLASS_NAME = "junit.framework.testcase";
diff --git a/tools/utils/startcts b/tools/utils/startcts
index af9d503..dc1e930 100755
--- a/tools/utils/startcts
+++ b/tools/utils/startcts
@@ -46,26 +46,35 @@
     fi;
 }
 
+checkPath() {
+    if ! type -P $1 &> /dev/null; then
+        echo "Unable to find $1 in path."
+        exit
+    fi;
+}
+
 checkDir ${CTS_ROOT} "Error: Cannot locate CTS in \"${CTS_DIR}\". Please check your configuration in $0"
-checkDir ${SDK_ROOT} "Error: Cannot locate SDK installation in \"${SDK_ROOT}\". Please check your configuration in $0"
+checkDir ${SDK_ROOT} "Error: Cannot locate SDK installation in \"${SDK_ROOT}\".  Please check your configuration in $0"
 
 DDM_LIB=${SDK_ROOT}/tools/lib/ddmlib.jar
 CTS_LIB=${CTS_ROOT}/tools/cts.jar
 JUNIT_LIB=${CTS_ROOT}/tools/junit.jar
 HOSTTEST_LIB=${CTS_ROOT}/tools/hosttestlib.jar
 CTS_TEST_ANNOTATIONS_HOST_LIB=${CTS_ROOT}/tools/CtsTestAnnotationsHostLib.jar
-ADB_PATH=${SDK_ROOT}/tools
-ADB_EXE=${ADB_PATH}/adb
 
 checkFile ${DDM_LIB}
 checkFile ${CTS_LIB}
 checkFile ${JUNIT_LIB}
 checkFile ${HOSTTEST_LIB}
-checkFile ${ADB_EXE}
 
 JARS=${CTS_LIB}:${DDM_LIB}:${JUNIT_LIB}:${HOSTTEST_LIB}:${CTS_TEST_ANNOTATIONS_HOST_LIB}
 
-PATH=${ADB_PATH}:${PATH}
+# Check both tools and platform-tools for ADB.
+if [ -n "${SDK_ROOT}" ]; then
+  PATH=${SDK_ROOT}/platform-tools:${SDK_ROOT}/tools:${PATH}
+fi
+
+checkPath adb
 
 # options for the JVM
 JAVA_OPTS="-Xmx512M"