Merge "Merge remote branch 'korg/froyo' into froyomerge" into gingerbread
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/media/src/android/media/cts/MediaRecorderTest.java b/tests/tests/media/src/android/media/cts/MediaRecorderTest.java
index a9e1c33..ead3d62 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 = 176;
     private static final int VIDEO_HEIGHT = 144;
@@ -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();
             mCamera = null;
@@ -251,15 +259,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({
@@ -318,8 +327,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({
@@ -432,22 +442,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 be47953..12cc21e 100644
--- a/tests/tests/net/src/android/net/cts/ConnectivityManagerTest.java
+++ b/tests/tests/net/src/android/net/cts/ConnectivityManagerTest.java
@@ -16,8 +16,6 @@
 
 package android.net.cts;
 
-import com.android.internal.telephony.Phone;
-
 import dalvik.annotation.TestLevel;
 import dalvik.annotation.TestTargetClass;
 import dalvik.annotation.TestTargetNew;
@@ -233,7 +231,7 @@
             fail("Broadcast receiver waiting for ConnectivityManager interrupted.");
         } finally {
             mCm.stopUsingNetworkFeature(ConnectivityManager.TYPE_MOBILE,
-                    Phone.FEATURE_ENABLE_HIPRI);
+                    FEATURE_ENABLE_HIPRI);
             if (!isWifiConnected) {
                 mWifiManager.setWifiEnabled(false);
             }
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/ViewTest.java b/tests/tests/view/src/android/view/cts/ViewTest.java
index e07e105..91242cf 100644
--- a/tests/tests/view/src/android/view/cts/ViewTest.java
+++ b/tests/tests/view/src/android/view/cts/ViewTest.java
@@ -3926,6 +3926,7 @@
                 fitWindowsView.requestFocus();
             }
         });
+        getInstrumentation().waitForIdleSync();
         assertTrue(mockView.isFocusableInTouchMode());
         assertFalse(fitWindowsView.isFocusableInTouchMode());
         assertTrue(mockView.isFocusable());
@@ -3943,12 +3944,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());
@@ -3962,6 +3965,7 @@
                 fitWindowsView.requestFocus();
             }
         });
+        getInstrumentation().waitForIdleSync();
         assertFalse(mockView.isFocused());
         assertTrue(fitWindowsView.isFocused());
         assertFalse(mockView.isInTouchMode());
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 0e31888..88edecf
--- a/tests/tests/view/src/android/view/cts/WindowTest.java
+++ b/tests/tests/view/src/android/view/cts/WindowTest.java
@@ -40,6 +40,7 @@
 import android.view.accessibility.AccessibilityEvent;
 import android.view.Gravity;
 import android.view.InputQueue;
+import android.view.KeyCharacterMap;
 import android.view.KeyEvent;
 import android.view.LayoutInflater;
 import android.view.Menu;
@@ -580,10 +581,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/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.