Merge "Move android.tv out of CtsTestStubs" into lmp-dev
diff --git a/CtsTestCaseList.mk b/CtsTestCaseList.mk
index d9af12e..2be82a4 100644
--- a/CtsTestCaseList.mk
+++ b/CtsTestCaseList.mk
@@ -13,21 +13,21 @@
 # limitations under the License.
 
 cts_security_apps_list := \
-	CtsAppAccessData \
-	CtsAppWithData \
-	CtsExternalStorageApp \
-	CtsInstrumentationAppDiffCert \
-	CtsPermissionDeclareApp \
-	CtsPermissionDeclareAppCompat \
-	CtsReadExternalStorageApp \
-	CtsSharedUidInstall \
-	CtsSharedUidInstallDiffCert \
-	CtsSimpleAppInstall \
-	CtsSimpleAppInstallDiffCert \
-	CtsTargetInstrumentationApp \
-	CtsUsePermissionDiffCert \
-	CtsWriteExternalStorageApp \
-	CtsMultiUserStorageApp
+    CtsAppAccessData \
+    CtsAppWithData \
+    CtsExternalStorageApp \
+    CtsInstrumentationAppDiffCert \
+    CtsPermissionDeclareApp \
+    CtsPermissionDeclareAppCompat \
+    CtsReadExternalStorageApp \
+    CtsSharedUidInstall \
+    CtsSharedUidInstallDiffCert \
+    CtsSimpleAppInstall \
+    CtsSimpleAppInstallDiffCert \
+    CtsTargetInstrumentationApp \
+    CtsUsePermissionDiffCert \
+    CtsWriteExternalStorageApp \
+    CtsMultiUserStorageApp
 
 cts_support_packages := \
     CtsAccelerationTestStubs \
@@ -39,6 +39,7 @@
     CtsDeviceUi \
     CtsMonkeyApp \
     CtsMonkeyApp2 \
+    CtsProfileOwnerApp \
     CtsSomeAccessibilityServices \
     CtsTestStubs \
     CtsThemeDeviceApp \
@@ -49,13 +50,14 @@
     $(cts_security_apps_list)
 
 cts_external_packages := \
-	com.replica.replicaisland
+    com.replica.replicaisland \
+    com.drawelements.deqp
 
 # Any APKs that need to be copied to the CTS distribution's testcases
 # directory but do not require an associated test package XML.
 CTS_TEST_CASE_LIST := \
-	$(cts_support_packages) \
-	$(cts_external_packages)
+    $(cts_support_packages) \
+    $(cts_external_packages)
 
 # Test packages that require an associated test package XML.
 cts_test_packages := \
@@ -91,6 +93,7 @@
     CtsJniTestCases \
     CtsKeystoreTestCases \
     CtsLocationTestCases \
+    CtsLocation2TestCases \
     CtsMediaStressTestCases \
     CtsMediaTestCases \
     CtsNativeOpenGLTestCases \
@@ -111,7 +114,7 @@
     CtsSaxTestCases \
     CtsSecurityTestCases \
     CtsSpeechTestCases \
-    CtsTelecommTestCases \
+    CtsTelecomTestCases \
     CtsTelephonyTestCases \
     CtsTextTestCases \
     CtsTextureViewTestCases \
@@ -127,23 +130,25 @@
 
 # All APKs that need to be scanned by the coverage utilities.
 CTS_COVERAGE_TEST_CASE_LIST := \
-	$(cts_support_packages) \
-	$(cts_test_packages)
+    $(cts_support_packages) \
+    $(cts_test_packages)
 
 # Host side only tests
 cts_host_libraries := \
     CtsAdbTests \
     CtsAppSecurityTests \
+    CtsDevicePolicyManagerTestCases \
     CtsHostJank \
     CtsHostUi \
     CtsMonkeyTestCases \
     CtsThemeHostTestCases \
+    CtsSecurityHostTestCases \
     CtsUsbTests
 
 # Native test executables that need to have associated test XMLs.
 cts_native_exes := \
-	NativeMediaTest_SL \
-	NativeMediaTest_XA \
+    NativeMediaTest_SL \
+    NativeMediaTest_XA \
 
 ifeq ($(HOST_OS)-$(HOST_ARCH),$(filter $(HOST_OS)-$(HOST_ARCH),linux-x86 linux-x86_64))
 cts_native_exes += bionic-unit-tests-cts
@@ -178,7 +183,9 @@
     $(call cts-get-test-xmls,$(cts_test_packages)) \
     $(call cts-get-test-xmls,$(cts_native_exes)) \
     $(call cts-get-test-xmls,$(cts_target_junit_tests)) \
-    $(call cts-get-test-xmls,$(cts_ui_tests))
+    $(call cts-get-test-xmls,$(cts_ui_tests)) \
+    external/deqp/android/cts/com.drawelements.deqp.gles3.xml \
+    external/deqp/android/cts/com.drawelements.deqp.gles31.xml
 
 # The following files will be placed in the tools directory of the CTS distribution
 CTS_TOOLS_LIST :=
diff --git a/apps/CtsVerifier/AndroidManifest.xml b/apps/CtsVerifier/AndroidManifest.xml
index 5f6dd0d..e151325 100644
--- a/apps/CtsVerifier/AndroidManifest.xml
+++ b/apps/CtsVerifier/AndroidManifest.xml
@@ -21,7 +21,7 @@
       android:versionName="L_r0">
 
     <!-- Using 10+ for more complete NFC support... -->
-    <uses-sdk android:minSdkVersion="19"></uses-sdk>
+    <uses-sdk android:minSdkVersion="20" android:targetSdkVersion="20"/>
 
     <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
     <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
@@ -47,7 +47,7 @@
     <uses-feature android:name="android.hardware.usb.accessory" />
     <uses-permission android:name="android.permission.CALL_PHONE" />
     <uses-permission android:name="android.permission.READ_PHONE_STATE" />
-    <uses-feature android:name="android.hardware.telephony" android:required="false" />
+    <uses-feature android:name="android.software.connectionservice" android:required="false" />
 
     <!-- Needed by the Audio Quality Verifier to store the sound samples that will be mailed. -->
     <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
@@ -760,6 +760,16 @@
             <meta-data android:name="test_category" android:value="@string/test_category_sensors"/>
         </activity>
 
+        <activity android:name=".sensors.SensorBatchingTestsActivity"
+                  android:label="@string/snsr_sensor_batching_tests"
+                  android:screenOrientation="nosensor">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN"/>
+                <category android:name="android.cts.intent.category.MANUAL_TEST"/>
+            </intent-filter>
+            <meta-data android:name="test_category" android:value="@string/test_category_sensors"/>
+        </activity>
+
         <activity android:name=".sensors.SensorIntegrationTestsActivity"
                   android:label="@string/snsr_sensor_integration_tests">
             <intent-filter>
@@ -1139,30 +1149,64 @@
                  android:label="@string/projection_service_name"
                  android:process=":projectionservice" />
 
-        <activity android:name=".telecomm.TelecommTestActivity"
-                  android:label="@string/telecomm_test_title">
+        <activity android:name=".telecom.TelecomTestActivity"
+                  android:label="@string/telecom_test_title">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
                 <category android:name="android.cts.intent.category.MANUAL_TEST" />
             </intent-filter>
-            <meta-data android:name="test_category" android:value="@string/test_category_telecomm" />
+            <meta-data android:name="test_category" android:value="@string/test_category_telecom" />
+            <meta-data android:name="test_required_features" android:value="android.software.connectionservice"/>
         </activity>
 
-        <activity android:name=".telecomm.CancelCallTestActivity"
-                  android:label="@string/telecomm_cancel_call_title">
+        <activity android:name=".telecom.CancelCallTestActivity"
+                  android:label="@string/telecom_cancel_call_title">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
                 <category android:name="android.cts.intent.category.MANUAL_TEST" />
             </intent-filter>
-            <meta-data android:name="test_category" android:value="@string/test_category_telecomm" />
-            <meta-data android:name="test_parent" android:value="com.android.cts.verifier.telecomm.TelecommTestActivity" />
-            <meta-data android:name="test_required_features" android:value="android.hardware.telephony"/>
+            <meta-data android:name="test_category" android:value="@string/test_category_telecom" />
+            <meta-data android:name="test_parent" android:value="com.android.cts.verifier.telecom.TelecomTestActivity" />
         </activity>
 
-        <service android:name=".telecomm.CancelCallTestActivity$CancellingConnectionService"
+        <service android:name=".telecom.CancelCallTestActivity$ConnectionService"
                  android:permission="android.permission.BIND_CONNECTION_SERVICE">
             <intent-filter>
-                <action android:name="android.telecomm.ConnectionService" />
+                <action android:name="android.telecom.ConnectionService" />
+            </intent-filter>
+        </service>
+
+        <activity android:name=".telecom.FailedCallTestActivity"
+                  android:label="@string/telecom_failed_call_title">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="android.cts.intent.category.MANUAL_TEST" />
+            </intent-filter>
+            <meta-data android:name="test_category" android:value="@string/test_category_telecom" />
+            <meta-data android:name="test_parent" android:value="com.android.cts.verifier.telecom.TelecomTestActivity" />
+        </activity>
+
+        <service android:name=".telecom.FailedCallTestActivity$ConnectionService"
+                 android:permission="android.permission.BIND_CONNECTION_SERVICE">
+            <intent-filter>
+                <action android:name="android.telecom.ConnectionService" />
+            </intent-filter>
+        </service>
+
+        <activity android:name=".telecom.BasicCallTestActivity"
+                  android:label="@string/telecom_basic_call_title">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="android.cts.intent.category.MANUAL_TEST" />
+            </intent-filter>
+            <meta-data android:name="test_category" android:value="@string/test_category_telecom" />
+            <meta-data android:name="test_parent" android:value="com.android.cts.verifier.telecom.TelecomTestActivity" />
+        </activity>
+
+        <service android:name=".telecom.BasicCallTestActivity$ConnectionService"
+                 android:permission="android.permission.BIND_CONNECTION_SERVICE">
+            <intent-filter>
+                <action android:name="android.telecom.ConnectionService" />
             </intent-filter>
         </service>
 
diff --git a/apps/CtsVerifier/res/layout/list_content.xml b/apps/CtsVerifier/res/layout/list_content.xml
new file mode 100644
index 0000000..8670283
--- /dev/null
+++ b/apps/CtsVerifier/res/layout/list_content.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<!--
+  ~ Copyright (C) 2014 The Android Open Source Project
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License
+  -->
+<android.support.wearable.view.BoxInsetLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent">
+
+    <ListView
+        android:id="@android:id/list"
+        app:layout_box="all"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent" />
+</android.support.wearable.view.BoxInsetLayout>
diff --git a/apps/CtsVerifier/res/layout/snsr_instruction.xml b/apps/CtsVerifier/res/layout/snsr_instruction.xml
index 66c7386..e7369c7 100644
--- a/apps/CtsVerifier/res/layout/snsr_instruction.xml
+++ b/apps/CtsVerifier/res/layout/snsr_instruction.xml
@@ -14,6 +14,7 @@
      limitations under the License.
 -->
 <TextView xmlns:android="http://schemas.android.com/apk/res/android"
+        android:textColor="?android:attr/textColorSecondary"
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
         android:paddingBottom="@dimen/snsr_log_padding_bottom"
diff --git a/apps/CtsVerifier/res/layout/snsr_message.xml b/apps/CtsVerifier/res/layout/snsr_message.xml
new file mode 100644
index 0000000..cef35ca
--- /dev/null
+++ b/apps/CtsVerifier/res/layout/snsr_message.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2014 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<TextView xmlns:android="http://schemas.android.com/apk/res/android"
+        android:textStyle="italic"
+        android:textColor="?android:attr/textColorTertiary"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:paddingTop="@dimen/snsr_log_padding_top"
+        android:paddingLeft="@dimen/snsr_boxed_padding_left"
+        android:paddingRight="@dimen/snsr_boxed_padding_right"
+        android:paddingBottom="@dimen/snsr_log_padding_bottom" />
diff --git a/apps/CtsVerifier/res/layout/snsr_test_title.xml b/apps/CtsVerifier/res/layout/snsr_test_title.xml
index 2a458e7..374fb54 100644
--- a/apps/CtsVerifier/res/layout/snsr_test_title.xml
+++ b/apps/CtsVerifier/res/layout/snsr_test_title.xml
@@ -14,10 +14,11 @@
      limitations under the License.
 -->
 <TextView xmlns:android="http://schemas.android.com/apk/res/android"
+        android:textStyle="bold"
+        android:textColor="?android:attr/textColorPrimary"
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
         android:paddingBottom="@dimen/snsr_boxed_padding_bottom"
         android:paddingTop="@dimen/snsr_boxed_padding_top"
         android:paddingLeft="@dimen/snsr_boxed_padding_left"
-        android:paddingRight="@dimen/snsr_boxed_padding_right"
-        android:textStyle="bold" />
+        android:paddingRight="@dimen/snsr_boxed_padding_right" />
diff --git a/apps/CtsVerifier/res/layout/telecom_test_activity.xml b/apps/CtsVerifier/res/layout/telecom_test_activity.xml
new file mode 100644
index 0000000..9ca7cde
--- /dev/null
+++ b/apps/CtsVerifier/res/layout/telecom_test_activity.xml
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2014 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+                android:layout_width="match_parent"
+                android:layout_height="match_parent"
+                android:orientation="vertical"
+                android:padding="10dip" >
+    <Button android:id="@+id/open_settings"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:text="@string/telecom_open_settings" />
+    <EditText android:id="@+id/phone_number"
+              android:layout_width="match_parent"
+              android:layout_height="wrap_content"
+              android:text="@string/telecom_default_phone_number"
+              android:hint="@string/telecom_phone_number_hint" />
+    <Button android:id="@+id/simulate_call"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:text="@string/telecom_simulate_call" />
+    <include layout="@layout/pass_fail_buttons" />
+</LinearLayout>
\ No newline at end of file
diff --git a/apps/CtsVerifier/res/layout/telecomm_test_activity.xml b/apps/CtsVerifier/res/layout/telecomm_test_activity.xml
deleted file mode 100644
index e5cebe1..0000000
--- a/apps/CtsVerifier/res/layout/telecomm_test_activity.xml
+++ /dev/null
@@ -1,30 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2014 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-
-          http://www.apache.org/licenses/LICENSE-2.0
-
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
--->
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-                android:layout_width="match_parent"
-                android:layout_height="match_parent"
-                android:orientation="vertical"
-                android:padding="10dip" >
-    <Button android:id="@+id/open_settings"
-            android:layout_width="match_parent"
-            android:layout_height="wrap_content"
-            android:text="@string/telecomm_open_settings" />
-    <Button android:id="@+id/simulate_call"
-            android:layout_width="match_parent"
-            android:layout_height="wrap_content"
-            android:text="@string/telecomm_simulate_call" />
-    <include layout="@layout/pass_fail_buttons" />
-</LinearLayout>
\ No newline at end of file
diff --git a/apps/CtsVerifier/res/values/attrs.xml b/apps/CtsVerifier/res/values/attrs.xml
new file mode 100644
index 0000000..71a1ba6
--- /dev/null
+++ b/apps/CtsVerifier/res/values/attrs.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="utf-8"?><!--
+  ~ Copyright (C) 2014 The Android Open Source Project
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License
+  -->
+<resources>
+    <declare-styleable name="BoxInsetLayout_Layout">
+        <attr name="layout_box">
+            <flag name="left" value="0x01" />
+            <flag name="top" value="0x02" />
+            <flag name="right" value="0x04" />
+            <flag name="bottom" value="0x08" />
+            <flag name="all" value="0x0F" />
+        </attr>
+    </declare-styleable>
+</resources>
\ No newline at end of file
diff --git a/apps/CtsVerifier/res/values/strings.xml b/apps/CtsVerifier/res/values/strings.xml
index 4882946..ea86111 100644
--- a/apps/CtsVerifier/res/values/strings.xml
+++ b/apps/CtsVerifier/res/values/strings.xml
@@ -432,7 +432,6 @@
     <string name="snsr_executing_test">\nExecuting test case \'%1$s\'..\n</string>
     <string name="snsr_orientation_portrait">[Device orientation]: Portrait.</string>
     <string name="snsr_orientation_landscape">[Device orientation]: Landscape.</string>
-    <string name="snsr_register_listener">Expected to be able to register sensor listener. Found=%b.</string>
 
     <!-- Strings to interact with users in Sensor Tests -->
     <string name="snsr_test_play_sound">A sound will be played once the verification is complete...</string>
@@ -517,8 +516,6 @@
     <string name="snsr_batch_test">Sensor Batching Tests</string>
     <string name="snsr_batching_walking_needed">Once the test begins, you will have to walk.</string>
     <string name="snsr_batching_fifo_count">FifoReservedEventCount=%1$d. Expected to be at most FifoMaxEventCount=%2$d.</string>
-    <string name="snsr_batching_first_event_arrival">Batched events expected to arrive after %1$d ns. Found=%2$d ns.</string>
-    <string name="snsr_batching_flush_complete">Event \'onFlushComplete\' expected. Found=%1$b.</string>
 
     <!-- Sensor Synchronization -->
     <string name="snsr_synch_test">Sensor Synchronization Test</string>
@@ -555,6 +552,7 @@
     <string name="snsr_single_sensor_tests">CTS Single Sensor Tests</string>
     <string name="snsr_sensor_integration_tests">CTS Sensor Integration Tests</string>
     <string name="snsr_sensor_test">CTS Sensor Test</string>
+    <string name="snsr_sensor_batching_tests">CTS Sensor Batching Tests</string>
 
     <!-- Strings for Sample Test Activities -->
     <string name="share_button_text">Share</string>
@@ -1121,17 +1119,29 @@
     <string name="snsr_rotation_vector_set_final">Place the device back to the reference position.</string>
     <string name="snsr_rotation_vector_verification">Angular deviation [%1$4.1f %2$4.1f %3$4.1f]. Current: %4$f deg. Max tolerated: %5$f.</string>
 
-    <string name="test_category_telecomm">Telecomm</string>
-    <string name="telecomm_test_title">Telecomm Tests</string>
-    <string name="telecomm_test_summary">These tests cover aspects of Telecomm call routing.
+    <string name="test_category_telecom">Telecom</string>
+    <string name="telecom_test_title">Telecom Tests</string>
+    <string name="telecom_test_summary">These tests cover aspects of Telecom call routing.
         These tests may be run in any order, but each one will require user input before it can be run.
     </string>
-    <string name="telecomm_open_settings">Open settings</string>
-    <string name="telecomm_simulate_call">Place call</string>
-    <string name="telecomm_cancel_call_title">Canceled Call Test</string>
-    <string name="telecomm_cancel_call_info">This tests to make sure that canceled calls are handled correctly.
+    <string name="telecom_open_settings">Open settings</string>
+    <string name="telecom_simulate_call">Place call</string>
+    <string name="telecom_default_phone_number">555-263-7643</string>
+    <string name="telecom_phone_number_hint">Phone number to call</string>
+    <string name="telecom_cancel_call_title">Canceled Call Test</string>
+    <string name="telecom_cancel_call_info">This tests to make sure that canceled calls are handled correctly.
         Press the \"Open settings\" button and make sure that \"Call Cancel Manager\" is the default Wi-Fi calling account.
         Then press the \"Place call\" button; the test will pass (or fail) automatically.
     </string>
+    <string name="telecom_failed_call_title">Failed Call Test</string>
+    <string name="telecom_failed_call_info">This tests to make sure that failed calls are handled correctly.
+        Press the \"Open settings\" button and make sure that \"Call Failed Manager\" is the default Wi-Fi calling account.
+        Then press the \"Place call\" button; the test will pass (or fail) automatically.
+    </string>
+    <string name="telecom_basic_call_title">Basic Call Test</string>
+    <string name="telecom_basic_call_info">This tests to make sure that basic calls are handled correctly.
+        Press the \"Open settings\" button and make sure that \"Basic Call Manager\" is the default Wi-Fi calling account.
+        Then press the \"Place call\" button; the test will pass (or fail) automatically.
+    </string>
 
 </resources>
diff --git a/apps/CtsVerifier/src/android/support/wearable/view/BoxInsetLayout.java b/apps/CtsVerifier/src/android/support/wearable/view/BoxInsetLayout.java
new file mode 100644
index 0000000..95bac11
--- /dev/null
+++ b/apps/CtsVerifier/src/android/support/wearable/view/BoxInsetLayout.java
@@ -0,0 +1,408 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package android.support.wearable.view;
+
+import com.android.cts.verifier.R;
+
+import android.content.Context;
+import android.content.res.TypedArray;
+import android.graphics.Rect;
+import android.graphics.drawable.Drawable;
+import android.util.AttributeSet;
+import android.view.Gravity;
+import android.view.View;
+import android.view.ViewGroup;
+import android.view.WindowInsets;
+import android.widget.FrameLayout;
+
+/**
+ * BoxInsetLayout is a screen shape-aware FrameLayout that can box its children
+ * in the center square of a round screen by using the
+ * {@code layout_box} attribute. The values for this attribute specify the
+ * child's edges to be boxed in:
+ * {@code left|top|right|bottom} or {@code all}.
+ * The {@code layout_box} attribute is ignored on a device with a rectangular
+ * screen.
+ */
+public class BoxInsetLayout extends FrameLayout {
+
+    private static float FACTOR = 0.146467f; //(1 - sqrt(2)/2)/2
+    private static final int DEFAULT_CHILD_GRAVITY = Gravity.TOP | Gravity.START;
+
+    private Rect mForegroundPadding;
+    private boolean mLastKnownRound;
+    private Rect mInsets;
+
+    public BoxInsetLayout(Context context) {
+        this(context, null);
+    }
+
+    public BoxInsetLayout(Context context, AttributeSet attrs) {
+        this(context, attrs, 0);
+    }
+
+    public BoxInsetLayout(Context context, AttributeSet attrs, int defStyle) {
+        super(context, attrs, defStyle);
+        // make sure we have foreground padding object
+        if (mForegroundPadding == null) {
+            mForegroundPadding = new Rect();
+        }
+        if (mInsets == null) {
+            mInsets = new Rect();
+        }
+    }
+
+    @Override
+    protected void onAttachedToWindow() {
+        super.onAttachedToWindow();
+        requestApplyInsets();
+    }
+
+    @Override
+    public WindowInsets onApplyWindowInsets(WindowInsets insets) {
+        insets = super.onApplyWindowInsets(insets);
+        final boolean round = insets.isRound();
+        if (round != mLastKnownRound) {
+            mLastKnownRound = round;
+            requestLayout();
+        }
+        mInsets.set(
+                insets.getSystemWindowInsetLeft(),
+                insets.getSystemWindowInsetTop(),
+                insets.getSystemWindowInsetRight(),
+                insets.getSystemWindowInsetBottom());
+        return insets;
+    }
+
+    /**
+     * determine screen shape
+     * @return true if on a round screen
+     */
+    public boolean isRound() {
+        return mLastKnownRound;
+    }
+
+    /**
+     * @return the system window insets Rect
+     */
+    public Rect getInsets() {
+        return mInsets;
+    }
+
+    @Override
+    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
+        int count = getChildCount();
+        // find max size
+        int maxWidth = 0;
+        int maxHeight = 0;
+        int childState = 0;
+        for (int i = 0; i < count; i++) {
+            final View child = getChildAt(i);
+            if (child.getVisibility() != GONE) {
+                LayoutParams lp = (BoxInsetLayout.LayoutParams) child.getLayoutParams();
+                int marginLeft = 0;
+                int marginRight = 0;
+                int marginTop = 0;
+                int marginBottom = 0;
+                if (mLastKnownRound) {
+                    // round screen, check boxed, don't use margins on boxed
+                    if ((lp.boxedEdges & LayoutParams.BOX_LEFT) == 0) {
+                        marginLeft = lp.leftMargin;
+                    }
+                    if ((lp.boxedEdges & LayoutParams.BOX_RIGHT) == 0) {
+                        marginRight = lp.rightMargin;
+                    }
+                    if ((lp.boxedEdges & LayoutParams.BOX_TOP) == 0) {
+                        marginTop = lp.topMargin;
+                    }
+                    if ((lp.boxedEdges & LayoutParams.BOX_BOTTOM) == 0) {
+                        marginBottom = lp.bottomMargin;
+                    }
+                } else {
+                    // rectangular, ignore boxed, use margins
+                    marginLeft = lp.leftMargin;
+                    marginTop = lp.topMargin;
+                    marginRight = lp.rightMargin;
+                    marginBottom = lp.bottomMargin;
+                }
+                measureChildWithMargins(child, widthMeasureSpec, 0, heightMeasureSpec, 0);
+                maxWidth = Math.max(maxWidth,
+                        child.getMeasuredWidth() + marginLeft + marginRight);
+                maxHeight = Math.max(maxHeight,
+                        child.getMeasuredHeight() + marginTop + marginBottom);
+                childState = combineMeasuredStates(childState, child.getMeasuredState());
+            }
+        }
+        // Account for padding too
+        maxWidth += getPaddingLeft() + mForegroundPadding.left
+                + getPaddingRight() + mForegroundPadding.right;
+        maxHeight += getPaddingTop() + mForegroundPadding.top
+                + getPaddingBottom() + mForegroundPadding.bottom;
+
+        // Check against our minimum height and width
+        maxHeight = Math.max(maxHeight, getSuggestedMinimumHeight());
+        maxWidth = Math.max(maxWidth, getSuggestedMinimumWidth());
+
+        // Check against our foreground's minimum height and width
+        final Drawable drawable = getForeground();
+        if (drawable != null) {
+            maxHeight = Math.max(maxHeight, drawable.getMinimumHeight());
+            maxWidth = Math.max(maxWidth, drawable.getMinimumWidth());
+        }
+
+        setMeasuredDimension(resolveSizeAndState(maxWidth, widthMeasureSpec, childState),
+                resolveSizeAndState(maxHeight, heightMeasureSpec,
+                        childState << MEASURED_HEIGHT_STATE_SHIFT));
+
+        // determine boxed inset
+        int boxInset = (int) (FACTOR * Math.max(getMeasuredWidth(), getMeasuredHeight()));
+        // adjust the match parent children
+        for (int i = 0; i < count; i++) {
+            final View child = getChildAt(i);
+
+            final LayoutParams lp = (BoxInsetLayout.LayoutParams) child.getLayoutParams();
+            int childWidthMeasureSpec;
+            int childHeightMeasureSpec;
+            int plwf = getPaddingLeft() + mForegroundPadding.left;
+            int prwf = getPaddingRight() + mForegroundPadding.right;
+            int ptwf = getPaddingTop() + mForegroundPadding.top;
+            int pbwf = getPaddingBottom() + mForegroundPadding.bottom;
+
+            // adjust width
+            int totalPadding = 0;
+            int totalMargin = 0;
+            // BoxInset is a padding. Ignore margin when we want to do BoxInset.
+            if (mLastKnownRound && ((lp.boxedEdges & LayoutParams.BOX_LEFT) != 0)) {
+                totalPadding = boxInset;
+            } else {
+                totalMargin = plwf + lp.leftMargin;
+            }
+            if (mLastKnownRound && ((lp.boxedEdges & LayoutParams.BOX_RIGHT) != 0)) {
+                totalPadding += boxInset;
+            } else {
+                totalMargin += prwf + lp.rightMargin;
+            }
+            if (lp.width == LayoutParams.MATCH_PARENT) {
+                //  Only subtract margin from the actual width, leave the padding in.
+                childWidthMeasureSpec = MeasureSpec.makeMeasureSpec(
+                        getMeasuredWidth() - totalMargin, MeasureSpec.EXACTLY);
+            } else {
+                childWidthMeasureSpec = getChildMeasureSpec(widthMeasureSpec,
+                        totalPadding + totalMargin, lp.width);
+            }
+
+            // adjust height
+            if (mLastKnownRound && ((lp.boxedEdges & LayoutParams.BOX_TOP) != 0)) {
+                totalPadding = boxInset;
+            } else {
+                totalMargin = ptwf + lp.topMargin;
+            }
+            if (mLastKnownRound && ((lp.boxedEdges & LayoutParams.BOX_BOTTOM) != 0)) {
+                totalPadding += boxInset;
+            } else {
+                totalMargin += pbwf + lp.bottomMargin;
+            }
+
+            if (lp.height == LayoutParams.MATCH_PARENT) {
+                childHeightMeasureSpec = MeasureSpec.makeMeasureSpec(
+                        getMeasuredHeight() - totalMargin, MeasureSpec.EXACTLY);
+            } else {
+                childHeightMeasureSpec = getChildMeasureSpec(heightMeasureSpec,
+                        totalPadding + totalMargin, lp.height);
+            }
+
+            child.measure(childWidthMeasureSpec, childHeightMeasureSpec);
+        }
+    }
+
+
+    @Override
+    protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
+        layoutBoxChildren(left, top, right, bottom, false /* no force left gravity */);
+    }
+
+    private void layoutBoxChildren(int left, int top, int right, int bottom,
+            boolean forceLeftGravity) {
+        final int count = getChildCount();
+        int boxInset = (int)(FACTOR * Math.max(right - left, bottom - top));
+
+        final int parentLeft = getPaddingLeft() + mForegroundPadding.left;
+        final int parentRight = right - left - getPaddingRight() - mForegroundPadding.right;
+
+        final int parentTop = getPaddingTop() + mForegroundPadding.top;
+        final int parentBottom = bottom - top - getPaddingBottom() - mForegroundPadding.bottom;
+
+        for (int i = 0; i < count; i++) {
+            final View child = getChildAt(i);
+            if (child.getVisibility() != GONE) {
+                final LayoutParams lp = (LayoutParams) child.getLayoutParams();
+
+                final int width = child.getMeasuredWidth();
+                final int height = child.getMeasuredHeight();
+
+                int childLeft;
+                int childTop;
+
+                int gravity = lp.gravity;
+                if (gravity == -1) {
+                    gravity = DEFAULT_CHILD_GRAVITY;
+                }
+
+                final int layoutDirection = getLayoutDirection();
+                final int absoluteGravity = Gravity.getAbsoluteGravity(gravity, layoutDirection);
+                final int verticalGravity = gravity & Gravity.VERTICAL_GRAVITY_MASK;
+
+                // These values are replaced with boxInset below as necessary.
+                int paddingLeft = child.getPaddingLeft();
+                int paddingRight = child.getPaddingRight();
+                int paddingTop = child.getPaddingTop();
+                int paddingBottom = child.getPaddingBottom();
+
+                switch (absoluteGravity & Gravity.HORIZONTAL_GRAVITY_MASK) {
+                    case Gravity.CENTER_HORIZONTAL:
+                        childLeft = parentLeft + (parentRight - parentLeft - width) / 2 +
+                                lp.leftMargin - lp.rightMargin;
+                        break;
+                    case Gravity.RIGHT:
+                        if (!forceLeftGravity) {
+                            if (mLastKnownRound
+                                    && ((lp.boxedEdges & LayoutParams.BOX_RIGHT) != 0)) {
+                                paddingRight = boxInset;
+                                childLeft = right - left - width;
+                            } else {
+                                childLeft = parentRight - width - lp.rightMargin;
+                            }
+                            break;
+                        }
+                    case Gravity.LEFT:
+                    default:
+                        if (mLastKnownRound && ((lp.boxedEdges & LayoutParams.BOX_LEFT) != 0)) {
+                            paddingLeft = boxInset;
+                            childLeft = 0;
+                        } else {
+                            childLeft = parentLeft + lp.leftMargin;
+                        }
+                }
+
+                switch (verticalGravity) {
+                    case Gravity.TOP:
+                        if (mLastKnownRound && ((lp.boxedEdges & LayoutParams.BOX_TOP) != 0)) {
+                            paddingTop = boxInset;
+                            childTop = 0;
+                        } else {
+                            childTop = parentTop + lp.topMargin;
+                        }
+                        break;
+                    case Gravity.CENTER_VERTICAL:
+                        childTop = parentTop + (parentBottom - parentTop - height) / 2 +
+                                lp.topMargin - lp.bottomMargin;
+                        break;
+                    case Gravity.BOTTOM:
+                        if (mLastKnownRound && ((lp.boxedEdges & LayoutParams.BOX_BOTTOM) != 0)) {
+                            paddingBottom = boxInset;
+                            childTop = bottom - top - height;
+                        } else {
+                            childTop = parentBottom - height - lp.bottomMargin;
+                        }
+                        break;
+                    default:
+                        childTop = parentTop + lp.topMargin;
+                }
+
+                child.setPadding(paddingLeft, paddingTop, paddingRight, paddingBottom);
+                child.layout(childLeft, childTop, childLeft + width, childTop + height);
+            }
+        }
+    }
+
+    public void setForeground(Drawable drawable) {
+        super.setForeground(drawable);
+        if (mForegroundPadding == null) {
+            mForegroundPadding = new Rect();
+        }
+        drawable.getPadding(mForegroundPadding);
+    }
+
+    @Override
+    protected boolean checkLayoutParams(ViewGroup.LayoutParams p) {
+        return p instanceof LayoutParams;
+    }
+
+    @Override
+    protected ViewGroup.LayoutParams generateLayoutParams(ViewGroup.LayoutParams p) {
+        return new LayoutParams(p);
+    }
+
+    @Override
+    public LayoutParams generateLayoutParams(AttributeSet attrs) {
+        return new BoxInsetLayout.LayoutParams(getContext(), attrs);
+    }
+
+    /**
+     * adds {@code layout_box} attribute to layout parameters
+     */
+    public static class LayoutParams extends FrameLayout.LayoutParams {
+
+        public static final int BOX_NONE = 0x0;
+        public static final int BOX_LEFT = 0x01;
+        public static final int BOX_TOP = 0x02;
+        public static final int BOX_RIGHT = 0x04;
+        public static final int BOX_BOTTOM = 0x08;
+        public static final int BOX_ALL = 0x0F;
+
+        public int boxedEdges = BOX_NONE;
+
+        public LayoutParams(Context context, AttributeSet attrs) {
+            super(context, attrs);
+            TypedArray a = context.obtainStyledAttributes(attrs,  R.styleable.BoxInsetLayout_Layout, 0, 0);
+            boxedEdges = a.getInt(R.styleable.BoxInsetLayout_Layout_layout_box, BOX_NONE);
+            a.recycle();
+        }
+
+        public LayoutParams(int width, int height) {
+            super(width, height);
+        }
+
+        public LayoutParams(int width, int height, int gravity) {
+            super(width, height, gravity);
+        }
+
+        public LayoutParams(int width, int height, int gravity, int boxed) {
+            super(width, height, gravity);
+            boxedEdges = boxed;
+        }
+
+        public LayoutParams(ViewGroup.LayoutParams source) {
+            super(source);
+        }
+
+        public LayoutParams(ViewGroup.MarginLayoutParams source) {
+            super(source);
+        }
+
+        public LayoutParams(FrameLayout.LayoutParams source) {
+            super(source);
+        }
+
+        public LayoutParams(LayoutParams source) {
+            super(source);
+            this.boxedEdges = source.boxedEdges;
+            this.gravity = source.gravity;
+        }
+
+    }
+}
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/AbstractTestListActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/AbstractTestListActivity.java
index 9b53bfd..6495a05 100644
--- a/apps/CtsVerifier/src/com/android/cts/verifier/AbstractTestListActivity.java
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/AbstractTestListActivity.java
@@ -20,6 +20,7 @@
 
 import android.app.ListActivity;
 import android.content.Intent;
+import android.os.Bundle;
 import android.view.View;
 import android.widget.ListView;
 
@@ -53,6 +54,12 @@
         }
     }
 
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.list_content);
+    }
+
     private void handleLaunchTestResult(int resultCode, Intent data) {
         if (resultCode == RESULT_OK) {
             TestResult testResult = TestResult.fromActivityResult(resultCode, data);
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/bluetooth/BleAdvertiserService.java b/apps/CtsVerifier/src/com/android/cts/verifier/bluetooth/BleAdvertiserService.java
index 3f8cdd5..7b4235b 100644
--- a/apps/CtsVerifier/src/com/android/cts/verifier/bluetooth/BleAdvertiserService.java
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/bluetooth/BleAdvertiserService.java
@@ -146,7 +146,9 @@
     @Override
     public void onDestroy() {
         super.onDestroy();
-        mAdvertiser.stopAdvertising(mCallback);
+        if (mAdvertiser != null) {
+            mAdvertiser.stopAdvertising(mCallback);
+        }
     }
 
     private void stopAdvertiser() {
@@ -184,6 +186,10 @@
     }
 
     private void handleIntent(Intent intent) {
+        if (mAdvertiser == null) {
+            showMessage("Multi advertising not supported on this device");
+            return;
+        }
         int command = intent.getIntExtra(EXTRA_COMMAND, -1);
         if (command >= 0) {
             stopAdvertiser();
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/projection/offscreen/ProjectionOffscreenActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/projection/offscreen/ProjectionOffscreenActivity.java
index 5f32cfd..f992618 100644
--- a/apps/CtsVerifier/src/com/android/cts/verifier/projection/offscreen/ProjectionOffscreenActivity.java
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/projection/offscreen/ProjectionOffscreenActivity.java
@@ -185,6 +185,13 @@
         }
 
         Image image = reader.acquireLatestImage();
+
+        // No new images available
+        if (image == null) {
+            Log.w(TAG, "onImageAvailable called but no image!");
+            return;
+        }
+
         if (mTestStatus == TestStatus.RUNNING) {
             int ret = scanImage(image);
             if (ret == -1) {
@@ -244,9 +251,7 @@
             offset += rowPadding;
         }
 
-        // Return a color if it represents more than one quarter of the pixels.
-        // We use this threshold in case the display is being letterboxed when
-        // mirroring so there might be large black bars on the sides, which is normal.
+        // Return a color if it represents all of the pixels.
         Log.d(TAG, "- Pixels: " + blackPixels + " black, "
                 + bluePixels + " blue, "
                 + otherPixels + " other");
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/sensors/BatchingTestActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/sensors/BatchingTestActivity.java
index 009e644..42bd6ad 100644
--- a/apps/CtsVerifier/src/com/android/cts/verifier/sensors/BatchingTestActivity.java
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/sensors/BatchingTestActivity.java
@@ -19,22 +19,15 @@
 import com.android.cts.verifier.R;
 import com.android.cts.verifier.sensors.base.SensorCtsVerifierTestActivity;
 
-import junit.framework.Assert;
-
 import android.content.Context;
 import android.hardware.Sensor;
-import android.hardware.SensorEvent;
-import android.hardware.SensorEventListener2;
 import android.hardware.SensorManager;
-import android.hardware.cts.helpers.SensorNotSupportedException;
-import android.hardware.cts.helpers.TestSensorEvent;
+import android.hardware.cts.helpers.sensoroperations.TestSensorFlushOperation;
+import android.hardware.cts.helpers.sensoroperations.TestSensorOperation;
+import android.hardware.cts.helpers.sensoroperations.VerifiableSensorOperation;
 import android.os.Bundle;
 import android.os.PowerManager;
-import android.os.SystemClock;
 
-import java.util.ArrayList;
-import java.util.List;
-import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.TimeUnit;
 
 /**
@@ -44,27 +37,19 @@
  * If a sensor supports the batching mode, FifoReservedEventCount for that sensor should be greater
  * than one.
  */
-public class BatchingTestActivity
-        extends SensorCtsVerifierTestActivity
-        implements SensorEventListener2 {
+public class BatchingTestActivity extends SensorCtsVerifierTestActivity {
     public BatchingTestActivity() {
         super(BatchingTestActivity.class);
     }
 
-    private final long TWO_SECONDS_MILLIS = TimeUnit.SECONDS.toMillis(2);
-    private static final long DATA_COLLECTION_TIME_IN_MS = TimeUnit.SECONDS.toMillis(10);
-    private final long MIN_BATCH_TIME_NANOS = TimeUnit.SECONDS.toNanos(5);
-    private final long MAX_BATCH_REPORT_LATENCY_US = DATA_COLLECTION_TIME_IN_MS * 500;
+    private static final int SENSOR_BATCHING_RATE_US = SensorManager.SENSOR_DELAY_FASTEST;
+    private static final int REPORT_LATENCY_10_SEC = 10;
+    private static final int BATCHING_PADDING_TIME_S = 2;
 
-    private final List<TestSensorEvent> mSensorEvents = new ArrayList<TestSensorEvent>();
+    // we are testing sensors that only trigger based on external events, so leave enough time for
+    // such events to generate
+    private static final int REPORT_LATENCY_25_SEC = 25;
 
-    private SensorManager mSensorManager;
-
-    private volatile Sensor mSensorUnderTest;
-    private volatile long mTimeFirstBatchedEventReceivedNanos;
-
-    private CountDownLatch mSensorEventReceived;
-    private CountDownLatch mFlushCompleteReceived;
     private PowerManager.WakeLock mWakeLock;
 
     @Override
@@ -74,7 +59,6 @@
 
     @Override
     protected void activitySetUp() throws InterruptedException {
-        mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
         PowerManager powerManager = (PowerManager) getSystemService(Context.POWER_SERVICE);
         mWakeLock = powerManager.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK, "BatchingTests");
 
@@ -88,147 +72,106 @@
         restoreSensorFeatures();
     }
 
-    // TODO: refactor to discover all available sensors of each type and dinamically generate test
+    // TODO: refactor to discover all available sensors of each type and dynamically generate test
     // cases for all of them
-    public String testStepCounter() throws Throwable {
-        return runTest(Sensor.TYPE_STEP_COUNTER, R.string.snsr_batching_walking_needed);
+    public String testStepCounter_batching() throws Throwable {
+        return runBatchTest(
+                Sensor.TYPE_STEP_COUNTER,
+                REPORT_LATENCY_25_SEC,
+                R.string.snsr_batching_walking_needed);
     }
 
-    public String testStepDetector() throws Throwable {
-        return  runTest(Sensor.TYPE_STEP_DETECTOR, R.string.snsr_batching_walking_needed);
+    public String testStepCounter_flush() throws Throwable {
+        return runFlushTest(
+                Sensor.TYPE_STEP_COUNTER,
+                REPORT_LATENCY_25_SEC,
+                R.string.snsr_batching_walking_needed);
     }
 
-    public String testProximity() throws Throwable {
-        return runTest(Sensor.TYPE_PROXIMITY, R.string.snsr_interaction_needed);
+    public String testStepDetector_batching() throws Throwable {
+        return  runBatchTest(
+                Sensor.TYPE_STEP_DETECTOR,
+                REPORT_LATENCY_25_SEC,
+                R.string.snsr_batching_walking_needed);
     }
 
-    public String testLight() throws Throwable {
-        return runTest(Sensor.TYPE_LIGHT, R.string.snsr_interaction_needed);
+    public String testStepDetector_flush() throws Throwable {
+        return  runFlushTest(
+                Sensor.TYPE_STEP_DETECTOR,
+                REPORT_LATENCY_25_SEC,
+                R.string.snsr_batching_walking_needed);
     }
 
-    // TODO: move sensors that do not require interaction to CTS
-    public String testGameRotationVector() throws Throwable {
-        return runTest(Sensor.TYPE_GAME_ROTATION_VECTOR, R.string.snsr_no_interaction);
+    public String testProximity_batching() throws Throwable {
+        return runBatchTest(
+                Sensor.TYPE_PROXIMITY,
+                REPORT_LATENCY_10_SEC,
+                R.string.snsr_interaction_needed);
     }
 
-    public String testGeomagneticRotationVector() throws Throwable {
-        return runTest(Sensor.TYPE_GEOMAGNETIC_ROTATION_VECTOR, R.string.snsr_no_interaction);
+    public String testProximity_flush() throws Throwable {
+        return runFlushTest(
+                Sensor.TYPE_PROXIMITY,
+                REPORT_LATENCY_10_SEC,
+                R.string.snsr_interaction_needed);
     }
 
-    public String testAccelerometer() throws Throwable {
-        return runTest(Sensor.TYPE_ACCELEROMETER, R.string.snsr_no_interaction);
+    public String testLight_batching() throws Throwable {
+        return runBatchTest(
+                Sensor.TYPE_LIGHT,
+                REPORT_LATENCY_10_SEC,
+                R.string.snsr_interaction_needed);
     }
 
-    public String testGyroscope() throws Throwable {
-        return runTest(Sensor.TYPE_GYROSCOPE, R.string.snsr_no_interaction);
+    public String testLight_flush() throws Throwable {
+        return runFlushTest(
+                Sensor.TYPE_LIGHT,
+                REPORT_LATENCY_10_SEC,
+                R.string.snsr_interaction_needed);
     }
 
-    public String testGyroscopeUncalibrated() throws Throwable {
-        return runTest(Sensor.TYPE_GYROSCOPE_UNCALIBRATED, R.string.snsr_no_interaction);
+    private String runBatchTest(int sensorType, int maxBatchReportLatencySec, int instructionsResId)
+            throws Throwable {
+        getTestLogger().logInstructions(instructionsResId);
+        waitForUserToBegin();
+
+        Context context = getApplicationContext();
+        int maxBatchReportLatencyUs = (int) TimeUnit.SECONDS.toMicros(maxBatchReportLatencySec);
+        int testDurationSec = maxBatchReportLatencySec + BATCHING_PADDING_TIME_S;
+        TestSensorOperation operation = new TestSensorOperation(
+                context,
+                sensorType,
+                SENSOR_BATCHING_RATE_US,
+                maxBatchReportLatencyUs,
+                testDurationSec,
+                TimeUnit.SECONDS);
+
+        return executeTest(operation);
     }
 
-    public String testMagneticField() throws Throwable {
-        return runTest(Sensor.TYPE_MAGNETIC_FIELD, R.string.snsr_no_interaction);
+    private String runFlushTest(int sensorType, int maxBatchReportLatencySec, int instructionsResId)
+            throws Throwable {
+        getTestLogger().logInstructions(instructionsResId);
+        waitForUserToBegin();
+
+        Context context = getApplicationContext();
+        int maxBatchReportLatencyUs = (int) TimeUnit.SECONDS.toMicros(maxBatchReportLatencySec);
+        int flushDurationSec = maxBatchReportLatencySec / 2;
+        TestSensorFlushOperation operation = new TestSensorFlushOperation(
+                context,
+                sensorType,
+                SENSOR_BATCHING_RATE_US,
+                maxBatchReportLatencyUs,
+                flushDurationSec,
+                TimeUnit.SECONDS);
+
+        return executeTest(operation);
     }
 
-    public String testMagneticFieldUncalibrated() throws Throwable {
-        return runTest(Sensor.TYPE_MAGNETIC_FIELD_UNCALIBRATED, R.string.snsr_no_interaction);
-    }
-
-    public String testRotationVector() throws Throwable {
-        return runTest(Sensor.TYPE_ROTATION_VECTOR, R.string.snsr_no_interaction);
-    }
-
-    // TODO: split batching and flush scenarios
-    private String runTest(int sensorType, int instructionsResId) throws Throwable {
-        mSensorUnderTest = mSensorManager.getDefaultSensor(sensorType);
-        // TODO: add exception for batching not supported
-        if (mSensorUnderTest == null || mSensorUnderTest.getFifoMaxEventCount() < 1) {
-            throw new SensorNotSupportedException(Sensor.TYPE_STEP_COUNTER);
-        }
-
-        appendText(instructionsResId);
-        waitForUser();
-
-        // Register to wait for first sensor event arrival, and when FIFO has been flushed
-        mSensorEventReceived = new CountDownLatch(1);
-        mFlushCompleteReceived = new CountDownLatch(1);
-        mSensorEvents.clear();
-
-        int fifoReservedEventCount = mSensorUnderTest.getFifoReservedEventCount();
-        int fifoMaxEventCount = mSensorUnderTest.getFifoMaxEventCount();
-        String fifoMessage = getString(
-                R.string.snsr_batching_fifo_count,
-                fifoReservedEventCount,
-                fifoMaxEventCount);
-        Assert.assertTrue(fifoMessage, fifoReservedEventCount <= fifoMaxEventCount);
-
-        // Time when start batching
-        mTimeFirstBatchedEventReceivedNanos = 0;
-        long timeBatchingStartedNanos = SystemClock.elapsedRealtimeNanos();
-
-        // Batch with the fastest rate and set report latency large enough to ensure full batching
-        // occurs
-        boolean registerResult = mSensorManager.registerListener(
-                this /* listener */,
-                mSensorUnderTest,
-                SensorManager.SENSOR_DELAY_FASTEST,
-                (int) MAX_BATCH_REPORT_LATENCY_US);
-        Assert.assertTrue(
-                getString(R.string.snsr_register_listener, registerResult),
-                registerResult);
-
-        // add a buffer to the duration of the test for timeout
-        mSensorEventReceived
-                .await(DATA_COLLECTION_TIME_IN_MS + TWO_SECONDS_MILLIS, TimeUnit.MILLISECONDS);
-        // TODO: add delayed assertion for await
-
-        // verify the minimum batching time
-        long firstTimeArrivalDelta = mTimeFirstBatchedEventReceivedNanos - timeBatchingStartedNanos;
-        String firstTimeArrivalMessage = getString(
-                R.string.snsr_batching_first_event_arrival,
-                MIN_BATCH_TIME_NANOS,
-                firstTimeArrivalDelta);
-        Assert.assertTrue(firstTimeArrivalMessage, firstTimeArrivalDelta >= MIN_BATCH_TIME_NANOS);
-
-        // batch a bit more to test the flush
-        long sleepTime = TimeUnit.NANOSECONDS.toMillis(MIN_BATCH_TIME_NANOS / 2);
-        Thread.sleep(sleepTime);
-        mSensorManager.flush(this);
-
-        boolean flushAwaitSuccess = mFlushCompleteReceived
-                .await(DATA_COLLECTION_TIME_IN_MS + TWO_SECONDS_MILLIS, TimeUnit.MILLISECONDS);
-        Assert.assertTrue(
-                getString(R.string.snsr_batching_flush_complete, flushAwaitSuccess),
-                flushAwaitSuccess);
-
-        playSound();
-        // TODO: use SensorTestVerifications to check for event ordering and event gap
+    private String executeTest(VerifiableSensorOperation operation) {
+        operation.addDefaultVerifications();
+        operation.setLogEvents(true);
+        operation.execute();
         return null;
     }
-
-    @Override
-    public void onSensorChanged(SensorEvent sensorEvent) {
-        long elapsedTime = SystemClock.elapsedRealtimeNanos();
-        if (sensorEvent.sensor.getType() != mSensorUnderTest.getType()) {
-            // TODO: add delayed assertion
-            return;
-        }
-
-        mSensorEvents.add(new TestSensorEvent(sensorEvent, elapsedTime));
-        if (mTimeFirstBatchedEventReceivedNanos == 0) {
-            mTimeFirstBatchedEventReceivedNanos = elapsedTime;
-            mSensorEventReceived.countDown();
-        }
-    }
-
-    @Override
-    public void onAccuracyChanged(Sensor sensor, int accuracy) {
-    }
-
-    @Override
-    public void onFlushCompleted(Sensor sensor) {
-        mSensorManager.unregisterListener(this);
-        mFlushCompleteReceived.countDown();
-    }
 }
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/sensors/SensorBatchingTestsActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/sensors/SensorBatchingTestsActivity.java
new file mode 100644
index 0000000..d1923cc
--- /dev/null
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/sensors/SensorBatchingTestsActivity.java
@@ -0,0 +1,31 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.cts.verifier.sensors;
+
+import com.android.cts.verifier.sensors.base.SensorCtsTestActivity;
+
+import android.hardware.cts.SensorBatchingTests;
+
+/**
+ * Activity to execute CTS sensor batching tests.
+ * It is a wrapper for {@link SensorBatchingTests} running with AndroidJUnitRunner.
+ */
+public class SensorBatchingTestsActivity extends SensorCtsTestActivity {
+    public SensorBatchingTestsActivity() {
+        super(SensorBatchingTests.class);
+    }
+}
\ No newline at end of file
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/sensors/StepCounterTestActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/sensors/StepCounterTestActivity.java
index 78430e3..221c92a 100644
--- a/apps/CtsVerifier/src/com/android/cts/verifier/sensors/StepCounterTestActivity.java
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/sensors/StepCounterTestActivity.java
@@ -29,8 +29,9 @@
 import android.hardware.cts.helpers.MovementDetectorHelper;
 import android.hardware.cts.helpers.TestSensorEvent;
 import android.os.SystemClock;
+import android.view.MotionEvent;
 import android.view.View;
-import android.view.View.OnClickListener;
+import android.widget.ScrollView;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -66,6 +67,10 @@
     private final List<TestSensorEvent> mStepCounterEvents = new ArrayList<TestSensorEvent>();
     private final List<TestSensorEvent> mStepDetectorEvents = new ArrayList<TestSensorEvent>();
 
+    /**
+     * A flag that indicates if the test is interested in registering steps reported by the
+     * operator. The registration of events happens by tapping the screen throughout the test.
+     */
     private volatile boolean mCheckForMotion;
 
     @Override
@@ -74,16 +79,19 @@
         mSensorStepCounter = mSensorManager.getDefaultSensor(Sensor.TYPE_STEP_COUNTER);
         mSensorStepDetector = mSensorManager.getDefaultSensor(Sensor.TYPE_STEP_DETECTOR);
 
-        View screen = findViewById(R.id.log_layout);
-        screen.setOnClickListener(new OnClickListener() {
+        ScrollView scrollView = (ScrollView) findViewById(R.id.log_scroll_view);
+        scrollView.setOnTouchListener(new View.OnTouchListener() {
             @Override
-            public void onClick(View v) {
+            public boolean onTouch(View v, MotionEvent event) {
+                // during movement of the device, the ScrollView will detect user taps as attempts
+                // to scroll, when in reality they are taps in the layout
+                // to overcome the fact that a ScrollView cannot be disabled from scrolling, we
+                // listen for ACTION_UP events instead of click events in the child layout
                 long elapsedTime = SystemClock.elapsedRealtimeNanos();
-                if (mCheckForMotion) {
-                    playSound();
-                    mTimestampsUserReported.add(SystemClock.elapsedRealtimeNanos());
-                    appendText(getString(R.string.snsr_step_reported, elapsedTime));
+                if (event.getAction() == MotionEvent.ACTION_UP) {
+                    logUserReportedStep(elapsedTime);
                 }
+                return false;
             }
         });
     }
@@ -123,8 +131,8 @@
         mMoveDetected = false;
         mCheckForMotion = false;
 
-        appendText(instructionsResId);
-        waitForUser();
+        getTestLogger().logMessage(instructionsResId);
+        waitForUserToBegin();
 
         mCheckForMotion = (expectedSteps > 0);
         if (vibrate) {
@@ -299,16 +307,25 @@
         int type = event.sensor.getType();
         if (type == Sensor.TYPE_STEP_COUNTER) {
             mStepCounterEvents.add(new TestSensorEvent(event, elapsedRealtimeNanos));
-            String counterMessage = getString(
+            getTestLogger().logMessage(
                     R.string.snsr_step_counter_event,
                     elapsedRealtimeNanos,
                     (int) event.values[0]);
-            appendText(counterMessage);
         } else if (type == Sensor.TYPE_STEP_DETECTOR) {
             mStepDetectorEvents.add(new TestSensorEvent(event, elapsedRealtimeNanos));
-            appendText(getString(R.string.snsr_step_detector_event, elapsedRealtimeNanos));
+            getTestLogger().logMessage(R.string.snsr_step_detector_event, elapsedRealtimeNanos);
 
         }
         // TODO: with delayed assertions check events of other types are tracked
     }
+
+    private void logUserReportedStep(long timestamp) {
+        if (!mCheckForMotion) {
+            return;
+        }
+
+        playSound();
+        mTimestampsUserReported.add(timestamp);
+        getTestLogger().logMessage(R.string.snsr_step_reported, timestamp);
+    }
 }
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/sensors/base/BaseSensorTestActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/sensors/base/BaseSensorTestActivity.java
index 2938dff..04603cb 100644
--- a/apps/CtsVerifier/src/com/android/cts/verifier/sensors/base/BaseSensorTestActivity.java
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/sensors/base/BaseSensorTestActivity.java
@@ -402,6 +402,12 @@
             textAppender.append();
         }
 
+        public void logMessage(int messageResId, Object ... params) {
+            TextAppender textAppender = new TextAppender(R.layout.snsr_message);
+            textAppender.setText(getString(messageResId, params));
+            textAppender.append();
+        }
+
         public void logTestDetails(SensorTestDetails testDetails) {
             String name = testDetails.getName();
             String summary = testDetails.getSummary();
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/sensors/base/SensorCtsTestActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/sensors/base/SensorCtsTestActivity.java
index 1479248..6bdc8d2 100644
--- a/apps/CtsVerifier/src/com/android/cts/verifier/sensors/base/SensorCtsTestActivity.java
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/sensors/base/SensorCtsTestActivity.java
@@ -20,10 +20,11 @@
 import com.android.cts.verifier.R;
 import com.android.cts.verifier.sensors.reporting.SensorTestDetails;
 
-import junit.framework.TestResult;
+import junit.framework.Test;
 import junit.framework.TestSuite;
 
 import org.junit.internal.runners.JUnit38ClassRunner;
+import org.junit.internal.runners.SuiteMethod;
 import org.junit.runner.Computer;
 import org.junit.runner.Description;
 import org.junit.runner.JUnitCore;
@@ -93,27 +94,35 @@
     }
 
     /**
-     * A {@link RunnerBuilder} that is used to inject during execution a {@link SensorTestSuite}.
+     * A {@link RunnerBuilder} that is used to inject during execution a {@link SensorCtsTestSuite}.
      */
     private class SensorRunnerBuilder extends RunnerBuilder {
         @Override
         public Runner runnerForClass(Class<?> testClass) throws Throwable {
-            TestSuite testSuite = new SensorTestSuite(testClass);
-            return new JUnit38ClassRunner(testSuite);
-        }
-    }
-
-    /**
-     * A {@link TestSuite} that is used to inject during execution a {@link SensorCtsTestResult}.
-     */
-    private class SensorTestSuite extends TestSuite {
-        public SensorTestSuite(Class<?> testClass) {
-            super(testClass);
+            TestSuite testSuite;
+            if (hasSuiteMethod(testClass)) {
+                Test test = SuiteMethod.testFromSuiteMethod(testClass);
+                if (test instanceof TestSuite) {
+                    testSuite = (TestSuite) test;
+                } else {
+                    throw new IllegalArgumentException(
+                            testClass.getName() + "#suite() did not return a TestSuite.");
+                }
+            } else {
+                testSuite = new TestSuite(testClass);
+            }
+            SensorCtsTestSuite sensorTestSuite =
+                    new SensorCtsTestSuite(getApplicationContext(), testSuite);
+            return new JUnit38ClassRunner(sensorTestSuite);
         }
 
-        @Override
-        public void run(TestResult testResult) {
-            super.run(new SensorCtsTestResult(getApplicationContext(), testResult));
+        private boolean hasSuiteMethod(Class testClass) {
+            try {
+                testClass.getMethod("suite");
+                return true;
+            } catch (NoSuchMethodException e) {
+                return false;
+            }
         }
     }
 
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/sensors/base/SensorCtsTestSuite.java b/apps/CtsVerifier/src/com/android/cts/verifier/sensors/base/SensorCtsTestSuite.java
new file mode 100644
index 0000000..bbf76a7
--- /dev/null
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/sensors/base/SensorCtsTestSuite.java
@@ -0,0 +1,90 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.cts.verifier.sensors.base;
+
+import junit.framework.Test;
+import junit.framework.TestResult;
+import junit.framework.TestSuite;
+
+import android.content.Context;
+
+import java.util.Enumeration;
+
+/**
+ * A wrapper class for a {@link TestSuite}.
+ *
+ * It provides a way to inject a {@link SensorCtsTestResult} during execution.
+ */
+class SensorCtsTestSuite extends TestSuite {
+    private final Context mContext;
+    private final TestSuite mWrappedTestSuite;
+
+    public SensorCtsTestSuite(Context context, TestSuite testSuite) {
+        mContext = context;
+        mWrappedTestSuite = testSuite;
+    }
+
+    @Override
+    public void run(TestResult testResult) {
+        mWrappedTestSuite.run(new SensorCtsTestResult(mContext, testResult));
+    }
+
+    @Override
+    public void addTest(Test test) {
+        mWrappedTestSuite.addTest(test);
+    }
+
+    @Override
+    public int countTestCases() {
+        return mWrappedTestSuite.countTestCases();
+    }
+
+    @Override
+    public String getName() {
+        return mWrappedTestSuite.getName();
+    }
+
+    @Override
+    public void runTest(Test test, TestResult testResult) {
+        mWrappedTestSuite.runTest(test, testResult);
+    }
+
+    @Override
+    public void setName(String name) {
+        mWrappedTestSuite.setName(name);
+    }
+
+    @Override
+    public Test testAt(int index) {
+        return mWrappedTestSuite.testAt(index);
+    }
+
+    @Override
+    public int testCount() {
+        return mWrappedTestSuite.testCount();
+    }
+
+    @Override
+    public Enumeration<Test> tests() {
+        return mWrappedTestSuite.tests();
+    }
+
+    @Override
+    public String toString() {
+        return mWrappedTestSuite.toString();
+    }
+}
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/sensors/reporting/SensorTestDetails.java b/apps/CtsVerifier/src/com/android/cts/verifier/sensors/reporting/SensorTestDetails.java
index 9a9b1cb..6ca4e30 100644
--- a/apps/CtsVerifier/src/com/android/cts/verifier/sensors/reporting/SensorTestDetails.java
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/sensors/reporting/SensorTestDetails.java
@@ -64,7 +64,7 @@
     public SensorTestDetails(Context context, String name, Result result) {
         this(context,
                 name,
-                result.getRunCount(),
+                result.getRunCount() - result.getFailureCount() - result.getIgnoreCount(),
                 result.getIgnoreCount(),
                 result.getFailureCount());
     }
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/telecom/BasicCallTestActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/telecom/BasicCallTestActivity.java
new file mode 100644
index 0000000..70d141c
--- /dev/null
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/telecom/BasicCallTestActivity.java
@@ -0,0 +1,151 @@
+package com.android.cts.verifier.telecom;
+
+import com.android.cts.verifier.R;
+
+import android.net.Uri;
+import android.os.SystemClock;
+import android.telecom.Connection;
+import android.telecom.ConnectionRequest;
+import android.telecom.DisconnectCause;
+import android.telecom.PhoneAccountHandle;
+import android.telecom.RemoteConnection;
+import android.telecom.StatusHints;
+
+import java.util.concurrent.Semaphore;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * Tests that a basic call with RemoteConnections will go through. When this ConnectionService is
+ * notified of an outgoing call, it will create a Connection which wraps a RemoteConnection. Then,
+ * once the RemoteConnection starts dialing, it will disconnect the call and the test will pass.
+ */
+public class BasicCallTestActivity extends TelecomBaseTestActivity {
+    private static final Semaphore sLock = new Semaphore(0);
+
+    @Override
+    protected int getTestTitleResource() {
+        return R.string.telecom_basic_call_title;
+    }
+
+    @Override
+    protected int getTestInfoResource() {
+        return R.string.telecom_basic_call_info;
+    }
+
+    @Override
+    protected Class<? extends android.telecom.ConnectionService> getConnectionService() {
+        return ConnectionService.class;
+    }
+
+    @Override
+    protected String getConnectionServiceLabel() {
+        return "Basic Call Manager";
+    }
+
+    @Override
+    protected boolean onCallPlacedBackgroundThread() {
+        try {
+            if (!sLock.tryAcquire(5000, TimeUnit.MILLISECONDS)) {
+                return false;
+            }
+
+            // Wait for the listeners to be fired so the call is cleaned up.
+            SystemClock.sleep(1000);
+
+            return !getTelecomManager().isInCall();
+        } catch (Exception e) {
+            return false;
+        }
+    }
+
+    public static class ConnectionService extends android.telecom.ConnectionService {
+        @Override
+        public Connection onCreateOutgoingConnection(
+                PhoneAccountHandle connectionManagerPhoneAccount,
+                ConnectionRequest request) {
+            RemoteConnection remoteConnection =
+                    createRemoteOutgoingConnection(connectionManagerPhoneAccount, request);
+            return new ProxyConnection(remoteConnection);
+        }
+    }
+
+    private static class ProxyConnection extends Connection {
+        private final RemoteConnection mRemoteConnection;
+
+        private final RemoteConnection.Callback mCallback = new RemoteConnection.Callback() {
+            @Override
+            public void onStateChanged(RemoteConnection connection, int state) {
+                switch (state) {
+                    case Connection.STATE_ACTIVE:
+                        setActive();
+                        break;
+                    case Connection.STATE_DIALING:
+                        setDialing();
+                        break;
+                    case Connection.STATE_DISCONNECTED:
+                        sLock.release();
+                        break;
+                    case Connection.STATE_HOLDING:
+                        setOnHold();
+                        break;
+                    case Connection.STATE_INITIALIZING:
+                        setInitializing();
+                        break;
+                    case Connection.STATE_NEW:
+                        setInitialized();
+                        break;
+                    case Connection.STATE_RINGING:
+                        setRinging();
+                        break;
+                }
+            }
+
+            @Override
+            public void onDisconnected(
+                    RemoteConnection connection, DisconnectCause disconnectCause) {
+                setDisconnected(disconnectCause);
+            }
+
+            @Override
+            public void onStatusHintsChanged(RemoteConnection connection, StatusHints statusHints) {
+                setStatusHints(statusHints);
+            }
+
+            @Override
+            public void onAddressChanged(
+                    RemoteConnection connection, Uri address, int presentation) {
+                setAddress(address, presentation);
+            }
+
+            @Override
+            public void onCallerDisplayNameChanged(RemoteConnection connection,
+                    String callerDisplayName,
+                    int presentation) {
+                setCallerDisplayName(callerDisplayName, presentation);
+            }
+
+            @Override
+            public void onDestroyed(RemoteConnection connection) {
+                destroy();
+            }
+        };
+
+        public ProxyConnection(RemoteConnection connection) {
+            mRemoteConnection = connection;
+            if (connection.getState() == Connection.STATE_DISCONNECTED) {
+                sLock.release();
+            } else {
+                mRemoteConnection.registerCallback(mCallback);
+            }
+        }
+
+        @Override
+        public void onStateChanged(int state) {
+            if (state == Connection.STATE_DIALING) {
+                // Good enough; let's disconnect this call.
+                mRemoteConnection.disconnect();
+                sLock.release();
+            }
+        }
+    }
+}
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/telecom/CancelCallTestActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/telecom/CancelCallTestActivity.java
new file mode 100644
index 0000000..58d71ce
--- /dev/null
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/telecom/CancelCallTestActivity.java
@@ -0,0 +1,83 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.cts.verifier.telecom;
+
+import android.os.SystemClock;
+import android.telecom.Connection;
+import android.telecom.ConnectionRequest;
+import android.telecom.PhoneAccountHandle;
+
+import com.android.cts.verifier.R;
+
+import java.util.concurrent.Semaphore;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * Tests that a call can be canceled by a ConnectionService (and that the cancelation is respected).
+ * Once the ConnectionService returns a canceled connection, the test verifies that Telecomm does
+ * not have any active calls. If this is the case, the test will pass.
+ */
+public class CancelCallTestActivity extends TelecomBaseTestActivity {
+    private static final Semaphore sLock = new Semaphore(0);
+
+    @Override
+    protected int getTestTitleResource() {
+        return R.string.telecom_cancel_call_title;
+    }
+
+    @Override
+    protected int getTestInfoResource() {
+        return R.string.telecom_cancel_call_info;
+    }
+
+    @Override
+    protected Class<? extends android.telecom.ConnectionService> getConnectionService() {
+        return ConnectionService.class;
+    }
+
+    @Override
+    protected String getConnectionServiceLabel() {
+        return "Call Cancel Manager";
+    }
+
+    @Override
+    protected boolean onCallPlacedBackgroundThread() {
+        try {
+            if (!sLock.tryAcquire(1000, TimeUnit.MILLISECONDS)) {
+                return false;
+            }
+
+            // Wait for the listeners to be fired so the call is cleaned up.
+            SystemClock.sleep(1000);
+
+            // Make sure that there aren't any ongoing calls.
+            return !getTelecomManager().isInCall();
+        } catch (Exception e) {
+            return false;
+        }
+    }
+
+    public static class ConnectionService extends android.telecom.ConnectionService {
+        @Override
+        public Connection onCreateOutgoingConnection(
+                PhoneAccountHandle connectionManagerPhoneAccount,
+                ConnectionRequest request) {
+            sLock.release();
+            return Connection.createCanceledConnection();
+        }
+    }
+}
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/telecom/FailedCallTestActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/telecom/FailedCallTestActivity.java
new file mode 100644
index 0000000..74a8637
--- /dev/null
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/telecom/FailedCallTestActivity.java
@@ -0,0 +1,86 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.cts.verifier.telecom;
+
+import android.os.SystemClock;
+import android.telecom.Connection;
+import android.telecom.ConnectionRequest;
+import android.telecom.DisconnectCause;
+import android.telecom.PhoneAccountHandle;
+
+import com.android.cts.verifier.R;
+
+import java.util.concurrent.Semaphore;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * Tests that a connection manager can fail calls and they're handled appropriately. That is, when
+ * a call is failed, it will not go through. The flow here is that the ConnectionService will say
+ * that the call failed because it's busy, and then make sure that there are no active calls. If
+ * this is the case, the test will pass.
+ */
+public class FailedCallTestActivity extends TelecomBaseTestActivity {
+    private static final Semaphore sLock = new Semaphore(0);
+
+    @Override
+    protected int getTestTitleResource() {
+        return R.string.telecom_failed_call_title;
+    }
+
+    @Override
+    protected int getTestInfoResource() {
+        return R.string.telecom_failed_call_info;
+    }
+
+    @Override
+    protected Class<? extends android.telecom.ConnectionService> getConnectionService() {
+        return ConnectionService.class;
+    }
+
+    @Override
+    protected String getConnectionServiceLabel() {
+        return "Call Failed Manager";
+    }
+
+    @Override
+    protected boolean onCallPlacedBackgroundThread() {
+        try {
+            if (!sLock.tryAcquire(1000, TimeUnit.MILLISECONDS)) {
+                return false;
+            }
+
+            // Wait for the listeners to be fired so the call is cleaned up.
+            SystemClock.sleep(1000);
+
+            // Make sure that there aren't any ongoing calls.
+            return !getTelecomManager().isInCall();
+        } catch (Exception e) {
+            return false;
+        }
+    }
+
+    public static class ConnectionService extends android.telecom.ConnectionService {
+        @Override
+        public Connection onCreateOutgoingConnection(
+                PhoneAccountHandle connectionManagerPhoneAccount,
+                ConnectionRequest request) {
+            sLock.release();
+            return Connection.createFailedConnection(
+                    new DisconnectCause(DisconnectCause.BUSY, "Test; no need to continue"));
+        }
+    }
+}
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/telecom/TelecomBaseTestActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/telecom/TelecomBaseTestActivity.java
new file mode 100644
index 0000000..03a986b
--- /dev/null
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/telecom/TelecomBaseTestActivity.java
@@ -0,0 +1,120 @@
+package com.android.cts.verifier.telecom;
+
+import android.content.ComponentName;
+import android.content.Intent;
+import android.net.Uri;
+import android.os.Bundle;
+import android.telecom.ConnectionService;
+import android.telecom.PhoneAccount;
+import android.telecom.PhoneAccountHandle;
+import android.telecom.TelecomManager;
+import android.view.View;
+import android.widget.Button;
+import android.widget.EditText;
+
+import com.android.cts.verifier.PassFailButtons;
+import com.android.cts.verifier.R;
+
+import java.util.Objects;
+
+public abstract class TelecomBaseTestActivity extends PassFailButtons.Activity {
+    protected PhoneAccountHandle mPhoneAccountHandle;
+
+    private Button mOpenSettingsBtn;
+    private Button mPlaceCallBtn;
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+
+        setResult(RESULT_CANCELED);
+        setContentView(R.layout.telecom_test_activity);
+        setPassFailButtonClickListeners();
+        setInfoResources(getTestTitleResource(), getTestInfoResource(), 0);
+
+        mOpenSettingsBtn = (Button) findViewById(R.id.open_settings);
+        mOpenSettingsBtn.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                mPhoneAccountHandle = new PhoneAccountHandle(
+                        new ComponentName(getApplicationContext(), getConnectionService()),
+                        getClass().getSimpleName()
+                );
+                PhoneAccount account = new PhoneAccount.Builder(mPhoneAccountHandle,
+                                getConnectionServiceLabel())
+                        .setCapabilities(PhoneAccount.CAPABILITY_CONNECTION_MANAGER)
+                        .build();
+
+                getTelecomManager().registerPhoneAccount(account);
+
+                Intent i = new Intent(TelecomManager.ACTION_CHANGE_PHONE_ACCOUNTS);
+                startActivity(i);
+            }
+        });
+
+        mPlaceCallBtn = (Button) findViewById(R.id.simulate_call);
+        mPlaceCallBtn.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                runTest();
+            }
+        });
+    }
+
+    @Override
+    protected void onResume() {
+        super.onResume();
+
+        PhoneAccountHandle defaultConnectionManager = getTelecomManager().getConnectionManager();
+        boolean isDefaultConnectionManager = mPhoneAccountHandle != null &&
+                Objects.equals(mPhoneAccountHandle, defaultConnectionManager);
+        mOpenSettingsBtn.setEnabled(!isDefaultConnectionManager);
+        mPlaceCallBtn.setEnabled(isDefaultConnectionManager);
+    }
+
+    abstract protected int getTestTitleResource();
+
+    abstract protected int getTestInfoResource();
+
+    abstract protected Class<? extends ConnectionService> getConnectionService();
+
+    abstract protected String getConnectionServiceLabel();
+
+    /**
+     * Perform any tests once the call has been placed. This is called from a background thread, so
+     * it is safe to block until the result is known.
+     *
+     * @return True if the test passed.
+     */
+    abstract protected boolean onCallPlacedBackgroundThread();
+
+    protected void runTest() {
+        new Thread() {
+            @Override
+            public void run() {
+                EditText phoneNumberEdit = (EditText) findViewById(R.id.phone_number);
+                String numberText = phoneNumberEdit.getText().toString();
+                Uri number = Uri.fromParts("tel", numberText, null);
+
+                Intent call = new Intent(Intent.ACTION_CALL);
+                call.setData(number);
+                startActivity(call);
+
+                boolean passed = onCallPlacedBackgroundThread();
+                setTestResultAndFinish(passed);
+            }
+        }.start();
+    }
+
+    protected TelecomManager getTelecomManager() {
+        return (TelecomManager) getSystemService(TELECOM_SERVICE);
+    }
+
+    @Override
+    public void setTestResultAndFinish(boolean passed) {
+        super.setTestResultAndFinish(passed);
+        if (mPhoneAccountHandle != null) {
+            getTelecomManager().unregisterPhoneAccount(mPhoneAccountHandle);
+        }
+    }
+}
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/telecom/TelecomTestActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/telecom/TelecomTestActivity.java
new file mode 100644
index 0000000..3f7596a
--- /dev/null
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/telecom/TelecomTestActivity.java
@@ -0,0 +1,35 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.cts.verifier.telecom;
+
+import com.android.cts.verifier.ManifestTestListAdapter;
+import com.android.cts.verifier.PassFailButtons;
+import com.android.cts.verifier.R;
+
+import android.os.Bundle;
+
+public class TelecomTestActivity extends PassFailButtons.TestListActivity {
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.pass_fail_list);
+        setPassFailButtonClickListeners();
+        setInfoResources(R.string.telecom_test_title, R.string.telecom_test_summary, -1);
+
+        setTestListAdapter(new ManifestTestListAdapter(this, getClass().getName()));
+    }
+}
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/telecomm/CancelCallTestActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/telecomm/CancelCallTestActivity.java
deleted file mode 100644
index 088cf49..0000000
--- a/apps/CtsVerifier/src/com/android/cts/verifier/telecomm/CancelCallTestActivity.java
+++ /dev/null
@@ -1,127 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.cts.verifier.telecomm;
-
-import com.android.cts.verifier.PassFailButtons;
-import com.android.cts.verifier.R;
-
-import android.content.ComponentName;
-import android.content.Intent;
-import android.net.Uri;
-import android.os.Bundle;
-import android.os.SystemClock;
-import android.telecomm.Connection;
-import android.telecomm.ConnectionRequest;
-import android.telecomm.ConnectionService;
-import android.telecomm.PhoneAccount;
-import android.telecomm.PhoneAccountHandle;
-import android.telecomm.TelecommManager;
-import android.view.View;
-
-import java.util.concurrent.Semaphore;
-import java.util.concurrent.TimeUnit;
-
-public class CancelCallTestActivity extends PassFailButtons.Activity {
-    private static final Semaphore sLock = new Semaphore(0);
-
-    private PhoneAccountHandle mPhoneAccountHandle;
-
-    @Override
-    protected void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-
-        setResult(RESULT_CANCELED);
-        setContentView(R.layout.telecomm_test_activity);
-        setPassFailButtonClickListeners();
-        setInfoResources(R.string.telecomm_cancel_call_title, R.string.telecomm_cancel_call_info, 0);
-
-        findViewById(R.id.open_settings).setOnClickListener(new View.OnClickListener() {
-            @Override
-            public void onClick(View v) {
-                mPhoneAccountHandle = new PhoneAccountHandle(
-                        new ComponentName(CancelCallTestActivity.this,
-                                CancellingConnectionService.class),
-                        getClass().getSimpleName()
-                );
-                PhoneAccount account = new PhoneAccount.Builder(mPhoneAccountHandle,
-                                                                "Call Cancel Manager")
-                        .setCapabilities(PhoneAccount.CAPABILITY_CONNECTION_MANAGER)
-                        .build();
-
-                getTelecommManager().registerPhoneAccount(account);
-
-                Intent i = new Intent(Intent.ACTION_MAIN)
-                        .setClassName("com.android.telecomm",
-                                "com.android.telecomm.PhoneAccountPreferencesActivity");
-                startActivity(i);
-            }
-        });
-
-        findViewById(R.id.simulate_call).setOnClickListener(new View.OnClickListener() {
-            @Override
-            public void onClick(View v) {
-                new Thread() {
-                    @Override
-                    public void run() {
-                        super.run();
-
-                        Intent call = new Intent(Intent.ACTION_CALL);
-                        call.setData(Uri.parse("tel:5552637643"));
-                        startActivity(call);
-                        try {
-                            if (!sLock.tryAcquire(1000, TimeUnit.MILLISECONDS)) {
-                                setTestResultAndFinish(false);
-                                return;
-                            }
-
-                            // Wait for the listeners to be fired so the call is cleaned up.
-                            SystemClock.sleep(1000);
-
-                            // Make sure that there aren't any ongoing calls.
-                            setTestResultAndFinish(!getTelecommManager().isInCall());
-                        } catch (Exception e) {
-                            setTestResultAndFinish(false);
-                            return;
-                        }
-                    }
-                }.start();
-            }
-        });
-    }
-
-    private TelecommManager getTelecommManager() {
-        return (TelecommManager) getSystemService(TELECOMM_SERVICE);
-    }
-
-    @Override
-    public void setTestResultAndFinish(boolean passed) {
-        super.setTestResultAndFinish(passed);
-        if (mPhoneAccountHandle != null) {
-            getTelecommManager().unregisterPhoneAccount(mPhoneAccountHandle);
-        }
-    }
-
-    public static class CancellingConnectionService extends ConnectionService {
-        @Override
-        public Connection onCreateOutgoingConnection(
-                PhoneAccountHandle connectionManagerPhoneAccount,
-                ConnectionRequest request) {
-            sLock.release();
-            return Connection.createCanceledConnection();
-        }
-    }
-}
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/telecomm/TelecommTestActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/telecomm/TelecommTestActivity.java
deleted file mode 100644
index 2db4de7..0000000
--- a/apps/CtsVerifier/src/com/android/cts/verifier/telecomm/TelecommTestActivity.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.cts.verifier.telecomm;
-
-import com.android.cts.verifier.ManifestTestListAdapter;
-import com.android.cts.verifier.PassFailButtons;
-import com.android.cts.verifier.R;
-
-import android.os.Bundle;
-
-public class TelecommTestActivity extends PassFailButtons.TestListActivity {
-    @Override
-    protected void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-        setContentView(R.layout.pass_fail_list);
-        setPassFailButtonClickListeners();
-        setInfoResources(R.string.telecomm_test_title, R.string.telecomm_test_summary, -1);
-
-        setTestListAdapter(new ManifestTestListAdapter(this, getClass().getName()));
-    }
-}
diff --git a/hostsidetests/appsecurity/test-apps/UsePermissionDiffCert/src/com/android/cts/usespermissiondiffcertapp/AccessPermissionWithDiffSigTest.java b/hostsidetests/appsecurity/test-apps/UsePermissionDiffCert/src/com/android/cts/usespermissiondiffcertapp/AccessPermissionWithDiffSigTest.java
index 8629a87..5378266 100644
--- a/hostsidetests/appsecurity/test-apps/UsePermissionDiffCert/src/com/android/cts/usespermissiondiffcertapp/AccessPermissionWithDiffSigTest.java
+++ b/hostsidetests/appsecurity/test-apps/UsePermissionDiffCert/src/com/android/cts/usespermissiondiffcertapp/AccessPermissionWithDiffSigTest.java
@@ -1539,4 +1539,71 @@
         assertWritingClipNotAllowed(clipMeowCat, "writing should have failed");
         assertNoPersistedUriPermission();
     }
+
+    /**
+     * Validate behavior of a direct permission grant, where the receiver of
+     * that permission revokes it.
+     */
+    public void testDirectGrantReceiverRevokeUriPermission() throws Exception {
+        final ContentResolver resolver = getContext().getContentResolver();
+
+        final Uri target = Uri.withAppendedPath(PERM_URI_GRANTING, "foo3");
+        final Uri targetMeow = Uri.withAppendedPath(target, "meow");
+        final Uri targetMeowCat = Uri.withAppendedPath(targetMeow, "cat");
+
+        final ClipData clip = makeSingleClipData(target);
+        final ClipData clipMeow = makeSingleClipData(targetMeow);
+        final ClipData clipMeowCat = makeSingleClipData(targetMeowCat);
+
+        // Make sure we can't see the target
+        assertReadingClipNotAllowed(clipMeow, "reading should have failed");
+        assertWritingClipNotAllowed(clipMeow, "writing should have failed");
+
+        // Give ourselves some grants:
+        // /meow/cat  WRITE|PERSISTABLE
+        // /meow      READ|PREFIX
+        // /meow      WRITE
+        grantClipUriPermissionViaContext(targetMeowCat, Intent.FLAG_GRANT_WRITE_URI_PERMISSION
+                | Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION);
+        grantClipUriPermissionViaContext(targetMeow, Intent.FLAG_GRANT_READ_URI_PERMISSION
+                | Intent.FLAG_GRANT_PREFIX_URI_PERMISSION);
+        grantClipUriPermissionViaContext(targetMeow, Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
+        SystemClock.sleep(2000);
+
+        long before = System.currentTimeMillis();
+        resolver.takePersistableUriPermission(targetMeowCat, Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
+        long after = System.currentTimeMillis();
+        assertPersistedUriPermission(targetMeowCat, Intent.FLAG_GRANT_WRITE_URI_PERMISSION, before, after);
+
+        // Verify they look good
+        assertReadingClipNotAllowed(clip, "reading should have failed");
+        assertReadingClipAllowed(clipMeow);
+        assertReadingClipAllowed(clipMeowCat);
+        assertWritingClipNotAllowed(clip, "writing should have failed");
+        assertWritingClipAllowed(clipMeow);
+        assertWritingClipAllowed(clipMeowCat);
+
+        // Revoke anyone with write under meow
+        getContext().revokeUriPermission(targetMeow, Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
+
+        // This should have nuked persisted permission at lower level, but it
+        // shoulnd't have touched our prefix read.
+        assertReadingClipNotAllowed(clip, "reading should have failed");
+        assertReadingClipAllowed(clipMeow);
+        assertReadingClipAllowed(clipMeowCat);
+        assertWritingClipNotAllowed(clip, "writing should have failed");
+        assertWritingClipNotAllowed(clipMeow, "writing should have failed");
+        assertWritingClipNotAllowed(clipMeowCat, "writing should have failed");
+        assertNoPersistedUriPermission();
+
+        // Revoking read at top of tree should nuke everything else
+        getContext().revokeUriPermission(target, Intent.FLAG_GRANT_READ_URI_PERMISSION);
+        assertReadingClipNotAllowed(clip, "reading should have failed");
+        assertReadingClipNotAllowed(clipMeow, "reading should have failed");
+        assertReadingClipNotAllowed(clipMeowCat, "reading should have failed");
+        assertWritingClipNotAllowed(clip, "writing should have failed");
+        assertWritingClipNotAllowed(clipMeow, "writing should have failed");
+        assertWritingClipNotAllowed(clipMeowCat, "writing should have failed");
+        assertNoPersistedUriPermission();
+    }
 }
diff --git a/hostsidetests/devicepolicy/Android.mk b/hostsidetests/devicepolicy/Android.mk
new file mode 100644
index 0000000..1f51494
--- /dev/null
+++ b/hostsidetests/devicepolicy/Android.mk
@@ -0,0 +1,32 @@
+# Copyright (C) 2014 The Android Open Source Project
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+LOCAL_PATH:= $(call my-dir)
+
+include $(CLEAR_VARS)
+
+LOCAL_MODULE := CtsDevicePolicyManagerTestCases
+
+LOCAL_MODULE_TAGS := optional
+
+LOCAL_SRC_FILES := $(call all-java-files-under, src)
+
+LOCAL_JAVA_LIBRARIES := junit ddmlib-prebuilt tradefed-prebuilt tools-common-prebuilt cts-tradefed
+
+LOCAL_CTS_TEST_PACKAGE := android.adminhostside
+
+include $(BUILD_CTS_HOST_JAVA_LIBRARY)
+
+# Build the test APKs using their own makefiles
+include $(call all-makefiles-under,$(LOCAL_PATH))
diff --git a/hostsidetests/devicepolicy/app/Android.mk b/hostsidetests/devicepolicy/app/Android.mk
new file mode 100644
index 0000000..a22ef3f
--- /dev/null
+++ b/hostsidetests/devicepolicy/app/Android.mk
@@ -0,0 +1,20 @@
+# Copyright (C) 2014 The Android Open Source Project
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+LOCAL_PATH := $(call my-dir)
+
+include $(CLEAR_VARS)
+
+# Build the test APKs using their own makefiles
+include $(call all-makefiles-under,$(LOCAL_PATH))
diff --git a/hostsidetests/devicepolicy/app/ProfileOwner/Android.mk b/hostsidetests/devicepolicy/app/ProfileOwner/Android.mk
new file mode 100644
index 0000000..a845163
--- /dev/null
+++ b/hostsidetests/devicepolicy/app/ProfileOwner/Android.mk
@@ -0,0 +1,31 @@
+# Copyright (C) 2014 The Android Open Source Project
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+LOCAL_PATH:= $(call my-dir)
+
+include $(CLEAR_VARS)
+
+LOCAL_PACKAGE_NAME := CtsProfileOwnerApp
+
+LOCAL_MODULE_TAGS := optional
+
+LOCAL_MODULE_PATH := $(TARGET_OUT_DATA_APPS)
+
+LOCAL_SRC_FILES := $(call all-java-files-under, src)
+
+LOCAL_JAVA_LIBRARIES := android.test.runner
+
+LOCAL_SDK_VERSION := current
+
+include $(BUILD_CTS_PACKAGE)
diff --git a/hostsidetests/devicepolicy/app/ProfileOwner/AndroidManifest.xml b/hostsidetests/devicepolicy/app/ProfileOwner/AndroidManifest.xml
new file mode 100644
index 0000000..1aaf99f
--- /dev/null
+++ b/hostsidetests/devicepolicy/app/ProfileOwner/AndroidManifest.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2014 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+    package="com.android.cts.profileowner">
+
+    <uses-sdk android:minSdkVersion="20"/>
+
+    <application>
+        <uses-library android:name="android.test.runner" />
+        <receiver
+            android:name="com.android.cts.profileowner.BaseProfileOwnerTest$BasicAdminReceiver"
+            android:permission="android.permission.BIND_DEVICE_ADMIN">
+            <meta-data android:name="android.app.device_admin"
+                       android:resource="@xml/device_admin" />
+            <intent-filter>
+                <action android:name="android.app.action.DEVICE_ADMIN_ENABLED" />
+            </intent-filter>
+        </receiver>
+    </application>
+
+    <instrumentation android:name="android.test.InstrumentationTestRunner"
+                     android:targetPackage="com.android.cts.profileowner"
+                     android:label="Profile Owner CTS Tests"/>
+</manifest>
diff --git a/hostsidetests/devicepolicy/app/ProfileOwner/res/values/strings.xml b/hostsidetests/devicepolicy/app/ProfileOwner/res/values/strings.xml
new file mode 100644
index 0000000..640b8b5
--- /dev/null
+++ b/hostsidetests/devicepolicy/app/ProfileOwner/res/values/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2014 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <!-- Label for this package -->
+    <string name="label">Android CTS - Profile Owner</string>
+</resources>
\ No newline at end of file
diff --git a/hostsidetests/devicepolicy/app/ProfileOwner/res/xml/device_admin.xml b/hostsidetests/devicepolicy/app/ProfileOwner/res/xml/device_admin.xml
new file mode 100644
index 0000000..8f39ed0
--- /dev/null
+++ b/hostsidetests/devicepolicy/app/ProfileOwner/res/xml/device_admin.xml
@@ -0,0 +1,19 @@
+<!-- Copyright (C) 2014 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<device-admin xmlns:android="http://schemas.android.com/apk/res/android" android:visible="false">
+    <uses-policies>
+        <wipe-data />
+    </uses-policies>
+</device-admin>
diff --git a/hostsidetests/devicepolicy/app/ProfileOwner/src/com/android/cts/profileowner/BaseProfileOwnerTest.java b/hostsidetests/devicepolicy/app/ProfileOwner/src/com/android/cts/profileowner/BaseProfileOwnerTest.java
new file mode 100644
index 0000000..e7ccc74
--- /dev/null
+++ b/hostsidetests/devicepolicy/app/ProfileOwner/src/com/android/cts/profileowner/BaseProfileOwnerTest.java
@@ -0,0 +1,54 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.cts.profileowner;
+
+import android.app.admin.DeviceAdminReceiver;
+import android.app.admin.DevicePolicyManager;
+import android.content.ComponentName;
+import android.content.Context;
+import android.test.AndroidTestCase;
+
+/**
+ * Base class for profile-owner based tests.
+ *
+ * This class handles making sure that the test is the profile owner and that it has an active admin
+ * registered, so that all tests may assume these are done.
+ */
+public class BaseProfileOwnerTest extends AndroidTestCase {
+
+    public static class BasicAdminReceiver extends DeviceAdminReceiver {
+    }
+
+    static final ComponentName ADMIN_RECEIVER_COMPONENT = new ComponentName(
+            BasicAdminReceiver.class.getPackage().getName(), BasicAdminReceiver.class.getName());
+
+    protected DevicePolicyManager mDevicePolicyManager;
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+
+       mDevicePolicyManager = (DevicePolicyManager)
+               mContext.getSystemService(Context.DEVICE_POLICY_SERVICE);
+       assertNotNull(mDevicePolicyManager);
+       // TODO: Only check this if we are running as the profile user. Otherwise, maybe check
+       // that there is a profile and that the below holds for it? If we don't want to do these
+       // checks, we could get rid for this class altogether.
+       assertTrue(mDevicePolicyManager.isAdminActive(ADMIN_RECEIVER_COMPONENT));
+       assertTrue(mDevicePolicyManager.isProfileOwnerApp(
+               ADMIN_RECEIVER_COMPONENT.getPackageName()));
+    }
+}
diff --git a/hostsidetests/devicepolicy/app/ProfileOwner/src/com/android/cts/profileowner/ProfileOwnerSetupTest.java b/hostsidetests/devicepolicy/app/ProfileOwner/src/com/android/cts/profileowner/ProfileOwnerSetupTest.java
new file mode 100644
index 0000000..6fc0eb9
--- /dev/null
+++ b/hostsidetests/devicepolicy/app/ProfileOwner/src/com/android/cts/profileowner/ProfileOwnerSetupTest.java
@@ -0,0 +1,27 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.cts.profileowner;
+
+
+public class ProfileOwnerSetupTest extends BaseProfileOwnerTest {
+
+    // This test verifies that the setUp assertions on the base class are working to verify
+    // we are the profile owner and have a valid active admin.
+    public void testProfileOwnerSetup() {
+        // Empty test. We just want the assertions from super.setUp() to be executed.
+    }
+
+}
diff --git a/hostsidetests/devicepolicy/src/com/android/cts/devicepolicy/ProfileOwnerTest.java b/hostsidetests/devicepolicy/src/com/android/cts/devicepolicy/ProfileOwnerTest.java
new file mode 100644
index 0000000..e2f2f4e
--- /dev/null
+++ b/hostsidetests/devicepolicy/src/com/android/cts/devicepolicy/ProfileOwnerTest.java
@@ -0,0 +1,227 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.cts.devicepolicy;
+
+import com.android.cts.tradefed.build.CtsBuildHelper;
+import com.android.ddmlib.Log.LogLevel;
+import com.android.ddmlib.testrunner.InstrumentationResultParser;
+import com.android.ddmlib.testrunner.RemoteAndroidTestRunner;
+import com.android.ddmlib.testrunner.TestIdentifier;
+import com.android.tradefed.build.IBuildInfo;
+import com.android.tradefed.device.DeviceNotAvailableException;
+import com.android.tradefed.device.ITestDevice;
+import com.android.tradefed.log.LogUtil.CLog;
+import com.android.tradefed.result.CollectingTestListener;
+import com.android.tradefed.result.TestResult;
+import com.android.tradefed.result.TestResult.TestStatus;
+import com.android.tradefed.result.TestRunResult;
+import com.android.tradefed.testtype.DeviceTestCase;
+import com.android.tradefed.testtype.IBuildReceiver;
+
+import java.io.FileNotFoundException;
+import java.util.HashSet;
+import java.util.Map;
+
+import javax.annotation.Nullable;
+
+/**
+ * Set of tests for Profile Owner use cases.
+ */
+public class ProfileOwnerTest extends DeviceTestCase implements IBuildReceiver {
+
+    private static final String RUNNER = "android.test.InstrumentationTestRunner";
+
+    private static final String PROFILE_OWNER_PKG = "com.android.cts.profileowner";
+    private static final String PROFILE_OWNER_APK = "CtsProfileOwnerApp.apk";
+
+    private static final String ADMIN_RECEIVER_TEST_CLASS =
+            PROFILE_OWNER_PKG + ".BaseProfileOwnerTest$BasicAdminReceiver";
+
+    private static final String[] REQUIRED_DEVICE_FEATURES = new String[] {
+        "android.software.managed_users",
+        "android.software.device_admin" };
+
+    private CtsBuildHelper mCtsBuild;
+    private int mUserId;
+    private boolean mHasFeature;
+
+    @Override
+    public void setBuild(IBuildInfo buildInfo) {
+        mCtsBuild = CtsBuildHelper.createBuildHelper(buildInfo);
+    }
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+        assertNotNull(mCtsBuild);  // ensure build has been set before test is run.
+        mHasFeature = hasDeviceFeatures(REQUIRED_DEVICE_FEATURES);
+
+        if (mHasFeature) {
+            mUserId = createUser();
+            installApp(PROFILE_OWNER_APK);
+            setProfileOwner(PROFILE_OWNER_PKG + "/" + ADMIN_RECEIVER_TEST_CLASS);
+        }
+    }
+
+    @Override
+    protected void tearDown() throws Exception {
+        if (mHasFeature) {
+            // Remove the user that we created on setUp(), and the app that we installed.
+            String removeUserCommand = "pm remove-user " + mUserId;
+            CLog.logAndDisplay(LogLevel.INFO, "Output for command " + removeUserCommand + ": "
+                    + getDevice().executeShellCommand(removeUserCommand));
+            getDevice().uninstallPackage(PROFILE_OWNER_PKG);
+        }
+
+        super.tearDown();
+    }
+
+    public void testProfileOwner() throws Exception {
+        if (!mHasFeature) {
+            return;
+        }
+        // Runs all tests classes from the package, as the profile user.
+        assertTrue(runDeviceTestsAsUser(PROFILE_OWNER_PKG, null /*testClassName*/, mUserId));
+    }
+
+    private boolean hasDeviceFeatures(String[] requiredFeatures)
+            throws DeviceNotAvailableException {
+        // TODO: Move this logic to ITestDevice.
+        String command = "pm list features";
+        String commandOutput = getDevice().executeShellCommand(command);
+
+        // Extract the id of the new user.
+        HashSet<String> availableFeatures = new HashSet<String>();
+        for (String feature: commandOutput.split("\\s+")) {
+            // Each line in the output of the command has the format "feature:{FEATURE_VALUE}".
+            String[] tokens = feature.split(":");
+            assertTrue(tokens.length > 1);
+            assertEquals("feature", tokens[0]);
+            availableFeatures.add(tokens[1]);
+        }
+
+        for (String requiredFeature : requiredFeatures) {
+            if(!availableFeatures.contains(requiredFeature)) {
+                CLog.logAndDisplay(LogLevel.INFO, "Device doesn't have required feature "
+                        + requiredFeature + ". Tests won't run.");
+                return false;
+            }
+        }
+        return true;
+    }
+
+    private void installApp(String fileName)
+            throws FileNotFoundException, DeviceNotAvailableException {
+        String installResult = getDevice().installPackage(mCtsBuild.getTestApp(fileName), true);
+        assertNull(String.format("Failed to install %s, Reason: %s", fileName, installResult),
+                installResult);
+    }
+
+    private int createUser() throws DeviceNotAvailableException {
+        String command =
+                "pm create-user --profileOf 0 --managed TestProfile_" + System.currentTimeMillis();
+        String commandOutput = getDevice().executeShellCommand(command);
+        CLog.logAndDisplay(LogLevel.INFO, "Output for command " + command + ": " + commandOutput);
+
+        // Extract the id of the new user.
+        String[] tokens = commandOutput.split("\\s+");
+        assertTrue(tokens.length > 0);
+        assertEquals("Success:", tokens[0]);
+        return Integer.parseInt(tokens[tokens.length-1]);
+    }
+
+    private void setProfileOwner(String componentName) throws DeviceNotAvailableException {
+        String command = "dpm set-profile-owner '" + componentName + "' " + mUserId;
+        String commandOutput = getDevice().executeShellCommand(command);
+        CLog.logAndDisplay(LogLevel.INFO, "Output for command " + command + ": " + commandOutput);
+        assertTrue(commandOutput.startsWith("Success:"));
+    }
+
+    /** Returns true if the specified tests passed. Tests are run as user owner. */
+    private boolean runDeviceTests(String pkgName, @Nullable String testClassName)
+            throws DeviceNotAvailableException {
+        return runDeviceTests(pkgName, testClassName, null /*testMethodName*/, null /*userId*/);
+    }
+
+    /** Returns true if the specified tests passed. Tests are run as given user. */
+    private boolean runDeviceTestsAsUser(String pkgName, @Nullable String testClassName, int userId)
+            throws DeviceNotAvailableException {
+        return runDeviceTests(pkgName, testClassName, null /*testMethodName*/, userId);
+    }
+
+    private boolean runDeviceTests(String pkgName, @Nullable String testClassName,
+            @Nullable String testMethodName, @Nullable Integer userId)
+            throws DeviceNotAvailableException {
+        TestRunResult runResult = (userId == null)
+                ? doRunTests(pkgName, testClassName, testMethodName)
+                : doRunTestsAsUser(pkgName, testClassName, testMethodName, userId);
+        printTestResult(runResult);
+        return !runResult.hasFailedTests() && runResult.getNumPassedTests() > 0;
+    }
+
+    /** Helper method to run tests and return the listener that collected the results. */
+    private TestRunResult doRunTests(
+            String pkgName, @Nullable String testClassName, @Nullable String testMethodName)
+            throws DeviceNotAvailableException {
+        RemoteAndroidTestRunner testRunner = new RemoteAndroidTestRunner(
+                pkgName, RUNNER, getDevice().getIDevice());
+        if (testClassName != null && testMethodName != null) {
+            testRunner.setMethodName(testClassName, testMethodName);
+        } else if (testClassName != null) {
+            testRunner.setClassName(testClassName);
+        }
+
+        CollectingTestListener listener = new CollectingTestListener();
+        assertTrue(getDevice().runInstrumentationTests(testRunner, listener));
+        return listener.getCurrentRunResults();
+    }
+
+    private TestRunResult doRunTestsAsUser(String pkgName, @Nullable String testClassName,
+            @Nullable String testMethodName, int userId)
+            throws DeviceNotAvailableException {
+        // TODO: move this to RemoteAndroidTestRunner once it supports users. Should be straight
+        // forward to add a RemoteAndroidTestRunner.setUser(userId) method. Then we can merge both
+        // doRunTests* methods.
+        StringBuilder testsToRun = new StringBuilder();
+        if (testClassName != null) {
+            testsToRun.append("-e class " + testClassName);
+            if (testMethodName != null) {
+                testsToRun.append("#" + testMethodName);
+            }
+        }
+        String command = "am instrument --user " + userId + " -w -r " + testsToRun + " "
+                + pkgName + "/" + RUNNER;
+        CLog.i("Running " + command);
+
+        CollectingTestListener listener = new CollectingTestListener();
+        InstrumentationResultParser parser = new InstrumentationResultParser(pkgName, listener);
+        getDevice().executeShellCommand(command, parser);
+        return listener.getCurrentRunResults();
+    }
+
+    private void printTestResult(TestRunResult runResult) {
+        for (Map.Entry<TestIdentifier, TestResult> testEntry :
+                runResult.getTestResults().entrySet()) {
+            TestResult testResult = testEntry.getValue();
+            CLog.logAndDisplay(LogLevel.INFO,
+                    "Test " + testEntry.getKey() + ": " + testResult.getStatus());
+            if (testResult.getStatus() != TestStatus.PASSED) {
+                CLog.logAndDisplay(LogLevel.WARN, testResult.getStackTrace());
+            }
+        }
+    }
+}
diff --git a/hostsidetests/security/Android.mk b/hostsidetests/security/Android.mk
new file mode 100644
index 0000000..9796979
--- /dev/null
+++ b/hostsidetests/security/Android.mk
@@ -0,0 +1,34 @@
+# Copyright (C) 2014 The Android Open Source Project
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+LOCAL_PATH := $(call my-dir)
+
+include $(CLEAR_VARS)
+
+LOCAL_SRC_FILES := $(call all-java-files-under, src)
+
+LOCAL_MODULE_TAGS := optional
+
+# Must match the package name in CtsTestCaseList.mk
+LOCAL_MODULE := CtsSecurityHostTestCases
+
+LOCAL_JAVA_LIBRARIES := cts-tradefed ddmlib-prebuilt tradefed-prebuilt
+
+LOCAL_CTS_TEST_PACKAGE := android.host.security
+
+LOCAL_JAVA_RESOURCE_FILES := $(HOST_OUT_EXECUTABLES)/sepolicy-analyze
+
+include $(BUILD_CTS_HOST_JAVA_LIBRARY)
+
+include $(call all-makefiles-under,$(LOCAL_PATH))
diff --git a/hostsidetests/security/src/android/security/cts/SELinuxHostTest.java b/hostsidetests/security/src/android/security/cts/SELinuxHostTest.java
new file mode 100644
index 0000000..e2c98fe
--- /dev/null
+++ b/hostsidetests/security/src/android/security/cts/SELinuxHostTest.java
@@ -0,0 +1,100 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.security.cts;
+
+import com.android.cts.tradefed.build.CtsBuildHelper;
+import com.android.ddmlib.Log;
+import com.android.ddmlib.Log.LogLevel;
+import com.android.tradefed.build.IBuildInfo;
+import com.android.tradefed.device.ITestDevice;
+import com.android.tradefed.testtype.DeviceTestCase;
+import com.android.tradefed.testtype.IBuildReceiver;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.FileOutputStream;
+import java.lang.String;
+import java.net.URL;
+import java.util.Scanner;
+
+/**
+ * Host-side SELinux tests.
+ *
+ * These tests analyze the policy file in use on the subject device directly or
+ * run as the shell user to evaluate aspects of the state of SELinux on the test
+ * device which otherwise would not be available to a normal apk.
+ */
+public class SELinuxHostTest extends DeviceTestCase {
+
+    /**
+     * A reference to the device under test.
+     */
+    private ITestDevice mDevice;
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+        mDevice = getDevice();
+    }
+
+    /**
+     * Tests that all domains in the running policy file are in enforcing mode
+     *
+     * @throws Exception
+     */
+    public void testAllEnforcing() throws Exception {
+
+        /* retrieve the sepolicy-analyze executable from jar */
+        InputStream is = this.getClass().getResourceAsStream("/sepolicy-analyze");
+        File execFile = File.createTempFile("sepolicy-analyze", ".tmp");
+        FileOutputStream os = new FileOutputStream(execFile);
+        int rByte = 0;
+        while ((rByte = is.read()) != -1) {
+            os.write(rByte);
+        }
+        os.flush();
+        os.close();
+        execFile.setExecutable(true);
+
+        /* obtain sepolicy file from running device */
+        File policyFile = File.createTempFile("sepolicy", ".tmp");
+        mDevice.executeAdbCommand("pull", "/sys/fs/selinux/policy", policyFile.getAbsolutePath());
+
+        /* run sepolicy-analyze permissive check on policy file */
+        ProcessBuilder pb = new ProcessBuilder(execFile.getAbsolutePath(), "-p", "-P",
+                policyFile.getAbsolutePath());
+        pb.redirectOutput(ProcessBuilder.Redirect.PIPE);
+        pb.redirectErrorStream(true);
+        Process p = pb.start();
+        p.waitFor();
+        BufferedReader result = new BufferedReader(new InputStreamReader(p.getInputStream()));
+        String line;
+        StringBuilder errorString = new StringBuilder();
+        while ((line = result.readLine()) != null) {
+            errorString.append(line);
+            errorString.append("\n");
+        }
+
+        /* clean up and check condition */
+        execFile.delete();
+        policyFile.delete();
+        assertTrue("The following SELinux domains were found to be in permissive mode:\n"
+                   + errorString, errorString.length() == 0);
+    }
+}
diff --git a/tests/AndroidManifest.xml b/tests/AndroidManifest.xml
index 645eb3b..9190da8 100644
--- a/tests/AndroidManifest.xml
+++ b/tests/AndroidManifest.xml
@@ -858,16 +858,6 @@
             </intent-filter>
         </receiver>
 
-        <!-- Used for PackageManager test, don't delete this MockContentProvider provider -->
-        <provider android:name="android.content.cts.MockContentProvider" android:authorities="ctstest"
-            android:multiprocess="false" />
-        <provider android:name="android.content.cts.DummyProvider"
-            android:authorities="android.content.cts.dummyprovider"
-            android:multiprocess="true" />
-        <provider android:name="android.content.cts.MockRemoteContentProvider"
-            android:authorities="remotectstest"
-            android:process=":remoteprovider" android:multiprocess="false" />
-
         <activity android:name="android.app.cts.ChildTabActivity" android:label="ChildTabActivity" />
 
         <activity android:name="android.app.cts.LauncherActivityStub"
diff --git a/tests/expectations/knownfailures.txt b/tests/expectations/knownfailures.txt
index 0ab6acb..3802c73 100644
--- a/tests/expectations/knownfailures.txt
+++ b/tests/expectations/knownfailures.txt
@@ -54,5 +54,31 @@
     "android.openglperf.cts.GlVboPerfTest#testVboWithVaryingIndexBufferNumbers"
   ],
   bug: 17394321
+},
+{
+  description: "this test deadlocks on some devices, freezing CTS runs, marking known failure until resolved",
+  names: [
+    "android.hardware.camera2.cts.RobustnessTest#testMandatoryOutputCombinations"
+  ],
+  bug: 17511208
+},
+{
+  description: "these tests require a good test scene, so they fail if run in random conditions",
+  names: [
+    "android.hardware.camera2.cts.AllocationTest#testBlackWhite",
+    "android.hardware.camera2.cts.AllocationTest#testParamSensitivity"
+  ],
+  bug: 17530117
+},
+{
+  description: "these tests locks the screen with an emtpy password or swipe-to-unlock, blocking subsequent test to dismiss keyguard",
+  names: [
+    "android.admin.cts.DevicePolicyManagerTest#testPasswordQuality_something",
+    "android.admin.cts.DevicePolicyManagerTest#testPasswordQuality_numeric",
+    "android.admin.cts.DevicePolicyManagerTest#testPasswordQuality_alphabetic",
+    "android.admin.cts.DevicePolicyManagerTest#testPasswordQuality_alphanumeric",
+    "android.admin.cts.DevicePolicyManagerTest#testGetMaximumFailedPasswordsForWipe"
+  ],
+  bug: 17496766
 }
 ]
diff --git a/tests/jni/Android.mk b/tests/jni/Android.mk
index d9bc51b..a3e401e 100644
--- a/tests/jni/Android.mk
+++ b/tests/jni/Android.mk
@@ -23,6 +23,7 @@
 
 LOCAL_SRC_FILES := \
 		CtsJniOnLoad.cpp \
+		android_os_cts_CpuInstructions.cpp.arm \
 		android_os_cts_TaggedPointer.cpp \
 		android_os_cts_OSFeatures.cpp \
 		android_os_cts_FileUtils.cpp \
diff --git a/tests/jni/CtsJniOnLoad.cpp b/tests/jni/CtsJniOnLoad.cpp
index 06be7c7..ef69732 100644
--- a/tests/jni/CtsJniOnLoad.cpp
+++ b/tests/jni/CtsJniOnLoad.cpp
@@ -19,6 +19,8 @@
 
 extern int register_android_os_cts_CpuFeatures(JNIEnv*);
 
+extern int register_android_os_cts_CpuInstructions(JNIEnv*);
+
 extern int register_android_os_cts_TaggedPointer(JNIEnv*);
 
 extern int register_android_os_cts_OSFeatures(JNIEnv*);
@@ -36,6 +38,10 @@
         return JNI_ERR;
     }
 
+    if (register_android_os_cts_CpuInstructions(env)) {
+        return JNI_ERR;
+    }
+
     if (register_android_os_cts_TaggedPointer(env)) {
         return JNI_ERR;
     }
diff --git a/tests/jni/android_os_cts_CpuInstructions.cpp b/tests/jni/android_os_cts_CpuInstructions.cpp
new file mode 100644
index 0000000..3eea71b
--- /dev/null
+++ b/tests/jni/android_os_cts_CpuInstructions.cpp
@@ -0,0 +1,148 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <jni.h>
+
+#if defined(__arm__) || defined(__aarch64__)
+#include <setjmp.h>
+#include <signal.h>
+
+static sigjmp_buf jmpenv;
+
+static void sigill_handler(int signum __attribute__((unused)))
+{
+    siglongjmp(jmpenv, 1);
+}
+
+static int do_sigsetjmp()
+{
+    return sigsetjmp(jmpenv, 1);
+}
+
+static jboolean test_instruction(void (*func)())
+{
+    struct sigaction sigill_act;
+    struct sigaction oldact;
+    int err;
+    jboolean ret = true;
+
+    memset(&sigill_act, 0, sizeof(sigill_act));
+    sigill_act.sa_handler = sigill_handler;
+
+    err = sigaction(SIGILL, &sigill_act, &oldact);
+    if (err) {
+        ret = false;
+        goto err_sigaction;
+    }
+
+    if (do_sigsetjmp()) {
+        ret = false;
+        goto err_segill;
+    }
+
+    func();
+
+err_segill:
+    sigaction(SIGILL, &oldact, NULL);
+err_sigaction:
+    return ret;
+}
+#endif
+
+#ifdef __aarch64__
+static void cntvct()
+{
+    asm volatile ( "mrs x0, cntvct_el0" : : : "x0" );
+}
+
+jboolean android_os_cts_CpuInstructions_canReadCntvct(JNIEnv *, jobject)
+{
+    return test_instruction(cntvct);
+}
+#else
+jboolean android_os_cts_CpuInstructions_canReadCntvct(JNIEnv *, jobject)
+{
+    return false;
+}
+#endif
+
+#ifdef __arm__
+static void swp()
+{
+    uint32_t dummy = 0;
+    uint32_t *ptr = &dummy;
+    asm volatile ( "swp r0, r0, [%0]" : "+r"(ptr) : : "r0" );
+}
+
+static void setend()
+{
+    asm volatile (
+        "setend be" "\n"
+        "setend le" "\n"
+    );
+}
+
+static void cp15_dsb()
+{
+    asm volatile ( "mcr p15, 0, %0, c7, c10, 4" : : "r"(0) );
+}
+
+jboolean android_os_cts_CpuInstructions_hasSwp(JNIEnv *, jobject)
+{
+    return test_instruction(swp);
+}
+
+jboolean android_os_cts_CpuInstructions_hasSetend(JNIEnv *, jobject)
+{
+    return test_instruction(setend);
+}
+
+jboolean android_os_cts_CpuInstructions_hasCp15Barriers(JNIEnv *, jobject)
+{
+    return test_instruction(cp15_dsb);
+}
+#else
+jboolean android_os_cts_CpuInstructions_hasSwp(JNIEnv *, jobject)
+{
+    return false;
+}
+
+jboolean android_os_cts_CpuInstructions_hasSetend(JNIEnv *, jobject)
+{
+    return false;
+}
+
+jboolean android_os_cts_CpuInstructions_hasCp15Barriers(JNIEnv *, jobject)
+{
+    return false;
+}
+#endif
+
+static JNINativeMethod gMethods[] = {
+    { "canReadCntvct", "()Z", (void *)android_os_cts_CpuInstructions_canReadCntvct },
+    { "hasSwp", "()Z", (void *)android_os_cts_CpuInstructions_hasSwp },
+    { "hasSetend", "()Z", (void *)android_os_cts_CpuInstructions_hasSetend },
+    { "hasCp15Barriers", "()Z",
+            (void *)android_os_cts_CpuInstructions_hasCp15Barriers },
+};
+
+int register_android_os_cts_CpuInstructions(JNIEnv *env)
+{
+    jclass clazz = env->FindClass("android/os/cts/CpuInstructions");
+
+    return env->RegisterNatives(clazz, gMethods,
+            sizeof(gMethods) / sizeof(JNINativeMethod));
+}
diff --git a/tests/res/layout/autocompletetextview_layout.xml b/tests/res/layout/autocompletetextview_layout.xml
index be1d284..c2404d5 100644
--- a/tests/res/layout/autocompletetextview_layout.xml
+++ b/tests/res/layout/autocompletetextview_layout.xml
@@ -28,5 +28,6 @@
         android:completionThreshold="1"
         android:completionHint="@string/tabs_1"
         android:layout_width="match_parent" 
-        android:layout_height="wrap_content" />
+        android:layout_height="wrap_content"
+        android:inputType="none"/>
 </LinearLayout>
diff --git a/tests/res/layout/popupwindow.xml b/tests/res/layout/popupwindow.xml
index e6b0aed..2508115 100644
--- a/tests/res/layout/popupwindow.xml
+++ b/tests/res/layout/popupwindow.xml
@@ -16,17 +16,16 @@
 
 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
                 android:layout_width="match_parent"
-                android:layout_height="wrap_content"
+                android:layout_height="match_parent"
                 android:orientation="vertical">
 
     <TextView android:id="@+id/anchor_upper"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
-        android:text="@string/text_view_hint"
-        android:layout_weight="1"/>
+        android:text="@string/text_view_hint" />
 
     <LinearLayout android:layout_width="match_parent"
-                android:layout_height="wrap_content"
+                android:layout_height="0dp"
                 android:layout_weight="1">
 
         <TextView android:id="@+id/anchor_middle_left"
@@ -46,7 +45,6 @@
     <TextView android:id="@+id/anchor_lower"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
-        android:text="@string/text_view_hint"
-        android:layout_weight="1"/>
+        android:text="@string/text_view_hint" />
 
 </LinearLayout>
diff --git a/tests/res/layout/textview_layout.xml b/tests/res/layout/textview_layout.xml
index 108e3f0..d069df2 100644
--- a/tests/res/layout/textview_layout.xml
+++ b/tests/res/layout/textview_layout.xml
@@ -36,6 +36,7 @@
                     android:typeface="normal"
                     android:textSize="20px"
                     android:textStyle="normal"
+                    android:textAppearance="@null"
                     android:layout_width="wrap_content"
                     android:layout_height="wrap_content"/>
         
diff --git a/tests/src/android/content/cts/AvailableIntentsActivity.java b/tests/src/android/content/cts/AvailableIntentsActivity.java
deleted file mode 100644
index ac676de..0000000
--- a/tests/src/android/content/cts/AvailableIntentsActivity.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.content.cts;
-
-import com.android.cts.stub.R;
-
-import android.app.Activity;
-import android.os.Bundle;
-
-/**
- * This is a stub activity for test available intents. We do not care about
- * what it layouts. We only need an activity even if it's empty for this test.
- */
-public class AvailableIntentsActivity extends Activity {
-    @Override
-    public void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-        setContentView(R.layout.available_intents_layout);
-    }
-}
diff --git a/tests/src/android/content/cts/ContextWrapperStubActivity.java b/tests/src/android/content/cts/ContextWrapperStubActivity.java
deleted file mode 100644
index 977cedc..0000000
--- a/tests/src/android/content/cts/ContextWrapperStubActivity.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.content.cts;
-
-// Need the following import to get access to the app resources, since this
-// class is in a sub-package.
-import android.app.Activity;
-import android.os.Bundle;
-
-import com.android.cts.stub.R;
-
-public class ContextWrapperStubActivity extends Activity {
-    @Override
-    public void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-
-        setContentView(R.layout.local_sample);
-    }
-}
-
diff --git a/tests/src/android/graphics/drawable/cts/DrawableTestUtils.java b/tests/src/android/graphics/drawable/cts/DrawableTestUtils.java
deleted file mode 100644
index 73574e9..0000000
--- a/tests/src/android/graphics/drawable/cts/DrawableTestUtils.java
+++ /dev/null
@@ -1,88 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.graphics.drawable.cts;
-
-import android.content.res.XmlResourceParser;
-import android.util.AttributeSet;
-import android.util.Xml;
-
-import java.io.IOException;
-
-import org.xmlpull.v1.XmlPullParser;
-import org.xmlpull.v1.XmlPullParserException;
-
-/**
- * The useful methods for graphics.drawable test.
- */
-public class DrawableTestUtils {
-
-    public static void skipCurrentTag(XmlPullParser parser)
-            throws XmlPullParserException, IOException {
-        int outerDepth = parser.getDepth();
-        int type;
-        while ((type=parser.next()) != XmlPullParser.END_DOCUMENT
-               && (type != XmlPullParser.END_TAG
-                       || parser.getDepth() > outerDepth)) {
-        }
-    }
-    
-    /**
-     * Retrieve an AttributeSet from a XML.
-     *
-     * @param parser the XmlPullParser to use for the xml parsing.
-     * @param searchedNodeName the name of the target node.
-     * @return the AttributeSet retrieved from specified node.
-     * @throws IOException
-     * @throws XmlPullParserException
-     */
-    public static AttributeSet getAttributeSet(XmlResourceParser parser, String searchedNodeName)
-            throws XmlPullParserException, IOException {
-        AttributeSet attrs = null;
-        int type;
-        while ((type = parser.next()) != XmlPullParser.END_DOCUMENT
-                && type != XmlPullParser.START_TAG) {
-        }
-        String nodeName = parser.getName();
-        if (!"alias".equals(nodeName)) {
-            throw new RuntimeException();
-        }
-        int outerDepth = parser.getDepth();
-        while ((type = parser.next()) != XmlPullParser.END_DOCUMENT
-                && (type != XmlPullParser.END_TAG || parser.getDepth() > outerDepth)) {
-            if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) {
-                continue;
-            }
-            nodeName = parser.getName();
-            if (searchedNodeName.equals(nodeName)) {
-                outerDepth = parser.getDepth();
-                while ((type = parser.next()) != XmlPullParser.END_DOCUMENT
-                        && (type != XmlPullParser.END_TAG || parser.getDepth() > outerDepth)) {
-                    if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) {
-                        continue;
-                    }
-                    nodeName = parser.getName();
-                    attrs = Xml.asAttributeSet(parser);
-                    break;
-                }
-                break;
-            } else {
-                skipCurrentTag(parser);
-            }
-        }
-        return attrs;
-    }
-}
diff --git a/tests/src/android/hardware/camera2/cts/Camera2MultiViewStubActivity.java b/tests/src/android/hardware/camera2/cts/Camera2MultiViewStubActivity.java
deleted file mode 100644
index 28781d3..0000000
--- a/tests/src/android/hardware/camera2/cts/Camera2MultiViewStubActivity.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * Copyright 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.hardware.camera2.cts;
-
-import android.app.Activity;
-import android.os.Bundle;
-import android.util.Log;
-import android.view.SurfaceView;
-import android.view.TextureView;
-import android.view.WindowManager;
-
-import com.android.cts.stub.R;
-
-public class Camera2MultiViewStubActivity extends Activity {
-    private final static String TAG = "Camera2MultiViewStubActivity";
-    private TextureView[] mTextureView = new TextureView[2];
-    private SurfaceView[] mSurfaceView = new SurfaceView[2];
-
-    @Override
-    protected void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-        setContentView(R.layout.multi_view);
-        mTextureView[0] = (TextureView) findViewById(R.id.texture_view_1);
-        mTextureView[1] = (TextureView) findViewById(R.id.texture_view_2);
-        mSurfaceView[0] = (SurfaceView) findViewById(R.id.surface_view_1);
-        mSurfaceView[1] = (SurfaceView) findViewById(R.id.surface_view_2);
-
-        //Make sure screen is on when this activity window is visible to the user.
-        getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
-    }
-
-    public TextureView getTextureView(int index) {
-        if (index < 0 || index > 1) {
-            throw new IllegalArgumentException("Texture view index must be 0 or 1");
-        }
-        return mTextureView[index];
-    }
-
-    public SurfaceView getSurfaceView(int index) {
-        if (index < 0 || index > 1) {
-            throw new IllegalArgumentException("Surface view index must be 0 or 1");
-        }
-        return mSurfaceView[index];
-    }
-}
diff --git a/tests/src/android/hardware/camera2/cts/Camera2SurfaceViewStubActivity.java b/tests/src/android/hardware/camera2/cts/Camera2SurfaceViewStubActivity.java
deleted file mode 100644
index 47b4cba..0000000
--- a/tests/src/android/hardware/camera2/cts/Camera2SurfaceViewStubActivity.java
+++ /dev/null
@@ -1,97 +0,0 @@
-/*
- * Copyright 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.hardware.camera2.cts;
-
-import android.app.Activity;
-import android.os.Bundle;
-import android.os.ConditionVariable;
-import android.util.Log;
-import android.view.SurfaceHolder;
-import android.view.SurfaceView;
-import com.android.cts.stub.R;
-
-public class Camera2SurfaceViewStubActivity extends Activity implements SurfaceHolder.Callback {
-    private final static String TAG = "Camera2SurfaceViewStubActivity";
-    private final ConditionVariable surfaceChangedDone = new ConditionVariable();
-
-    private SurfaceView mSurfaceView;
-    private int currentWidth = 0;
-    private int currentHeight = 0;
-
-    @Override
-    protected void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-
-        setContentView(R.layout.surface_view_2);
-        mSurfaceView = (SurfaceView) findViewById(R.id.surface_view);
-        mSurfaceView.getHolder().addCallback(this);
-    }
-
-    public SurfaceView getSurfaceView() {
-        return mSurfaceView;
-    }
-
-    public boolean waitForSurfaceSizeChanged(int timeOutMs, int expectWidth, int expectHeight) {
-        if (timeOutMs <= 0 || expectWidth <= 0 || expectHeight <= 0) {
-            throw new IllegalArgumentException(
-                    String.format(
-                            "timeout(%d), expectWidth(%d), and expectHeight(%d) " +
-                            "should all be positive numbers",
-                            timeOutMs, expectWidth, expectHeight));
-        }
-
-        int waitTimeMs = timeOutMs;
-        boolean changeSucceeded = false;
-        while (!changeSucceeded && waitTimeMs > 0) {
-            long startTimeMs = System.currentTimeMillis();
-            changeSucceeded = surfaceChangedDone.block(waitTimeMs);
-            if (!changeSucceeded) {
-                Log.e(TAG, "Wait for surface change timed out after " + timeOutMs + " ms");
-                return changeSucceeded;
-            } else {
-                // Get a surface change callback, need to check if the size is expected.
-                surfaceChangedDone.close();
-                if (currentWidth == expectWidth && currentHeight == expectHeight) {
-                    return changeSucceeded;
-                }
-                // Do a further iteration surface change check as surfaceChanged could be called
-                // again.
-                changeSucceeded = false;
-            }
-            waitTimeMs -= (System.currentTimeMillis() - startTimeMs);
-        }
-
-        // Couldn't get expected surface size change.
-        return false;
-     }
-
-    @Override
-    public void surfaceCreated(SurfaceHolder holder) {
-    }
-
-    @Override
-    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
-        Log.i(TAG, "Surface Changed to: " + width + "x" + height);
-        currentWidth = width;
-        currentHeight = height;
-        surfaceChangedDone.open();
-    }
-
-    @Override
-    public void surfaceDestroyed(SurfaceHolder holder) {
-    }
-}
diff --git a/tests/src/android/hardware/cts/CameraStubActivity.java b/tests/src/android/hardware/cts/CameraStubActivity.java
deleted file mode 100644
index 8ab7fbd..0000000
--- a/tests/src/android/hardware/cts/CameraStubActivity.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.hardware.cts;
-
-import android.app.Activity;
-import android.os.Bundle;
-import android.view.SurfaceHolder;
-import android.view.SurfaceView;
-import android.view.ViewGroup;
-import com.android.cts.stub.R;
-
-public class CameraStubActivity extends Activity {
-    private SurfaceView mSurfaceView;
-    private final int LAYOUT_WIDTH = 480;
-    private final int LAYOUT_HEIGHT = 320;
-
-    @Override
-    protected void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-
-        setContentView(R.layout.surface_view);
-        mSurfaceView = (SurfaceView)findViewById(R.id.surface_view);
-        ViewGroup.LayoutParams lp = mSurfaceView.getLayoutParams();
-        lp.width = LAYOUT_WIDTH;
-        lp.height = LAYOUT_HEIGHT;
-        mSurfaceView.setLayoutParams(lp);
-        mSurfaceView.getHolder().setFixedSize(LAYOUT_WIDTH, LAYOUT_HEIGHT);
-        mSurfaceView.getHolder().setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
-    }
-
-    public SurfaceView getSurfaceView() {
-        return mSurfaceView;
-    }
-}
diff --git a/tests/src/android/os/cts/CpuInstructions.java b/tests/src/android/os/cts/CpuInstructions.java
new file mode 100644
index 0000000..e001ceb
--- /dev/null
+++ b/tests/src/android/os/cts/CpuInstructions.java
@@ -0,0 +1,29 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.os.cts;
+
+public class CpuInstructions {
+
+    static {
+        System.loadLibrary("cts_jni");
+    }
+
+    public static native boolean canReadCntvct();
+    public static native boolean hasSwp();
+    public static native boolean hasSetend();
+    public static native boolean hasCp15Barriers();
+}
diff --git a/tests/src/android/provider/cts/PhotoUtil.java b/tests/src/android/provider/cts/PhotoUtil.java
deleted file mode 100644
index 9c3047f..0000000
--- a/tests/src/android/provider/cts/PhotoUtil.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.provider.cts;
-
-import com.android.cts.stub.R;
-
-import android.content.Context;
-import android.os.cts.FileUtils;
-
-import java.io.InputStream;
-
-public class PhotoUtil {
-
-    public static byte[] getTestPhotoData(Context context) {
-        InputStream input = context.getResources().openRawResource(R.drawable.testimage);
-        return FileUtils.readInputStreamFully(input);
-    }
-}
diff --git a/tests/src/android/view/animation/cts/AnimationTestStubActivity.java b/tests/src/android/view/animation/cts/AnimationTestStubActivity.java
deleted file mode 100644
index 68d0da3..0000000
--- a/tests/src/android/view/animation/cts/AnimationTestStubActivity.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.view.animation.cts;
-
-import com.android.cts.stub.R;
-
-import android.app.Activity;
-import android.os.Bundle;
-
-public class AnimationTestStubActivity extends Activity {
-    @Override
-    protected void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-        setContentView(R.layout.anim_layout);
-    }
-}
diff --git a/tests/src/android/view/animation/cts/GridLayoutAnimStubActivity.java b/tests/src/android/view/animation/cts/GridLayoutAnimStubActivity.java
deleted file mode 100644
index 7fb79c3..0000000
--- a/tests/src/android/view/animation/cts/GridLayoutAnimStubActivity.java
+++ /dev/null
@@ -1,115 +0,0 @@
-/*
- * Copyright (C) 2009 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.view.animation.cts;
-
-import com.android.cts.stub.R;
-
-import android.app.Activity;
-import android.database.DataSetObserver;
-import android.os.Bundle;
-import android.view.View;
-import android.view.ViewGroup;
-import android.widget.AbsListView;
-import android.widget.GridView;
-import android.widget.ImageView;
-import android.widget.ListAdapter;
-
-public class GridLayoutAnimStubActivity extends Activity {
-
-    private GridView mGridView;
-    private static final int GRID_NUM = 9;
-
-    @Override
-    protected void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-        setContentView(R.layout.gridlayout_anim_controller_layout);
-        mGridView = (GridView) findViewById(R.id.gridlayout_anim_gridview);
-        mGridView.setAdapter(new MockGridViewAdapter(GRID_NUM));
-    }
-
-    public GridView getGridView() {
-        return mGridView;
-    }
-
-    private class MockGridViewAdapter implements ListAdapter {
-        private final int mCount;
-
-        MockGridViewAdapter(int count) {
-            mCount = count;
-        }
-
-        MockGridViewAdapter() {
-            this(1);
-        }
-
-        public boolean areAllItemsEnabled() {
-            return true;
-        }
-
-        public boolean isEnabled(int position) {
-            return true;
-        }
-
-        public void registerDataSetObserver(DataSetObserver observer) {
-        }
-
-        public void unregisterDataSetObserver(DataSetObserver observer) {
-        }
-
-        public int getCount() {
-            return mCount;
-        }
-
-        public Object getItem(int position) {
-            return position;
-        }
-
-        public long getItemId(int position) {
-            return position;
-        }
-
-        public boolean hasStableIds() {
-            return false;
-        }
-
-        public View getView(int position, View convertView, ViewGroup parent) {
-            if ((convertView != null) && (convertView instanceof ImageView)) {
-                ((ImageView) convertView).setImageResource(R.drawable.size_48x48);
-                return convertView;
-            }
-
-            ImageView newView = new ImageView(GridLayoutAnimStubActivity.this);
-            AbsListView.LayoutParams params = new AbsListView.LayoutParams(
-                    AbsListView.LayoutParams.WRAP_CONTENT, AbsListView.LayoutParams.WRAP_CONTENT);
-            newView.setLayoutParams(params);
-            newView.setImageResource(R.drawable.size_48x48);
-            return newView;
-        }
-
-        public int getItemViewType(int position) {
-            return 0;
-        }
-
-        public int getViewTypeCount() {
-            return 1;
-        }
-
-        public boolean isEmpty() {
-            return false;
-        }
-    }
-}
diff --git a/tests/src/android/view/animation/cts/LayoutAnimStubActivity.java b/tests/src/android/view/animation/cts/LayoutAnimStubActivity.java
deleted file mode 100644
index e647820..0000000
--- a/tests/src/android/view/animation/cts/LayoutAnimStubActivity.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * Copyright (C) 2009 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.view.animation.cts;
-
-import android.app.ListActivity;
-import android.os.Bundle;
-import android.widget.ArrayAdapter;
-
-
-public class LayoutAnimStubActivity extends ListActivity {
-
-    private String[] mStrings = {
-            "Android",
-            "CTS",
-            "Test",
-    };
-
-    @Override
-    protected void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-        setListAdapter(new ArrayAdapter<String>(this,
-                android.R.layout.simple_list_item_1, mStrings));
-    }
-}
diff --git a/tests/src/android/view/cts/FocusFinderStubActivity.java b/tests/src/android/view/cts/FocusFinderStubActivity.java
deleted file mode 100644
index c5b215f..0000000
--- a/tests/src/android/view/cts/FocusFinderStubActivity.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.view.cts;
-
-import com.android.cts.stub.R;
-
-import android.app.Activity;
-import android.content.Context;
-import android.os.Bundle;
-import android.util.AttributeSet;
-import android.view.ViewGroup;
-import android.widget.Button;
-
-public class FocusFinderStubActivity extends Activity {
-
-    public ViewGroup layout;
-
-    public Button topLeftButton;
-
-    public Button topRightButton;
-
-    public Button bottomLeftButton;
-
-    public Button bottomRightButton;
-
-    @Override
-    protected void onCreate(Bundle icicle) {
-        super.onCreate(icicle);
-        setContentView(R.layout.focus_finder_layout);
-        layout = (ViewGroup) findViewById(R.id.layout);
-        topLeftButton = (Button) findViewById(R.id.top_left_button);
-        topRightButton = (Button) findViewById(R.id.top_right_button);
-        bottomLeftButton = (Button) findViewById(R.id.bottom_left_button);
-        bottomRightButton = (Button) findViewById(R.id.bottom_right_button);
-    }
-}
-
diff --git a/tests/src/android/view/cts/FocusHandlingStubActivity.java b/tests/src/android/view/cts/FocusHandlingStubActivity.java
deleted file mode 100644
index 9faa609..0000000
--- a/tests/src/android/view/cts/FocusHandlingStubActivity.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Copyright (C) 2009 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.view.cts;
-
-import com.android.cts.stub.R;
-
-import android.app.Activity;
-import android.os.Bundle;
-
-/**
- * A simple activity to test "Focus Handling"
- */
-public class FocusHandlingStubActivity extends Activity {
-    @Override
-    protected void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-        setTheme(android.R.style.Theme_Holo_NoActionBar);
-        setContentView(R.layout.focus_handling_layout);
-    }
-}
diff --git a/tests/src/android/view/cts/GestureDetectorStubActivity.java b/tests/src/android/view/cts/GestureDetectorStubActivity.java
deleted file mode 100644
index e82b787..0000000
--- a/tests/src/android/view/cts/GestureDetectorStubActivity.java
+++ /dev/null
@@ -1,142 +0,0 @@
-/*
- * Copyright (C) 2009 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.view.cts;
-
-import android.app.Activity;
-import android.os.Bundle;
-import android.os.Handler;
-import android.view.GestureDetector;
-import android.view.MotionEvent;
-import android.view.View;
-import android.view.ViewGroup;
-import android.view.GestureDetector.SimpleOnGestureListener;
-import android.view.View.OnTouchListener;
-import android.widget.Button;
-
-public class GestureDetectorStubActivity extends Activity {
-
-    public boolean isDown;
-    public boolean isScroll;
-    public boolean isFling;
-    public boolean isSingleTapUp;
-    public boolean onShowPress;
-    public boolean onLongPress;
-    public boolean onDoubleTap;
-    public boolean onDoubleTapEvent;
-    public boolean onSingleTapConfirmed;
-
-    private GestureDetector mGestureDetector;
-    private MockOnGestureListener mOnGestureListener;
-    private Handler mHandler;
-    private View mView;
-    private Button mTop;
-    private Button mButton;
-    private ViewGroup mViewGroup;
-
-    @Override
-    protected void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-
-        mOnGestureListener = new MockOnGestureListener();
-        mHandler = new Handler();
-
-        mGestureDetector = new GestureDetector(this, mOnGestureListener, mHandler);
-        mGestureDetector.setOnDoubleTapListener(mOnGestureListener);
-        mView = new View(this);
-        mButton = new Button(this);
-        mTop = new Button(this);
-        mView.setOnTouchListener(new MockOnTouchListener());
-
-        mViewGroup = new ViewGroup(this) {
-            @Override
-            protected void onLayout(boolean changed, int l, int t, int r, int b) {
-            }
-        };
-        mViewGroup.addView(mView);
-        mViewGroup.addView(mTop);
-        mViewGroup.addView(mButton);
-        mViewGroup.setOnTouchListener(new MockOnTouchListener());
-        setContentView(mViewGroup);
-
-    }
-
-    public View getView() {
-        return mView;
-    }
-
-    public ViewGroup getViewGroup() {
-        return mViewGroup;
-    }
-
-    public GestureDetector getGestureDetector() {
-        return mGestureDetector;
-    }
-
-    public class MockOnGestureListener extends SimpleOnGestureListener {
-        public boolean onDown(MotionEvent e) {
-            isDown = true;
-            return true;
-        }
-
-        public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
-            isFling = true;
-            return true;
-        }
-
-        public void onLongPress(MotionEvent e) {
-            onLongPress = true;
-        }
-
-        public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
-            isScroll = true;
-            return true;
-        }
-
-        public void onShowPress(MotionEvent e) {
-            onShowPress = true;
-        }
-
-        public boolean onSingleTapUp(MotionEvent e) {
-            isSingleTapUp = true;
-            return true;
-        }
-
-        public boolean onDoubleTap(MotionEvent e) {
-            onDoubleTap = true;
-            return false;
-        }
-
-        public boolean onDoubleTapEvent(MotionEvent e) {
-            onDoubleTapEvent = true;
-            return false;
-        }
-
-        public boolean onSingleTapConfirmed(MotionEvent e) {
-            onSingleTapConfirmed = true;
-            return false;
-        }
-    }
-
-    class MockOnTouchListener implements OnTouchListener {
-
-        public boolean onTouch(View v, MotionEvent event) {
-            mGestureDetector.onTouchEvent(event);
-            return true;
-        }
-    }
-
-}
diff --git a/tests/src/android/view/cts/MenuInflaterStubActivity.java b/tests/src/android/view/cts/MenuInflaterStubActivity.java
deleted file mode 100644
index 693fe13..0000000
--- a/tests/src/android/view/cts/MenuInflaterStubActivity.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.view.cts;
-
-import android.app.Activity;
-import android.view.MenuInflater;
-
-/**
- * Stub activity for testing {@link MenuInflater}.
- *
- * @see MenuInflaterTest
- */
-public class MenuInflaterStubActivity extends Activity {
-}
diff --git a/tests/src/android/view/cts/SurfaceViewStubActivity.java b/tests/src/android/view/cts/SurfaceViewStubActivity.java
deleted file mode 100644
index 75d5ff6..0000000
--- a/tests/src/android/view/cts/SurfaceViewStubActivity.java
+++ /dev/null
@@ -1,272 +0,0 @@
-/*
- * Copyright (C) 2009 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package android.view.cts;
-
-import android.app.Activity;
-import android.content.Context;
-import android.graphics.Bitmap;
-import android.graphics.Canvas;
-import android.graphics.Color;
-import android.graphics.Paint;
-import android.graphics.PorterDuff.Mode;
-import android.os.Bundle;
-import android.view.SurfaceHolder;
-import android.view.SurfaceView;
-
-public class SurfaceViewStubActivity extends Activity {
-    private MockSurfaceView mSurfaceView;
-
-    @Override
-    protected void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-
-        // New a MockSurfaceView
-        mSurfaceView = new MockSurfaceView(this);
-        setContentView(mSurfaceView);
-    }
-
-    public MockSurfaceView getSurfaceView() {
-        return mSurfaceView;
-    }
-
-    public class MockSurfaceView extends SurfaceView implements SurfaceHolder.Callback {
-        private static final int FIX_WIDTH = 240;
-        private static final int FIX_HEIGHT = 240;
-        private static final int BITMAP_WIDTH = 100;
-        private static final int BITMAP_HEIGHT = 100;
-        private static final int RECT_LEFT = 20;
-        private static final int RECT_TOP = 100;
-        private static final int RECT_RIGHT = 200;
-        private static final int RECT_BOTTOM = 200;
-
-        private SurfaceHolder mHolder;
-        private MockCanvas mCanvas;
-
-        private boolean mIsDraw;
-        private boolean mIsAttachedToWindow;
-        private boolean mIsDetachedFromWindow;
-        private boolean mIsOnMeasure;
-        private boolean mIsOnScrollChanged;
-        private boolean mIsOnSizeChanged;
-        private boolean mIsOnWindowVisibilityChanged;
-        private boolean mIsDispatchDraw;
-        private boolean mIsSurfaceChanged;
-
-        private int mWidthInOnMeasure;
-        private int mHeightInOnMeasure;
-        private int mOldLOnScrollChanged;
-        private int mOldTOnScrollChanged;
-        private int mOldWOnSizeChanged;
-        private int mOldHOnSizeChanged;
-        private int mVisibilityOnWindowVisibilityChanged;
-
-        public MockSurfaceView(Context context) {
-            super(context);
-            mHolder = getHolder();
-            mHolder.addCallback(this);
-            mHolder.setFixedSize(FIX_WIDTH, FIX_HEIGHT);
-        }
-
-        @Override
-        public void onWindowVisibilityChanged(int visibility) {
-            super.onWindowVisibilityChanged(visibility);
-            mVisibilityOnWindowVisibilityChanged = visibility;
-            mIsOnWindowVisibilityChanged = true;
-        }
-
-        public int getVInOnWindowVisibilityChanged() {
-            return mVisibilityOnWindowVisibilityChanged;
-        }
-
-        @Override
-        public void draw(Canvas canvas) {
-            super.draw(canvas);
-            mIsDraw = true;
-        }
-
-        @Override
-        public void onAttachedToWindow() {
-            super.onAttachedToWindow();
-            mIsAttachedToWindow = true;
-        }
-
-        @Override
-        public void onDetachedFromWindow() {
-            super.onDetachedFromWindow();
-            mIsDetachedFromWindow = true;
-        }
-
-        @Override
-        public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
-            super.onMeasure(widthMeasureSpec, heightMeasureSpec);
-            mWidthInOnMeasure = getDefaultSize(FIX_WIDTH, widthMeasureSpec);
-            mHeightInOnMeasure = getDefaultSize(FIX_HEIGHT, heightMeasureSpec);
-            mIsOnMeasure = true;
-        }
-
-        public int getWidthInOnMeasure() {
-            return mWidthInOnMeasure;
-        }
-
-        public int getHeightInOnMeasure() {
-            return mHeightInOnMeasure;
-        }
-
-        @Override
-        public void onScrollChanged(int l, int t, int oldl, int oldt) {
-            super.onScrollChanged(l, t, oldl, oldt);
-
-            mOldLOnScrollChanged = oldl;
-            mOldTOnScrollChanged = oldt;
-            mIsOnScrollChanged = true;
-        }
-
-        public int getOldHorizontal() {
-            return mOldLOnScrollChanged;
-        }
-
-        public int getOldVertical() {
-            return mOldTOnScrollChanged;
-        }
-
-        @Override
-        public void onSizeChanged(int w, int h, int oldw, int oldh) {
-            super.onSizeChanged(w, h, oldw, oldh);
-
-            mOldWOnSizeChanged = oldw;
-            mOldHOnSizeChanged = oldh;
-            mIsOnSizeChanged = true;
-        }
-
-        public int getOldWidth() {
-            return mOldWOnSizeChanged;
-        }
-
-        public int getOldHeight() {
-            return mOldHOnSizeChanged;
-        }
-
-        @Override
-        protected void dispatchDraw(Canvas canvas) {
-            super.dispatchDraw(canvas);
-            mIsDispatchDraw = true;
-        }
-
-        public void setFormat(int format) {
-            getHolder().setFormat(format);
-        }
-
-        public void surfaceCreated(SurfaceHolder holder) {
-            // Use mock canvas listening to the drawColor() calling.
-            mCanvas = new MockCanvas(Bitmap.createBitmap( BITMAP_WIDTH,
-                                                          BITMAP_HEIGHT,
-                                                          Bitmap.Config.ARGB_8888));
-            draw(mCanvas);
-
-            // Lock the surface, this returns a Canvas that can be used to render into.
-            Canvas canvas = mHolder.lockCanvas();
-            Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
-            paint.setColor(Color.BLUE);
-            canvas.drawRect(RECT_LEFT, RECT_TOP, RECT_RIGHT, RECT_BOTTOM, paint);
-
-            // And finally unlock and post the surface.
-            mHolder.unlockCanvasAndPost(canvas);
-        }
-
-        public void surfaceDestroyed(SurfaceHolder holder) {
-        }
-
-        public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
-            mIsSurfaceChanged = true;
-        }
-
-        public boolean isDraw() {
-            return mIsDraw;
-        }
-
-        public boolean isOnAttachedToWindow() {
-            return mIsAttachedToWindow;
-        }
-
-        public boolean isDetachedFromWindow() {
-            return mIsDetachedFromWindow;
-        }
-
-        public boolean isOnMeasureCalled() {
-            return mIsOnMeasure;
-        }
-
-        public boolean isOnScrollChanged() {
-            return mIsOnScrollChanged;
-        }
-
-        public boolean isOnSizeChangedCalled() {
-            return mIsOnSizeChanged;
-        }
-
-        public void resetOnSizeChangedFlag(boolean b) {
-            mIsOnSizeChanged = b;
-        }
-
-        public boolean isOnWindowVisibilityChanged() {
-            return mIsOnWindowVisibilityChanged;
-        }
-
-        public boolean isDispatchDraw() {
-            return mIsDispatchDraw;
-        }
-
-        public boolean isDrawColor() {
-            if (mCanvas != null) {
-                return mCanvas.isDrawColor();
-            } else {
-                return false;
-            }
-        }
-
-        public boolean isSurfaceChanged() {
-            return mIsSurfaceChanged;
-        }
-
-        public void setDrawColor(boolean isDrawColor) {
-            if (mCanvas != null) {
-                mCanvas.setDrawColor(isDrawColor);
-            }
-        }
-    }
-
-    class MockCanvas extends Canvas {
-        private boolean mIsDrawColor;
-
-        public MockCanvas(Bitmap bitmap) {
-            super(bitmap);
-        }
-
-        @Override
-        public void drawColor(int color, Mode mode) {
-            super.drawColor(color, mode);
-            mIsDrawColor = true;
-        }
-
-        public boolean isDrawColor() {
-            return mIsDrawColor;
-        }
-
-        public void setDrawColor(boolean isDrawColor) {
-            this.mIsDrawColor = isDrawColor;
-        }
-    }
-}
diff --git a/tests/src/android/view/cts/UsingViewsStubActivity.java b/tests/src/android/view/cts/UsingViewsStubActivity.java
deleted file mode 100644
index eb3aba7..0000000
--- a/tests/src/android/view/cts/UsingViewsStubActivity.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Copyright (C) 2009 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.view.cts;
-
-import android.app.Activity;
-import android.os.Bundle;
-import com.android.cts.stub.R;
-
-/**
- * A simple activity to test "Using Views"
- */
-public class UsingViewsStubActivity extends Activity {
-    @Override
-    protected void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-        setContentView(R.layout.using_views_layout);
-    }
-}
diff --git a/tests/src/android/view/cts/ViewLayoutPositionTestStubActivity.java b/tests/src/android/view/cts/ViewLayoutPositionTestStubActivity.java
deleted file mode 100644
index d7ce635..0000000
--- a/tests/src/android/view/cts/ViewLayoutPositionTestStubActivity.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.view.cts;
-
-import android.app.Activity;
-import android.os.Bundle;
-import com.android.cts.stub.R;
-
-public class ViewLayoutPositionTestStubActivity extends Activity {
-    @Override
-    protected void onCreate(Bundle icicle) {
-        super.onCreate(icicle);
-        setContentView(R.layout.view_layout_position);
-    }
-}
diff --git a/tests/src/android/view/cts/ViewStubStubActivity.java b/tests/src/android/view/cts/ViewStubStubActivity.java
deleted file mode 100644
index 2a05f8e..0000000
--- a/tests/src/android/view/cts/ViewStubStubActivity.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.view.cts;
-
-import android.app.Activity;
-import android.os.Bundle;
-import com.android.cts.stub.R;
-
-public class ViewStubStubActivity extends Activity {
-    @Override
-    protected void onCreate(Bundle icicle) {
-        super.onCreate(icicle);
-        setContentView(R.layout.viewstub_layout);
-    }
-}
diff --git a/tests/src/android/view/cts/ViewTestStubActivity.java b/tests/src/android/view/cts/ViewTestStubActivity.java
deleted file mode 100644
index 69676cb..0000000
--- a/tests/src/android/view/cts/ViewTestStubActivity.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.view.cts;
-
-import android.app.Activity;
-import android.os.Bundle;
-import android.os.SystemClock;
-import android.util.Log;
-import com.android.cts.stub.R;
-
-public class ViewTestStubActivity extends Activity {
-    private boolean mHasWindowFocus = false;
-    private Object mHasWindowFocusLock = new Object();
-
-    @Override
-    protected void onCreate(Bundle icicle) {
-        super.onCreate(icicle);
-        setContentView(R.layout.view_layout);
-    }
-
-    @Override
-    public void onWindowFocusChanged(boolean hasFocus) {
-        super.onWindowFocusChanged(hasFocus);
-        if (!hasFocus) {
-            Log.w("ViewTestStubActivity", "ViewTestStubActivity lost window focus");
-        }
-        synchronized(mHasWindowFocusLock) {
-            mHasWindowFocus = hasFocus;
-            mHasWindowFocusLock.notify();
-        }
-    }
-
-    /**
-     * Blocks the calling thread until the {@link ViewTestStubActivity} has window focus or the
-     * specified duration (in milliseconds) has passed.
-     */
-    public boolean waitForWindowFocus(long durationMillis) {
-        long elapsedMillis = SystemClock.elapsedRealtime();
-        synchronized(mHasWindowFocusLock) {
-            mHasWindowFocus = hasWindowFocus();
-            while (!mHasWindowFocus && durationMillis > 0) {
-                long newElapsedMillis = SystemClock.elapsedRealtime();
-                durationMillis -= (newElapsedMillis - elapsedMillis);
-                elapsedMillis = newElapsedMillis;
-                if (durationMillis > 0) {
-                    try {
-                        mHasWindowFocusLock.wait(durationMillis);
-                    } catch (InterruptedException e) {
-                    }
-                }
-            }
-            return mHasWindowFocus;
-        }
-    }
-}
diff --git a/tests/src/android/view/cts/WindowStubActivity.java b/tests/src/android/view/cts/WindowStubActivity.java
deleted file mode 100644
index 502c947..0000000
--- a/tests/src/android/view/cts/WindowStubActivity.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.view.cts;
-
-import com.android.cts.stub.R;
-
-import android.app.Activity;
-import android.os.Bundle;
-import android.view.KeyEvent;
-import android.view.Menu;
-import android.view.Window;
-
-public class WindowStubActivity extends Activity {
-
-    private static boolean mIsOnCreateOptionsMenuCalled;
-    private static boolean mIsOnOptionsMenuClosedCalled;
-    private static boolean mIsOnKeyDownCalled;
-
-    @Override
-    protected void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-        getWindow().requestFeature(Window.FEATURE_LEFT_ICON);
-        setContentView(R.layout.windowstub_layout);
-    }
-
-    @Override
-    public boolean onCreateOptionsMenu(Menu menu) {
-        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);
-    }
-
-    @Override
-    public void onOptionsMenuClosed(Menu menu) {
-        super.onOptionsMenuClosed(menu);
-        mIsOnOptionsMenuClosedCalled = true;
-    }
-
-    @Override
-    public boolean onKeyDown(int keyCode, KeyEvent event) {
-        mIsOnKeyDownCalled = true;
-        return super.onKeyDown(keyCode, event);
-    }
-
-    public boolean isOnCreateOptionsMenuCalled() {
-        return mIsOnCreateOptionsMenuCalled;
-    }
-
-    public boolean isOnOptionsMenuClosedCalled() {
-        return mIsOnOptionsMenuClosedCalled;
-    }
-
-    public boolean isOnKeyDownCalled() {
-        return mIsOnKeyDownCalled;
-    }
-
-    public void setFlagFalse() {
-        mIsOnCreateOptionsMenuCalled = false;
-        mIsOnOptionsMenuClosedCalled = false;
-    }
-}
diff --git a/tests/src/android/view/inputmethod/cts/InputMethodStubActivity.java b/tests/src/android/view/inputmethod/cts/InputMethodStubActivity.java
deleted file mode 100644
index 8117918..0000000
--- a/tests/src/android/view/inputmethod/cts/InputMethodStubActivity.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package android.view.inputmethod.cts;
-
-import android.app.Activity;
-import android.os.Bundle;
-import com.android.cts.stub.R;
-
-public class InputMethodStubActivity extends Activity {
-    @Override
-    protected void onCreate(Bundle icicle) {
-        super.onCreate(icicle);
-        setContentView(R.layout.inputmethod_edittext);
-    }
-}
diff --git a/tests/src/android/webkit/cts/CookieSyncManagerStubActivity.java b/tests/src/android/webkit/cts/CookieSyncManagerStubActivity.java
deleted file mode 100644
index a5ac6ec..0000000
--- a/tests/src/android/webkit/cts/CookieSyncManagerStubActivity.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- * Copyright (C) 2009 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.webkit.cts;
-
-import android.app.Activity;
-import android.os.Bundle;
-import android.webkit.CookieSyncManager;
-import android.webkit.WebView;
-
-public class CookieSyncManagerStubActivity extends Activity {
-    private WebView mWebView;
-
-    @Override
-    public void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-
-        try {
-            CookieSyncManager.createInstance(this);
-
-            mWebView = new WebView(this);
-            setContentView(mWebView);
-        } catch (Exception e) {
-            NullWebViewUtils.determineIfWebViewAvailable(this, e);
-        }
-    }
-
-    @Override
-    protected void onResume() {
-        super.onResume();
-        try {
-            CookieSyncManager.getInstance().startSync();
-        } catch (Exception e) {
-            // May throw on a device with no webview, OK to ignore at this point.
-        }
-    }
-
-    @Override
-    protected void onStop() {
-        super.onStop();
-        try {
-            CookieSyncManager.getInstance().stopSync();
-        } catch (Exception e) {
-            // May throw on a device with no webview, OK to ignore at this point.
-        }
-    }
-
-    public WebView getWebView(){
-        return mWebView;
-    }
-}
diff --git a/tests/src/android/webkit/cts/WebViewOnUiThread.java b/tests/src/android/webkit/cts/WebViewOnUiThread.java
index 4f8e06e..03059a1 100644
--- a/tests/src/android/webkit/cts/WebViewOnUiThread.java
+++ b/tests/src/android/webkit/cts/WebViewOnUiThread.java
@@ -251,6 +251,15 @@
         });
     }
 
+    public boolean canZoomOut() {
+        return getValue(new ValueGetter<Boolean>() {
+            @Override
+            public Boolean capture() {
+                return mWebView.canZoomOut();
+            }
+        });
+    }
+
     public boolean zoomIn() {
         return getValue(new ValueGetter<Boolean>() {
             @Override
@@ -269,6 +278,15 @@
         });
     }
 
+    public void zoomBy(final float zoomFactor) {
+        runOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                mWebView.zoomBy(zoomFactor);
+            }
+        });
+    }
+
     public void setFindListener(final WebView.FindListener listener) {
         runOnUiThread(new Runnable() {
             @Override
diff --git a/tests/src/android/webkit/cts/WebViewStartupStubActivity.java b/tests/src/android/webkit/cts/WebViewStartupStubActivity.java
deleted file mode 100644
index f902a48..0000000
--- a/tests/src/android/webkit/cts/WebViewStartupStubActivity.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * Copyright (C) 2013 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.webkit.cts;
-
-import android.app.Activity;
-import android.os.Bundle;
-import android.view.ViewGroup;
-import android.webkit.WebView;
-
-public class WebViewStartupStubActivity extends Activity {
-    private WebView mWebView;
-
-    @Override
-    public void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-    }
-
-    public WebView createAndAttachWebView() {
-        mWebView = new WebView(this);
-        setContentView(mWebView);
-        return mWebView;
-    }
-
-    public WebView getWebView() {
-        return mWebView;
-    }
-
-    public void detachAndDestroyWebView() {
-        if (mWebView != null) {
-            ViewGroup vg = (ViewGroup)mWebView.getParent();
-            vg.removeView(mWebView);
-            mWebView.destroy();
-        }
-    }
-
-    @Override
-    public void onDestroy() {
-        detachAndDestroyWebView();
-        super.onDestroy();
-    }
-}
diff --git a/tests/src/android/webkit/cts/WebViewStubActivity.java b/tests/src/android/webkit/cts/WebViewStubActivity.java
deleted file mode 100644
index 62adc39..0000000
--- a/tests/src/android/webkit/cts/WebViewStubActivity.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * Copyright (C) 2009 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.webkit.cts;
-
-import com.android.cts.stub.R;
-
-import android.app.Activity;
-import android.os.Bundle;
-import android.view.ViewGroup;
-import android.view.ViewParent;
-import android.webkit.WebView;
-
-public class WebViewStubActivity extends Activity {
-    private WebView mWebView;
-
-    @Override
-    public void onCreate(Bundle savedInstanceState) {
-        try {
-            super.onCreate(savedInstanceState);
-            setContentView(R.layout.webview_layout);
-            mWebView = (WebView) findViewById(R.id.web_page);
-        } catch (Exception e) {
-            NullWebViewUtils.determineIfWebViewAvailable(this, e);
-        }
-    }
-
-    public WebView getWebView() {
-        return mWebView;
-    }
-
-    @Override
-    public void onDestroy() {
-        if (mWebView != null) {
-            ViewParent parent =  mWebView.getParent();
-            if (parent instanceof ViewGroup) {
-                ((ViewGroup) parent).removeView(mWebView);
-            }
-            mWebView.destroy();
-        }
-        super.onDestroy();
-    }
-}
diff --git a/tests/src/android/widget/cts/AdapterViewStubActivity.java b/tests/src/android/widget/cts/AdapterViewStubActivity.java
deleted file mode 100644
index edcf13d..0000000
--- a/tests/src/android/widget/cts/AdapterViewStubActivity.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.widget.cts;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import android.app.Activity;
-import android.os.Bundle;
-import android.view.ViewGroup.LayoutParams;
-import android.widget.ArrayAdapter;
-import android.widget.ListView;
-
-import com.android.cts.stub.R;
-
-/**
- * A minimal application for AdapterView test.
- */
-public class AdapterViewStubActivity extends Activity {
-    private ListView mView;
-
-    /**
-     * Called with the activity is first created.
-     */
-    @Override
-    public void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-        mView = new ListView(this);
-        mView.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT,
-                LayoutParams.WRAP_CONTENT));
-        setContentView(mView);
-    }
-
-    public ListView getListView() {
-        return mView;
-    }
-
-    public ArrayAdapter<String> getArrayAdapter() {
-        final List<String> list = new ArrayList<String>();
-        for (int i = 0; i < 4; i++) {
-            list.add("test:" + i);
-        }
-        return new ArrayAdapter<String>(this, R.layout.adapterview_layout, list);
-    }
-}
diff --git a/tests/src/android/widget/cts/AutoCompleteStubActivity.java b/tests/src/android/widget/cts/AutoCompleteStubActivity.java
deleted file mode 100644
index a23b6eb..0000000
--- a/tests/src/android/widget/cts/AutoCompleteStubActivity.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.widget.cts;
-
-import android.app.Activity;
-import android.os.Bundle;
-
-import com.android.cts.stub.R;
-
-/**
- * A minimal application for AutoCompleteTextView test.
- */
-public class AutoCompleteStubActivity extends Activity {
-    /**
-     * Called with the activity is first created.
-     */
-    @Override
-    public void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-        setContentView(R.layout.autocompletetextview_layout);
-    }
-}
diff --git a/tests/src/android/widget/cts/CheckedTextViewStubActivity.java b/tests/src/android/widget/cts/CheckedTextViewStubActivity.java
deleted file mode 100644
index 1c8d63e..0000000
--- a/tests/src/android/widget/cts/CheckedTextViewStubActivity.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * Copyright (C) 2009 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.widget.cts;
-
-import com.android.cts.stub.R;
-
-import android.app.Activity;
-import android.os.Bundle;
-
-/**
- * A minimal application for CheckedTextView test.
- */
-public class CheckedTextViewStubActivity extends Activity {
-    /**
-     * Called with the activity is first created.
-     */
-    @Override
-    public void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-        setContentView(R.layout.checkedtextview_layout);
-    }
-}
diff --git a/tests/src/android/widget/cts/ChronometerStubActivity.java b/tests/src/android/widget/cts/ChronometerStubActivity.java
deleted file mode 100644
index f72a427..0000000
--- a/tests/src/android/widget/cts/ChronometerStubActivity.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.widget.cts;
-
-import com.android.cts.stub.R;
-import android.app.Activity;
-import android.os.Bundle;
-import android.view.ViewGroup;
-import android.widget.Chronometer;
-
-public class ChronometerStubActivity extends Activity {
-
-    private Chronometer chronometer;
-
-    @Override
-    protected void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-        setContentView(R.layout.chronometer_stub_layout);
-        chronometer = (Chronometer) findViewById(R.id.test_chronometer);
-    }
-
-    public Chronometer getChronometer() {
-        return chronometer;
-    }
-
-    public ViewGroup getViewGroup() {
-        return (ViewGroup) findViewById(R.id.chronometer_view_group);
-    }
-
-}
-
diff --git a/tests/src/android/widget/cts/DialerFilterStubActivity.java b/tests/src/android/widget/cts/DialerFilterStubActivity.java
deleted file mode 100644
index b67803a..0000000
--- a/tests/src/android/widget/cts/DialerFilterStubActivity.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.widget.cts;
-
-import android.app.Activity;
-import android.os.Bundle;
-import com.android.cts.stub.R;
-
-/**
- * A minimal application for DialerFilter test.
- */
-public class DialerFilterStubActivity extends Activity {
-    /**
-     * Called with the activity is first created.
-     */
-    @Override
-    public void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-        setContentView(R.layout.dialerfilter_layout);
-    }
-}
diff --git a/tests/src/android/widget/cts/DigitalClockStubActivity.java b/tests/src/android/widget/cts/DigitalClockStubActivity.java
deleted file mode 100644
index 2351bc2..0000000
--- a/tests/src/android/widget/cts/DigitalClockStubActivity.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.widget.cts;
-
-import com.android.cts.stub.R;
-
-import android.app.Activity;
-import android.os.Bundle;
-
-/**
- * A minimal application for TextView test.
- */
-public class DigitalClockStubActivity extends Activity {
-    /**
-     * Called with the activity is first created.
-     */
-    @Override
-    public void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-        setContentView(R.layout.digitalclock_simplelayout);
-    }
-}
diff --git a/tests/src/android/widget/cts/FrameLayoutStubActivity.java b/tests/src/android/widget/cts/FrameLayoutStubActivity.java
deleted file mode 100644
index 76482da..0000000
--- a/tests/src/android/widget/cts/FrameLayoutStubActivity.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.widget.cts;
-
-import android.app.Activity;
-import android.os.Bundle;
-import com.android.cts.stub.R;
-
-/**
- * A minimal application for frame layout test.
- */
-public class FrameLayoutStubActivity extends Activity {
-    /**
-     * Called with the activity is first created.
-     */
-    @Override
-    public void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-        setContentView(R.layout.framelayout_layout);
-    }
-}
-
diff --git a/tests/src/android/widget/cts/GalleryStubActivity.java b/tests/src/android/widget/cts/GalleryStubActivity.java
deleted file mode 100644
index 8e0dd93..0000000
--- a/tests/src/android/widget/cts/GalleryStubActivity.java
+++ /dev/null
@@ -1,86 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.widget.cts;
-
-import com.android.cts.stub.R;
-
-import android.app.Activity;
-import android.content.Context;
-import android.os.Bundle;
-import android.view.View;
-import android.view.ViewGroup;
-import android.widget.BaseAdapter;
-import android.widget.Gallery;
-import android.widget.ImageView;
-
-/**
- * A minimal application for {@link Gallery} test.
- */
-public class GalleryStubActivity extends Activity {
-    @Override
-    public void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-        setContentView(R.layout.gallery_test);
-
-        Gallery gallery = (Gallery) findViewById(R.id.gallery_test);
-        ImageAdapter adapter = new ImageAdapter(this);
-        gallery.setAdapter(adapter);
-    }
-
-    private static class ImageAdapter extends BaseAdapter {
-        public ImageAdapter(Context c) {
-            mContext = c;
-        }
-
-        public int getCount() {
-            return mImageIds.length;
-        }
-
-        public Object getItem(int position) {
-            return position;
-        }
-
-        public long getItemId(int position) {
-            return position;
-        }
-
-        public View getView(int position, View convertView, ViewGroup parent) {
-            ImageView i = new ImageView(mContext);
-
-            i.setImageResource(mImageIds[position]);
-            i.setScaleType(ImageView.ScaleType.FIT_XY);
-            // let the item's width be 136, height be 88
-            i.setLayoutParams(new Gallery.LayoutParams(136, 88));
-
-            return i;
-        }
-
-        private Context mContext;
-
-        private Integer[] mImageIds = {
-                R.drawable.faces,
-                R.drawable.scenery,
-                R.drawable.testimage,
-                R.drawable.faces,
-                R.drawable.scenery,
-                R.drawable.testimage,
-                R.drawable.faces,
-                R.drawable.scenery,
-                R.drawable.testimage,
-        };
-    }
-}
diff --git a/tests/src/android/widget/cts/GridLayoutStubActivity.java b/tests/src/android/widget/cts/GridLayoutStubActivity.java
deleted file mode 100644
index 3fa0f28..0000000
--- a/tests/src/android/widget/cts/GridLayoutStubActivity.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.widget.cts;
-
-import android.app.Activity;
-import android.os.Bundle;
-import com.android.cts.stub.R;
-
-/**
- * A minimal application for {@link android.widget.GridLayout} test.
- */
-public class GridLayoutStubActivity extends Activity {
-    @Override
-    public void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-        setContentView(R.layout.gridlayout_layout);
-    }
-}
diff --git a/tests/src/android/widget/cts/GridViewStubActivity.java b/tests/src/android/widget/cts/GridViewStubActivity.java
deleted file mode 100644
index f58b7df..0000000
--- a/tests/src/android/widget/cts/GridViewStubActivity.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.widget.cts;
-
-import com.android.cts.stub.R;
-
-import android.app.Activity;
-import android.os.Bundle;
-
-/**
- * A minimal application for {@link GridView} test.
- */
-public class GridViewStubActivity extends Activity {
-    /**
-     * Called with the activity is first created.
-     */
-    @Override
-    public void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-        setContentView(R.layout.gridview_layout);
-    }
-}
-
diff --git a/tests/src/android/widget/cts/HorizontalScrollViewStubActivity.java b/tests/src/android/widget/cts/HorizontalScrollViewStubActivity.java
deleted file mode 100644
index 8dd6911..0000000
--- a/tests/src/android/widget/cts/HorizontalScrollViewStubActivity.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Copyright (C) 2009 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.widget.cts;
-
-import com.android.cts.stub.R;
-
-import android.app.Activity;
-import android.os.Bundle;
-
-public class HorizontalScrollViewStubActivity extends Activity {
-    @Override
-    public void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-        setContentView(R.layout.horizontal_scrollview);
-    }
-}
diff --git a/tests/src/android/widget/cts/ImageViewStubActivity.java b/tests/src/android/widget/cts/ImageViewStubActivity.java
deleted file mode 100644
index 7b93168..0000000
--- a/tests/src/android/widget/cts/ImageViewStubActivity.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.widget.cts;
-
-import com.android.cts.stub.R;
-
-import android.app.Activity;
-import android.os.Bundle;
-
-/**
- * A minimal application for {@link ImageView} test.
- */
-public class ImageViewStubActivity extends Activity {
-    /**
-     * Called with the activity is first created.
-     */
-    @Override
-    public void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-        setContentView(R.layout.imageview_layout);
-    }
-}
-
diff --git a/tests/src/android/widget/cts/LayoutDirectionStubActivity.java b/tests/src/android/widget/cts/LayoutDirectionStubActivity.java
deleted file mode 100644
index 66f24f7..0000000
--- a/tests/src/android/widget/cts/LayoutDirectionStubActivity.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.widget.cts;
-
-import android.app.Activity;
-import android.os.Bundle;
-import com.android.cts.stub.R;
-
-/**
- * A minimal application for layout direction test.
- */
-public class LayoutDirectionStubActivity extends Activity {
-    @Override
-    public void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-        setContentView(R.layout.layoutdirection_layout);
-    }
-}
diff --git a/tests/src/android/widget/cts/LinearLayoutStubActivity.java b/tests/src/android/widget/cts/LinearLayoutStubActivity.java
deleted file mode 100644
index 8f4c5da..0000000
--- a/tests/src/android/widget/cts/LinearLayoutStubActivity.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.widget.cts;
-
-import com.android.cts.stub.R;
-
-import android.app.Activity;
-import android.os.Bundle;
-
-/**
- * A minimal application for {@link LinearLayout} test.
- */
-public class LinearLayoutStubActivity extends Activity {
-    @Override
-    public void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-        setContentView(R.layout.linearlayout_layout);
-    }
-}
diff --git a/tests/src/android/widget/cts/ListViewStubActivity.java b/tests/src/android/widget/cts/ListViewStubActivity.java
deleted file mode 100644
index 77c3e5e..0000000
--- a/tests/src/android/widget/cts/ListViewStubActivity.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Copyright (C) 2009 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.widget.cts;
-
-import com.android.cts.stub.R;
-
-import android.app.Activity;
-import android.os.Bundle;
-
-public class ListViewStubActivity extends Activity {
-    @Override
-    public void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-        setContentView(R.layout.listview_layout);
-    }
-}
diff --git a/tests/src/android/widget/cts/MediaControllerStubActivity.java b/tests/src/android/widget/cts/MediaControllerStubActivity.java
deleted file mode 100644
index 0e353be..0000000
--- a/tests/src/android/widget/cts/MediaControllerStubActivity.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.widget.cts;
-
-import android.app.Activity;
-import android.os.Bundle;
-import android.widget.MediaController;
-
-import com.android.cts.stub.R;
-
-/**
- * A minimal application for {@link MediaController} test.
- */
-public class MediaControllerStubActivity extends Activity {
-    /**
-     * Called with the activity is first created.
-     */
-    @Override
-    public void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-        setContentView(R.layout.mediacontroller_layout);
-    }
-}
diff --git a/tests/src/android/widget/cts/MockPopupWindowStubActivity.java b/tests/src/android/widget/cts/MockPopupWindowStubActivity.java
deleted file mode 100644
index 2ca81de..0000000
--- a/tests/src/android/widget/cts/MockPopupWindowStubActivity.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.widget.cts;
-
-import com.android.cts.stub.R;
-
-import android.app.Activity;
-import android.os.Bundle;
-import android.widget.PopupWindow;
-
-/**
- * Stub activity for testing {@link PopupWindow}
- */
-public class MockPopupWindowStubActivity extends Activity {
-    @Override
-    protected void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-        setContentView(R.layout.popupwindow);
-    }
-}
-
diff --git a/tests/src/android/widget/cts/MultiAutoCompleteTextViewStubActivity.java b/tests/src/android/widget/cts/MultiAutoCompleteTextViewStubActivity.java
deleted file mode 100644
index fa973a6..0000000
--- a/tests/src/android/widget/cts/MultiAutoCompleteTextViewStubActivity.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * Copyright (C) 2009 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.widget.cts;
-
-import com.android.cts.stub.R;
-
-import android.app.Activity;
-import android.os.Bundle;
-
-/**
- * A minimal application for MultiAutoCompleteTextView test.
- */
-public class MultiAutoCompleteTextViewStubActivity extends Activity {
-    @Override
-    public void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-        setContentView(R.layout.multi_auto_complete_text_view_layout);
-    }
-}
diff --git a/tests/src/android/widget/cts/ProgressBarStubActivity.java b/tests/src/android/widget/cts/ProgressBarStubActivity.java
deleted file mode 100644
index 57cfa1a..0000000
--- a/tests/src/android/widget/cts/ProgressBarStubActivity.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.widget.cts;
-
-import android.app.Activity;
-import android.os.Bundle;
-
-/**
- * An application for ProgressBar test
- *
- */
-public class ProgressBarStubActivity extends Activity {
-    /**
-     * Called with the activity is first created.
-     */
-    @Override
-    public void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-    }
-}
diff --git a/tests/src/android/widget/cts/RatingBarStubActivity.java b/tests/src/android/widget/cts/RatingBarStubActivity.java
deleted file mode 100644
index 9635252..0000000
--- a/tests/src/android/widget/cts/RatingBarStubActivity.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.widget.cts;
-
-import android.app.Activity;
-import android.os.Bundle;
-
-import com.android.cts.stub.R;
-
-/**
- * An application for ProgressBar test
- *
- */
-public class RatingBarStubActivity extends Activity {
-    /**
-     * Called with the activity is first created.
-     */
-    @Override
-    public void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-        setContentView(R.layout.ratingbar_layout);
-    }
-}
diff --git a/tests/src/android/widget/cts/RelativeLayoutStubActivity.java b/tests/src/android/widget/cts/RelativeLayoutStubActivity.java
deleted file mode 100644
index d4bd474..0000000
--- a/tests/src/android/widget/cts/RelativeLayoutStubActivity.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.widget.cts;
-
-import com.android.cts.stub.R;
-
-import android.app.Activity;
-import android.os.Bundle;
-
-/**
- * A minimal application for RelativeLayout test.
- */
-public class RelativeLayoutStubActivity extends Activity {
-    /**
-     * Called with the activity is first created.
-     */
-    @Override
-    public void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-        setContentView(R.layout.relative_layout);
-    }
-}
-
diff --git a/tests/src/android/widget/cts/RemoteViewsStubActivity.java b/tests/src/android/widget/cts/RemoteViewsStubActivity.java
deleted file mode 100644
index f16ae13..0000000
--- a/tests/src/android/widget/cts/RemoteViewsStubActivity.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.widget.cts;
-
-import com.android.cts.stub.R;
-
-import android.app.Activity;
-import android.os.Bundle;
-import android.webkit.cts.NullWebViewUtils;
-import android.widget.RemoteViews;
-
-/**
- * Stub activity for testing {@link RemoteViews}
- */
-public class RemoteViewsStubActivity extends Activity {
-    @Override
-    protected void onCreate(Bundle savedInstanceState) {
-        try {
-            super.onCreate(savedInstanceState);
-            setContentView(R.layout.remoteviews_host);
-        } catch (Exception e) {
-            NullWebViewUtils.determineIfWebViewAvailable(this, e);
-        }
-    }
-}
diff --git a/tests/src/android/widget/cts/ScrollViewStubActivity.java b/tests/src/android/widget/cts/ScrollViewStubActivity.java
deleted file mode 100644
index 4daeb9f..0000000
--- a/tests/src/android/widget/cts/ScrollViewStubActivity.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Copyright (C) 2009 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.widget.cts;
-
-import com.android.cts.stub.R;
-
-import android.app.Activity;
-import android.os.Bundle;
-
-public class ScrollViewStubActivity extends Activity {
-    @Override
-    public void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-        setContentView(R.layout.scrollview_layout);
-    }
-}
diff --git a/tests/src/android/widget/cts/SeekBarStubActivity.java b/tests/src/android/widget/cts/SeekBarStubActivity.java
deleted file mode 100644
index 81d3d41..0000000
--- a/tests/src/android/widget/cts/SeekBarStubActivity.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.widget.cts;
-
-import com.android.cts.stub.R;
-
-import android.app.Activity;
-import android.os.Bundle;
-import android.view.View;
-import android.widget.SeekBar;
-
-/**
- * Stub activity for testing {@link SeekBar}
- */
-public class SeekBarStubActivity extends Activity {
-    /**
-     * Called with the activity is first created.
-     */
-    @Override
-    public void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-        setContentView(R.layout.seekbar_layout);
-
-        View v = findViewById(R.id.seekBar);
-        v.setEnabled(true);
-        v.setFocusable(true);
-        v.setFocusableInTouchMode(true);
-        v.requestFocus();
-    }
-}
diff --git a/tests/src/android/widget/cts/SlidingDrawerStubActivity.java b/tests/src/android/widget/cts/SlidingDrawerStubActivity.java
deleted file mode 100644
index d19b9b1..0000000
--- a/tests/src/android/widget/cts/SlidingDrawerStubActivity.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Copyright (C) 2009 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.widget.cts;
-
-import com.android.cts.stub.R;
-
-import android.app.Activity;
-import android.os.Bundle;
-
-public class SlidingDrawerStubActivity extends Activity {
-    @Override
-    public void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-        setContentView(R.layout.sliding_drawer_layout);
-    }
-}
diff --git a/tests/src/android/widget/cts/StubActivity.java b/tests/src/android/widget/cts/StubActivity.java
deleted file mode 100644
index fe4002c..0000000
--- a/tests/src/android/widget/cts/StubActivity.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * Copyright (C) 2009 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.widget.cts;
-
-import android.app.Activity;
-
-/**
- * Stub activity for helping test. It's an empty activity.
- */
-public class StubActivity extends Activity {
-
-}
diff --git a/tests/src/android/widget/cts/TabHostStubActivity.java b/tests/src/android/widget/cts/TabHostStubActivity.java
deleted file mode 100644
index 78e0894..0000000
--- a/tests/src/android/widget/cts/TabHostStubActivity.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * Copyright (C) 2009 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.widget.cts;
-
-import android.app.TabActivity;
-import android.os.Bundle;
-import android.view.View;
-import android.widget.TabHost;
-import android.widget.TextView;
-
-import com.android.cts.stub.R;
-
-/**
- * A minimal application for TabHost test.
- * It contains an initial tab whose tag is INITIAL_TAB_TAG and label is INITIAL_TAB_LABEL.
- */
-public class TabHostStubActivity extends TabActivity {
-    public static final String INITIAL_TAB_TAG = "initial tag";
-    public static final String INITIAL_TAB_LABEL = "initial label";
-    public static final String INITIAL_VIEW_TEXT = "initial view text";
-
-    @Override
-    public void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-        setContentView(R.layout.tabhost_layout);
-
-        TabHost tabHost = getTabHost();
-
-        // at least one tab
-        tabHost.addTab(tabHost.newTabSpec(INITIAL_TAB_TAG)
-                .setIndicator(INITIAL_TAB_LABEL)
-                .setContent(new MyTabContentFactory()));
-    }
-
-    private class MyTabContentFactory implements TabHost.TabContentFactory {
-        public View createTabContent(String tag) {
-            final TextView tv = new TextView(getApplicationContext());
-            tv.setText(INITIAL_VIEW_TEXT);
-            return tv;
-        }
-    }
-}
diff --git a/tests/src/android/widget/cts/TableStubActivity.java b/tests/src/android/widget/cts/TableStubActivity.java
deleted file mode 100644
index 0edc513..0000000
--- a/tests/src/android/widget/cts/TableStubActivity.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.widget.cts;
-
-import com.android.cts.stub.R;
-
-import android.app.Activity;
-import android.os.Bundle;
-
-/**
- * A minimal application for TableLayout test.
- */
-public class TableStubActivity extends Activity {
-    /**
-     * Called with the activity is first created.
-     */
-    @Override
-    public void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-        setContentView(R.layout.table_layout_1);
-    }
-}
diff --git a/tests/src/android/widget/cts/TextViewStubActivity.java b/tests/src/android/widget/cts/TextViewStubActivity.java
deleted file mode 100644
index 956e264..0000000
--- a/tests/src/android/widget/cts/TextViewStubActivity.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.widget.cts;
-
-import com.android.cts.stub.R;
-
-import android.app.Activity;
-import android.os.Bundle;
-
-/**
- * A minimal application for TextView test.
- */
-public class TextViewStubActivity extends Activity {
-    /**
-     * Called with the activity is first created.
-     */
-    @Override
-    public void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-        setContentView(R.layout.textview_layout);
-    }
-}
-
diff --git a/tests/src/android/widget/cts/TwoLineListItemStubActivity.java b/tests/src/android/widget/cts/TwoLineListItemStubActivity.java
deleted file mode 100644
index 380cefb..0000000
--- a/tests/src/android/widget/cts/TwoLineListItemStubActivity.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.widget.cts;
-
-import com.android.cts.stub.R;
-
-import android.app.Activity;
-import android.os.Bundle;
-import android.widget.TwoLineListItem;
-
-/**
- * Stub activity for testing {@link TwoLineListItem}
- */
-public class TwoLineListItemStubActivity extends Activity {
-    /**
-     * Called with the activity is first created.
-     */
-    @Override
-    public void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-        setContentView(R.layout.twolinelistitem);
-    }
-}
diff --git a/tests/src/android/widget/cts/VideoViewStubActivity.java b/tests/src/android/widget/cts/VideoViewStubActivity.java
deleted file mode 100644
index 73c7756..0000000
--- a/tests/src/android/widget/cts/VideoViewStubActivity.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Copyright (C) 2009 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.widget.cts;
-
-import com.android.cts.stub.R;
-
-import android.app.Activity;
-import android.os.Bundle;
-import android.widget.VideoView;
-
-/**
- * A minimal application for {@link VideoView} test.
- */
-public class VideoViewStubActivity extends Activity {
-    /**
-     * Called with the activity is first created.
-     */
-    @Override
-    public void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-        setContentView(R.layout.videoview_layout);
-    }
-}
diff --git a/tests/src/android/widget/cts/ViewAnimatorStubActivity.java b/tests/src/android/widget/cts/ViewAnimatorStubActivity.java
deleted file mode 100644
index 634f531..0000000
--- a/tests/src/android/widget/cts/ViewAnimatorStubActivity.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.widget.cts;
-
-import android.app.Activity;
-import android.os.Bundle;
-import com.android.cts.stub.R;
-
-/**
- * A minimal application for ViewAnimator test.
- */
-public class ViewAnimatorStubActivity extends Activity {
-    /**
-     * Called with the activity is first created.
-     */
-    @Override
-    public void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-        setContentView(R.layout.viewanimator_layout);
-    }
-}
-
diff --git a/tests/src/android/widget/cts/ViewFlipperStubActivity.java b/tests/src/android/widget/cts/ViewFlipperStubActivity.java
deleted file mode 100644
index 2ac331e..0000000
--- a/tests/src/android/widget/cts/ViewFlipperStubActivity.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.widget.cts;
-
-import com.android.cts.stub.R;
-
-import android.app.Activity;
-import android.os.Bundle;
-
-public class ViewFlipperStubActivity extends Activity {
-    @Override
-    public void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-
-        setContentView(R.layout.viewflipper_layout);
-    }
-}
-
diff --git a/tests/src/android/widget/cts/ViewGroupStubActivity.java b/tests/src/android/widget/cts/ViewGroupStubActivity.java
deleted file mode 100644
index 346c067..0000000
--- a/tests/src/android/widget/cts/ViewGroupStubActivity.java
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.widget.cts;
-
-import android.app.Activity;
-import android.app.cts.CTSResult;
-import android.os.Bundle;
-import android.os.Handler;
-import android.widget.TextView;
-
-public class ViewGroupStubActivity extends Activity {
-
-    public static final String ACTION_INVALIDATE_CHILD = "invalidateChild";
-
-    private final Handler mHandler = new Handler();
-    private static CTSResult sResult;
-    public static void setResult(CTSResult result) {
-        sResult = result;
-    }
-
-    @Override
-    protected void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-        setContentView(com.android.cts.stub.R.layout.viewgrouptest_stub);
-        TextView textView = (TextView)findViewById(com.android.cts.stub.R.id.viewgrouptest_stub);
-        textView.setText("test");
-    }
-
-    @Override
-    protected void onResume() {
-        super.onResume();
-
-        String action = getIntent().getAction();
-        if (action.equals(ACTION_INVALIDATE_CHILD)) {
-            mHandler.postDelayed(new Runnable() {
-                public void run() {
-                    MockLinearLayout mll =
-                        (MockLinearLayout) findViewById(com.android.cts.stub.R.id.
-                                                                        mocklinearlayout);
-                    if (!mll.mIsInvalidateChildInParentCalled) {
-                        fail();
-                        return;
-                    }
-                    sResult.setResult(CTSResult.RESULT_OK);
-                    finish();
-                }
-            }, 2000);
-        }
-    }
-
-    private void fail() {
-        sResult.setResult(CTSResult.RESULT_FAIL);
-        finish();
-    }
-}
-
diff --git a/tests/src/android/widget/cts/ZoomButtonStubActivity.java b/tests/src/android/widget/cts/ZoomButtonStubActivity.java
deleted file mode 100644
index a49df7a..0000000
--- a/tests/src/android/widget/cts/ZoomButtonStubActivity.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * Copyright (C) 2009 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.widget.cts;
-
-import com.android.cts.stub.R;
-
-import android.app.Activity;
-import android.os.Bundle;
-
-/**
- * A minimal application for {@link ZoomButton} test.
- */
-public class ZoomButtonStubActivity extends Activity {
-    /**
-     * Called with the activity is first created.
-     */
-    @Override
-    public void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-        setContentView(R.layout.zoombutton_layout);
-    }
-}
diff --git a/tests/tests/app/AndroidManifest.xml b/tests/tests/app/AndroidManifest.xml
index 134df64..a558564 100644
--- a/tests/tests/app/AndroidManifest.xml
+++ b/tests/tests/app/AndroidManifest.xml
@@ -21,6 +21,14 @@
     <uses-permission android:name="android.permission.DISABLE_KEYGUARD" />
     <application>
         <uses-library android:name="android.test.runner" />
+
+        <service android:name="android.speech.tts.cts.StubTextToSpeechService">
+            <intent-filter>
+                <action android:name="android.intent.action.TTS_SERVICE" />
+                <category android:name="android.intent.category.DEFAULT" />
+            </intent-filter>
+        </service>
+
     </application>
 
     <instrumentation android:name="android.support.test.runner.AndroidJUnitRunner"
diff --git a/tests/tests/app/src/android/app/cts/SystemFeaturesTest.java b/tests/tests/app/src/android/app/cts/SystemFeaturesTest.java
index cacebdf..e3dca19 100644
--- a/tests/tests/app/src/android/app/cts/SystemFeaturesTest.java
+++ b/tests/tests/app/src/android/app/cts/SystemFeaturesTest.java
@@ -241,6 +241,10 @@
                 Sensor.TYPE_HEART_RATE);
         assertFeatureForSensor(featuresLeft, PackageManager.FEATURE_SENSOR_HEART_RATE_ECG,
                 Sensor.TYPE_HEART_RATE);
+        assertFeatureForSensor(featuresLeft, PackageManager.FEATURE_SENSOR_AMBIENT_TEMPERATURE,
+                Sensor.TYPE_AMBIENT_TEMPERATURE);
+        assertFeatureForSensor(featuresLeft, PackageManager.FEATURE_SENSOR_RELATIVE_HUMIDITY,
+                Sensor.TYPE_RELATIVE_HUMIDITY);
 
         assertTrue("Assertions need to be added to this test for " + featuresLeft,
                 featuresLeft.isEmpty());
diff --git a/tests/tests/content/Android.mk b/tests/tests/content/Android.mk
index 6f883b6..2c185d9 100644
--- a/tests/tests/content/Android.mk
+++ b/tests/tests/content/Android.mk
@@ -23,12 +23,15 @@
 
 LOCAL_JAVA_LIBRARIES := android.test.runner
 
-LOCAL_STATIC_JAVA_LIBRARIES := ctstestrunner
+LOCAL_STATIC_JAVA_LIBRARIES := ctsdeviceutil ctstestrunner
+
+# Resource unit tests use a private locale and some densities
+LOCAL_AAPT_FLAGS = -c xx_YY -c cs -c small -c normal -c large -c xlarge \
+        -c 320dpi -c 240dpi -c 160dpi -c 32dpi \
+        -c kok,kok_IN,kok_419,kok_419_VARIANT,kok_Knda_419,kok_Knda_419_VARIANT,kok_VARIANT,kok_Knda,tgl,tgl_PH
 
 LOCAL_SRC_FILES := $(call all-java-files-under, src)
 
 LOCAL_PACKAGE_NAME := CtsContentTestCases
 
-LOCAL_INSTRUMENTATION_FOR := CtsTestStubs
-
 include $(BUILD_CTS_PACKAGE)
diff --git a/tests/tests/content/AndroidManifest.xml b/tests/tests/content/AndroidManifest.xml
index 8d57e49..b3de29f 100644
--- a/tests/tests/content/AndroidManifest.xml
+++ b/tests/tests/content/AndroidManifest.xml
@@ -18,9 +18,53 @@
     package="com.android.cts.content">
 
     <uses-permission android:name="android.permission.DISABLE_KEYGUARD" />
+    <!-- content sync tests -->
+    <uses-permission android:name="android.permission.MANAGE_ACCOUNTS" />
+    <uses-permission android:name="android.permission.AUTHENTICATE_ACCOUNTS" />
+    <uses-permission android:name="android.permission.GET_ACCOUNTS" />
+    <uses-permission android:name="android.permission.USE_CREDENTIALS" />
+    <uses-permission android:name="android.permission.READ_SYNC_SETTINGS" />
+    <uses-permission android:name="android.permission.WRITE_SYNC_SETTINGS" />
+    <uses-permission android:name="android.permission.READ_SYNC_STATS" />
+    <uses-permission android:name="android.permission.WRITE_SETTINGS" />
+    <uses-permission android:name="android.permission.SET_WALLPAPER" />
+    <uses-permission android:name="android.permission.BROADCAST_STICKY" />
+    <uses-permission android:name="android.content.cts.permission.TEST_GRANTED" />
 
-    <application>
-        <activity android:name="android.app.cts.MockActivity">
+    <!-- Used for PackageManager test, don't delete this INTERNET permission -->
+    <uses-permission android:name="android.permission.INTERNET" />
+
+    <!-- Used for PackageManager test, don't delete this permission-tree -->
+    <permission-tree android:name="com.android.cts.content.permission.TEST_DYNAMIC"
+                    android:label="Test Tree"/>
+
+    <!-- Used for PackageManager test, don't delete this permission-group -->
+    <permission-group android:name="android.permission-group.COST_MONEY"/>
+    <!-- Used for PackageManager test, don't delete! -->
+    <uses-configuration/>
+    <uses-feature android:name="android.hardware.camera" />
+    <uses-feature android:glEsVersion="0x00020000" />
+    <feature-group/>
+    <feature-group>
+        <uses-feature android:glEsVersion="0x00030000" />
+        <uses-feature android:name="android.hardware.location" />
+    </feature-group>
+    <feature-group>
+        <uses-feature android:glEsVersion="0x00010001" />
+        <uses-feature android:name="android.hardware.camera" />
+    </feature-group>
+
+    <application android:label="Android TestCase"
+                android:icon="@drawable/size_48x48"
+                android:maxRecents="1"
+                android:multiArch="true"
+                android:name="android.content.cts.MockApplication"
+                android:supportsRtl="true">
+        <activity android:name="android.content.cts.MockActivity">
+            <meta-data android:name="android.app.alias"
+                android:resource="@xml/alias" />
+            <meta-data android:name="android.app.intent.filter"
+                android:resource="@xml/intentfilter" />
             <intent-filter>
                 <action android:name="com.android.cts.content.action.TEST_ACTION" />
                 <category android:name="android.intent.category.DEFAULT" />
@@ -28,8 +72,8 @@
             </intent-filter>
         </activity>
 
-        <activity-alias android:name="android.app.cts.MockActivity2"
-                android:targetActivity="android.app.cts.MockActivity">
+        <activity-alias android:name="android.content.cts.MockActivity2"
+                android:targetActivity="android.content.cts.MockActivity">
             <intent-filter>
                 <action android:name="com.android.cts.content.action.TEST_ACTION" />
                 <category android:name="android.intent.category.DEFAULT" />
@@ -37,13 +81,114 @@
         </activity-alias>
 
         <uses-library android:name="android.test.runner" />
+
+        <service android:name="android.content.cts.MockContextWrapperService" />
+        <activity android:name=".content.ContextWrapperCtsActivity"
+            android:label="ContextWrapperCtsActivity">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+            </intent-filter>
+        </activity>
+
+        <receiver android:name="android.content.cts.MockReceiverFirst">
+            <intent-filter android:priority="3">
+                <action android:name="android.content.cts.BroadcastReceiverTest.BROADCAST_TESTABORT" />
+            </intent-filter>
+        </receiver>
+        <receiver android:name="android.content.cts.MockReceiverAbort">
+            <intent-filter android:priority="2">
+                <action android:name="android.content.cts.BroadcastReceiverTest.BROADCAST_TESTABORT" />
+            </intent-filter>
+        </receiver>
+        <receiver android:name="android.content.cts.MockReceiver">
+            <intent-filter android:priority="1">
+                <action android:name="android.content.cts.BroadcastReceiverTest.BROADCAST_MOCKTEST" />
+                <action android:name="android.content.cts.BroadcastReceiverTest.BROADCAST_TESTABORT" />
+                <action android:name="android.content.cts.ContextWrapperTest.BROADCAST_TESTORDER" />
+            </intent-filter>
+        </receiver>
+
+        <activity android:name="android.content.cts.AvailableIntentsActivity"
+            android:label="AvailableIntentsActivity">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="android.intent.category.FRAMEWORK_INSTRUMENTATION_TEST" />
+            </intent-filter>
+        </activity>
+
+        <!--Test for PackageManager-->
+        <activity android:name="android.content.pm.cts.TestPmActivity"
+                android:icon="@drawable/start">
+            <intent-filter>
+                <action android:name="android.intent.action.PMTEST" />
+                <category android:name="android.intent.category.FRAMEWORK_INSTRUMENTATION_TEST" />
+            </intent-filter>
+            <meta-data android:name="android.content.pm.cts.xmltest" android:resource="@xml/pm_test" />
+        </activity>
+        <activity android:name="android.content.pm.cts.TestPmCompare">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="android.intent.category.INFO" />
+            </intent-filter>
+        </activity>
+        <!--Test for PackageManager-->
+        <service android:name="android.content.pm.cts.TestPmService">
+            <intent-filter>
+                <action android:name="android.content.pm.cts.activity.PMTEST_SERVICE" />
+            </intent-filter>
+        </service>
+        <!--Test for PackageManager-->
+        <receiver android:name="android.content.pm.cts.PmTestReceiver">
+            <intent-filter>
+                <action android:name="android.content.pm.cts.PackageManagerTest.PMTEST_RECEIVER" />
+            </intent-filter>
+        </receiver>
+
+        <!-- Used for PackageManager test, don't delete this MockContentProvider provider -->
+        <provider android:name="android.content.cts.MockContentProvider" android:authorities="ctstest"
+            android:multiprocess="false" />
+        <provider android:name="android.content.cts.DummyProvider"
+            android:authorities="android.content.cts.dummyprovider"
+            android:multiprocess="true" />
+        <provider android:name="android.content.cts.MockRemoteContentProvider"
+            android:authorities="remotectstest"
+            android:process=":remoteprovider" android:multiprocess="false" />
+
+        <service android:name="android.content.cts.MockService" />
+
+        <service android:name="android.content.cts.MockSyncAdapterService" android:exported="true">
+            <intent-filter>
+                <action android:name="android.content.SyncAdapter" />
+            </intent-filter>
+
+            <meta-data android:name="android.content.SyncAdapter"
+                       android:resource="@xml/syncadapter" />
+        </service>
+
+        <service android:name="android.content.cts.MockAccountService" android:exported="true"
+                 >
+            <intent-filter>
+                <action android:name="android.accounts.AccountAuthenticator" />
+            </intent-filter>
+
+            <meta-data android:name="android.accounts.AccountAuthenticator"
+                       android:resource="@xml/authenticator" />
+        </service>
+
+        <activity android:name="android.content.cts.ClipboardManagerListenerActivity"/>
+
     </application>
 
     <instrumentation android:name="android.support.test.runner.AndroidJUnitRunner"
-                     android:targetPackage="com.android.cts.stub"
+                     android:targetPackage="com.android.cts.content"
                      android:label="CTS tests of android.content">
         <meta-data android:name="listener"
             android:value="com.android.cts.runner.CtsTestRunListener" />
     </instrumentation>
+
+    <!--Test for PackageManager, please put this at the very beginning-->
+    <instrumentation android:name="android.content.pm.cts.TestPmInstrumentation"
+        android:targetPackage="android"
+        android:label="PackageManager Instrumentation Test" />
 </manifest>
 
diff --git a/tests/assets/text.txt b/tests/tests/content/assets/text.txt
similarity index 100%
rename from tests/assets/text.txt
rename to tests/tests/content/assets/text.txt
diff --git a/tests/tests/content/res/anim/anim_rotate.xml b/tests/tests/content/res/anim/anim_rotate.xml
new file mode 100644
index 0000000..4fbadcf
--- /dev/null
+++ b/tests/tests/content/res/anim/anim_rotate.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ * Copyright (C) 2008 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ -->
+
+<rotate xmlns:android="http://schemas.android.com/apk/res/android"
+    android:interpolator="@android:anim/decelerate_interpolator"
+    android:fromDegrees="0"
+    android:toDegrees="-45"
+    android:toYScale="0.0"
+    android:pivotX="50%"
+    android:pivotY="50%"
+    android:duration="700" />
diff --git a/tests/tests/content/res/color/color1.xml b/tests/tests/content/res/color/color1.xml
new file mode 100755
index 0000000..87034fa
--- /dev/null
+++ b/tests/tests/content/res/color/color1.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2007 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+  
+          http://www.apache.org/licenses/LICENSE-2.0
+  
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+    <item android:state_focused="true" android:color="@color/testcolor1"/>
+    <item android:color="@color/testcolor2"/>
+</selector>
diff --git a/tests/tests/content/res/drawable/ic_cts_minitab_selected.png b/tests/tests/content/res/drawable/ic_cts_minitab_selected.png
new file mode 100644
index 0000000..c730050
--- /dev/null
+++ b/tests/tests/content/res/drawable/ic_cts_minitab_selected.png
Binary files differ
diff --git a/tests/tests/content/res/drawable/ic_cts_selected.png b/tests/tests/content/res/drawable/ic_cts_selected.png
new file mode 100644
index 0000000..72a065c
--- /dev/null
+++ b/tests/tests/content/res/drawable/ic_cts_selected.png
Binary files differ
diff --git a/tests/tests/content/res/drawable/icon_black.jpg b/tests/tests/content/res/drawable/icon_black.jpg
new file mode 100644
index 0000000..4c9062a
--- /dev/null
+++ b/tests/tests/content/res/drawable/icon_black.jpg
Binary files differ
diff --git a/tests/tests/content/res/drawable/ninepatch_0.9.png b/tests/tests/content/res/drawable/ninepatch_0.9.png
new file mode 100644
index 0000000..24019d8
--- /dev/null
+++ b/tests/tests/content/res/drawable/ninepatch_0.9.png
Binary files differ
diff --git a/tests/tests/content/res/drawable/ninepatch_1.9.png b/tests/tests/content/res/drawable/ninepatch_1.9.png
new file mode 100644
index 0000000..c56b1db
--- /dev/null
+++ b/tests/tests/content/res/drawable/ninepatch_1.9.png
Binary files differ
diff --git a/tests/tests/content/res/drawable/pass.jpg b/tests/tests/content/res/drawable/pass.jpg
new file mode 100644
index 0000000..2f4b083
--- /dev/null
+++ b/tests/tests/content/res/drawable/pass.jpg
Binary files differ
diff --git a/tests/tests/content/res/drawable/scenery.jpg b/tests/tests/content/res/drawable/scenery.jpg
new file mode 100644
index 0000000..7a6145b
--- /dev/null
+++ b/tests/tests/content/res/drawable/scenery.jpg
Binary files differ
diff --git a/tests/tests/content/res/drawable/size_48x48.jpg b/tests/tests/content/res/drawable/size_48x48.jpg
new file mode 100644
index 0000000..5c2291e
--- /dev/null
+++ b/tests/tests/content/res/drawable/size_48x48.jpg
Binary files differ
diff --git a/tests/tests/content/res/drawable/start.jpg b/tests/tests/content/res/drawable/start.jpg
new file mode 100644
index 0000000..54e05e0
--- /dev/null
+++ b/tests/tests/content/res/drawable/start.jpg
Binary files differ
diff --git a/tests/tests/content/res/drawable/testcolor.xml b/tests/tests/content/res/drawable/testcolor.xml
new file mode 100644
index 0000000..d7b2718
--- /dev/null
+++ b/tests/tests/content/res/drawable/testcolor.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/*
+ * Copyright (C) 2008 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+-->
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+    <item android:color="#FFA6C839"/>
+</selector>
+
diff --git a/tests/tests/content/res/drawable/testimage.jpg b/tests/tests/content/res/drawable/testimage.jpg
new file mode 100644
index 0000000..754df0c
--- /dev/null
+++ b/tests/tests/content/res/drawable/testimage.jpg
Binary files differ
diff --git a/tests/tests/content/res/layout/abslistview_layout.xml b/tests/tests/content/res/layout/abslistview_layout.xml
new file mode 100644
index 0000000..a090ce3
--- /dev/null
+++ b/tests/tests/content/res/layout/abslistview_layout.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2008 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<ViewGroup_Layout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:id="@+id/abslistview_root"
+    android:layout_width="25px"
+    android:layout_height="25px" >
+
+   <GridView
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content" />
+
+   <ListView>
+        <TextView
+            android:text="@string/table_layout_first"
+            android:padding="3dip" />
+        <TextView
+            android:text="@string/table_layout_second"
+            android:padding="3dip" />
+        <TextView
+            android:text="@string/table_layout_third"
+            android:padding="3dip" />
+    </ListView>
+</ViewGroup_Layout>
+
diff --git a/tests/tests/content/res/layout/available_intents_layout.xml b/tests/tests/content/res/layout/available_intents_layout.xml
new file mode 100644
index 0000000..5415657
--- /dev/null
+++ b/tests/tests/content/res/layout/available_intents_layout.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ * Copyright (C) 2008 The Android Open Source Project.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ -->
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:orientation="vertical">
+
+    <TextView android:id="@+id/text"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:paddingLeft="4dip"
+        android:focusable="true"
+        android:focusableInTouchMode="true"
+        android:text="@string/text_view_hello"/>
+
+</LinearLayout>
diff --git a/tests/tests/content/res/layout/context_layout.xml b/tests/tests/content/res/layout/context_layout.xml
new file mode 100644
index 0000000..6ec6c76
--- /dev/null
+++ b/tests/tests/content/res/layout/context_layout.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2008 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<RelativeLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent">
+    <DatePicker
+        android:id="@+id/contextdatepicker_dp"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_centerInParent="true" />
+
+</RelativeLayout>
diff --git a/tests/tests/content/res/layout/local_sample.xml b/tests/tests/content/res/layout/local_sample.xml
new file mode 100644
index 0000000..6f02e78
--- /dev/null
+++ b/tests/tests/content/res/layout/local_sample.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ * Copyright (C) 2008 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ -->
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:orientation="vertical"
+    android:padding="4dip"
+    android:gravity="center_horizontal"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent">
+
+    <TextView
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:layout_weight="0"
+        android:paddingBottom="4dip"
+        android:text="@string/text"/>
+
+    <Button android:id="@+id/go"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:text="@string/text">
+        <requestFocus />
+    </Button>
+
+</LinearLayout>
+
diff --git a/tests/tests/content/res/raw/testimage.jpg b/tests/tests/content/res/raw/testimage.jpg
new file mode 100644
index 0000000..d3dae03
--- /dev/null
+++ b/tests/tests/content/res/raw/testimage.jpg
Binary files differ
diff --git a/tests/tests/content/res/raw/testmp3.mp3 b/tests/tests/content/res/raw/testmp3.mp3
new file mode 100755
index 0000000..657faf7
--- /dev/null
+++ b/tests/tests/content/res/raw/testmp3.mp3
Binary files differ
diff --git a/tests/assets/text.txt b/tests/tests/content/res/raw/text.txt
similarity index 100%
copy from tests/assets/text.txt
copy to tests/tests/content/res/raw/text.txt
diff --git a/tests/res/values-12key-63x57/configVarying.xml b/tests/tests/content/res/values-12key-63x57/configVarying.xml
similarity index 100%
rename from tests/res/values-12key-63x57/configVarying.xml
rename to tests/tests/content/res/values-12key-63x57/configVarying.xml
diff --git a/tests/res/values-12key-dpad/configVarying.xml b/tests/tests/content/res/values-12key-dpad/configVarying.xml
similarity index 100%
rename from tests/res/values-12key-dpad/configVarying.xml
rename to tests/tests/content/res/values-12key-dpad/configVarying.xml
diff --git a/tests/res/values-12key/configVarying.xml b/tests/tests/content/res/values-12key/configVarying.xml
similarity index 100%
rename from tests/res/values-12key/configVarying.xml
rename to tests/tests/content/res/values-12key/configVarying.xml
diff --git a/tests/res/values-240dpi/configVarying.xml b/tests/tests/content/res/values-240dpi/configVarying.xml
similarity index 100%
rename from tests/res/values-240dpi/configVarying.xml
rename to tests/tests/content/res/values-240dpi/configVarying.xml
diff --git a/tests/res/values-32dpi-keysexposed/configVarying.xml b/tests/tests/content/res/values-32dpi-keysexposed/configVarying.xml
similarity index 100%
rename from tests/res/values-32dpi-keysexposed/configVarying.xml
rename to tests/tests/content/res/values-32dpi-keysexposed/configVarying.xml
diff --git a/tests/res/values-32dpi-stylus/configVarying.xml b/tests/tests/content/res/values-32dpi-stylus/configVarying.xml
similarity index 100%
rename from tests/res/values-32dpi-stylus/configVarying.xml
rename to tests/tests/content/res/values-32dpi-stylus/configVarying.xml
diff --git a/tests/res/values-32dpi/configVarying.xml b/tests/tests/content/res/values-32dpi/configVarying.xml
similarity index 100%
rename from tests/res/values-32dpi/configVarying.xml
rename to tests/tests/content/res/values-32dpi/configVarying.xml
diff --git a/tests/res/values-480x320/configVarying.xml b/tests/tests/content/res/values-480x320/configVarying.xml
similarity index 100%
rename from tests/res/values-480x320/configVarying.xml
rename to tests/tests/content/res/values-480x320/configVarying.xml
diff --git a/tests/res/values-640x400/configVarying.xml b/tests/tests/content/res/values-640x400/configVarying.xml
similarity index 100%
rename from tests/res/values-640x400/configVarying.xml
rename to tests/tests/content/res/values-640x400/configVarying.xml
diff --git a/tests/res/values-b+kok+419+VARIANT/configVarying.xml b/tests/tests/content/res/values-b+kok+419+VARIANT/configVarying.xml
similarity index 100%
rename from tests/res/values-b+kok+419+VARIANT/configVarying.xml
rename to tests/tests/content/res/values-b+kok+419+VARIANT/configVarying.xml
diff --git a/tests/res/values-b+kok+419/configVarying.xml b/tests/tests/content/res/values-b+kok+419/configVarying.xml
similarity index 100%
rename from tests/res/values-b+kok+419/configVarying.xml
rename to tests/tests/content/res/values-b+kok+419/configVarying.xml
diff --git a/tests/res/values-b+kok+IN/configVarying.xml b/tests/tests/content/res/values-b+kok+IN/configVarying.xml
similarity index 100%
rename from tests/res/values-b+kok+IN/configVarying.xml
rename to tests/tests/content/res/values-b+kok+IN/configVarying.xml
diff --git a/tests/res/values-b+kok+Knda+419+VARIANT/configVarying.xml b/tests/tests/content/res/values-b+kok+Knda+419+VARIANT/configVarying.xml
similarity index 100%
rename from tests/res/values-b+kok+Knda+419+VARIANT/configVarying.xml
rename to tests/tests/content/res/values-b+kok+Knda+419+VARIANT/configVarying.xml
diff --git a/tests/res/values-b+kok+Knda+419/configVarying.xml b/tests/tests/content/res/values-b+kok+Knda+419/configVarying.xml
similarity index 100%
rename from tests/res/values-b+kok+Knda+419/configVarying.xml
rename to tests/tests/content/res/values-b+kok+Knda+419/configVarying.xml
diff --git a/tests/res/values-b+kok+Knda/configVarying.xml b/tests/tests/content/res/values-b+kok+Knda/configVarying.xml
similarity index 100%
rename from tests/res/values-b+kok+Knda/configVarying.xml
rename to tests/tests/content/res/values-b+kok+Knda/configVarying.xml
diff --git a/tests/res/values-b+kok+VARIANT/configVarying.xml b/tests/tests/content/res/values-b+kok+VARIANT/configVarying.xml
similarity index 100%
rename from tests/res/values-b+kok+VARIANT/configVarying.xml
rename to tests/tests/content/res/values-b+kok+VARIANT/configVarying.xml
diff --git a/tests/res/values-b+kok/configVarying.xml b/tests/tests/content/res/values-b+kok/configVarying.xml
similarity index 100%
rename from tests/res/values-b+kok/configVarying.xml
rename to tests/tests/content/res/values-b+kok/configVarying.xml
diff --git a/tests/res/values-b+tgl+PH/configVarying.xml b/tests/tests/content/res/values-b+tgl+PH/configVarying.xml
similarity index 100%
rename from tests/res/values-b+tgl+PH/configVarying.xml
rename to tests/tests/content/res/values-b+tgl+PH/configVarying.xml
diff --git a/tests/res/values-b+tgl/configVarying.xml b/tests/tests/content/res/values-b+tgl/configVarying.xml
similarity index 100%
rename from tests/res/values-b+tgl/configVarying.xml
rename to tests/tests/content/res/values-b+tgl/configVarying.xml
diff --git a/tests/res/values-cs/strings.xml b/tests/tests/content/res/values-cs/strings.xml
similarity index 100%
rename from tests/res/values-cs/strings.xml
rename to tests/tests/content/res/values-cs/strings.xml
diff --git a/tests/res/values-dpad-63x57/configVarying.xml b/tests/tests/content/res/values-dpad-63x57/configVarying.xml
similarity index 100%
rename from tests/res/values-dpad-63x57/configVarying.xml
rename to tests/tests/content/res/values-dpad-63x57/configVarying.xml
diff --git a/tests/res/values-dpad/configVarying.xml b/tests/tests/content/res/values-dpad/configVarying.xml
similarity index 100%
rename from tests/res/values-dpad/configVarying.xml
rename to tests/tests/content/res/values-dpad/configVarying.xml
diff --git a/tests/res/values-fr-rFR/configVarying.xml b/tests/tests/content/res/values-fr-rFR/configVarying.xml
similarity index 100%
rename from tests/res/values-fr-rFR/configVarying.xml
rename to tests/tests/content/res/values-fr-rFR/configVarying.xml
diff --git a/tests/res/values-fr/configVarying.xml b/tests/tests/content/res/values-fr/configVarying.xml
similarity index 100%
rename from tests/res/values-fr/configVarying.xml
rename to tests/tests/content/res/values-fr/configVarying.xml
diff --git a/tests/res/values-h550dp/configVarying.xml b/tests/tests/content/res/values-h550dp/configVarying.xml
similarity index 100%
rename from tests/res/values-h550dp/configVarying.xml
rename to tests/tests/content/res/values-h550dp/configVarying.xml
diff --git a/tests/res/values-h670dp/configVarying.xml b/tests/tests/content/res/values-h670dp/configVarying.xml
similarity index 100%
rename from tests/res/values-h670dp/configVarying.xml
rename to tests/tests/content/res/values-h670dp/configVarying.xml
diff --git a/tests/res/values-keysexposed-12key/configVarying.xml b/tests/tests/content/res/values-keysexposed-12key/configVarying.xml
similarity index 100%
rename from tests/res/values-keysexposed-12key/configVarying.xml
rename to tests/tests/content/res/values-keysexposed-12key/configVarying.xml
diff --git a/tests/res/values-keysexposed-dpad/configVarying.xml b/tests/tests/content/res/values-keysexposed-dpad/configVarying.xml
similarity index 100%
rename from tests/res/values-keysexposed-dpad/configVarying.xml
rename to tests/tests/content/res/values-keysexposed-dpad/configVarying.xml
diff --git a/tests/res/values-keysexposed/configVarying.xml b/tests/tests/content/res/values-keysexposed/configVarying.xml
similarity index 100%
rename from tests/res/values-keysexposed/configVarying.xml
rename to tests/tests/content/res/values-keysexposed/configVarying.xml
diff --git a/tests/res/values-land/configVarying.xml b/tests/tests/content/res/values-land/configVarying.xml
similarity index 100%
rename from tests/res/values-land/configVarying.xml
rename to tests/tests/content/res/values-land/configVarying.xml
diff --git a/tests/res/values-land/dimens.xml b/tests/tests/content/res/values-land/dimens.xml
similarity index 100%
rename from tests/res/values-land/dimens.xml
rename to tests/tests/content/res/values-land/dimens.xml
diff --git a/tests/res/values-large/configVarying.xml b/tests/tests/content/res/values-large/configVarying.xml
similarity index 100%
rename from tests/res/values-large/configVarying.xml
rename to tests/tests/content/res/values-large/configVarying.xml
diff --git a/tests/res/values-mcc110-xx/configVarying.xml b/tests/tests/content/res/values-mcc110-xx/configVarying.xml
similarity index 100%
rename from tests/res/values-mcc110-xx/configVarying.xml
rename to tests/tests/content/res/values-mcc110-xx/configVarying.xml
diff --git a/tests/res/values-mcc111-mnc222/configVarying.xml b/tests/tests/content/res/values-mcc111-mnc222/configVarying.xml
similarity index 100%
rename from tests/res/values-mcc111-mnc222/configVarying.xml
rename to tests/tests/content/res/values-mcc111-mnc222/configVarying.xml
diff --git a/tests/res/values-mcc111-xx-rYY/configVarying.xml b/tests/tests/content/res/values-mcc111-xx-rYY/configVarying.xml
similarity index 100%
rename from tests/res/values-mcc111-xx-rYY/configVarying.xml
rename to tests/tests/content/res/values-mcc111-xx-rYY/configVarying.xml
diff --git a/tests/res/values-mcc111-xx/configVarying.xml b/tests/tests/content/res/values-mcc111-xx/configVarying.xml
similarity index 100%
rename from tests/res/values-mcc111-xx/configVarying.xml
rename to tests/tests/content/res/values-mcc111-xx/configVarying.xml
diff --git a/tests/res/values-mcc111/configVarying.xml b/tests/tests/content/res/values-mcc111/configVarying.xml
similarity index 100%
rename from tests/res/values-mcc111/configVarying.xml
rename to tests/tests/content/res/values-mcc111/configVarying.xml
diff --git a/tests/res/values-mcc112/configVarying.xml b/tests/tests/content/res/values-mcc112/configVarying.xml
similarity index 100%
rename from tests/res/values-mcc112/configVarying.xml
rename to tests/tests/content/res/values-mcc112/configVarying.xml
diff --git a/tests/res/values-mnc220-xx/configVarying.xml b/tests/tests/content/res/values-mnc220-xx/configVarying.xml
similarity index 100%
rename from tests/res/values-mnc220-xx/configVarying.xml
rename to tests/tests/content/res/values-mnc220-xx/configVarying.xml
diff --git a/tests/res/values-mnc222-32dpi/configVarying.xml b/tests/tests/content/res/values-mnc222-32dpi/configVarying.xml
similarity index 100%
rename from tests/res/values-mnc222-32dpi/configVarying.xml
rename to tests/tests/content/res/values-mnc222-32dpi/configVarying.xml
diff --git a/tests/res/values-mnc222-square/configVarying.xml b/tests/tests/content/res/values-mnc222-square/configVarying.xml
similarity index 100%
rename from tests/res/values-mnc222-square/configVarying.xml
rename to tests/tests/content/res/values-mnc222-square/configVarying.xml
diff --git a/tests/res/values-mnc222-xx/configVarying.xml b/tests/tests/content/res/values-mnc222-xx/configVarying.xml
similarity index 100%
rename from tests/res/values-mnc222-xx/configVarying.xml
rename to tests/tests/content/res/values-mnc222-xx/configVarying.xml
diff --git a/tests/res/values-mnc222/configVarying.xml b/tests/tests/content/res/values-mnc222/configVarying.xml
similarity index 100%
rename from tests/res/values-mnc222/configVarying.xml
rename to tests/tests/content/res/values-mnc222/configVarying.xml
diff --git a/tests/res/values-mnc223/configVarying.xml b/tests/tests/content/res/values-mnc223/configVarying.xml
similarity index 100%
rename from tests/res/values-mnc223/configVarying.xml
rename to tests/tests/content/res/values-mnc223/configVarying.xml
diff --git a/tests/res/values-nokeys/configVarying.xml b/tests/tests/content/res/values-nokeys/configVarying.xml
similarity index 100%
rename from tests/res/values-nokeys/configVarying.xml
rename to tests/tests/content/res/values-nokeys/configVarying.xml
diff --git a/tests/res/values-nonav/configVarying.xml b/tests/tests/content/res/values-nonav/configVarying.xml
similarity index 100%
rename from tests/res/values-nonav/configVarying.xml
rename to tests/tests/content/res/values-nonav/configVarying.xml
diff --git a/tests/res/values-normal/configVarying.xml b/tests/tests/content/res/values-normal/configVarying.xml
similarity index 100%
rename from tests/res/values-normal/configVarying.xml
rename to tests/tests/content/res/values-normal/configVarying.xml
diff --git a/tests/res/values-notouch/configVarying.xml b/tests/tests/content/res/values-notouch/configVarying.xml
similarity index 100%
rename from tests/res/values-notouch/configVarying.xml
rename to tests/tests/content/res/values-notouch/configVarying.xml
diff --git a/tests/res/values-small/configVarying.xml b/tests/tests/content/res/values-small/configVarying.xml
similarity index 100%
rename from tests/res/values-small/configVarying.xml
rename to tests/tests/content/res/values-small/configVarying.xml
diff --git a/tests/res/values-square-32dpi/configVarying.xml b/tests/tests/content/res/values-square-32dpi/configVarying.xml
similarity index 100%
rename from tests/res/values-square-32dpi/configVarying.xml
rename to tests/tests/content/res/values-square-32dpi/configVarying.xml
diff --git a/tests/res/values-square-stylus/configVarying.xml b/tests/tests/content/res/values-square-stylus/configVarying.xml
similarity index 100%
rename from tests/res/values-square-stylus/configVarying.xml
rename to tests/tests/content/res/values-square-stylus/configVarying.xml
diff --git a/tests/res/values-square/configVarying.xml b/tests/tests/content/res/values-square/configVarying.xml
similarity index 100%
rename from tests/res/values-square/configVarying.xml
rename to tests/tests/content/res/values-square/configVarying.xml
diff --git a/tests/res/values-stylus-12key/configVarying.xml b/tests/tests/content/res/values-stylus-12key/configVarying.xml
similarity index 100%
rename from tests/res/values-stylus-12key/configVarying.xml
rename to tests/tests/content/res/values-stylus-12key/configVarying.xml
diff --git a/tests/res/values-stylus-keysexposed/configVarying.xml b/tests/tests/content/res/values-stylus-keysexposed/configVarying.xml
similarity index 100%
rename from tests/res/values-stylus-keysexposed/configVarying.xml
rename to tests/tests/content/res/values-stylus-keysexposed/configVarying.xml
diff --git a/tests/res/values-stylus/configVarying.xml b/tests/tests/content/res/values-stylus/configVarying.xml
similarity index 100%
rename from tests/res/values-stylus/configVarying.xml
rename to tests/tests/content/res/values-stylus/configVarying.xml
diff --git a/tests/res/values-sw590dp-hdpi/configVarying.xml b/tests/tests/content/res/values-sw590dp-hdpi/configVarying.xml
similarity index 100%
rename from tests/res/values-sw590dp-hdpi/configVarying.xml
rename to tests/tests/content/res/values-sw590dp-hdpi/configVarying.xml
diff --git a/tests/res/values-sw590dp-mdpi/configVarying.xml b/tests/tests/content/res/values-sw590dp-mdpi/configVarying.xml
similarity index 100%
rename from tests/res/values-sw590dp-mdpi/configVarying.xml
rename to tests/tests/content/res/values-sw590dp-mdpi/configVarying.xml
diff --git a/tests/res/values-sw590dp-xhdpi/configVarying.xml b/tests/tests/content/res/values-sw590dp-xhdpi/configVarying.xml
similarity index 100%
rename from tests/res/values-sw590dp-xhdpi/configVarying.xml
rename to tests/tests/content/res/values-sw590dp-xhdpi/configVarying.xml
diff --git a/tests/res/values-sw590dp/configVarying.xml b/tests/tests/content/res/values-sw590dp/configVarying.xml
similarity index 100%
rename from tests/res/values-sw590dp/configVarying.xml
rename to tests/tests/content/res/values-sw590dp/configVarying.xml
diff --git a/tests/res/values-sw591dp-hdpi/configVarying.xml b/tests/tests/content/res/values-sw591dp-hdpi/configVarying.xml
similarity index 100%
rename from tests/res/values-sw591dp-hdpi/configVarying.xml
rename to tests/tests/content/res/values-sw591dp-hdpi/configVarying.xml
diff --git a/tests/res/values-sw591dp/configVarying.xml b/tests/tests/content/res/values-sw591dp/configVarying.xml
similarity index 100%
rename from tests/res/values-sw591dp/configVarying.xml
rename to tests/tests/content/res/values-sw591dp/configVarying.xml
diff --git a/tests/res/values-sw600dp-land/configVarying.xml b/tests/tests/content/res/values-sw600dp-land/configVarying.xml
similarity index 100%
rename from tests/res/values-sw600dp-land/configVarying.xml
rename to tests/tests/content/res/values-sw600dp-land/configVarying.xml
diff --git a/tests/res/values-sw600dp-land/dimens.xml b/tests/tests/content/res/values-sw600dp-land/dimens.xml
similarity index 100%
rename from tests/res/values-sw600dp-land/dimens.xml
rename to tests/tests/content/res/values-sw600dp-land/dimens.xml
diff --git a/tests/res/values-sw600dp/configVarying.xml b/tests/tests/content/res/values-sw600dp/configVarying.xml
similarity index 100%
rename from tests/res/values-sw600dp/configVarying.xml
rename to tests/tests/content/res/values-sw600dp/configVarying.xml
diff --git a/tests/res/values-sw600dp/dimens.xml b/tests/tests/content/res/values-sw600dp/dimens.xml
similarity index 100%
rename from tests/res/values-sw600dp/dimens.xml
rename to tests/tests/content/res/values-sw600dp/dimens.xml
diff --git a/tests/res/values-sw720dp/configVarying.xml b/tests/tests/content/res/values-sw720dp/configVarying.xml
similarity index 100%
rename from tests/res/values-sw720dp/configVarying.xml
rename to tests/tests/content/res/values-sw720dp/configVarying.xml
diff --git a/tests/res/values-tl-rPH/configVarying.xml b/tests/tests/content/res/values-tl-rPH/configVarying.xml
similarity index 100%
rename from tests/res/values-tl-rPH/configVarying.xml
rename to tests/tests/content/res/values-tl-rPH/configVarying.xml
diff --git a/tests/res/values-tl/configVarying.xml b/tests/tests/content/res/values-tl/configVarying.xml
similarity index 100%
rename from tests/res/values-tl/configVarying.xml
rename to tests/tests/content/res/values-tl/configVarying.xml
diff --git a/tests/res/values-v10/strings.xml b/tests/tests/content/res/values-v10/strings.xml
similarity index 100%
rename from tests/res/values-v10/strings.xml
rename to tests/tests/content/res/values-v10/strings.xml
diff --git a/tests/res/values-v11/strings.xml b/tests/tests/content/res/values-v11/strings.xml
similarity index 100%
rename from tests/res/values-v11/strings.xml
rename to tests/tests/content/res/values-v11/strings.xml
diff --git a/tests/res/values-v12/strings.xml b/tests/tests/content/res/values-v12/strings.xml
similarity index 100%
rename from tests/res/values-v12/strings.xml
rename to tests/tests/content/res/values-v12/strings.xml
diff --git a/tests/res/values-v13/strings.xml b/tests/tests/content/res/values-v13/strings.xml
similarity index 100%
rename from tests/res/values-v13/strings.xml
rename to tests/tests/content/res/values-v13/strings.xml
diff --git a/tests/res/values-v14/strings.xml b/tests/tests/content/res/values-v14/strings.xml
similarity index 100%
rename from tests/res/values-v14/strings.xml
rename to tests/tests/content/res/values-v14/strings.xml
diff --git a/tests/res/values-v15/strings.xml b/tests/tests/content/res/values-v15/strings.xml
similarity index 100%
rename from tests/res/values-v15/strings.xml
rename to tests/tests/content/res/values-v15/strings.xml
diff --git a/tests/res/values-v16/strings.xml b/tests/tests/content/res/values-v16/strings.xml
similarity index 100%
rename from tests/res/values-v16/strings.xml
rename to tests/tests/content/res/values-v16/strings.xml
diff --git a/tests/res/values-v17/strings.xml b/tests/tests/content/res/values-v17/strings.xml
similarity index 100%
rename from tests/res/values-v17/strings.xml
rename to tests/tests/content/res/values-v17/strings.xml
diff --git a/tests/res/values-v18/strings.xml b/tests/tests/content/res/values-v18/strings.xml
similarity index 100%
rename from tests/res/values-v18/strings.xml
rename to tests/tests/content/res/values-v18/strings.xml
diff --git a/tests/res/values-v19/strings.xml b/tests/tests/content/res/values-v19/strings.xml
similarity index 100%
rename from tests/res/values-v19/strings.xml
rename to tests/tests/content/res/values-v19/strings.xml
diff --git a/tests/res/values-v20/strings.xml b/tests/tests/content/res/values-v20/strings.xml
similarity index 100%
rename from tests/res/values-v20/strings.xml
rename to tests/tests/content/res/values-v20/strings.xml
diff --git a/tests/res/values-v21/strings.xml b/tests/tests/content/res/values-v21/strings.xml
similarity index 100%
rename from tests/res/values-v21/strings.xml
rename to tests/tests/content/res/values-v21/strings.xml
diff --git a/tests/res/values-v22/strings.xml b/tests/tests/content/res/values-v22/strings.xml
similarity index 100%
rename from tests/res/values-v22/strings.xml
rename to tests/tests/content/res/values-v22/strings.xml
diff --git a/tests/res/values-v3/strings.xml b/tests/tests/content/res/values-v3/strings.xml
similarity index 100%
rename from tests/res/values-v3/strings.xml
rename to tests/tests/content/res/values-v3/strings.xml
diff --git a/tests/res/values-v4/strings.xml b/tests/tests/content/res/values-v4/strings.xml
similarity index 100%
rename from tests/res/values-v4/strings.xml
rename to tests/tests/content/res/values-v4/strings.xml
diff --git a/tests/res/values-v5/strings.xml b/tests/tests/content/res/values-v5/strings.xml
similarity index 100%
rename from tests/res/values-v5/strings.xml
rename to tests/tests/content/res/values-v5/strings.xml
diff --git a/tests/res/values-v6/strings.xml b/tests/tests/content/res/values-v6/strings.xml
similarity index 100%
rename from tests/res/values-v6/strings.xml
rename to tests/tests/content/res/values-v6/strings.xml
diff --git a/tests/res/values-v7/strings.xml b/tests/tests/content/res/values-v7/strings.xml
similarity index 100%
rename from tests/res/values-v7/strings.xml
rename to tests/tests/content/res/values-v7/strings.xml
diff --git a/tests/res/values-v8/strings.xml b/tests/tests/content/res/values-v8/strings.xml
similarity index 100%
rename from tests/res/values-v8/strings.xml
rename to tests/tests/content/res/values-v8/strings.xml
diff --git a/tests/res/values-v9/strings.xml b/tests/tests/content/res/values-v9/strings.xml
similarity index 100%
rename from tests/res/values-v9/strings.xml
rename to tests/tests/content/res/values-v9/strings.xml
diff --git a/tests/res/values-w600dp-h550dp/configVarying.xml b/tests/tests/content/res/values-w600dp-h550dp/configVarying.xml
similarity index 100%
rename from tests/res/values-w600dp-h550dp/configVarying.xml
rename to tests/tests/content/res/values-w600dp-h550dp/configVarying.xml
diff --git a/tests/res/values-w600dp/configVarying.xml b/tests/tests/content/res/values-w600dp/configVarying.xml
similarity index 100%
rename from tests/res/values-w600dp/configVarying.xml
rename to tests/tests/content/res/values-w600dp/configVarying.xml
diff --git a/tests/res/values-w720dp-h670dp/configVarying.xml b/tests/tests/content/res/values-w720dp-h670dp/configVarying.xml
similarity index 100%
rename from tests/res/values-w720dp-h670dp/configVarying.xml
rename to tests/tests/content/res/values-w720dp-h670dp/configVarying.xml
diff --git a/tests/res/values-w720dp/configVarying.xml b/tests/tests/content/res/values-w720dp/configVarying.xml
similarity index 100%
rename from tests/res/values-w720dp/configVarying.xml
rename to tests/tests/content/res/values-w720dp/configVarying.xml
diff --git a/tests/res/values-wheel/configVarying.xml b/tests/tests/content/res/values-wheel/configVarying.xml
similarity index 100%
rename from tests/res/values-wheel/configVarying.xml
rename to tests/tests/content/res/values-wheel/configVarying.xml
diff --git a/tests/res/values-xlarge/configVarying.xml b/tests/tests/content/res/values-xlarge/configVarying.xml
similarity index 100%
rename from tests/res/values-xlarge/configVarying.xml
rename to tests/tests/content/res/values-xlarge/configVarying.xml
diff --git a/tests/res/values-xx-32dpi/configVarying.xml b/tests/tests/content/res/values-xx-32dpi/configVarying.xml
similarity index 100%
rename from tests/res/values-xx-32dpi/configVarying.xml
rename to tests/tests/content/res/values-xx-32dpi/configVarying.xml
diff --git a/tests/res/values-xx-rYY/configVarying.xml b/tests/tests/content/res/values-xx-rYY/configVarying.xml
similarity index 100%
rename from tests/res/values-xx-rYY/configVarying.xml
rename to tests/tests/content/res/values-xx-rYY/configVarying.xml
diff --git a/tests/res/values-xx-square/configVarying.xml b/tests/tests/content/res/values-xx-square/configVarying.xml
similarity index 100%
rename from tests/res/values-xx-square/configVarying.xml
rename to tests/tests/content/res/values-xx-square/configVarying.xml
diff --git a/tests/res/values-xx/configVarying.xml b/tests/tests/content/res/values-xx/configVarying.xml
similarity index 100%
rename from tests/res/values-xx/configVarying.xml
rename to tests/tests/content/res/values-xx/configVarying.xml
diff --git a/tests/tests/content/res/values/arrays.xml b/tests/tests/content/res/values/arrays.xml
new file mode 100644
index 0000000..71e0133
--- /dev/null
+++ b/tests/tests/content/res/values/arrays.xml
@@ -0,0 +1,57 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ * Copyright (C) 2008 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ -->
+
+<resources>
+    <item type="integer" name="reference" format="integer">101</item>
+
+      <string-array name="strings">
+        <item>zero</item>
+        <item>1</item>
+        <item>@string/reference</item>
+    </string-array>
+
+    <integer-array name="integers">
+        <item>0</item>
+        <item>1</item>
+        <item>@integer/reference</item>
+    </integer-array>
+
+    <array name="difficultyLevel">
+        <item>Easy</item>
+        <item>Medium</item>
+        <item>Hard</item>
+    </array>
+
+    <string-array name="string">
+        <item>Test String 1</item>
+        <item>Test String 2</item>
+        <item>Test String 3</item>
+    </string-array>
+
+    <integer-array name="table_row_layout">
+        <item>1</item>
+        <item>2</item>
+        <item>3</item>
+        <item>4</item>
+        <item>5</item>
+        <item>6</item>
+        <item>7</item>
+        <item>8</item>
+        <item>9</item>
+        <item>10</item>
+    </integer-array>
+</resources>
diff --git a/tests/tests/content/res/values/attrs.xml b/tests/tests/content/res/values/attrs.xml
new file mode 100644
index 0000000..4c3d9db
--- /dev/null
+++ b/tests/tests/content/res/values/attrs.xml
@@ -0,0 +1,145 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ * Copyright (C) 2008 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ -->
+
+<resources>
+    <declare-styleable name="Style1">
+        <attr name="Type1" format="integer">
+            <enum name="type" value="28" />
+            <enum name="data" value="0xff00ff00" />
+            <enum name="asset_cookie" value="0" />
+            <enum name="resource_id" value="0" />
+            <enum name="changing_config" value="0" />
+        </attr>
+        <attr name="Type2" format="integer">
+            <enum name="type" value="28" />
+            <enum name="data" value="0xff0000ff" />
+            <enum name="asset_cookie" value="0" />
+            <enum name="resource_id" value="0" />
+            <enum name="changing_config" value="0" />
+        </attr>
+    </declare-styleable>
+    <attr name="type1" format="boolean"/>
+    <attr name="type2" format="boolean"/>
+    <attr name="type3" format="color"/>
+    <attr name="type4" format="reference|color"/>
+    <attr name="type5" format="dimension"/>
+    <attr name="type6" format="dimension"/>
+    <attr name="type7" format="dimension"/>
+    <attr name="type8" format="reference"/>
+    <attr name="type9" format="float"/>
+    <attr name="type10" format="fraction"/>
+    <attr name="type11" format="integer"/>
+    <attr name="type12" format="integer"/>
+    <attr name="type13" format="reference|string"/>
+    <attr name="type14" format="string"/>
+    <attr name="type15" format="reference"/>
+    <attr name="type16" format="string"/>
+    <declare-styleable name="style1">
+        <attr name="type1"/>
+        <attr name="type2"/>
+        <attr name="type3"/>
+        <attr name="type4"/>
+        <attr name="type5"/>
+        <attr name="type6"/>
+        <attr name="type7"/>
+        <attr name="type8"/>
+        <attr name="type9"/>
+        <attr name="type10"/>
+        <attr name="type11"/>
+        <attr name="type12"/>
+        <attr name="type13"/>
+        <attr name="type14"/>
+        <attr name="type15"/>
+        <attr name="type16"/>
+    </declare-styleable>
+    <attr name="testEnum">
+        <enum name="val1" value="1" />
+        <enum name="val2" value="2" />
+        <enum name="val10" value="10" />
+    </attr>
+    <attr name="testFlags">
+        <flag name="bit1" value="0x1" />
+        <flag name="bit2" value="0x2" />
+        <flag name="bit31" value="0x40000000" />
+    </attr>
+    <attr name="testString" format="string" />
+    <declare-styleable name="EnumStyle">
+        <attr name="testEnum" />
+    </declare-styleable>
+    <declare-styleable name="FlagStyle">
+        <attr name="testFlags" />
+    </declare-styleable>
+    <declare-styleable name="TestConfig">
+        <attr name="testString" />
+    </declare-styleable>
+    <!-- Size of text. Recommended dimension type for text is "sp" for scaled-pixels (example: 15sp).
+         Supported values include the following:<p/>
+    <ul>
+        <li><b>px</b> Pixels</li>
+        <li><b>sp</b> Scaled pixels (scaled to relative pixel size on screen). See {@link android.util.DisplayMetrics} for more information.</li>
+        <li><b>pt</b> Points</li>
+        <li><b>dip</b> Device independent pixels. See {@link android.util.DisplayMetrics} for more information.</li>
+    </ul>
+    -->
+    <attr name="textSize" format="dimension" />
+    <attr name="typeface">
+        <enum name="normal" value="0" />
+        <enum name="sans" value="1" />
+        <enum name="serif" value="2" />
+        <enum name="monospace" value="3" />
+    </attr>
+    <!-- Default text typeface style. -->
+    <attr name="textStyle">
+        <flag name="normal" value="0" />
+        <flag name="bold" value="1" />
+        <flag name="italic" value="2" />
+    </attr>
+    <!-- Color of text (usually same as colorForeground). -->
+    <attr name="textColor" format="reference|color" />
+    <!-- Color of highlighted text. -->
+    <attr name="textColorHighlight" format="reference|color" />
+    <!-- Color of hint text (displayed when the field is empty). -->
+    <attr name="textColorHint" format="reference|color" />
+    <!-- Color of link text (URLs). -->
+    <attr name="textColorLink" format="reference|color" />
+    <declare-styleable name="TextAppearance">
+        <attr name="textColor"/>
+        <attr name="textSize"/>
+        <attr name="textStyle"/>
+        <attr name="typeface"/>
+        <attr name="textColorHighlight"/>
+        <attr name="textColorHint"/>
+        <attr name="textColorLink"/>
+    </declare-styleable>
+    <!-- Integer used to uniquely identify theme overrides. -->
+    <attr name="themeType" format="integer"/>
+    <!-- Theme reference used to override parent theme. -->
+    <attr name="themeOverrideAttr" format="reference"/>
+
+    <!-- Drawable theming attributes -->
+    <attr name="themeBoolean" />
+    <attr name="themeColor" />
+    <attr name="themeFloat" />
+    <attr name="themeInteger" />
+    <attr name="themeDimension" />
+    <attr name="themeDrawable" />
+    <attr name="themeBitmap" />
+    <attr name="themeNinePatch" />
+    <attr name="themeGravity" />
+    <attr name="themeTileMode" />
+    <attr name="themeAngle" />
+</resources>
diff --git a/tests/tests/content/res/values/bools.xml b/tests/tests/content/res/values/bools.xml
new file mode 100755
index 0000000..f119cda
--- /dev/null
+++ b/tests/tests/content/res/values/bools.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ * Copyright (C) 2008 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ -->
+
+<resources>
+	<bool name="trueRes">true</bool>
+	<bool name="falseRes">false</bool>
+</resources>
diff --git a/tests/tests/content/res/values/colors.xml b/tests/tests/content/res/values/colors.xml
new file mode 100644
index 0000000..f3cc325
--- /dev/null
+++ b/tests/tests/content/res/values/colors.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ * Copyright (C) 2008 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ -->
+
+<resources>
+    <drawable name="red">#7f00</drawable>
+    <drawable name="blue">#770000ff</drawable>
+    <drawable name="black">#77ffffff</drawable>
+    <drawable name="yellow">#77ffff00</drawable>
+    <color name="testcolor1">#ff00ff00</color>
+    <color name="testcolor2">#ffff0000</color>
+    <color name="failColor">#ff0000ff</color>
+</resources>
diff --git a/tests/tests/content/res/values/configVarying.xml b/tests/tests/content/res/values/configVarying.xml
new file mode 100755
index 0000000..7b7d576
--- /dev/null
+++ b/tests/tests/content/res/values/configVarying.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<resources>
+    <item type="configVarying" name="simple">simple default</item>
+    <bag type="configVarying" name="bag">
+        <item name="testString">bag default</item>
+    </bag>
+    <item type="configVarying" name="small">default</item>
+    <item type="configVarying" name="normal">default</item>
+    <item type="configVarying" name="large">default</item>
+    <item type="configVarying" name="xlarge">default</item>
+    <item type="configVarying" name="sw">default</item>
+    <item type="configVarying" name="w">default</item>
+    <item type="configVarying" name="h">default</item>
+    <item type="configVarying" name="wh">default</item>
+</resources>
diff --git a/tests/tests/content/res/values/dimens.xml b/tests/tests/content/res/values/dimens.xml
new file mode 100755
index 0000000..bae216f
--- /dev/null
+++ b/tests/tests/content/res/values/dimens.xml
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ * Copyright (C) 2008 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ -->
+
+<resources>
+    <item name="frac100perc" type="dimen" format="fraction">100%</item>
+    <item name="frac1perc" type="dimen" format="fraction">1%</item>
+    <item name="fracp1perc" type="dimen" format="fraction">.1%</item>
+    <item name="fracp01perc" type="dimen" format="fraction">.01%</item>
+    <item name="frac0perc" type="dimen" format="fraction">0%</item>
+    <item name="frac1p1perc" type="dimen" format="fraction">1.1%</item>
+    <item name="frac100p1perc" type="dimen" format="fraction">100.1%</item>
+    <item name="frac25510perc" type="dimen" format="fraction">25510%</item>
+    <item name="frac25610perc" type="dimen" format="fraction">25610%</item>
+    <item name="frac6553510perc" type="dimen" format="fraction">6553510%</item>
+    <item name="frac6553610perc" type="dimen" format="fraction">6553610%</item>
+
+    <item name="frac100pperc" type="dimen" format="fraction">100%p</item>
+    <item name="frac1pperc" type="dimen" format="fraction">1%p</item>
+    <item name="fracp1pperc" type="dimen" format="fraction">.1%p</item>
+    <item name="fracp01pperc" type="dimen" format="fraction">.01%p</item>
+    <item name="frac0pperc" type="dimen" format="fraction">0%p</item>
+    <item name="frac1p1pperc" type="dimen" format="fraction">1.1%p</item>
+    <item name="frac100p1pperc" type="dimen" format="fraction">100.1%p</item>
+    <item name="frac25510pperc" type="dimen" format="fraction">25510%p</item>
+    <item name="frac25610pperc" type="dimen" format="fraction">25610%p</item>
+    <item name="frac6553510pperc" type="dimen" format="fraction">6553510%p</item>
+    <item name="frac6553610pperc" type="dimen" format="fraction">6553610%p</item>
+</resources>
+
diff --git a/tests/tests/content/res/values/resources_test.xml b/tests/tests/content/res/values/resources_test.xml
new file mode 100644
index 0000000..91c2c4a
--- /dev/null
+++ b/tests/tests/content/res/values/resources_test.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2008 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<resources>
+     <!-- The width that is used when creating thumbnails of applications. -->
+     <dimen name="thumbnail_width">84dp</dimen>
+     <!-- The height that is used when creating thumbnails of applications. -->
+     <dimen name="thumbnail_height">63dp</dimen>
+     <!-- The standard size (both width and height) of an application icon that
+          will be displayed in the app launcher and elsewhere. -->
+     <dimen name="app_icon_size">48px</dimen>
+     <dimen name="toast_y_offset">64dip</dimen>
+     <plurals name="plurals_test">
+        <item quantity="one">A dog</item>
+        <item quantity="other">Some dogs</item>
+      </plurals>
+     <color name="resource_test_color">#003B3B3B</color>
+     <integer name="resource_test_int">10</integer>
+</resources>
diff --git a/tests/tests/content/res/values/strings.xml b/tests/tests/content/res/values/strings.xml
new file mode 100644
index 0000000..c167278
--- /dev/null
+++ b/tests/tests/content/res/values/strings.xml
@@ -0,0 +1,179 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2008 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="permlab_testGranted">Test Granted</string>
+    <string name="permdesc_testGranted">Used for running CTS tests, for testing operations
+        where we have the permission.</string>
+    <string name="permlab_testDynamic">Test Dynamic</string>
+    <string name="permdesc_testDynamic">Used for running CTS tests, for testing adding
+        dynamic permissions.</string>
+    <string name="permlab_testDenied">Test Denied</string>
+    <string name="permdesc_testDenied">Used for running CTS tests, for testing operations
+        where we do not have the permission.</string>
+    <string name="explain">1. click start. \n2. if above image shaked, then press pass button,
+         else press failed button.</string>
+    <string name="text_view_hello">Hello! Text view!</string>
+    <string name="text_view_hello_two_lines">Hello! \nText view!</string>
+    <string name="text_view_simple_hint">This is a hint.</string>
+    <string name="text_view_hint">This is a string for testing hint of textview.</string>
+    <string name="activity_forwarding">App/Forwarding</string>
+    <string name="forwarding">$$$</string>
+    <string name="go">Go</string>
+    <string name="back">Back</string>
+    <string name="forward_target">
+        Press back button and notice we don\'t see the previous activity.
+    </string>
+    <string name="edit_text">testing</string>
+    <string name="text">DialogTest</string>
+    <string name="text_country">Country</string>
+    <string name="text_name">Name</string>
+    <string name="hello_world">Hello, World!</string>
+    <string name="hello_android">Hello, Android!</string>
+    <string name="alert_dialog_username">Name:</string>
+    <string name="alert_dialog_password">Password:</string>
+    <string name="alert_dialog_positive">Positive</string>
+    <string name="alert_dialog_negative">Negative</string>
+    <string name="alert_dialog_neutral">Neutral</string>
+    <string name="notify">Notify </string>
+    <string name="tabs_1">testing</string>
+    <string name="table_layout_first">first</string>
+    <string name="table_layout_second">second</string>
+    <string name="table_layout_third">third</string>
+    <string name="table_layout_long">Very long to make the string out of the screen</string>
+    <string name="chronometer_text">Test Chronometer</string>
+    <string name="am">AM</string>
+    <string name="pm">PM</string>
+    <string name="viewgroup_test">ViewGroup test</string>
+    <string name="viewanimator_test">ViewAnimator test</string>
+    <string name="id_ok">OK</string>
+    <string name="id_cancel">Cancel</string>
+    <string name="context_test_string1">This is %s string.</string>
+    <string name="context_test_string2">This is test string.</string>
+    <string name="animationutils_test_instructions">Choose different animations</string>
+    <string name="animationutils_test_alpha">Alpha animation</string>
+    <string name="animationutils_test_scale">Scale animation</string>
+    <string name="animationutils_test_rotate">Rotate animation</string>
+    <string name="animationutils_test_translate">Translate animation</string>
+    <string name="animationutils_test_set">Animation set</string>
+    <string name="animationutils_test_layout">Layout animation</string>
+    <string name="animationutils_test_gridlayout">Grid layout animation</string>
+    <string name="twolinelistitem_test_text1">text1</string>
+    <string name="twolinelistitem_test_text2">text2</string>
+    <string name="metadata_text">metadata text</string>
+    <string name="horizontal_text_1">horizontal 1</string>
+    <string name="horizontal_text_2">horizontal 2</string>
+    <string name="horizontal_text_3">horizontal 3</string>
+    <string name="vertical_text_1">vertical 1</string>
+    <string name="vertical_text_2">vertical 2</string>
+    <string name="vertical_text_3">vertical 3</string>
+    <string name="reference">here</string>
+    <string name="coerceIntegerToString">100</string>
+    <string name="coerceBooleanToString">true</string>
+    <string name="coerceColorToString">#fff</string>
+    <string name="coerceFloatToString">100.0</string>
+    <string name="coerceDimensionToString">100px</string>
+    <string name="coerceFractionToString">100<xliff:g id="percent">%</xliff:g></string>
+    <string name="formattedStringNone">Format[]</string>
+    <string name="formattedStringOne">Format[<xliff:g id="format">%d</xliff:g>]</string>
+    <string name="formattedStringTwo">Format[<xliff:g id="format">%3$d,%2$s</xliff:g>]</string>
+    <string name="checkboxpref_key">checkboxpref_key</string>
+   <string name="checkboxpref_title">title of preference</string>
+   <string name="checkboxpref_summary">summary of preference</string>
+   <string name="checkboxpref_summary_on">summary on of preference</string>
+   <string name="checkboxpref_summary_off">summary off of preference</string>
+   <string name="checkboxpref_depend">checkboxpref_depend</string>
+   <string name="checkboxpref_depend_title"> depend title of preference</string>
+   <string name="checkboxpref_depend_summary"> depend summary of preference</string>
+   <string name="edittextpref_key">edittextpref_key</string>
+   <string name="edittextpref_default_value">default value of preference</string>
+   <string name="edittextpref_title">title of edit text preference</string>
+   <string name="edittextpref_summary">summary of edit text preference</string>
+   <string name="edittextpref_dialog_title">dialog title of edit text preference</string>
+   <string name="edittextpref_text">text of  edit text preference</string>
+   <string name="listpref_key">listpref_key</string>
+   <string name="listpref_title">title of list preference</string>
+   <string name="listpref_summary">summary of list preference</string>
+   <string name="listpref_dialogtitle">dialog title of list preference</string>
+   <string name="easy">Easy</string>
+   <string name="medium">Medium</string>
+   <string name="hard">Hard</string>
+   <string name="footer_view">Footer view</string>
+   <string name="header_view">Header view</string>
+   <string name="dialogpref_title">title of dialog preference </string>
+   <string name="dialogpref_dialog_title">dialog title of dialog preference </string>
+   <string name="dialogpref_key">dialogpref_key</string>
+   <string name="dialogpref_default_value">default value of dialog preference</string>
+   <string name="dialogpref_summary">summary of dialog preference</string>
+   <string name="dialogpref_message">message of dialog preference</string>
+   <string name="dialogpref_sure">Sure</string>
+   <string name="dialogpref_cancel">Cancel</string>
+   <string name="pref_key">pref_key</string>
+   <string name="pref_title">title of preference</string>
+   <string name="pref_summary">summary of preference</string>
+   <string name="pref_depend_key">pref_depend_key</string>
+   <string name="pref_depend_title"> depend title of preference</string>
+   <string name="pref_depend_summary"> depend summary of preference</string>
+   <string name="android_intent_action_preference">android.intent.action.PREFERENCE</string>
+   <string name="def_pref_key">def_pref_key</string>
+   <string name="def_pref_title">default preference</string>
+   <string name="def_pref_summary">This is default preference of cts</string>
+   <string name="relative_view1">view 1</string>
+   <string name="relative_view2">view 2</string>
+   <string name="relative_view3">view 3</string>
+   <string name="relative_view4">view 4</string>
+   <string name="relative_view5">view 5</string>
+   <string name="relative_view6">view 6</string>
+   <string name="relative_view7">view 7</string>
+   <string name="relative_view8">view 8</string>
+   <string name="relative_view9">view 9</string>
+   <string name="relative_view10">view 10</string>
+   <string name="relative_view11">view 11</string>
+   <string name="relative_view12">view 12</string>
+   <string name="relative_view13">view 13</string>
+   <string name="country">Country:</string>
+   <string name="symbol">Symbol:</string>
+   <string name="country_warning">No such country registered</string>
+   <string name="version_cur">base</string>
+   <string name="version_old">base</string>
+   <string name="version_v3">base</string>
+   <string name="authenticator_label">Android CTS</string>
+   <string name="search_label">Android CTS</string>
+   <string name="tag1">tag 1</string>
+   <string name="tag2">tag 2</string>
+
+   <string name="button">Button</string>
+   <string name="holo_test">Holo Test</string>
+   <string name="holo_generator">Holo Generator</string>
+   <string name="holo_light_test">Holo Light Test</string>
+   <string name="holo_light_generator">Holo Light Generator</string>
+   <string name="reference_image">Reference Image: </string>
+   <string name="generated_image">Generated Image: </string>
+   <string name="themes_prompt">Select a Theme:</string>
+   <string name="sample_text">Sample text goes here. I wanted something creative and whimsical
+but then I just got bored...</string>
+    <string name="long_text">This is a really long string which exceeds the width of the view.
+New devices have a much larger screen which actually enables long strings to be displayed
+with no fading. I have made this string longer to fix this case. If you are correcting this
+text, I would love to see the kind of devices you guys now use! Guys, maybe some devices need longer string!
+I think so, so how about double this string, like copy and paste!
+This is a really long string which exceeds the width of the view.
+New devices have a much larger screen which actually enables long strings to be displayed
+with no fading. I have made this string longer to fix this case. If you are correcting this
+text, I would love to see the kind of devices you guys now use! Guys, maybe some devices need longer string!
+I think so, so how about double this string, like copy and paste! </string>
+    <string name="rectangle200">"M 0,0 l 200,0 l 0, 200 l -200, 0 z"</string>
+</resources>
diff --git a/tests/tests/content/res/values/styles.xml b/tests/tests/content/res/values/styles.xml
new file mode 100644
index 0000000..20c80f8
--- /dev/null
+++ b/tests/tests/content/res/values/styles.xml
@@ -0,0 +1,172 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2008 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android">
+
+    <style name="Whatever">
+        <item name="type1">true</item>
+        <item name="type2">false</item>
+        <item name="type3">#ff0000ff</item>
+        <item name="type4">#ff00ff00</item>
+        <item name="type5">0.75px</item>
+        <item name="type6">10px</item>
+        <item name="type7">18px</item>
+        <item name="type8">@drawable/pass</item>
+        <item name="type9">3.14</item>
+        <item name="type10">100%</item>
+        <item name="type11">365</item>
+        <item name="type12">86400</item>
+        <item name="type13">@string/hello_android</item>
+        <item name="type14">TypedArray Test!</item>
+        <item name="type15">@array/difficultyLevel</item>
+        <item name="type16">Typed Value!</item>
+    </style>
+
+    <style name="TextViewWithoutColorAndAppearance">
+        <item name="android:textSize">18sp</item>
+    </style>
+
+    <style name="TextViewWithColorButWithOutAppearance">
+        <item name="android:textColor">#ff0000ff</item>
+    </style>
+
+    <style name="TextViewWithColorAndAppearance">
+        <item name="android:textColor">#ff0000ff</item>
+        <item name="android:textAppearance">@style/TextAppearance.WithColor</item>
+    </style>
+
+    <style name="TextViewWithoutColorButWithAppearance">
+        <item name="android:textAppearance">@style/TextAppearance.WithColor</item>
+    </style>
+
+    <style name="TextAppearance" parent="android:TextAppearance">
+    </style>
+
+    <style name="TextAppearance.WithColor">
+        <item name="android:textColor">#ffff0000</item>
+    </style>
+
+    <style name="TextAppearance.All">
+        <item name="android:textColor">@drawable/black</item>
+        <item name="android:textSize">20px</item>
+        <item name="android:textStyle">bold</item>
+        <item name="android:textColorHint">@drawable/red</item>
+        <item name="android:textColorLink">@drawable/blue</item>
+        <item name="android:textColorHighlight">@drawable/yellow</item>
+    </style>
+
+    <style name="TextAppearance.Colors">
+        <item name="android:textColor">@drawable/black</item>
+        <item name="android:textColorHint">@drawable/blue</item>
+        <item name="android:textColorLink">@drawable/yellow</item>
+        <item name="android:textColorHighlight">@drawable/red</item>
+    </style>
+
+    <style name="TextAppearance.NotColors">
+        <item name="android:textSize">17px</item>
+        <item name="android:typeface">sans</item>
+        <item name="android:textStyle">normal</item>
+    </style>
+
+    <style name="TextAppearance.Style">
+        <item name="android:textStyle">normal</item>
+    </style>
+
+    <style name="TestEnum1">
+        <item name="testEnum">val1</item>
+    </style>
+
+    <style name="TestEnum2">
+        <item name="testEnum">val2</item>
+    </style>
+
+    <style name="TestEnum10">
+        <item name="testEnum">val10</item>
+    </style>
+
+    <style name="TestFlag1">
+        <item name="testFlags">bit1</item>
+    </style>
+
+    <style name="TestFlag2">
+        <item name="testFlags">bit2</item>
+    </style>
+
+    <style name="TestFlag31">
+        <item name="testFlags">bit31</item>
+    </style>
+
+    <style name="TestFlag1And2">
+        <item name="testFlags">bit1|bit2</item>
+    </style>
+
+    <style name="TestFlag1And2And31">
+        <item name="testFlags">bit1|bit2|bit31</item>
+    </style>
+
+    <style name="TestEnum1.EmptyInherit" />
+
+    <style name="Theme_AlertDialog">
+        <item name="android:textSize">18sp</item>
+    </style>
+
+    <style name="TestProgressBar">
+        <item name="android:indeterminateOnly">false</item>
+        <item name="android:progressDrawable">?android:drawable/progress_horizontal</item>
+        <item name="android:indeterminateDrawable">?android:drawable/progress_horizontal</item>
+        <item name="android:minHeight">20dip</item>
+        <item name="android:maxHeight">20dip</item>
+        <item name="android:focusable">true</item>
+    </style>
+
+    <style name="Test_Theme">
+        <item name="android:windowNoTitle">true</item>
+        <item name="android:panelColorForeground">#ff000000</item>
+        <item name="android:panelColorBackground">#ffffffff</item>
+    </style>
+
+    <style name="Theme_OverrideOuter">
+        <item name="themeType">1</item>
+    </style>
+
+    <style name="Theme_OverrideInner">
+        <item name="themeType">2</item>
+        <item name="themeOverrideAttr">@style/Theme_OverrideAttr</item>
+    </style>
+
+    <style name="Theme_OverrideAttr">
+        <item name="themeType">3</item>
+    </style>
+    
+    <style name="Theme_ThemedDrawableTest">
+        <item name="themeBoolean">true</item>
+        <item name="themeColor">@android:color/black</item>
+        <item name="themeFloat">1.0</item>
+        <item name="themeAngle">45.0</item>
+        <item name="themeInteger">1</item>
+        <item name="themeDimension">1px</item>
+        <item name="themeDrawable">@drawable/icon_black</item>
+        <item name="themeBitmap">@drawable/icon_black</item>
+        <item name="themeNinePatch">@drawable/ninepatch_0</item>
+        <item name="themeGravity">48</item>
+        <item name="themeTileMode">2</item>
+    </style>
+
+    <style name="Theme_NoSwipeDismiss">
+        <item name="android:windowSwipeToDismiss">false</item>
+    </style>
+
+</resources>
diff --git a/tests/tests/content/res/xml/alias.xml b/tests/tests/content/res/xml/alias.xml
new file mode 100644
index 0000000..f88f3dc
--- /dev/null
+++ b/tests/tests/content/res/xml/alias.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+ * Copyright (C) 2008 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+-->
+
+<alias xmlns:android="http://schemas.android.com/apk/res/android">
+    <intent android:action="android.intent.action.MAIN"
+        android:targetPackage="com.android.cts.stub"
+        android:targetClass="android.app.cts.ChildActivity"
+        android:data="http://www.google.com/">
+    </intent>
+</alias>
+
diff --git a/tests/tests/content/res/xml/authenticator.xml b/tests/tests/content/res/xml/authenticator.xml
new file mode 100644
index 0000000..1e298b1
--- /dev/null
+++ b/tests/tests/content/res/xml/authenticator.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/**
+ * Copyright (c) 2009, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+-->
+
+<!-- The attributes in this XML file provide configuration information -->
+<!-- for the Account Manager. -->
+
+<account-authenticator xmlns:android="http://schemas.android.com/apk/res/android"
+    android:accountType="android.content.cts.account.type"
+    android:icon="@drawable/ic_cts_selected"
+    android:smallIcon="@drawable/ic_cts_minitab_selected"
+    android:label="@string/authenticator_label"
+/>
\ No newline at end of file
diff --git a/tests/tests/content/res/xml/colors.xml b/tests/tests/content/res/xml/colors.xml
new file mode 100644
index 0000000..8c44a66
--- /dev/null
+++ b/tests/tests/content/res/xml/colors.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+ * Copyright (C) 2008 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+-->
+<resources>
+    <color name="testcolor1">#ff00ff00</color>
+    <color name="testcolor2">#ffff0000</color>
+    <color name="failColor">#ff0000ff</color>
+</resources>
+
diff --git a/tests/tests/content/res/xml/extra.xml b/tests/tests/content/res/xml/extra.xml
new file mode 100755
index 0000000..b3bffb4
--- /dev/null
+++ b/tests/tests/content/res/xml/extra.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ * Copyright (C) 2008 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ -->
+<tag xmlns:android="http://schemas.android.com/apk/res/android" android:name="Bruce" android:value="Lee">
+    <extra android:name="google" android:value="android">
+    </extra>
+</tag>
diff --git a/tests/tests/content/res/xml/intentfilter.xml b/tests/tests/content/res/xml/intentfilter.xml
new file mode 100644
index 0000000..7ed3a53
--- /dev/null
+++ b/tests/tests/content/res/xml/intentfilter.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+ * Copyright (C) 2008 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+-->
+<intent-filter xmlns="http://schemas.android.com/apk/res/android">
+    <action name="testAction"/>
+    <cat name="testCategory" />
+    <type name="vnd.android.cursor.dir/person"/>
+    <scheme name="testScheme"/>
+    <auth host="testHost" port="80"/>
+    <path name="testPath" literal="test"/>
+    <path name="testPath" prefix="test"/>
+    <path name="testPath" sglob="test"/>
+</intent-filter>
diff --git a/tests/tests/content/res/xml/pm_test.xml b/tests/tests/content/res/xml/pm_test.xml
new file mode 100644
index 0000000..4db24cf
--- /dev/null
+++ b/tests/tests/content/res/xml/pm_test.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ * Copyright (C) 2008 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ -->
+ <!-- This xml is just test for PackageManager Test -->
+<resources>
+</resources>
diff --git a/tests/tests/content/res/xml/syncadapter.xml b/tests/tests/content/res/xml/syncadapter.xml
new file mode 100644
index 0000000..1c0bb72
--- /dev/null
+++ b/tests/tests/content/res/xml/syncadapter.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/**
+ * Copyright (c) 2009, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+-->
+
+<!-- The attributes in this XML file provide configuration information -->
+<!-- for the SyncAdapter. -->
+
+<sync-adapter xmlns:android="http://schemas.android.com/apk/res/android"
+    android:contentAuthority="android.content.cts.authority"
+    android:accountType="android.content.cts.account.type"
+/>
diff --git a/tests/tests/content/res/xml/test_color.xml b/tests/tests/content/res/xml/test_color.xml
new file mode 100644
index 0000000..97f7dec
--- /dev/null
+++ b/tests/tests/content/res/xml/test_color.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2008 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+        android:versionName="testNonResourcesString">
+    <color name="testcolor1">#ff00ff00</color>
+    <color name="testcolor2">#ffff0000</color>
+    <color name="failColor">#ff0000ff</color>
+</resources>
diff --git a/tests/tests/content/src/android/content/cts/AvailableIntentsActivity.java b/tests/tests/content/src/android/content/cts/AvailableIntentsActivity.java
new file mode 100644
index 0000000..773defc
--- /dev/null
+++ b/tests/tests/content/src/android/content/cts/AvailableIntentsActivity.java
@@ -0,0 +1,34 @@
+/*
+ * Copyright (C) 2008 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.content.cts;
+
+import com.android.cts.content.R;
+
+import android.app.Activity;
+import android.os.Bundle;
+
+/**
+ * This is a stub activity for test available intents. We do not care about
+ * what it layouts. We only need an activity even if it's empty for this test.
+ */
+public class AvailableIntentsActivity extends Activity {
+    @Override
+    public void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.available_intents_layout);
+    }
+}
diff --git a/tests/tests/content/src/android/content/cts/BroadcastReceiverTest.java b/tests/tests/content/src/android/content/cts/BroadcastReceiverTest.java
index 2865f9e..526087b 100644
--- a/tests/tests/content/src/android/content/cts/BroadcastReceiverTest.java
+++ b/tests/tests/content/src/android/content/cts/BroadcastReceiverTest.java
@@ -18,8 +18,6 @@
 
 
 import android.app.Service;
-import android.app.cts.MockActivity;
-import android.app.cts.MockService;
 import android.content.BroadcastReceiver;
 import android.content.ComponentName;
 import android.content.Context;
@@ -52,7 +50,7 @@
     private static final long START_SERVICE_TIMEOUT  = 3000;
 
     public BroadcastReceiverTest() {
-        super("com.android.cts.stub", MockActivity.class);
+        super("com.android.cts.content", MockActivity.class);
     }
 
     @Override
diff --git a/tests/src/android/content/cts/ClipboardManagerListenerActivity.java b/tests/tests/content/src/android/content/cts/ClipboardManagerListenerActivity.java
similarity index 100%
rename from tests/src/android/content/cts/ClipboardManagerListenerActivity.java
rename to tests/tests/content/src/android/content/cts/ClipboardManagerListenerActivity.java
diff --git a/tests/tests/content/src/android/content/cts/ComponentNameTest.java b/tests/tests/content/src/android/content/cts/ComponentNameTest.java
index d14a95b..6277bd6 100644
--- a/tests/tests/content/src/android/content/cts/ComponentNameTest.java
+++ b/tests/tests/content/src/android/content/cts/ComponentNameTest.java
@@ -85,7 +85,7 @@
     }
 
     public void testFlattenToString() {
-        assertEquals("com.android.cts.stub/android.content.cts.ComponentNameTest",
+        assertEquals("com.android.cts.content/android.content.cts.ComponentNameTest",
                 getComponentName().flattenToString());
     }
 
@@ -121,7 +121,7 @@
 
     public void testGetPackageName() {
         final String actual = getComponentName().getPackageName();
-        assertEquals("com.android.cts.stub", actual);
+        assertEquals("com.android.cts.content", actual);
     }
 
     public void testUnflattenFromString() {
@@ -135,7 +135,7 @@
     public void testFlattenToShortString() {
         // Test normal
         String actual = getComponentName().flattenToShortString();
-        assertEquals("com.android.cts.stub/android.content.cts.ComponentNameTest", actual);
+        assertEquals("com.android.cts.content/android.content.cts.ComponentNameTest", actual);
 
         // Test long class name
         final ComponentName componentName = new ComponentName("com.android.view",
@@ -168,7 +168,7 @@
     public void testToShortString() {
         // Test normal string
         final String shortString = getComponentName().toShortString();
-        assertEquals("{com.android.cts.stub/android.content.cts.ComponentNameTest}", shortString);
+        assertEquals("{com.android.cts.content/android.content.cts.ComponentNameTest}", shortString);
     }
 
     public void testGetClassName() {
@@ -196,7 +196,7 @@
         ComponentName.writeToParcel(componentName, parcel);
         parcel.setDataPosition(0);
         assertFalse(0 == parcel.dataAvail());
-        assertEquals("com.android.cts.stub", parcel.readString());
+        assertEquals("com.android.cts.content", parcel.readString());
         assertEquals("android.content.cts.ComponentNameTest", parcel.readString());
 
         // Test null data
diff --git a/tests/tests/content/src/android/content/cts/ContentProviderTest.java b/tests/tests/content/src/android/content/cts/ContentProviderTest.java
index 5ced37c..0b4d9aa 100644
--- a/tests/tests/content/src/android/content/cts/ContentProviderTest.java
+++ b/tests/tests/content/src/android/content/cts/ContentProviderTest.java
@@ -27,7 +27,7 @@
 import android.os.ParcelFileDescriptor;
 import android.test.AndroidTestCase;
 
-import com.android.cts.stub.R;
+import com.android.cts.content.R;
 
 import java.io.File;
 import java.io.FileNotFoundException;
@@ -37,7 +37,7 @@
  * Test {@link ContentProvider}.
  */
 public class ContentProviderTest extends AndroidTestCase {
-    private static final String TEST_PACKAGE_NAME = "com.android.cts.stub";
+    private static final String TEST_PACKAGE_NAME = "com.android.cts.content";
     private static final String TEST_FILE_NAME = "testFile.tmp";
     private static final String TEST_DB_NAME = "test.db";
 
diff --git a/tests/tests/content/src/android/content/cts/ContentResolverTest.java b/tests/tests/content/src/android/content/cts/ContentResolverTest.java
index 47371cc..4176da3 100644
--- a/tests/tests/content/src/android/content/cts/ContentResolverTest.java
+++ b/tests/tests/content/src/android/content/cts/ContentResolverTest.java
@@ -16,7 +16,7 @@
 
 package android.content.cts;
 
-import com.android.cts.stub.R;
+import com.android.cts.content.R;
 
 
 import android.accounts.Account;
@@ -75,7 +75,7 @@
     private static final int VALUE2 = 2;
     private static final int VALUE3 = 3;
 
-    private static final String TEST_PACKAGE_NAME = "com.android.cts.stub";
+    private static final String TEST_PACKAGE_NAME = "com.android.cts.content";
 
     private Context mContext;
     private ContentResolver mContentResolver;
diff --git a/tests/tests/content/src/android/content/cts/ContextTest.java b/tests/tests/content/src/android/content/cts/ContextTest.java
index 70abe1f..7c5dc50 100644
--- a/tests/tests/content/src/android/content/cts/ContextTest.java
+++ b/tests/tests/content/src/android/content/cts/ContextTest.java
@@ -16,7 +16,7 @@
 
 package android.content.cts;
 
-import com.android.cts.stub.R;
+import com.android.cts.content.R;
 import com.android.internal.util.XmlUtils;
 
 
diff --git a/tests/tests/content/src/android/content/cts/ContextWrapperCtsActivity.java b/tests/tests/content/src/android/content/cts/ContextWrapperCtsActivity.java
new file mode 100644
index 0000000..9ff4df9
--- /dev/null
+++ b/tests/tests/content/src/android/content/cts/ContextWrapperCtsActivity.java
@@ -0,0 +1,34 @@
+/*
+ * Copyright (C) 2008 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.content.cts;
+
+// Need the following import to get access to the app resources, since this
+// class is in a sub-package.
+import android.app.Activity;
+import android.os.Bundle;
+
+import com.android.cts.content.R;
+
+public class ContextWrapperCtsActivity extends Activity {
+    @Override
+    public void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+
+        setContentView(R.layout.local_sample);
+    }
+}
+
diff --git a/tests/tests/content/src/android/content/cts/ContextWrapperTest.java b/tests/tests/content/src/android/content/cts/ContextWrapperTest.java
index 59fae2f..e7b6ed7 100644
--- a/tests/tests/content/src/android/content/cts/ContextWrapperTest.java
+++ b/tests/tests/content/src/android/content/cts/ContextWrapperTest.java
@@ -16,7 +16,7 @@
 
 package android.content.cts;
 
-import com.android.cts.stub.R;
+import com.android.cts.content.R;
 
 
 import android.content.ActivityNotFoundException;
@@ -79,8 +79,8 @@
     private final static String MOCK_ACTION1 = ACTION_BROADCAST_TESTORDER + "1";
     private final static String MOCK_ACTION2 = ACTION_BROADCAST_TESTORDER + "2";
 
-    public static final String PERMISSION_GRANTED = "android.app.cts.permission.TEST_GRANTED";
-    public static final String PERMISSION_DENIED = "android.app.cts.permission.TEST_DENIED";
+    public static final String PERMISSION_GRANTED = "android.content.cts.permission.TEST_GRANTED";
+    public static final String PERMISSION_DENIED = "android.content.cts.permission.TEST_DENIED";
 
     private static final int BROADCAST_TIMEOUT = 10000;
 
@@ -402,7 +402,7 @@
     }
 
     public void testStartActivity() {
-        Intent intent = new Intent(mContext, ContextWrapperStubActivity.class);
+        Intent intent = new Intent(mContext, ContextWrapperCtsActivity.class);
         intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
         try {
             mContextWrapper.startActivity(intent);
@@ -474,7 +474,7 @@
     }
 
     public void testGetPackageName() {
-        assertEquals("com.android.cts.stub", mContextWrapper.getPackageName());
+        assertEquals("com.android.cts.content", mContextWrapper.getPackageName());
     }
 
     public void testGetCacheDir() {
diff --git a/tests/src/android/content/cts/DummyProvider.java b/tests/tests/content/src/android/content/cts/DummyProvider.java
similarity index 100%
rename from tests/src/android/content/cts/DummyProvider.java
rename to tests/tests/content/src/android/content/cts/DummyProvider.java
diff --git a/tests/src/android/content/cts/HighPriorityBroadcastReceiver.java b/tests/tests/content/src/android/content/cts/HighPriorityBroadcastReceiver.java
similarity index 100%
rename from tests/src/android/content/cts/HighPriorityBroadcastReceiver.java
rename to tests/tests/content/src/android/content/cts/HighPriorityBroadcastReceiver.java
diff --git a/tests/tests/content/src/android/content/cts/IntentFilterTest.java b/tests/tests/content/src/android/content/cts/IntentFilterTest.java
index d067b9e..d0e70f2 100644
--- a/tests/tests/content/src/android/content/cts/IntentFilterTest.java
+++ b/tests/tests/content/src/android/content/cts/IntentFilterTest.java
@@ -33,7 +33,6 @@
 import org.xmlpull.v1.XmlPullParserException;
 import org.xmlpull.v1.XmlSerializer;
 
-import android.app.cts.MockActivity;
 import android.content.ComponentName;
 import android.content.ContentResolver;
 import android.content.Intent;
diff --git a/tests/tests/content/src/android/content/cts/IntentTest.java b/tests/tests/content/src/android/content/cts/IntentTest.java
index d7bf6f4..d4fac55 100644
--- a/tests/tests/content/src/android/content/cts/IntentTest.java
+++ b/tests/tests/content/src/android/content/cts/IntentTest.java
@@ -22,8 +22,6 @@
 import org.xmlpull.v1.XmlPullParser;
 import org.xmlpull.v1.XmlPullParserException;
 
-import android.app.cts.MockActivity;
-import android.app.cts.MockReceiver;
 import android.content.ComponentName;
 import android.content.ContentResolver;
 import android.content.Context;
@@ -730,18 +728,18 @@
         // Should only have one activity responding to narrow category
         final ComponentName target = intent.resolveActivity(mPm);
         assertEquals("com.android.cts.content", target.getPackageName());
-        assertEquals("android.app.cts.MockActivity", target.getClassName());
+        assertEquals("android.content.cts.MockActivity", target.getClassName());
     }
 
     public void testResolveActivityShortcutMatch() {
         final Intent intent = new Intent("com.android.cts.content.action.TEST_ACTION");
         intent.setComponent(
-                new ComponentName("com.android.cts.content", "android.app.cts.MockActivity2"));
+                new ComponentName("com.android.cts.content", "android.content.cts.MockActivity2"));
 
         // Multiple activities match, but we asked for explicit component
         final ComponentName target = intent.resolveActivity(mPm);
         assertEquals("com.android.cts.content", target.getPackageName());
-        assertEquals("android.app.cts.MockActivity2", target.getClassName());
+        assertEquals("android.content.cts.MockActivity2", target.getClassName());
     }
 
     public void testResolveActivityMultipleMatch() {
diff --git a/tests/tests/content/src/android/content/cts/Intent_ShortcutIconResourceTest.java b/tests/tests/content/src/android/content/cts/Intent_ShortcutIconResourceTest.java
index b38f3fc..062ef90 100644
--- a/tests/tests/content/src/android/content/cts/Intent_ShortcutIconResourceTest.java
+++ b/tests/tests/content/src/android/content/cts/Intent_ShortcutIconResourceTest.java
@@ -29,7 +29,7 @@
 
     ShortcutIconResource mShortcutIconResource;
     Context mContext;
-    final int resourceId = com.android.cts.stub.R.string.notify;
+    final int resourceId = com.android.cts.content.R.string.notify;
 
     @Override
     protected void setUp() throws Exception {
@@ -63,7 +63,7 @@
     public void testWriteToParcel() {
 
         mShortcutIconResource = ShortcutIconResource.fromContext(mContext,
-                com.android.cts.stub.R.string.notify);
+                com.android.cts.content.R.string.notify);
         assertNotNull(mShortcutIconResource);
         Parcel parce = Parcel.obtain();
         mShortcutIconResource.writeToParcel(parce, 1);
diff --git a/tests/src/android/content/cts/LowPriorityBroadcastReceiver.java b/tests/tests/content/src/android/content/cts/LowPriorityBroadcastReceiver.java
similarity index 100%
rename from tests/src/android/content/cts/LowPriorityBroadcastReceiver.java
rename to tests/tests/content/src/android/content/cts/LowPriorityBroadcastReceiver.java
diff --git a/tests/src/android/content/cts/MockAccountAuthenticator.java b/tests/tests/content/src/android/content/cts/MockAccountAuthenticator.java
similarity index 100%
rename from tests/src/android/content/cts/MockAccountAuthenticator.java
rename to tests/tests/content/src/android/content/cts/MockAccountAuthenticator.java
diff --git a/tests/src/android/content/cts/MockAccountService.java b/tests/tests/content/src/android/content/cts/MockAccountService.java
similarity index 100%
rename from tests/src/android/content/cts/MockAccountService.java
rename to tests/tests/content/src/android/content/cts/MockAccountService.java
diff --git a/tests/tests/content/src/android/content/cts/MockActivity.java b/tests/tests/content/src/android/content/cts/MockActivity.java
new file mode 100644
index 0000000..19834df
--- /dev/null
+++ b/tests/tests/content/src/android/content/cts/MockActivity.java
@@ -0,0 +1,23 @@
+/*
+ * Copyright (C) 2008 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.content.cts;
+
+import android.app.Activity;
+
+public class MockActivity extends Activity {
+
+}
diff --git a/tests/tests/content/src/android/content/cts/MockApplication.java b/tests/tests/content/src/android/content/cts/MockApplication.java
new file mode 100644
index 0000000..cca34d6
--- /dev/null
+++ b/tests/tests/content/src/android/content/cts/MockApplication.java
@@ -0,0 +1,59 @@
+/*
+ * Copyright (C) 2008 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.content.cts;
+
+import android.app.Application;
+import android.content.res.Configuration;
+
+
+public class MockApplication extends Application {
+
+    public boolean isOnCreateCalled;
+    public boolean isConstructorCalled;
+    public boolean isOnConfigurationChangedCalled;
+    public boolean isOnLowMemoryCalled;
+
+    public MockApplication() {
+        super();
+        isConstructorCalled = true;
+    }
+
+    @Override
+    public void onCreate() {
+        super.onCreate();
+        isOnCreateCalled = true;
+    }
+
+    @Override
+    public void onTerminate() {
+        super.onTerminate();
+        // The documentation states that one cannot rely on this method being called. No need to
+        // test it here.
+    }
+
+    @Override
+    public void onConfigurationChanged(Configuration newConfig) {
+        super.onConfigurationChanged(newConfig);
+        isOnConfigurationChangedCalled = true;
+    }
+
+    @Override
+    public void onLowMemory() {
+        super.onLowMemory();
+        isOnLowMemoryCalled = true;
+    }
+}
diff --git a/tests/src/android/content/cts/MockContentProvider.java b/tests/tests/content/src/android/content/cts/MockContentProvider.java
similarity index 100%
rename from tests/src/android/content/cts/MockContentProvider.java
rename to tests/tests/content/src/android/content/cts/MockContentProvider.java
diff --git a/tests/src/android/content/cts/MockContextWrapperService.java b/tests/tests/content/src/android/content/cts/MockContextWrapperService.java
similarity index 100%
rename from tests/src/android/content/cts/MockContextWrapperService.java
rename to tests/tests/content/src/android/content/cts/MockContextWrapperService.java
diff --git a/tests/src/android/content/cts/MockReceiver.java b/tests/tests/content/src/android/content/cts/MockReceiver.java
similarity index 100%
rename from tests/src/android/content/cts/MockReceiver.java
rename to tests/tests/content/src/android/content/cts/MockReceiver.java
diff --git a/tests/src/android/content/cts/MockReceiverAbort.java b/tests/tests/content/src/android/content/cts/MockReceiverAbort.java
similarity index 100%
rename from tests/src/android/content/cts/MockReceiverAbort.java
rename to tests/tests/content/src/android/content/cts/MockReceiverAbort.java
diff --git a/tests/src/android/content/cts/MockReceiverFirst.java b/tests/tests/content/src/android/content/cts/MockReceiverFirst.java
similarity index 100%
rename from tests/src/android/content/cts/MockReceiverFirst.java
rename to tests/tests/content/src/android/content/cts/MockReceiverFirst.java
diff --git a/tests/src/android/content/cts/MockRemoteContentProvider.java b/tests/tests/content/src/android/content/cts/MockRemoteContentProvider.java
similarity index 100%
rename from tests/src/android/content/cts/MockRemoteContentProvider.java
rename to tests/tests/content/src/android/content/cts/MockRemoteContentProvider.java
diff --git a/tests/src/android/content/cts/MockSRSProvider.java b/tests/tests/content/src/android/content/cts/MockSRSProvider.java
similarity index 100%
rename from tests/src/android/content/cts/MockSRSProvider.java
rename to tests/tests/content/src/android/content/cts/MockSRSProvider.java
diff --git a/tests/tests/content/src/android/content/cts/MockService.java b/tests/tests/content/src/android/content/cts/MockService.java
new file mode 100644
index 0000000..6726f8b
--- /dev/null
+++ b/tests/tests/content/src/android/content/cts/MockService.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright (C) 2008 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.content.cts;
+
+import android.app.Service;
+import android.content.Intent;
+import android.os.Binder;
+import android.os.IBinder;
+
+public class MockService extends Service {
+    public static boolean result = false;
+    private final IBinder mBinder = new MockBinder();
+
+    public class MockBinder extends Binder {
+        MockService getService() {
+            return MockService.this;
+        }
+    }
+
+    /**
+     * set the result as true when service bind
+     */
+    @Override
+    public IBinder onBind(Intent intent) {
+        result = true;
+        return mBinder;
+    }
+
+    /**
+     * set the result as true when service start
+     */
+    @Override
+    public void onStart(Intent intent, int startId) {
+        super.onStart(intent, startId);
+        result = true;
+    }
+}
+
diff --git a/tests/src/android/content/cts/MockSyncAdapter.java b/tests/tests/content/src/android/content/cts/MockSyncAdapter.java
similarity index 100%
rename from tests/src/android/content/cts/MockSyncAdapter.java
rename to tests/tests/content/src/android/content/cts/MockSyncAdapter.java
diff --git a/tests/src/android/content/cts/MockSyncAdapterService.java b/tests/tests/content/src/android/content/cts/MockSyncAdapterService.java
similarity index 100%
rename from tests/src/android/content/cts/MockSyncAdapterService.java
rename to tests/tests/content/src/android/content/cts/MockSyncAdapterService.java
diff --git a/tests/tests/content/src/android/content/cts/MutableContextWrapperTest.java b/tests/tests/content/src/android/content/cts/MutableContextWrapperTest.java
index b81ca71..aaba30c 100644
--- a/tests/tests/content/src/android/content/cts/MutableContextWrapperTest.java
+++ b/tests/tests/content/src/android/content/cts/MutableContextWrapperTest.java
@@ -16,7 +16,6 @@
 
 package android.content.cts;
 
-import android.app.cts.MockActivity;
 import android.content.Context;
 import android.content.MutableContextWrapper;
 import android.test.AndroidTestCase;
diff --git a/tests/src/android/content/cts/ResultReceiver.java b/tests/tests/content/src/android/content/cts/ResultReceiver.java
similarity index 100%
rename from tests/src/android/content/cts/ResultReceiver.java
rename to tests/tests/content/src/android/content/cts/ResultReceiver.java
diff --git a/tests/tests/content/src/android/content/cts/SharedPreferencesTest.java b/tests/tests/content/src/android/content/cts/SharedPreferencesTest.java
index 2354926..c271483 100644
--- a/tests/tests/content/src/android/content/cts/SharedPreferencesTest.java
+++ b/tests/tests/content/src/android/content/cts/SharedPreferencesTest.java
@@ -54,8 +54,8 @@
 
         // Duplicated from ContextImpl.java.  Not ideal, but there wasn't a better
         // way to reach into Context{Wrapper,Impl} to ask where this file lives.
-        mPrefsFile = new File("/data/data/com.android.cts.stub/shared_prefs",
-                              "com.android.cts.stub_preferences.xml");
+        mPrefsFile = new File("/data/data/com.android.cts.content/shared_prefs",
+                              "com.android.cts.content_preferences.xml");
         mPrefsFile.delete();
     }
 
diff --git a/tests/tests/content/src/android/content/pm/cts/ActivityInfoTest.java b/tests/tests/content/src/android/content/pm/cts/ActivityInfoTest.java
index 6c1ae40..caabdb4 100644
--- a/tests/tests/content/src/android/content/pm/cts/ActivityInfoTest.java
+++ b/tests/tests/content/src/android/content/pm/cts/ActivityInfoTest.java
@@ -17,7 +17,7 @@
 package android.content.pm.cts;
 
 
-import android.app.cts.MockActivity;
+import android.content.cts.MockActivity;
 import android.content.ComponentName;
 import android.content.pm.ActivityInfo;
 import android.content.pm.PackageManager;
diff --git a/tests/tests/content/src/android/content/pm/cts/ApplicationInfoTest.java b/tests/tests/content/src/android/content/pm/cts/ApplicationInfoTest.java
index 3055e57..1e9f5a2 100644
--- a/tests/tests/content/src/android/content/pm/cts/ApplicationInfoTest.java
+++ b/tests/tests/content/src/android/content/pm/cts/ApplicationInfoTest.java
@@ -16,7 +16,7 @@
 
 package android.content.pm.cts;
 
-import com.android.cts.stub.R;
+import com.android.cts.content.R;
 
 
 import android.content.pm.ApplicationInfo;
diff --git a/tests/tests/content/src/android/content/pm/cts/ApplicationInfo_DisplayNameComparatorTest.java b/tests/tests/content/src/android/content/pm/cts/ApplicationInfo_DisplayNameComparatorTest.java
index ebd75cc..211a2ca 100644
--- a/tests/tests/content/src/android/content/pm/cts/ApplicationInfo_DisplayNameComparatorTest.java
+++ b/tests/tests/content/src/android/content/pm/cts/ApplicationInfo_DisplayNameComparatorTest.java
@@ -26,7 +26,7 @@
  * Test {@link DisplayNameComparator}.
  */
 public class ApplicationInfo_DisplayNameComparatorTest extends AndroidTestCase {
-    private static final String PACKAGE_NAME = "com.android.cts.stub";
+    private static final String PACKAGE_NAME = "com.android.cts.content";
     DisplayNameComparator mDisplayNameComparator;
 
     @Override
diff --git a/tests/tests/content/src/android/content/pm/cts/ComponentInfoTest.java b/tests/tests/content/src/android/content/pm/cts/ComponentInfoTest.java
index 7850e1e..361bfe4 100644
--- a/tests/tests/content/src/android/content/pm/cts/ComponentInfoTest.java
+++ b/tests/tests/content/src/android/content/pm/cts/ComponentInfoTest.java
@@ -26,16 +26,15 @@
 import android.test.AndroidTestCase;
 import android.util.Printer;
 import android.util.StringBuilderPrinter;
-import android.widget.cts.WidgetTestUtils;
 
-import com.android.cts.stub.R;
+import com.android.cts.content.R;
 
 
 /**
  * Test {@link ComponentInfo}.
  */
 public class ComponentInfoTest extends AndroidTestCase {
-    private final String PACKAGE_NAME = "com.android.cts.stub";
+    private final String PACKAGE_NAME = "com.android.cts.content";
     private ComponentInfo mComponentInfo;
 
     public void testConstructor() {
diff --git a/tests/tests/content/src/android/content/pm/cts/InstrumentationInfoTest.java b/tests/tests/content/src/android/content/pm/cts/InstrumentationInfoTest.java
index 4656949..5b7747d 100644
--- a/tests/tests/content/src/android/content/pm/cts/InstrumentationInfoTest.java
+++ b/tests/tests/content/src/android/content/pm/cts/InstrumentationInfoTest.java
@@ -25,7 +25,7 @@
 import android.test.AndroidTestCase;
 
 public class InstrumentationInfoTest extends AndroidTestCase {
-    private static final String PACKAGE_NAME = "com.android.cts.stub";
+    private static final String PACKAGE_NAME = "com.android.cts.content";
     private static final String INSTRUMENTATION_NAME =
             "android.content.pm.cts.TestPmInstrumentation";
 
diff --git a/tests/tests/content/src/android/content/pm/cts/PackageInfoTest.java b/tests/tests/content/src/android/content/pm/cts/PackageInfoTest.java
index cefe1a6..0540e0b 100644
--- a/tests/tests/content/src/android/content/pm/cts/PackageInfoTest.java
+++ b/tests/tests/content/src/android/content/pm/cts/PackageInfoTest.java
@@ -32,7 +32,7 @@
     private PackageManager mPackageManager;
     private PackageInfo mPackageInfo;
     private PackageInfo mPackageInfoCmp;
-    private static final String PACKAGE_NAME = "com.android.cts.stub";
+    private static final String PACKAGE_NAME = "com.android.cts.content";
 
     @Override
     protected void setUp() throws Exception {
diff --git a/tests/tests/content/src/android/content/pm/cts/PackageItemInfoTest.java b/tests/tests/content/src/android/content/pm/cts/PackageItemInfoTest.java
index d3372c6..53e69da 100644
--- a/tests/tests/content/src/android/content/pm/cts/PackageItemInfoTest.java
+++ b/tests/tests/content/src/android/content/pm/cts/PackageItemInfoTest.java
@@ -16,7 +16,7 @@
 
 package android.content.pm.cts;
 
-import com.android.cts.stub.R;
+import com.android.cts.content.R;
 
 
 import android.content.ComponentName;
@@ -30,7 +30,7 @@
 import android.util.Printer;
 
 public class PackageItemInfoTest extends AndroidTestCase {
-    private static final String PACKAGE_NAME = "com.android.cts.stub";
+    private static final String PACKAGE_NAME = "com.android.cts.content";
     private static final String ACTIVITY_NAME = "android.content.pm.cts.TestPmActivity";
     private static final String METADATA_NAME = "android.content.pm.cts.xmltest";
     private PackageManager mPackageManager;
diff --git a/tests/tests/content/src/android/content/pm/cts/PackageItemInfo_DisplayNameComparatorTest.java b/tests/tests/content/src/android/content/pm/cts/PackageItemInfo_DisplayNameComparatorTest.java
index f332d6e..0cfd1dd 100644
--- a/tests/tests/content/src/android/content/pm/cts/PackageItemInfo_DisplayNameComparatorTest.java
+++ b/tests/tests/content/src/android/content/pm/cts/PackageItemInfo_DisplayNameComparatorTest.java
@@ -26,7 +26,7 @@
 import android.test.AndroidTestCase;
 
 public class PackageItemInfo_DisplayNameComparatorTest extends AndroidTestCase {
-    private static final String PACKAGE_NAME = "com.android.cts.stub";
+    private static final String PACKAGE_NAME = "com.android.cts.content";
     private static final String ACTIVITY_NAME = "android.content.pm.cts.TestPmActivity";
     private static final String CMPACTIVITY_NAME = "android.content.pm.cts.TestPmCompare";
 
diff --git a/tests/tests/content/src/android/content/pm/cts/PackageManagerTest.java b/tests/tests/content/src/android/content/pm/cts/PackageManagerTest.java
index d1e1252..aaab8c4 100644
--- a/tests/tests/content/src/android/content/pm/cts/PackageManagerTest.java
+++ b/tests/tests/content/src/android/content/pm/cts/PackageManagerTest.java
@@ -16,7 +16,7 @@
 
 package android.content.pm.cts;
 
-import com.android.cts.stub.R;
+import com.android.cts.content.R;
 
 
 import android.content.ComponentName;
@@ -44,7 +44,7 @@
  */
 public class PackageManagerTest extends AndroidTestCase {
     private PackageManager mPackageManager;
-    private static final String PACKAGE_NAME = "com.android.cts.stub";
+    private static final String PACKAGE_NAME = "com.android.cts.content";
     private static final String CONTENT_PKG_NAME = "com.android.cts.content";
     private static final String ACTIVITY_ACTION_NAME = "android.intent.action.PMTEST";
     private static final String MAIN_ACTION_NAME = "android.intent.action.MAIN";
@@ -395,7 +395,7 @@
 
     public void testOpPermission() {
         PermissionInfo permissionInfo = new PermissionInfo();
-        String permissionName = "com.android.cts.stub.permission.TEST_DYNAMIC.ADD";
+        String permissionName = "com.android.cts.content.permission.TEST_DYNAMIC.ADD";
         permissionInfo.name = permissionName;
         permissionInfo.labelRes = R.string.permlab_testDynamic;
         permissionInfo.nonLocalizedLabel = "Test Tree";
@@ -450,7 +450,7 @@
     public void testGetResources() throws NameNotFoundException {
         ComponentName componentName = new ComponentName(PACKAGE_NAME, ACTIVITY_NAME);
         int resourceId = R.xml.pm_test;
-        String xmlName = "com.android.cts.stub:xml/pm_test";
+        String xmlName = "com.android.cts.content:xml/pm_test";
         ApplicationInfo appInfo = mPackageManager.getApplicationInfo(PACKAGE_NAME, 0);
         assertNotNull(mPackageManager.getXml(PACKAGE_NAME, resourceId, appInfo));
         assertEquals(xmlName, mPackageManager.getResourcesForActivity(componentName)
diff --git a/tests/tests/content/src/android/content/pm/cts/PackageStatsTest.java b/tests/tests/content/src/android/content/pm/cts/PackageStatsTest.java
index dca51e9..6425209 100644
--- a/tests/tests/content/src/android/content/pm/cts/PackageStatsTest.java
+++ b/tests/tests/content/src/android/content/pm/cts/PackageStatsTest.java
@@ -22,7 +22,7 @@
 import android.test.AndroidTestCase;
 
 public class PackageStatsTest extends AndroidTestCase {
-    private static final String PACKAGE_NAME = "com.android.cts.stub";
+    private static final String PACKAGE_NAME = "com.android.cts.content";
 
     public void testPackageStats() {
         // Set mock data to make sure the functionality of constructor
diff --git a/tests/tests/content/src/android/content/pm/cts/ProviderInfoTest.java b/tests/tests/content/src/android/content/pm/cts/ProviderInfoTest.java
index c585568..6256a69 100644
--- a/tests/tests/content/src/android/content/pm/cts/ProviderInfoTest.java
+++ b/tests/tests/content/src/android/content/pm/cts/ProviderInfoTest.java
@@ -28,7 +28,7 @@
 import java.util.List;
 
 public class ProviderInfoTest extends AndroidTestCase {
-    private static final String PACKAGE_NAME = "com.android.cts.stub";
+    private static final String PACKAGE_NAME = "com.android.cts.content";
     private static final String PROVIDER_NAME = "android.content.cts.MockContentProvider";
 
     public void testProviderInfo() throws NameNotFoundException {
diff --git a/tests/tests/content/src/android/content/pm/cts/ResolveInfoTest.java b/tests/tests/content/src/android/content/pm/cts/ResolveInfoTest.java
index 3501e86..af3f161 100644
--- a/tests/tests/content/src/android/content/pm/cts/ResolveInfoTest.java
+++ b/tests/tests/content/src/android/content/pm/cts/ResolveInfoTest.java
@@ -26,7 +26,7 @@
 import android.util.Printer;
 
 public class ResolveInfoTest extends AndroidTestCase {
-    private static final String PACKAGE_NAME = "com.android.cts.stub";
+    private static final String PACKAGE_NAME = "com.android.cts.content";
     private static final String MAIN_ACTION_NAME = "android.intent.action.MAIN";
     private static final String ACTIVITY_NAME = "android.content.pm.cts.TestPmActivity";
     private static final String SERVICE_NAME = "android.content.pm.cts.activity.PMTEST_SERVICE";
diff --git a/tests/tests/content/src/android/content/pm/cts/ServiceInfoTest.java b/tests/tests/content/src/android/content/pm/cts/ServiceInfoTest.java
index 8508c15..297ab69 100644
--- a/tests/tests/content/src/android/content/pm/cts/ServiceInfoTest.java
+++ b/tests/tests/content/src/android/content/pm/cts/ServiceInfoTest.java
@@ -25,7 +25,7 @@
 import android.test.AndroidTestCase;
 
 public class ServiceInfoTest extends AndroidTestCase {
-    private static final String PACKAGE_NAME = "com.android.cts.stub";
+    private static final String PACKAGE_NAME = "com.android.cts.content";
     private static final String SERVICE_NAME = "android.content.pm.cts.TestPmService";
 
     public void testServiceInfo() throws NameNotFoundException {
diff --git a/tests/tests/content/src/android/content/pm/cts/WidgetTestUtils.java b/tests/tests/content/src/android/content/pm/cts/WidgetTestUtils.java
new file mode 100644
index 0000000..6efd8b1
--- /dev/null
+++ b/tests/tests/content/src/android/content/pm/cts/WidgetTestUtils.java
@@ -0,0 +1,138 @@
+/*
+ * Copyright (C) 2008 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.content.pm.cts;
+
+import org.xmlpull.v1.XmlPullParser;
+import org.xmlpull.v1.XmlPullParserException;
+
+import android.content.Context;
+import android.content.res.Resources;
+import android.graphics.Bitmap;
+import android.graphics.BitmapFactory;
+
+import java.io.IOException;
+
+import junit.framework.Assert;
+
+/**
+ * The useful methods for widget test.
+ */
+public class WidgetTestUtils {
+    /**
+     * Assert that two bitmaps are equal.
+     *
+     * @param Bitmap b1 the first bitmap which needs to compare.
+     * @param Bitmap b2 the second bitmap which needs to compare.
+     */
+    public static void assertEquals(Bitmap b1, Bitmap b2) {
+        if (b1 == b2) {
+            return;
+        }
+
+        if (b1 == null || b2 == null) {
+            Assert.fail("the bitmaps are not equal");
+        }
+
+        // b1 and b2 are all not null.
+        if (b1.getWidth() != b2.getWidth() || b1.getHeight() != b2.getHeight()
+            || b1.getConfig() != b2.getConfig()) {
+            Assert.fail("the bitmaps are not equal");
+        }
+
+        int w = b1.getWidth();
+        int h = b1.getHeight();
+        int s = w * h;
+        int[] pixels1 = new int[s];
+        int[] pixels2 = new int[s];
+
+        b1.getPixels(pixels1, 0, w, 0, 0, w, h);
+        b2.getPixels(pixels2, 0, w, 0, 0, w, h);
+
+        for (int i = 0; i < s; i++) {
+            if (pixels1[i] != pixels2[i]) {
+                Assert.fail("the bitmaps are not equal");
+            }
+        }
+    }
+
+    /**
+     * Find beginning of the special element.
+     * @param parser XmlPullParser will be parsed.
+     * @param firstElementName the target element name.
+     *
+     * @throws XmlPullParserException if XML Pull Parser related faults occur.
+     * @throws IOException if I/O-related error occur when parsing.
+     */
+    public static final void beginDocument(XmlPullParser parser, String firstElementName)
+            throws XmlPullParserException, IOException {
+        Assert.assertNotNull(parser);
+        Assert.assertNotNull(firstElementName);
+
+        int type;
+        while ((type = parser.next()) != XmlPullParser.START_TAG
+                && type != XmlPullParser.END_DOCUMENT) {
+            ;
+        }
+
+        if (!parser.getName().equals(firstElementName)) {
+            throw new XmlPullParserException("Unexpected start tag: found " + parser.getName()
+                    + ", expected " + firstElementName);
+        }
+    }
+
+    /**
+     * Compare the expected pixels with actual, scaling for the target context density
+     *
+     * @throws AssertionFailedError
+     */
+    public static void assertScaledPixels(int expected, int actual, Context context) {
+        Assert.assertEquals(expected * context.getResources().getDisplayMetrics().density,
+                actual, 3);
+    }
+
+    /** Converts dips into pixels using the {@link Context}'s density. */
+    public static int convertDipToPixels(Context context, int dip) {
+      float density = context.getResources().getDisplayMetrics().density;
+      return Math.round(density * dip);
+    }
+
+    /**
+     * Retrieve a bitmap that can be used for comparison on any density
+     * @param resources
+     * @return the {@link Bitmap} or <code>null</code>
+     */
+    public static Bitmap getUnscaledBitmap(Resources resources, int resId) {
+        BitmapFactory.Options options = new BitmapFactory.Options();
+        options.inScaled = false;
+        return BitmapFactory.decodeResource(resources, resId, options);
+    }
+
+    /**
+     * Retrieve a dithered bitmap that can be used for comparison on any density
+     * @param resources
+     * @param config the preferred config for the returning bitmap
+     * @return the {@link Bitmap} or <code>null</code>
+     */
+    public static Bitmap getUnscaledAndDitheredBitmap(Resources resources,
+            int resId, Bitmap.Config config) {
+        BitmapFactory.Options options = new BitmapFactory.Options();
+        options.inDither = true;
+        options.inScaled = false;
+        options.inPreferredConfig = config;
+        return BitmapFactory.decodeResource(resources, resId, options);
+    }
+}
diff --git a/tests/tests/content/src/android/content/res/cts/ArrayTest.java b/tests/tests/content/src/android/content/res/cts/ArrayTest.java
index 1b1fcdf..909fbf6 100644
--- a/tests/tests/content/src/android/content/res/cts/ArrayTest.java
+++ b/tests/tests/content/src/android/content/res/cts/ArrayTest.java
@@ -20,7 +20,7 @@
 import android.test.AndroidTestCase;
 import android.test.suitebuilder.annotation.SmallTest;
 
-import com.android.cts.stub.R;
+import com.android.cts.content.R;
 
 public class ArrayTest extends AndroidTestCase {
     private Resources mResources;
diff --git a/tests/tests/content/src/android/content/res/cts/AssetManagerTest.java b/tests/tests/content/src/android/content/res/cts/AssetManagerTest.java
index cbf20ec..2870fee 100644
--- a/tests/tests/content/src/android/content/res/cts/AssetManagerTest.java
+++ b/tests/tests/content/src/android/content/res/cts/AssetManagerTest.java
@@ -30,7 +30,7 @@
 import android.test.AndroidTestCase;
 import android.util.TypedValue;
 
-import com.android.cts.stub.R;
+import com.android.cts.content.R;
 import com.android.internal.util.XmlUtils;
 
 
diff --git a/tests/tests/content/src/android/content/res/cts/ColorStateListTest.java b/tests/tests/content/src/android/content/res/cts/ColorStateListTest.java
index cd1ac8b..88f5798 100644
--- a/tests/tests/content/src/android/content/res/cts/ColorStateListTest.java
+++ b/tests/tests/content/src/android/content/res/cts/ColorStateListTest.java
@@ -27,7 +27,7 @@
 import android.os.Parcel;
 import android.test.AndroidTestCase;
 
-import com.android.cts.stub.R;
+import com.android.cts.content.R;
 
 
 public class ColorStateListTest extends AndroidTestCase {
diff --git a/tests/tests/content/src/android/content/res/cts/ConfigTest.java b/tests/tests/content/src/android/content/res/cts/ConfigTest.java
index bfc7887..0b94b6f 100644
--- a/tests/tests/content/src/android/content/res/cts/ConfigTest.java
+++ b/tests/tests/content/src/android/content/res/cts/ConfigTest.java
@@ -31,7 +31,7 @@
 import android.util.DisplayMetrics;
 import android.util.Log;
 
-import com.android.cts.stub.R;
+import com.android.cts.content.R;
 
 public class ConfigTest extends AndroidTestCase {
     enum Properties {
diff --git a/tests/tests/content/src/android/content/res/cts/FractionTest.java b/tests/tests/content/src/android/content/res/cts/FractionTest.java
index 9fa896c..2c3e797 100644
--- a/tests/tests/content/src/android/content/res/cts/FractionTest.java
+++ b/tests/tests/content/src/android/content/res/cts/FractionTest.java
@@ -20,7 +20,7 @@
 import android.test.AndroidTestCase;
 import android.test.suitebuilder.annotation.SmallTest;
 import android.util.TypedValue;
-import com.android.cts.stub.R;
+import com.android.cts.content.R;
 
 public class FractionTest extends AndroidTestCase {
 
diff --git a/tests/tests/content/src/android/content/res/cts/PluralResourcesTest.java b/tests/tests/content/src/android/content/res/cts/PluralResourcesTest.java
index 074d10a..1fd204d 100644
--- a/tests/tests/content/src/android/content/res/cts/PluralResourcesTest.java
+++ b/tests/tests/content/src/android/content/res/cts/PluralResourcesTest.java
@@ -25,7 +25,7 @@
 import android.test.suitebuilder.annotation.SmallTest;
 import android.util.Log;
 
-import com.android.cts.stub.R;
+import com.android.cts.content.R;
 
 public class PluralResourcesTest extends AndroidTestCase {
     public static boolean DEBUG = false;
diff --git a/tests/tests/content/src/android/content/res/cts/PrimitiveTest.java b/tests/tests/content/src/android/content/res/cts/PrimitiveTest.java
index c7da6d8..8eeb086 100644
--- a/tests/tests/content/src/android/content/res/cts/PrimitiveTest.java
+++ b/tests/tests/content/src/android/content/res/cts/PrimitiveTest.java
@@ -21,7 +21,7 @@
 import android.test.AndroidTestCase;
 import android.test.suitebuilder.annotation.SmallTest;
 import android.util.TypedValue;
-import com.android.cts.stub.R;
+import com.android.cts.content.R;
 
 public class PrimitiveTest extends AndroidTestCase {
     private Resources mResources;
diff --git a/tests/tests/content/src/android/content/res/cts/RawResourceTest.java b/tests/tests/content/src/android/content/res/cts/RawResourceTest.java
index 9c8dae0..c92efc7 100644
--- a/tests/tests/content/src/android/content/res/cts/RawResourceTest.java
+++ b/tests/tests/content/src/android/content/res/cts/RawResourceTest.java
@@ -19,7 +19,7 @@
 import android.content.res.Resources;
 import android.test.AndroidTestCase;
 import android.test.suitebuilder.annotation.SmallTest;
-import com.android.cts.stub.R;
+import com.android.cts.content.R;
 
 import java.io.IOException;
 import java.io.InputStream;
diff --git a/tests/tests/content/src/android/content/res/cts/ResourceNameTest.java b/tests/tests/content/src/android/content/res/cts/ResourceNameTest.java
index eacf00d..a7cc03b 100644
--- a/tests/tests/content/src/android/content/res/cts/ResourceNameTest.java
+++ b/tests/tests/content/src/android/content/res/cts/ResourceNameTest.java
@@ -20,7 +20,7 @@
 import android.test.AndroidTestCase;
 import android.test.suitebuilder.annotation.SmallTest;
 
-import com.android.cts.stub.R;
+import com.android.cts.content.R;
 
 public class ResourceNameTest extends AndroidTestCase {
 
@@ -29,10 +29,10 @@
         final Resources res = mContext.getResources();
 
         final String fullName = res.getResourceName(R.configVarying.simple);
-        assertEquals("com.android.cts.stub:configVarying/simple", fullName);
+        assertEquals("com.android.cts.content:configVarying/simple", fullName);
 
         final String packageName = res.getResourcePackageName(R.configVarying.simple);
-        assertEquals("com.android.cts.stub", packageName);
+        assertEquals("com.android.cts.content", packageName);
 
         final String typeName = res.getResourceTypeName(R.configVarying.simple);
         assertEquals("configVarying", typeName);
@@ -45,16 +45,16 @@
     public void testGetResourceIdentifier() {
         final Resources res = mContext.getResources();
         int resid = res.getIdentifier(
-                "com.android.cts.stub:configVarying/simple",
+                "com.android.cts.content:configVarying/simple",
                 null, null);
         assertEquals(R.configVarying.simple, resid);
 
         resid = res.getIdentifier("configVarying/simple", null,
-                "com.android.cts.stub");
+                "com.android.cts.content");
         assertEquals(R.configVarying.simple, resid);
 
         resid = res.getIdentifier("simple", "configVarying",
-                "com.android.cts.stub");
+                "com.android.cts.content");
         assertEquals(R.configVarying.simple, resid);
     }
 }
diff --git a/tests/tests/content/src/android/content/res/cts/ResourcesTest.java b/tests/tests/content/src/android/content/res/cts/ResourcesTest.java
index 058076c..88caa6f 100644
--- a/tests/tests/content/src/android/content/res/cts/ResourcesTest.java
+++ b/tests/tests/content/src/android/content/res/cts/ResourcesTest.java
@@ -16,7 +16,7 @@
 
 package android.content.res.cts;
 
-import com.android.cts.stub.R;
+import com.android.cts.content.R;
 import com.android.internal.util.XmlUtils;
 
 
@@ -49,9 +49,9 @@
     private static final String CONFIG_VARYING = "configVarying";
     private static final String SIMPLE = "simple";
     private static final String CONFIG_VARYING_SIMPLE = "configVarying/simple";
-    private static final String PACKAGE_NAME = "com.android.cts.stub";
+    private static final String PACKAGE_NAME = "com.android.cts.content";
     private static final String COM_ANDROID_CTS_STUB_IDENTIFIER =
-                "com.android.cts.stub:configVarying/simple";
+                "com.android.cts.content:configVarying/simple";
     private Resources mResources;
 
     @Override
@@ -320,7 +320,7 @@
             //expected
         }
 
-        mResources.getValue("com.android.cts.stub:raw/text", tv, false);
+        mResources.getValue("com.android.cts.content:raw/text", tv, false);
         assertNotNull(tv);
         assertEquals("res/raw/text.txt", tv.coerceToString());
     }
diff --git a/tests/tests/content/src/android/content/res/cts/Resources_ThemeTest.java b/tests/tests/content/src/android/content/res/cts/Resources_ThemeTest.java
index 4a4991f..349cb47 100644
--- a/tests/tests/content/src/android/content/res/cts/Resources_ThemeTest.java
+++ b/tests/tests/content/src/android/content/res/cts/Resources_ThemeTest.java
@@ -26,7 +26,7 @@
 import android.util.TypedValue;
 import android.util.Xml;
 
-import com.android.cts.stub.R;
+import com.android.cts.content.R;
 
 
 public class Resources_ThemeTest extends AndroidTestCase {
diff --git a/tests/tests/content/src/android/content/res/cts/TypedArrayTest.java b/tests/tests/content/src/android/content/res/cts/TypedArrayTest.java
index c51405a..cc6c5ec 100644
--- a/tests/tests/content/src/android/content/res/cts/TypedArrayTest.java
+++ b/tests/tests/content/src/android/content/res/cts/TypedArrayTest.java
@@ -27,7 +27,7 @@
 import android.util.TypedValue;
 import android.view.ContextThemeWrapper;
 
-import com.android.cts.stub.R;
+import com.android.cts.content.R;
 import com.android.internal.util.XmlUtils;
 
 
diff --git a/tests/tests/drm/Android.mk b/tests/tests/drm/Android.mk
index 9404f4b..74422a0 100644
--- a/tests/tests/drm/Android.mk
+++ b/tests/tests/drm/Android.mk
@@ -27,8 +27,6 @@
 
 LOCAL_PACKAGE_NAME := CtsDrmTestCases
 
-LOCAL_INSTRUMENTATION_FOR := CtsTestStubs
-
 LOCAL_JNI_SHARED_LIBRARIES := \
 	libctsdrm_jni \
 	libdrmtestplugin
diff --git a/tests/tests/drm/AndroidManifest.xml b/tests/tests/drm/AndroidManifest.xml
index dd70f02..527d498 100644
--- a/tests/tests/drm/AndroidManifest.xml
+++ b/tests/tests/drm/AndroidManifest.xml
@@ -23,7 +23,7 @@
     </application>
 
     <instrumentation android:name="android.support.test.runner.AndroidJUnitRunner"
-                     android:targetPackage="com.android.cts.stub"
+                     android:targetPackage="com.android.cts.drm"
                      android:label="CTS tests of android.drm">
         <meta-data android:name="listener"
             android:value="com.android.cts.runner.CtsTestRunListener" />
diff --git a/tests/tests/graphics/Android.mk b/tests/tests/graphics/Android.mk
index b65bb1b..773b47d 100644
--- a/tests/tests/graphics/Android.mk
+++ b/tests/tests/graphics/Android.mk
@@ -18,14 +18,12 @@
 
 LOCAL_MODULE_TAGS := tests
 
-LOCAL_STATIC_JAVA_LIBRARIES := ctstestrunner
+LOCAL_STATIC_JAVA_LIBRARIES := ctsdeviceutil ctstestrunner
 
 LOCAL_SRC_FILES := $(call all-java-files-under, src)
 
 LOCAL_PACKAGE_NAME := CtsGraphicsTestCases
 
-LOCAL_INSTRUMENTATION_FOR := CtsTestStubs
-
 LOCAL_SDK_VERSION := current
 
 include $(BUILD_CTS_PACKAGE)
diff --git a/tests/tests/graphics/AndroidManifest.xml b/tests/tests/graphics/AndroidManifest.xml
index 0371093..1a1e3e6 100644
--- a/tests/tests/graphics/AndroidManifest.xml
+++ b/tests/tests/graphics/AndroidManifest.xml
@@ -21,10 +21,38 @@
     <uses-permission android:name="android.permission.DISABLE_KEYGUARD" />
     <application>
         <uses-library android:name="android.test.runner" />
+
+        <activity android:name="android.graphics.cts.ImageViewCtsActivity"
+            android:label="ImageViewCtsActivity">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="android.intent.category.FRAMEWORK_INSTRUMENTATION_TEST" />
+            </intent-filter>
+        </activity>
+
+        <activity android:name="android.graphics.cts.MockActivity" android:label="MockActivity" />
+
+        <activity android:name="android.opengl.cts.CompressedTextureCtsActivity"
+            android:label="CompressedTextureCtsActivity"
+            android:screenOrientation="nosensor">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="android.intent.category.FRAMEWORK_INSTRUMENTATION_TEST" />
+            </intent-filter>
+        </activity>
+
+        <activity android:name="android.opengl.cts.EglConfigCtsActivity"
+            android:configChanges="keyboardHidden|orientation|screenSize|uiMode" />
+
+        <activity android:name="android.opengl.cts.GLSurfaceViewCtsActivity"
+                  android:label="GLSurfaceViewCts"/>
+
+        <activity android:name="android.opengl.cts.OpenGlEsVersionCtsActivity"/>
+
     </application>
 
     <instrumentation android:name="android.support.test.runner.AndroidJUnitRunner"
-                     android:targetPackage="com.android.cts.stub"
+                     android:targetPackage="com.android.cts.graphics"
                      android:label="CTS tests of android.graphics">
         <meta-data android:name="listener"
             android:value="com.android.cts.runner.CtsTestRunListener" />
diff --git a/tests/assets/samplefont.ttf b/tests/tests/graphics/assets/samplefont.ttf
similarity index 100%
rename from tests/assets/samplefont.ttf
rename to tests/tests/graphics/assets/samplefont.ttf
Binary files differ
diff --git a/tests/tests/graphics/res/drawable-nodpi/vector_icon_clip_path_1_golden.png b/tests/tests/graphics/res/drawable-nodpi/vector_icon_clip_path_1_golden.png
new file mode 100644
index 0000000..be487d1
--- /dev/null
+++ b/tests/tests/graphics/res/drawable-nodpi/vector_icon_clip_path_1_golden.png
Binary files differ
diff --git a/tests/tests/graphics/res/drawable-nodpi/vector_icon_create_golden.png b/tests/tests/graphics/res/drawable-nodpi/vector_icon_create_golden.png
new file mode 100644
index 0000000..943fce5
--- /dev/null
+++ b/tests/tests/graphics/res/drawable-nodpi/vector_icon_create_golden.png
Binary files differ
diff --git a/tests/tests/graphics/res/drawable-nodpi/vector_icon_delete_golden.png b/tests/tests/graphics/res/drawable-nodpi/vector_icon_delete_golden.png
new file mode 100644
index 0000000..b46363e
--- /dev/null
+++ b/tests/tests/graphics/res/drawable-nodpi/vector_icon_delete_golden.png
Binary files differ
diff --git a/tests/tests/graphics/res/drawable-nodpi/vector_icon_heart_golden.png b/tests/tests/graphics/res/drawable-nodpi/vector_icon_heart_golden.png
new file mode 100644
index 0000000..7450751
--- /dev/null
+++ b/tests/tests/graphics/res/drawable-nodpi/vector_icon_heart_golden.png
Binary files differ
diff --git a/tests/tests/graphics/res/drawable-nodpi/vector_icon_random_path_1_golden.png b/tests/tests/graphics/res/drawable-nodpi/vector_icon_random_path_1_golden.png
new file mode 100644
index 0000000..91776a9
--- /dev/null
+++ b/tests/tests/graphics/res/drawable-nodpi/vector_icon_random_path_1_golden.png
Binary files differ
diff --git a/tests/tests/graphics/res/drawable-nodpi/vector_icon_random_path_2_golden.png b/tests/tests/graphics/res/drawable-nodpi/vector_icon_random_path_2_golden.png
new file mode 100644
index 0000000..9af40a3
--- /dev/null
+++ b/tests/tests/graphics/res/drawable-nodpi/vector_icon_random_path_2_golden.png
Binary files differ
diff --git a/tests/tests/graphics/res/drawable-nodpi/vector_icon_render_order_1_golden.png b/tests/tests/graphics/res/drawable-nodpi/vector_icon_render_order_1_golden.png
new file mode 100644
index 0000000..ea3be94
--- /dev/null
+++ b/tests/tests/graphics/res/drawable-nodpi/vector_icon_render_order_1_golden.png
Binary files differ
diff --git a/tests/tests/graphics/res/drawable-nodpi/vector_icon_render_order_2_golden.png b/tests/tests/graphics/res/drawable-nodpi/vector_icon_render_order_2_golden.png
new file mode 100644
index 0000000..f317901
--- /dev/null
+++ b/tests/tests/graphics/res/drawable-nodpi/vector_icon_render_order_2_golden.png
Binary files differ
diff --git a/tests/tests/graphics/res/drawable-nodpi/vector_icon_repeated_a_1_golden.png b/tests/tests/graphics/res/drawable-nodpi/vector_icon_repeated_a_1_golden.png
new file mode 100644
index 0000000..b3acfe7
--- /dev/null
+++ b/tests/tests/graphics/res/drawable-nodpi/vector_icon_repeated_a_1_golden.png
Binary files differ
diff --git a/tests/tests/graphics/res/drawable-nodpi/vector_icon_repeated_a_2_golden.png b/tests/tests/graphics/res/drawable-nodpi/vector_icon_repeated_a_2_golden.png
new file mode 100644
index 0000000..bbc84b9
--- /dev/null
+++ b/tests/tests/graphics/res/drawable-nodpi/vector_icon_repeated_a_2_golden.png
Binary files differ
diff --git a/tests/tests/graphics/res/drawable-nodpi/vector_icon_repeated_cq_golden.png b/tests/tests/graphics/res/drawable-nodpi/vector_icon_repeated_cq_golden.png
new file mode 100644
index 0000000..8d73cfd
--- /dev/null
+++ b/tests/tests/graphics/res/drawable-nodpi/vector_icon_repeated_cq_golden.png
Binary files differ
diff --git a/tests/tests/graphics/res/drawable-nodpi/vector_icon_repeated_st_golden.png b/tests/tests/graphics/res/drawable-nodpi/vector_icon_repeated_st_golden.png
new file mode 100644
index 0000000..6094a9a
--- /dev/null
+++ b/tests/tests/graphics/res/drawable-nodpi/vector_icon_repeated_st_golden.png
Binary files differ
diff --git a/tests/tests/graphics/res/drawable-nodpi/vector_icon_schedule_golden.png b/tests/tests/graphics/res/drawable-nodpi/vector_icon_schedule_golden.png
new file mode 100644
index 0000000..9822bc2
--- /dev/null
+++ b/tests/tests/graphics/res/drawable-nodpi/vector_icon_schedule_golden.png
Binary files differ
diff --git a/tests/tests/graphics/res/drawable-nodpi/vector_icon_settings_golden.png b/tests/tests/graphics/res/drawable-nodpi/vector_icon_settings_golden.png
new file mode 100644
index 0000000..d12b142
--- /dev/null
+++ b/tests/tests/graphics/res/drawable-nodpi/vector_icon_settings_golden.png
Binary files differ
diff --git a/tests/tests/graphics/res/drawable-nodpi/vector_icon_stroke_1_golden.png b/tests/tests/graphics/res/drawable-nodpi/vector_icon_stroke_1_golden.png
new file mode 100644
index 0000000..c57ad20
--- /dev/null
+++ b/tests/tests/graphics/res/drawable-nodpi/vector_icon_stroke_1_golden.png
Binary files differ
diff --git a/tests/tests/graphics/res/drawable-nodpi/vector_icon_stroke_2_golden.png b/tests/tests/graphics/res/drawable-nodpi/vector_icon_stroke_2_golden.png
new file mode 100644
index 0000000..aee8ff5
--- /dev/null
+++ b/tests/tests/graphics/res/drawable-nodpi/vector_icon_stroke_2_golden.png
Binary files differ
diff --git a/tests/tests/graphics/res/drawable-nodpi/vector_icon_stroke_3_golden.png b/tests/tests/graphics/res/drawable-nodpi/vector_icon_stroke_3_golden.png
new file mode 100644
index 0000000..1212fb3
--- /dev/null
+++ b/tests/tests/graphics/res/drawable-nodpi/vector_icon_stroke_3_golden.png
Binary files differ
diff --git a/tests/tests/graphics/res/drawable-nodpi/vector_icon_transformation_1_golden.png b/tests/tests/graphics/res/drawable-nodpi/vector_icon_transformation_1_golden.png
new file mode 100644
index 0000000..baf418d
--- /dev/null
+++ b/tests/tests/graphics/res/drawable-nodpi/vector_icon_transformation_1_golden.png
Binary files differ
diff --git a/tests/tests/graphics/res/drawable-nodpi/vector_icon_transformation_2_golden.png b/tests/tests/graphics/res/drawable-nodpi/vector_icon_transformation_2_golden.png
new file mode 100644
index 0000000..e0e14f3
--- /dev/null
+++ b/tests/tests/graphics/res/drawable-nodpi/vector_icon_transformation_2_golden.png
Binary files differ
diff --git a/tests/tests/graphics/res/drawable-nodpi/vector_icon_transformation_3_golden.png b/tests/tests/graphics/res/drawable-nodpi/vector_icon_transformation_3_golden.png
new file mode 100644
index 0000000..b6798c2
--- /dev/null
+++ b/tests/tests/graphics/res/drawable-nodpi/vector_icon_transformation_3_golden.png
Binary files differ
diff --git a/tests/tests/graphics/res/drawable-nodpi/vector_icon_transformation_4_golden.png b/tests/tests/graphics/res/drawable-nodpi/vector_icon_transformation_4_golden.png
new file mode 100644
index 0000000..a5d4d33
--- /dev/null
+++ b/tests/tests/graphics/res/drawable-nodpi/vector_icon_transformation_4_golden.png
Binary files differ
diff --git a/tests/tests/graphics/res/drawable-nodpi/vector_icon_transformation_5_golden.png b/tests/tests/graphics/res/drawable-nodpi/vector_icon_transformation_5_golden.png
new file mode 100644
index 0000000..0d8ded1
--- /dev/null
+++ b/tests/tests/graphics/res/drawable-nodpi/vector_icon_transformation_5_golden.png
Binary files differ
diff --git a/tests/tests/graphics/res/drawable-nodpi/vector_icon_transformation_6_golden.png b/tests/tests/graphics/res/drawable-nodpi/vector_icon_transformation_6_golden.png
new file mode 100644
index 0000000..64d07fa
--- /dev/null
+++ b/tests/tests/graphics/res/drawable-nodpi/vector_icon_transformation_6_golden.png
Binary files differ
diff --git a/tests/tests/graphics/res/drawable/alpha.png b/tests/tests/graphics/res/drawable/alpha.png
new file mode 100644
index 0000000..8a88548
--- /dev/null
+++ b/tests/tests/graphics/res/drawable/alpha.png
Binary files differ
diff --git a/tests/tests/graphics/res/drawable/animated.gif b/tests/tests/graphics/res/drawable/animated.gif
new file mode 100644
index 0000000..51baf15
--- /dev/null
+++ b/tests/tests/graphics/res/drawable/animated.gif
Binary files differ
diff --git a/tests/tests/graphics/res/drawable/animationdrawable.xml b/tests/tests/graphics/res/drawable/animationdrawable.xml
new file mode 100644
index 0000000..6756966
--- /dev/null
+++ b/tests/tests/graphics/res/drawable/animationdrawable.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ * Copyright (C) 2009 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ -->
+
+<animation-list xmlns:android="http://schemas.android.com/apk/res/android" android:oneshot="false">
+    <item android:drawable="@drawable/testimage" android:duration="3000"/>
+    <item android:drawable="@drawable/pass" android:duration="2000"/>
+    <item android:drawable="@drawable/scenery" android:duration="1000"/>
+</animation-list>
diff --git a/tests/tests/graphics/res/drawable/baseline_jpeg.jpg b/tests/tests/graphics/res/drawable/baseline_jpeg.jpg
new file mode 100644
index 0000000..ed5251c
--- /dev/null
+++ b/tests/tests/graphics/res/drawable/baseline_jpeg.jpg
Binary files differ
diff --git a/tests/tests/graphics/res/drawable/baseline_restart_jpeg.jpg b/tests/tests/graphics/res/drawable/baseline_restart_jpeg.jpg
new file mode 100644
index 0000000..00dcc5b
--- /dev/null
+++ b/tests/tests/graphics/res/drawable/baseline_restart_jpeg.jpg
Binary files differ
diff --git a/tests/tests/graphics/res/drawable/bitmapdrawable_theme.xml b/tests/tests/graphics/res/drawable/bitmapdrawable_theme.xml
new file mode 100644
index 0000000..6df36b3
--- /dev/null
+++ b/tests/tests/graphics/res/drawable/bitmapdrawable_theme.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2014 The Android Open Source Project
+    
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+    
+          http://www.apache.org/licenses/LICENSE-2.0
+    
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<bitmap xmlns:android="http://schemas.android.com/apk/res/android"
+    android:antialias="?attr/themeBoolean"
+    android:autoMirrored="?attr/themeBoolean"
+    android:dither="?attr/themeBoolean"
+    android:filter="?attr/themeBoolean"
+    android:gravity="?attr/themeGravity"
+    android:mipMap="?attr/themeBoolean"
+    android:src="?attr/themeBitmap"
+    android:tileMode="?attr/themeTileMode" />
diff --git a/tests/tests/graphics/res/drawable/bmp_test.bmp b/tests/tests/graphics/res/drawable/bmp_test.bmp
new file mode 100644
index 0000000..5ec6dd4
--- /dev/null
+++ b/tests/tests/graphics/res/drawable/bmp_test.bmp
Binary files differ
diff --git a/tests/tests/graphics/res/drawable/colordrawable_test.xml b/tests/tests/graphics/res/drawable/colordrawable_test.xml
new file mode 100644
index 0000000..9d2f390
--- /dev/null
+++ b/tests/tests/graphics/res/drawable/colordrawable_test.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ * Copyright (C) 2008 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ -->
+
+<ColorDrawable xmlns:android="http://schemas.android.com/apk/res/android" android:color="#02000000">
+    <solid android:color="#02000000"/>
+</ColorDrawable>
diff --git a/tests/tests/graphics/res/drawable/colordrawable_theme.xml b/tests/tests/graphics/res/drawable/colordrawable_theme.xml
new file mode 100644
index 0000000..00c6fe7
--- /dev/null
+++ b/tests/tests/graphics/res/drawable/colordrawable_theme.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2014 The Android Open Source Project
+    
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+    
+          http://www.apache.org/licenses/LICENSE-2.0
+    
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<color xmlns:android="http://schemas.android.com/apk/res/android"
+    android:color="?attr/themeColor" />
diff --git a/tests/tests/graphics/res/drawable/colorstatelist_test.xml b/tests/tests/graphics/res/drawable/colorstatelist_test.xml
new file mode 100644
index 0000000..c86a1a7
--- /dev/null
+++ b/tests/tests/graphics/res/drawable/colorstatelist_test.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ * Copyright (C) 2008 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ -->
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+   <item android:state_focused="true" android:color="@color/resource_test_color"/>
+   <item android:state_pressed="true" android:state_enabled="false" android:color="@color/resource_test_color"/>
+   <item android:state_enabled="false" android:color="@color/resource_test_color"/>
+   <item android:state_active="true" android:color="@color/resource_test_color"/>
+   <item android:color="@color/resource_test_color"/>
+ </selector>
diff --git a/tests/tests/graphics/res/drawable/faces.jpg b/tests/tests/graphics/res/drawable/faces.jpg
new file mode 100644
index 0000000..0672022
--- /dev/null
+++ b/tests/tests/graphics/res/drawable/faces.jpg
Binary files differ
diff --git a/tests/tests/graphics/res/drawable/failed.jpg b/tests/tests/graphics/res/drawable/failed.jpg
new file mode 100644
index 0000000..1bb9b52
--- /dev/null
+++ b/tests/tests/graphics/res/drawable/failed.jpg
Binary files differ
diff --git a/tests/tests/graphics/res/drawable/gif_test.gif b/tests/tests/graphics/res/drawable/gif_test.gif
new file mode 100644
index 0000000..d1c2815
--- /dev/null
+++ b/tests/tests/graphics/res/drawable/gif_test.gif
Binary files differ
diff --git a/tests/tests/graphics/res/drawable/google_logo_1.png b/tests/tests/graphics/res/drawable/google_logo_1.png
new file mode 100644
index 0000000..6e038fc
--- /dev/null
+++ b/tests/tests/graphics/res/drawable/google_logo_1.png
Binary files differ
diff --git a/tests/tests/graphics/res/drawable/google_logo_2.webp b/tests/tests/graphics/res/drawable/google_logo_2.webp
new file mode 100644
index 0000000..f92c42b
--- /dev/null
+++ b/tests/tests/graphics/res/drawable/google_logo_2.webp
Binary files differ
diff --git a/tests/tests/graphics/res/drawable/gradientdrawable.xml b/tests/tests/graphics/res/drawable/gradientdrawable.xml
new file mode 100644
index 0000000..ed8ff96
--- /dev/null
+++ b/tests/tests/graphics/res/drawable/gradientdrawable.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ * Copyright (C) 2009 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ -->
+
+<shape xmlns:android="http://schemas.android.com/apk/res/android">
+    <gradient android:startColor="#ffffffff" android:centerColor="#ffff0000"
+              android:endColor="#0000ffff" />
+    <corners android:radius="8px" />
+    <padding android:left="4px" android:top="2px"
+             android:right="6px" android:bottom="10px" />
+    <size android:width="42px" android:height="63px"/>
+</shape>
+
diff --git a/tests/tests/graphics/res/drawable/gradientdrawable_radius_base.xml b/tests/tests/graphics/res/drawable/gradientdrawable_radius_base.xml
new file mode 100644
index 0000000..ecd50f8
--- /dev/null
+++ b/tests/tests/graphics/res/drawable/gradientdrawable_radius_base.xml
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+-->
+
+<shape xmlns:android="http://schemas.android.com/apk/res/android" >
+
+    <gradient
+        android:centerColor="#ffff0000"
+        android:endColor="#0000ffff"
+        android:gradientRadius="50%"
+        android:startColor="#ffffffff"
+        android:type="radial" />
+
+    <corners android:radius="8px" />
+
+    <padding
+        android:bottom="10px"
+        android:left="4px"
+        android:right="6px"
+        android:top="2px" />
+
+    <size
+        android:height="50px"
+        android:width="50px" />
+
+</shape>
\ No newline at end of file
diff --git a/tests/tests/graphics/res/drawable/gradientdrawable_radius_parent.xml b/tests/tests/graphics/res/drawable/gradientdrawable_radius_parent.xml
new file mode 100644
index 0000000..73d116a
--- /dev/null
+++ b/tests/tests/graphics/res/drawable/gradientdrawable_radius_parent.xml
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+-->
+
+<shape xmlns:android="http://schemas.android.com/apk/res/android" >
+
+    <gradient
+        android:centerColor="#ffff0000"
+        android:endColor="#0000ffff"
+        android:gradientRadius="50%p"
+        android:startColor="#ffffffff"
+        android:type="radial" />
+
+    <corners android:radius="8px" />
+
+    <padding
+        android:bottom="10px"
+        android:left="4px"
+        android:right="6px"
+        android:top="2px" />
+
+    <size
+        android:height="50px"
+        android:width="50px" />
+
+</shape>
\ No newline at end of file
diff --git a/tests/tests/graphics/res/drawable/gradientdrawable_theme.xml b/tests/tests/graphics/res/drawable/gradientdrawable_theme.xml
new file mode 100644
index 0000000..68cec62
--- /dev/null
+++ b/tests/tests/graphics/res/drawable/gradientdrawable_theme.xml
@@ -0,0 +1,50 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2014 The Android Open Source Project
+    
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+    
+          http://www.apache.org/licenses/LICENSE-2.0
+    
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<shape xmlns:android="http://schemas.android.com/apk/res/android" >
+
+    <corners
+        android:bottomLeftRadius="?attr/themeDimension"
+        android:bottomRightRadius="?attr/themeDimension"
+        android:topLeftRadius="?attr/themeDimension"
+        android:topRightRadius="?attr/themeDimension" />
+
+    <gradient
+        android:angle="?attr/themeAngle"
+        android:centerColor="?attr/themeColor"
+        android:centerX="?attr/themeFloat"
+        android:centerY="?attr/themeFloat"
+        android:endColor="?attr/themeColor"
+        android:gradientRadius="?attr/themeFloat"
+        android:startColor="?attr/themeColor"
+        android:useLevel="?attr/themeBoolean" />
+
+    <padding
+        android:bottom="?attr/themeDimension"
+        android:left="?attr/themeDimension"
+        android:right="?attr/themeDimension"
+        android:top="?attr/themeDimension" />
+
+    <size
+        android:height="?attr/themeDimension"
+        android:width="?attr/themeDimension" />
+
+    <solid android:color="?attr/themeColor" />
+
+    <stroke android:color="?attr/themeColor" />
+
+</shape>
diff --git a/tests/tests/graphics/res/drawable/ic_cts_minitab_selected.png b/tests/tests/graphics/res/drawable/ic_cts_minitab_selected.png
new file mode 100644
index 0000000..c730050
--- /dev/null
+++ b/tests/tests/graphics/res/drawable/ic_cts_minitab_selected.png
Binary files differ
diff --git a/tests/tests/graphics/res/drawable/ic_cts_selected.png b/tests/tests/graphics/res/drawable/ic_cts_selected.png
new file mode 100644
index 0000000..72a065c
--- /dev/null
+++ b/tests/tests/graphics/res/drawable/ic_cts_selected.png
Binary files differ
diff --git a/tests/tests/graphics/res/drawable/icon_black.jpg b/tests/tests/graphics/res/drawable/icon_black.jpg
new file mode 100644
index 0000000..4c9062a
--- /dev/null
+++ b/tests/tests/graphics/res/drawable/icon_black.jpg
Binary files differ
diff --git a/tests/tests/graphics/res/drawable/icon_blue.jpg b/tests/tests/graphics/res/drawable/icon_blue.jpg
new file mode 100644
index 0000000..9e6c1c8
--- /dev/null
+++ b/tests/tests/graphics/res/drawable/icon_blue.jpg
Binary files differ
diff --git a/tests/tests/graphics/res/drawable/icon_green.jpg b/tests/tests/graphics/res/drawable/icon_green.jpg
new file mode 100644
index 0000000..55a78f2
--- /dev/null
+++ b/tests/tests/graphics/res/drawable/icon_green.jpg
Binary files differ
diff --git a/tests/tests/graphics/res/drawable/icon_red.jpg b/tests/tests/graphics/res/drawable/icon_red.jpg
new file mode 100644
index 0000000..6bc9e1f
--- /dev/null
+++ b/tests/tests/graphics/res/drawable/icon_red.jpg
Binary files differ
diff --git a/tests/tests/graphics/res/drawable/icon_yellow.jpg b/tests/tests/graphics/res/drawable/icon_yellow.jpg
new file mode 100644
index 0000000..e748059
--- /dev/null
+++ b/tests/tests/graphics/res/drawable/icon_yellow.jpg
Binary files differ
diff --git a/tests/tests/graphics/res/drawable/insetdrawable.xml b/tests/tests/graphics/res/drawable/insetdrawable.xml
new file mode 100644
index 0000000..8431c69
--- /dev/null
+++ b/tests/tests/graphics/res/drawable/insetdrawable.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ * Copyright (C) 2009 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ -->
+
+<inset xmlns:android="http://schemas.android.com/apk/res/android"
+    android:drawable="@drawable/testimage"/>
+
diff --git a/tests/tests/graphics/res/drawable/layerdrawable.xml b/tests/tests/graphics/res/drawable/layerdrawable.xml
new file mode 100644
index 0000000..521703b
--- /dev/null
+++ b/tests/tests/graphics/res/drawable/layerdrawable.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ * Copyright (C) 2009 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ -->
+
+<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
+    <item android:drawable="@drawable/testimage"/>
+    <item android:drawable="@drawable/start"/>
+</layer-list>
diff --git a/tests/tests/graphics/res/drawable/layerdrawable_theme.xml b/tests/tests/graphics/res/drawable/layerdrawable_theme.xml
new file mode 100644
index 0000000..2a678ff
--- /dev/null
+++ b/tests/tests/graphics/res/drawable/layerdrawable_theme.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2014 The Android Open Source Project
+    
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+    
+          http://www.apache.org/licenses/LICENSE-2.0
+    
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<layer-list xmlns:android="http://schemas.android.com/apk/res/android"
+    android:autoMirrored="?attr/themeBoolean" >
+
+    <item android:drawable="@drawable/bitmapdrawable_theme"/>
+    <item>
+        <nine-patch
+            android:autoMirrored="?attr/themeBoolean"
+            android:dither="?attr/themeBoolean"
+            android:src="?attr/themeNinePatch" />
+    </item>
+
+</layer-list>
\ No newline at end of file
diff --git a/tests/tests/graphics/res/drawable/levellistdrawable.xml b/tests/tests/graphics/res/drawable/levellistdrawable.xml
new file mode 100644
index 0000000..8fa93e8
--- /dev/null
+++ b/tests/tests/graphics/res/drawable/levellistdrawable.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ * Copyright (C) 2009 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ -->
+
+<level-list xmlns:android="http://schemas.android.com/apk/res/android">
+    <item android:maxLevel="50" android:drawable="@drawable/testimage"/>
+    <item android:maxLevel="100" android:drawable="@drawable/start"/>
+</level-list>
+
diff --git a/tests/tests/graphics/res/drawable/ninepatch_0.9.png b/tests/tests/graphics/res/drawable/ninepatch_0.9.png
new file mode 100644
index 0000000..24019d8
--- /dev/null
+++ b/tests/tests/graphics/res/drawable/ninepatch_0.9.png
Binary files differ
diff --git a/tests/tests/graphics/res/drawable/ninepatch_1.9.png b/tests/tests/graphics/res/drawable/ninepatch_1.9.png
new file mode 100644
index 0000000..c56b1db
--- /dev/null
+++ b/tests/tests/graphics/res/drawable/ninepatch_1.9.png
Binary files differ
diff --git a/tests/tests/graphics/res/drawable/ninepatchdrawable.xml b/tests/tests/graphics/res/drawable/ninepatchdrawable.xml
new file mode 100644
index 0000000..6e72457
--- /dev/null
+++ b/tests/tests/graphics/res/drawable/ninepatchdrawable.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ * Copyright (C) 2009 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ -->
+
+<nine-patch xmlns:android="http://schemas.android.com/apk/res/android"
+    android:src="@drawable/ninepatch_0"
+    android:dither="true"
+/>
+
diff --git a/tests/tests/graphics/res/drawable/ninepatchdrawable_theme.xml b/tests/tests/graphics/res/drawable/ninepatchdrawable_theme.xml
new file mode 100644
index 0000000..bb031a5
--- /dev/null
+++ b/tests/tests/graphics/res/drawable/ninepatchdrawable_theme.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2014 The Android Open Source Project
+    
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+    
+          http://www.apache.org/licenses/LICENSE-2.0
+    
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<nine-patch xmlns:android="http://schemas.android.com/apk/res/android"
+    android:autoMirrored="?attr/themeBoolean"
+    android:dither="?attr/themeBoolean"
+    android:src="?attr/themeNinePatch" />
diff --git a/tests/tests/graphics/res/drawable/no_padding.png b/tests/tests/graphics/res/drawable/no_padding.png
new file mode 100644
index 0000000..7d4c27c
--- /dev/null
+++ b/tests/tests/graphics/res/drawable/no_padding.png
Binary files differ
diff --git a/tests/tests/graphics/res/drawable/opaque.9.png b/tests/tests/graphics/res/drawable/opaque.9.png
new file mode 100644
index 0000000..a60f6d8
--- /dev/null
+++ b/tests/tests/graphics/res/drawable/opaque.9.png
Binary files differ
diff --git a/tests/tests/graphics/res/drawable/padding_0.9.png b/tests/tests/graphics/res/drawable/padding_0.9.png
new file mode 100644
index 0000000..0127bf4
--- /dev/null
+++ b/tests/tests/graphics/res/drawable/padding_0.9.png
Binary files differ
diff --git a/tests/tests/graphics/res/drawable/paintdrawable_attr.xml b/tests/tests/graphics/res/drawable/paintdrawable_attr.xml
new file mode 100644
index 0000000..444e5e2
--- /dev/null
+++ b/tests/tests/graphics/res/drawable/paintdrawable_attr.xml
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ * Copyright (C) 2008 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+<shape  xmlns:android="http://schemas.android.com/apk/res/android"
+        android:shape="rectangle">
+
+        <solid
+            android:color="#00000000"/>
+
+        <stroke
+            android:width="2dp"
+            android:color="#ff000000"/>
+
+        <padding
+            android:paddingLeft="1dp"
+            android:paddingRight="10dp"
+            android:paddingTop="1dp"
+            android:paddingBottom="10dp"/>
+
+        <corners
+            android:radius="9dp"
+            android:bottomRightRadius="8dp"
+            android:bottomLeftRadius="8dp"
+            android:topLeftRadius="0.5dp"
+            android:topRightRadius="0.5dp"/>
+
+</shape>
+
diff --git a/tests/tests/graphics/res/drawable/pass.jpg b/tests/tests/graphics/res/drawable/pass.jpg
new file mode 100644
index 0000000..2f4b083
--- /dev/null
+++ b/tests/tests/graphics/res/drawable/pass.jpg
Binary files differ
diff --git a/tests/tests/graphics/res/drawable/png_test.png b/tests/tests/graphics/res/drawable/png_test.png
new file mode 100644
index 0000000..5230051
--- /dev/null
+++ b/tests/tests/graphics/res/drawable/png_test.png
Binary files differ
diff --git a/tests/tests/graphics/res/drawable/premul_data.png b/tests/tests/graphics/res/drawable/premul_data.png
new file mode 100644
index 0000000..92d7e37
--- /dev/null
+++ b/tests/tests/graphics/res/drawable/premul_data.png
Binary files differ
diff --git a/tests/tests/graphics/res/drawable/progressive_jpeg.jpg b/tests/tests/graphics/res/drawable/progressive_jpeg.jpg
new file mode 100644
index 0000000..6b58be4
--- /dev/null
+++ b/tests/tests/graphics/res/drawable/progressive_jpeg.jpg
Binary files differ
diff --git a/tests/tests/graphics/res/drawable/progressive_restart_jpeg.jpg b/tests/tests/graphics/res/drawable/progressive_restart_jpeg.jpg
new file mode 100644
index 0000000..352c7a8
--- /dev/null
+++ b/tests/tests/graphics/res/drawable/progressive_restart_jpeg.jpg
Binary files differ
diff --git a/tests/tests/graphics/res/drawable/rippledrawable_theme.xml b/tests/tests/graphics/res/drawable/rippledrawable_theme.xml
new file mode 100644
index 0000000..a49b820
--- /dev/null
+++ b/tests/tests/graphics/res/drawable/rippledrawable_theme.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2014 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<ripple xmlns:android="http://schemas.android.com/apk/res/android"
+    android:color="?attr/themeColor" />
diff --git a/tests/assets/images/robot.png b/tests/tests/graphics/res/drawable/robot.png
similarity index 100%
copy from tests/assets/images/robot.png
copy to tests/tests/graphics/res/drawable/robot.png
Binary files differ
diff --git a/tests/tests/graphics/res/drawable/rotatedrawable.xml b/tests/tests/graphics/res/drawable/rotatedrawable.xml
new file mode 100644
index 0000000..b9b2cfe
--- /dev/null
+++ b/tests/tests/graphics/res/drawable/rotatedrawable.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ * Copyright (C) 2009 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ -->
+
+<rotate xmlns:android="http://schemas.android.com/apk/res/android"
+    android:pivotX="50%" android:pivotY="50%"
+    android:fromDegrees="0" android:toDegrees="360"
+    android:drawable="@drawable/testimage"/>
+
diff --git a/tests/tests/graphics/res/drawable/scaled1.png b/tests/tests/graphics/res/drawable/scaled1.png
new file mode 100644
index 0000000..2dad421
--- /dev/null
+++ b/tests/tests/graphics/res/drawable/scaled1.png
Binary files differ
diff --git a/tests/tests/graphics/res/drawable/scaled2.png b/tests/tests/graphics/res/drawable/scaled2.png
new file mode 100644
index 0000000..6d6a94f
--- /dev/null
+++ b/tests/tests/graphics/res/drawable/scaled2.png
Binary files differ
diff --git a/tests/tests/graphics/res/drawable/scaledrawable.xml b/tests/tests/graphics/res/drawable/scaledrawable.xml
new file mode 100644
index 0000000..7e65dce
--- /dev/null
+++ b/tests/tests/graphics/res/drawable/scaledrawable.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ * Copyright (C) 2009 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ -->
+
+<scale xmlns:android="http://schemas.android.com/apk/res/android"
+    android:fromXScale="1.0"
+    android:toXScale="1.4"
+    android:fromYScale="1.0"
+    android:toYScale="0.6"
+    android:drawable="@drawable/testimage"/>
diff --git a/tests/tests/graphics/res/drawable/scenery.jpg b/tests/tests/graphics/res/drawable/scenery.jpg
new file mode 100644
index 0000000..7a6145b
--- /dev/null
+++ b/tests/tests/graphics/res/drawable/scenery.jpg
Binary files differ
diff --git a/tests/tests/graphics/res/drawable/shapedrawable_test.xml b/tests/tests/graphics/res/drawable/shapedrawable_test.xml
new file mode 100644
index 0000000..02da9f8
--- /dev/null
+++ b/tests/tests/graphics/res/drawable/shapedrawable_test.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ * Copyright (C) 2008 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ -->
+
+<MockShapeDrawable xmlns:android="http://schemas.android.com/apk/res/android"
+       android:color="#00000000" android:width="42px" android:height="63px">
+    <padding android:left="1px" android:top="2px" android:right="3px" android:bottom="4px"/>
+    <testattrs android:id="@id/background"/>
+</MockShapeDrawable>
+
diff --git a/tests/tests/graphics/res/drawable/size_48x48.jpg b/tests/tests/graphics/res/drawable/size_48x48.jpg
new file mode 100644
index 0000000..5c2291e
--- /dev/null
+++ b/tests/tests/graphics/res/drawable/size_48x48.jpg
Binary files differ
diff --git a/tests/tests/graphics/res/drawable/start.jpg b/tests/tests/graphics/res/drawable/start.jpg
new file mode 100644
index 0000000..54e05e0
--- /dev/null
+++ b/tests/tests/graphics/res/drawable/start.jpg
Binary files differ
diff --git a/tests/tests/graphics/res/drawable/statelist_testimage.jpg b/tests/tests/graphics/res/drawable/statelist_testimage.jpg
new file mode 100644
index 0000000..754df0c
--- /dev/null
+++ b/tests/tests/graphics/res/drawable/statelist_testimage.jpg
Binary files differ
diff --git a/tests/tests/graphics/res/drawable/statelistdrawable.xml b/tests/tests/graphics/res/drawable/statelistdrawable.xml
new file mode 100644
index 0000000..b867904
--- /dev/null
+++ b/tests/tests/graphics/res/drawable/statelistdrawable.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ * Copyright (C) 2009 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ -->
+
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+   <item android:state_focused="true" android:drawable="@drawable/statelist_testimage"/>
+   <item android:state_enabled="false" android:drawable="@drawable/statelist_testimage"/>
+</selector>
+
diff --git a/tests/tests/graphics/res/drawable/testcolor.xml b/tests/tests/graphics/res/drawable/testcolor.xml
new file mode 100644
index 0000000..d7b2718
--- /dev/null
+++ b/tests/tests/graphics/res/drawable/testcolor.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/*
+ * Copyright (C) 2008 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+-->
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+    <item android:color="#FFA6C839"/>
+</selector>
+
diff --git a/tests/tests/graphics/res/drawable/testimage.jpg b/tests/tests/graphics/res/drawable/testimage.jpg
new file mode 100644
index 0000000..754df0c
--- /dev/null
+++ b/tests/tests/graphics/res/drawable/testimage.jpg
Binary files differ
diff --git a/tests/tests/graphics/res/drawable/transition_test.xml b/tests/tests/graphics/res/drawable/transition_test.xml
new file mode 100644
index 0000000..3d62378
--- /dev/null
+++ b/tests/tests/graphics/res/drawable/transition_test.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+ * Copyright (C) 2008 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+-->
+
+<transition xmlns:android="http://schemas.android.com/apk/res/android" >
+    <item >
+        <color android:color="#ffff0000" />
+    </item>
+
+    <item >
+        <color android:color="#ff0000ff" />
+    </item>
+</transition>
+
diff --git a/tests/tests/graphics/res/drawable/transparent_border.9.png b/tests/tests/graphics/res/drawable/transparent_border.9.png
new file mode 100644
index 0000000..2614c06
--- /dev/null
+++ b/tests/tests/graphics/res/drawable/transparent_border.9.png
Binary files differ
diff --git a/tests/tests/graphics/res/drawable/transparent_right.9.png b/tests/tests/graphics/res/drawable/transparent_right.9.png
new file mode 100644
index 0000000..a438312
--- /dev/null
+++ b/tests/tests/graphics/res/drawable/transparent_right.9.png
Binary files differ
diff --git a/tests/tests/graphics/res/drawable/typeface_test.png b/tests/tests/graphics/res/drawable/typeface_test.png
new file mode 100644
index 0000000..c337f5f
--- /dev/null
+++ b/tests/tests/graphics/res/drawable/typeface_test.png
Binary files differ
diff --git a/tests/tests/graphics/res/drawable/vector_icon_clip_path_1.xml b/tests/tests/graphics/res/drawable/vector_icon_clip_path_1.xml
new file mode 100644
index 0000000..c2ab429
--- /dev/null
+++ b/tests/tests/graphics/res/drawable/vector_icon_clip_path_1.xml
@@ -0,0 +1,71 @@
+<!--
+ Copyright (C) 2014 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+        android:height="64dp"
+        android:width="64dp"
+        android:viewportHeight="12.25"
+        android:viewportWidth="7.30625" >
+
+    <group
+        android:pivotX="3.65"
+        android:pivotY="6.125"
+        android:rotation="-30" >
+        <clip-path
+            android:name="clip1"
+            android:pathData="
+                M 0, 6.125
+                l 7.3, 0
+                l 0, 12.25
+                l -7.3, 0
+                z" />
+    </group>
+    <group>
+        <path
+            android:name="one"
+            android:fillColor="#ff88ff"
+            android:pathData="M 1.215625,9.5l 1.9375,0.0 0.0-6.671875 -2.109375,0.421875 0.0-1.078125
+                l 2.09375-0.421875 1.1874998,0.0 0.0,7.75 1.9375,0.0 0.0,1.0
+                l -5.046875,0.0 0.0-1.0Z" />
+    </group>
+    <group
+        android:pivotX="3.65"
+        android:pivotY="6.125"
+        android:rotation="-30" >
+        <clip-path
+            android:name="clip2"
+            android:pathData="
+                M 0, 0
+                l 7.3, 0
+                l 0, 6.125
+                l -7.3, 0
+                z" />
+    </group>
+    <group>
+        <path
+            android:name="two"
+            android:fillColor="#ff88ff"
+            android:pathData="M 2.534375,9.6875l 4.140625,0.0 0.0,1.0 -5.5625,0.0 0.0-1.0q 0.671875-0.6875 1.828125-1.859375
+                        q 1.1718752-1.1875 1.4687502-1.53125 0.578125-0.625 0.796875-1.0625
+                        q 0.234375-0.453125 0.234375-0.875 0.0-0.703125 -0.5-1.140625
+                        q -0.484375-0.4375 -1.2656252-0.4375 -0.5625,0.0 -1.1875,0.1875
+                        q -0.609375,0.1875 -1.3125,0.59375l 0.0-1.203125q 0.71875-0.28125 1.328125-0.421875
+                        q 0.625-0.15625 1.140625-0.15625 1.3593752,0.0 2.1718752,0.6875
+                        q 0.8125,0.671875 0.8125,1.8125 0.0,0.53125 -0.203125,1.015625
+                        q -0.203125,0.484375 -0.734375,1.140625 -0.15625,0.171875 -0.9375,0.984375
+                        q -0.78125024,0.8125 -2.2187502,2.265625Z" />
+    </group>
+
+</vector>
\ No newline at end of file
diff --git a/tests/tests/graphics/res/drawable/vector_icon_create.xml b/tests/tests/graphics/res/drawable/vector_icon_create.xml
new file mode 100644
index 0000000..7db4ad5
--- /dev/null
+++ b/tests/tests/graphics/res/drawable/vector_icon_create.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+        android:height="64dp"
+        android:width="64dp"
+        android:viewportHeight="24"
+        android:viewportWidth="24" >
+
+    <path
+        android:fillColor="#FF000000"
+        android:pathData="M3.0,17.25L3.0,21.0l3.75,0.0L17.813995,9.936001l-3.75-3.75L3.0,17.25zM20.707,7.0429993c0.391-0.391 0.391-1.023 0.0-1.414l-2.336-2.336c-0.391-0.391-1.023-0.391 -1.414,0.0l-1.832,1.832l3.75,3.75L20.707,7.0429993z" />
+
+</vector>
\ No newline at end of file
diff --git a/tests/tests/graphics/res/drawable/vector_icon_delete.xml b/tests/tests/graphics/res/drawable/vector_icon_delete.xml
new file mode 100644
index 0000000..8d9c21c
--- /dev/null
+++ b/tests/tests/graphics/res/drawable/vector_icon_delete.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+        android:height="64dp"
+        android:width="64dp"
+        android:viewportHeight="24"
+        android:viewportWidth="24" >
+
+    <path
+        android:fillColor="#FF000000"
+        android:pathData="M6.0,19.0c0.0,1.104 0.896,2.0 2.0,2.0l8.0,0.0c1.104,0.0 2.0-0.896 2.0-2.0l0.0-12.0L6.0,7.0L6.0,19.0zM18.0,4.0l-2.5,0.0l-1.0-1.0l-5.0,0.0l-1.0,1.0L6.0,4.0C5.4469986,4.0 5.0,4.4469986 5.0,5.0l0.0,1.0l14.0,0.0l0.0-1.0C19.0,4.4469986 18.552002,4.0 18.0,4.0z" />
+
+</vector>
\ No newline at end of file
diff --git a/tests/tests/graphics/res/drawable/vector_icon_heart.xml b/tests/tests/graphics/res/drawable/vector_icon_heart.xml
new file mode 100644
index 0000000..ff55fe5
--- /dev/null
+++ b/tests/tests/graphics/res/drawable/vector_icon_heart.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+        android:height="64dp"
+        android:width="64dp"
+        android:viewportHeight="24"
+        android:viewportWidth="24" >
+
+    <path
+        android:fillColor="#FF000000"
+        android:pathData="M16.0,5.0c-1.955,0.0 -3.83,1.268 -4.5,3.0c-0.67-1.732 -2.547-3.0 -4.5-3.0C4.4570007,5.0 2.5,6.931999 2.5,9.5c0.0,3.529 3.793,6.258 9.0,11.5c5.207-5.242 9.0-7.971 9.0-11.5C20.5,6.931999 18.543,5.0 16.0,5.0z" />
+
+</vector>
\ No newline at end of file
diff --git a/tests/tests/graphics/res/drawable/vector_icon_random_path_1.xml b/tests/tests/graphics/res/drawable/vector_icon_random_path_1.xml
new file mode 100644
index 0000000..5c55294
--- /dev/null
+++ b/tests/tests/graphics/res/drawable/vector_icon_random_path_1.xml
@@ -0,0 +1,49 @@
+<!--
+ Copyright (C) 2014 The Android Open Source Project
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at"+
+
+http://www.apache.org/licenses/LICENSE-2.0
+
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+        android:height="64dp"
+        android:width="64dp"
+        android:viewportHeight="128"
+        android:viewportWidth="128" >
+
+    <path
+        android:fillColor="#FF00FF00"
+        android:pathData="
+                 m 0.0 0.0
+                 c 58.357853 57.648304 47.260395 2.2044754 3.0 3.0
+                 s 61.29288 10.748665 6.0 6.0
+                 s 0.12015152 45.193787 9.0 9.0
+                 s 32.573513 46.862522 12.0 12.0
+                 C 52.051823 62.050003 14.197739 51.99994 15.0 15.0
+                 S 58.365482 51.877937 18.0 18.0
+                 S 26.692455 3.9604378 21.0 21.0
+                 S 21.433464 52.17514 24.0 24.0
+                 M 27.0 27.0
+                 s 0.77630234 20.606667 30.0 30.0
+                 M 33.0 33.0
+                 S 31.06879 21.506374 36.0 36.0
+                 m 39.0 39.0
+                 s 11.699013 23.684185 42.0 42.0
+                 m 45.0 45.0
+                 S 3.7642136 38.589584 48.0 48.0
+                 Q 27.203026 53.329338 51.0 51.0
+                 s 39.229023 15.1781845 54.0 54.0
+                 Q 47.946877 23.706299 57.0 57.0
+                 S 45.63452 56.15198 60.0 60.0 "
+        android:strokeColor="#FF0000FF"
+        android:strokeWidth="1" />
+
+</vector>
\ No newline at end of file
diff --git a/tests/tests/graphics/res/drawable/vector_icon_random_path_2.xml b/tests/tests/graphics/res/drawable/vector_icon_random_path_2.xml
new file mode 100644
index 0000000..95e0a54
--- /dev/null
+++ b/tests/tests/graphics/res/drawable/vector_icon_random_path_2.xml
@@ -0,0 +1,49 @@
+<!--
+ Copyright (C) 2014 The Android Open Source Project
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at"+
+
+http://www.apache.org/licenses/LICENSE-2.0
+
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+        android:height="64dp"
+        android:width="64dp"
+        android:viewportHeight="128"
+        android:viewportWidth="128" >
+
+    <path
+        android:fillColor="#FF00FF00"
+        android:pathData="
+                 m 0.0 0.0
+                 q 4.7088394 36.956432 3.0 3.0
+                 s 29.470345 16.754963 6.0 6.0
+                 q 20.278355 7.4670525 9.0 9.0
+                 S 30.897224 17.732414 12.0 12.0
+                 T 15.0 15.0
+                 s 63.47204 45.67142 18.0 18.0
+                 T 21.0 21.0
+                 S 0.3184204 24.808247 24.0 24.0
+                 t 27.0 27.0
+                 s 39.02275 38.261158 30.0 30.0
+                 t 33.0 33.0
+                 S 50.709816 16.067192 36.0 36.0
+                 a 62.50911 7.7131805 51.932335 0 0 39.0 39.0
+                 s 5.155651 15.749123 42.0 42.0
+                 a 51.87415 40.30564 49.804344 0 0 45.0 45.0
+                 S 16.16534 62.55986 48.0 48.0
+                 A 39.90161 43.904438 41.642593 1 0 51.0 51.0
+                 s 46.258068 32.12831 54.0 54.0
+                 A 22.962704 55.05604 42.912285 1 1 57.0 57.0
+                 S 36.47731 54.216763 60.0 60.0 "
+        android:strokeColor="#FF0000FF"
+        android:strokeWidth="1" />
+
+</vector>
\ No newline at end of file
diff --git a/tests/tests/graphics/res/drawable/vector_icon_render_order_1.xml b/tests/tests/graphics/res/drawable/vector_icon_render_order_1.xml
new file mode 100644
index 0000000..8639096
--- /dev/null
+++ b/tests/tests/graphics/res/drawable/vector_icon_render_order_1.xml
@@ -0,0 +1,89 @@
+<!--
+ Copyright (C) 2014 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+        android:height="64dp"
+        android:width="64dp"
+        android:viewportHeight="400"
+        android:viewportWidth="400" >
+
+    <group
+        android:name="FirstLevelGroup"
+        android:alpha="0.9"
+        android:translateX="100.0"
+        android:translateY="0.0" >
+        <path
+            android:fillColor="#FFFF0000"
+            android:pathData="@string/rectangle200" />
+
+        <group
+            android:name="SecondLevelGroup1"
+            android:alpha="0.9"
+            android:translateX="-100.0"
+            android:translateY="50.0" >
+            <path
+                android:fillColor="#FF00FF00"
+                android:pathData="@string/rectangle200" />
+
+            <group
+                android:name="ThridLevelGroup1"
+                android:alpha="0.9"
+                android:translateX="-100.0"
+                android:translateY="50.0" >
+                <path
+                    android:fillColor="#FF0000FF"
+                    android:pathData="@string/rectangle200" />
+            </group>
+            <group
+                android:name="ThridLevelGroup2"
+                android:alpha="0.8"
+                android:translateX="100.0"
+                android:translateY="50.0" >
+                <path
+                    android:fillColor="#FF000000"
+                    android:pathData="@string/rectangle200" />
+            </group>
+        </group>
+        <group
+            android:name="SecondLevelGroup2"
+            android:alpha="0.8"
+            android:translateX="100.0"
+            android:translateY="50.0" >
+            <path
+                android:fillColor="#FF0000FF"
+                android:pathData="@string/rectangle200" />
+
+            <group
+                android:name="ThridLevelGroup3"
+                android:alpha="0.9"
+                android:translateX="-100.0"
+                android:translateY="50.0" >
+                <path
+                    android:fillColor="#FFFF0000"
+                    android:pathData="@string/rectangle200" />
+            </group>
+            <group
+                android:name="ThridLevelGroup4"
+                android:alpha="0.8"
+                android:translateX="100.0"
+                android:translateY="50.0" >
+                <path
+                    android:fillColor="#FF00FF00"
+                    android:pathData="@string/rectangle200" />
+            </group>
+        </group>
+    </group>
+
+</vector>
\ No newline at end of file
diff --git a/tests/tests/graphics/res/drawable/vector_icon_render_order_2.xml b/tests/tests/graphics/res/drawable/vector_icon_render_order_2.xml
new file mode 100644
index 0000000..069a531
--- /dev/null
+++ b/tests/tests/graphics/res/drawable/vector_icon_render_order_2.xml
@@ -0,0 +1,89 @@
+<!--
+ Copyright (C) 2014 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+        android:height="64dp"
+        android:width="64dp"
+        android:viewportHeight="400"
+        android:viewportWidth="400" >
+
+    <group
+        android:name="FirstLevelGroup"
+        android:alpha="0.9"
+        android:translateX="100.0"
+        android:translateY="0.0" >
+        <group
+            android:name="SecondLevelGroup1"
+            android:alpha="0.9"
+            android:translateX="-100.0"
+            android:translateY="50.0" >
+            <path
+                android:fillColor="#FF00FF00"
+                android:pathData="@string/rectangle200" />
+
+            <group
+                android:name="ThridLevelGroup1"
+                android:alpha="0.9"
+                android:translateX="-100.0"
+                android:translateY="50.0" >
+                <path
+                    android:fillColor="#FF0000FF"
+                    android:pathData="@string/rectangle200" />
+            </group>
+            <group
+                android:name="ThridLevelGroup2"
+                android:alpha="0.8"
+                android:translateX="100.0"
+                android:translateY="50.0" >
+                <path
+                    android:fillColor="#FF000000"
+                    android:pathData="@string/rectangle200" />
+            </group>
+        </group>
+        <group
+            android:name="SecondLevelGroup2"
+            android:alpha="0.8"
+            android:translateX="100.0"
+            android:translateY="50.0" >
+            <path
+                android:fillColor="#FF0000FF"
+                android:pathData="@string/rectangle200" />
+
+            <group
+                android:name="ThridLevelGroup3"
+                android:alpha="0.9"
+                android:translateX="-100.0"
+                android:translateY="50.0" >
+                <path
+                    android:fillColor="#FFFF0000"
+                    android:pathData="@string/rectangle200" />
+            </group>
+            <group
+                android:name="ThridLevelGroup4"
+                android:alpha="0.8"
+                android:translateX="100.0"
+                android:translateY="50.0" >
+                <path
+                    android:fillColor="#FF00FF00"
+                    android:pathData="@string/rectangle200" />
+            </group>
+        </group>
+
+        <path
+            android:fillColor="#FFFF0000"
+            android:pathData="@string/rectangle200" />
+    </group>
+
+</vector>
\ No newline at end of file
diff --git a/tests/tests/graphics/res/drawable/vector_icon_repeated_a_1.xml b/tests/tests/graphics/res/drawable/vector_icon_repeated_a_1.xml
new file mode 100644
index 0000000..e27464b
--- /dev/null
+++ b/tests/tests/graphics/res/drawable/vector_icon_repeated_a_1.xml
@@ -0,0 +1,43 @@
+<!--
+ Copyright (C) 2014 The Android Open Source Project
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at"+
+
+http://www.apache.org/licenses/LICENSE-2.0
+
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+        android:height="64dp"
+        android:width="64dp"
+        android:viewportHeight="128"
+        android:viewportWidth="128" >
+
+    <path
+        android:fillColor="#FF00FF00"
+        android:pathData="m 45.712063 19.109837
+                H 24.509682
+                a 59.3415 26.877445 22.398209 1 1 3.3506432 1.6524277
+                a 34.922844 36.72583 13.569004 0 0 24.409462 20.931156
+                a 43.47134 32.61542 52.534607 1 0 7.187504 61.509724
+                A 30.621132 41.44202 50.885685 0 0 23.235489 26.638653
+                A 7.251148 15.767811 44.704533 1 1 19.989803 21.33052
+                A 55.645584 46.20288 19.40316 0 1 32.881298 53.410923
+                c 30.649612 4.8525085 21.96682 1.3304634 17.300182 14.747681
+                a 9.375069 44.365055 57.169727 0 0 56.01326 52.59596
+                A 50.071907 37.331825 56.301754 1 0 14.676102 62.04976
+                C 36.531925 4.6217957 47.59332 54.793385 13.562473 13.753647
+                A 2.3695297 42.578487 54.250687 0 1 33.1337 41.511288
+                a 39.4827 38.844944 54.52335 1 1 13.549484 46.81581
+                c 56.943657 51.96854 27.938824 61.148792 24.168636 46.642727
+                "
+        android:strokeColor="#FF0000FF"
+        android:strokeWidth="1" />
+
+</vector>
\ No newline at end of file
diff --git a/tests/tests/graphics/res/drawable/vector_icon_repeated_a_2.xml b/tests/tests/graphics/res/drawable/vector_icon_repeated_a_2.xml
new file mode 100644
index 0000000..924ba1b
--- /dev/null
+++ b/tests/tests/graphics/res/drawable/vector_icon_repeated_a_2.xml
@@ -0,0 +1,45 @@
+<!--
+ Copyright (C) 2014 The Android Open Source Project
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at"+
+
+http://www.apache.org/licenses/LICENSE-2.0
+
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+        android:height="64dp"
+        android:width="64dp"
+        android:viewportHeight="128"
+        android:viewportWidth="128" >
+
+    <path
+        android:fillColor="#FF00FF00"
+        android:pathData="m 45.712063 19.109837
+                H 24.509682
+                A 37.689938 2.3916092 17.462616 1 0 24.958328 48.110596
+                q 45.248383 30.396336 5.777027 3.4086685
+                a 30.966236 62.67946 50.532032 1 0 29.213684 60.63014
+                L 56.16764 8.342098
+                Q 61.172253 1.4613304 4.4721107 38.287144
+                A 6.284897 22.991482 47.409508 1 1 44.10166 60.998764
+                t 36.36881 55.68292
+                a 51.938667 35.22107 22.272938 1 1 28.572739 60.848858
+                A 19.610851 11.569599 51.407906 1 1 56.82705 24.386292
+                T 36.918854 59.542286
+                a 33.191364 10.553429 53.047726 1 0 54.874985 7.409252
+                s 30.186714 42.154182 59.73551 35.50219
+                A 47.9379 5.776497 28.307701 1 1 3.3323975 30.113499
+                a 22.462494 28.096004 55.76455 0 0 25.58981 30.816948
+                S 43.91107 54.679676 19.540264 0.34284973
+                "
+        android:strokeColor="#FF0000FF"
+        android:strokeWidth="1" />
+
+</vector>
\ No newline at end of file
diff --git a/tests/tests/graphics/res/drawable/vector_icon_repeated_cq.xml b/tests/tests/graphics/res/drawable/vector_icon_repeated_cq.xml
new file mode 100644
index 0000000..e0848f0
--- /dev/null
+++ b/tests/tests/graphics/res/drawable/vector_icon_repeated_cq.xml
@@ -0,0 +1,42 @@
+<!--
+ Copyright (C) 2014 The Android Open Source Project
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at"+
+
+http://www.apache.org/licenses/LICENSE-2.0
+
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+        android:height="64dp"
+        android:width="64dp"
+        android:viewportHeight="128"
+        android:viewportWidth="128" >
+
+    <path
+        android:fillColor="#FF00FF00"
+        android:pathData="m 30.81895 41.37989
+                v 31.00579
+                c 24.291603 52.03364 40.6086 24.840137 29.56704 6.5204926
+                45.133224 22.913471 33.052887 21.727486 33.369 61.60278
+                9.647232 22.098152 48.939598 47.470215 53.653687 62.32235
+                C 2.0560722 1.4615479 7.0928993 26.005287 40.137558 36.75628
+                11.246731 32.178127 59.367462 60.34823 57.254383 37.357815
+                47.75605 11.424667 3.3105545 51.886635 56.63027 17.12133
+                q 28.37534 32.85535 25.85654 33.57151
+                10.356537 51.850616 54.085087 35.653175
+                12.530029 52.87991 17.44696 11.780586
+                Q 2.585228 51.92801 60.000664 56.79912
+                54.18275 51.500694 9.375679 23.836113
+                60.35329 59.026245 31.058632 35.14934
+                "
+        android:strokeColor="#FF0000FF"
+        android:strokeWidth="1" />
+
+</vector>
\ No newline at end of file
diff --git a/tests/tests/graphics/res/drawable/vector_icon_repeated_st.xml b/tests/tests/graphics/res/drawable/vector_icon_repeated_st.xml
new file mode 100644
index 0000000..b104349
--- /dev/null
+++ b/tests/tests/graphics/res/drawable/vector_icon_repeated_st.xml
@@ -0,0 +1,42 @@
+<!--
+ Copyright (C) 2014 The Android Open Source Project
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at"+
+
+http://www.apache.org/licenses/LICENSE-2.0
+
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+        android:height="64dp"
+        android:width="64dp"
+        android:viewportHeight="128"
+        android:viewportWidth="128" >
+
+    <path
+        android:fillColor="#FF00FF00"
+        android:pathData="m 20.20005 8.139153
+                h 10.053165
+                s 14.2943 49.612846 35.520653 54.904068
+                50.1405 17.044182 5.470337 40.180553
+                3.125019 34.221123 53.212563 32.862965
+                S 35.985264 35.74349 0.15337753 59.27337
+                2.2951508 44.56783 51.089413 29.829689
+                8.5599785 22.649555 4.3914986 28.139206
+                t 11.932453 44.041077
+                62.629326 7.40921
+                23.302986 54.116184
+                T 43.560753 63.370514
+                40.156204 17.60786
+                40.12051 60.803394
+                "
+        android:strokeColor="#FF0000FF"
+        android:strokeWidth="1" />
+
+</vector>
\ No newline at end of file
diff --git a/tests/tests/graphics/res/drawable/vector_icon_schedule.xml b/tests/tests/graphics/res/drawable/vector_icon_schedule.xml
new file mode 100644
index 0000000..64d19e8
--- /dev/null
+++ b/tests/tests/graphics/res/drawable/vector_icon_schedule.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+        android:height="64dp"
+        android:width="64dp"
+        android:viewportHeight="24"
+        android:viewportWidth="24" >
+
+    <path
+        android:fillColor="#E6000000"
+        android:pathData="M11.994999,2.0C6.4679985,2.0 2.0,6.4780006 2.0,12.0s4.468,10.0 9.995,10.0S22.0,17.522 22.0,12.0S17.521,2.0 11.994999,2.0zM12.0,20.0c-4.42,0.0 -8.0-3.582-8.0-8.0s3.58-8.0 8.0-8.0s8.0,3.582 8.0,8.0S16.419998,20.0 12.0,20.0z" />
+    <path
+        android:fillColor="#E6000000"
+        android:pathData="M12.5,6.0l-1.5,0.0 0.0,7.0 5.3029995,3.1819992 0.75-1.249999-4.5529995-2.7320004z" />
+
+</vector>
\ No newline at end of file
diff --git a/tests/tests/graphics/res/drawable/vector_icon_settings.xml b/tests/tests/graphics/res/drawable/vector_icon_settings.xml
new file mode 100644
index 0000000..13d7f05
--- /dev/null
+++ b/tests/tests/graphics/res/drawable/vector_icon_settings.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+        android:height="64dp"
+        android:width="64dp"
+        android:viewportHeight="24"
+        android:viewportWidth="24" >
+
+    <path
+        android:fillColor="#FF000000"
+        android:pathData="M19.429,12.975998c0.042-0.32 0.07-0.645 0.07-0.976s-0.029-0.655-0.07-0.976l2.113-1.654c0.188-0.151 0.243-0.422 0.118-0.639l-2.0-3.463c-0.125-0.217-0.386-0.304-0.612-0.218l-2.49,1.004c-0.516-0.396-1.081-0.731-1.69-0.984l-0.375-2.648C14.456,2.1829987 14.25,2.0 14.0,2.0l-4.0,0.0C9.75,2.0 9.544,2.1829987 9.506,2.422001L9.131,5.0699997C8.521,5.322998 7.957,5.6570015 7.44,6.054001L4.952,5.0509987C4.726,4.965 4.464,5.052002 4.34,5.269001l-2.0,3.463C2.2150002,8.947998 2.27,9.219002 2.4580002,9.369999l2.112,1.653C4.528,11.344002 4.5,11.668999 4.5,12.0s0.029,0.656 0.071,0.977L2.4580002,14.630001c-0.188,0.151-0.243,0.422-0.118,0.639l2.0,3.463c0.125,0.217 0.386,0.304 0.612,0.218l2.489-1.004c0.516,0.396 1.081,0.731 1.69,0.984l0.375,2.648C9.544,21.817001 9.75,22.0 10.0,22.0l4.0,0.0c0.25,0.0 0.456-0.183 0.494-0.422l0.375-2.648c0.609-0.253 1.174-0.588 1.689-0.984l2.49,1.004c0.226,0.086 0.487-0.001 0.612-0.218l2.0-3.463c0.125-0.217 0.07-0.487-0.118-0.639L19.429,12.975998zM12.0,16.0c-2.21,0.0-4.0-1.791-4.0-4.0c0.0-2.21 1.79-4.0 4.0-4.0c2.208,0.0 4.0,1.79 4.0,4.0C16.0,14.209 14.208,16.0 12.0,16.0z" />
+
+</vector>
\ No newline at end of file
diff --git a/tests/tests/graphics/res/drawable/vector_icon_stroke_1.xml b/tests/tests/graphics/res/drawable/vector_icon_stroke_1.xml
new file mode 100644
index 0000000..af351f1
--- /dev/null
+++ b/tests/tests/graphics/res/drawable/vector_icon_stroke_1.xml
@@ -0,0 +1,46 @@
+<!--
+ Copyright (C) 2014 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:height="64dp"
+    android:viewportHeight="200"
+    android:viewportWidth="200"
+    android:width="64dp" >
+
+    <group>
+        <path
+            android:name="background1"
+            android:fillColor="#FF000000"
+            android:pathData="M 0,0 l 100,0 l 0, 100 l -100, 0 z" />
+        <path
+            android:name="background2"
+            android:fillColor="#FF000000"
+            android:pathData="M 100,100 l 100,0 l 0, 100 l -100, 0 z" />
+    </group>
+    <group
+        android:translateX="50"
+        android:translateY="50" >
+        <path
+            android:name="twoLines"
+            android:pathData="M 100,20 l 0 80 l -30 -80"
+            android:fillColor="#FF000000"
+            android:strokeColor="#FF00FF00"
+            android:strokeLineCap="butt"
+            android:strokeLineJoin="miter"
+            android:strokeMiterLimit="6"
+            android:strokeWidth="20" />
+    </group>
+
+</vector>
\ No newline at end of file
diff --git a/tests/tests/graphics/res/drawable/vector_icon_stroke_2.xml b/tests/tests/graphics/res/drawable/vector_icon_stroke_2.xml
new file mode 100644
index 0000000..f85d5fc
--- /dev/null
+++ b/tests/tests/graphics/res/drawable/vector_icon_stroke_2.xml
@@ -0,0 +1,46 @@
+<!--
+ Copyright (C) 2014 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:height="64dp"
+    android:viewportHeight="200"
+    android:viewportWidth="200"
+    android:width="64dp" >
+
+    <group>
+        <path
+            android:name="background1"
+            android:fillColor="#FF000000"
+            android:pathData="M 0,0 l 100,0 l 0, 100 l -100, 0 z" />
+        <path
+            android:name="background2"
+            android:fillColor="#FF000000"
+            android:pathData="M 100,100 l 100,0 l 0, 100 l -100, 0 z" />
+    </group>
+    <group
+        android:translateX="50"
+        android:translateY="50" >
+        <path
+            android:name="twoLines"
+            android:pathData="M 100,20 l 0 80 l -30 -80"
+            android:fillColor="#FF000000"
+            android:strokeColor="#FF00FF00"
+            android:strokeLineCap="round"
+            android:strokeLineJoin="round"
+            android:strokeMiterLimit="10"
+            android:strokeWidth="20" />
+    </group>
+
+</vector>
\ No newline at end of file
diff --git a/tests/tests/graphics/res/drawable/vector_icon_stroke_3.xml b/tests/tests/graphics/res/drawable/vector_icon_stroke_3.xml
new file mode 100644
index 0000000..8f3d47e
--- /dev/null
+++ b/tests/tests/graphics/res/drawable/vector_icon_stroke_3.xml
@@ -0,0 +1,46 @@
+<!--
+ Copyright (C) 2014 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:height="64dp"
+    android:viewportHeight="200"
+    android:viewportWidth="200"
+    android:width="64dp" >
+
+    <group>
+        <path
+            android:name="background1"
+            android:fillColor="#FF000000"
+            android:pathData="M 0,0 l 100,0 l 0, 100 l -100, 0 z" />
+        <path
+            android:name="background2"
+            android:fillColor="#FF000000"
+            android:pathData="M 100,100 l 100,0 l 0, 100 l -100, 0 z" />
+    </group>
+    <group
+        android:translateX="50"
+        android:translateY="50" >
+        <path
+            android:name="twoLines"
+            android:pathData="M 100,20 l 0 80 l -30 -80"
+            android:fillColor="#FF000000"
+            android:strokeColor="#FF00FF00"
+            android:strokeLineCap="square"
+            android:strokeLineJoin="bevel"
+            android:strokeMiterLimit="10"
+            android:strokeWidth="20" />
+    </group>
+
+</vector>
\ No newline at end of file
diff --git a/tests/tests/graphics/res/drawable/vector_icon_transformation_1.xml b/tests/tests/graphics/res/drawable/vector_icon_transformation_1.xml
new file mode 100644
index 0000000..f6623d0
--- /dev/null
+++ b/tests/tests/graphics/res/drawable/vector_icon_transformation_1.xml
@@ -0,0 +1,38 @@
+<!--
+ Copyright (C) 2014 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+        android:height="64dp"
+        android:width="64dp"
+        android:viewportHeight="500"
+        android:viewportWidth="800" >
+
+    <group
+        android:pivotX="90"
+        android:pivotY="100"
+        android:rotation="20">
+        <path
+            android:name="pie2"
+            android:pathData="M200,350 l 50,-25
+           a25,12 -30 0,1 100,-50 l 50,-25
+           a25,25 -30 0,1 100,-50 l 50,-25
+           a25,37 -30 0,1 100,-50 l 50,-25
+           a25,50 -30 0,1 100,-50 l 50,-25"
+           android:fillColor="#00000000"
+            android:strokeColor="#FF00FF00"
+            android:strokeWidth="10" />
+    </group>
+
+</vector>
diff --git a/tests/tests/graphics/res/drawable/vector_icon_transformation_2.xml b/tests/tests/graphics/res/drawable/vector_icon_transformation_2.xml
new file mode 100644
index 0000000..87da0bb
--- /dev/null
+++ b/tests/tests/graphics/res/drawable/vector_icon_transformation_2.xml
@@ -0,0 +1,48 @@
+<!--
+ Copyright (C) 2014 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+        android:height="64dp"
+        android:width="64dp"
+        android:viewportHeight="200"
+        android:viewportWidth="200" >
+
+    <group>
+        <path
+            android:name="background1"
+            android:pathData="M 0,0 l 100,0 l 0, 100 l -100, 0 z"
+            android:fillColor="#FF000000"/>
+        <path
+            android:name="background2"
+            android:pathData="M 100,100 l 100,0 l 0, 100 l -100, 0 z"
+            android:fillColor="#FF000000"/>
+    </group>
+    <group
+        android:pivotX="100"
+        android:pivotY="100"
+        android:rotation="90"
+        android:scaleX="0.75"
+        android:scaleY="0.5"
+        android:translateX="0.0"
+        android:translateY="100.0">
+        <path
+            android:name="twoLines"
+            android:pathData="M 100,10 v 90 M 10,100 h 90"
+            android:fillColor="#00000000"
+            android:strokeColor="#FF00FF00"
+            android:strokeWidth="10" />
+    </group>
+
+</vector>
\ No newline at end of file
diff --git a/tests/tests/graphics/res/drawable/vector_icon_transformation_3.xml b/tests/tests/graphics/res/drawable/vector_icon_transformation_3.xml
new file mode 100644
index 0000000..fc30af3
--- /dev/null
+++ b/tests/tests/graphics/res/drawable/vector_icon_transformation_3.xml
@@ -0,0 +1,48 @@
+<!--
+ Copyright (C) 2014 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+        android:height="64dp"
+        android:width="64dp"
+        android:viewportHeight="200"
+        android:viewportWidth="200" >
+
+    <group>
+        <path
+            android:name="background1"
+            android:pathData="M 0,0 l 100,0 l 0, 100 l -100, 0 z"
+            android:fillColor="#FF000000"/>
+        <path
+            android:name="background2"
+            android:pathData="M 100,100 l 100,0 l 0, 100 l -100, 0 z"
+            android:fillColor="#FF000000"/>
+    </group>
+    <group
+        android:pivotX="0"
+        android:pivotY="0"
+        android:rotation="90"
+        android:scaleX="0.75"
+        android:scaleY="0.5"
+        android:translateX="100.0"
+        android:translateY="100.0">
+        <path
+            android:name="twoLines"
+            android:pathData="M 100,10 v 90 M 10,100 h 90"
+            android:fillColor="#00000000"
+            android:strokeColor="#FF00FF00"
+            android:strokeWidth="10" />
+    </group>
+
+</vector>
\ No newline at end of file
diff --git a/tests/tests/graphics/res/drawable/vector_icon_transformation_4.xml b/tests/tests/graphics/res/drawable/vector_icon_transformation_4.xml
new file mode 100644
index 0000000..5b40d0d
--- /dev/null
+++ b/tests/tests/graphics/res/drawable/vector_icon_transformation_4.xml
@@ -0,0 +1,68 @@
+<!--
+ Copyright (C) 2014 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+        android:height="64dp"
+        android:width="64dp"
+        android:viewportHeight="400"
+        android:viewportWidth="400" >
+
+    <group android:name="backgroundGroup" >
+        <path
+            android:name="background1"
+            android:fillColor="#80000000"
+            android:pathData="M 0,0 l 200,0 l 0, 200 l -200, 0 z" />
+        <path
+            android:name="background2"
+            android:fillColor="#80000000"
+            android:pathData="M 200,200 l 200,0 l 0, 200 l -200, 0 z" />
+    </group>
+    <group
+        android:name="translateToCenterGroup"
+        android:translateX="50.0"
+        android:translateY="90.0" >
+        <path
+            android:name="twoLines"
+            android:pathData="M 0,0 v 100 M 0,0 h 100"
+            android:strokeColor="#FFFF0000"
+            android:strokeWidth="20" />
+
+        <group
+            android:name="rotationGroup"
+            android:pivotX="0.0"
+            android:pivotY="0.0"
+            android:rotation="-45.0" >
+            <path
+                android:name="twoLines1"
+                android:pathData="M 0,0 v 100 M 0,0 h 100"
+                android:strokeColor="#FF00FF00"
+                android:strokeWidth="20" />
+
+            <group
+                android:name="translateGroup"
+                android:translateX="130.0"
+                android:translateY="160.0" >
+                <group android:name="scaleGroup" >
+                    <path
+                        android:name="twoLines2"
+                        android:pathData="M 0,0 v 100 M 0,0 h 100"
+                        android:strokeColor="#FF0000FF"
+                        android:strokeWidth="20" />
+                </group>
+            </group>
+        </group>
+    </group>
+
+</vector>
\ No newline at end of file
diff --git a/tests/tests/graphics/res/drawable/vector_icon_transformation_5.xml b/tests/tests/graphics/res/drawable/vector_icon_transformation_5.xml
new file mode 100644
index 0000000..4a27754
--- /dev/null
+++ b/tests/tests/graphics/res/drawable/vector_icon_transformation_5.xml
@@ -0,0 +1,81 @@
+<!--
+ Copyright (C) 2014 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+        android:height="64dp"
+        android:width="64dp"
+        android:viewportHeight="400"
+        android:viewportWidth="400" >
+
+    <group android:name="backgroundGroup" >
+        <path
+            android:name="background1"
+            android:fillColor="#80000000"
+            android:pathData="M 0,0 l 200,0 l 0, 200 l -200, 0 z" />
+        <path
+            android:name="background2"
+            android:fillColor="#80000000"
+            android:pathData="M 200,200 l 200,0 l 0, 200 l -200, 0 z" />
+    </group>
+    <group
+        android:name="translateToCenterGroup"
+        android:translateX="50.0"
+        android:translateY="90.0" >
+        <path
+            android:name="twoLines"
+            android:pathData="M 0,0 v 150 M 0,0 h 150"
+            android:strokeColor="#FFFF0000"
+            android:strokeWidth="20" />
+
+        <group
+            android:name="rotationGroup"
+            android:pivotX="0.0"
+            android:pivotY="0.0"
+            android:rotation="-45.0" >
+            <path
+                android:name="twoLines1"
+                android:pathData="M 0,0 v 100 M 0,0 h 100"
+                android:strokeColor="#FF00FF00"
+                android:strokeWidth="20" />
+
+            <group
+                android:name="translateGroup"
+                android:translateX="130.0"
+                android:translateY="160.0" >
+                <group android:name="scaleGroup" >
+                    <path
+                        android:name="twoLines3"
+                        android:pathData="M 0,0 v 100 M 0,0 h 100"
+                        android:strokeColor="#FF0000FF"
+                        android:strokeWidth="20" />
+                </group>
+            </group>
+
+            <group
+                android:name="translateGroupHalf"
+                android:translateX="65.0"
+                android:translateY="80.0" >
+                <group android:name="scaleGroup" >
+                    <path
+                        android:name="twoLines2"
+                        android:pathData="M 0,0 v 100 M 0,0 h 100"
+                        android:strokeColor="#FF0000FF"
+                        android:strokeWidth="20" />
+                </group>
+            </group>
+        </group>
+    </group>
+
+</vector>
\ No newline at end of file
diff --git a/tests/tests/graphics/res/drawable/vector_icon_transformation_6.xml b/tests/tests/graphics/res/drawable/vector_icon_transformation_6.xml
new file mode 100644
index 0000000..5e60c4a
--- /dev/null
+++ b/tests/tests/graphics/res/drawable/vector_icon_transformation_6.xml
@@ -0,0 +1,86 @@
+<!--
+ Copyright (C) 2014 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+        android:height="64dp"
+        android:width="64dp"
+        android:viewportHeight="400"
+        android:viewportWidth="400" >
+
+    <group android:name="backgroundGroup"
+        android:alpha = "0.5" >
+        <path
+            android:name="background1"
+            android:fillColor="#FF000000"
+            android:pathData="M 0,0 l 200,0 l 0, 200 l -200, 0 z" />
+        <path
+            android:name="background2"
+            android:fillColor="#FF000000"
+            android:pathData="M 200,200 l 200,0 l 0, 200 l -200, 0 z" />
+    </group>
+    <group
+        android:name="translateToCenterGroup"
+        android:translateX="50.0"
+        android:translateY="90.0"
+        android:alpha = "0.5" >
+        <path
+            android:name="twoLines"
+            android:pathData="M 0,0 v 100 M 0,0 h 100"
+            android:strokeColor="#FFFF0000"
+            android:strokeWidth="20" />
+
+        <group
+            android:name="rotationGroup"
+            android:pivotX="0.0"
+            android:pivotY="0.0"
+            android:rotation="-45.0"
+            android:alpha = "0.5" >
+            <path
+                android:name="twoLines1"
+                android:pathData="M 0,0 v 100 M 0,0 h 100"
+                android:strokeColor="#FF00FF00"
+                android:strokeWidth="20" />
+
+            <group
+                android:name="translateGroup"
+                android:translateX="130.0"
+                android:translateY="160.0"
+                android:alpha = "0.5">
+                <group android:name="scaleGroup" >
+                    <path
+                        android:name="twoLines3"
+                        android:pathData="M 0,0 v 100 M 0,0 h 100"
+                        android:strokeColor="#FF0000FF"
+                        android:strokeWidth="20" />
+                </group>
+            </group>
+
+            <group
+                android:name="translateGroupHalf"
+                android:translateX="65.0"
+                android:translateY="80.0"
+                android:alpha = "0.5">
+                <group android:name="scaleGroup" >
+                    <path
+                        android:name="twoLines2"
+                        android:pathData="M 0,0 v 100 M 0,0 h 100"
+                        android:strokeColor="#FF0000FF"
+                        android:strokeWidth="20" />
+                </group>
+            </group>
+        </group>
+    </group>
+
+</vector>
\ No newline at end of file
diff --git a/tests/tests/graphics/res/drawable/webp_test.webp b/tests/tests/graphics/res/drawable/webp_test.webp
new file mode 100644
index 0000000..7b1009f
--- /dev/null
+++ b/tests/tests/graphics/res/drawable/webp_test.webp
Binary files differ
diff --git a/tests/tests/graphics/res/drawable/window_test_drawable.xml b/tests/tests/graphics/res/drawable/window_test_drawable.xml
new file mode 100644
index 0000000..4281cd8
--- /dev/null
+++ b/tests/tests/graphics/res/drawable/window_test_drawable.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ * Copyright (C) 2009 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ -->
+
+<shape xmlns:android="http://schemas.android.com/apk/res/android">
+    <solid android:color="#00000000"/>
+    <stroke android:width="2dp" android:color="#ff000000"/>
+    <padding android:left="1dp" android:top="1dp"
+            android:right="1dp" android:bottom="1dp" />
+</shape>
diff --git a/tests/tests/graphics/res/layout/framelayout_layout.xml b/tests/tests/graphics/res/layout/framelayout_layout.xml
new file mode 100644
index 0000000..78b7b47
--- /dev/null
+++ b/tests/tests/graphics/res/layout/framelayout_layout.xml
@@ -0,0 +1,58 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ * Copyright (C) 2008 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ -->
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+                android:id="@+id/framelayout_container"
+                android:background="@drawable/red"
+                android:layout_width="match_parent"
+                android:layout_height="match_parent"
+                android:layout_gravity="bottom"
+                android:orientation="vertical">
+
+    <FrameLayout
+        android:layout_width="100dip"
+        android:layout_height="100dip"
+        android:background="@drawable/yellow"
+        android:id="@+id/framelayout">
+    </FrameLayout>
+
+    <FrameLayout
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:background="@drawable/yellow"
+        android:id="@+id/framelayout_measureall">
+
+        <TextView android:id="@+id/framelayout_textview"
+            android:background="@drawable/blue"
+            android:layout_width="60dip"
+            android:layout_height="30dip"
+            android:text="@string/hello_world"/>
+
+        <Button android:id="@+id/framelayout_button"
+            android:layout_width="50dip"
+            android:layout_height="15dip"
+            android:text="@string/go"/>
+
+    </FrameLayout>
+
+    <FrameLayout
+        android:id="@+id/foreground_tint"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:foregroundTint="@android:color/white"
+        android:foregroundTintMode="src_over" />
+
+</LinearLayout>
diff --git a/tests/tests/graphics/res/layout/imageview_layout.xml b/tests/tests/graphics/res/layout/imageview_layout.xml
new file mode 100644
index 0000000..e56a9c9
--- /dev/null
+++ b/tests/tests/graphics/res/layout/imageview_layout.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+ * Copyright (C) 2008 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+-->
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:orientation="vertical"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent">
+
+    <ImageView
+        android:id="@+id/imageview"
+        android:layout_width="320px"
+        android:layout_height="240px"/>
+
+    <ImageView
+        android:id="@+id/image_tint"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:tint="@android:color/white"
+        android:tintMode="src_over" />
+
+</LinearLayout>
+
diff --git a/tests/tests/graphics/res/raw/basetex.png b/tests/tests/graphics/res/raw/basetex.png
new file mode 100644
index 0000000..c47a8a5
--- /dev/null
+++ b/tests/tests/graphics/res/raw/basetex.png
Binary files differ
diff --git a/tests/tests/graphics/res/raw/ddstex.dds b/tests/tests/graphics/res/raw/ddstex.dds
new file mode 100644
index 0000000..a865693
--- /dev/null
+++ b/tests/tests/graphics/res/raw/ddstex.dds
Binary files differ
diff --git a/tests/tests/graphics/res/raw/pvrtex.pvr b/tests/tests/graphics/res/raw/pvrtex.pvr
new file mode 100644
index 0000000..c92962d
--- /dev/null
+++ b/tests/tests/graphics/res/raw/pvrtex.pvr
Binary files differ
diff --git a/tests/tests/graphics/res/raw/testimage.jpg b/tests/tests/graphics/res/raw/testimage.jpg
new file mode 100644
index 0000000..d3dae03
--- /dev/null
+++ b/tests/tests/graphics/res/raw/testimage.jpg
Binary files differ
diff --git a/tests/tests/graphics/res/values/arrays.xml b/tests/tests/graphics/res/values/arrays.xml
new file mode 100644
index 0000000..71e0133
--- /dev/null
+++ b/tests/tests/graphics/res/values/arrays.xml
@@ -0,0 +1,57 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ * Copyright (C) 2008 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ -->
+
+<resources>
+    <item type="integer" name="reference" format="integer">101</item>
+
+      <string-array name="strings">
+        <item>zero</item>
+        <item>1</item>
+        <item>@string/reference</item>
+    </string-array>
+
+    <integer-array name="integers">
+        <item>0</item>
+        <item>1</item>
+        <item>@integer/reference</item>
+    </integer-array>
+
+    <array name="difficultyLevel">
+        <item>Easy</item>
+        <item>Medium</item>
+        <item>Hard</item>
+    </array>
+
+    <string-array name="string">
+        <item>Test String 1</item>
+        <item>Test String 2</item>
+        <item>Test String 3</item>
+    </string-array>
+
+    <integer-array name="table_row_layout">
+        <item>1</item>
+        <item>2</item>
+        <item>3</item>
+        <item>4</item>
+        <item>5</item>
+        <item>6</item>
+        <item>7</item>
+        <item>8</item>
+        <item>9</item>
+        <item>10</item>
+    </integer-array>
+</resources>
diff --git a/tests/tests/graphics/res/values/attrs.xml b/tests/tests/graphics/res/values/attrs.xml
new file mode 100644
index 0000000..4c3d9db
--- /dev/null
+++ b/tests/tests/graphics/res/values/attrs.xml
@@ -0,0 +1,145 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ * Copyright (C) 2008 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ -->
+
+<resources>
+    <declare-styleable name="Style1">
+        <attr name="Type1" format="integer">
+            <enum name="type" value="28" />
+            <enum name="data" value="0xff00ff00" />
+            <enum name="asset_cookie" value="0" />
+            <enum name="resource_id" value="0" />
+            <enum name="changing_config" value="0" />
+        </attr>
+        <attr name="Type2" format="integer">
+            <enum name="type" value="28" />
+            <enum name="data" value="0xff0000ff" />
+            <enum name="asset_cookie" value="0" />
+            <enum name="resource_id" value="0" />
+            <enum name="changing_config" value="0" />
+        </attr>
+    </declare-styleable>
+    <attr name="type1" format="boolean"/>
+    <attr name="type2" format="boolean"/>
+    <attr name="type3" format="color"/>
+    <attr name="type4" format="reference|color"/>
+    <attr name="type5" format="dimension"/>
+    <attr name="type6" format="dimension"/>
+    <attr name="type7" format="dimension"/>
+    <attr name="type8" format="reference"/>
+    <attr name="type9" format="float"/>
+    <attr name="type10" format="fraction"/>
+    <attr name="type11" format="integer"/>
+    <attr name="type12" format="integer"/>
+    <attr name="type13" format="reference|string"/>
+    <attr name="type14" format="string"/>
+    <attr name="type15" format="reference"/>
+    <attr name="type16" format="string"/>
+    <declare-styleable name="style1">
+        <attr name="type1"/>
+        <attr name="type2"/>
+        <attr name="type3"/>
+        <attr name="type4"/>
+        <attr name="type5"/>
+        <attr name="type6"/>
+        <attr name="type7"/>
+        <attr name="type8"/>
+        <attr name="type9"/>
+        <attr name="type10"/>
+        <attr name="type11"/>
+        <attr name="type12"/>
+        <attr name="type13"/>
+        <attr name="type14"/>
+        <attr name="type15"/>
+        <attr name="type16"/>
+    </declare-styleable>
+    <attr name="testEnum">
+        <enum name="val1" value="1" />
+        <enum name="val2" value="2" />
+        <enum name="val10" value="10" />
+    </attr>
+    <attr name="testFlags">
+        <flag name="bit1" value="0x1" />
+        <flag name="bit2" value="0x2" />
+        <flag name="bit31" value="0x40000000" />
+    </attr>
+    <attr name="testString" format="string" />
+    <declare-styleable name="EnumStyle">
+        <attr name="testEnum" />
+    </declare-styleable>
+    <declare-styleable name="FlagStyle">
+        <attr name="testFlags" />
+    </declare-styleable>
+    <declare-styleable name="TestConfig">
+        <attr name="testString" />
+    </declare-styleable>
+    <!-- Size of text. Recommended dimension type for text is "sp" for scaled-pixels (example: 15sp).
+         Supported values include the following:<p/>
+    <ul>
+        <li><b>px</b> Pixels</li>
+        <li><b>sp</b> Scaled pixels (scaled to relative pixel size on screen). See {@link android.util.DisplayMetrics} for more information.</li>
+        <li><b>pt</b> Points</li>
+        <li><b>dip</b> Device independent pixels. See {@link android.util.DisplayMetrics} for more information.</li>
+    </ul>
+    -->
+    <attr name="textSize" format="dimension" />
+    <attr name="typeface">
+        <enum name="normal" value="0" />
+        <enum name="sans" value="1" />
+        <enum name="serif" value="2" />
+        <enum name="monospace" value="3" />
+    </attr>
+    <!-- Default text typeface style. -->
+    <attr name="textStyle">
+        <flag name="normal" value="0" />
+        <flag name="bold" value="1" />
+        <flag name="italic" value="2" />
+    </attr>
+    <!-- Color of text (usually same as colorForeground). -->
+    <attr name="textColor" format="reference|color" />
+    <!-- Color of highlighted text. -->
+    <attr name="textColorHighlight" format="reference|color" />
+    <!-- Color of hint text (displayed when the field is empty). -->
+    <attr name="textColorHint" format="reference|color" />
+    <!-- Color of link text (URLs). -->
+    <attr name="textColorLink" format="reference|color" />
+    <declare-styleable name="TextAppearance">
+        <attr name="textColor"/>
+        <attr name="textSize"/>
+        <attr name="textStyle"/>
+        <attr name="typeface"/>
+        <attr name="textColorHighlight"/>
+        <attr name="textColorHint"/>
+        <attr name="textColorLink"/>
+    </declare-styleable>
+    <!-- Integer used to uniquely identify theme overrides. -->
+    <attr name="themeType" format="integer"/>
+    <!-- Theme reference used to override parent theme. -->
+    <attr name="themeOverrideAttr" format="reference"/>
+
+    <!-- Drawable theming attributes -->
+    <attr name="themeBoolean" />
+    <attr name="themeColor" />
+    <attr name="themeFloat" />
+    <attr name="themeInteger" />
+    <attr name="themeDimension" />
+    <attr name="themeDrawable" />
+    <attr name="themeBitmap" />
+    <attr name="themeNinePatch" />
+    <attr name="themeGravity" />
+    <attr name="themeTileMode" />
+    <attr name="themeAngle" />
+</resources>
diff --git a/tests/tests/graphics/res/values/bools.xml b/tests/tests/graphics/res/values/bools.xml
new file mode 100755
index 0000000..f119cda
--- /dev/null
+++ b/tests/tests/graphics/res/values/bools.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ * Copyright (C) 2008 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ -->
+
+<resources>
+	<bool name="trueRes">true</bool>
+	<bool name="falseRes">false</bool>
+</resources>
diff --git a/tests/tests/graphics/res/values/colors.xml b/tests/tests/graphics/res/values/colors.xml
new file mode 100644
index 0000000..f3cc325
--- /dev/null
+++ b/tests/tests/graphics/res/values/colors.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ * Copyright (C) 2008 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ -->
+
+<resources>
+    <drawable name="red">#7f00</drawable>
+    <drawable name="blue">#770000ff</drawable>
+    <drawable name="black">#77ffffff</drawable>
+    <drawable name="yellow">#77ffff00</drawable>
+    <color name="testcolor1">#ff00ff00</color>
+    <color name="testcolor2">#ffff0000</color>
+    <color name="failColor">#ff0000ff</color>
+</resources>
diff --git a/tests/tests/graphics/res/values/configVarying.xml b/tests/tests/graphics/res/values/configVarying.xml
new file mode 100755
index 0000000..7b7d576
--- /dev/null
+++ b/tests/tests/graphics/res/values/configVarying.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<resources>
+    <item type="configVarying" name="simple">simple default</item>
+    <bag type="configVarying" name="bag">
+        <item name="testString">bag default</item>
+    </bag>
+    <item type="configVarying" name="small">default</item>
+    <item type="configVarying" name="normal">default</item>
+    <item type="configVarying" name="large">default</item>
+    <item type="configVarying" name="xlarge">default</item>
+    <item type="configVarying" name="sw">default</item>
+    <item type="configVarying" name="w">default</item>
+    <item type="configVarying" name="h">default</item>
+    <item type="configVarying" name="wh">default</item>
+</resources>
diff --git a/tests/tests/graphics/res/values/dimens.xml b/tests/tests/graphics/res/values/dimens.xml
new file mode 100755
index 0000000..bae216f
--- /dev/null
+++ b/tests/tests/graphics/res/values/dimens.xml
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ * Copyright (C) 2008 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ -->
+
+<resources>
+    <item name="frac100perc" type="dimen" format="fraction">100%</item>
+    <item name="frac1perc" type="dimen" format="fraction">1%</item>
+    <item name="fracp1perc" type="dimen" format="fraction">.1%</item>
+    <item name="fracp01perc" type="dimen" format="fraction">.01%</item>
+    <item name="frac0perc" type="dimen" format="fraction">0%</item>
+    <item name="frac1p1perc" type="dimen" format="fraction">1.1%</item>
+    <item name="frac100p1perc" type="dimen" format="fraction">100.1%</item>
+    <item name="frac25510perc" type="dimen" format="fraction">25510%</item>
+    <item name="frac25610perc" type="dimen" format="fraction">25610%</item>
+    <item name="frac6553510perc" type="dimen" format="fraction">6553510%</item>
+    <item name="frac6553610perc" type="dimen" format="fraction">6553610%</item>
+
+    <item name="frac100pperc" type="dimen" format="fraction">100%p</item>
+    <item name="frac1pperc" type="dimen" format="fraction">1%p</item>
+    <item name="fracp1pperc" type="dimen" format="fraction">.1%p</item>
+    <item name="fracp01pperc" type="dimen" format="fraction">.01%p</item>
+    <item name="frac0pperc" type="dimen" format="fraction">0%p</item>
+    <item name="frac1p1pperc" type="dimen" format="fraction">1.1%p</item>
+    <item name="frac100p1pperc" type="dimen" format="fraction">100.1%p</item>
+    <item name="frac25510pperc" type="dimen" format="fraction">25510%p</item>
+    <item name="frac25610pperc" type="dimen" format="fraction">25610%p</item>
+    <item name="frac6553510pperc" type="dimen" format="fraction">6553510%p</item>
+    <item name="frac6553610pperc" type="dimen" format="fraction">6553610%p</item>
+</resources>
+
diff --git a/tests/tests/graphics/res/values/ids.xml b/tests/tests/graphics/res/values/ids.xml
new file mode 100644
index 0000000..30e081b
--- /dev/null
+++ b/tests/tests/graphics/res/values/ids.xml
@@ -0,0 +1,18 @@
+<!-- Copyright (C) 2008 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<resources>
+  <item type="id" name="background" />
+</resources>
diff --git a/tests/tests/graphics/res/values/resources_test.xml b/tests/tests/graphics/res/values/resources_test.xml
new file mode 100644
index 0000000..91c2c4a
--- /dev/null
+++ b/tests/tests/graphics/res/values/resources_test.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2008 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<resources>
+     <!-- The width that is used when creating thumbnails of applications. -->
+     <dimen name="thumbnail_width">84dp</dimen>
+     <!-- The height that is used when creating thumbnails of applications. -->
+     <dimen name="thumbnail_height">63dp</dimen>
+     <!-- The standard size (both width and height) of an application icon that
+          will be displayed in the app launcher and elsewhere. -->
+     <dimen name="app_icon_size">48px</dimen>
+     <dimen name="toast_y_offset">64dip</dimen>
+     <plurals name="plurals_test">
+        <item quantity="one">A dog</item>
+        <item quantity="other">Some dogs</item>
+      </plurals>
+     <color name="resource_test_color">#003B3B3B</color>
+     <integer name="resource_test_int">10</integer>
+</resources>
diff --git a/tests/tests/graphics/res/values/strings.xml b/tests/tests/graphics/res/values/strings.xml
new file mode 100644
index 0000000..c167278
--- /dev/null
+++ b/tests/tests/graphics/res/values/strings.xml
@@ -0,0 +1,179 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2008 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="permlab_testGranted">Test Granted</string>
+    <string name="permdesc_testGranted">Used for running CTS tests, for testing operations
+        where we have the permission.</string>
+    <string name="permlab_testDynamic">Test Dynamic</string>
+    <string name="permdesc_testDynamic">Used for running CTS tests, for testing adding
+        dynamic permissions.</string>
+    <string name="permlab_testDenied">Test Denied</string>
+    <string name="permdesc_testDenied">Used for running CTS tests, for testing operations
+        where we do not have the permission.</string>
+    <string name="explain">1. click start. \n2. if above image shaked, then press pass button,
+         else press failed button.</string>
+    <string name="text_view_hello">Hello! Text view!</string>
+    <string name="text_view_hello_two_lines">Hello! \nText view!</string>
+    <string name="text_view_simple_hint">This is a hint.</string>
+    <string name="text_view_hint">This is a string for testing hint of textview.</string>
+    <string name="activity_forwarding">App/Forwarding</string>
+    <string name="forwarding">$$$</string>
+    <string name="go">Go</string>
+    <string name="back">Back</string>
+    <string name="forward_target">
+        Press back button and notice we don\'t see the previous activity.
+    </string>
+    <string name="edit_text">testing</string>
+    <string name="text">DialogTest</string>
+    <string name="text_country">Country</string>
+    <string name="text_name">Name</string>
+    <string name="hello_world">Hello, World!</string>
+    <string name="hello_android">Hello, Android!</string>
+    <string name="alert_dialog_username">Name:</string>
+    <string name="alert_dialog_password">Password:</string>
+    <string name="alert_dialog_positive">Positive</string>
+    <string name="alert_dialog_negative">Negative</string>
+    <string name="alert_dialog_neutral">Neutral</string>
+    <string name="notify">Notify </string>
+    <string name="tabs_1">testing</string>
+    <string name="table_layout_first">first</string>
+    <string name="table_layout_second">second</string>
+    <string name="table_layout_third">third</string>
+    <string name="table_layout_long">Very long to make the string out of the screen</string>
+    <string name="chronometer_text">Test Chronometer</string>
+    <string name="am">AM</string>
+    <string name="pm">PM</string>
+    <string name="viewgroup_test">ViewGroup test</string>
+    <string name="viewanimator_test">ViewAnimator test</string>
+    <string name="id_ok">OK</string>
+    <string name="id_cancel">Cancel</string>
+    <string name="context_test_string1">This is %s string.</string>
+    <string name="context_test_string2">This is test string.</string>
+    <string name="animationutils_test_instructions">Choose different animations</string>
+    <string name="animationutils_test_alpha">Alpha animation</string>
+    <string name="animationutils_test_scale">Scale animation</string>
+    <string name="animationutils_test_rotate">Rotate animation</string>
+    <string name="animationutils_test_translate">Translate animation</string>
+    <string name="animationutils_test_set">Animation set</string>
+    <string name="animationutils_test_layout">Layout animation</string>
+    <string name="animationutils_test_gridlayout">Grid layout animation</string>
+    <string name="twolinelistitem_test_text1">text1</string>
+    <string name="twolinelistitem_test_text2">text2</string>
+    <string name="metadata_text">metadata text</string>
+    <string name="horizontal_text_1">horizontal 1</string>
+    <string name="horizontal_text_2">horizontal 2</string>
+    <string name="horizontal_text_3">horizontal 3</string>
+    <string name="vertical_text_1">vertical 1</string>
+    <string name="vertical_text_2">vertical 2</string>
+    <string name="vertical_text_3">vertical 3</string>
+    <string name="reference">here</string>
+    <string name="coerceIntegerToString">100</string>
+    <string name="coerceBooleanToString">true</string>
+    <string name="coerceColorToString">#fff</string>
+    <string name="coerceFloatToString">100.0</string>
+    <string name="coerceDimensionToString">100px</string>
+    <string name="coerceFractionToString">100<xliff:g id="percent">%</xliff:g></string>
+    <string name="formattedStringNone">Format[]</string>
+    <string name="formattedStringOne">Format[<xliff:g id="format">%d</xliff:g>]</string>
+    <string name="formattedStringTwo">Format[<xliff:g id="format">%3$d,%2$s</xliff:g>]</string>
+    <string name="checkboxpref_key">checkboxpref_key</string>
+   <string name="checkboxpref_title">title of preference</string>
+   <string name="checkboxpref_summary">summary of preference</string>
+   <string name="checkboxpref_summary_on">summary on of preference</string>
+   <string name="checkboxpref_summary_off">summary off of preference</string>
+   <string name="checkboxpref_depend">checkboxpref_depend</string>
+   <string name="checkboxpref_depend_title"> depend title of preference</string>
+   <string name="checkboxpref_depend_summary"> depend summary of preference</string>
+   <string name="edittextpref_key">edittextpref_key</string>
+   <string name="edittextpref_default_value">default value of preference</string>
+   <string name="edittextpref_title">title of edit text preference</string>
+   <string name="edittextpref_summary">summary of edit text preference</string>
+   <string name="edittextpref_dialog_title">dialog title of edit text preference</string>
+   <string name="edittextpref_text">text of  edit text preference</string>
+   <string name="listpref_key">listpref_key</string>
+   <string name="listpref_title">title of list preference</string>
+   <string name="listpref_summary">summary of list preference</string>
+   <string name="listpref_dialogtitle">dialog title of list preference</string>
+   <string name="easy">Easy</string>
+   <string name="medium">Medium</string>
+   <string name="hard">Hard</string>
+   <string name="footer_view">Footer view</string>
+   <string name="header_view">Header view</string>
+   <string name="dialogpref_title">title of dialog preference </string>
+   <string name="dialogpref_dialog_title">dialog title of dialog preference </string>
+   <string name="dialogpref_key">dialogpref_key</string>
+   <string name="dialogpref_default_value">default value of dialog preference</string>
+   <string name="dialogpref_summary">summary of dialog preference</string>
+   <string name="dialogpref_message">message of dialog preference</string>
+   <string name="dialogpref_sure">Sure</string>
+   <string name="dialogpref_cancel">Cancel</string>
+   <string name="pref_key">pref_key</string>
+   <string name="pref_title">title of preference</string>
+   <string name="pref_summary">summary of preference</string>
+   <string name="pref_depend_key">pref_depend_key</string>
+   <string name="pref_depend_title"> depend title of preference</string>
+   <string name="pref_depend_summary"> depend summary of preference</string>
+   <string name="android_intent_action_preference">android.intent.action.PREFERENCE</string>
+   <string name="def_pref_key">def_pref_key</string>
+   <string name="def_pref_title">default preference</string>
+   <string name="def_pref_summary">This is default preference of cts</string>
+   <string name="relative_view1">view 1</string>
+   <string name="relative_view2">view 2</string>
+   <string name="relative_view3">view 3</string>
+   <string name="relative_view4">view 4</string>
+   <string name="relative_view5">view 5</string>
+   <string name="relative_view6">view 6</string>
+   <string name="relative_view7">view 7</string>
+   <string name="relative_view8">view 8</string>
+   <string name="relative_view9">view 9</string>
+   <string name="relative_view10">view 10</string>
+   <string name="relative_view11">view 11</string>
+   <string name="relative_view12">view 12</string>
+   <string name="relative_view13">view 13</string>
+   <string name="country">Country:</string>
+   <string name="symbol">Symbol:</string>
+   <string name="country_warning">No such country registered</string>
+   <string name="version_cur">base</string>
+   <string name="version_old">base</string>
+   <string name="version_v3">base</string>
+   <string name="authenticator_label">Android CTS</string>
+   <string name="search_label">Android CTS</string>
+   <string name="tag1">tag 1</string>
+   <string name="tag2">tag 2</string>
+
+   <string name="button">Button</string>
+   <string name="holo_test">Holo Test</string>
+   <string name="holo_generator">Holo Generator</string>
+   <string name="holo_light_test">Holo Light Test</string>
+   <string name="holo_light_generator">Holo Light Generator</string>
+   <string name="reference_image">Reference Image: </string>
+   <string name="generated_image">Generated Image: </string>
+   <string name="themes_prompt">Select a Theme:</string>
+   <string name="sample_text">Sample text goes here. I wanted something creative and whimsical
+but then I just got bored...</string>
+    <string name="long_text">This is a really long string which exceeds the width of the view.
+New devices have a much larger screen which actually enables long strings to be displayed
+with no fading. I have made this string longer to fix this case. If you are correcting this
+text, I would love to see the kind of devices you guys now use! Guys, maybe some devices need longer string!
+I think so, so how about double this string, like copy and paste!
+This is a really long string which exceeds the width of the view.
+New devices have a much larger screen which actually enables long strings to be displayed
+with no fading. I have made this string longer to fix this case. If you are correcting this
+text, I would love to see the kind of devices you guys now use! Guys, maybe some devices need longer string!
+I think so, so how about double this string, like copy and paste! </string>
+    <string name="rectangle200">"M 0,0 l 200,0 l 0, 200 l -200, 0 z"</string>
+</resources>
diff --git a/tests/tests/graphics/res/values/styles.xml b/tests/tests/graphics/res/values/styles.xml
new file mode 100644
index 0000000..20c80f8
--- /dev/null
+++ b/tests/tests/graphics/res/values/styles.xml
@@ -0,0 +1,172 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2008 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android">
+
+    <style name="Whatever">
+        <item name="type1">true</item>
+        <item name="type2">false</item>
+        <item name="type3">#ff0000ff</item>
+        <item name="type4">#ff00ff00</item>
+        <item name="type5">0.75px</item>
+        <item name="type6">10px</item>
+        <item name="type7">18px</item>
+        <item name="type8">@drawable/pass</item>
+        <item name="type9">3.14</item>
+        <item name="type10">100%</item>
+        <item name="type11">365</item>
+        <item name="type12">86400</item>
+        <item name="type13">@string/hello_android</item>
+        <item name="type14">TypedArray Test!</item>
+        <item name="type15">@array/difficultyLevel</item>
+        <item name="type16">Typed Value!</item>
+    </style>
+
+    <style name="TextViewWithoutColorAndAppearance">
+        <item name="android:textSize">18sp</item>
+    </style>
+
+    <style name="TextViewWithColorButWithOutAppearance">
+        <item name="android:textColor">#ff0000ff</item>
+    </style>
+
+    <style name="TextViewWithColorAndAppearance">
+        <item name="android:textColor">#ff0000ff</item>
+        <item name="android:textAppearance">@style/TextAppearance.WithColor</item>
+    </style>
+
+    <style name="TextViewWithoutColorButWithAppearance">
+        <item name="android:textAppearance">@style/TextAppearance.WithColor</item>
+    </style>
+
+    <style name="TextAppearance" parent="android:TextAppearance">
+    </style>
+
+    <style name="TextAppearance.WithColor">
+        <item name="android:textColor">#ffff0000</item>
+    </style>
+
+    <style name="TextAppearance.All">
+        <item name="android:textColor">@drawable/black</item>
+        <item name="android:textSize">20px</item>
+        <item name="android:textStyle">bold</item>
+        <item name="android:textColorHint">@drawable/red</item>
+        <item name="android:textColorLink">@drawable/blue</item>
+        <item name="android:textColorHighlight">@drawable/yellow</item>
+    </style>
+
+    <style name="TextAppearance.Colors">
+        <item name="android:textColor">@drawable/black</item>
+        <item name="android:textColorHint">@drawable/blue</item>
+        <item name="android:textColorLink">@drawable/yellow</item>
+        <item name="android:textColorHighlight">@drawable/red</item>
+    </style>
+
+    <style name="TextAppearance.NotColors">
+        <item name="android:textSize">17px</item>
+        <item name="android:typeface">sans</item>
+        <item name="android:textStyle">normal</item>
+    </style>
+
+    <style name="TextAppearance.Style">
+        <item name="android:textStyle">normal</item>
+    </style>
+
+    <style name="TestEnum1">
+        <item name="testEnum">val1</item>
+    </style>
+
+    <style name="TestEnum2">
+        <item name="testEnum">val2</item>
+    </style>
+
+    <style name="TestEnum10">
+        <item name="testEnum">val10</item>
+    </style>
+
+    <style name="TestFlag1">
+        <item name="testFlags">bit1</item>
+    </style>
+
+    <style name="TestFlag2">
+        <item name="testFlags">bit2</item>
+    </style>
+
+    <style name="TestFlag31">
+        <item name="testFlags">bit31</item>
+    </style>
+
+    <style name="TestFlag1And2">
+        <item name="testFlags">bit1|bit2</item>
+    </style>
+
+    <style name="TestFlag1And2And31">
+        <item name="testFlags">bit1|bit2|bit31</item>
+    </style>
+
+    <style name="TestEnum1.EmptyInherit" />
+
+    <style name="Theme_AlertDialog">
+        <item name="android:textSize">18sp</item>
+    </style>
+
+    <style name="TestProgressBar">
+        <item name="android:indeterminateOnly">false</item>
+        <item name="android:progressDrawable">?android:drawable/progress_horizontal</item>
+        <item name="android:indeterminateDrawable">?android:drawable/progress_horizontal</item>
+        <item name="android:minHeight">20dip</item>
+        <item name="android:maxHeight">20dip</item>
+        <item name="android:focusable">true</item>
+    </style>
+
+    <style name="Test_Theme">
+        <item name="android:windowNoTitle">true</item>
+        <item name="android:panelColorForeground">#ff000000</item>
+        <item name="android:panelColorBackground">#ffffffff</item>
+    </style>
+
+    <style name="Theme_OverrideOuter">
+        <item name="themeType">1</item>
+    </style>
+
+    <style name="Theme_OverrideInner">
+        <item name="themeType">2</item>
+        <item name="themeOverrideAttr">@style/Theme_OverrideAttr</item>
+    </style>
+
+    <style name="Theme_OverrideAttr">
+        <item name="themeType">3</item>
+    </style>
+    
+    <style name="Theme_ThemedDrawableTest">
+        <item name="themeBoolean">true</item>
+        <item name="themeColor">@android:color/black</item>
+        <item name="themeFloat">1.0</item>
+        <item name="themeAngle">45.0</item>
+        <item name="themeInteger">1</item>
+        <item name="themeDimension">1px</item>
+        <item name="themeDrawable">@drawable/icon_black</item>
+        <item name="themeBitmap">@drawable/icon_black</item>
+        <item name="themeNinePatch">@drawable/ninepatch_0</item>
+        <item name="themeGravity">48</item>
+        <item name="themeTileMode">2</item>
+    </style>
+
+    <style name="Theme_NoSwipeDismiss">
+        <item name="android:windowSwipeToDismiss">false</item>
+    </style>
+
+</resources>
diff --git a/tests/tests/graphics/res/xml/anim_list_correct.xml b/tests/tests/graphics/res/xml/anim_list_correct.xml
new file mode 100644
index 0000000..660aa96
--- /dev/null
+++ b/tests/tests/graphics/res/xml/anim_list_correct.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+ * Copyright (C) 2008 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+-->
+
+<animation-list xmlns:android="http://schemas.android.com/apk/res/android"
+    android:visible="false"
+    android:variablePadding="true"
+    android:oneshot="true" >
+
+    <item android:drawable="@drawable/testimage"
+        android:duration="2000" />
+
+    <item android:duration="1000" >
+        <color android:color="#77ffffff" />
+    </item>
+</animation-list>
+
diff --git a/tests/tests/graphics/res/xml/anim_list_missing_item_drawable.xml b/tests/tests/graphics/res/xml/anim_list_missing_item_drawable.xml
new file mode 100644
index 0000000..99052f4
--- /dev/null
+++ b/tests/tests/graphics/res/xml/anim_list_missing_item_drawable.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+ * Copyright (C) 2008 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+-->
+
+<animation-list xmlns:android="http://schemas.android.com/apk/res/android" >
+    <item android:duration="2000" />
+</animation-list>
+
diff --git a/tests/tests/graphics/res/xml/anim_list_missing_item_duration.xml b/tests/tests/graphics/res/xml/anim_list_missing_item_duration.xml
new file mode 100644
index 0000000..e3986c2
--- /dev/null
+++ b/tests/tests/graphics/res/xml/anim_list_missing_item_duration.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+ * Copyright (C) 2008 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+-->
+
+<animation-list xmlns:android="http://schemas.android.com/apk/res/android" >
+    <item android:drawable="@drawable/testimage" />
+</animation-list>
+
diff --git a/tests/tests/graphics/res/xml/anim_list_missing_list_attrs.xml b/tests/tests/graphics/res/xml/anim_list_missing_list_attrs.xml
new file mode 100644
index 0000000..25d2dfe
--- /dev/null
+++ b/tests/tests/graphics/res/xml/anim_list_missing_list_attrs.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+ * Copyright (C) 2008 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+-->
+
+<animation-list xmlns:android="http://schemas.android.com/apk/res/android" >
+    <item android:drawable="@drawable/testimage"
+        android:duration="2000" />
+</animation-list>
+
diff --git a/tests/tests/graphics/res/xml/bitmapdrawable.xml b/tests/tests/graphics/res/xml/bitmapdrawable.xml
new file mode 100644
index 0000000..f9001aa
--- /dev/null
+++ b/tests/tests/graphics/res/xml/bitmapdrawable.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ * Copyright (C) 2008 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ -->
+<alias xmlns:android="http://schemas.android.com/apk/res/android">
+    <bitmap_allattrs>
+        <bitmap android:src="@drawable/testimage"
+            android:gravity="top|right"
+            android:dither="true"
+            android:antialias="true"
+            android:filter="false"
+            android:tileMode="repeat"/>
+    </bitmap_allattrs>
+
+    <bitmap_partattrs>
+        <bitmap android:src="@drawable/size_48x48"
+            android:gravity="center"
+            android:tileMode="mirror"/>
+    </bitmap_partattrs>
+
+    <bitmap_wrongsrc>
+        <bitmap android:src="@drawable/colorstatelist_test"/>
+    </bitmap_wrongsrc>
+
+    <bitmap_nosrc>
+        <bitmap android:gravity="center"/>
+    </bitmap_nosrc>
+</alias>
diff --git a/tests/tests/graphics/res/xml/drawable_test.xml b/tests/tests/graphics/res/xml/drawable_test.xml
new file mode 100644
index 0000000..f2a2e5d
--- /dev/null
+++ b/tests/tests/graphics/res/xml/drawable_test.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ * Copyright (C) 2008 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ -->
+
+<drawable xmlns:android="http://schemas.android.com/apk/res/android" android:visible="false">
+</drawable>
+
diff --git a/tests/tests/graphics/res/xml/layerdrawable.xml b/tests/tests/graphics/res/xml/layerdrawable.xml
new file mode 100644
index 0000000..9bb1268
--- /dev/null
+++ b/tests/tests/graphics/res/xml/layerdrawable.xml
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ * Copyright (C) 2008 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ -->
+<alias xmlns:android="http://schemas.android.com/apk/res/android">
+    <layer-list_full>
+        <layer-list>
+            <item><color android:color="#88ffffff">
+                <padding android:left="1px" android:top="2px" android:right="3px"
+                    android:bottom="4px"/>
+            </color></item>
+            <item android:drawable="@drawable/testimage"/>
+            <item>
+                <rotate
+                    android:pivotX="50%" android:pivotY="50%"
+                    android:fromDegrees="0" android:toDegrees="360"
+                    android:drawable="@drawable/testimage"/>
+                <padding android:left="4px" android:top="3px"
+                    android:right="2px" android:bottom="1px" />
+            </item>
+            <bitmap android:src="@drawable/testimage"/>
+            <item android:id="@id/background"
+                android:drawable="@drawable/window_test_drawable" />
+        </layer-list>
+    </layer-list_full>
+    <layer-list_empty>
+        <layer-list>
+            <bitmap android:src="@drawable/testimage"/>
+        </layer-list>
+    </layer-list_empty>
+    <layer-list_exception>
+        <layer-list>
+            <item android:id="@id/background"/>
+        </layer-list>
+    </layer-list_exception>
+</alias>
diff --git a/tests/tests/graphics/res/xml/level_list_correct.xml b/tests/tests/graphics/res/xml/level_list_correct.xml
new file mode 100644
index 0000000..241ec16
--- /dev/null
+++ b/tests/tests/graphics/res/xml/level_list_correct.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+ * Copyright (C) 2008 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+-->
+
+<level-list xmlns:android="http://schemas.android.com/apk/res/android" >
+    <item android:drawable="@drawable/testimage"
+        android:minLevel="100"
+        android:maxLevel="200" />
+
+    <item android:minLevel="200"
+        android:maxLevel="300" >
+        <color android:color="#77ffffff" />
+    </item>
+</level-list>
+
diff --git a/tests/tests/graphics/res/xml/level_list_missing_item_drawable.xml b/tests/tests/graphics/res/xml/level_list_missing_item_drawable.xml
new file mode 100644
index 0000000..506b10f
--- /dev/null
+++ b/tests/tests/graphics/res/xml/level_list_missing_item_drawable.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+ * Copyright (C) 2008 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+-->
+
+<level-list xmlns:android="http://schemas.android.com/apk/res/android" >
+    <item android:minLevel="100"
+        android:maxLevel="200"/>
+</level-list>
+
diff --git a/tests/tests/graphics/res/xml/level_list_missing_item_minlevel_maxlevel.xml b/tests/tests/graphics/res/xml/level_list_missing_item_minlevel_maxlevel.xml
new file mode 100644
index 0000000..f77bfd5
--- /dev/null
+++ b/tests/tests/graphics/res/xml/level_list_missing_item_minlevel_maxlevel.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+ * Copyright (C) 2008 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+-->
+
+<level-list xmlns:android="http://schemas.android.com/apk/res/android" >
+    <item android:drawable="@drawable/testimage" />
+</level-list>
+
diff --git a/tests/tests/graphics/res/xml/scaledrawable.xml b/tests/tests/graphics/res/xml/scaledrawable.xml
new file mode 100644
index 0000000..d8d5f73
--- /dev/null
+++ b/tests/tests/graphics/res/xml/scaledrawable.xml
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ * Copyright (C) 2008 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ -->
+<alias xmlns:android="http://schemas.android.com/apk/res/android">
+    <scale_allattrs>
+        <scale
+            android:scaleWidth="0.4"
+            android:scaleHeight="0.3"
+            android:scaleGravity="center"
+            android:drawable="@drawable/testimage">
+            <color android:color="#88ffffff"/>
+            <bitmap android:src="@drawable/size_48x48"/>
+        </scale>
+    </scale_allattrs>
+
+    <scale_nodrawable>
+        <scale
+            android:scaleWidth="0.7"
+            android:scaleHeight="0.3"
+            android:scaleGravity="center"/>
+    </scale_nodrawable>
+</alias>
diff --git a/tests/tests/graphics/res/xml/selector_correct.xml b/tests/tests/graphics/res/xml/selector_correct.xml
new file mode 100644
index 0000000..917833f
--- /dev/null
+++ b/tests/tests/graphics/res/xml/selector_correct.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+ * Copyright (C) 2008 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+-->
+
+<selector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:visible="false"
+    android:variablePadding="true"
+    android:constantSize="true" >
+
+    <item android:state_focused="true"
+        android:state_pressed="false"
+        android:drawable="@drawable/testimage" />
+
+    <item >
+        <color android:color="#77ffffff" />
+    </item>
+</selector>
+
diff --git a/tests/tests/graphics/res/xml/selector_missing_item_drawable.xml b/tests/tests/graphics/res/xml/selector_missing_item_drawable.xml
new file mode 100644
index 0000000..35bef42
--- /dev/null
+++ b/tests/tests/graphics/res/xml/selector_missing_item_drawable.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+ * Copyright (C) 2008 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+-->
+
+<selector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:visible="false"
+    android:variablePadding="true"
+    android:constantSize="true" >
+
+    <item android:state_focused="true"
+        android:state_pressed="false" />
+</selector>
+
diff --git a/tests/tests/graphics/res/xml/selector_missing_selector_attrs.xml b/tests/tests/graphics/res/xml/selector_missing_selector_attrs.xml
new file mode 100644
index 0000000..87ccc3c
--- /dev/null
+++ b/tests/tests/graphics/res/xml/selector_missing_selector_attrs.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+ * Copyright (C) 2008 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+-->
+
+<selector xmlns:android="http://schemas.android.com/apk/res/android" >
+    <item android:drawable="@drawable/testimage"
+        android:state_focused="true"
+        android:state_pressed="false" />
+</selector>
+
diff --git a/tests/tests/graphics/src/android/graphics/cts/BitmapFactoryTest.java b/tests/tests/graphics/src/android/graphics/cts/BitmapFactoryTest.java
index edb8d73..2314ffb 100644
--- a/tests/tests/graphics/src/android/graphics/cts/BitmapFactoryTest.java
+++ b/tests/tests/graphics/src/android/graphics/cts/BitmapFactoryTest.java
@@ -16,7 +16,7 @@
 
 package android.graphics.cts;
 
-import com.android.cts.stub.R;
+import com.android.cts.graphics.R;
 
 
 import android.content.res.Resources;
diff --git a/tests/tests/graphics/src/android/graphics/cts/BitmapRegionDecoderTest.java b/tests/tests/graphics/src/android/graphics/cts/BitmapRegionDecoderTest.java
index 5ef710f..adce1c4 100644
--- a/tests/tests/graphics/src/android/graphics/cts/BitmapRegionDecoderTest.java
+++ b/tests/tests/graphics/src/android/graphics/cts/BitmapRegionDecoderTest.java
@@ -29,7 +29,7 @@
 import android.test.InstrumentationTestCase;
 import android.util.Log;
 
-import com.android.cts.stub.R;
+import com.android.cts.graphics.R;
 
 
 import java.io.ByteArrayOutputStream;
diff --git a/tests/tests/graphics/src/android/graphics/cts/BitmapTest.java b/tests/tests/graphics/src/android/graphics/cts/BitmapTest.java
index 487d9bf..4ea89c7 100644
--- a/tests/tests/graphics/src/android/graphics/cts/BitmapTest.java
+++ b/tests/tests/graphics/src/android/graphics/cts/BitmapTest.java
@@ -15,7 +15,7 @@
  */
 package android.graphics.cts;
 
-import com.android.cts.stub.R;
+import com.android.cts.graphics.R;
 
 
 import android.content.res.Resources;
@@ -30,7 +30,6 @@
 import android.os.Parcel;
 import android.test.AndroidTestCase;
 import android.util.DisplayMetrics;
-import android.widget.cts.WidgetTestUtils;
 
 import java.io.ByteArrayOutputStream;
 import java.nio.ByteBuffer;
diff --git a/tests/tests/graphics/src/android/graphics/cts/CanvasTest.java b/tests/tests/graphics/src/android/graphics/cts/CanvasTest.java
index 76eeee3..d5391a3 100644
--- a/tests/tests/graphics/src/android/graphics/cts/CanvasTest.java
+++ b/tests/tests/graphics/src/android/graphics/cts/CanvasTest.java
@@ -41,7 +41,7 @@
 import android.text.SpannableStringBuilder;
 import android.text.SpannedString;
 
-import com.android.cts.stub.R;
+import com.android.cts.graphics.R;
 
 import java.util.Vector;
 
diff --git a/tests/tests/graphics/src/android/graphics/cts/ImageViewCtsActivity.java b/tests/tests/graphics/src/android/graphics/cts/ImageViewCtsActivity.java
new file mode 100644
index 0000000..b9887b7
--- /dev/null
+++ b/tests/tests/graphics/src/android/graphics/cts/ImageViewCtsActivity.java
@@ -0,0 +1,37 @@
+/*
+ * Copyright (C) 2008 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.graphics.cts;
+
+import com.android.cts.graphics.R;
+
+import android.app.Activity;
+import android.os.Bundle;
+
+/**
+ * A minimal application for {@link ImageView} test.
+ */
+public class ImageViewCtsActivity extends Activity {
+    /**
+     * Called with the activity is first created.
+     */
+    @Override
+    public void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.imageview_layout);
+    }
+}
+
diff --git a/tests/tests/graphics/src/android/graphics/cts/MockActivity.java b/tests/tests/graphics/src/android/graphics/cts/MockActivity.java
new file mode 100644
index 0000000..addc6d3
--- /dev/null
+++ b/tests/tests/graphics/src/android/graphics/cts/MockActivity.java
@@ -0,0 +1,23 @@
+/*
+ * Copyright (C) 2008 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.graphics.cts;
+
+import android.app.Activity;
+
+public class MockActivity extends Activity {
+
+}
diff --git a/tests/tests/graphics/src/android/graphics/cts/MovieTest.java b/tests/tests/graphics/src/android/graphics/cts/MovieTest.java
index f129035..2facdc9 100644
--- a/tests/tests/graphics/src/android/graphics/cts/MovieTest.java
+++ b/tests/tests/graphics/src/android/graphics/cts/MovieTest.java
@@ -23,21 +23,19 @@
 import java.io.InputStream;
 import java.io.OutputStream;
 
-import android.app.cts.MockActivity;
 import android.content.Context;
 import android.graphics.Canvas;
 import android.graphics.Movie;
 import android.graphics.Paint;
 import android.test.ActivityInstrumentationTestCase2;
-import android.widget.cts.WidgetTestUtils;
 
 
 public class MovieTest extends ActivityInstrumentationTestCase2<MockActivity> {
     private Movie mMovie;
-    private final int MOVIE = com.android.cts.stub.R.drawable.animated;
+    private final int MOVIE = com.android.cts.graphics.R.drawable.animated;
 
     public MovieTest() {
-        super("com.android.cts.stub", MockActivity.class);
+        super("com.android.cts.graphics", MockActivity.class);
     }
 
     @Override
diff --git a/tests/tests/graphics/src/android/graphics/cts/NinePatchTest.java b/tests/tests/graphics/src/android/graphics/cts/NinePatchTest.java
index d5fcc62..d37ec90 100644
--- a/tests/tests/graphics/src/android/graphics/cts/NinePatchTest.java
+++ b/tests/tests/graphics/src/android/graphics/cts/NinePatchTest.java
@@ -16,7 +16,7 @@
 
 package android.graphics.cts;
 
-import com.android.cts.stub.R;
+import com.android.cts.graphics.R;
 
 
 import android.content.res.Resources;
diff --git a/tests/tests/graphics/src/android/graphics/cts/WidgetTestUtils.java b/tests/tests/graphics/src/android/graphics/cts/WidgetTestUtils.java
new file mode 100644
index 0000000..63bafac
--- /dev/null
+++ b/tests/tests/graphics/src/android/graphics/cts/WidgetTestUtils.java
@@ -0,0 +1,138 @@
+/*
+ * Copyright (C) 2008 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.graphics.cts;
+
+import org.xmlpull.v1.XmlPullParser;
+import org.xmlpull.v1.XmlPullParserException;
+
+import android.content.Context;
+import android.content.res.Resources;
+import android.graphics.Bitmap;
+import android.graphics.BitmapFactory;
+
+import java.io.IOException;
+
+import junit.framework.Assert;
+
+/**
+ * The useful methods for widget test.
+ */
+public class WidgetTestUtils {
+    /**
+     * Assert that two bitmaps are equal.
+     *
+     * @param Bitmap b1 the first bitmap which needs to compare.
+     * @param Bitmap b2 the second bitmap which needs to compare.
+     */
+    public static void assertEquals(Bitmap b1, Bitmap b2) {
+        if (b1 == b2) {
+            return;
+        }
+
+        if (b1 == null || b2 == null) {
+            Assert.fail("the bitmaps are not equal");
+        }
+
+        // b1 and b2 are all not null.
+        if (b1.getWidth() != b2.getWidth() || b1.getHeight() != b2.getHeight()
+            || b1.getConfig() != b2.getConfig()) {
+            Assert.fail("the bitmaps are not equal");
+        }
+
+        int w = b1.getWidth();
+        int h = b1.getHeight();
+        int s = w * h;
+        int[] pixels1 = new int[s];
+        int[] pixels2 = new int[s];
+
+        b1.getPixels(pixels1, 0, w, 0, 0, w, h);
+        b2.getPixels(pixels2, 0, w, 0, 0, w, h);
+
+        for (int i = 0; i < s; i++) {
+            if (pixels1[i] != pixels2[i]) {
+                Assert.fail("the bitmaps are not equal");
+            }
+        }
+    }
+
+    /**
+     * Find beginning of the special element.
+     * @param parser XmlPullParser will be parsed.
+     * @param firstElementName the target element name.
+     *
+     * @throws XmlPullParserException if XML Pull Parser related faults occur.
+     * @throws IOException if I/O-related error occur when parsing.
+     */
+    public static final void beginDocument(XmlPullParser parser, String firstElementName)
+            throws XmlPullParserException, IOException {
+        Assert.assertNotNull(parser);
+        Assert.assertNotNull(firstElementName);
+
+        int type;
+        while ((type = parser.next()) != XmlPullParser.START_TAG
+                && type != XmlPullParser.END_DOCUMENT) {
+            ;
+        }
+
+        if (!parser.getName().equals(firstElementName)) {
+            throw new XmlPullParserException("Unexpected start tag: found " + parser.getName()
+                    + ", expected " + firstElementName);
+        }
+    }
+
+    /**
+     * Compare the expected pixels with actual, scaling for the target context density
+     *
+     * @throws AssertionFailedError
+     */
+    public static void assertScaledPixels(int expected, int actual, Context context) {
+        Assert.assertEquals(expected * context.getResources().getDisplayMetrics().density,
+                actual, 3);
+    }
+
+    /** Converts dips into pixels using the {@link Context}'s density. */
+    public static int convertDipToPixels(Context context, int dip) {
+      float density = context.getResources().getDisplayMetrics().density;
+      return Math.round(density * dip);
+    }
+
+    /**
+     * Retrieve a bitmap that can be used for comparison on any density
+     * @param resources
+     * @return the {@link Bitmap} or <code>null</code>
+     */
+    public static Bitmap getUnscaledBitmap(Resources resources, int resId) {
+        BitmapFactory.Options options = new BitmapFactory.Options();
+        options.inScaled = false;
+        return BitmapFactory.decodeResource(resources, resId, options);
+    }
+
+    /**
+     * Retrieve a dithered bitmap that can be used for comparison on any density
+     * @param resources
+     * @param config the preferred config for the returning bitmap
+     * @return the {@link Bitmap} or <code>null</code>
+     */
+    public static Bitmap getUnscaledAndDitheredBitmap(Resources resources,
+            int resId, Bitmap.Config config) {
+        BitmapFactory.Options options = new BitmapFactory.Options();
+        options.inDither = true;
+        options.inScaled = false;
+        options.inPreferredConfig = config;
+        return BitmapFactory.decodeResource(resources, resId, options);
+    }
+}
diff --git a/tests/tests/graphics/src/android/graphics/cts/YuvImageTest.java b/tests/tests/graphics/src/android/graphics/cts/YuvImageTest.java
index f0ffc13..02b3afa 100644
--- a/tests/tests/graphics/src/android/graphics/cts/YuvImageTest.java
+++ b/tests/tests/graphics/src/android/graphics/cts/YuvImageTest.java
@@ -33,7 +33,7 @@
 import android.test.AndroidTestCase;
 import android.util.Log;
 
-import com.android.cts.stub.R;
+import com.android.cts.graphics.R;
 
 
 public class YuvImageTest extends AndroidTestCase {
diff --git a/tests/tests/graphics/src/android/graphics/drawable/cts/AnimationDrawableTest.java b/tests/tests/graphics/src/android/graphics/drawable/cts/AnimationDrawableTest.java
index fc9efdd..c278ed2 100644
--- a/tests/tests/graphics/src/android/graphics/drawable/cts/AnimationDrawableTest.java
+++ b/tests/tests/graphics/src/android/graphics/drawable/cts/AnimationDrawableTest.java
@@ -16,7 +16,7 @@
 
 package android.graphics.drawable.cts;
 
-import com.android.cts.stub.R;
+import com.android.cts.graphics.R;
 
 
 import org.xmlpull.v1.XmlPullParser;
@@ -32,11 +32,11 @@
 import android.test.ActivityInstrumentationTestCase2;
 import android.util.Xml;
 import android.widget.ImageView;
-import android.widget.cts.ImageViewStubActivity;
+import android.graphics.cts.ImageViewCtsActivity;
 
 import java.io.IOException;
 
-public class AnimationDrawableTest extends ActivityInstrumentationTestCase2<ImageViewStubActivity> {
+public class AnimationDrawableTest extends ActivityInstrumentationTestCase2<ImageViewCtsActivity> {
     private static final int FRAMES_COUNT        = 3;
     private static final int FIRST_FRAME_INDEX   = 0;
     private static final int SECOND_FRAME_INDEX  = 1;
@@ -50,7 +50,7 @@
     private Resources mResources;
 
     public AnimationDrawableTest() {
-        super("com.android.cts.stub", ImageViewStubActivity.class);
+        super("com.android.cts.graphics", ImageViewCtsActivity.class);
     }
 
     @Override
diff --git a/tests/tests/graphics/src/android/graphics/drawable/cts/BitmapDrawableTest.java b/tests/tests/graphics/src/android/graphics/drawable/cts/BitmapDrawableTest.java
index 1bb6f6d..c895d0d 100644
--- a/tests/tests/graphics/src/android/graphics/drawable/cts/BitmapDrawableTest.java
+++ b/tests/tests/graphics/src/android/graphics/drawable/cts/BitmapDrawableTest.java
@@ -16,7 +16,7 @@
 
 package android.graphics.drawable.cts;
 
-import com.android.cts.stub.R;
+import com.android.cts.graphics.R;
 
 import org.xmlpull.v1.XmlPullParserException;
 
diff --git a/tests/tests/graphics/src/android/graphics/drawable/cts/ClipDrawableTest.java b/tests/tests/graphics/src/android/graphics/drawable/cts/ClipDrawableTest.java
index 5af5607..7e3294d 100644
--- a/tests/tests/graphics/src/android/graphics/drawable/cts/ClipDrawableTest.java
+++ b/tests/tests/graphics/src/android/graphics/drawable/cts/ClipDrawableTest.java
@@ -16,7 +16,7 @@
 
 package android.graphics.drawable.cts;
 
-import com.android.cts.stub.R;
+import com.android.cts.graphics.R;
 
 import org.xmlpull.v1.XmlPullParser;
 import org.xmlpull.v1.XmlPullParserException;
diff --git a/tests/tests/graphics/src/android/graphics/drawable/cts/ColorDrawableTest.java b/tests/tests/graphics/src/android/graphics/drawable/cts/ColorDrawableTest.java
index 18d07ce..465a476 100644
--- a/tests/tests/graphics/src/android/graphics/drawable/cts/ColorDrawableTest.java
+++ b/tests/tests/graphics/src/android/graphics/drawable/cts/ColorDrawableTest.java
@@ -26,7 +26,7 @@
 import android.util.AttributeSet;
 import android.util.Xml;
 
-import com.android.cts.stub.R;
+import com.android.cts.graphics.R;
 
 import org.xmlpull.v1.XmlPullParser;
 import org.xmlpull.v1.XmlPullParserException;
@@ -124,7 +124,7 @@
 
         d.setColorFilter(Color.BLACK, Mode.SRC_OVER);
         assertEquals(Color.BLACK, DrawableTestingUtils.getPixel(d, 0, 0));
-        
+
     }
 
     public void testSetTint() {
diff --git a/tests/tests/graphics/src/android/graphics/drawable/cts/DrawableContainerStateTest.java b/tests/tests/graphics/src/android/graphics/drawable/cts/DrawableContainerStateTest.java
index 2adc587..701071b 100644
--- a/tests/tests/graphics/src/android/graphics/drawable/cts/DrawableContainerStateTest.java
+++ b/tests/tests/graphics/src/android/graphics/drawable/cts/DrawableContainerStateTest.java
@@ -130,9 +130,9 @@
         assertNull(mDrawableContainerState.getConstantPadding());
 
         /*
-         * TODO: the behavior of getConstantPadding when variable padding is 
+         * TODO: the behavior of getConstantPadding when variable padding is
          * false is undefined
-         * 
+         *
         mDrawableContainerState.setVariablePadding(false);
         Rect padding = mDrawableContainerState.getConstantPadding();
         assertNotNull(padding);
diff --git a/tests/tests/graphics/src/android/graphics/drawable/cts/DrawableTest.java b/tests/tests/graphics/src/android/graphics/drawable/cts/DrawableTest.java
index df29211..a48372e 100644
--- a/tests/tests/graphics/src/android/graphics/drawable/cts/DrawableTest.java
+++ b/tests/tests/graphics/src/android/graphics/drawable/cts/DrawableTest.java
@@ -16,7 +16,7 @@
 
 package android.graphics.drawable.cts;
 
-import com.android.cts.stub.R;
+import com.android.cts.graphics.R;
 
 import org.xmlpull.v1.XmlPullParser;
 import org.xmlpull.v1.XmlPullParserException;
diff --git a/tests/tests/graphics/src/android/graphics/drawable/cts/DrawableTestUtils.java b/tests/tests/graphics/src/android/graphics/drawable/cts/DrawableTestUtils.java
new file mode 100644
index 0000000..a0fa634
--- /dev/null
+++ b/tests/tests/graphics/src/android/graphics/drawable/cts/DrawableTestUtils.java
@@ -0,0 +1,88 @@
+/*
+ * Copyright (C) 2008 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.graphics.drawable.cts;
+
+import android.content.res.XmlResourceParser;
+import android.util.AttributeSet;
+import android.util.Xml;
+
+import java.io.IOException;
+
+import org.xmlpull.v1.XmlPullParser;
+import org.xmlpull.v1.XmlPullParserException;
+
+/**
+ * The useful methods for graphics.drawable test.
+ */
+public class DrawableTestUtils {
+
+    public static void skipCurrentTag(XmlPullParser parser)
+            throws XmlPullParserException, IOException {
+        int outerDepth = parser.getDepth();
+        int type;
+        while ((type=parser.next()) != XmlPullParser.END_DOCUMENT
+               && (type != XmlPullParser.END_TAG
+                       || parser.getDepth() > outerDepth)) {
+        }
+    }
+
+    /**
+     * Retrieve an AttributeSet from a XML.
+     *
+     * @param parser the XmlPullParser to use for the xml parsing.
+     * @param searchedNodeName the name of the target node.
+     * @return the AttributeSet retrieved from specified node.
+     * @throws IOException
+     * @throws XmlPullParserException
+     */
+    public static AttributeSet getAttributeSet(XmlResourceParser parser, String searchedNodeName)
+            throws XmlPullParserException, IOException {
+        AttributeSet attrs = null;
+        int type;
+        while ((type = parser.next()) != XmlPullParser.END_DOCUMENT
+                && type != XmlPullParser.START_TAG) {
+        }
+        String nodeName = parser.getName();
+        if (!"alias".equals(nodeName)) {
+            throw new RuntimeException();
+        }
+        int outerDepth = parser.getDepth();
+        while ((type = parser.next()) != XmlPullParser.END_DOCUMENT
+                && (type != XmlPullParser.END_TAG || parser.getDepth() > outerDepth)) {
+            if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) {
+                continue;
+            }
+            nodeName = parser.getName();
+            if (searchedNodeName.equals(nodeName)) {
+                outerDepth = parser.getDepth();
+                while ((type = parser.next()) != XmlPullParser.END_DOCUMENT
+                        && (type != XmlPullParser.END_TAG || parser.getDepth() > outerDepth)) {
+                    if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) {
+                        continue;
+                    }
+                    nodeName = parser.getName();
+                    attrs = Xml.asAttributeSet(parser);
+                    break;
+                }
+                break;
+            } else {
+                skipCurrentTag(parser);
+            }
+        }
+        return attrs;
+    }
+}
diff --git a/tests/tests/graphics/src/android/graphics/drawable/cts/GradientDrawableTest.java b/tests/tests/graphics/src/android/graphics/drawable/cts/GradientDrawableTest.java
index 75639c2..e7a38c5 100644
--- a/tests/tests/graphics/src/android/graphics/drawable/cts/GradientDrawableTest.java
+++ b/tests/tests/graphics/src/android/graphics/drawable/cts/GradientDrawableTest.java
@@ -16,7 +16,7 @@
 
 package android.graphics.drawable.cts;
 
-import com.android.cts.stub.R;
+import com.android.cts.graphics.R;
 
 import org.xmlpull.v1.XmlPullParser;
 import org.xmlpull.v1.XmlPullParserException;
diff --git a/tests/tests/graphics/src/android/graphics/drawable/cts/InsetDrawableTest.java b/tests/tests/graphics/src/android/graphics/drawable/cts/InsetDrawableTest.java
index 767d89d..1edd36e 100644
--- a/tests/tests/graphics/src/android/graphics/drawable/cts/InsetDrawableTest.java
+++ b/tests/tests/graphics/src/android/graphics/drawable/cts/InsetDrawableTest.java
@@ -16,7 +16,7 @@
 
 package android.graphics.drawable.cts;
 
-import com.android.cts.stub.R;
+import com.android.cts.graphics.R;
 
 
 import org.xmlpull.v1.XmlPullParser;
diff --git a/tests/tests/graphics/src/android/graphics/drawable/cts/LayerDrawableTest.java b/tests/tests/graphics/src/android/graphics/drawable/cts/LayerDrawableTest.java
index 86772cc..5aa3083 100644
--- a/tests/tests/graphics/src/android/graphics/drawable/cts/LayerDrawableTest.java
+++ b/tests/tests/graphics/src/android/graphics/drawable/cts/LayerDrawableTest.java
@@ -16,7 +16,7 @@
 
 package android.graphics.drawable.cts;
 
-import com.android.cts.stub.R;
+import com.android.cts.graphics.R;
 
 import org.xmlpull.v1.XmlPullParserException;
 
diff --git a/tests/tests/graphics/src/android/graphics/drawable/cts/LevelListDrawableTest.java b/tests/tests/graphics/src/android/graphics/drawable/cts/LevelListDrawableTest.java
index 191e0d3..11186b0 100644
--- a/tests/tests/graphics/src/android/graphics/drawable/cts/LevelListDrawableTest.java
+++ b/tests/tests/graphics/src/android/graphics/drawable/cts/LevelListDrawableTest.java
@@ -31,7 +31,7 @@
 import android.test.InstrumentationTestCase;
 import android.util.Xml;
 
-import com.android.cts.stub.R;
+import com.android.cts.graphics.R;
 
 
 public class LevelListDrawableTest extends InstrumentationTestCase {
diff --git a/tests/tests/graphics/src/android/graphics/drawable/cts/NinePatchDrawableTest.java b/tests/tests/graphics/src/android/graphics/drawable/cts/NinePatchDrawableTest.java
index 10ca311..39ed55c 100644
--- a/tests/tests/graphics/src/android/graphics/drawable/cts/NinePatchDrawableTest.java
+++ b/tests/tests/graphics/src/android/graphics/drawable/cts/NinePatchDrawableTest.java
@@ -16,7 +16,7 @@
 
 package android.graphics.drawable.cts;
 
-import com.android.cts.stub.R;
+import com.android.cts.graphics.R;
 
 import org.xmlpull.v1.XmlPullParser;
 import org.xmlpull.v1.XmlPullParserException;
diff --git a/tests/tests/graphics/src/android/graphics/drawable/cts/PaintDrawableTest.java b/tests/tests/graphics/src/android/graphics/drawable/cts/PaintDrawableTest.java
index 71fa06c..a440dab 100644
--- a/tests/tests/graphics/src/android/graphics/drawable/cts/PaintDrawableTest.java
+++ b/tests/tests/graphics/src/android/graphics/drawable/cts/PaintDrawableTest.java
@@ -16,7 +16,7 @@
 
 package android.graphics.drawable.cts;
 
-import com.android.cts.stub.R;
+import com.android.cts.graphics.R;
 
 
 import org.xmlpull.v1.XmlPullParser;
diff --git a/tests/tests/graphics/src/android/graphics/drawable/cts/RotateDrawableTest.java b/tests/tests/graphics/src/android/graphics/drawable/cts/RotateDrawableTest.java
index a3398f6..cf25857 100644
--- a/tests/tests/graphics/src/android/graphics/drawable/cts/RotateDrawableTest.java
+++ b/tests/tests/graphics/src/android/graphics/drawable/cts/RotateDrawableTest.java
@@ -16,7 +16,7 @@
 
 package android.graphics.drawable.cts;
 
-import com.android.cts.stub.R;
+import com.android.cts.graphics.R;
 
 import org.xmlpull.v1.XmlPullParser;
 import org.xmlpull.v1.XmlPullParserException;
diff --git a/tests/tests/graphics/src/android/graphics/drawable/cts/ScaleDrawableTest.java b/tests/tests/graphics/src/android/graphics/drawable/cts/ScaleDrawableTest.java
index e0cd2ee..190fffa 100644
--- a/tests/tests/graphics/src/android/graphics/drawable/cts/ScaleDrawableTest.java
+++ b/tests/tests/graphics/src/android/graphics/drawable/cts/ScaleDrawableTest.java
@@ -16,7 +16,7 @@
 
 package android.graphics.drawable.cts;
 
-import com.android.cts.stub.R;
+import com.android.cts.graphics.R;
 
 import org.xmlpull.v1.XmlPullParserException;
 
diff --git a/tests/tests/graphics/src/android/graphics/drawable/cts/ShapeDrawableTest.java b/tests/tests/graphics/src/android/graphics/drawable/cts/ShapeDrawableTest.java
index 3475757..b77139a 100644
--- a/tests/tests/graphics/src/android/graphics/drawable/cts/ShapeDrawableTest.java
+++ b/tests/tests/graphics/src/android/graphics/drawable/cts/ShapeDrawableTest.java
@@ -35,7 +35,7 @@
 import android.util.AttributeSet;
 import android.util.Xml;
 
-import com.android.cts.stub.R;
+import com.android.cts.graphics.R;
 
 import org.xmlpull.v1.XmlPullParser;
 import org.xmlpull.v1.XmlPullParserException;
diff --git a/tests/tests/graphics/src/android/graphics/drawable/cts/StateListDrawableTest.java b/tests/tests/graphics/src/android/graphics/drawable/cts/StateListDrawableTest.java
index 891ce5e..d55b91d 100644
--- a/tests/tests/graphics/src/android/graphics/drawable/cts/StateListDrawableTest.java
+++ b/tests/tests/graphics/src/android/graphics/drawable/cts/StateListDrawableTest.java
@@ -34,7 +34,7 @@
 import android.util.StateSet;
 import android.util.Xml;
 
-import com.android.cts.stub.R;
+import com.android.cts.graphics.R;
 
 
 public class StateListDrawableTest extends InstrumentationTestCase {
diff --git a/tests/tests/graphics/src/android/graphics/drawable/cts/ThemedDrawableTest.java b/tests/tests/graphics/src/android/graphics/drawable/cts/ThemedDrawableTest.java
index b56377e..8cee91e 100644
--- a/tests/tests/graphics/src/android/graphics/drawable/cts/ThemedDrawableTest.java
+++ b/tests/tests/graphics/src/android/graphics/drawable/cts/ThemedDrawableTest.java
@@ -33,7 +33,7 @@
 import android.view.ContextThemeWrapper;
 import android.view.Gravity;
 
-import com.android.cts.stub.R;
+import com.android.cts.graphics.R;
 
 @TargetApi(19)
 public class ThemedDrawableTest extends AndroidTestCase {
diff --git a/tests/tests/graphics/src/android/graphics/drawable/cts/TransitionDrawableTest.java b/tests/tests/graphics/src/android/graphics/drawable/cts/TransitionDrawableTest.java
index ab47974..f2a22a2 100644
--- a/tests/tests/graphics/src/android/graphics/drawable/cts/TransitionDrawableTest.java
+++ b/tests/tests/graphics/src/android/graphics/drawable/cts/TransitionDrawableTest.java
@@ -16,7 +16,7 @@
 
 package android.graphics.drawable.cts;
 
-import com.android.cts.stub.R;
+import com.android.cts.graphics.R;
 
 import android.content.res.Resources;
 import android.graphics.Bitmap;
diff --git a/tests/tests/graphics/src/android/graphics/drawable/cts/VectorDrawableTest.java b/tests/tests/graphics/src/android/graphics/drawable/cts/VectorDrawableTest.java
index 76ff73d..323a2a7 100644
--- a/tests/tests/graphics/src/android/graphics/drawable/cts/VectorDrawableTest.java
+++ b/tests/tests/graphics/src/android/graphics/drawable/cts/VectorDrawableTest.java
@@ -28,7 +28,7 @@
 import android.util.Log;
 import android.util.Xml;
 
-import com.android.cts.stub.R;
+import com.android.cts.graphics.R;
 
 import org.xmlpull.v1.XmlPullParser;
 import org.xmlpull.v1.XmlPullParserException;
@@ -57,9 +57,6 @@
             R.drawable.vector_icon_transformation_3,
             R.drawable.vector_icon_transformation_4,
             R.drawable.vector_icon_transformation_5,
-            R.drawable.vector_icon_transformation_6,
-            R.drawable.vector_icon_render_order_1,
-            R.drawable.vector_icon_render_order_2,
             R.drawable.vector_icon_stroke_1,
             R.drawable.vector_icon_stroke_2,
             R.drawable.vector_icon_stroke_3,
@@ -83,9 +80,6 @@
             R.drawable.vector_icon_transformation_3_golden,
             R.drawable.vector_icon_transformation_4_golden,
             R.drawable.vector_icon_transformation_5_golden,
-            R.drawable.vector_icon_transformation_6_golden,
-            R.drawable.vector_icon_render_order_1_golden,
-            R.drawable.vector_icon_render_order_2_golden,
             R.drawable.vector_icon_stroke_1_golden,
             R.drawable.vector_icon_stroke_2_golden,
             R.drawable.vector_icon_stroke_3_golden,
diff --git a/tests/tests/graphics/src/android/opengl/cts/CompressedTextureCtsActivity.java b/tests/tests/graphics/src/android/opengl/cts/CompressedTextureCtsActivity.java
new file mode 100644
index 0000000..533508a
--- /dev/null
+++ b/tests/tests/graphics/src/android/opengl/cts/CompressedTextureCtsActivity.java
@@ -0,0 +1,79 @@
+/*
+ * Copyright (C) 2011 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package android.opengl.cts;
+
+import com.android.cts.graphics.R;
+
+import android.app.Activity;
+import android.content.Intent;
+import android.content.res.AssetFileDescriptor;
+import android.content.res.Resources;
+import android.graphics.Bitmap;
+import android.graphics.Bitmap.Config;
+import android.graphics.BitmapFactory;
+import android.os.Bundle;
+import android.util.Log;
+
+public class CompressedTextureCtsActivity extends Activity {
+
+    private static final String TAG = "CompressedTextureCtsActivity";
+
+    protected Resources mResources;
+
+    private CompressedTextureSurfaceView mCompressedTextureView = null;
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+
+        Bundle extras = getIntent().getExtras();
+        String formatTest = extras.getString("TextureFormat", null);
+
+        Log.i(TAG, "Testing format " + formatTest);
+
+        mResources = getResources();
+
+        CompressedTextureLoader.Texture compressed = null;
+
+        BitmapFactory.Options optionsRGB = new BitmapFactory.Options();
+        optionsRGB.inPreferredConfig = Bitmap.Config.RGB_565;
+        optionsRGB.inScaled = false;
+        Bitmap bitmap = BitmapFactory.decodeResource(mResources, R.raw.basetex, optionsRGB);
+
+        if (formatTest.equals(CompressedTextureLoader.TEXTURE_ETC1)) {
+            compressed = CompressedTextureLoader.createFromUncompressedETC1(bitmap);
+        } else if (formatTest.equals(CompressedTextureLoader.TEXTURE_S3TC)) {
+            compressed = CompressedTextureLoader.loadTextureDXT(mResources, R.raw.ddstex);
+        } else if (formatTest.equals(CompressedTextureLoader.TEXTURE_ATC)) {
+            compressed = CompressedTextureLoader.loadTextureATC(mResources, 0); //cts for now
+        } else if (formatTest.equals(CompressedTextureLoader.TEXTURE_PVRTC)) {
+            compressed = CompressedTextureLoader.loadTexturePVRTC(mResources, R.raw.pvrtex);
+        }
+
+        mCompressedTextureView = new CompressedTextureSurfaceView(this, bitmap, compressed);
+        setContentView(mCompressedTextureView);
+    }
+
+    @Override
+    protected void onResume() {
+        super.onResume();
+        mCompressedTextureView.onResume();
+    }
+
+    public boolean getPassed() throws InterruptedException {
+        return mCompressedTextureView.getTestPassed();
+    }
+}
diff --git a/tests/tests/graphics/src/android/opengl/cts/CompressedTextureLoader.java b/tests/tests/graphics/src/android/opengl/cts/CompressedTextureLoader.java
new file mode 100644
index 0000000..1524f99
--- /dev/null
+++ b/tests/tests/graphics/src/android/opengl/cts/CompressedTextureLoader.java
@@ -0,0 +1,485 @@
+/*
+ * Copyright (C) 2011 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package android.opengl.cts;
+
+import java.io.InputStream;
+import java.nio.ByteBuffer;
+import java.nio.Buffer;
+import java.nio.ByteOrder;
+import java.util.HashMap;
+
+import com.android.cts.graphics.R;
+
+import android.app.Activity;
+import android.content.res.AssetFileDescriptor;
+import android.content.res.Resources;
+import android.os.Bundle;
+import android.util.Log;
+
+import android.opengl.ETC1;
+import android.opengl.ETC1Util;
+import android.opengl.GLES20;
+
+import android.graphics.Bitmap;
+import android.graphics.Bitmap.Config;
+import android.graphics.BitmapFactory;
+
+public class CompressedTextureLoader {
+    private static final String TAG = "CompressedTextureLoader";
+
+    public static final String TEXTURE_UNCOMPRESSED = "UNCOMPRESSED";
+    public static final String TEXTURE_ETC1 = "ETC1";
+    public static final String TEXTURE_S3TC = "S3TC";
+    public static final String TEXTURE_ATC = "ATC";
+    public static final String TEXTURE_PVRTC = "PVRTC";
+
+    public static class Texture {
+        public Texture(int width, int height, int internalformat, ByteBuffer data,
+                       String formatName) {
+            mWidth = width;
+            mHeight = height;
+            mInternalFormat = internalformat;
+            mData = data;
+            mFormatName = formatName;
+        }
+
+        /**
+         * Get the width of the texture in pixels.
+         * @return the width of the texture in pixels.
+         */
+        public int getWidth() { return mWidth; }
+
+        /**
+         * Get the height of the texture in pixels.
+         * @return the width of the texture in pixels.
+         */
+        public int getHeight() { return mHeight; }
+
+        /**
+         * Get the compressed data of the texture.
+         * @return the texture data.
+         */
+        public ByteBuffer getData() { return mData; }
+
+        /**
+         * Get the format of the texture.
+         * @return the internal format.
+         */
+        public int getFormat() { return mInternalFormat; }
+
+        /**
+         * Get the format of the texture.
+         * @return the internal format.
+         */
+        public boolean isSupported() { return isFormatSupported(mFormatName); }
+
+        private int mWidth;
+        private int mHeight;
+        private int mInternalFormat;
+        private ByteBuffer mData;
+        private String mFormatName;
+    }
+
+    /*  .pvr header is described by the following c struct
+        typedef struct PVR_TEXTURE_HEADER_TAG{
+            unsigned int  dwHeaderSize;   // size of the structure
+            unsigned int  dwHeight;    // height of surface to be created
+            unsigned int  dwWidth;    // width of input surface
+            unsigned int  dwMipMapCount;   // number of MIP-map levels requested
+            unsigned int  dwpfFlags;   // pixel format flags
+            unsigned int  dwDataSize;   // Size of the compress data
+            unsigned int  dwBitCount;   // number of bits per pixel
+            unsigned int  dwRBitMask;   // mask for red bit
+            unsigned int  dwGBitMask;   // mask for green bits
+            unsigned int  dwBBitMask;   // mask for blue bits
+            unsigned int  dwAlphaBitMask;   // mask for alpha channel
+            unsigned int  dwPVR;    // should be 'P' 'V' 'R' '!'
+            unsigned int  dwNumSurfs;   //number of slices for volume textures or skyboxes
+        } PVR_TEXTURE_HEADER;
+    */
+    static final int PVR_HEADER_SIZE = 13 * 4;
+    static final int PVR_2BPP = 24;
+    static final int PVR_4BPP = 25;
+    static final int PVR_MAGIC_NUMBER = 559044176;
+
+    static final int GL_COMPRESSED_RGB_PVRTC_4BPPV1_IMG = 0x8C00;
+    static final int GL_COMPRESSED_RGB_PVRTC_2BPPV1_IMG = 0x8C01;
+    static final int GL_COMPRESSED_RGBA_PVRTC_4BPPV1_IMG = 0x8C02;
+    static final int GL_COMPRESSED_RGBA_PVRTC_2BPPV1_IMG = 0x8C03;
+
+    static class PVRHeader {
+        int mHeaderSize;   // size of the structure
+        int mHeight;    // height of surface to be created
+        int mWidth;    // width of input surface
+        int mMipMapCount;   // number of MIP-map levels requested
+        int mpfFlags;   // pixel format flags
+        int mDataSize;   // Size of the compress data
+        int mBitCount;   // number of bits per pixel
+        int mRBitMask;   // mask for red bit
+        int mGBitMask;   // mask for green bits
+        int mBBitMask;   // mask for blue bits
+        int mAlphaBitMask;   // mask for alpha channel
+        int mPVR;    // should be 'P' 'V' 'R' '!'
+        int mNumSurfs;   //number of slices for volume textures or skyboxes
+    }
+
+    protected static PVRHeader readPVRHeader(InputStream is) {
+
+        byte[] headerData = new byte[PVR_HEADER_SIZE];
+        try {
+            is.read(headerData);
+        } catch (Exception e) {
+            throw new RuntimeException("Unable to read data");
+        }
+
+        ByteBuffer headerBuffer = ByteBuffer.allocateDirect(PVR_HEADER_SIZE)
+                .order(ByteOrder.nativeOrder());
+        headerBuffer.put(headerData, 0, PVR_HEADER_SIZE).position(0);
+
+        PVRHeader header = new PVRHeader();
+
+        header.mHeaderSize = headerBuffer.getInt();
+        header.mHeight = headerBuffer.getInt();
+        header.mWidth = headerBuffer.getInt();
+        header.mMipMapCount = headerBuffer.getInt();
+        header.mpfFlags = headerBuffer.getInt();
+        header.mDataSize = headerBuffer.getInt();
+        header.mBitCount = headerBuffer.getInt();
+        header.mRBitMask = headerBuffer.getInt();
+        header.mGBitMask = headerBuffer.getInt();
+        header.mBBitMask = headerBuffer.getInt();
+        header.mAlphaBitMask = headerBuffer.getInt();
+        header.mPVR = headerBuffer.getInt();
+        header.mNumSurfs = headerBuffer.getInt();
+
+        if (header.mHeaderSize != PVR_HEADER_SIZE ||
+            header.mPVR != PVR_MAGIC_NUMBER) {
+            throw new RuntimeException("Invalid header data");
+        }
+
+        return header;
+    }
+
+    public static Texture loadTextureATC(Resources res, int id) {
+        Texture tex = new Texture(0, 0, 0, null, "Cts!");
+        return tex;
+    }
+
+    private static ETC1Util.ETC1Texture compressTexture(Buffer input,
+                                                        int width, int height,
+                                                        int pixelSize, int stride){
+        int encodedImageSize = ETC1.getEncodedDataSize(width, height);
+        ByteBuffer compressedImage = ByteBuffer.allocateDirect(encodedImageSize).
+            order(ByteOrder.nativeOrder());
+        ETC1.encodeImage(input, width, height, pixelSize, stride, compressedImage);
+        return new ETC1Util.ETC1Texture(width, height, compressedImage);
+    }
+
+    public static Texture createFromUncompressedETC1(Bitmap bitmap) {
+        int dataSize = bitmap.getRowBytes() * bitmap.getHeight();
+
+        ByteBuffer dataBuffer;
+        dataBuffer = ByteBuffer.allocateDirect(dataSize).order(ByteOrder.nativeOrder());
+        bitmap.copyPixelsToBuffer(dataBuffer);
+        dataBuffer.position(0);
+
+        int bytesPerPixel = bitmap.getRowBytes() / bitmap.getWidth();
+        ETC1Util.ETC1Texture compressed = compressTexture(dataBuffer,
+                                                          bitmap.getWidth(),
+                                                          bitmap.getHeight(),
+                                                          bytesPerPixel,
+                                                          bitmap.getRowBytes());
+
+        Texture tex = new Texture(compressed.getWidth(), compressed.getHeight(),
+                                  ETC1.ETC1_RGB8_OES, compressed.getData(), TEXTURE_ETC1);
+
+        return tex;
+    }
+
+    private static ByteBuffer read(InputStream is, int dataSize) {
+        ByteBuffer dataBuffer;
+        dataBuffer = ByteBuffer.allocateDirect(dataSize).order(ByteOrder.nativeOrder());
+        byte[] ioBuffer = new byte[4096];
+        for (int i = 0; i < dataSize; ) {
+            int chunkSize = Math.min(ioBuffer.length, dataSize - i);
+            try {
+                is.read(ioBuffer, 0, chunkSize);
+            } catch (Exception e) {
+                throw new RuntimeException("Unable to read data");
+            }
+            dataBuffer.put(ioBuffer, 0, chunkSize);
+            i += chunkSize;
+        }
+        dataBuffer.position(0);
+        return dataBuffer;
+    }
+
+    public static Texture loadTexturePVRTC(Resources res, int id) {
+        InputStream is = null;
+        try {
+            is = res.openRawResource(id);
+        } catch (Exception e) {
+            throw new RuntimeException("Unable to open resource " + id);
+        }
+
+        PVRHeader header = readPVRHeader(is);
+
+        int format = header.mpfFlags & 0xFF;
+        int internalFormat = 0;
+        if (format == PVR_2BPP && header.mAlphaBitMask == 1) {
+            internalFormat = GL_COMPRESSED_RGBA_PVRTC_2BPPV1_IMG;
+        } else if (format == PVR_2BPP && header.mAlphaBitMask == 0) {
+            internalFormat = GL_COMPRESSED_RGB_PVRTC_2BPPV1_IMG;
+        } else if (format == PVR_4BPP && header.mAlphaBitMask == 1) {
+            internalFormat = GL_COMPRESSED_RGBA_PVRTC_4BPPV1_IMG;
+        } else if (format == PVR_4BPP && header.mAlphaBitMask == 0) {
+            internalFormat = GL_COMPRESSED_RGB_PVRTC_4BPPV1_IMG;
+        }
+
+        // only load the first mip level for now
+        int dataSize = (header.mWidth * header.mHeight * header.mBitCount) >> 3;
+        ByteBuffer dataBuffer = read(is, dataSize);
+        Texture tex = new Texture(header.mWidth, header.mHeight,
+                                  internalFormat, dataBuffer,
+                                  TEXTURE_PVRTC);
+        try {
+            is.close();
+        } catch (Exception e) {
+            throw new RuntimeException("Unable to close resource stream " + id);
+        }
+        return tex;
+    }
+
+    /* DDS Header is described by the following structs
+       typedef struct {
+          DWORD           dwSize;
+          DWORD           dwFlags;
+          DWORD           dwHeight;
+          DWORD           dwWidth;
+          DWORD           dwPitchOrLinearSize;
+          DWORD           dwDepth;
+          DWORD           dwMipMapCount;
+          DWORD           dwReserved1[11];
+          DDS_PIXELFORMAT ddspf;
+          DWORD           dwCaps;
+          DWORD           dwCaps2;
+          DWORD           dwCaps3;
+          DWORD           dwCaps4;
+          DWORD           dwReserved2;
+        } DDS_HEADER;
+
+        struct DDS_PIXELFORMAT {
+          DWORD dwSize;
+          DWORD dwFlags;
+          DWORD dwFourCC;
+          DWORD dwRGBBitCount;
+          DWORD dwRBitMask;
+          DWORD dwGBitMask;
+          DWORD dwBBitMask;
+          DWORD dwABitMask;
+        };
+
+        In the file it looks like this
+        DWORD               dwMagic;
+        DDS_HEADER          header;
+        DDS_HEADER_DXT10    header10; // If the DDS_PIXELFORMAT dwFlags is set to DDPF_FOURCC
+                                      // and dwFourCC is DX10
+
+    */
+
+    static final int DDS_HEADER_STRUCT_SIZE = 124;
+    static final int DDS_PIXELFORMAT_STRUCT_SIZE = 32;
+    static final int DDS_HEADER_SIZE = 128;
+    static final int DDS_MAGIC_NUMBER = 0x20534444;
+    static final int DDS_DDPF_FOURCC = 0x4;
+    static final int DDS_DXT1 = 0x31545844;
+    static final int DDS_DXT5 = 0x35545844;
+
+    static final int COMPRESSED_RGB_S3TC_DXT1_EXT = 0x83F0;
+    static final int COMPRESSED_RGBA_S3TC_DXT1_EXT = 0x83F1;
+    static final int COMPRESSED_RGBA_S3TC_DXT5_EXT = 0x83F3;
+
+    static class DDSHeader {
+        int mMagic;
+        int mSize;
+        int mFlags;
+        int mHeight;
+        int mWidth;
+        int mPitchOrLinearSize;
+        int mDepth;
+        int mMipMapCount;
+        int[] mReserved1;
+        // struct DDS_PIXELFORMAT {
+            int mPixelFormatSize;
+            int mPixelFormatFlags;
+            int mPixelFormatFourCC;
+            int mPixelFormatRGBBitCount;
+            int mPixelFormatRBitMask;
+            int mPixelFormatGBitMask;
+            int mPixelFormatBBitMask;
+            int mPixelFormatABitMask;
+        // };
+        int mCaps;
+        int mCaps2;
+        int mCaps3;
+        int mCaps4;
+        int mReserved2;
+
+        DDSHeader() {
+            mReserved1 = new int[11];
+        }
+    }
+
+    protected static DDSHeader readDDSHeader(InputStream is) {
+
+        byte[] headerData = new byte[DDS_HEADER_SIZE];
+        try {
+            is.read(headerData);
+        } catch (Exception e) {
+            throw new RuntimeException("Unable to read data");
+        }
+
+        ByteBuffer headerBuffer = ByteBuffer.allocateDirect(DDS_HEADER_SIZE)
+                .order(ByteOrder.nativeOrder());
+        headerBuffer.put(headerData, 0, DDS_HEADER_SIZE).position(0);
+
+        DDSHeader header = new DDSHeader();
+
+        header.mMagic = headerBuffer.getInt();
+        header.mSize = headerBuffer.getInt();
+        header.mFlags = headerBuffer.getInt();
+        header.mHeight = headerBuffer.getInt();
+        header.mWidth = headerBuffer.getInt();
+        header.mPitchOrLinearSize = headerBuffer.getInt();
+        header.mDepth = headerBuffer.getInt();
+        header.mMipMapCount = headerBuffer.getInt();
+        for (int i = 0; i < header.mReserved1.length; i ++) {
+            header.mReserved1[i] = headerBuffer.getInt();
+        }
+        // struct DDS_PIXELFORMAT {
+            header.mPixelFormatSize = headerBuffer.getInt();
+            header.mPixelFormatFlags = headerBuffer.getInt();
+            header.mPixelFormatFourCC = headerBuffer.getInt();
+            header.mPixelFormatRGBBitCount = headerBuffer.getInt();
+            header.mPixelFormatRBitMask = headerBuffer.getInt();
+            header.mPixelFormatGBitMask = headerBuffer.getInt();
+            header.mPixelFormatBBitMask = headerBuffer.getInt();
+            header.mPixelFormatABitMask = headerBuffer.getInt();
+        // };
+        header.mCaps = headerBuffer.getInt();
+        header.mCaps2 = headerBuffer.getInt();
+        header.mCaps3 = headerBuffer.getInt();
+        header.mCaps4 = headerBuffer.getInt();
+        header.mReserved2 = headerBuffer.getInt();
+
+        if (header.mSize != DDS_HEADER_STRUCT_SIZE ||
+            header.mPixelFormatSize != DDS_PIXELFORMAT_STRUCT_SIZE ||
+            header.mMagic != DDS_MAGIC_NUMBER) {
+            throw new RuntimeException("Invalid header data");
+        }
+
+        return header;
+    }
+
+    // Very simple loader that only reads in the header and a DXT1 mip level 0
+    public static Texture loadTextureDXT(Resources res, int id) {
+        InputStream is = null;
+        try {
+            is = res.openRawResource(id);
+        } catch (Exception e) {
+            throw new RuntimeException("Unable to open resource " + id);
+        }
+
+        DDSHeader header = readDDSHeader(is);
+
+        if (header.mPixelFormatFlags != DDS_DDPF_FOURCC) {
+            throw new RuntimeException("Unsupported DXT data");
+        }
+
+        int internalFormat = 0;
+        int bpp = 0;
+        switch (header.mPixelFormatFourCC) {
+        case DDS_DXT1:
+            internalFormat = COMPRESSED_RGB_S3TC_DXT1_EXT;
+            bpp = 4;
+            break;
+        case DDS_DXT5:
+            internalFormat = COMPRESSED_RGBA_S3TC_DXT5_EXT;
+            bpp = 8;
+            break;
+        default:
+            throw new RuntimeException("Unsupported DXT data");
+        }
+
+        // only load the first mip level for now
+        int dataSize = (header.mWidth * header.mHeight * bpp) >> 3;
+        if (dataSize != header.mPitchOrLinearSize) {
+            throw new RuntimeException("Expected data and header mismatch");
+        }
+        ByteBuffer dataBuffer = read(is, dataSize);
+
+        Texture tex = new Texture(header.mWidth, header.mHeight, internalFormat,
+                                  dataBuffer, TEXTURE_S3TC);
+        return tex;
+    }
+
+    static HashMap<String, Boolean> sExtensionMap;
+    static HashMap<String, Boolean> sFormatMap;
+
+    private static synchronized void updateSupportedFormats() {
+        if (sExtensionMap != null) {
+            return;
+        }
+
+        sExtensionMap = new HashMap<String, Boolean>();
+        sFormatMap = new HashMap<String, Boolean>();
+        String extensionList = GLES20.glGetString(GLES20.GL_EXTENSIONS);
+
+        for (String extension : extensionList.split(" ")) {
+            sExtensionMap.put(extension, true);
+        }
+
+        // Check ETC1
+        sFormatMap.put(TEXTURE_ETC1, ETC1Util.isETC1Supported());
+        // Check ATC
+        if (sExtensionMap.get("GL_AMD_compressed_ATC_texture") != null ||
+            sExtensionMap.get("GL_ATI_compressed_texture_atitc") != null ||
+            sExtensionMap.get("GL_ATI_texture_compression_atitc") != null) {
+            sFormatMap.put(TEXTURE_ATC, true);
+        }
+        // Check DXT
+        if (sExtensionMap.get("GL_EXT_texture_compression_dxt1") != null ||
+            sExtensionMap.get("GL_EXT_texture_compression_s3tc") != null ||
+            sExtensionMap.get("OES_texture_compression_S3TC") != null) {
+            sFormatMap.put(TEXTURE_S3TC, true);
+        }
+        // Check DXT
+        if (sExtensionMap.get("GL_IMG_texture_compression_pvrtc") != null) {
+            sFormatMap.put(TEXTURE_PVRTC, true);
+        }
+
+        /*Log.i(TAG, "mIsSupportedETC1 " + sFormatMap.get(TEXTURE_ETC1));
+        Log.i(TAG, "mIsSupportedATC " + sFormatMap.get(TEXTURE_ATC));
+        Log.i(TAG, "mIsSupportedDXT " + sFormatMap.get(TEXTURE_S3TC));
+        Log.i(TAG, "mIsSupportedPVRTC " + sFormatMap.get(TEXTURE_PVRTC));*/
+    }
+
+    private static boolean isFormatSupported(String format) {
+        updateSupportedFormats();
+        Boolean supported = sFormatMap.get(format);
+        return supported != null ? supported : false;
+    }
+}
diff --git a/tests/tests/graphics/src/android/opengl/cts/CompressedTextureSurfaceView.java b/tests/tests/graphics/src/android/opengl/cts/CompressedTextureSurfaceView.java
new file mode 100644
index 0000000..84aae10
--- /dev/null
+++ b/tests/tests/graphics/src/android/opengl/cts/CompressedTextureSurfaceView.java
@@ -0,0 +1,423 @@
+/*
+ * Copyright (C) 2011 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.opengl.cts;
+
+import java.io.IOException;
+import java.nio.Buffer;
+import java.nio.ByteBuffer;
+import java.nio.ByteOrder;
+import java.nio.FloatBuffer;
+import java.util.ArrayList;
+import java.util.HashMap;
+
+import javax.microedition.khronos.egl.EGLConfig;
+import javax.microedition.khronos.opengles.GL10;
+
+import com.android.cts.graphics.R;
+
+import android.content.Context;
+import android.content.res.Resources;
+import android.graphics.Bitmap;
+import android.graphics.Bitmap.Config;
+import android.graphics.BitmapFactory;
+import android.graphics.Color;
+import android.graphics.SurfaceTexture;
+import android.opengl.ETC1;
+import android.opengl.ETC1Util;
+import android.opengl.GLES20;
+import android.opengl.GLSurfaceView;
+import android.opengl.GLUtils;
+import android.opengl.Matrix;
+import android.util.Log;
+import android.view.Surface;
+
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
+
+class CompressedTextureSurfaceView extends GLSurfaceView {
+    private static final String TAG = "CompressedTextureSurfaceView";
+    private static final int SLEEP_TIME_MS = 1000;
+
+    CompressedTextureRender mRenderer;
+
+    public CompressedTextureSurfaceView(Context context,
+                                        Bitmap base,
+                                        CompressedTextureLoader.Texture compressed) {
+        super(context);
+
+        setEGLContextClientVersion(2);
+        mRenderer = new CompressedTextureRender(context, base, compressed);
+        setRenderer(mRenderer);
+        setRenderMode(RENDERMODE_WHEN_DIRTY);
+    }
+
+    @Override
+    public void onResume() {
+        super.onResume();
+    }
+
+    public boolean getTestPassed() throws InterruptedException {
+        return mRenderer.getTestPassed();
+    }
+
+    private static class CompressedTextureRender implements GLSurfaceView.Renderer {
+        private static String TAG = "CompressedTextureRender";
+
+        private static final int ALLOWED_DELTA = 25;
+        private static final int FBO_PIXEL_SIZE_BYTES = 4;
+        private static final int FLOAT_SIZE_BYTES = 4;
+        private static final int TRIANGLE_VERTICES_DATA_STRIDE_BYTES = 5 * FLOAT_SIZE_BYTES;
+        private static final int TRIANGLE_VERTICES_DATA_POS_OFFSET = 0;
+        private static final int TRIANGLE_VERTICES_DATA_UV_OFFSET = 3;
+        private final float[] mTriangleVerticesData = {
+            // X, Y, Z, U, V
+            -1.0f, -1.0f, 0, 0.f, 0.f,
+            1.0f, -1.0f, 0, 1.f, 0.f,
+            -1.0f,  1.0f, 0, 0.f, 1.f,
+            1.0f,  1.0f, 0, 1.f, 1.f,
+        };
+
+        private FloatBuffer mTriangleVertices;
+
+        private final String mVertexShader =
+                "uniform mat4 uMVPMatrix;\n" +
+                "attribute vec4 aPosition;\n" +
+                "attribute vec4 aTextureCoord;\n" +
+                "varying vec2 vTextureCoord;\n" +
+                "void main() {\n" +
+                "  gl_Position = uMVPMatrix * aPosition;\n" +
+                "  vTextureCoord = aTextureCoord.xy;\n" +
+                "}\n";
+
+        private final String mFragmentShader =
+                "precision mediump float;\n" +
+                "varying vec2 vTextureCoord;\n" +
+                "uniform sampler2D sTexture;\n" +
+                "void main() {\n" +
+                "  gl_FragColor = texture2D(sTexture, vTextureCoord);\n" +
+                "}\n";
+
+        private float[] mMVPMatrix = new float[16];
+        private float[] mSTMatrix = new float[16];
+
+        private int mProgram;
+        private int mTextureID;
+        private int muMVPMatrixHandle;
+        private int maPositionHandle;
+        private int maTextureHandle;
+        private int msTextureHandle;
+
+        private int mColorTargetID;
+        private int mFrameBufferObjectID;
+
+        private boolean updateSurface = false;
+
+        private boolean mTestPassed;
+        private CountDownLatch mDoneSignal;
+
+        Bitmap mBaseTexture;
+        CompressedTextureLoader.Texture mCompressedTexture;
+
+        int mWidth;
+        int mHeight;
+
+        ByteBuffer mReadBackBuffer;
+
+        boolean getTestPassed() throws InterruptedException {
+            if (!mDoneSignal.await(2000L, TimeUnit.MILLISECONDS)) {
+                throw new IllegalStateException("Coudn't finish drawing frames!");
+            }
+
+            return mTestPassed;
+        }
+
+        public CompressedTextureRender(Context context,
+                                       Bitmap base,
+                                       CompressedTextureLoader.Texture compressed) {
+            mBaseTexture = base;
+            mCompressedTexture = compressed;
+            mTriangleVertices = ByteBuffer.allocateDirect(
+                mTriangleVerticesData.length * FLOAT_SIZE_BYTES)
+                    .order(ByteOrder.nativeOrder()).asFloatBuffer();
+            mTriangleVertices.put(mTriangleVerticesData).position(0);
+
+            Matrix.setIdentityM(mSTMatrix, 0);
+
+            int byteBufferSize = mBaseTexture.getWidth() *
+                                 mBaseTexture.getHeight() *
+                                 FBO_PIXEL_SIZE_BYTES;
+            mReadBackBuffer = ByteBuffer.allocateDirect(byteBufferSize);
+
+            mDoneSignal = new CountDownLatch(1);
+        }
+
+        private void renderQuad(int textureID) {
+            GLES20.glUseProgram(mProgram);
+            checkGlError("glUseProgram");
+
+            GLES20.glActiveTexture(GLES20.GL_TEXTURE0);
+            GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, textureID);
+
+            mTriangleVertices.position(TRIANGLE_VERTICES_DATA_POS_OFFSET);
+            GLES20.glVertexAttribPointer(maPositionHandle, 3, GLES20.GL_FLOAT, false,
+                TRIANGLE_VERTICES_DATA_STRIDE_BYTES, mTriangleVertices);
+            checkGlError("glVertexAttribPointer maPosition");
+            GLES20.glEnableVertexAttribArray(maPositionHandle);
+            checkGlError("glEnableVertexAttribArray maPositionHandle");
+
+            mTriangleVertices.position(TRIANGLE_VERTICES_DATA_UV_OFFSET);
+            GLES20.glVertexAttribPointer(maTextureHandle, 2, GLES20.GL_FLOAT, false,
+                TRIANGLE_VERTICES_DATA_STRIDE_BYTES, mTriangleVertices);
+            checkGlError("glVertexAttribPointer maTextureHandle");
+            GLES20.glEnableVertexAttribArray(maTextureHandle);
+            checkGlError("glEnableVertexAttribArray maTextureHandle");
+
+            Matrix.setIdentityM(mMVPMatrix, 0);
+            GLES20.glUniformMatrix4fv(muMVPMatrixHandle, 1, false, mMVPMatrix, 0);
+
+            GLES20.glDrawArrays(GLES20.GL_TRIANGLE_STRIP, 0, 4);
+            checkGlError("glDrawArrays");
+        }
+
+        private int getUnsignedByte(byte val) {
+            return 0xFF & ((int)val);
+        }
+
+        private boolean comparePixel(int x, int y) {
+            int w = mBaseTexture.getWidth();
+            int sampleStart = (y * w + x) * FBO_PIXEL_SIZE_BYTES;
+
+            int R = getUnsignedByte(mReadBackBuffer.get(sampleStart));
+            int G = getUnsignedByte(mReadBackBuffer.get(sampleStart + 1));
+            int B = getUnsignedByte(mReadBackBuffer.get(sampleStart + 2));
+
+            int original = mBaseTexture.getPixel(x, y);
+
+            int deltaR = Math.abs(R - Color.red(original));
+            int deltaG = Math.abs(G - Color.green(original));
+            int deltaB = Math.abs(B - Color.blue(original));
+
+            if (deltaR <= ALLOWED_DELTA &&
+                deltaG <= ALLOWED_DELTA &&
+                deltaB <= ALLOWED_DELTA) {
+                return true;
+            }
+
+            Log.i("PIXEL DELTA", "R: " + deltaR + " G: " + deltaG + " B: " + deltaB);
+
+            return false;
+        }
+
+        private void comparePixels() {
+            int w = mBaseTexture.getWidth();
+            int h = mBaseTexture.getWidth();
+            int wOver4 = w / 4;
+            int hOver4 = h / 4;
+
+            // Sample 4 points in the image. Test is designed so that
+            // sample areas are low frequency and easy to compare
+            boolean sample1Matches = comparePixel(wOver4, hOver4);
+            boolean sample2Matches = comparePixel(wOver4 * 3, hOver4);
+            boolean sample3Matches = comparePixel(wOver4, hOver4 * 3);
+            boolean sample4Matches = comparePixel(wOver4 * 3, hOver4 * 3);
+
+            mTestPassed = sample1Matches && sample2Matches && sample3Matches && sample4Matches;
+            mDoneSignal.countDown();
+        }
+
+        public void onDrawFrame(GL10 glUnused) {
+            if (mProgram == 0) {
+                return;
+            }
+
+            GLES20.glBindFramebuffer(GLES20.GL_FRAMEBUFFER, mFrameBufferObjectID);
+            GLES20.glViewport(0, 0, mBaseTexture.getWidth(), mBaseTexture.getHeight());
+            GLES20.glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
+            renderQuad(mTextureID);
+            GLES20.glReadPixels(0, 0, mBaseTexture.getWidth(), mBaseTexture.getHeight(),
+                                GLES20.GL_RGBA, GLES20.GL_UNSIGNED_BYTE, mReadBackBuffer);
+            comparePixels();
+            GLES20.glBindFramebuffer(GLES20.GL_FRAMEBUFFER, 0);
+
+            GLES20.glViewport(0, 0, mWidth, mHeight);
+            GLES20.glClearColor(0.5f, 0.5f, 0.5f, 1.0f);
+            GLES20.glClear( GLES20.GL_DEPTH_BUFFER_BIT | GLES20.GL_COLOR_BUFFER_BIT);
+
+            renderQuad(mColorTargetID);
+
+            GLES20.glFinish();
+        }
+
+        public void onSurfaceChanged(GL10 glUnused, int width, int height) {
+            mWidth = width;
+            mHeight = height;
+        }
+
+        private void setupSamplers() {
+            GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D,
+                    GLES20.GL_TEXTURE_WRAP_S, GLES20.GL_CLAMP_TO_EDGE);
+            GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D,
+                    GLES20.GL_TEXTURE_WRAP_T, GLES20.GL_CLAMP_TO_EDGE);
+            GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D,
+                    GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_LINEAR);
+            GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D,
+                    GLES20.GL_TEXTURE_MAG_FILTER, GLES20.GL_LINEAR);
+        }
+
+        private void initFBO() {
+            int[] textures = new int[1];
+            GLES20.glGenTextures(1, textures, 0);
+
+            mColorTargetID = textures[0];
+            GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, mColorTargetID);
+            checkGlError("glBindTexture mColorTargetID");
+            setupSamplers();
+            GLES20.glTexImage2D(GLES20.GL_TEXTURE_2D, 0, GLES20.GL_RGBA,
+                                mBaseTexture.getWidth(), mBaseTexture.getHeight(), 0,
+                                GLES20.GL_RGBA, GLES20.GL_UNSIGNED_BYTE, null);
+            checkGlError("glTexImage2D mColorTargetID");
+
+            GLES20.glGenFramebuffers(1, textures, 0);
+            mFrameBufferObjectID = textures[0];
+            GLES20.glBindFramebuffer(GLES20.GL_FRAMEBUFFER, mFrameBufferObjectID);
+
+            GLES20.glFramebufferTexture2D(GLES20.GL_FRAMEBUFFER, GLES20.GL_COLOR_ATTACHMENT0,
+                                          GLES20.GL_TEXTURE_2D, mColorTargetID, 0);
+
+            int status = GLES20.glCheckFramebufferStatus(GLES20.GL_FRAMEBUFFER);
+            if(status != GLES20.GL_FRAMEBUFFER_COMPLETE) {
+                throw new RuntimeException("Failed to initialize framebuffer object");
+            }
+
+            GLES20.glBindFramebuffer(GLES20.GL_FRAMEBUFFER, 0);
+        }
+
+        public void onSurfaceCreated(GL10 glUnused, EGLConfig config) {
+            if (mCompressedTexture != null && !mCompressedTexture.isSupported()) {
+                mTestPassed = true;
+                mDoneSignal.countDown();
+                return;
+            }
+
+            initFBO();
+
+            mProgram = createProgram(mVertexShader, mFragmentShader);
+            if (mProgram == 0) {
+                return;
+            }
+            maPositionHandle = GLES20.glGetAttribLocation(mProgram, "aPosition");
+            checkGlError("glGetAttribLocation aPosition");
+            if (maPositionHandle == -1) {
+                throw new RuntimeException("Could not get attrib location for aPosition");
+            }
+            maTextureHandle = GLES20.glGetAttribLocation(mProgram, "aTextureCoord");
+            checkGlError("glGetAttribLocation aTextureCoord");
+            if (maTextureHandle == -1) {
+                throw new RuntimeException("Could not get attrib location for aTextureCoord");
+            }
+
+            muMVPMatrixHandle = GLES20.glGetUniformLocation(mProgram, "uMVPMatrix");
+            checkGlError("glGetUniformLocation uMVPMatrix");
+            if (muMVPMatrixHandle == -1) {
+                throw new RuntimeException("Could not get attrib location for uMVPMatrix");
+            }
+
+            int[] textures = new int[1];
+            GLES20.glGenTextures(1, textures, 0);
+
+            mTextureID = textures[0];
+            GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, mTextureID);
+            checkGlError("glBindTexture mTextureID");
+            setupSamplers();
+
+            if (mCompressedTexture == null) {
+                GLUtils.texImage2D(GLES20.GL_TEXTURE_2D, 0, mBaseTexture, 0);
+                checkGlError("texImage2D mBaseTexture");
+            } else {
+                GLES20.glCompressedTexImage2D(GLES20.GL_TEXTURE_2D,
+                                              0,
+                                              mCompressedTexture.getFormat(),
+                                              mCompressedTexture.getWidth(),
+                                              mCompressedTexture.getHeight(),
+                                              0,
+                                              mCompressedTexture.getData().remaining(),
+                                              mCompressedTexture.getData());
+                checkGlError("glCompressedTexImage2D mTextureID");
+            }
+        }
+
+        synchronized public void onFrameAvailable(SurfaceTexture surface) {
+            updateSurface = true;
+        }
+
+        private int loadShader(int shaderType, String source) {
+            int shader = GLES20.glCreateShader(shaderType);
+            if (shader != 0) {
+                GLES20.glShaderSource(shader, source);
+                GLES20.glCompileShader(shader);
+                int[] compiled = new int[1];
+                GLES20.glGetShaderiv(shader, GLES20.GL_COMPILE_STATUS, compiled, 0);
+                if (compiled[0] == 0) {
+                    Log.e(TAG, "Could not compile shader " + shaderType + ":");
+                    Log.e(TAG, GLES20.glGetShaderInfoLog(shader));
+                    GLES20.glDeleteShader(shader);
+                    shader = 0;
+                }
+            }
+            return shader;
+        }
+
+        private int createProgram(String vertexSource, String fragmentSource) {
+            int vertexShader = loadShader(GLES20.GL_VERTEX_SHADER, vertexSource);
+            if (vertexShader == 0) {
+                return 0;
+            }
+            int pixelShader = loadShader(GLES20.GL_FRAGMENT_SHADER, fragmentSource);
+            if (pixelShader == 0) {
+                return 0;
+            }
+
+            int program = GLES20.glCreateProgram();
+            if (program != 0) {
+                GLES20.glAttachShader(program, vertexShader);
+                checkGlError("glAttachShader");
+                GLES20.glAttachShader(program, pixelShader);
+                checkGlError("glAttachShader");
+                GLES20.glLinkProgram(program);
+                int[] linkStatus = new int[1];
+                GLES20.glGetProgramiv(program, GLES20.GL_LINK_STATUS, linkStatus, 0);
+                if (linkStatus[0] != GLES20.GL_TRUE) {
+                    Log.e(TAG, "Could not link program: ");
+                    Log.e(TAG, GLES20.glGetProgramInfoLog(program));
+                    GLES20.glDeleteProgram(program);
+                    program = 0;
+                }
+            }
+            return program;
+        }
+
+        private void checkGlError(String op) {
+            int error;
+            while ((error = GLES20.glGetError()) != GLES20.GL_NO_ERROR) {
+                Log.e(TAG, op + ": glError " + error);
+                throw new RuntimeException(op + ": glError " + error);
+            }
+        }
+
+    }  // End of class CompressedTextureRender.
+
+}  // End of class CompressedTextureSurfaceView.
diff --git a/tests/tests/graphics/src/android/opengl/cts/CompressedTextureTest.java b/tests/tests/graphics/src/android/opengl/cts/CompressedTextureTest.java
index 3ed9131..c153712 100644
--- a/tests/tests/graphics/src/android/opengl/cts/CompressedTextureTest.java
+++ b/tests/tests/graphics/src/android/opengl/cts/CompressedTextureTest.java
@@ -21,17 +21,17 @@
 
 /**
  */
-public class CompressedTextureTest extends ActivityInstrumentationTestCase2<CompressedTextureStubActivity> {
+public class CompressedTextureTest extends ActivityInstrumentationTestCase2<CompressedTextureCtsActivity> {
 
     public CompressedTextureTest() {
-        super("com.android.cts.stub", CompressedTextureStubActivity.class);
+        super("com.android.cts.graphics", CompressedTextureCtsActivity.class);
     }
 
     private void launchTest(String format) throws Exception {
         Bundle extras = new Bundle();
         extras.putString("TextureFormat", format);
-        CompressedTextureStubActivity activity = launchActivity("com.android.cts.stub",
-                CompressedTextureStubActivity.class, extras);
+        CompressedTextureCtsActivity activity = launchActivity("com.android.cts.graphics",
+                CompressedTextureCtsActivity.class, extras);
         activity.finish();
         assertTrue(activity.getPassed());
     }
diff --git a/tests/tests/graphics/src/android/opengl/cts/EglConfigCtsActivity.java b/tests/tests/graphics/src/android/opengl/cts/EglConfigCtsActivity.java
new file mode 100644
index 0000000..cef9e2f
--- /dev/null
+++ b/tests/tests/graphics/src/android/opengl/cts/EglConfigCtsActivity.java
@@ -0,0 +1,98 @@
+/*
+ * Copyright (C) 2011 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.opengl.cts;
+
+import android.app.Activity;
+import android.content.Intent;
+import android.opengl.GLSurfaceView;
+import android.os.Bundle;
+import android.view.WindowManager;
+
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * {@link Activity} with a {@link GLSurfaceView} that chooses a specific configuration.
+ */
+public class EglConfigCtsActivity extends Activity {
+
+    public static final String CONFIG_ID_EXTRA = "eglConfigId";
+
+    public static final String CONTEXT_CLIENT_VERSION_EXTRA = "eglContextClientVersion";
+
+    private EglConfigGLSurfaceView mView;
+
+    private CountDownLatch mFinishedDrawing;
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        int configId = getConfigId();
+        int contextClientVersion = getContextClientVersion();
+        setTitle("EGL Config Id: " + configId + " Client Version: " + contextClientVersion);
+
+        // Dismiss keyguard and keep screen on while this test is on.
+        getWindow().addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD |
+                WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON |
+                WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
+
+        mFinishedDrawing = new CountDownLatch(1);
+        mView = new EglConfigGLSurfaceView(this, configId, contextClientVersion, new Runnable() {
+            @Override
+            public void run() {
+                mFinishedDrawing.countDown();
+            }
+        });
+        setContentView(mView);
+    }
+
+    private int getConfigId() {
+        Intent intent = getIntent();
+        if (intent != null) {
+            return intent.getIntExtra(CONFIG_ID_EXTRA, 0);
+        } else {
+            return 0;
+        }
+    }
+
+    private int getContextClientVersion() {
+        Intent intent = getIntent();
+        if (intent != null) {
+            return intent.getIntExtra(CONTEXT_CLIENT_VERSION_EXTRA, 0);
+        } else {
+            return 0;
+        }
+    }
+
+    @Override
+    protected void onResume() {
+        super.onResume();
+        mView.onResume();
+    }
+
+    @Override
+    protected void onPause() {
+        super.onPause();
+        mView.onPause();
+    }
+
+    public void waitToFinishDrawing() throws InterruptedException {
+        if (!mFinishedDrawing.await(3, TimeUnit.SECONDS)) {
+            throw new IllegalStateException("Coudn't finish drawing frames!");
+        }
+    }
+}
diff --git a/tests/tests/graphics/src/android/opengl/cts/EglConfigGLSurfaceView.java b/tests/tests/graphics/src/android/opengl/cts/EglConfigGLSurfaceView.java
new file mode 100644
index 0000000..03e8d94
--- /dev/null
+++ b/tests/tests/graphics/src/android/opengl/cts/EglConfigGLSurfaceView.java
@@ -0,0 +1,327 @@
+/*
+ * Copyright (C) 2011 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.opengl.cts;
+
+import android.content.Context;
+import android.opengl.GLES20;
+import android.opengl.GLSurfaceView;
+import android.util.Log;
+
+import java.nio.ByteBuffer;
+import java.nio.ByteOrder;
+import java.nio.FloatBuffer;
+
+import javax.microedition.khronos.egl.EGL10;
+import javax.microedition.khronos.egl.EGLConfig;
+import javax.microedition.khronos.egl.EGLDisplay;
+import javax.microedition.khronos.opengles.GL10;
+
+/**
+ * {@link GLSurfaceView} that uses the EGL configuration specified. Draws a couple frames of a red
+ * triangle and then calls the callback.
+ */
+public class EglConfigGLSurfaceView extends GLSurfaceView {
+
+    private static final String TAG = EglConfigGLSurfaceView.class.getName();
+
+    private final int mConfigId;
+
+    private final Runnable mCallback;
+
+    public EglConfigGLSurfaceView(Context context, int configId, int contextClientVersion,
+            Runnable callback) {
+        super(context);
+        mConfigId = configId;
+        mCallback = callback;
+        setEGLConfigChooser(new ConfigChooser());
+        setEGLContextClientVersion(contextClientVersion);
+        setRenderer(contextClientVersion == 1
+                ? new Renderer()
+                : new Renderer20());
+    }
+
+    private class ConfigChooser implements GLSurfaceView.EGLConfigChooser {
+
+        public EGLConfig chooseConfig(EGL10 egl, EGLDisplay display) {
+            int[] attributeList = new int[] {
+                    EGL10.EGL_CONFIG_ID, mConfigId,
+                    EGL10.EGL_NONE
+            };
+
+            EGLConfig[] configs = new EGLConfig[1];
+            if (egl.eglChooseConfig(display, attributeList, configs, 1, new int[] {1})) {
+                // Print out the configuration since we may crash...
+                printConfig(egl, display, configs[0]);
+                return configs[0];
+            } else {
+                throw new IllegalStateException("Could not get EGL config...");
+            }
+        }
+    }
+
+    private class Renderer implements GLSurfaceView.Renderer {
+
+        private int mNumFrames;
+
+        private FloatBuffer mFloatBuffer;
+
+        public void onSurfaceCreated(GL10 gl, EGLConfig config) {
+            float[] triangleVertices = {
+                    0.0f, 1.0f, -1.0f,
+                    -1.0f, -1.0f, -1.0f,
+                    1.0f, -1.0f, -1.0f
+            };
+
+            ByteBuffer byteBuffer = ByteBuffer.allocateDirect(triangleVertices.length * 4);
+            byteBuffer.order(ByteOrder.nativeOrder());
+
+            mFloatBuffer = ByteBuffer.allocateDirect(triangleVertices.length * 4)
+                    .order(ByteOrder.nativeOrder())
+                    .asFloatBuffer();
+            mFloatBuffer.put(triangleVertices).position(0);
+
+            gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
+        }
+
+        public void onDrawFrame(GL10 gl) {
+            gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
+            gl.glColor4f(1.0f, 0, 0, 0);
+            gl.glVertexPointer(3, GL10.GL_FLOAT, 0, mFloatBuffer);
+            gl.glDrawArrays(GL10.GL_TRIANGLES, 0, 9);
+
+            if (++mNumFrames == 10) {
+                post(mCallback);
+            }
+        }
+
+        public void onSurfaceChanged(GL10 gl, int width, int height) {
+            gl.glViewport(0, 0, width, height);
+        }
+    }
+
+    private class Renderer20 implements GLSurfaceView.Renderer {
+
+        private FloatBuffer mFloatBuffer;
+
+        private final String mVertexShader =
+            "attribute vec4 aPosition;\n" +
+            "void main() {\n" +
+            "  gl_Position = aPosition;\n" +
+            "}\n";
+
+        private final String mFragmentShader =
+            "void main() {\n" +
+            "  gl_FragColor = vec4(0.0, 0.0, 1.0, 1.0);\n" +
+            "}\n";
+
+        private int mProgram;
+
+        private int maPositionHandle;
+
+        private int mNumFrames;
+
+        public void onSurfaceCreated(GL10 gl, EGLConfig config) {
+            mProgram = createProgram(mVertexShader, mFragmentShader);
+            if (mProgram == 0) {
+                throw new RuntimeException("Could not create program");
+            }
+
+            maPositionHandle = GLES20.glGetAttribLocation(mProgram, "aPosition");
+            checkGlError("glGetAttribLocation aPosition");
+            if (maPositionHandle == -1) {
+                throw new RuntimeException("Could not get attrib location for aPosition");
+            }
+
+            float[] triangleVertices = {
+                    0.0f, 1.0f, 0.0f,
+                    -1.0f, -1.0f, 0.0f,
+                    1.0f, -1.0f, 0.0f
+            };
+
+            mFloatBuffer = ByteBuffer.allocateDirect(triangleVertices.length * 4)
+                    .order(ByteOrder.nativeOrder())
+                    .asFloatBuffer();
+            mFloatBuffer.put(triangleVertices).position(0);
+        }
+
+        private int createProgram(String vertexSource, String fragmentSource) {
+            int vertexShader = loadShader(GLES20.GL_VERTEX_SHADER, vertexSource);
+            if (vertexShader == 0) {
+                return 0;
+            }
+
+            int pixelShader = loadShader(GLES20.GL_FRAGMENT_SHADER, fragmentSource);
+            if (pixelShader == 0) {
+                return 0;
+            }
+
+            int program = GLES20.glCreateProgram();
+            if (program != 0) {
+                GLES20.glAttachShader(program, vertexShader);
+                checkGlError("glAttachShader");
+                GLES20.glAttachShader(program, pixelShader);
+                checkGlError("glAttachShader");
+                GLES20.glLinkProgram(program);
+                int[] linkStatus = new int[1];
+                GLES20.glGetProgramiv(program, GLES20.GL_LINK_STATUS, linkStatus, 0);
+                if (linkStatus[0] != GLES20.GL_TRUE) {
+                    Log.e(TAG, "Could not link program: ");
+                    Log.e(TAG, GLES20.glGetProgramInfoLog(program));
+                    GLES20.glDeleteProgram(program);
+                    program = 0;
+                }
+            }
+            return program;
+        }
+
+        private int loadShader(int shaderType, String source) {
+            int shader = GLES20.glCreateShader(shaderType);
+            if (shader != 0) {
+                GLES20.glShaderSource(shader, source);
+                GLES20.glCompileShader(shader);
+                int[] compiled = new int[1];
+                GLES20.glGetShaderiv(shader, GLES20.GL_COMPILE_STATUS, compiled, 0);
+                if (compiled[0] == 0) {
+                    Log.e(TAG, "Could not compile shader " + shaderType + ":");
+                    Log.e(TAG, GLES20.glGetShaderInfoLog(shader));
+                    GLES20.glDeleteShader(shader);
+                    shader = 0;
+                }
+            }
+            return shader;
+        }
+
+        private void checkGlError(String op) {
+            int error;
+            while ((error = GLES20.glGetError()) != GLES20.GL_NO_ERROR) {
+                Log.e(TAG, op + ": glError " + error);
+                throw new RuntimeException(op + ": glError " + error);
+            }
+        }
+
+        @Override
+        public void onDrawFrame(GL10 gl) {
+            GLES20.glClearColor(0, 0, 0, 1);
+            GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT);
+            GLES20.glUseProgram(mProgram);
+
+            GLES20.glVertexAttribPointer(maPositionHandle, 3, GLES20.GL_FLOAT, false,
+                    0, mFloatBuffer);
+            checkGlError("glVertexAttribPointer maPosition");
+
+            GLES20.glEnableVertexAttribArray(maPositionHandle);
+            checkGlError("glEnableVertexAttribArray maPositionHandle");
+
+            GLES20.glDrawArrays(GLES20.GL_TRIANGLES, 0, 3);
+            checkGlError("glDrawArrays");
+
+            if (++mNumFrames == 10) {
+                post(mCallback);
+            }
+        }
+
+        public void onSurfaceChanged(GL10 gl, int width, int height) {
+            GLES20.glViewport(0, 0, width, height);
+        }
+    }
+
+    /** Ripped from the NDK sample GL2JNIView class. */
+    private static void printConfig(EGL10 egl, EGLDisplay display,
+            EGLConfig config) {
+        int[] attributes = {
+                EGL10.EGL_BUFFER_SIZE,
+                EGL10.EGL_ALPHA_SIZE,
+                EGL10.EGL_BLUE_SIZE,
+                EGL10.EGL_GREEN_SIZE,
+                EGL10.EGL_RED_SIZE,
+                EGL10.EGL_DEPTH_SIZE,
+                EGL10.EGL_STENCIL_SIZE,
+                EGL10.EGL_CONFIG_CAVEAT,
+                EGL10.EGL_CONFIG_ID,
+                EGL10.EGL_LEVEL,
+                EGL10.EGL_MAX_PBUFFER_HEIGHT,
+                EGL10.EGL_MAX_PBUFFER_PIXELS,
+                EGL10.EGL_MAX_PBUFFER_WIDTH,
+                EGL10.EGL_NATIVE_RENDERABLE,
+                EGL10.EGL_NATIVE_VISUAL_ID,
+                EGL10.EGL_NATIVE_VISUAL_TYPE,
+                0x3030, // EGL10.EGL_PRESERVED_RESOURCES,
+                EGL10.EGL_SAMPLES,
+                EGL10.EGL_SAMPLE_BUFFERS,
+                EGL10.EGL_SURFACE_TYPE,
+                EGL10.EGL_TRANSPARENT_TYPE,
+                EGL10.EGL_TRANSPARENT_RED_VALUE,
+                EGL10.EGL_TRANSPARENT_GREEN_VALUE,
+                EGL10.EGL_TRANSPARENT_BLUE_VALUE,
+                0x3039, // EGL10.EGL_BIND_TO_TEXTURE_RGB,
+                0x303A, // EGL10.EGL_BIND_TO_TEXTURE_RGBA,
+                0x303B, // EGL10.EGL_MIN_SWAP_INTERVAL,
+                0x303C, // EGL10.EGL_MAX_SWAP_INTERVAL,
+                EGL10.EGL_LUMINANCE_SIZE,
+                EGL10.EGL_ALPHA_MASK_SIZE,
+                EGL10.EGL_COLOR_BUFFER_TYPE,
+                EGL10.EGL_RENDERABLE_TYPE,
+                0x3042 // EGL10.EGL_CONFORMANT
+        };
+        String[] names = {
+                "EGL_BUFFER_SIZE",
+                "EGL_ALPHA_SIZE",
+                "EGL_BLUE_SIZE",
+                "EGL_GREEN_SIZE",
+                "EGL_RED_SIZE",
+                "EGL_DEPTH_SIZE",
+                "EGL_STENCIL_SIZE",
+                "EGL_CONFIG_CAVEAT",
+                "EGL_CONFIG_ID",
+                "EGL_LEVEL",
+                "EGL_MAX_PBUFFER_HEIGHT",
+                "EGL_MAX_PBUFFER_PIXELS",
+                "EGL_MAX_PBUFFER_WIDTH",
+                "EGL_NATIVE_RENDERABLE",
+                "EGL_NATIVE_VISUAL_ID",
+                "EGL_NATIVE_VISUAL_TYPE",
+                "EGL_PRESERVED_RESOURCES",
+                "EGL_SAMPLES",
+                "EGL_SAMPLE_BUFFERS",
+                "EGL_SURFACE_TYPE",
+                "EGL_TRANSPARENT_TYPE",
+                "EGL_TRANSPARENT_RED_VALUE",
+                "EGL_TRANSPARENT_GREEN_VALUE",
+                "EGL_TRANSPARENT_BLUE_VALUE",
+                "EGL_BIND_TO_TEXTURE_RGB",
+                "EGL_BIND_TO_TEXTURE_RGBA",
+                "EGL_MIN_SWAP_INTERVAL",
+                "EGL_MAX_SWAP_INTERVAL",
+                "EGL_LUMINANCE_SIZE",
+                "EGL_ALPHA_MASK_SIZE",
+                "EGL_COLOR_BUFFER_TYPE",
+                "EGL_RENDERABLE_TYPE",
+                "EGL_CONFORMANT"
+        };
+        int[] value = new int[1];
+        for (int i = 0; i < attributes.length; i++) {
+            int attribute = attributes[i];
+            String name = names[i];
+            if (egl.eglGetConfigAttrib(display, config, attribute, value)) {
+                Log.w(TAG, String.format("  %s: %d\n", name, value[0]));
+            } else {
+                // Log.w(TAG, String.format("  %s: failed\n", name));
+                while (egl.eglGetError() != EGL10.EGL_SUCCESS);
+            }
+        }
+    }
+}
diff --git a/tests/tests/graphics/src/android/opengl/cts/EglConfigTest.java b/tests/tests/graphics/src/android/opengl/cts/EglConfigTest.java
index 2f918db..14c8e10 100644
--- a/tests/tests/graphics/src/android/opengl/cts/EglConfigTest.java
+++ b/tests/tests/graphics/src/android/opengl/cts/EglConfigTest.java
@@ -28,7 +28,7 @@
 /**
  * Test that gets a list of EGL configurations and tries to use each one in a GLSurfaceView.
  */
-public class EglConfigTest extends ActivityInstrumentationTestCase2<EglConfigStubActivity> {
+public class EglConfigTest extends ActivityInstrumentationTestCase2<EglConfigCtsActivity> {
 
     private static final int EGL_OPENGL_ES_BIT = 0x1;
 
@@ -37,7 +37,7 @@
     private Instrumentation mInstrumentation;
 
     public EglConfigTest() {
-        super("com.android.cts.stub", EglConfigStubActivity.class);
+        super("com.android.cts.graphics", EglConfigCtsActivity.class);
     }
 
     @Override
@@ -58,10 +58,10 @@
             throws InterruptedException {
         for (int configId : configIds) {
             Bundle extras = new Bundle();
-            extras.putInt(EglConfigStubActivity.CONFIG_ID_EXTRA, configId);
-            extras.putInt(EglConfigStubActivity.CONTEXT_CLIENT_VERSION_EXTRA, contextClientVersion);
-            EglConfigStubActivity activity = launchActivity("com.android.cts.stub",
-                    EglConfigStubActivity.class, extras);
+            extras.putInt(EglConfigCtsActivity.CONFIG_ID_EXTRA, configId);
+            extras.putInt(EglConfigCtsActivity.CONTEXT_CLIENT_VERSION_EXTRA, contextClientVersion);
+            EglConfigCtsActivity activity = launchActivity("com.android.cts.graphics",
+                    EglConfigCtsActivity.class, extras);
             activity.waitToFinishDrawing();
             activity.finish();
             mInstrumentation.waitForIdleSync();
diff --git a/tests/tests/graphics/src/android/opengl/cts/GLSurfaceViewCtsActivity.java b/tests/tests/graphics/src/android/opengl/cts/GLSurfaceViewCtsActivity.java
new file mode 100644
index 0000000..9557406
--- /dev/null
+++ b/tests/tests/graphics/src/android/opengl/cts/GLSurfaceViewCtsActivity.java
@@ -0,0 +1,123 @@
+/*
+ * Copyright (C) 2010 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.opengl.cts;
+
+import android.app.Activity;
+import android.opengl.GLSurfaceView;
+import android.os.Bundle;
+import android.view.Window;
+
+import javax.microedition.khronos.egl.EGLConfig;
+import javax.microedition.khronos.opengles.GL10;
+
+/**
+ * A minimal activity for testing {@link android.opengl.GLSurfaceView}.
+ * Also accepts non-blank renderers to allow its use for more complex tests.
+ */
+public class GLSurfaceViewCtsActivity extends Activity {
+
+    private static class Renderer implements GLSurfaceView.Renderer {
+
+        public void onDrawFrame(GL10 gl) {
+            // Do nothing.
+        }
+
+        public void onSurfaceChanged(GL10 gl, int width, int height) {
+            // Do nothing.
+        }
+
+        public void onSurfaceCreated(GL10 gl, EGLConfig config) {
+            // Do nothing.
+        }
+    }
+
+    private GLSurfaceView mView;
+
+    /** To override the blank renderer, or other settings, these
+     * static set* methods must be called before onCreate() is called.
+     * If using ActivityInstrumentationTestCase2, that means the set
+     * methods need to be called before calling getActivity in the
+     * test setUp().
+     */
+    private static GLSurfaceView.Renderer mRenderer = null;
+    public static void setRenderer(GLSurfaceView.Renderer renderer) {
+        mRenderer = renderer;
+    }
+    public static void resetRenderer() {
+        mRenderer = null;
+    }
+
+    private static int mRenderMode = 0;
+    private static boolean mRenderModeSet = false;
+    public static void setRenderMode(int renderMode) {
+        mRenderModeSet = true;
+        mRenderMode = renderMode;
+    }
+    public static void resetRenderMode() {
+        mRenderModeSet = false;
+        mRenderMode = 0;
+    }
+
+    private static int mGlVersion = 0;
+    private static boolean mGlVersionSet = false;
+    public static void setGlVersion(int glVersion) {
+        mGlVersionSet = true;
+        mGlVersion = glVersion;
+    }
+    public static void resetGlVersion() {
+        mGlVersionSet = false;
+        mGlVersion = 0;
+    }
+
+    @Override
+    public void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        mView = new GLSurfaceView(this);
+        // Only set this if explicitly asked for
+        if (mGlVersionSet) {
+            mView.setEGLContextClientVersion(mGlVersion);
+        }
+        // Use no-op renderer by default
+        if (mRenderer == null) {
+            mView.setRenderer(new Renderer());
+        } else {
+            mView.setRenderer(mRenderer);
+        }
+        // Only set this if explicitly asked for
+        if (mRenderModeSet) {
+            mView.setRenderMode(mRenderMode);
+        }
+        this.requestWindowFeature(Window.FEATURE_NO_TITLE);
+        setContentView(mView);
+    }
+
+    public GLSurfaceView getView() {
+        return mView;
+    }
+
+    @Override
+    protected void onResume() {
+        super.onResume();
+        mView.onResume();
+    }
+
+    @Override
+    protected void onPause() {
+        super.onPause();
+        mView.onPause();
+    }
+}
diff --git a/tests/tests/graphics/src/android/opengl/cts/GLSurfaceViewTest.java b/tests/tests/graphics/src/android/opengl/cts/GLSurfaceViewTest.java
index 2a8d698..87995fb 100644
--- a/tests/tests/graphics/src/android/opengl/cts/GLSurfaceViewTest.java
+++ b/tests/tests/graphics/src/android/opengl/cts/GLSurfaceViewTest.java
@@ -26,7 +26,7 @@
  * Tests for the GLSurfaceView class.
  */
 public class GLSurfaceViewTest extends
-        ActivityInstrumentationTestCase2<GLSurfaceViewStubActivity> {
+        ActivityInstrumentationTestCase2<GLSurfaceViewCtsActivity> {
 
     private static final int NUM_PAUSE_RESUME_ITERATIONS_WITHOUT_DELAY = 1000;
 
@@ -38,10 +38,10 @@
 
     private static final String TAG = "GLSurfaceViewTest";
 
-    private GLSurfaceViewStubActivity mActivity;
+    private GLSurfaceViewCtsActivity mActivity;
 
     public GLSurfaceViewTest() {
-        super("com.android.cts.stub", GLSurfaceViewStubActivity.class);
+        super("com.android.cts.graphics", GLSurfaceViewCtsActivity.class);
     }
 
     @Override
diff --git a/tests/tests/graphics/src/android/opengl/cts/OpenGlEsVersionCtsActivity.java b/tests/tests/graphics/src/android/opengl/cts/OpenGlEsVersionCtsActivity.java
new file mode 100644
index 0000000..8a85555
--- /dev/null
+++ b/tests/tests/graphics/src/android/opengl/cts/OpenGlEsVersionCtsActivity.java
@@ -0,0 +1,301 @@
+/*
+ * Copyright (C) 2010 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.opengl.cts;
+
+import android.app.Activity;
+import android.content.Intent;
+import android.opengl.GLES31;
+import android.opengl.GLES31Ext;
+import android.opengl.GLSurfaceView;
+import android.os.Bundle;
+import android.util.Log;
+
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
+
+import javax.microedition.khronos.egl.EGLConfig;
+import javax.microedition.khronos.opengles.GL10;
+
+/**
+ * {@link Activity} that queries the device's display attributes to determine what version of
+ * OpenGL ES is supported and returns what the GL version string reports.
+ */
+public class OpenGlEsVersionCtsActivity extends Activity {
+    private static String TAG = "OpenGlEsVersionCtsActivity";
+
+    private static final String EGL_CONTEXT_CLIENT_VERSION = "eglContextClientVersion";
+
+    /** Timeout to wait for the surface to be created and the version queried. */
+    private static final int TIMEOUT_SECONDS = 10;
+
+    /** Version string reported by glGetString. */
+    private String mVersionString;
+
+    /** Extensions string reported by glGetString. */
+    private String mExtensionsString;
+
+    /** Whether GL_ANDROID_extension_pack_es31a is correctly supported. */
+    private boolean mAepEs31Support = false;
+
+    /** Latch that is unlocked when the activity is done finding the version. */
+    private CountDownLatch mSurfaceCreatedLatch = new CountDownLatch(1);
+
+    public static Intent createIntent(int eglContextClientVersion) {
+        Intent intent = new Intent(Intent.ACTION_MAIN);
+        intent.putExtra(EGL_CONTEXT_CLIENT_VERSION, eglContextClientVersion);
+        return intent;
+    }
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+
+        GLSurfaceView view = new GLSurfaceView(this);
+
+        Intent intent = getIntent();
+        int eglContextClientVersion = intent.getIntExtra(EGL_CONTEXT_CLIENT_VERSION, -1);
+        if (eglContextClientVersion > 0) {
+            view.setEGLContextClientVersion(eglContextClientVersion);
+        }
+
+        view.setRenderer(new Renderer());
+        setContentView(view);
+    }
+
+    public String getVersionString() throws InterruptedException {
+        mSurfaceCreatedLatch.await(TIMEOUT_SECONDS, TimeUnit.SECONDS);
+        synchronized (this) {
+            return mVersionString;
+        }
+    }
+
+    public String getExtensionsString() throws InterruptedException {
+        mSurfaceCreatedLatch.await(TIMEOUT_SECONDS, TimeUnit.SECONDS);
+        synchronized (this) {
+            return mExtensionsString;
+        }
+    }
+
+    public boolean getAepEs31Support() throws InterruptedException {
+        mSurfaceCreatedLatch.await(TIMEOUT_SECONDS, TimeUnit.SECONDS);
+        synchronized (this) {
+            return mAepEs31Support;
+        }
+    }
+
+    public static boolean hasExtension(String extensions, String name) {
+        int start = extensions.indexOf(name);
+        while (start >= 0) {
+            // check that we didn't find a prefix of a longer extension name
+            int end = start + name.length();
+            if (end == extensions.length() || extensions.charAt(end) == ' ') {
+                return true;
+            }
+            start = extensions.indexOf(name, end);
+        }
+        return false;
+    }
+
+    private class Renderer implements GLSurfaceView.Renderer {
+        /**
+         * These shaders test at least one feature of each of the underlying extension, to verify
+         * that enabling GL_ANDROID_extension_pack_es31a correctly enables all of them.
+         */
+        private final String mAepEs31VertexShader =
+                "#version 310 es\n" +
+                "#extension GL_ANDROID_extension_pack_es31a : require\n" +
+                "void main() {\n" +
+                "  gl_Position = vec4(1, 0, 0, 1);\n" +
+                "}\n";
+
+        private final String mAepEs31TessellationControlShader =
+                "#version 310 es\n" +
+                "#extension GL_ANDROID_extension_pack_es31a : require\n" +
+                "layout(vertices = 3) out;\n" +  // GL_EXT_tessellation_shader
+                "void main() {\n" +
+                "  gl_out[gl_InvocationID].gl_Position = gl_in[gl_InvocationID].gl_Position;\n" +  // GL_EXT_shader_io_blocks
+                "  if (gl_InvocationID == 0) {\n" +
+                "    gl_BoundingBoxEXT[0] = gl_in[0].gl_Position;\n" +  // GL_EXT_primitive_bounding_box
+                "    gl_BoundingBoxEXT[1] = gl_in[1].gl_Position;\n" +
+                "  }\n" +
+                "}\n";
+
+        private final String mAepEs31TessellationEvaluationShader =
+                "#version 310 es\n" +
+                "#extension GL_ANDROID_extension_pack_es31a : require\n" +
+                "layout(triangles, equal_spacing, cw) in;\n" +
+                "void main() {\n" +
+                "  gl_Position = gl_in[0].gl_Position * gl_TessCoord.x +\n" +
+                "      gl_in[1].gl_Position * gl_TessCoord.y +\n" +
+                "      gl_in[2].gl_Position * gl_TessCoord.z;\n" +
+                "}\n";
+
+        private final String mAepEs31GeometryShader =
+                "#version 310 es\n" +
+                "#extension GL_ANDROID_extension_pack_es31a : require\n" +
+                "layout(triangles) in;\n" +  // GL_EXT_geometry_shader
+                "layout(triangle_strip, max_vertices = 3) out;\n" +
+                "sample out vec4 perSampleColor;\n" +
+                "void main() {\n" +
+                "  for (int i = 0; i < gl_in.length(); ++i) {\n" +
+                "    gl_Position = gl_in[i].gl_Position;\n" +
+                "    perSampleColor = gl_in[i].gl_Position;\n" +
+                "    EmitVertex();\n" +
+                "  }\n" +
+                "}\n";
+
+        private final String mAepEs31FragmentShader =
+                "#version 310 es\n" +
+                "#extension GL_ANDROID_extension_pack_es31a : require\n" +
+                "precision mediump float;\n" +
+                "layout(blend_support_all_equations) out;\n" +  // GL_KHR_blend_equation_advanced
+                "sample in vec4 perSampleColor;\n" +  // GL_OES_shader_multisample_interpolation
+                "layout(r32ui) coherent uniform mediump uimage2D image;\n" +
+                "uniform mediump sampler2DMSArray mySamplerMSArray;\n" +  // GL_OES_texture_storage_multisample_2d_array
+                "uniform mediump samplerBuffer mySamplerBuffer;\n" +  // GL_EXT_texture_buffer
+                "uniform mediump samplerCubeArray mySamplerCubeArray;\n" +  // GL_EXT_texture_cube_map_array
+                "out vec4 color;\n" +
+                "void main() {\n" +
+                "  imageAtomicAdd(image, ivec2(1, 1), 1u);\n" +  // GL_OES_shader_image_atomic
+                "  vec4 color = vec4(gl_SamplePosition.x, 0, 0, 1);\n" +  // GL_OES_sample_variables
+                "  vec4 color2 = texelFetch(mySamplerMSArray, ivec3(1, 1, 1), 3);\n" +
+                "  vec4 color3 = texelFetch(mySamplerBuffer, 3);\n" +
+                "  vec4 color4 = texture(mySamplerCubeArray, vec4(1, 1, 1, 1));\n" +
+                "  color = fma(color + color2, color3 + color4, perSampleColor);" +  // GL_EXT_gpu_shader5
+                "}\n";
+
+        public void onSurfaceCreated(GL10 gl, EGLConfig config) {
+            synchronized (OpenGlEsVersionCtsActivity.this) {
+                try {
+                    mVersionString = gl.glGetString(GL10.GL_VERSION);
+                    mExtensionsString = gl.glGetString(GL10.GL_EXTENSIONS);
+                    if (hasExtension(mExtensionsString, "ANDROID_extension_pack_es31a"))
+                        mAepEs31Support = checkAepEs31Support();
+                } finally {
+                    mSurfaceCreatedLatch.countDown();
+                }
+            }
+        }
+
+        public void onSurfaceChanged(GL10 gl, int width, int height) {
+        }
+
+        public void onDrawFrame(GL10 gl) {
+        }
+
+        private boolean compileShaderAndAttach(int program, int shaderType, String source) {
+            int shader = GLES31.glCreateShader(shaderType);
+            if (shader == 0) {
+                Log.e(TAG, "Unable to create shaders of type " + shaderType);
+                return false;
+            }
+            GLES31.glShaderSource(shader, source);
+            GLES31.glCompileShader(shader);
+            int[] compiled = new int[1];
+            GLES31.glGetShaderiv(shader, GLES31.GL_COMPILE_STATUS, compiled, 0);
+            if (compiled[0] == 0) {
+                Log.e(TAG, "Unable to compile shader " + shaderType + ":");
+                Log.e(TAG, GLES31.glGetShaderInfoLog(shader));
+                GLES31.glDeleteShader(shader);
+                return false;
+            }
+            GLES31.glAttachShader(program, shader);
+            GLES31.glDeleteShader(shader);
+            return true;
+        }
+
+        private boolean checkAepEs31Support() {
+            final String requiredList[] = {
+                "EXT_copy_image",
+                "EXT_draw_buffers_indexed",
+                "EXT_geometry_shader",
+                "EXT_gpu_shader5",
+                "EXT_primitive_bounding_box",
+                "EXT_shader_io_blocks",
+                "EXT_tessellation_shader",
+                "EXT_texture_border_clamp",
+                "EXT_texture_buffer",
+                "EXT_texture_cube_map_array",
+                "EXT_texture_sRGB_decode",
+                "KHR_blend_equation_advanced",
+                "KHR_debug",
+                "KHR_texture_compression_astc_ldr",
+                "OES_sample_shading",
+                "OES_sample_variables",
+                "OES_shader_image_atomic",
+                "OES_shader_multisample_interpolation",
+                "OES_texture_stencil8",
+                "OES_texture_storage_multisample_2d_array"
+            };
+
+            for (int i = 0; i < requiredList.length; ++i) {
+                if (!hasExtension(mExtensionsString, requiredList[i])) {
+                    Log.e(TAG,"ANDROID_extension_pack_es31a is present but extension " +
+                            requiredList[i] + " is missing");
+                    return false;
+                }
+            }
+
+            int[] value = new int[1];
+            GLES31.glGetIntegerv(GLES31.GL_MAX_FRAGMENT_ATOMIC_COUNTER_BUFFERS, value, 0);
+            if (value[0] < 1) {
+                Log.e(TAG, "ANDROID_extension_pack_es31a is present, but the " +
+                        "GL_MAX_FRAGMENT_ATOMIC_COUNTER_BUFFERS value is " + value[0] + " < 1");
+                return false;
+            }
+            GLES31.glGetIntegerv(GLES31.GL_MAX_FRAGMENT_ATOMIC_COUNTERS, value, 0);
+            if (value[0] < 8) {
+                Log.e(TAG, "ANDROID_extension_pack_es31a is present, but the " +
+                        "GL_MAX_FRAGMENT_ATOMIC_COUNTERS value is " + value[0] + " < 8");
+                return false;
+            }
+            GLES31.glGetIntegerv(GLES31.GL_MAX_FRAGMENT_IMAGE_UNIFORMS, value, 0);
+            if (value[0] < 4) {
+                Log.e(TAG, "ANDROID_extension_pack_es31a is present, but the " +
+                        "GL_MAX_FRAGMENT_IMAGE_UNIFORMS value is " + value[0] + " < 4");
+                return false;
+            }
+            GLES31.glGetIntegerv(GLES31.GL_MAX_FRAGMENT_SHADER_STORAGE_BLOCKS, value, 0);
+            if (value[0] < 4) {
+                Log.e(TAG, "ANDROID_extension_pack_es31a is present, but the " +
+                        "GL_MAX_FRAGMENT_SHADER_STORAGE_BLOCKS value is " + value[0] + " < 4");
+                return false;
+            }
+
+            int program = GLES31.glCreateProgram();
+            try {
+                if (!compileShaderAndAttach(program, GLES31.GL_VERTEX_SHADER, mAepEs31VertexShader) ||
+                    !compileShaderAndAttach(program, GLES31Ext.GL_TESS_CONTROL_SHADER_EXT, mAepEs31TessellationControlShader) ||
+                    !compileShaderAndAttach(program, GLES31Ext.GL_TESS_EVALUATION_SHADER_EXT, mAepEs31TessellationEvaluationShader) ||
+                    !compileShaderAndAttach(program, GLES31Ext.GL_GEOMETRY_SHADER_EXT, mAepEs31GeometryShader) ||
+                    !compileShaderAndAttach(program, GLES31.GL_FRAGMENT_SHADER, mAepEs31FragmentShader))
+                    return false;
+
+                GLES31.glLinkProgram(program);
+                GLES31.glGetProgramiv(program, GLES31.GL_LINK_STATUS, value, 0);
+                if (value[0] == 0) {
+                    Log.e(TAG, "Unable to link program :");
+                    Log.e(TAG, GLES31.glGetProgramInfoLog(program));
+                    return false;
+                }
+            } finally {
+                GLES31.glDeleteProgram(program);
+            }
+            return true;
+        }
+    }
+}
diff --git a/tests/tests/graphics/src/android/opengl/cts/OpenGlEsVersionTest.java b/tests/tests/graphics/src/android/opengl/cts/OpenGlEsVersionTest.java
index e8ab59c..28ac5c0 100644
--- a/tests/tests/graphics/src/android/opengl/cts/OpenGlEsVersionTest.java
+++ b/tests/tests/graphics/src/android/opengl/cts/OpenGlEsVersionTest.java
@@ -36,7 +36,7 @@
  * Test for checking whether the ro.opengles.version property is set to the correct value.
  */
 public class OpenGlEsVersionTest
-        extends ActivityInstrumentationTestCase2<OpenGlEsVersionStubActivity> {
+        extends ActivityInstrumentationTestCase2<OpenGlEsVersionCtsActivity> {
 
     private static final String TAG = OpenGlEsVersionTest.class.getSimpleName();
 
@@ -45,10 +45,10 @@
     private static final int EGL_OPENGL_ES2_BIT = 0x0004;
     private static final int EGL_OPENGL_ES3_BIT_KHR = 0x0040;
 
-    private OpenGlEsVersionStubActivity mActivity;
+    private OpenGlEsVersionCtsActivity mActivity;
 
     public OpenGlEsVersionTest() {
-        super("com.android.cts.stub", OpenGlEsVersionStubActivity.class);
+        super("com.android.cts.graphics", OpenGlEsVersionCtsActivity.class);
     }
 
     @Override
@@ -136,7 +136,7 @@
     }
 
     private static boolean hasExtension(String extensions, String name) {
-        return OpenGlEsVersionStubActivity.hasExtension(extensions, name);
+        return OpenGlEsVersionCtsActivity.hasExtension(extensions, name);
     }
 
     /** @return OpenGL ES major version 1, 2, or 3 or some non-positive number for error */
@@ -251,13 +251,13 @@
                 mActivity.getVersionString()));
     }
 
-    /** Restart {@link GLSurfaceViewStubActivity} with a specific client version. */
+    /** Restart {@link GLSurfaceViewCtsActivity} with a specific client version. */
     private void restartActivityWithClientVersion(int version) {
         mActivity.finish();
         setActivity(null);
 
         try {
-            Intent intent = OpenGlEsVersionStubActivity.createIntent(version);
+            Intent intent = OpenGlEsVersionCtsActivity.createIntent(version);
             setActivityIntent(intent);
             mActivity = getActivity();
         } finally {
diff --git a/tests/tests/hardware/Android.mk b/tests/tests/hardware/Android.mk
index e77ac7b..e5203e5 100644
--- a/tests/tests/hardware/Android.mk
+++ b/tests/tests/hardware/Android.mk
@@ -29,6 +29,7 @@
     src/android/hardware/cts/SensorTestCase.java \
     src/android/hardware/cts/SingleSensorTests.java \
     src/android/hardware/cts/SensorIntegrationTests.java \
+    src/android/hardware/cts/SensorBatchingTests.java \
     src/android/hardware/cts/SensorTest.java \
 
 LOCAL_STATIC_JAVA_LIBRARIES := ctsdeviceutil
@@ -44,12 +45,10 @@
 
 LOCAL_STATIC_JAVA_LIBRARIES := ctsdeviceutil ctstestrunner mockito-target android-ex-camera2
 
-LOCAL_SRC_FILES := $(call all-java-files-under, src)
+LOCAL_SRC_FILES := $(call all-java-files-under, src) $(call all-renderscript-files-under, src)
 
 LOCAL_PACKAGE_NAME := CtsHardwareTestCases
 
-LOCAL_INSTRUMENTATION_FOR := CtsTestStubs
-
 # uncomment when b/13281332 is fixed
 # please also uncomment the equivalent code in
 # cts/apps/CtsVerifiers/Android.mk
diff --git a/tests/tests/hardware/AndroidManifest.xml b/tests/tests/hardware/AndroidManifest.xml
index 11ca9c0..ca148f9 100644
--- a/tests/tests/hardware/AndroidManifest.xml
+++ b/tests/tests/hardware/AndroidManifest.xml
@@ -19,12 +19,39 @@
     package="com.android.cts.hardware">
 
     <uses-permission android:name="android.permission.DISABLE_KEYGUARD" />
+    <uses-permission android:name="android.permission.CAMERA" />
+    <uses-permission android:name="android.permission.RECORD_AUDIO" />
+    <uses-permission android:name="android.permission.WAKE_LOCK" />
+    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
+
     <application>
         <uses-library android:name="android.test.runner" />
+
+        <activity android:name="android.hardware.cts.CameraCtsActivity"
+            android:label="CameraCtsActivity"
+            android:screenOrientation="landscape"
+            android:configChanges="keyboardHidden|orientation|screenSize">
+        </activity>
+
+        <activity android:name="android.hardware.camera2.cts.Camera2SurfaceViewCtsActivity"
+            android:label="Camera2CtsActivity"
+            android:screenOrientation="landscape"
+            android:configChanges="keyboardHidden|orientation|screenSize">
+        </activity>
+
+        <activity android:name="android.hardware.camera2.cts.Camera2MultiViewCtsActivity"
+            android:label="Camera2MultiViewCtsActivity"
+            android:screenOrientation="landscape"
+            android:configChanges="keyboardHidden|orientation|screenSize">
+        </activity>
+
+        <activity android:name="android.hardware.cts.GLSurfaceViewCtsActivity"
+            android:label="GLSurfaceViewCtsActivity"/>
+
     </application>
 
     <instrumentation android:name="android.support.test.runner.AndroidJUnitRunner"
-                     android:targetPackage="com.android.cts.stub"
+                     android:targetPackage="com.android.cts.hardware"
                      android:label="CTS tests of android.hardware">
         <meta-data android:name="listener"
             android:value="com.android.cts.runner.CtsTestRunListener" />
diff --git a/tests/res/layout/multi_view.xml b/tests/tests/hardware/res/layout/multi_view.xml
similarity index 100%
rename from tests/res/layout/multi_view.xml
rename to tests/tests/hardware/res/layout/multi_view.xml
diff --git a/tests/tests/hardware/res/layout/surface_view.xml b/tests/tests/hardware/res/layout/surface_view.xml
new file mode 100644
index 0000000..8ba939b
--- /dev/null
+++ b/tests/tests/hardware/res/layout/surface_view.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2014 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:orientation="vertical"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent">
+
+    <SurfaceView
+        android:id="@+id/surface_view"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"/>
+
+</LinearLayout>
diff --git a/tests/res/layout/surface_view_2.xml b/tests/tests/hardware/res/layout/surface_view_2.xml
similarity index 100%
rename from tests/res/layout/surface_view_2.xml
rename to tests/tests/hardware/res/layout/surface_view_2.xml
diff --git a/tests/tests/hardware/src/android/hardware/camera2/cts/Camera2MultiViewCtsActivity.java b/tests/tests/hardware/src/android/hardware/camera2/cts/Camera2MultiViewCtsActivity.java
new file mode 100644
index 0000000..16d2301
--- /dev/null
+++ b/tests/tests/hardware/src/android/hardware/camera2/cts/Camera2MultiViewCtsActivity.java
@@ -0,0 +1,59 @@
+/*
+ * Copyright 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.hardware.camera2.cts;
+
+import android.app.Activity;
+import android.os.Bundle;
+import android.util.Log;
+import android.view.SurfaceView;
+import android.view.TextureView;
+import android.view.WindowManager;
+
+import com.android.cts.hardware.R;
+
+public class Camera2MultiViewCtsActivity extends Activity {
+    private final static String TAG = "Camera2MultiViewCtsActivity";
+    private TextureView[] mTextureView = new TextureView[2];
+    private SurfaceView[] mSurfaceView = new SurfaceView[2];
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.multi_view);
+        mTextureView[0] = (TextureView) findViewById(R.id.texture_view_1);
+        mTextureView[1] = (TextureView) findViewById(R.id.texture_view_2);
+        mSurfaceView[0] = (SurfaceView) findViewById(R.id.surface_view_1);
+        mSurfaceView[1] = (SurfaceView) findViewById(R.id.surface_view_2);
+
+        //Make sure screen is on when this activity window is visible to the user.
+        getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
+    }
+
+    public TextureView getTextureView(int index) {
+        if (index < 0 || index > 1) {
+            throw new IllegalArgumentException("Texture view index must be 0 or 1");
+        }
+        return mTextureView[index];
+    }
+
+    public SurfaceView getSurfaceView(int index) {
+        if (index < 0 || index > 1) {
+            throw new IllegalArgumentException("Surface view index must be 0 or 1");
+        }
+        return mSurfaceView[index];
+    }
+}
diff --git a/tests/tests/hardware/src/android/hardware/camera2/cts/Camera2SurfaceViewCtsActivity.java b/tests/tests/hardware/src/android/hardware/camera2/cts/Camera2SurfaceViewCtsActivity.java
new file mode 100644
index 0000000..936883e
--- /dev/null
+++ b/tests/tests/hardware/src/android/hardware/camera2/cts/Camera2SurfaceViewCtsActivity.java
@@ -0,0 +1,97 @@
+/*
+ * Copyright 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.hardware.camera2.cts;
+
+import android.app.Activity;
+import android.os.Bundle;
+import android.os.ConditionVariable;
+import android.util.Log;
+import android.view.SurfaceHolder;
+import android.view.SurfaceView;
+import com.android.cts.hardware.R;
+
+public class Camera2SurfaceViewCtsActivity extends Activity implements SurfaceHolder.Callback {
+    private final static String TAG = "Camera2SurfaceViewCtsActivity";
+    private final ConditionVariable surfaceChangedDone = new ConditionVariable();
+
+    private SurfaceView mSurfaceView;
+    private int currentWidth = 0;
+    private int currentHeight = 0;
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+
+        setContentView(R.layout.surface_view_2);
+        mSurfaceView = (SurfaceView) findViewById(R.id.surface_view);
+        mSurfaceView.getHolder().addCallback(this);
+    }
+
+    public SurfaceView getSurfaceView() {
+        return mSurfaceView;
+    }
+
+    public boolean waitForSurfaceSizeChanged(int timeOutMs, int expectWidth, int expectHeight) {
+        if (timeOutMs <= 0 || expectWidth <= 0 || expectHeight <= 0) {
+            throw new IllegalArgumentException(
+                    String.format(
+                            "timeout(%d), expectWidth(%d), and expectHeight(%d) " +
+                            "should all be positive numbers",
+                            timeOutMs, expectWidth, expectHeight));
+        }
+
+        int waitTimeMs = timeOutMs;
+        boolean changeSucceeded = false;
+        while (!changeSucceeded && waitTimeMs > 0) {
+            long startTimeMs = System.currentTimeMillis();
+            changeSucceeded = surfaceChangedDone.block(waitTimeMs);
+            if (!changeSucceeded) {
+                Log.e(TAG, "Wait for surface change timed out after " + timeOutMs + " ms");
+                return changeSucceeded;
+            } else {
+                // Get a surface change callback, need to check if the size is expected.
+                surfaceChangedDone.close();
+                if (currentWidth == expectWidth && currentHeight == expectHeight) {
+                    return changeSucceeded;
+                }
+                // Do a further iteration surface change check as surfaceChanged could be called
+                // again.
+                changeSucceeded = false;
+            }
+            waitTimeMs -= (System.currentTimeMillis() - startTimeMs);
+        }
+
+        // Couldn't get expected surface size change.
+        return false;
+     }
+
+    @Override
+    public void surfaceCreated(SurfaceHolder holder) {
+    }
+
+    @Override
+    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
+        Log.i(TAG, "Surface Changed to: " + width + "x" + height);
+        currentWidth = width;
+        currentHeight = height;
+        surfaceChangedDone.open();
+    }
+
+    @Override
+    public void surfaceDestroyed(SurfaceHolder holder) {
+    }
+}
diff --git a/tests/tests/hardware/src/android/hardware/camera2/cts/CameraDeviceTest.java b/tests/tests/hardware/src/android/hardware/camera2/cts/CameraDeviceTest.java
index faf72f3..bfc30b5 100644
--- a/tests/tests/hardware/src/android/hardware/camera2/cts/CameraDeviceTest.java
+++ b/tests/tests/hardware/src/android/hardware/camera2/cts/CameraDeviceTest.java
@@ -259,7 +259,8 @@
                  */
                 for (int j = 0; j < sTemplates.length; j++) {
                     // Skip video snapshots for LEGACY mode
-                    if (sTemplates[j] == CameraDevice.TEMPLATE_VIDEO_SNAPSHOT) {
+                    if (mStaticInfo.isHardwareLevelLegacy() &&
+                            sTemplates[j] == CameraDevice.TEMPLATE_VIDEO_SNAPSHOT) {
                         continue;
                     }
                     CaptureRequest.Builder capReq = mCamera.createCaptureRequest(sTemplates[j]);
@@ -712,6 +713,11 @@
                 if (!burst) {
                     // Test: that a single capture of each template type succeeds.
                     for (int j = 0; j < sTemplates.length; j++) {
+                        // Skip video snapshots for LEGACY mode
+                        if (mStaticInfo.isHardwareLevelLegacy() &&
+                                sTemplates[j] == CameraDevice.TEMPLATE_VIDEO_SNAPSHOT) {
+                            continue;
+                        }
                         captureSingleShot(mCameraIds[i], sTemplates[j], repeating, abort);
                     }
                 }
@@ -797,6 +803,11 @@
         assertTrue("Invalid args to capture function", len <= templates.length);
         List<CaptureRequest> requests = new ArrayList<CaptureRequest>();
         for (int i = 0; i < len; i++) {
+            // Skip video snapshots for LEGACY mode
+            if (mStaticInfo.isHardwareLevelLegacy() &&
+                    templates[i] == CameraDevice.TEMPLATE_VIDEO_SNAPSHOT) {
+                continue;
+            }
             CaptureRequest.Builder requestBuilder = mCamera.createCaptureRequest(templates[i]);
             assertNotNull("Failed to create capture request", requestBuilder);
             requestBuilder.addTarget(mReaderSurface);
@@ -817,7 +828,7 @@
         }
         waitForSessionState(SESSION_ACTIVE, SESSION_READY_TIMEOUT_MS);
 
-        int expectedResultCount = len;
+        int expectedResultCount = requests.size();
         if (repeating) {
             expectedResultCount *= REPEATING_CAPTURE_EXPECTED_RESULT_COUNT;
         }
diff --git a/tests/tests/hardware/src/android/hardware/camera2/cts/CaptureResultTest.java b/tests/tests/hardware/src/android/hardware/camera2/cts/CaptureResultTest.java
index f81e2be..744f4ca 100644
--- a/tests/tests/hardware/src/android/hardware/camera2/cts/CaptureResultTest.java
+++ b/tests/tests/hardware/src/android/hardware/camera2/cts/CaptureResultTest.java
@@ -504,6 +504,10 @@
             waiverKeys.add(CaptureResult.NOISE_REDUCTION_MODE);
         }
 
+        if (!mStaticInfo.isManualLensShadingMapSupported()) {
+            waiverKeys.add(CaptureResult.SHADING_MODE);
+        }
+
         //Keys not required if manual sensor control is not supported
         if (!mStaticInfo.isCapabilitySupported(
                 CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES_MANUAL_SENSOR)) {
@@ -531,7 +535,6 @@
         waiverKeys.add(CaptureResult.LENS_APERTURE);
         waiverKeys.add(CaptureResult.LENS_FILTER_DENSITY);
         waiverKeys.add(CaptureResult.SENSOR_ROLLING_SHUTTER_SKEW);
-        waiverKeys.add(CaptureResult.SHADING_MODE);
         waiverKeys.add(CaptureResult.STATISTICS_LENS_SHADING_MAP_MODE);
         waiverKeys.add(CaptureResult.STATISTICS_SCENE_FLICKER);
         waiverKeys.add(CaptureResult.STATISTICS_HOT_PIXEL_MAP_MODE);
diff --git a/tests/tests/hardware/src/android/hardware/camera2/cts/ExtendedCameraCharacteristicsTest.java b/tests/tests/hardware/src/android/hardware/camera2/cts/ExtendedCameraCharacteristicsTest.java
index 2ddff9f..a28eadd 100644
--- a/tests/tests/hardware/src/android/hardware/camera2/cts/ExtendedCameraCharacteristicsTest.java
+++ b/tests/tests/hardware/src/android/hardware/camera2/cts/ExtendedCameraCharacteristicsTest.java
@@ -65,7 +65,7 @@
     private static final int LEGACY = CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL_LEGACY;
     private static final int LIMITED = CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL_LIMITED;
     private static final int FULL = CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL_FULL;
-    private static final int OPT = -1;  // For keys that are optional on all hardware levels.
+    private static final int OPT = Integer.MAX_VALUE;  // For keys that are optional on all hardware levels.
 
     /*
      * Capabilities short hand
@@ -478,7 +478,7 @@
     private static int remapHardwareLevel(int level) {
         switch (level) {
             case OPT:
-                return -1;
+                return Integer.MAX_VALUE;
             case LEGACY:
                 return 0; // lowest
             case LIMITED:
diff --git a/tests/tests/hardware/src/android/hardware/camera2/cts/MultiViewTest.java b/tests/tests/hardware/src/android/hardware/camera2/cts/MultiViewTest.java
index 1033ecd..0d0ecb4 100644
--- a/tests/tests/hardware/src/android/hardware/camera2/cts/MultiViewTest.java
+++ b/tests/tests/hardware/src/android/hardware/camera2/cts/MultiViewTest.java
@@ -49,30 +49,51 @@
         for (String cameraId : mCameraIds) {
             openCamera(cameraId);
             List<TextureView> views = Arrays.asList(mTextureView[0]);
-            textureViewPreview(cameraId, views, /*withImagerReader*/false);
+            textureViewPreview(cameraId, views, /*ImageReader*/null);
             closeCamera(cameraId);
         }
     }
 
     public void testTextureViewPreviewWithImageReader() throws Exception {
         for (String cameraId : mCameraIds) {
+            Exception prior = null;
+
+            ImageVerifierListener yuvListener;
+            ImageReader yuvReader;
+
             try {
                 openCamera(cameraId);
+                Size previewSize = getOrderedPreviewSizes(cameraId).get(0);
+                yuvListener =
+                        new ImageVerifierListener(previewSize, ImageFormat.YUV_420_888);
+                yuvReader = makeImageReader(previewSize,
+                        ImageFormat.YUV_420_888, MAX_READER_IMAGES, yuvListener, mHandler);
                 int maxNumStreamsProc =
                         getStaticInfo(cameraId).getMaxNumOutputStreamsProcessedChecked();
                 if (maxNumStreamsProc < 2) {
                     continue;
                 }
                 List<TextureView> views = Arrays.asList(mTextureView[0]);
-                textureViewPreview(cameraId, views, /*withImagerReader*/true);
+                textureViewPreview(cameraId, views, yuvReader);
+            } catch (Exception e) {
+                prior = e;
             } finally {
-                closeCamera(cameraId);
+                try {
+                    closeCamera(cameraId);
+                } catch (Exception e) {
+                    if (prior != null) {
+                        Log.e(TAG, "Prior exception received: " + prior);
+                    }
+                    prior = e;
+                }
+                if (prior != null) throw prior; // Rethrow last exception.
             }
         }
     }
 
     public void testDualTextureViewPreview() throws Exception {
         for (String cameraId : mCameraIds) {
+            Exception prior = null;
             try {
                 openCamera(cameraId);
                 int maxNumStreamsProc =
@@ -81,26 +102,56 @@
                     continue;
                 }
                 List<TextureView> views = Arrays.asList(mTextureView[0], mTextureView[1]);
-                textureViewPreview(cameraId, views, /*withImagerReader*/false);
+                textureViewPreview(cameraId, views, /*ImageReader*/null);
+            } catch (Exception e) {
+                prior = e;
             } finally {
-                closeCamera(cameraId);
+                try {
+                    closeCamera(cameraId);
+                } catch (Exception e) {
+                    if (prior != null) {
+                        Log.e(TAG, "Prior exception received: " + prior);
+                    }
+                    prior = e;
+                }
+                if (prior != null) throw prior; // Rethrow last exception.
             }
         }
     }
 
     public void testDualTextureViewAndImageReaderPreview() throws Exception {
         for (String cameraId : mCameraIds) {
+            Exception prior = null;
+
+            ImageVerifierListener yuvListener;
+            ImageReader yuvReader;
+
             try {
                 openCamera(cameraId);
+                Size previewSize = getOrderedPreviewSizes(cameraId).get(0);
+                yuvListener =
+                        new ImageVerifierListener(previewSize, ImageFormat.YUV_420_888);
+                yuvReader = makeImageReader(previewSize,
+                        ImageFormat.YUV_420_888, MAX_READER_IMAGES, yuvListener, mHandler);
                 int maxNumStreamsProc =
                         getStaticInfo(cameraId).getMaxNumOutputStreamsProcessedChecked();
                 if (maxNumStreamsProc < 3) {
                     continue;
                 }
                 List<TextureView> views = Arrays.asList(mTextureView[0], mTextureView[1]);
-                textureViewPreview(cameraId, views, /*withImagerReader*/true);
+                textureViewPreview(cameraId, views, yuvReader);
+            } catch (Exception e) {
+                prior = e;
             } finally {
-                closeCamera(cameraId);
+                try {
+                    closeCamera(cameraId);
+                } catch (Exception e) {
+                    if (prior != null) {
+                        Log.e(TAG, "Prior exception received: " + prior);
+                    }
+                    prior = e;
+                }
+                if (prior != null) throw prior; // Rethrow last exception.
             }
         }
     }
@@ -115,7 +166,8 @@
             for (int i = 0; i < NUM_CAMERAS_TESTED; i++) {
                 openCamera(mCameraIds[i]);
                 List<TextureView> views = Arrays.asList(mTextureView[i]);
-                startTextureViewPreview(mCameraIds[i], views, /*withImagerReader*/false);
+
+                startTextureViewPreview(mCameraIds[i], views, /*ImageReader*/null);
             }
             // TODO: check the framerate is correct
             SystemClock.sleep(PREVIEW_TIME_MS);
@@ -139,7 +191,7 @@
      * Start camera preview using input texture views and/or one image reader
      */
     private void startTextureViewPreview(
-            String cameraId, List<TextureView> views, boolean withImagerReader)
+            String cameraId, List<TextureView> views, ImageReader imageReader)
             throws Exception {
         int numPreview = views.size();
         Size previewSize = getOrderedPreviewSizes(cameraId).get(0);
@@ -161,13 +213,8 @@
             surfaces.add(new Surface(previewTexture[i]));
             i++;
         }
-
-        if (withImagerReader) {
-            ImageVerifierListener yuvListener =
-                    new ImageVerifierListener(previewSize, ImageFormat.YUV_420_888);
-            ImageReader yuvReader = makeImageReader(previewSize,
-                    ImageFormat.YUV_420_888, MAX_READER_IMAGES, yuvListener, mHandler);
-            surfaces.add(yuvReader.getSurface());
+        if (imageReader != null) {
+            surfaces.add(imageReader.getSurface());
         }
 
         startPreview(cameraId, surfaces, null);
@@ -186,7 +233,7 @@
      * Test camera preview using input texture views and/or one image reader
      */
     private void textureViewPreview(
-            String cameraId, List<TextureView> views, boolean testImagerReader)
+            String cameraId, List<TextureView> views, ImageReader testImagerReader)
             throws Exception {
         startTextureViewPreview(cameraId, views, testImagerReader);
 
diff --git a/tests/tests/hardware/src/android/hardware/camera2/cts/PerformanceTest.java b/tests/tests/hardware/src/android/hardware/camera2/cts/PerformanceTest.java
index aeab4cf..3a7df4c 100644
--- a/tests/tests/hardware/src/android/hardware/camera2/cts/PerformanceTest.java
+++ b/tests/tests/hardware/src/android/hardware/camera2/cts/PerformanceTest.java
@@ -194,8 +194,10 @@
         for (String id : mCameraIds) {
             try {
                 openDevice(id);
+
+                boolean partialsExpected = mStaticInfo.getPartialResultCount() > 1;
                 long startTimeMs;
-                boolean isPartialTimingValid = true;
+                boolean isPartialTimingValid = partialsExpected;
                 for (int i = 0; i < NUM_TEST_LOOPS; i++) {
 
                     // setup builders and listeners
@@ -219,9 +221,16 @@
                     CaptureRequest request = captureBuilder.build();
                     mSession.capture(request, captureResultListener, mHandler);
 
-                    Pair<CaptureResult, Long> partialResultNTime =
-                            captureResultListener.getPartialResultNTimeForRequest(
-                                    request, NUM_RESULTS_WAIT);
+                    Pair<CaptureResult, Long> partialResultNTime = null;
+                    if (partialsExpected) {
+                        partialResultNTime = captureResultListener.getPartialResultNTimeForRequest(
+                            request, NUM_RESULTS_WAIT);
+                        // Even if maxPartials > 1, may not see partials for some devices
+                        if (partialResultNTime == null) {
+                            partialsExpected = false;
+                            isPartialTimingValid = false;
+                        }
+                    }
                     Pair<CaptureResult, Long> captureResultNTime =
                             captureResultListener.getCaptureResultNTimeForRequest(
                                     request, NUM_RESULTS_WAIT);
@@ -229,9 +238,11 @@
                             CameraTestUtils.CAPTURE_IMAGE_TIMEOUT_MS);
 
                     captureTimes[i] = imageListener.getTimeReceivedImage() - startTimeMs;
-                    getPartialTimes[i] = partialResultNTime.second - startTimeMs;
-                    if (getPartialTimes[i] < 0) {
-                        isPartialTimingValid = false;
+                    if (partialsExpected) {
+                        getPartialTimes[i] = partialResultNTime.second - startTimeMs;
+                        if (getPartialTimes[i] < 0) {
+                            isPartialTimingValid = false;
+                        }
                     }
                     getResultTimes[i] = captureResultNTime.second - startTimeMs;
 
@@ -422,7 +433,6 @@
             try {
                 Pair<CaptureResult, Long> result =
                         mPartialResultQueue.poll(timeout, TimeUnit.MILLISECONDS);
-                assertNotNull("Wait for a partial result timed out in " + timeout + "ms", result);
                 return result;
             } catch (InterruptedException e) {
                 throw new UnsupportedOperationException("Unhandled interrupted exception", e);
@@ -450,13 +460,17 @@
             int i = 0;
             do {
                 result = getPartialResultNTime(CameraTestUtils.CAPTURE_RESULT_TIMEOUT_MS);
+                // The result may be null if no partials are produced on this particular path, so
+                // stop trying
+                if (result == null) break;
                 if (result.first.getRequest().equals(myRequest)) {
                     return result;
                 }
             } while (i++ < numResultsWait);
 
-            throw new TimeoutRuntimeException("Unable to get the expected capture result after "
-                    + "waiting for " + numResultsWait + " results");
+            // No partials produced - this may not be an error, since a given device may not
+            // produce any partials on this testing path
+            return null;
         }
 
         public Pair<CaptureResult, Long> getCaptureResultNTimeForRequest(CaptureRequest myRequest,
diff --git a/tests/tests/hardware/src/android/hardware/camera2/cts/RobustnessTest.java b/tests/tests/hardware/src/android/hardware/camera2/cts/RobustnessTest.java
index 5b0f0fd..c394b47 100644
--- a/tests/tests/hardware/src/android/hardware/camera2/cts/RobustnessTest.java
+++ b/tests/tests/hardware/src/android/hardware/camera2/cts/RobustnessTest.java
@@ -16,17 +16,31 @@
 
 package android.hardware.camera2.cts;
 
+import static android.hardware.camera2.cts.CameraTestUtils.*;
+import static android.hardware.camera2.cts.RobustnessTest.MaxOutputSizes.*;
+
+import android.graphics.ImageFormat;
 import android.graphics.SurfaceTexture;
 import android.hardware.camera2.CameraAccessException;
 import android.hardware.camera2.CameraCaptureSession;
+import android.hardware.camera2.CameraCharacteristics;
 import android.hardware.camera2.CameraDevice;
 import android.hardware.camera2.CaptureRequest;
+import android.hardware.camera2.TotalCaptureResult;
+import android.hardware.camera2.CaptureFailure;
+import android.hardware.camera2.params.StreamConfigurationMap;
+import android.hardware.camera2.cts.CameraTestUtils;
+import android.hardware.camera2.cts.helpers.StaticMetadata;
 import android.hardware.camera2.cts.testcases.Camera2AndroidTestCase;
+import android.media.CamcorderProfile;
+import android.media.ImageReader;
 import android.util.Log;
+import android.util.Size;
 import android.view.Surface;
 
 import com.android.ex.camera2.blocking.BlockingSessionCallback;
 
+import java.util.Arrays;
 import java.util.ArrayList;
 import java.util.List;
 
@@ -78,4 +92,388 @@
             }
         }
     }
+
+    /**
+     * Test for making sure the required output combinations for each hardware level and capability
+     * work as expected.
+     */
+    public void testMandatoryOutputCombinations() throws Exception {
+        /**
+         * Tables for maximum sizes to try for each hardware level and capability.
+         *
+         * Keep in sync with the tables in
+         * frameworks/base/core/java/android/hardware/camera2/CameraDevice.java#createCaptureSession
+         *
+         * Each row of the table is a set of (format, max resolution) pairs, using the below consts
+         */
+
+        // Enum values are defined in MaxOutputSizes
+        final int[][] LEGACY_COMBINATIONS = {
+            {PRIV, MAXIMUM}, // Simple preview, GPU video processing, or no-preview video recording
+            {JPEG, MAXIMUM}, // No-viewfinder still image capture
+            {YUV,  MAXIMUM}, // In-application video/image processing
+            {PRIV, PREVIEW,  JPEG, MAXIMUM}, // Standard still imaging.
+            {YUV,  PREVIEW,  JPEG, MAXIMUM}, // In-app processing plus still capture.
+            {PRIV, PREVIEW,  PRIV, PREVIEW}, // Standard recording.
+            {PRIV, PREVIEW,  YUV,  PREVIEW}, // Preview plus in-app processing.
+            {PRIV, PREVIEW,  YUV,  PREVIEW,  JPEG, MAXIMUM} // Still capture plus in-app processing.
+        };
+
+        final int[][] LIMITED_COMBINATIONS = {
+            {PRIV, PREVIEW,  PRIV, RECORD }, // High-resolution video recording with preview.
+            {PRIV, PREVIEW,  YUV , RECORD }, // High-resolution in-app video processing with preview.
+            {YUV , PREVIEW,  YUV , RECORD }, // Two-input in-app video processing.
+            {PRIV, PREVIEW,  PRIV, RECORD,   JPEG, RECORD  }, // High-resolution recording with video snapshot.
+            {PRIV, PREVIEW,  YUV,  RECORD,   JPEG, RECORD  }, // High-resolution in-app processing with video snapshot.
+            {YUV , PREVIEW,  YUV,  PREVIEW,  JPEG, MAXIMUM }  // Two-input in-app processing with still capture.
+        };
+
+        final int[][] FULL_COMBINATIONS = {
+            {PRIV, PREVIEW,  PRIV, MAXIMUM }, // Maximum-resolution GPU processing with preview.
+            {PRIV, PREVIEW,  YUV,  MAXIMUM }, // Maximum-resolution in-app processing with preview.
+            {YUV,  PREVIEW,  YUV,  MAXIMUM }, // Maximum-resolution two-input in-app processsing.
+            {PRIV, PREVIEW,  PRIV, PREVIEW,  JPEG, MAXIMUM }, //Video recording with maximum-size video snapshot.
+            {YUV,  VGA,      PRIV, PREVIEW,  YUV,  MAXIMUM }, // Standard video recording plus maximum-resolution in-app processing.
+            {YUV,  VGA,      YUV,  PREVIEW,  YUV,  MAXIMUM } // Preview plus two-input maximum-resolution in-app processing.
+        };
+
+        final int[][] RAW_COMBINATIONS = {
+            {RAW,  MAXIMUM }, // No-preview DNG capture.
+            {PRIV, PREVIEW,  RAW,  MAXIMUM }, // Standard DNG capture.
+            {YUV,  PREVIEW,  RAW,  MAXIMUM }, // In-app processing plus DNG capture.
+            {PRIV, PREVIEW,  PRIV, PREVIEW,  RAW, MAXIMUM}, // Video recording with DNG capture.
+            {PRIV, PREVIEW,  YUV,  PREVIEW,  RAW, MAXIMUM}, // Preview with in-app processing and DNG capture.
+            {YUV,  PREVIEW,  YUV,  PREVIEW,  RAW, MAXIMUM}, // Two-input in-app processing plus DNG capture.
+            {PRIV, PREVIEW,  JPEG, MAXIMUM,  RAW, MAXIMUM}, // Still capture with simultaneous JPEG and DNG.
+            {YUV,  PREVIEW,  JPEG, MAXIMUM,  RAW, MAXIMUM}  // In-app processing with simultaneous JPEG and DNG.
+        };
+
+        final int[][][] TABLES =
+                { LEGACY_COMBINATIONS, LIMITED_COMBINATIONS, FULL_COMBINATIONS, RAW_COMBINATIONS };
+
+        // Sanity check the tables
+        int tableIdx = 0;
+        for (int[][] table : TABLES) {
+            int rowIdx = 0;
+            for (int[] row : table) {
+                assertTrue(String.format("Odd number of entries for table %d row %d: %s ",
+                                tableIdx, rowIdx, Arrays.toString(row)),
+                        (row.length % 2) == 0);
+                for (int i = 0; i < row.length; i += 2) {
+                    int format = row[i];
+                    int maxSize = row[i + 1];
+                    assertTrue(String.format("table %d row %d index %d format not valid: %d",
+                                    tableIdx, rowIdx, i, format),
+                            format == PRIV || format == JPEG || format == YUV || format == RAW);
+                    assertTrue(String.format("table %d row %d index %d max size not valid: %d",
+                                    tableIdx, rowIdx, i + 1, maxSize),
+                            maxSize == PREVIEW || maxSize == RECORD ||
+                            maxSize == MAXIMUM || maxSize == VGA);
+                }
+                rowIdx++;
+            }
+            tableIdx++;
+        }
+
+        for (String id : mCameraIds) {
+
+            // Find the concrete max sizes for each format/resolution combination
+
+            CameraCharacteristics cc = mCameraManager.getCameraCharacteristics(id);
+
+            MaxOutputSizes maxSizes = new MaxOutputSizes(cc, id);
+
+            final StaticMetadata staticInfo = new StaticMetadata(cc);
+
+            openDevice(id);
+
+            // Always run legacy-level tests
+
+            for (int[] config : LEGACY_COMBINATIONS) {
+                testOutputCombination(id, config, maxSizes);
+            }
+
+            // Then run higher-level tests if applicable
+
+            if (!staticInfo.isHardwareLevelLegacy()) {
+
+                // If not legacy, at least limited, so run limited-level tests
+
+                for (int[] config : LIMITED_COMBINATIONS) {
+                    testOutputCombination(id, config, maxSizes);
+                }
+
+                // Check for FULL and RAW and run those if appropriate
+
+                if (staticInfo.isHardwareLevelFull()) {
+                    for (int[] config : FULL_COMBINATIONS) {
+                        testOutputCombination(id, config, maxSizes);
+                    }
+                }
+
+                if (staticInfo.isCapabilitySupported(
+                        CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES_RAW)) {
+                    for (int[] config : RAW_COMBINATIONS) {
+                        testOutputCombination(id, config, maxSizes);
+                    }
+                }
+            }
+
+            closeDevice(id);
+        }
+    }
+
+    /**
+     * Simple holder for resolutions to use for different camera outputs and size limits.
+     */
+    static class MaxOutputSizes {
+        // Format shorthands
+        static final int PRIV = -1;
+        static final int JPEG = ImageFormat.JPEG;
+        static final int YUV  = ImageFormat.YUV_420_888;
+        static final int RAW  = ImageFormat.RAW_SENSOR;
+
+        // Max resolution indices
+        static final int PREVIEW = 0;
+        static final int RECORD  = 1;
+        static final int MAXIMUM = 2;
+        static final int VGA = 3;
+        static final int RESOLUTION_COUNT = 4;
+
+        public MaxOutputSizes(CameraCharacteristics cc, String cameraId) {
+            StreamConfigurationMap configs =
+                    cc.get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP);
+            Size[] privSizes = configs.getOutputSizes(SurfaceTexture.class);
+            Size[] yuvSizes = configs.getOutputSizes(ImageFormat.YUV_420_888);
+            Size[] jpegSizes = configs.getOutputSizes(ImageFormat.JPEG);
+            Size[] rawSizes = configs.getOutputSizes(ImageFormat.RAW_SENSOR);
+
+            maxRawSize = (rawSizes != null) ? CameraTestUtils.getMaxSize(rawSizes) : null;
+
+            maxPrivSizes[PREVIEW] = getMaxSize(privSizes, PREVIEW_SIZE_BOUND);
+            maxYuvSizes[PREVIEW]  = getMaxSize(yuvSizes, PREVIEW_SIZE_BOUND);
+            maxJpegSizes[PREVIEW] = getMaxSize(jpegSizes, PREVIEW_SIZE_BOUND);
+
+            maxPrivSizes[RECORD] = getMaxRecordingSize(cameraId);
+            maxYuvSizes[RECORD]  = getMaxRecordingSize(cameraId);
+            maxJpegSizes[RECORD] = getMaxRecordingSize(cameraId);
+
+            maxPrivSizes[MAXIMUM] = CameraTestUtils.getMaxSize(privSizes);
+            maxYuvSizes[MAXIMUM] = CameraTestUtils.getMaxSize(yuvSizes);
+            maxJpegSizes[MAXIMUM] = CameraTestUtils.getMaxSize(jpegSizes);
+
+            // Must always be supported, add unconditionally
+            final Size vgaSize = new Size(640, 480);
+            maxPrivSizes[VGA] = vgaSize;
+            maxJpegSizes[VGA] = vgaSize;
+            maxYuvSizes[VGA] = vgaSize;
+        }
+
+        public final Size[] maxPrivSizes = new Size[RESOLUTION_COUNT];
+        public final Size[] maxJpegSizes = new Size[RESOLUTION_COUNT];
+        public final Size[] maxYuvSizes = new Size[RESOLUTION_COUNT];
+        public final Size maxRawSize;
+
+        static public String configToString(int[] config) {
+            StringBuilder b = new StringBuilder("{ ");
+            for (int i = 0; i < config.length; i += 2) {
+                int format = config[i];
+                int sizeLimit = config[i + 1];
+                switch (format) {
+                    case PRIV:
+                        b.append("[PRIV, ");
+                        break;
+                    case JPEG:
+                        b.append("[JPEG, ");
+                        break;
+                    case YUV:
+                        b.append("[YUV, ");
+                        break;
+                    case RAW:
+                        b.append("[RAW, ");
+                        break;
+                    default:
+                        b.append("[UNK, ");
+                        break;
+                }
+                switch (sizeLimit) {
+                    case PREVIEW:
+                        b.append("PREVIEW] ");
+                        break;
+                    case RECORD:
+                        b.append("RECORD] ");
+                        break;
+                    case MAXIMUM:
+                        b.append("MAXIMUM] ");
+                        break;
+                    case VGA:
+                        b.append("VGA] ");
+                        break;
+                    default:
+                        b.append("UNK] ");
+                        break;
+                }
+            }
+            b.append("}");
+            return b.toString();
+        }
+    }
+
+    private void testOutputCombination(String cameraId, int[] config, MaxOutputSizes maxSizes)
+            throws Exception {
+
+        Log.i(TAG, String.format("Testing Camera %s, config %s",
+                        cameraId, MaxOutputSizes.configToString(config)));
+
+        final int TIMEOUT_FOR_RESULT_MS = 1000;
+        final int MIN_RESULT_COUNT = 3;
+
+        // Set up outputs
+        List<Object> outputTargets = new ArrayList<>();
+        List<Surface> outputSurfaces = new ArrayList<>();
+        for (int i = 0; i < config.length; i += 2) {
+            int format = config[i];
+            int sizeLimit = config[i + 1];
+
+            switch (format) {
+                case PRIV: {
+                    Size targetSize = maxSizes.maxPrivSizes[sizeLimit];
+                    SurfaceTexture target = new SurfaceTexture(/*random int*/1);
+                    target.setDefaultBufferSize(targetSize.getWidth(), targetSize.getHeight());
+                    outputTargets.add(target);
+                    outputSurfaces.add(new Surface(target));
+                    break;
+                }
+                case JPEG: {
+                    Size targetSize = maxSizes.maxJpegSizes[sizeLimit];
+                    ImageReader target = ImageReader.newInstance(
+                        targetSize.getWidth(), targetSize.getHeight(), JPEG, MIN_RESULT_COUNT);
+                    outputTargets.add(target);
+                    outputSurfaces.add(target.getSurface());
+                    break;
+                }
+                case YUV: {
+                    Size targetSize = maxSizes.maxYuvSizes[sizeLimit];
+                    ImageReader target = ImageReader.newInstance(
+                        targetSize.getWidth(), targetSize.getHeight(), YUV, MIN_RESULT_COUNT);
+                    outputTargets.add(target);
+                    outputSurfaces.add(target.getSurface());
+                    break;
+                }
+                case RAW: {
+                    Size targetSize = maxSizes.maxRawSize;
+                    ImageReader target = ImageReader.newInstance(
+                        targetSize.getWidth(), targetSize.getHeight(), RAW, MIN_RESULT_COUNT);
+                    outputTargets.add(target);
+                    outputSurfaces.add(target.getSurface());
+                    break;
+                }
+                default:
+                    fail("Unknown output format " + format);
+            }
+        }
+
+        boolean haveSession = false;
+        try {
+            CaptureRequest.Builder requestBuilder =
+                    mCamera.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
+
+            for (Surface s : outputSurfaces) {
+                requestBuilder.addTarget(s);
+            }
+
+            CameraCaptureSession.CaptureCallback mockCaptureCallback =
+                    mock(CameraCaptureSession.CaptureCallback.class);
+
+            createSession(outputSurfaces);
+            haveSession = true;
+            CaptureRequest request = requestBuilder.build();
+            mCameraSession.setRepeatingRequest(request, mockCaptureCallback, mHandler);
+
+            verify(mockCaptureCallback,
+                    timeout(TIMEOUT_FOR_RESULT_MS * MIN_RESULT_COUNT).atLeast(MIN_RESULT_COUNT))
+                    .onCaptureCompleted(
+                        eq(mCameraSession),
+                        eq(request),
+                        isA(TotalCaptureResult.class));
+            verify(mockCaptureCallback, never()).
+                    onCaptureFailed(
+                        eq(mCameraSession),
+                        eq(request),
+                        isA(CaptureFailure.class));
+
+        } catch (Throwable e) {
+            mCollector.addMessage(String.format("Output combination %s failed due to: %s",
+                    MaxOutputSizes.configToString(config), e.getMessage()));
+        }
+        if (haveSession) {
+            try {
+                Log.i(TAG, String.format("Done with camera %s, config %s, closing session",
+                                cameraId, MaxOutputSizes.configToString(config)));
+                stopCapture(/*fast*/false);
+            } catch (Throwable e) {
+                mCollector.addMessage(
+                    String.format("Closing down for output combination %s failed due to: %s",
+                            MaxOutputSizes.configToString(config), e.getMessage()));
+            }
+        }
+    }
+
+    private static Size getMaxRecordingSize(String cameraId) {
+        int id = Integer.valueOf(cameraId);
+
+        int quality =
+                CamcorderProfile.hasProfile(id, CamcorderProfile.QUALITY_2160P) ?
+                    CamcorderProfile.QUALITY_2160P :
+                CamcorderProfile.hasProfile(id, CamcorderProfile.QUALITY_1080P) ?
+                    CamcorderProfile.QUALITY_1080P :
+                CamcorderProfile.hasProfile(id, CamcorderProfile.QUALITY_720P) ?
+                    CamcorderProfile.QUALITY_720P :
+                CamcorderProfile.hasProfile(id, CamcorderProfile.QUALITY_480P) ?
+                    CamcorderProfile.QUALITY_480P :
+                CamcorderProfile.hasProfile(id, CamcorderProfile.QUALITY_QVGA) ?
+                    CamcorderProfile.QUALITY_QVGA :
+                CamcorderProfile.hasProfile(id, CamcorderProfile.QUALITY_CIF) ?
+                    CamcorderProfile.QUALITY_CIF :
+                CamcorderProfile.hasProfile(id, CamcorderProfile.QUALITY_QCIF) ?
+                    CamcorderProfile.QUALITY_QCIF :
+                    -1;
+
+        assertTrue("No recording supported for camera id " + cameraId, quality != -1);
+
+        CamcorderProfile maxProfile = CamcorderProfile.get(id, quality);
+        return new Size(maxProfile.videoFrameWidth, maxProfile.videoFrameHeight);
+    }
+
+    /**
+     * Get maximum size in list that's equal or smaller to than the bound.
+     * Returns null if no size is smaller than or equal to the bound.
+     */
+    private static Size getMaxSize(Size[] sizes, Size bound) {
+        if (sizes == null || sizes.length == 0) {
+            throw new IllegalArgumentException("sizes was empty");
+        }
+
+        Size sz = null;
+        for (Size size : sizes) {
+            if (size.getWidth() <= bound.getWidth() && size.getHeight() <= bound.getHeight()) {
+
+                if (sz == null) {
+                    sz = size;
+                } else {
+                    long curArea = sz.getWidth() * (long) sz.getHeight();
+                    long newArea = size.getWidth() * (long) size.getHeight();
+                    if ( newArea > curArea ) {
+                        sz = size;
+                    }
+                }
+            }
+        }
+
+        assertTrue("No size under bound found: " + Arrays.toString(sizes) + " bound " + bound,
+                sz != null);
+
+        return sz;
+    }
+
 }
diff --git a/tests/tests/hardware/src/android/hardware/camera2/cts/StaticMetadataTest.java b/tests/tests/hardware/src/android/hardware/camera2/cts/StaticMetadataTest.java
index f0d8293..1d28e6d 100644
--- a/tests/tests/hardware/src/android/hardware/camera2/cts/StaticMetadataTest.java
+++ b/tests/tests/hardware/src/android/hardware/camera2/cts/StaticMetadataTest.java
@@ -31,14 +31,16 @@
 import junit.framework.Assert;
 
 import java.util.ArrayList;
+import java.util.Collection;
 import java.util.HashMap;
+import java.util.HashSet;
 import java.util.List;
+import java.util.Set;
 
 /**
  * <p>
  * This class covers the {@link CameraCharacteristics} tests that are not
- * covered by {@link CaptureRequestTest} and {@link CameraCharacteristicsTest}
- * (auto-generated tests that only do the non-null checks).
+ * covered by {@link CaptureRequestTest} and {@link ExtendedCameraCharacteristicsTest}
  * </p>
  * <p>
  * Note that most of the tests in this class don't require camera open.
@@ -137,14 +139,79 @@
      * @return {@code true} if request keys' presence match expectation. Otherwise {@code false}
      */
     private boolean validateRequestKeysPresence(String capabilityName,
-            List<CaptureRequest.Key<?>> requestKeys, boolean expectedPresence) {
+            Collection<CaptureRequest.Key<?>> requestKeys, boolean expectedPresence) {
         boolean actualPresence = mStaticInfo.areRequestKeysAvailable(requestKeys);
         if (expectedPresence != actualPresence) {
             if (expectedPresence) {
                 for (CaptureRequest.Key<?> key : requestKeys) {
                     if (!mStaticInfo.areKeysAvailable(key)) {
                         mCollector.addMessage(String.format(
-                                "Camera %s list capability %s but doesn't contain key %s",
+                                "Camera %s list capability %s but doesn't contain request key %s",
+                                mCameraId, capabilityName, key.getName()));
+                    }
+                }
+            } else {
+                Log.w(TAG, String.format(
+                        "Camera %s doesn't list capability %s but contain all required keys",
+                        mCameraId, capabilityName));
+            }
+            return false;
+        }
+        return true;
+    }
+
+    /**
+     * Check if result keys' presence match expectation.
+     *
+     * @param capabilityName The name string of capability being tested. Used for output messages.
+     * @param resultKeys The capture result keys to be checked
+     * @param expectedPresence Expected presence of {@code resultKeys}. {@code true} for expecting
+     *        all keys are available. Otherwise {@code false}
+     * @return {@code true} if result keys' presence match expectation. Otherwise {@code false}
+     */
+    private boolean validateResultKeysPresence(String capabilityName,
+            Collection<CaptureResult.Key<?>> resultKeys, boolean expectedPresence) {
+        boolean actualPresence = mStaticInfo.areResultKeysAvailable(resultKeys);
+        if (expectedPresence != actualPresence) {
+            if (expectedPresence) {
+                for (CaptureResult.Key<?> key : resultKeys) {
+                    if (!mStaticInfo.areKeysAvailable(key)) {
+                        mCollector.addMessage(String.format(
+                                "Camera %s list capability %s but doesn't contain result key %s",
+                                mCameraId, capabilityName, key.getName()));
+                    }
+                }
+            } else {
+                Log.w(TAG, String.format(
+                        "Camera %s doesn't list capability %s but contain all required keys",
+                        mCameraId, capabilityName));
+            }
+            return false;
+        }
+        return true;
+    }
+
+    /**
+     * Check if characteristics keys' presence match expectation.
+     *
+     * @param capabilityName The name string of capability being tested. Used for output messages.
+     * @param characteristicsKeys The characteristics keys to be checked
+     * @param expectedPresence Expected presence of {@code characteristicsKeys}. {@code true} for
+     *        expecting all keys are available. Otherwise {@code false}
+     * @return {@code true} if characteristics keys' presence match expectation.
+     *         Otherwise {@code false}
+     */
+    private boolean validateCharacteristicsKeysPresence(String capabilityName,
+            Collection<CameraCharacteristics.Key<?>> characteristicsKeys,
+            boolean expectedPresence) {
+        boolean actualPresence = mStaticInfo.areCharacteristicsKeysAvailable(characteristicsKeys);
+        if (expectedPresence != actualPresence) {
+            if (expectedPresence) {
+                for (CameraCharacteristics.Key<?> key : characteristicsKeys) {
+                    if (!mStaticInfo.areKeysAvailable(key)) {
+                        mCollector.addMessage(String.format(
+                                "Camera %s list capability %s but doesn't contain" +
+                                "characteristics key %s",
                                 mCameraId, capabilityName, key.getName()));
                     }
                 }
@@ -160,8 +227,8 @@
 
     private void validateCapability(Integer capability, boolean isCapabilityAvailable) {
         List<CaptureRequest.Key<?>> requestKeys = new ArrayList<>();
-        /* Only test request keys in this test
-           Characteristics keys are tested in CameraCharacteristicsTest
+        /* For available capabilities, only check request keys in this test
+           Characteristics keys are tested in ExtendedCameraCharacteristicsTest
            Result keys are tested in CaptureResultTest */
         String capabilityName;
         switch (capability) {
@@ -239,38 +306,74 @@
                 requestKeys.add(CaptureRequest.BLACK_LEVEL_LOCK);
                 break;
             case REQUEST_AVAILABLE_CAPABILITIES_RAW:
-                capabilityName = "REQUEST_AVAILABLE_CAPABILITIES_RAW";
-                boolean rawOutputSupported = mStaticInfo.getRawOutputSizesChecked().length > 0;
-                if (isCapabilityAvailable) {
-                    mCollector.expectTrue(
-                            "REQUEST_AVAILABLE_CAPABILITIES_RAW should support RAW_SENSOR output",
-                            rawOutputSupported);
-                }
-                requestKeys.add(CaptureRequest.HOT_PIXEL_MODE);
-                requestKeys.add(CaptureRequest.STATISTICS_HOT_PIXEL_MAP_MODE);
-                break;
+                // RAW_CAPABILITY needs to check for not just capture request keys
+                validateRawCapability(isCapabilityAvailable);
+                return;
             default:
                 capabilityName = "Unknown";
                 Assert.fail(String.format("Unknown capability: %d", capability));
         }
+
         boolean matchExpectation =
                 validateRequestKeysPresence(capabilityName, requestKeys, isCapabilityAvailable);
-
         // In case of isCapabilityAvailable == true, error has been filed in
         // validateRequestKeysPresence
         if (!matchExpectation && !isCapabilityAvailable) {
-            if (capability == REQUEST_AVAILABLE_CAPABILITIES_RAW) {
-                // RAW capability needs to also check raw output capability
-                boolean rawOutputSupported = mStaticInfo.getRawOutputSizesChecked().length > 0;
-                if (rawOutputSupported) {
-                    mCollector.addMessage(String.format(
-                            "Camera %s doesn't list capability %s but contain all required keys" +
-                            " and RAW format output",
-                            mCameraId, capabilityName));
-                }
+            mCollector.addMessage(String.format(
+                    "Camera %s doesn't list capability %s but contain all required keys",
+                    mCameraId, capabilityName));
+        }
+    }
+
+    private void validateRawCapability(boolean isCapabilityAvailable) {
+        String capabilityName = "REQUEST_AVAILABLE_CAPABILITIES_RAW";
+
+        Set<CaptureRequest.Key<?>> requestKeys = new HashSet<>();
+        requestKeys.add(CaptureRequest.HOT_PIXEL_MODE);
+        requestKeys.add(CaptureRequest.STATISTICS_HOT_PIXEL_MAP_MODE);
+
+        Set<CameraCharacteristics.Key<?>> characteristicsKeys = new HashSet<>();
+        characteristicsKeys.add(HOT_PIXEL_AVAILABLE_HOT_PIXEL_MODES);
+        characteristicsKeys.add(SENSOR_BLACK_LEVEL_PATTERN);
+        characteristicsKeys.add(SENSOR_CALIBRATION_TRANSFORM1);
+        characteristicsKeys.add(SENSOR_CALIBRATION_TRANSFORM2);
+        characteristicsKeys.add(SENSOR_COLOR_TRANSFORM1);
+        characteristicsKeys.add(SENSOR_COLOR_TRANSFORM2);
+        characteristicsKeys.add(SENSOR_FORWARD_MATRIX1);
+        characteristicsKeys.add(SENSOR_FORWARD_MATRIX2);
+        characteristicsKeys.add(SENSOR_INFO_ACTIVE_ARRAY_SIZE);
+        characteristicsKeys.add(SENSOR_INFO_COLOR_FILTER_ARRANGEMENT);
+        characteristicsKeys.add(SENSOR_INFO_WHITE_LEVEL);
+        characteristicsKeys.add(SENSOR_REFERENCE_ILLUMINANT1);
+        characteristicsKeys.add(SENSOR_REFERENCE_ILLUMINANT2);
+        characteristicsKeys.add(STATISTICS_INFO_AVAILABLE_HOT_PIXEL_MAP_MODES);
+
+        Set<CaptureResult.Key<?>> resultKeys = new HashSet<>();
+        resultKeys.add(CaptureResult.SENSOR_NEUTRAL_COLOR_POINT);
+        resultKeys.add(CaptureResult.SENSOR_GREEN_SPLIT);
+        resultKeys.add(CaptureResult.SENSOR_NOISE_PROFILE);
+
+        boolean rawOutputSupported = mStaticInfo.getRawOutputSizesChecked().length > 0;
+        boolean requestKeysPresent = mStaticInfo.areRequestKeysAvailable(requestKeys);
+        boolean characteristicsKeysPresent =
+                mStaticInfo.areCharacteristicsKeysAvailable(characteristicsKeys);
+        boolean resultKeysPresent = mStaticInfo.areResultKeysAvailable(resultKeys);
+        boolean expectCapabilityPresent = rawOutputSupported && requestKeysPresent &&
+                characteristicsKeysPresent && resultKeysPresent;
+
+        if (isCapabilityAvailable != expectCapabilityPresent) {
+            if (isCapabilityAvailable) {
+                mCollector.expectTrue(
+                        "REQUEST_AVAILABLE_CAPABILITIES_RAW should support RAW_SENSOR output",
+                        rawOutputSupported);
+                validateRequestKeysPresence(capabilityName, requestKeys, isCapabilityAvailable);
+                validateResultKeysPresence(capabilityName, resultKeys, isCapabilityAvailable);
+                validateCharacteristicsKeysPresence(capabilityName, characteristicsKeys,
+                        isCapabilityAvailable);
             } else {
                 mCollector.addMessage(String.format(
-                        "Camera %s doesn't list capability %s but contain all required keys",
+                        "Camera %s doesn't list capability %s but contain all required keys" +
+                        " and RAW format output",
                         mCameraId, capabilityName));
             }
         }
diff --git a/tests/src/android/hardware/camera2/cts/common.rs b/tests/tests/hardware/src/android/hardware/camera2/cts/common.rs
similarity index 100%
rename from tests/src/android/hardware/camera2/cts/common.rs
rename to tests/tests/hardware/src/android/hardware/camera2/cts/common.rs
diff --git a/tests/src/android/hardware/camera2/cts/crop_yuvf_420_to_yuvx_444.rs b/tests/tests/hardware/src/android/hardware/camera2/cts/crop_yuvf_420_to_yuvx_444.rs
similarity index 100%
rename from tests/src/android/hardware/camera2/cts/crop_yuvf_420_to_yuvx_444.rs
rename to tests/tests/hardware/src/android/hardware/camera2/cts/crop_yuvf_420_to_yuvx_444.rs
diff --git a/tests/src/android/hardware/camera2/cts/means_yuvx_444_1d_to_single.rs b/tests/tests/hardware/src/android/hardware/camera2/cts/means_yuvx_444_1d_to_single.rs
similarity index 100%
rename from tests/src/android/hardware/camera2/cts/means_yuvx_444_1d_to_single.rs
rename to tests/tests/hardware/src/android/hardware/camera2/cts/means_yuvx_444_1d_to_single.rs
diff --git a/tests/src/android/hardware/camera2/cts/means_yuvx_444_2d_to_1d.rs b/tests/tests/hardware/src/android/hardware/camera2/cts/means_yuvx_444_2d_to_1d.rs
similarity index 100%
rename from tests/src/android/hardware/camera2/cts/means_yuvx_444_2d_to_1d.rs
rename to tests/tests/hardware/src/android/hardware/camera2/cts/means_yuvx_444_2d_to_1d.rs
diff --git a/tests/tests/hardware/src/android/hardware/camera2/cts/testcases/Camera2MultiViewTestCase.java b/tests/tests/hardware/src/android/hardware/camera2/cts/testcases/Camera2MultiViewTestCase.java
index ce0bd7b..4d16e7d 100644
--- a/tests/tests/hardware/src/android/hardware/camera2/cts/testcases/Camera2MultiViewTestCase.java
+++ b/tests/tests/hardware/src/android/hardware/camera2/cts/testcases/Camera2MultiViewTestCase.java
@@ -30,7 +30,7 @@
 import android.hardware.camera2.CameraDevice;
 import android.hardware.camera2.CameraManager;
 import android.hardware.camera2.CaptureRequest;
-import android.hardware.camera2.cts.Camera2MultiViewStubActivity;
+import android.hardware.camera2.cts.Camera2MultiViewCtsActivity;
 import android.hardware.camera2.cts.helpers.StaticMetadata;
 import android.hardware.camera2.cts.helpers.StaticMetadata.CheckLevel;
 import android.os.ConditionVariable;
@@ -57,7 +57,7 @@
  * Camera2 test case base class by using mixed SurfaceView and TextureView as rendering target.
  */
 public class Camera2MultiViewTestCase extends
-        ActivityInstrumentationTestCase2<Camera2MultiViewStubActivity> {
+        ActivityInstrumentationTestCase2<Camera2MultiViewCtsActivity> {
     private static final String TAG = "MultiViewTestCase";
     private static final boolean VERBOSE = Log.isLoggable(TAG, Log.VERBOSE);
 
@@ -79,7 +79,7 @@
     private HashMap<String, Integer> mCameraIdMap;
 
     public Camera2MultiViewTestCase() {
-        super(Camera2MultiViewStubActivity.class);
+        super(Camera2MultiViewCtsActivity.class);
     }
 
     @Override
@@ -95,7 +95,7 @@
         mHandlerThread.start();
         mHandler = new Handler(mHandlerThread.getLooper());
         mCameraListener = new BlockingStateCallback();
-        Camera2MultiViewStubActivity activity = (Camera2MultiViewStubActivity) mContext;
+        Camera2MultiViewCtsActivity activity = (Camera2MultiViewCtsActivity) mContext;
         mTextureView[0] = activity.getTextureView(0);
         mTextureView[1] = activity.getTextureView(1);
         assertNotNull("Unable to get texture view", mTextureView);
@@ -136,7 +136,7 @@
      */
     protected void updatePreviewDisplayRotation(Size previewSize, TextureView textureView) {
         int rotationDegrees = 0;
-        Camera2MultiViewStubActivity activity = (Camera2MultiViewStubActivity) mContext;
+        Camera2MultiViewCtsActivity activity = (Camera2MultiViewCtsActivity) mContext;
         int displayRotation = activity.getWindowManager().getDefaultDisplay().getRotation();
         Configuration config = activity.getResources().getConfiguration();
 
@@ -300,6 +300,7 @@
              * stopping preview. No need to release the SurfaceTexture here as it
              * is released by TextureView after onSurfaceTextureDestroyed is called.
              */
+            Log.i(TAG, "onSurfaceTextureDestroyed called.");
             return true;
         }
 
diff --git a/tests/tests/hardware/src/android/hardware/camera2/cts/testcases/Camera2SurfaceViewTestCase.java b/tests/tests/hardware/src/android/hardware/camera2/cts/testcases/Camera2SurfaceViewTestCase.java
index bd8b546..31fe8e3 100644
--- a/tests/tests/hardware/src/android/hardware/camera2/cts/testcases/Camera2SurfaceViewTestCase.java
+++ b/tests/tests/hardware/src/android/hardware/camera2/cts/testcases/Camera2SurfaceViewTestCase.java
@@ -41,7 +41,7 @@
 import android.hardware.camera2.CaptureResult;
 import android.util.Size;
 import android.util.Range;
-import android.hardware.camera2.cts.Camera2SurfaceViewStubActivity;
+import android.hardware.camera2.cts.Camera2SurfaceViewCtsActivity;
 import android.hardware.camera2.cts.CameraTestUtils;
 import android.hardware.camera2.cts.CameraTestUtils.SimpleCaptureCallback;
 import android.hardware.camera2.cts.helpers.CameraErrorCollector;
@@ -67,7 +67,7 @@
  */
 
 public class Camera2SurfaceViewTestCase extends
-        ActivityInstrumentationTestCase2<Camera2SurfaceViewStubActivity> {
+        ActivityInstrumentationTestCase2<Camera2SurfaceViewCtsActivity> {
     private static final String TAG = "SurfaceViewTestCase";
     private static final boolean VERBOSE = Log.isLoggable(TAG, Log.VERBOSE);
     private static final int WAIT_FOR_SURFACE_CHANGE_TIMEOUT_MS = 1000;
@@ -103,7 +103,7 @@
 
 
     public Camera2SurfaceViewTestCase() {
-        super(Camera2SurfaceViewStubActivity.class);
+        super(Camera2SurfaceViewCtsActivity.class);
     }
 
     @Override
@@ -596,8 +596,8 @@
         }
 
         mPreviewSize = size;
-        Camera2SurfaceViewStubActivity stubActivity = getActivity();
-        final SurfaceHolder holder = stubActivity.getSurfaceView().getHolder();
+        Camera2SurfaceViewCtsActivity ctsActivity = getActivity();
+        final SurfaceHolder holder = ctsActivity.getSurfaceView().getHolder();
         Handler handler = new Handler(Looper.getMainLooper());
         handler.post(new Runnable() {
             @Override
@@ -606,7 +606,7 @@
             }
         });
 
-        boolean res = stubActivity.waitForSurfaceSizeChanged(
+        boolean res = ctsActivity.waitForSurfaceSizeChanged(
                 WAIT_FOR_SURFACE_CHANGE_TIMEOUT_MS, mPreviewSize.getWidth(),
                 mPreviewSize.getHeight());
         assertTrue("wait for surface change to " + mPreviewSize.toString() + " timed out", res);
diff --git a/tests/tests/hardware/src/android/hardware/cts/CameraCtsActivity.java b/tests/tests/hardware/src/android/hardware/cts/CameraCtsActivity.java
new file mode 100644
index 0000000..1153cac
--- /dev/null
+++ b/tests/tests/hardware/src/android/hardware/cts/CameraCtsActivity.java
@@ -0,0 +1,48 @@
+/*
+ * Copyright (C) 2008 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.hardware.cts;
+
+import android.app.Activity;
+import android.os.Bundle;
+import android.view.SurfaceHolder;
+import android.view.SurfaceView;
+import android.view.ViewGroup;
+import com.android.cts.hardware.R;
+
+public class CameraCtsActivity extends Activity {
+    private SurfaceView mSurfaceView;
+    private final int LAYOUT_WIDTH = 480;
+    private final int LAYOUT_HEIGHT = 320;
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+
+        setContentView(R.layout.surface_view);
+        mSurfaceView = (SurfaceView)findViewById(R.id.surface_view);
+        ViewGroup.LayoutParams lp = mSurfaceView.getLayoutParams();
+        lp.width = LAYOUT_WIDTH;
+        lp.height = LAYOUT_HEIGHT;
+        mSurfaceView.setLayoutParams(lp);
+        mSurfaceView.getHolder().setFixedSize(LAYOUT_WIDTH, LAYOUT_HEIGHT);
+        mSurfaceView.getHolder().setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
+    }
+
+    public SurfaceView getSurfaceView() {
+        return mSurfaceView;
+    }
+}
diff --git a/tests/tests/hardware/src/android/hardware/cts/CameraGLTest.java b/tests/tests/hardware/src/android/hardware/cts/CameraGLTest.java
index c7e998c..d8f8a1d 100755
--- a/tests/tests/hardware/src/android/hardware/cts/CameraGLTest.java
+++ b/tests/tests/hardware/src/android/hardware/cts/CameraGLTest.java
@@ -25,7 +25,6 @@
 import android.opengl.GLES20;
 import android.opengl.GLSurfaceView;
 import android.opengl.Matrix;
-import android.opengl.cts.GLSurfaceViewStubActivity;
 
 import android.os.ConditionVariable;
 import android.os.Environment;
@@ -61,9 +60,9 @@
  * This test case must run with hardware. It can't be tested in emulator
  */
 @LargeTest
-public class CameraGLTest extends ActivityInstrumentationTestCase2<GLSurfaceViewStubActivity> {
+public class CameraGLTest extends ActivityInstrumentationTestCase2<GLSurfaceViewCtsActivity> {
     private static final String TAG = "CameraGLTest";
-    private static final String PACKAGE = "com.android.cts.stub";
+    private static final String PACKAGE = "com.android.cts.hardware";
     private static final boolean LOGV = false;
     private static final boolean LOGVV = false;
     private static final int EGL_OPENGL_ES2_BIT = 0x0004;
@@ -89,7 +88,7 @@
     GLSurfaceView mGLView;
 
     public CameraGLTest() {
-        super(PACKAGE, GLSurfaceViewStubActivity.class);
+        super(PACKAGE, GLSurfaceViewCtsActivity.class);
         if (LOGV) Log.v(TAG, "CameraGLTest Constructor");
     }
 
@@ -98,13 +97,13 @@
         super.setUp();
         // Set up renderer instance
         mRenderer = this.new Renderer();
-        GLSurfaceViewStubActivity.setRenderer(mRenderer);
-        GLSurfaceViewStubActivity.setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY);
-        GLSurfaceViewStubActivity.setGlVersion(2);
-        // Start CameraStubActivity.
-        GLSurfaceViewStubActivity stubActivity = getActivity();
+        GLSurfaceViewCtsActivity.setRenderer(mRenderer);
+        GLSurfaceViewCtsActivity.setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY);
+        GLSurfaceViewCtsActivity.setGlVersion(2);
+        // Start CameraCtsActivity.
+        GLSurfaceViewCtsActivity ctsActivity = getActivity();
         // Store a link to the view so we can redraw it when needed
-        mGLView = stubActivity.getView();
+        mGLView = ctsActivity.getView();
     }
 
     @Override
@@ -112,10 +111,10 @@
         if (mCamera != null) {
             terminateMessageLooper();
         }
-        // Clean up static values in stub so it can be reused
-        GLSurfaceViewStubActivity.resetRenderMode();
-        GLSurfaceViewStubActivity.resetRenderer();
-        GLSurfaceViewStubActivity.resetGlVersion();
+        // Clean up static values in cts so it can be reused
+        GLSurfaceViewCtsActivity.resetRenderMode();
+        GLSurfaceViewCtsActivity.resetRenderer();
+        GLSurfaceViewCtsActivity.resetGlVersion();
 
         super.tearDown();
     }
diff --git a/tests/tests/hardware/src/android/hardware/cts/CameraTest.java b/tests/tests/hardware/src/android/hardware/cts/CameraTest.java
index 50a3573..ad16036 100644
--- a/tests/tests/hardware/src/android/hardware/cts/CameraTest.java
+++ b/tests/tests/hardware/src/android/hardware/cts/CameraTest.java
@@ -63,9 +63,9 @@
  * This test case must run with hardware. It can't be tested in emulator
  */
 @LargeTest
-public class CameraTest extends ActivityInstrumentationTestCase2<CameraStubActivity> {
+public class CameraTest extends ActivityInstrumentationTestCase2<CameraCtsActivity> {
     private static String TAG = "CameraTest";
-    private static final String PACKAGE = "com.android.cts.stub";
+    private static final String PACKAGE = "com.android.cts.hardware";
     private static final boolean VERBOSE = Log.isLoggable(TAG, Log.VERBOSE);
     private final String JPEG_PATH = Environment.getExternalStorageDirectory().getPath() +
             "/test.jpg";
@@ -117,14 +117,14 @@
     Camera mCamera;
 
     public CameraTest() {
-        super(PACKAGE, CameraStubActivity.class);
+        super(PACKAGE, CameraCtsActivity.class);
         if (VERBOSE) Log.v(TAG, "Camera Constructor");
     }
 
     @Override
     protected void setUp() throws Exception {
         super.setUp();
-        // to start CameraStubActivity.
+        // to starCtsActivity.
         getActivity();
     }
 
diff --git a/tests/tests/hardware/src/android/hardware/cts/GLSurfaceViewCtsActivity.java b/tests/tests/hardware/src/android/hardware/cts/GLSurfaceViewCtsActivity.java
new file mode 100644
index 0000000..fa2a0e5
--- /dev/null
+++ b/tests/tests/hardware/src/android/hardware/cts/GLSurfaceViewCtsActivity.java
@@ -0,0 +1,123 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.hardware.cts;
+
+import android.app.Activity;
+import android.opengl.GLSurfaceView;
+import android.os.Bundle;
+import android.view.Window;
+
+import javax.microedition.khronos.egl.EGLConfig;
+import javax.microedition.khronos.opengles.GL10;
+
+/**
+ * A minimal activity for testing {@link android.opengl.GLSurfaceView}.
+ * Also accepts non-blank renderers to allow its use for more complex tests.
+ */
+public class GLSurfaceViewCtsActivity extends Activity {
+
+    private static class Renderer implements GLSurfaceView.Renderer {
+
+        public void onDrawFrame(GL10 gl) {
+            // Do nothing.
+        }
+
+        public void onSurfaceChanged(GL10 gl, int width, int height) {
+            // Do nothing.
+        }
+
+        public void onSurfaceCreated(GL10 gl, EGLConfig config) {
+            // Do nothing.
+        }
+    }
+
+    private GLSurfaceView mView;
+
+    /** To override the blank renderer, or other settings, these
+     * static set* methods must be called before onCreate() is called.
+     * If using ActivityInstrumentationTestCase2, that means the set
+     * methods need to be called before calling getActivity in the
+     * test setUp().
+     */
+    private static GLSurfaceView.Renderer mRenderer = null;
+    public static void setRenderer(GLSurfaceView.Renderer renderer) {
+        mRenderer = renderer;
+    }
+    public static void resetRenderer() {
+        mRenderer = null;
+    }
+
+    private static int mRenderMode = 0;
+    private static boolean mRenderModeSet = false;
+    public static void setRenderMode(int renderMode) {
+        mRenderModeSet = true;
+        mRenderMode = renderMode;
+    }
+    public static void resetRenderMode() {
+        mRenderModeSet = false;
+        mRenderMode = 0;
+    }
+
+    private static int mGlVersion = 0;
+    private static boolean mGlVersionSet = false;
+    public static void setGlVersion(int glVersion) {
+        mGlVersionSet = true;
+        mGlVersion = glVersion;
+    }
+    public static void resetGlVersion() {
+        mGlVersionSet = false;
+        mGlVersion = 0;
+    }
+
+    @Override
+    public void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        mView = new GLSurfaceView(this);
+        // Only set this if explicitly asked for
+        if (mGlVersionSet) {
+            mView.setEGLContextClientVersion(mGlVersion);
+        }
+        // Use no-op renderer by default
+        if (mRenderer == null) {
+            mView.setRenderer(new Renderer());
+        } else {
+            mView.setRenderer(mRenderer);
+        }
+        // Only set this if explicitly asked for
+        if (mRenderModeSet) {
+            mView.setRenderMode(mRenderMode);
+        }
+        this.requestWindowFeature(Window.FEATURE_NO_TITLE);
+        setContentView(mView);
+    }
+
+    public GLSurfaceView getView() {
+        return mView;
+    }
+
+    @Override
+    protected void onResume() {
+        super.onResume();
+        mView.onResume();
+    }
+
+    @Override
+    protected void onPause() {
+        super.onPause();
+        mView.onPause();
+    }
+}
diff --git a/tests/tests/hardware/src/android/hardware/cts/SensorBatchingTests.java b/tests/tests/hardware/src/android/hardware/cts/SensorBatchingTests.java
new file mode 100644
index 0000000..3d66b50
--- /dev/null
+++ b/tests/tests/hardware/src/android/hardware/cts/SensorBatchingTests.java
@@ -0,0 +1,319 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.hardware.cts;
+
+import android.content.Context;
+import android.hardware.Sensor;
+import android.hardware.SensorManager;
+import android.hardware.cts.helpers.SensorCtsHelper;
+import android.hardware.cts.helpers.SensorStats;
+import android.hardware.cts.helpers.SensorTestInformation;
+import android.hardware.cts.helpers.sensoroperations.TestSensorFlushOperation;
+import android.hardware.cts.helpers.sensoroperations.TestSensorOperation;
+import android.hardware.cts.helpers.sensoroperations.VerifiableSensorOperation;
+import android.hardware.cts.helpers.sensorverification.ISensorVerification;
+
+import java.util.concurrent.TimeUnit;
+
+/**
+ * Set of tests to verify that sensors operate correctly when operating in batching mode.
+ * This class defines tests for continuous sensors when the device is awake.
+ * On-change and special sensors are tested separately inside CtsVerifier, and they are defined in:
+ * {@link com.android.cts.verifier.sensors.BatchingTestActivity}.
+ *
+ * Each test is expected to pass even if batching is not supported for a particular sensor. This is
+ * usually achieved by ensuring that {@link ISensorVerification}s fallback accordingly.
+ *
+ * <p>To execute these test cases, the following command can be used:</p>
+ * <pre>
+ * adb shell am instrument -e class android.hardware.cts.SensorBatchingTests \
+ *     -w com.android.cts.hardware/android.test.AndroidJUnitRunner
+ * </pre>
+ */
+public class SensorBatchingTests extends SensorTestCase {
+    private static final String TAG = "SensorBatchingTests";
+
+    private static final int BATCHING_10S = 10;
+    private static final int RATE_50HZ = 20000;
+    private static final int RATE_FASTEST = SensorManager.SENSOR_DELAY_FASTEST;
+
+    /**
+     * An arbitrary 'padding' time slot to wait for events after batching latency expires.
+     * This allows for the test to wait for event arrivals after batching was expected.
+     */
+    private static final int BATCHING_PADDING_TIME_S = 2;
+
+    public void testAccelerometer_fastest_batching() throws Throwable {
+        runBatchingSensorTest(Sensor.TYPE_ACCELEROMETER, RATE_FASTEST, BATCHING_10S);
+    }
+
+    public void testAccelerometer_50hz_batching() throws Throwable {
+        runBatchingSensorTest(Sensor.TYPE_ACCELEROMETER, RATE_50HZ, BATCHING_10S);
+    }
+
+    public void testAccelerometer_fastest_flush() throws Throwable {
+        runFlushSensorTest(Sensor.TYPE_ACCELEROMETER, RATE_FASTEST, BATCHING_10S);
+    }
+
+    public void testAccelerometer_50hz_flush() throws Throwable {
+        runFlushSensorTest(Sensor.TYPE_ACCELEROMETER, RATE_50HZ, BATCHING_10S);
+    }
+
+    public void testMagneticField_fastest_batching() throws Throwable {
+        runBatchingSensorTest(Sensor.TYPE_MAGNETIC_FIELD, RATE_FASTEST, BATCHING_10S);
+    }
+
+    public void testMagneticField_50hz_batching() throws Throwable {
+        runBatchingSensorTest(Sensor.TYPE_MAGNETIC_FIELD, RATE_50HZ, BATCHING_10S);
+    }
+
+    public void testMagneticField_fastest_flush() throws Throwable {
+        runFlushSensorTest(Sensor.TYPE_MAGNETIC_FIELD, RATE_FASTEST, BATCHING_10S);
+    }
+
+    public void testMagneticField_50hz_flush() throws Throwable {
+        runFlushSensorTest(Sensor.TYPE_MAGNETIC_FIELD, RATE_50HZ, BATCHING_10S);
+    }
+
+    @SuppressWarnings("deprecation")
+    public void testOrientation_fastest_batching() throws Throwable {
+        runBatchingSensorTest(Sensor.TYPE_ORIENTATION, RATE_FASTEST, BATCHING_10S);
+    }
+
+    @SuppressWarnings("deprecation")
+    public void testOrientation_50hz_batching() throws Throwable {
+        runBatchingSensorTest(Sensor.TYPE_ORIENTATION, RATE_50HZ, BATCHING_10S);
+    }
+
+    @SuppressWarnings("deprecation")
+    public void testOrientation_fastest_flush() throws Throwable {
+        runFlushSensorTest(Sensor.TYPE_ORIENTATION, RATE_FASTEST, BATCHING_10S);
+    }
+
+    @SuppressWarnings("deprecation")
+    public void testOrientation_50hz_flush() throws Throwable {
+        runFlushSensorTest(Sensor.TYPE_ORIENTATION, RATE_50HZ, BATCHING_10S);
+    }
+
+    public void testGyroscope_fastest_batching() throws Throwable {
+        runBatchingSensorTest(Sensor.TYPE_GYROSCOPE, RATE_FASTEST, BATCHING_10S);
+    }
+
+    public void testGyroscope_50hz_batching() throws Throwable {
+        runBatchingSensorTest(Sensor.TYPE_GYROSCOPE, RATE_50HZ, BATCHING_10S);
+    }
+
+    public void testGyroscope_fastest_flush() throws Throwable {
+        runFlushSensorTest(Sensor.TYPE_GYROSCOPE, SensorManager.SENSOR_DELAY_FASTEST, BATCHING_10S);
+    }
+
+    public void testGyroscope_50hz_flush() throws Throwable {
+        runFlushSensorTest(Sensor.TYPE_GYROSCOPE, RATE_50HZ, BATCHING_10S);
+    }
+
+    public void testPressure_fastest_batching() throws Throwable {
+        runBatchingSensorTest(Sensor.TYPE_PRESSURE, RATE_FASTEST, BATCHING_10S);
+    }
+
+    public void testPressure_50hz_batching() throws Throwable {
+        runBatchingSensorTest(Sensor.TYPE_PRESSURE, RATE_50HZ, BATCHING_10S);
+    }
+
+    public void testPressure_fastest_flush() throws Throwable {
+        runFlushSensorTest(Sensor.TYPE_PRESSURE, SensorManager.SENSOR_DELAY_FASTEST, BATCHING_10S);
+    }
+
+    public void testPressure_50hz_flush() throws Throwable {
+        runFlushSensorTest(Sensor.TYPE_PRESSURE, RATE_50HZ, BATCHING_10S);
+    }
+
+    public void testGravity_fastest_batching() throws Throwable {
+        runBatchingSensorTest(Sensor.TYPE_GRAVITY, RATE_FASTEST, BATCHING_10S);
+    }
+
+    public void testGravity_50hz_batching() throws Throwable {
+        runBatchingSensorTest(Sensor.TYPE_GRAVITY, RATE_50HZ, BATCHING_10S);
+    }
+
+    public void testGravity_fastest_flush() throws Throwable {
+        runFlushSensorTest(Sensor.TYPE_GRAVITY, SensorManager.SENSOR_DELAY_FASTEST, BATCHING_10S);
+    }
+
+    public void testGravity_50hz_flush() throws Throwable {
+        runFlushSensorTest(Sensor.TYPE_GRAVITY, RATE_50HZ, BATCHING_10S);
+    }
+
+    public void testRotationVector_fastest_batching() throws Throwable {
+        runBatchingSensorTest(Sensor.TYPE_ROTATION_VECTOR, RATE_FASTEST, BATCHING_10S);
+    }
+
+    public void testRotationVector_50hz_batching() throws Throwable {
+        runBatchingSensorTest(Sensor.TYPE_ROTATION_VECTOR, RATE_50HZ, BATCHING_10S);
+    }
+
+    public void testRotationVector_fastest_flush() throws Throwable {
+        runFlushSensorTest(Sensor.TYPE_ROTATION_VECTOR, RATE_FASTEST, BATCHING_10S);
+    }
+
+    public void testRotationVector_50hz_flush() throws Throwable {
+        runFlushSensorTest(Sensor.TYPE_ROTATION_VECTOR, RATE_50HZ, BATCHING_10S);
+    }
+
+    public void testMagneticFieldUncalibrated_fastest_batching() throws Throwable {
+        runBatchingSensorTest(Sensor.TYPE_MAGNETIC_FIELD_UNCALIBRATED, RATE_FASTEST, BATCHING_10S);
+    }
+
+    public void testMagneticFieldUncalibrated_50hz_batching() throws Throwable {
+        runBatchingSensorTest(Sensor.TYPE_MAGNETIC_FIELD_UNCALIBRATED, RATE_50HZ, BATCHING_10S);
+    }
+
+    public void testMagneticFieldUncalibrated_fastest_flush() throws Throwable {
+        runFlushSensorTest(Sensor.TYPE_MAGNETIC_FIELD_UNCALIBRATED, RATE_FASTEST, BATCHING_10S);
+    }
+
+    public void testMagneticFieldUncalibrated_50hz_flush() throws Throwable {
+        runFlushSensorTest(Sensor.TYPE_MAGNETIC_FIELD_UNCALIBRATED, RATE_50HZ, BATCHING_10S);
+    }
+
+    public void testGameRotationVector_fastest_batching() throws Throwable {
+        runBatchingSensorTest(Sensor.TYPE_GAME_ROTATION_VECTOR, RATE_FASTEST, BATCHING_10S);
+    }
+
+    public void testGameRotationVector_50hz_batching() throws Throwable {
+        runBatchingSensorTest(Sensor.TYPE_GAME_ROTATION_VECTOR, RATE_50HZ, BATCHING_10S);
+    }
+
+    public void testGameRotationVector_fastest_flush() throws Throwable {
+        runFlushSensorTest(Sensor.TYPE_GAME_ROTATION_VECTOR, RATE_FASTEST, BATCHING_10S);
+    }
+
+    public void testGameRotationVector_50hz_flush() throws Throwable {
+        runFlushSensorTest(Sensor.TYPE_GAME_ROTATION_VECTOR, RATE_50HZ, BATCHING_10S);
+    }
+
+    public void testGyroscopeUncalibrated_fastest_batching() throws Throwable {
+        runBatchingSensorTest(Sensor.TYPE_GYROSCOPE_UNCALIBRATED, RATE_FASTEST, BATCHING_10S);
+    }
+
+    public void testGyroscopeUncalibrated_50hz_batching() throws Throwable {
+        runBatchingSensorTest(Sensor.TYPE_GYROSCOPE_UNCALIBRATED, RATE_50HZ, BATCHING_10S);
+    }
+
+    public void testGyroscopeUncalibrated_fastest_flush() throws Throwable {
+        runFlushSensorTest(Sensor.TYPE_GYROSCOPE_UNCALIBRATED, RATE_FASTEST, BATCHING_10S);
+    }
+
+    public void testGyroscopeUncalibrated_50hz_flush() throws Throwable {
+        runFlushSensorTest(Sensor.TYPE_GYROSCOPE_UNCALIBRATED, RATE_50HZ, BATCHING_10S);
+    }
+
+    public void testLinearAcceleration_fastest_batching() throws Throwable {
+        runBatchingSensorTest(Sensor.TYPE_LINEAR_ACCELERATION, RATE_FASTEST, BATCHING_10S);
+    }
+
+    public void testLinearAcceleration_50hz_batching() throws Throwable {
+        runBatchingSensorTest(Sensor.TYPE_LINEAR_ACCELERATION, RATE_50HZ, BATCHING_10S);
+    }
+
+    public void testLinearAcceleration_fastest_flush() throws Throwable {
+        runFlushSensorTest(Sensor.TYPE_LINEAR_ACCELERATION, RATE_FASTEST, BATCHING_10S);
+    }
+
+    public void testLinearAcceleration_50hz_flush() throws Throwable {
+        runFlushSensorTest(Sensor.TYPE_LINEAR_ACCELERATION, RATE_50HZ, BATCHING_10S);
+    }
+
+    public void testGeomagneticRotationVector_fastest_batching() throws Throwable {
+        runBatchingSensorTest(Sensor.TYPE_GEOMAGNETIC_ROTATION_VECTOR, RATE_FASTEST, BATCHING_10S);
+    }
+
+    public void testGeomagneticRotationVector_50hz_batching() throws Throwable {
+        runBatchingSensorTest(Sensor.TYPE_GEOMAGNETIC_ROTATION_VECTOR, RATE_50HZ, BATCHING_10S);
+    }
+
+    public void testGeomagneticRotationVector_fastest_flush() throws Throwable {
+        runFlushSensorTest(Sensor.TYPE_GEOMAGNETIC_ROTATION_VECTOR, RATE_FASTEST, BATCHING_10S);
+    }
+
+    public void testGeomagneticRotationVector_50hz_flush() throws Throwable {
+        runFlushSensorTest(Sensor.TYPE_GEOMAGNETIC_ROTATION_VECTOR, RATE_50HZ, BATCHING_10S);
+    }
+
+    private void runBatchingSensorTest(int sensorType, int rateUs, int maxBatchReportLatencySec)
+            throws Throwable {
+        Context context = getContext();
+        int maxBatchReportLatencyUs = (int) TimeUnit.SECONDS.toMicros(maxBatchReportLatencySec);
+        int testDurationSec = maxBatchReportLatencySec + BATCHING_PADDING_TIME_S;
+        TestSensorOperation operation = new TestSensorOperation(
+                context,
+                sensorType,
+                rateUs,
+                maxBatchReportLatencyUs,
+                testDurationSec,
+                TimeUnit.SECONDS);
+
+        boolean flushExpected = false;
+        executeTest(operation, sensorType, rateUs, maxBatchReportLatencyUs, flushExpected);
+    }
+
+    private void runFlushSensorTest(int sensorType, int rateUs, int maxBatchReportLatencySec)
+            throws Throwable {
+        Context context = getContext();
+        int maxBatchReportLatencyUs = (int) TimeUnit.SECONDS.toMicros(maxBatchReportLatencySec);
+        int flushDurationSec = maxBatchReportLatencySec / 2;
+        TestSensorFlushOperation operation = new TestSensorFlushOperation(
+                context,
+                sensorType,
+                rateUs,
+                maxBatchReportLatencyUs,
+                flushDurationSec,
+                TimeUnit.SECONDS);
+
+        boolean flushExpected = true;
+        executeTest(operation, sensorType, rateUs, maxBatchReportLatencyUs, flushExpected);
+    }
+
+    private void executeTest(
+            VerifiableSensorOperation operation,
+            int sensorType,
+            int rateUs,
+            int maxBatchReportLatencyUs,
+            boolean flushExpected) throws Throwable {
+        operation.addDefaultVerifications();
+        operation.setLogEvents(true);
+
+        try {
+            operation.execute();
+        } finally {
+            SensorStats.logStats(TAG, operation.getStats());
+
+            String sensorName = SensorTestInformation.getSanitizedSensorName(sensorType);
+            String sensorRate;
+            if (rateUs == SensorManager.SENSOR_DELAY_FASTEST) {
+                sensorRate = "fastest";
+            } else {
+                sensorRate = String.format("%.0fhz",
+                        SensorCtsHelper.getFrequency(rateUs, TimeUnit.MICROSECONDS));
+            }
+            String batching = maxBatchReportLatencyUs > 0 ? "_batching" : "";
+            String flush = flushExpected ? "_flush" : "";
+            String fileName = String.format("sensor_batching_%s_%s%s%s.txt",
+                    sensorName, sensorRate, batching, flush);
+            SensorStats.logStatsToFile(fileName, operation.getStats());
+        }
+    }
+}
diff --git a/tests/tests/hardware/src/android/hardware/cts/SensorIntegrationTests.java b/tests/tests/hardware/src/android/hardware/cts/SensorIntegrationTests.java
index 1b923fc..c471b7a 100644
--- a/tests/tests/hardware/src/android/hardware/cts/SensorIntegrationTests.java
+++ b/tests/tests/hardware/src/android/hardware/cts/SensorIntegrationTests.java
@@ -15,6 +15,9 @@
  */
 package android.hardware.cts;
 
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
 import android.content.Context;
 import android.hardware.Sensor;
 import android.hardware.SensorManager;
@@ -24,11 +27,9 @@
 import android.hardware.cts.helpers.sensoroperations.RepeatingSensorOperation;
 import android.hardware.cts.helpers.sensoroperations.SequentialSensorOperation;
 import android.hardware.cts.helpers.sensoroperations.TestSensorOperation;
+import android.hardware.cts.helpers.sensoroperations.VerifiableSensorOperation;
 import android.hardware.cts.helpers.sensorverification.EventOrderingVerification;
 
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
 import java.util.Random;
 
 /**
@@ -225,7 +226,7 @@
                 100 /* event count */);
         tester.addVerification(new EventOrderingVerification());
 
-        TestSensorOperation testee = new TestSensorOperation(
+        VerifiableSensorOperation testee = new TestSensorOperation(
                 context,
                 mSensorTypeTestee,
                 SensorManager.SENSOR_DELAY_FASTEST,
diff --git a/tests/tests/hardware/src/android/hardware/cts/SensorTest.java b/tests/tests/hardware/src/android/hardware/cts/SensorTest.java
index 5006d55..a4d4157 100644
--- a/tests/tests/hardware/src/android/hardware/cts/SensorTest.java
+++ b/tests/tests/hardware/src/android/hardware/cts/SensorTest.java
@@ -358,8 +358,8 @@
         try {
             mWakeLock.acquire();
             for (Sensor sensor : mSensorList) {
-                // Skip non-continuos mode sensors.
-                if (sensor.getReportingMode() != Sensor.REPORTING_MODE_CONTINUOUS) {
+                // Skip ONLY one-shot sensors.
+                if (sensor.getReportingMode() != Sensor.REPORTING_MODE_ONE_SHOT) {
                     registerListenerCallFlush(sensor, null);
                 }
             }
@@ -378,11 +378,10 @@
             handlerThread.start();
             Handler handler = new Handler(handlerThread.getLooper());
             for (Sensor sensor : mSensorList) {
-                // Skip non-continuous mode sensors.
-                if (sensor.getReportingMode() != Sensor.REPORTING_MODE_CONTINUOUS) {
-                    continue;
+                // Skip ONLY one-shot sensors.
+                if (sensor.getReportingMode() != Sensor.REPORTING_MODE_ONE_SHOT) {
+                    registerListenerCallFlush(sensor, handler);
                 }
-                registerListenerCallFlush(sensor, handler);
             }
         }  finally {
             mWakeLock.release();
@@ -391,6 +390,9 @@
 
     private void registerListenerCallFlush(Sensor sensor, Handler handler)
             throws InterruptedException {
+        if (sensor.getReportingMode() == Sensor.REPORTING_MODE_ONE_SHOT) {
+            return;
+        }
         final int numEvents = 500;
         final int rateUs = 20000; // DELAY_GAME
         final int maxBatchReportLatencyUs = 10000000;
@@ -414,26 +416,23 @@
         // Consider only continuous mode sensors for testing registerListener.
         // For on-change sensors, call registerListener() so that the listener is associated
         // with the sensor so that flush(listener) can be called on it.
-        if (sensor.getReportingMode() == Sensor.REPORTING_MODE_CONTINUOUS ||
-                sensor.getReportingMode() == Sensor.REPORTING_MODE_ON_CHANGE) {
-            Log.i(TAG, "testBatch " + sensor.getName());
-            boolean result = mSensorManager.registerListener(listener, sensor,
-                    rateUs, maxBatchReportLatencyUs, handler);
-            assertTrue("registerListener failed " + sensor.getName(), result);
-            // Wait for 500 events or N seconds before the test times out.
-            if (sensor.getReportingMode() == Sensor.REPORTING_MODE_CONTINUOUS) {
-                // Wait for approximately the time required to generate these events + a tolerance
-                // of 10 seconds.
-                long timeToWaitUs = (long)numEvents * rateUs + maxBatchReportLatencyUs +
-                        TIMEOUT_TOLERANCE_US;
-                boolean countZero = eventReceived.await(timeToWaitUs, TimeUnit.MICROSECONDS);
-                if (!countZero) {
-                    fail("Timed out waiting for events from " + sensor.getName());
-                }
+        Log.i(TAG, "testBatch " + sensor.getName());
+        boolean result = mSensorManager.registerListener(listener, sensor,
+                rateUs, maxBatchReportLatencyUs, handler);
+        assertTrue("registerListener failed " + sensor.getName(), result);
+        // Wait for 500 events or N seconds before the test times out.
+        if (sensor.getReportingMode() == Sensor.REPORTING_MODE_CONTINUOUS) {
+            // Wait for approximately the time required to generate these events + a tolerance
+            // of 10 seconds.
+            long timeToWaitUs = (long)numEvents * rateUs + maxBatchReportLatencyUs +
+                    TIMEOUT_TOLERANCE_US;
+            boolean countZero = eventReceived.await(timeToWaitUs, TimeUnit.MICROSECONDS);
+            if (!countZero) {
+                fail("Timed out waiting for events from " + sensor.getName());
             }
         }
         Log.i(TAG, "testFlush " + sensor.getName());
-        boolean result = mSensorManager.flush(listener);
+        result = mSensorManager.flush(listener);
         assertTrue("flush failed " + sensor.getName(), result);
         boolean countZero = flushReceived.await(TIMEOUT_TOLERANCE_US, TimeUnit.MICROSECONDS);
         if (!countZero) {
@@ -519,8 +518,11 @@
         assertTrue(sensor.getResolution() >= 0);
         assertNotNull(sensor.getVendor());
         assertTrue(sensor.getVersion() > 0);
-        assertTrue(sensor.getFifoMaxEventCount() >= 0);
-        assertTrue(sensor.getFifoReservedEventCount() >= 0);
+        int fifoMaxEventCount = sensor.getFifoMaxEventCount();
+        int fifoReservedEventCount = sensor.getFifoReservedEventCount();
+        assertTrue(fifoMaxEventCount >= 0);
+        assertTrue(fifoReservedEventCount >= 0);
+        assertTrue(fifoReservedEventCount <= fifoMaxEventCount);
         if (sensor.getReportingMode() == Sensor.REPORTING_MODE_ONE_SHOT) {
             assertTrue("One shot sensors should have zero FIFO Size",
                     sensor.getFifoMaxEventCount() == 0);
diff --git a/tests/tests/hardware/src/android/hardware/cts/SingleSensorTests.java b/tests/tests/hardware/src/android/hardware/cts/SingleSensorTests.java
index cc7f71c..866e556 100644
--- a/tests/tests/hardware/src/android/hardware/cts/SingleSensorTests.java
+++ b/tests/tests/hardware/src/android/hardware/cts/SingleSensorTests.java
@@ -34,7 +34,7 @@
  * To execute these test cases, the following command can be used:
  * </p><pre>
  * adb shell am instrument -e class android.hardware.cts.SingleSensorTests \
- *     -w com.android.cts.hardware/android.test.InstrumentationCtsTestRunner
+ *     -w com.android.cts.hardware/android.test.AndroidJUnitRunner
  * </pre><p>
  * For each sensor that reports continuously, it takes a set of samples. The test suite verifies
  * that the event ordering, frequency, and jitter pass for the collected sensor events. It
@@ -86,9 +86,6 @@
 public class SingleSensorTests extends SensorTestCase {
     private static final String TAG = "SingleSensorTests";
 
-    private static final int BATCHING_OFF = 0;
-    private static final int BATCHING_5S = 5000000;
-
     private static final int RATE_200HZ = 5000;
     private static final int RATE_100HZ = 10000;
     private static final int RATE_50HZ = 20000;
@@ -98,17 +95,8 @@
     private static final int RATE_5HZ = 200000;
     private static final int RATE_1HZ = 1000000;
 
-    private static final String[] STAT_KEYS = {
-        SensorStats.FREQUENCY_KEY,
-        SensorStats.JITTER_95_PERCENTILE_KEY,
-        SensorStats.EVENT_OUT_OF_ORDER_COUNT_KEY,
-        SensorStats.MAGNITUDE_KEY,
-        SensorStats.MEAN_KEY,
-        SensorStats.STANDARD_DEVIATION_KEY,
-    };
-
     /**
-     * This test verifies that the sensor's properties complies with the required properites set in
+     * This test verifies that the sensor's properties complies with the required properties set in
      * the CDD.
      * <p>
      * It checks that the sampling rate advertised by the sensor under test matches that which is
@@ -138,513 +126,414 @@
     // TODO: Figure out if a better way to enumerate test cases programmatically exists that works
     // with CTS framework.
     public void testAccelerometer_fastest() throws Throwable {
-        runSensorTest(Sensor.TYPE_ACCELEROMETER, SensorManager.SENSOR_DELAY_FASTEST, BATCHING_OFF);
+        runSensorTest(Sensor.TYPE_ACCELEROMETER, SensorManager.SENSOR_DELAY_FASTEST);
     }
 
     public void testAccelerometer_100hz() throws Throwable {
-        runSensorTest(Sensor.TYPE_ACCELEROMETER, RATE_100HZ, BATCHING_OFF);
+        runSensorTest(Sensor.TYPE_ACCELEROMETER, RATE_100HZ);
     }
 
     public void testAccelerometer_200hz() throws Throwable {
-        runSensorTest(Sensor.TYPE_ACCELEROMETER, RATE_200HZ, BATCHING_OFF);
+        runSensorTest(Sensor.TYPE_ACCELEROMETER, RATE_200HZ);
     }
 
     public void testAccelerometer_50hz() throws Throwable {
-        runSensorTest(Sensor.TYPE_ACCELEROMETER, RATE_50HZ, BATCHING_OFF);
+        runSensorTest(Sensor.TYPE_ACCELEROMETER, RATE_50HZ);
     }
 
     public void testAccelerometer_25hz() throws Throwable {
-        runSensorTest(Sensor.TYPE_ACCELEROMETER, RATE_25HZ, BATCHING_OFF);
+        runSensorTest(Sensor.TYPE_ACCELEROMETER, RATE_25HZ);
     }
 
     public void testAccelerometer_15hz() throws Throwable {
-        runSensorTest(Sensor.TYPE_ACCELEROMETER, RATE_15HZ, BATCHING_OFF);
+        runSensorTest(Sensor.TYPE_ACCELEROMETER, RATE_15HZ);
     }
 
     public void testAccelerometer_10hz() throws Throwable {
-        runSensorTest(Sensor.TYPE_ACCELEROMETER, RATE_10HZ, BATCHING_OFF);
+        runSensorTest(Sensor.TYPE_ACCELEROMETER, RATE_10HZ);
     }
 
     public void testAccelerometer_5hz() throws Throwable {
-        runSensorTest(Sensor.TYPE_ACCELEROMETER, RATE_5HZ, BATCHING_OFF);
+        runSensorTest(Sensor.TYPE_ACCELEROMETER, RATE_5HZ);
     }
 
     public void testAccelerometer_1hz() throws Throwable {
-        runSensorTest(Sensor.TYPE_ACCELEROMETER, RATE_1HZ, BATCHING_OFF);
-    }
-
-    public void testAccelerometer_fastest_batching() throws Throwable {
-        runSensorTest(Sensor.TYPE_ACCELEROMETER, SensorManager.SENSOR_DELAY_FASTEST, BATCHING_5S);
-    }
-
-    public void testAccelerometer_50hz_batching() throws Throwable {
-        runSensorTest(Sensor.TYPE_ACCELEROMETER, RATE_50HZ, BATCHING_5S);
+        runSensorTest(Sensor.TYPE_ACCELEROMETER, RATE_1HZ);
     }
 
     public void testMagneticField_fastest() throws Throwable {
-        runSensorTest(Sensor.TYPE_MAGNETIC_FIELD, SensorManager.SENSOR_DELAY_FASTEST, BATCHING_OFF);
+        runSensorTest(Sensor.TYPE_MAGNETIC_FIELD, SensorManager.SENSOR_DELAY_FASTEST);
     }
 
     public void testMagneticField_200hz() throws Throwable {
-        runSensorTest(Sensor.TYPE_MAGNETIC_FIELD, RATE_200HZ, BATCHING_OFF);
+        runSensorTest(Sensor.TYPE_MAGNETIC_FIELD, RATE_200HZ);
     }
 
     public void testMagneticField_100hz() throws Throwable {
-        runSensorTest(Sensor.TYPE_MAGNETIC_FIELD, RATE_100HZ, BATCHING_OFF);
+        runSensorTest(Sensor.TYPE_MAGNETIC_FIELD, RATE_100HZ);
     }
 
     public void testMagneticField_50hz() throws Throwable {
-        runSensorTest(Sensor.TYPE_MAGNETIC_FIELD, RATE_50HZ, BATCHING_OFF);
+        runSensorTest(Sensor.TYPE_MAGNETIC_FIELD, RATE_50HZ);
     }
 
     public void testMagneticField_25hz() throws Throwable {
-        runSensorTest(Sensor.TYPE_MAGNETIC_FIELD, RATE_25HZ, BATCHING_OFF);
+        runSensorTest(Sensor.TYPE_MAGNETIC_FIELD, RATE_25HZ);
     }
 
     public void testMagneticField_15hz() throws Throwable {
-        runSensorTest(Sensor.TYPE_MAGNETIC_FIELD, RATE_15HZ, BATCHING_OFF);
+        runSensorTest(Sensor.TYPE_MAGNETIC_FIELD, RATE_15HZ);
     }
 
     public void testMagneticField_10hz() throws Throwable {
-        runSensorTest(Sensor.TYPE_MAGNETIC_FIELD, RATE_10HZ, BATCHING_OFF);
+        runSensorTest(Sensor.TYPE_MAGNETIC_FIELD, RATE_10HZ);
     }
 
     public void testMagneticField_5hz() throws Throwable {
-        runSensorTest(Sensor.TYPE_MAGNETIC_FIELD, RATE_5HZ, BATCHING_OFF);
+        runSensorTest(Sensor.TYPE_MAGNETIC_FIELD, RATE_5HZ);
     }
 
     public void testMagneticField_1hz() throws Throwable {
-        runSensorTest(Sensor.TYPE_MAGNETIC_FIELD, RATE_1HZ, BATCHING_OFF);
-    }
-
-    public void testMagneticField_fastest_batching() throws Throwable {
-        runSensorTest(Sensor.TYPE_MAGNETIC_FIELD, SensorManager.SENSOR_DELAY_FASTEST, BATCHING_5S);
-    }
-
-    public void testMagneticField_50hz_batching() throws Throwable {
-        runSensorTest(Sensor.TYPE_MAGNETIC_FIELD, RATE_50HZ, BATCHING_5S);
+        runSensorTest(Sensor.TYPE_MAGNETIC_FIELD, RATE_1HZ);
     }
 
     @SuppressWarnings("deprecation")
     public void testOrientation_fastest() throws Throwable {
-        runSensorTest(Sensor.TYPE_ORIENTATION, SensorManager.SENSOR_DELAY_FASTEST, BATCHING_OFF);
+        runSensorTest(Sensor.TYPE_ORIENTATION, SensorManager.SENSOR_DELAY_FASTEST);
     }
 
     @SuppressWarnings("deprecation")
     public void testOrientation_200hz() throws Throwable {
-        runSensorTest(Sensor.TYPE_ORIENTATION, RATE_200HZ, BATCHING_OFF);
+        runSensorTest(Sensor.TYPE_ORIENTATION, RATE_200HZ);
     }
     @SuppressWarnings("deprecation")
     public void testOrientation_100hz() throws Throwable {
-        runSensorTest(Sensor.TYPE_ORIENTATION, RATE_100HZ, BATCHING_OFF);
+        runSensorTest(Sensor.TYPE_ORIENTATION, RATE_100HZ);
     }
 
     @SuppressWarnings("deprecation")
     public void testOrientation_50hz() throws Throwable {
-        runSensorTest(Sensor.TYPE_ORIENTATION, RATE_50HZ, BATCHING_OFF);
+        runSensorTest(Sensor.TYPE_ORIENTATION, RATE_50HZ);
     }
 
     @SuppressWarnings("deprecation")
     public void testOrientation_25hz() throws Throwable {
-        runSensorTest(Sensor.TYPE_ORIENTATION, RATE_25HZ, BATCHING_OFF);
+        runSensorTest(Sensor.TYPE_ORIENTATION, RATE_25HZ);
     }
 
     @SuppressWarnings("deprecation")
     public void testOrientation_15hz() throws Throwable {
-        runSensorTest(Sensor.TYPE_ORIENTATION, RATE_15HZ, BATCHING_OFF);
+        runSensorTest(Sensor.TYPE_ORIENTATION, RATE_15HZ);
     }
 
     @SuppressWarnings("deprecation")
     public void testOrientation_10hz() throws Throwable {
-        runSensorTest(Sensor.TYPE_ORIENTATION, RATE_10HZ, BATCHING_OFF);
+        runSensorTest(Sensor.TYPE_ORIENTATION, RATE_10HZ);
     }
 
     @SuppressWarnings("deprecation")
     public void testOrientation_5hz() throws Throwable {
-        runSensorTest(Sensor.TYPE_ORIENTATION, RATE_5HZ, BATCHING_OFF);
+        runSensorTest(Sensor.TYPE_ORIENTATION, RATE_5HZ);
     }
 
     @SuppressWarnings("deprecation")
     public void testOrientation_1hz() throws Throwable {
-        runSensorTest(Sensor.TYPE_ORIENTATION, RATE_1HZ, BATCHING_OFF);
-    }
-
-    @SuppressWarnings("deprecation")
-    public void testOrientation_fastest_batching() throws Throwable {
-        runSensorTest(Sensor.TYPE_ORIENTATION, SensorManager.SENSOR_DELAY_FASTEST, BATCHING_5S);
-    }
-
-    @SuppressWarnings("deprecation")
-    public void testOrientation_50hz_batching() throws Throwable {
-        runSensorTest(Sensor.TYPE_ORIENTATION, RATE_50HZ, BATCHING_5S);
+        runSensorTest(Sensor.TYPE_ORIENTATION, RATE_1HZ);
     }
 
     public void testGyroscope_fastest() throws Throwable {
-        runSensorTest(Sensor.TYPE_GYROSCOPE, SensorManager.SENSOR_DELAY_FASTEST, BATCHING_OFF);
+        runSensorTest(Sensor.TYPE_GYROSCOPE, SensorManager.SENSOR_DELAY_FASTEST);
     }
 
     public void testGyroscope_200hz() throws Throwable {
-        runSensorTest(Sensor.TYPE_GYROSCOPE, RATE_200HZ, BATCHING_OFF);
+        runSensorTest(Sensor.TYPE_GYROSCOPE, RATE_200HZ);
     }
 
     public void testGyroscope_100hz() throws Throwable {
-        runSensorTest(Sensor.TYPE_GYROSCOPE, RATE_100HZ, BATCHING_OFF);
+        runSensorTest(Sensor.TYPE_GYROSCOPE, RATE_100HZ);
     }
 
     public void testGyroscope_50hz() throws Throwable {
-        runSensorTest(Sensor.TYPE_GYROSCOPE, RATE_50HZ, BATCHING_OFF);
+        runSensorTest(Sensor.TYPE_GYROSCOPE, RATE_50HZ);
     }
 
     public void testGyroscope_25hz() throws Throwable {
-        runSensorTest(Sensor.TYPE_GYROSCOPE, RATE_25HZ, BATCHING_OFF);
+        runSensorTest(Sensor.TYPE_GYROSCOPE, RATE_25HZ);
     }
 
     public void testGyroscope_15hz() throws Throwable {
-        runSensorTest(Sensor.TYPE_GYROSCOPE, RATE_15HZ, BATCHING_OFF);
+        runSensorTest(Sensor.TYPE_GYROSCOPE, RATE_15HZ);
     }
 
     public void testGyroscope_10hz() throws Throwable {
-        runSensorTest(Sensor.TYPE_GYROSCOPE, RATE_10HZ, BATCHING_OFF);
+        runSensorTest(Sensor.TYPE_GYROSCOPE, RATE_10HZ);
     }
 
     public void testGyroscope_5hz() throws Throwable {
-        runSensorTest(Sensor.TYPE_GYROSCOPE, RATE_5HZ, BATCHING_OFF);
+        runSensorTest(Sensor.TYPE_GYROSCOPE, RATE_5HZ);
     }
 
     public void testGyroscope_1hz() throws Throwable {
-        runSensorTest(Sensor.TYPE_GYROSCOPE, RATE_1HZ, BATCHING_OFF);
-    }
-
-    public void testGyroscope_fastest_batching() throws Throwable {
-        runSensorTest(Sensor.TYPE_GYROSCOPE, SensorManager.SENSOR_DELAY_FASTEST, BATCHING_5S);
-    }
-
-    public void testGyroscope_50hz_batching() throws Throwable {
-        runSensorTest(Sensor.TYPE_GYROSCOPE, RATE_50HZ, BATCHING_5S);
+        runSensorTest(Sensor.TYPE_GYROSCOPE, RATE_1HZ);
     }
 
     public void testPressure_fastest() throws Throwable {
-        runSensorTest(Sensor.TYPE_PRESSURE, SensorManager.SENSOR_DELAY_FASTEST, BATCHING_OFF);
+        runSensorTest(Sensor.TYPE_PRESSURE, SensorManager.SENSOR_DELAY_FASTEST);
     }
 
     public void testPressure_200hz() throws Throwable {
-        runSensorTest(Sensor.TYPE_PRESSURE, RATE_200HZ, BATCHING_OFF);
+        runSensorTest(Sensor.TYPE_PRESSURE, RATE_200HZ);
     }
 
     public void testPressure_100hz() throws Throwable {
-        runSensorTest(Sensor.TYPE_PRESSURE, RATE_100HZ, BATCHING_OFF);
+        runSensorTest(Sensor.TYPE_PRESSURE, RATE_100HZ);
     }
 
     public void testPressure_50hz() throws Throwable {
-        runSensorTest(Sensor.TYPE_PRESSURE, RATE_50HZ, BATCHING_OFF);
+        runSensorTest(Sensor.TYPE_PRESSURE, RATE_50HZ);
     }
 
     public void testPressure_25hz() throws Throwable {
-        runSensorTest(Sensor.TYPE_PRESSURE, RATE_25HZ, BATCHING_OFF);
+        runSensorTest(Sensor.TYPE_PRESSURE, RATE_25HZ);
     }
 
     public void testPressure_15hz() throws Throwable {
-        runSensorTest(Sensor.TYPE_PRESSURE, RATE_15HZ, BATCHING_OFF);
+        runSensorTest(Sensor.TYPE_PRESSURE, RATE_15HZ);
     }
 
     public void testPressure_10hz() throws Throwable {
-        runSensorTest(Sensor.TYPE_PRESSURE, RATE_10HZ, BATCHING_OFF);
+        runSensorTest(Sensor.TYPE_PRESSURE, RATE_10HZ);
     }
 
     public void testPressure_5hz() throws Throwable {
-        runSensorTest(Sensor.TYPE_PRESSURE, RATE_5HZ, BATCHING_OFF);
+        runSensorTest(Sensor.TYPE_PRESSURE, RATE_5HZ);
     }
 
     public void testPressure_1hz() throws Throwable {
-        runSensorTest(Sensor.TYPE_PRESSURE, RATE_1HZ, BATCHING_OFF);
-    }
-
-    public void testPressure_fastest_batching() throws Throwable {
-        runSensorTest(Sensor.TYPE_PRESSURE, SensorManager.SENSOR_DELAY_FASTEST, BATCHING_5S);
-    }
-
-    public void testPressure_50hz_batching() throws Throwable {
-        runSensorTest(Sensor.TYPE_PRESSURE, RATE_50HZ, BATCHING_5S);
+        runSensorTest(Sensor.TYPE_PRESSURE, RATE_1HZ);
     }
 
     public void testGravity_fastest() throws Throwable {
-        runSensorTest(Sensor.TYPE_GRAVITY, SensorManager.SENSOR_DELAY_FASTEST, BATCHING_OFF);
+        runSensorTest(Sensor.TYPE_GRAVITY, SensorManager.SENSOR_DELAY_FASTEST);
     }
 
     public void testGravity_200hz() throws Throwable {
-        runSensorTest(Sensor.TYPE_GRAVITY, RATE_200HZ, BATCHING_OFF);
+        runSensorTest(Sensor.TYPE_GRAVITY, RATE_200HZ);
     }
 
     public void testGravity_100hz() throws Throwable {
-        runSensorTest(Sensor.TYPE_GRAVITY, RATE_100HZ, BATCHING_OFF);
+        runSensorTest(Sensor.TYPE_GRAVITY, RATE_100HZ);
     }
 
     public void testGravity_50hz() throws Throwable {
-        runSensorTest(Sensor.TYPE_GRAVITY, RATE_50HZ, BATCHING_OFF);
+        runSensorTest(Sensor.TYPE_GRAVITY, RATE_50HZ);
     }
 
     public void testGravity_25hz() throws Throwable {
-        runSensorTest(Sensor.TYPE_GRAVITY, RATE_25HZ, BATCHING_OFF);
+        runSensorTest(Sensor.TYPE_GRAVITY, RATE_25HZ);
     }
 
     public void testGravity_15hz() throws Throwable {
-        runSensorTest(Sensor.TYPE_GRAVITY, RATE_15HZ, BATCHING_OFF);
+        runSensorTest(Sensor.TYPE_GRAVITY, RATE_15HZ);
     }
 
     public void testGravity_10hz() throws Throwable {
-        runSensorTest(Sensor.TYPE_GRAVITY, RATE_10HZ, BATCHING_OFF);
+        runSensorTest(Sensor.TYPE_GRAVITY, RATE_10HZ);
     }
 
     public void testGravity_5hz() throws Throwable {
-        runSensorTest(Sensor.TYPE_GRAVITY, RATE_5HZ, BATCHING_OFF);
+        runSensorTest(Sensor.TYPE_GRAVITY, RATE_5HZ);
     }
 
     public void testGravity_1hz() throws Throwable {
-        runSensorTest(Sensor.TYPE_GRAVITY, RATE_1HZ, BATCHING_OFF);
-    }
-
-    public void testGravity_fastest_batching() throws Throwable {
-        runSensorTest(Sensor.TYPE_GRAVITY, SensorManager.SENSOR_DELAY_FASTEST, BATCHING_5S);
-    }
-
-    public void testGravity_50hz_batching() throws Throwable {
-        runSensorTest(Sensor.TYPE_GRAVITY, RATE_50HZ, BATCHING_5S);
+        runSensorTest(Sensor.TYPE_GRAVITY, RATE_1HZ);
     }
 
     public void testRotationVector_fastest() throws Throwable {
-        runSensorTest(Sensor.TYPE_ROTATION_VECTOR, SensorManager.SENSOR_DELAY_FASTEST,
-                BATCHING_OFF);
+        runSensorTest(Sensor.TYPE_ROTATION_VECTOR, SensorManager.SENSOR_DELAY_FASTEST);
     }
 
     public void testRotationVector_200hz() throws Throwable {
-        runSensorTest(Sensor.TYPE_ROTATION_VECTOR, RATE_200HZ, BATCHING_OFF);
+        runSensorTest(Sensor.TYPE_ROTATION_VECTOR, RATE_200HZ);
     }
 
     public void testRotationVector_100hz() throws Throwable {
-        runSensorTest(Sensor.TYPE_ROTATION_VECTOR, RATE_100HZ, BATCHING_OFF);
+        runSensorTest(Sensor.TYPE_ROTATION_VECTOR, RATE_100HZ);
     }
 
     public void testRotationVector_50hz() throws Throwable {
-        runSensorTest(Sensor.TYPE_ROTATION_VECTOR, RATE_50HZ, BATCHING_OFF);
+        runSensorTest(Sensor.TYPE_ROTATION_VECTOR, RATE_50HZ);
     }
 
     public void testRotationVector_25hz() throws Throwable {
-        runSensorTest(Sensor.TYPE_ROTATION_VECTOR, RATE_25HZ, BATCHING_OFF);
+        runSensorTest(Sensor.TYPE_ROTATION_VECTOR, RATE_25HZ);
     }
 
     public void testRotationVector_15hz() throws Throwable {
-        runSensorTest(Sensor.TYPE_ROTATION_VECTOR, RATE_15HZ, BATCHING_OFF);
+        runSensorTest(Sensor.TYPE_ROTATION_VECTOR, RATE_15HZ);
     }
 
     public void testRotationVector_10hz() throws Throwable {
-        runSensorTest(Sensor.TYPE_ROTATION_VECTOR, RATE_10HZ, BATCHING_OFF);
+        runSensorTest(Sensor.TYPE_ROTATION_VECTOR, RATE_10HZ);
     }
 
     public void testRotationVector_5hz() throws Throwable {
-        runSensorTest(Sensor.TYPE_ROTATION_VECTOR, RATE_5HZ, BATCHING_OFF);
+        runSensorTest(Sensor.TYPE_ROTATION_VECTOR, RATE_5HZ);
     }
 
     public void testRotationVector_1hz() throws Throwable {
-        runSensorTest(Sensor.TYPE_ROTATION_VECTOR, RATE_1HZ, BATCHING_OFF);
-    }
-
-    public void testRotationVector_fastest_batching() throws Throwable {
-        runSensorTest(Sensor.TYPE_ROTATION_VECTOR, SensorManager.SENSOR_DELAY_FASTEST, BATCHING_5S);
-    }
-
-    public void testRotationVector_50hz_batching() throws Throwable {
-        runSensorTest(Sensor.TYPE_ROTATION_VECTOR, RATE_50HZ, BATCHING_5S);
+        runSensorTest(Sensor.TYPE_ROTATION_VECTOR, RATE_1HZ);
     }
 
     public void testMagneticFieldUncalibrated_fastest() throws Throwable {
-        runSensorTest(Sensor.TYPE_MAGNETIC_FIELD_UNCALIBRATED, SensorManager.SENSOR_DELAY_FASTEST,
-                BATCHING_OFF);
+        runSensorTest(Sensor.TYPE_MAGNETIC_FIELD_UNCALIBRATED, SensorManager.SENSOR_DELAY_FASTEST);
     }
 
     public void testMagneticFieldUncalibrated_200hz() throws Throwable {
-        runSensorTest(Sensor.TYPE_MAGNETIC_FIELD_UNCALIBRATED, RATE_200HZ, BATCHING_OFF);
+        runSensorTest(Sensor.TYPE_MAGNETIC_FIELD_UNCALIBRATED, RATE_200HZ);
     }
 
     public void testMagneticFieldUncalibrated_100hz() throws Throwable {
-        runSensorTest(Sensor.TYPE_MAGNETIC_FIELD_UNCALIBRATED, RATE_100HZ, BATCHING_OFF);
+        runSensorTest(Sensor.TYPE_MAGNETIC_FIELD_UNCALIBRATED, RATE_100HZ);
     }
 
     public void testMagneticFieldUncalibrated_50hz() throws Throwable {
-        runSensorTest(Sensor.TYPE_MAGNETIC_FIELD_UNCALIBRATED, RATE_50HZ, BATCHING_OFF);
+        runSensorTest(Sensor.TYPE_MAGNETIC_FIELD_UNCALIBRATED, RATE_50HZ);
     }
 
     public void testMagneticFieldUncalibrated_25hz() throws Throwable {
-        runSensorTest(Sensor.TYPE_MAGNETIC_FIELD_UNCALIBRATED, RATE_25HZ, BATCHING_OFF);
+        runSensorTest(Sensor.TYPE_MAGNETIC_FIELD_UNCALIBRATED, RATE_25HZ);
     }
 
     public void testMagneticFieldUncalibrated_15hz() throws Throwable {
-        runSensorTest(Sensor.TYPE_MAGNETIC_FIELD_UNCALIBRATED, RATE_15HZ, BATCHING_OFF);
+        runSensorTest(Sensor.TYPE_MAGNETIC_FIELD_UNCALIBRATED, RATE_15HZ);
     }
 
     public void testMagneticFieldUncalibrated_10hz() throws Throwable {
-        runSensorTest(Sensor.TYPE_MAGNETIC_FIELD_UNCALIBRATED, RATE_10HZ, BATCHING_OFF);
+        runSensorTest(Sensor.TYPE_MAGNETIC_FIELD_UNCALIBRATED, RATE_10HZ);
     }
 
     public void testMagneticFieldUncalibrated_5hz() throws Throwable {
-        runSensorTest(Sensor.TYPE_MAGNETIC_FIELD_UNCALIBRATED, RATE_5HZ, BATCHING_OFF);
+        runSensorTest(Sensor.TYPE_MAGNETIC_FIELD_UNCALIBRATED, RATE_5HZ);
     }
 
     public void testMagneticFieldUncalibrated_1hz() throws Throwable {
-        runSensorTest(Sensor.TYPE_MAGNETIC_FIELD_UNCALIBRATED, RATE_1HZ, BATCHING_OFF);
-    }
-
-    public void testMagneticFieldUncalibrated_fastest_batching() throws Throwable {
-        runSensorTest(Sensor.TYPE_MAGNETIC_FIELD_UNCALIBRATED, SensorManager.SENSOR_DELAY_FASTEST,
-                BATCHING_5S);
-    }
-
-    public void testMagneticFieldUncalibrated_50hz_batching() throws Throwable {
-        runSensorTest(Sensor.TYPE_MAGNETIC_FIELD_UNCALIBRATED, RATE_50HZ, BATCHING_5S);
+        runSensorTest(Sensor.TYPE_MAGNETIC_FIELD_UNCALIBRATED, RATE_1HZ);
     }
 
     public void testGameRotationVector_fastest() throws Throwable {
-        runSensorTest(Sensor.TYPE_GAME_ROTATION_VECTOR, SensorManager.SENSOR_DELAY_FASTEST,
-                BATCHING_OFF);
+        runSensorTest(Sensor.TYPE_GAME_ROTATION_VECTOR, SensorManager.SENSOR_DELAY_FASTEST);
     }
 
     public void testGameRotationVector_200hz() throws Throwable {
-        runSensorTest(Sensor.TYPE_GAME_ROTATION_VECTOR, RATE_200HZ, BATCHING_OFF);
+        runSensorTest(Sensor.TYPE_GAME_ROTATION_VECTOR, RATE_200HZ);
     }
 
     public void testGameRotationVector_100hz() throws Throwable {
-        runSensorTest(Sensor.TYPE_GAME_ROTATION_VECTOR, RATE_100HZ, BATCHING_OFF);
+        runSensorTest(Sensor.TYPE_GAME_ROTATION_VECTOR, RATE_100HZ);
     }
 
     public void testGameRotationVector_50hz() throws Throwable {
-        runSensorTest(Sensor.TYPE_GAME_ROTATION_VECTOR, RATE_50HZ, BATCHING_OFF);
+        runSensorTest(Sensor.TYPE_GAME_ROTATION_VECTOR, RATE_50HZ);
     }
 
     public void testGameRotationVector_25hz() throws Throwable {
-        runSensorTest(Sensor.TYPE_GAME_ROTATION_VECTOR, RATE_25HZ, BATCHING_OFF);
+        runSensorTest(Sensor.TYPE_GAME_ROTATION_VECTOR, RATE_25HZ);
     }
 
     public void testGameRotationVector_15hz() throws Throwable {
-        runSensorTest(Sensor.TYPE_GAME_ROTATION_VECTOR, RATE_15HZ, BATCHING_OFF);
+        runSensorTest(Sensor.TYPE_GAME_ROTATION_VECTOR, RATE_15HZ);
     }
 
     public void testGameRotationVector_10hz() throws Throwable {
-        runSensorTest(Sensor.TYPE_GAME_ROTATION_VECTOR, RATE_10HZ, BATCHING_OFF);
+        runSensorTest(Sensor.TYPE_GAME_ROTATION_VECTOR, RATE_10HZ);
     }
 
     public void testGameRotationVector_5hz() throws Throwable {
-        runSensorTest(Sensor.TYPE_GAME_ROTATION_VECTOR, RATE_5HZ, BATCHING_OFF);
+        runSensorTest(Sensor.TYPE_GAME_ROTATION_VECTOR, RATE_5HZ);
     }
 
     public void testGameRotationVector_1hz() throws Throwable {
-        runSensorTest(Sensor.TYPE_GAME_ROTATION_VECTOR, RATE_1HZ, BATCHING_OFF);
-    }
-
-    public void testGameRotationVector_fastest_batching() throws Throwable {
-        runSensorTest(Sensor.TYPE_GAME_ROTATION_VECTOR, SensorManager.SENSOR_DELAY_FASTEST,
-                BATCHING_5S);
-    }
-
-    public void testGameRotationVector_50hz_batching() throws Throwable {
-        runSensorTest(Sensor.TYPE_GAME_ROTATION_VECTOR, RATE_50HZ, BATCHING_5S);
+        runSensorTest(Sensor.TYPE_GAME_ROTATION_VECTOR, RATE_1HZ);
     }
 
     public void testGyroscopeUncalibrated_fastest() throws Throwable {
-        runSensorTest(Sensor.TYPE_GYROSCOPE_UNCALIBRATED, SensorManager.SENSOR_DELAY_FASTEST,
-                BATCHING_OFF);
+        runSensorTest(Sensor.TYPE_GYROSCOPE_UNCALIBRATED, SensorManager.SENSOR_DELAY_FASTEST);
     }
 
     public void testGyroscopeUncalibrated_200hz() throws Throwable {
-        runSensorTest(Sensor.TYPE_GYROSCOPE_UNCALIBRATED, RATE_200HZ, BATCHING_OFF);
+        runSensorTest(Sensor.TYPE_GYROSCOPE_UNCALIBRATED, RATE_200HZ);
     }
 
     public void testGyroscopeUncalibrated_100hz() throws Throwable {
-        runSensorTest(Sensor.TYPE_GYROSCOPE_UNCALIBRATED, RATE_100HZ, BATCHING_OFF);
+        runSensorTest(Sensor.TYPE_GYROSCOPE_UNCALIBRATED, RATE_100HZ);
     }
 
     public void testGyroscopeUncalibrated_50hz() throws Throwable {
-        runSensorTest(Sensor.TYPE_GYROSCOPE_UNCALIBRATED, RATE_50HZ, BATCHING_OFF);
+        runSensorTest(Sensor.TYPE_GYROSCOPE_UNCALIBRATED, RATE_50HZ);
     }
 
     public void testGyroscopeUncalibrated_25hz() throws Throwable {
-        runSensorTest(Sensor.TYPE_GYROSCOPE_UNCALIBRATED, RATE_25HZ, BATCHING_OFF);
+        runSensorTest(Sensor.TYPE_GYROSCOPE_UNCALIBRATED, RATE_25HZ);
     }
 
     public void testGyroscopeUncalibrated_15hz() throws Throwable {
-        runSensorTest(Sensor.TYPE_GYROSCOPE_UNCALIBRATED, RATE_15HZ, BATCHING_OFF);
+        runSensorTest(Sensor.TYPE_GYROSCOPE_UNCALIBRATED, RATE_15HZ);
     }
 
     public void testGyroscopeUncalibrated_10hz() throws Throwable {
-        runSensorTest(Sensor.TYPE_GYROSCOPE_UNCALIBRATED, RATE_10HZ, BATCHING_OFF);
+        runSensorTest(Sensor.TYPE_GYROSCOPE_UNCALIBRATED, RATE_10HZ);
     }
 
     public void testGyroscopeUncalibrated_5hz() throws Throwable {
-        runSensorTest(Sensor.TYPE_GYROSCOPE_UNCALIBRATED, RATE_5HZ, BATCHING_OFF);
+        runSensorTest(Sensor.TYPE_GYROSCOPE_UNCALIBRATED, RATE_5HZ);
     }
 
     public void testGyroscopeUncalibrated_1hz() throws Throwable {
-        runSensorTest(Sensor.TYPE_GYROSCOPE_UNCALIBRATED, RATE_1HZ, BATCHING_OFF);
-    }
-
-    public void testGyroscopeUncalibrated_fastest_batching() throws Throwable {
-        runSensorTest(Sensor.TYPE_GYROSCOPE_UNCALIBRATED, SensorManager.SENSOR_DELAY_FASTEST,
-                BATCHING_5S);
-    }
-
-    public void testGyroscopeUncalibrated_50hz_batching() throws Throwable {
-        runSensorTest(Sensor.TYPE_GYROSCOPE_UNCALIBRATED, RATE_50HZ, BATCHING_5S);
+        runSensorTest(Sensor.TYPE_GYROSCOPE_UNCALIBRATED, RATE_1HZ);
     }
 
     public void  testGeomagneticRotationVector_fastest() throws Throwable {
-        runSensorTest(Sensor.TYPE_GEOMAGNETIC_ROTATION_VECTOR, SensorManager.SENSOR_DELAY_FASTEST,
-                BATCHING_OFF);
+        runSensorTest(Sensor.TYPE_GEOMAGNETIC_ROTATION_VECTOR, SensorManager.SENSOR_DELAY_FASTEST);
     }
 
     public void  testLinearAcceleration_200hz() throws Throwable {
-        runSensorTest(Sensor.TYPE_LINEAR_ACCELERATION, RATE_200HZ, BATCHING_OFF);
+        runSensorTest(Sensor.TYPE_LINEAR_ACCELERATION, RATE_200HZ);
     }
 
     public void  testLinearAcceleration_100hz() throws Throwable {
-        runSensorTest(Sensor.TYPE_LINEAR_ACCELERATION, RATE_100HZ, BATCHING_OFF);
+        runSensorTest(Sensor.TYPE_LINEAR_ACCELERATION, RATE_100HZ);
     }
 
     public void testLinearAcceleration_50hz() throws Throwable {
-        runSensorTest(Sensor.TYPE_LINEAR_ACCELERATION, RATE_50HZ, BATCHING_OFF);
+        runSensorTest(Sensor.TYPE_LINEAR_ACCELERATION, RATE_50HZ);
     }
 
     public void testLinearAcceleration_25hz() throws Throwable {
-        runSensorTest(Sensor.TYPE_LINEAR_ACCELERATION, RATE_25HZ, BATCHING_OFF);
+        runSensorTest(Sensor.TYPE_LINEAR_ACCELERATION, RATE_25HZ);
     }
 
     public void testLinearAcceleration_15hz() throws Throwable {
-        runSensorTest(Sensor.TYPE_LINEAR_ACCELERATION, RATE_15HZ, BATCHING_OFF);
+        runSensorTest(Sensor.TYPE_LINEAR_ACCELERATION, RATE_15HZ);
     }
 
     public void testLinearAcceleration_10hz() throws Throwable {
-        runSensorTest(Sensor.TYPE_LINEAR_ACCELERATION, RATE_10HZ, BATCHING_OFF);
+        runSensorTest(Sensor.TYPE_LINEAR_ACCELERATION, RATE_10HZ);
     }
 
     public void testLinearAcceleration_5hz() throws Throwable {
-        runSensorTest(Sensor.TYPE_LINEAR_ACCELERATION, RATE_5HZ, BATCHING_OFF);
+        runSensorTest(Sensor.TYPE_LINEAR_ACCELERATION, RATE_5HZ);
     }
 
     public void testLinearAcceleration_1hz() throws Throwable {
-        runSensorTest(Sensor.TYPE_LINEAR_ACCELERATION, RATE_1HZ, BATCHING_OFF);
+        runSensorTest(Sensor.TYPE_LINEAR_ACCELERATION, RATE_1HZ);
     }
 
-    public void testLinearAcceleration_fastest_batching() throws Throwable {
-        runSensorTest(Sensor.TYPE_LINEAR_ACCELERATION, SensorManager.SENSOR_DELAY_FASTEST,
-                BATCHING_5S);
-    }
-
-    public void testLinearAcceleration_50hz_batching() throws Throwable {
-        runSensorTest(Sensor.TYPE_LINEAR_ACCELERATION, RATE_50HZ, BATCHING_5S);
-    }
-
-    private void runSensorTest(int sensorType, int rateUs, int maxBatchReportLatencyUs)
+    private void runSensorTest(int sensorType, int rateUs)
             throws Throwable {
         TestSensorOperation op = new TestSensorOperation(this.getContext(), sensorType,
-                rateUs, maxBatchReportLatencyUs, 5, TimeUnit.SECONDS);
-        op.setDefaultVerifications();
+                rateUs, 0 /* maxBatchReportLatencyUs */, 5, TimeUnit.SECONDS);
+        op.addDefaultVerifications();
         op.setLogEvents(true);
         try {
             op.execute();
@@ -659,9 +548,7 @@
                 sensorRate = String.format("%.0fhz",
                         SensorCtsHelper.getFrequency(rateUs, TimeUnit.MICROSECONDS));
             }
-            String batching = maxBatchReportLatencyUs > 0 ? "_batching" : "";
-            String fileName = String.format("single_sensor_%s_%s%s.txt",
-                    sensorName, sensorRate, batching);
+            String fileName = String.format("single_sensor_%s_%s.txt", sensorName, sensorRate);
             SensorStats.logStatsToFile(fileName, op.getStats());
         }
     }
diff --git a/tests/tests/hardware/src/android/hardware/cts/helpers/TestSensorManager.java b/tests/tests/hardware/src/android/hardware/cts/helpers/TestSensorManager.java
index a45ad70..1c1ea1c 100644
--- a/tests/tests/hardware/src/android/hardware/cts/helpers/TestSensorManager.java
+++ b/tests/tests/hardware/src/android/hardware/cts/helpers/TestSensorManager.java
@@ -16,6 +16,8 @@
 
 package android.hardware.cts.helpers;
 
+import junit.framework.Assert;
+
 import android.content.Context;
 import android.hardware.Sensor;
 import android.hardware.SensorEventListener;
@@ -23,8 +25,6 @@
 import android.hardware.SensorManager;
 import android.util.Log;
 
-import junit.framework.Assert;
-
 import java.util.concurrent.TimeUnit;
 
 /**
@@ -213,6 +213,29 @@
     }
 
     /**
+     * Registers a listener, waits for a specific duration, calls flush, and waits for flush to
+     * complete.
+     */
+    public void runSensorAndFlush(
+            TestSensorEventListener listener,
+            long duration,
+            TimeUnit timeUnit) {
+        if (mTestSensorEventListener != null) {
+            Log.w(LOG_TAG, "Listener already registered, returning.");
+            return;
+        }
+
+        try {
+            registerListener(listener);
+            SensorCtsHelper.sleep(duration, timeUnit);
+            startFlush();
+            listener.waitForFlushComplete();
+        } finally {
+            unregisterListener();
+        }
+    }
+
+    /**
      * Get the sensor under test.
      */
     public Sensor getSensor() {
diff --git a/tests/tests/hardware/src/android/hardware/cts/helpers/sensoroperations/TestSensorFlushOperation.java b/tests/tests/hardware/src/android/hardware/cts/helpers/sensoroperations/TestSensorFlushOperation.java
new file mode 100644
index 0000000..135d674
--- /dev/null
+++ b/tests/tests/hardware/src/android/hardware/cts/helpers/sensoroperations/TestSensorFlushOperation.java
@@ -0,0 +1,79 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.hardware.cts.helpers.sensoroperations;
+
+import android.content.Context;
+import android.hardware.cts.helpers.TestSensorEventListener;
+
+import java.util.concurrent.TimeUnit;
+
+/**
+ * A {@link ISensorOperation} used to verify that sensor events and sensor values are correct.
+ * <p>
+ * Provides methods to set test expectations as well as providing a set of default expectations
+ * depending on sensor type.  When {{@link #execute()} is called, the sensor will collect the
+ * events, call flush, and then run all the tests.
+ * </p>
+ */
+public class TestSensorFlushOperation extends VerifiableSensorOperation {
+    private final Long mDuration;
+    private final TimeUnit mTimeUnit;
+
+    /**
+     * Create a {@link TestSensorOperation}.
+     *
+     * @param context the {@link Context}.
+     * @param sensorType the sensor type
+     * @param rateUs the rate that
+     * @param maxBatchReportLatencyUs the max batch report latency
+     * @param duration the duration to gather events before calling {@code SensorManager.flush()}
+     * @param timeUnit the time unit of the duration
+     */
+    public TestSensorFlushOperation(
+            Context context,
+            int sensorType,
+            int rateUs,
+            int maxBatchReportLatencyUs,
+            long duration,
+            TimeUnit timeUnit) {
+        super(context, sensorType, rateUs, maxBatchReportLatencyUs);
+        mDuration = duration;
+        mTimeUnit = timeUnit;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    protected void doExecute(TestSensorEventListener listener) {
+        mSensorManager.runSensorAndFlush(listener, mDuration, mTimeUnit);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    protected VerifiableSensorOperation doClone() {
+        return new TestSensorFlushOperation(
+                mContext,
+                mSensorType,
+                mRateUs,
+                mMaxBatchReportLatencyUs,
+                mDuration,
+                mTimeUnit);
+    }
+}
diff --git a/tests/tests/hardware/src/android/hardware/cts/helpers/sensoroperations/TestSensorOperation.java b/tests/tests/hardware/src/android/hardware/cts/helpers/sensoroperations/TestSensorOperation.java
index b841eda..5982d24 100644
--- a/tests/tests/hardware/src/android/hardware/cts/helpers/sensoroperations/TestSensorOperation.java
+++ b/tests/tests/hardware/src/android/hardware/cts/helpers/sensoroperations/TestSensorOperation.java
@@ -17,25 +17,8 @@
 package android.hardware.cts.helpers.sensoroperations;
 
 import android.content.Context;
-import android.hardware.Sensor;
-import android.hardware.cts.helpers.SensorCtsHelper;
-import android.hardware.cts.helpers.SensorStats;
-import android.hardware.cts.helpers.SensorTestInformation;
-import android.hardware.cts.helpers.TestSensorManager;
-import android.hardware.cts.helpers.ValidatingSensorEventListener;
-import android.hardware.cts.helpers.sensorverification.EventGapVerification;
-import android.hardware.cts.helpers.sensorverification.EventOrderingVerification;
-import android.hardware.cts.helpers.sensorverification.FrequencyVerification;
-import android.hardware.cts.helpers.sensorverification.ISensorVerification;
-import android.hardware.cts.helpers.sensorverification.JitterVerification;
-import android.hardware.cts.helpers.sensorverification.MagnitudeVerification;
-import android.hardware.cts.helpers.sensorverification.MeanVerification;
-import android.hardware.cts.helpers.sensorverification.StandardDeviationVerification;
+import android.hardware.cts.helpers.TestSensorEventListener;
 
-import junit.framework.Assert;
-
-import java.util.Collection;
-import java.util.HashSet;
 import java.util.concurrent.TimeUnit;
 
 /**
@@ -46,21 +29,11 @@
  * events and then run all the tests.
  * </p>
  */
-public class TestSensorOperation extends AbstractSensorOperation {
-    private final TestSensorManager mSensorManager;
-    private final Context mContext;
-    private final int mSensorType;
-    private final int mRateUs;
-    private final int mMaxBatchReportLatencyUs;
+public class TestSensorOperation extends VerifiableSensorOperation {
     private final Integer mEventCount;
     private final Long mDuration;
     private final TimeUnit mTimeUnit;
 
-    private final Collection<ISensorVerification> mVerifications =
-            new HashSet<ISensorVerification>();
-
-    private boolean mLogEvents = false;
-
     /**
      * Create a {@link TestSensorOperation}.
      *
@@ -95,109 +68,35 @@
      */
     private TestSensorOperation(Context context, int sensorType, int rateUs,
             int maxBatchReportLatencyUs, Integer eventCount, Long duration, TimeUnit timeUnit) {
-        mContext = context;
-        mSensorType = sensorType;
-        mRateUs = rateUs;
-        mMaxBatchReportLatencyUs = maxBatchReportLatencyUs;
+        super(context, sensorType, rateUs, maxBatchReportLatencyUs);
         mEventCount = eventCount;
         mDuration = duration;
         mTimeUnit = timeUnit;
-        mSensorManager = new TestSensorManager(mContext, mSensorType, mRateUs,
-                mMaxBatchReportLatencyUs);
     }
 
     /**
-     * Set whether to log events.
-     */
-    public void setLogEvents(boolean logEvents) {
-        mLogEvents = logEvents;
-    }
-
-    /**
-     * Set all of the default test expectations.
-     */
-    public void setDefaultVerifications() {
-        Sensor sensor = mSensorManager.getSensor();
-        addVerification(EventGapVerification.getDefault(sensor, mRateUs));
-        addVerification(EventOrderingVerification.getDefault(sensor));
-        addVerification(FrequencyVerification.getDefault(sensor, mRateUs));
-        addVerification(JitterVerification.getDefault(sensor, mRateUs));
-        addVerification(MagnitudeVerification.getDefault(sensor));
-        addVerification(MeanVerification.getDefault(sensor));
-        // Skip SigNumVerification since it has no default
-        addVerification(StandardDeviationVerification.getDefault(sensor));
-    }
-
-    public void addVerification(ISensorVerification verification) {
-        if (verification != null) {
-            mVerifications.add(verification);
-        }
-    }
-
-    /**
-     * Collect the specified number of events from the sensor and run all enabled verifications.
+     * {@inheritDoc}
      */
     @Override
-    public void execute() {
-        getStats().addValue("sensor_name", SensorTestInformation.getSensorName(mSensorType));
-
-        ValidatingSensorEventListener listener = new ValidatingSensorEventListener(mVerifications);
-        listener.setLogEvents(mLogEvents);
-
+    protected void doExecute(TestSensorEventListener listener) {
         if (mEventCount != null) {
             mSensorManager.runSensor(listener, mEventCount);
         } else {
             mSensorManager.runSensor(listener, mDuration, mTimeUnit);
         }
-
-        boolean failed = false;
-        StringBuilder sb = new StringBuilder();
-
-        for (ISensorVerification verification : mVerifications) {
-            failed |= evaluateResults(verification, sb);
-        }
-
-        if (failed) {
-            String msg = SensorCtsHelper.formatAssertionMessage(mSensorManager.getSensor(),
-                    "VerifySensorOperation", mRateUs, mMaxBatchReportLatencyUs, sb.toString());
-            getStats().addValue(SensorStats.ERROR, msg);
-            Assert.fail(msg);
-        }
     }
 
     /**
      * {@inheritDoc}
      */
     @Override
-    public TestSensorOperation clone() {
-        TestSensorOperation operation;
+    protected VerifiableSensorOperation doClone() {
         if (mEventCount != null) {
-            operation = new TestSensorOperation(mContext, mSensorType, mRateUs,
+            return new TestSensorOperation(mContext, mSensorType, mRateUs,
                     mMaxBatchReportLatencyUs, mEventCount);
         } else {
-            operation = new TestSensorOperation(mContext, mSensorType, mRateUs,
+            return new TestSensorOperation(mContext, mSensorType, mRateUs,
                     mMaxBatchReportLatencyUs, mDuration, mTimeUnit);
         }
-
-        for (ISensorVerification verification : mVerifications) {
-            operation.addVerification(verification.clone());
-        }
-        return operation;
-    }
-
-    /**
-     * Evaluate the results of a test, aggregate the stats, and build the error message.
-     */
-    private boolean evaluateResults(ISensorVerification verification, StringBuilder sb) {
-        try {
-            verification.verify(getStats());
-        } catch (AssertionError e) {
-            if (sb.length() > 0) {
-                sb.append(", ");
-            }
-            sb.append(e.getMessage());
-            return true;
-        }
-        return false;
     }
 }
diff --git a/tests/tests/hardware/src/android/hardware/cts/helpers/sensoroperations/VerifiableSensorOperation.java b/tests/tests/hardware/src/android/hardware/cts/helpers/sensoroperations/VerifiableSensorOperation.java
new file mode 100644
index 0000000..d0a5673
--- /dev/null
+++ b/tests/tests/hardware/src/android/hardware/cts/helpers/sensoroperations/VerifiableSensorOperation.java
@@ -0,0 +1,173 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.hardware.cts.helpers.sensoroperations;
+
+import junit.framework.Assert;
+
+import android.content.Context;
+import android.hardware.Sensor;
+import android.hardware.cts.helpers.SensorCtsHelper;
+import android.hardware.cts.helpers.SensorStats;
+import android.hardware.cts.helpers.SensorTestInformation;
+import android.hardware.cts.helpers.TestSensorEventListener;
+import android.hardware.cts.helpers.TestSensorManager;
+import android.hardware.cts.helpers.ValidatingSensorEventListener;
+import android.hardware.cts.helpers.sensorverification.EventGapVerification;
+import android.hardware.cts.helpers.sensorverification.EventOrderingVerification;
+import android.hardware.cts.helpers.sensorverification.FrequencyVerification;
+import android.hardware.cts.helpers.sensorverification.ISensorVerification;
+import android.hardware.cts.helpers.sensorverification.JitterVerification;
+import android.hardware.cts.helpers.sensorverification.MagnitudeVerification;
+import android.hardware.cts.helpers.sensorverification.MeanVerification;
+import android.hardware.cts.helpers.sensorverification.StandardDeviationVerification;
+
+import java.util.Collection;
+import java.util.HashSet;
+
+/**
+ * A {@link ISensorOperation} used to verify that sensor events and sensor values are correct.
+ * <p>
+ * Provides methods to set test expectations as well as providing a set of default expectations
+ * depending on sensor type.  When {{@link #execute()} is called, the sensor will collect the
+ * events and then run all the tests.
+ * </p>
+ */
+public abstract class VerifiableSensorOperation extends AbstractSensorOperation {
+    protected final TestSensorManager mSensorManager;
+    protected final Context mContext;
+    protected final int mSensorType;
+    protected final int mRateUs;
+    protected final int mMaxBatchReportLatencyUs;
+
+    private final Collection<ISensorVerification> mVerifications =
+            new HashSet<ISensorVerification>();
+
+    private boolean mLogEvents = false;
+
+    /**
+     * Create a {@link TestSensorOperation}.
+     *
+     * @param context the {@link Context}.
+     * @param sensorType the sensor type
+     * @param rateUs the rate that
+     * @param maxBatchReportLatencyUs the max batch report latency
+     */
+    public VerifiableSensorOperation(
+            Context context,
+            int sensorType,
+            int rateUs,
+            int maxBatchReportLatencyUs) {
+        mContext = context;
+        mSensorType = sensorType;
+        mRateUs = rateUs;
+        mMaxBatchReportLatencyUs = maxBatchReportLatencyUs;
+        mSensorManager = new TestSensorManager(mContext, mSensorType, mRateUs,
+                mMaxBatchReportLatencyUs);
+    }
+
+    /**
+     * Set whether to log events.
+     */
+    public void setLogEvents(boolean logEvents) {
+        mLogEvents = logEvents;
+    }
+
+    /**
+     * Set all of the default test expectations.
+     */
+    public void addDefaultVerifications() {
+        Sensor sensor = mSensorManager.getSensor();
+        addVerification(EventGapVerification.getDefault(sensor, mRateUs));
+        addVerification(EventOrderingVerification.getDefault(sensor));
+        addVerification(FrequencyVerification.getDefault(sensor, mRateUs));
+        addVerification(JitterVerification.getDefault(sensor, mRateUs));
+        addVerification(MagnitudeVerification.getDefault(sensor));
+        addVerification(MeanVerification.getDefault(sensor));
+        // Skip SigNumVerification since it has no default
+        addVerification(StandardDeviationVerification.getDefault(sensor));
+    }
+
+    public void addVerification(ISensorVerification verification) {
+        if (verification != null) {
+            mVerifications.add(verification);
+        }
+    }
+
+    /**
+     * Collect the specified number of events from the sensor and run all enabled verifications.
+     */
+    @Override
+    public void execute() {
+        getStats().addValue("sensor_name", SensorTestInformation.getSensorName(mSensorType));
+
+        ValidatingSensorEventListener listener = new ValidatingSensorEventListener(mVerifications);
+        listener.setLogEvents(mLogEvents);
+
+        doExecute(listener);
+
+        boolean failed = false;
+        StringBuilder sb = new StringBuilder();
+        for (ISensorVerification verification : mVerifications) {
+            failed |= evaluateResults(verification, sb);
+        }
+
+        if (failed) {
+            String msg = SensorCtsHelper.formatAssertionMessage(mSensorManager.getSensor(),
+                    "VerifySensorOperation", mRateUs, mMaxBatchReportLatencyUs, sb.toString());
+            getStats().addValue(SensorStats.ERROR, msg);
+            Assert.fail(msg);
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public VerifiableSensorOperation clone() {
+        VerifiableSensorOperation operation = doClone();
+        for (ISensorVerification verification : mVerifications) {
+            operation.addVerification(verification.clone());
+        }
+        return operation;
+    }
+
+    /**
+     * Execute operations in a {@link TestSensorManager}.
+     */
+    protected abstract void doExecute(TestSensorEventListener listener);
+
+    /**
+     * Clone the subclass operation.
+     */
+    protected abstract VerifiableSensorOperation doClone();
+
+    /**
+     * Evaluate the results of a test, aggregate the stats, and build the error message.
+     */
+    private boolean evaluateResults(ISensorVerification verification, StringBuilder sb) {
+        try {
+            verification.verify(getStats());
+        } catch (AssertionError e) {
+            if (sb.length() > 0) {
+                sb.append(", ");
+            }
+            sb.append(e.getMessage());
+            return true;
+        }
+        return false;
+    }
+}
diff --git a/tests/tests/location/Android.mk b/tests/tests/location/Android.mk
index 2503fc7..02de2f2 100644
--- a/tests/tests/location/Android.mk
+++ b/tests/tests/location/Android.mk
@@ -27,8 +27,6 @@
 
 LOCAL_PACKAGE_NAME := CtsLocationTestCases
 
-LOCAL_INSTRUMENTATION_FOR := CtsTestStubs
-
 LOCAL_SDK_VERSION := current
 
 include $(BUILD_CTS_PACKAGE)
diff --git a/tests/tests/location2/Android.mk b/tests/tests/location2/Android.mk
index 6daca72..5b227b2 100644
--- a/tests/tests/location2/Android.mk
+++ b/tests/tests/location2/Android.mk
@@ -27,8 +27,6 @@
 
 LOCAL_PACKAGE_NAME := CtsLocation2TestCases
 
-LOCAL_INSTRUMENTATION_FOR := CtsTestStubs
-
 # uncomment when Location.EXTRA_NO_GPS_LOCATION is removed
 #LOCAL_SDK_VERSION := curren
 
diff --git a/tests/tests/media/res/raw/camera_click.ogg b/tests/tests/media/res/raw/camera_click.ogg
new file mode 100644
index 0000000..b836e10
--- /dev/null
+++ b/tests/tests/media/res/raw/camera_click.ogg
Binary files differ
diff --git a/tests/tests/media/res/raw/sinesweep51m4a.m4a b/tests/tests/media/res/raw/sinesweep51m4a.m4a
new file mode 100644
index 0000000..1e35934
--- /dev/null
+++ b/tests/tests/media/res/raw/sinesweep51m4a.m4a
Binary files differ
diff --git a/tests/tests/media/res/raw/video_1280x720_mp4_mpeg4_1000kbps_25fps_aac_stereo_128kbps_44100hz.mp4 b/tests/tests/media/res/raw/video_1280x720_mp4_mpeg4_1000kbps_25fps_aac_stereo_128kbps_44100hz.mp4
new file mode 100644
index 0000000..d8aa8a4
--- /dev/null
+++ b/tests/tests/media/res/raw/video_1280x720_mp4_mpeg4_1000kbps_25fps_aac_stereo_128kbps_44100hz.mp4
Binary files differ
diff --git a/tests/tests/media/res/raw/video_352x288_3gp_h263_300kbps_12fps_aac_stereo_128kbps_22050hz.3gp b/tests/tests/media/res/raw/video_352x288_3gp_h263_300kbps_12fps_aac_stereo_128kbps_22050hz.3gp
new file mode 100644
index 0000000..5ad946d
--- /dev/null
+++ b/tests/tests/media/res/raw/video_352x288_3gp_h263_300kbps_12fps_aac_stereo_128kbps_22050hz.3gp
Binary files differ
diff --git a/tests/tests/media/res/raw/video_640x360_mp4_hevc_450kbps_30fps_aac_stereo_128kbps_48000hz.mp4 b/tests/tests/media/res/raw/video_640x360_mp4_hevc_450kbps_30fps_aac_stereo_128kbps_48000hz.mp4
new file mode 100644
index 0000000..1e1dc74
--- /dev/null
+++ b/tests/tests/media/res/raw/video_640x360_mp4_hevc_450kbps_30fps_aac_stereo_128kbps_48000hz.mp4
Binary files differ
diff --git a/tests/tests/media/src/android/media/cts/AdaptivePlaybackTest.java b/tests/tests/media/src/android/media/cts/AdaptivePlaybackTest.java
index 0a6d5ae..5c9f1b1 100644
--- a/tests/tests/media/src/android/media/cts/AdaptivePlaybackTest.java
+++ b/tests/tests/media/src/android/media/cts/AdaptivePlaybackTest.java
@@ -60,7 +60,7 @@
                 mContext,
                 "video/hevc",
                 "OMX.google.hevc.decoder",
-                R.raw.video_480x360_mp4_hevc_325kbps_30fps_aac_stereo_128kbps_48000hz,
+                R.raw.video_640x360_mp4_hevc_450kbps_30fps_aac_stereo_128kbps_48000hz,
                 R.raw.video_1280x720_mp4_hevc_1150kbps_30fps_aac_stereo_128kbps_48000hz);
     }
 
@@ -69,7 +69,8 @@
                 mContext,
                 "video/3gpp",
                 "OMX.google.h263.decoder",
-                R.raw.video_176x144_3gp_h263_300kbps_12fps_aac_stereo_128kbps_22050hz);
+                R.raw.video_176x144_3gp_h263_300kbps_12fps_aac_stereo_128kbps_22050hz,
+                R.raw.video_352x288_3gp_h263_300kbps_12fps_aac_stereo_128kbps_22050hz);
     }
 
     public Iterable<Codec> Mpeg4(CodecFactory factory) {
@@ -77,6 +78,8 @@
                 mContext,
                 "video/mp4v-es",
                 "OMX.google.mpeg4.decoder",
+
+                R.raw.video_1280x720_mp4_mpeg4_1000kbps_25fps_aac_stereo_128kbps_44100hz,
                 R.raw.video_480x360_mp4_mpeg4_860kbps_25fps_aac_stereo_128kbps_44100hz);
     }
 
@@ -242,6 +245,8 @@
     public void testHEVC_adaptiveDrc() { ex(HEVC(), adaptiveDrc); }
     public void testVP8_adaptiveDrc()  { ex(VP8(),  adaptiveDrc); }
     public void testVP9_adaptiveDrc()  { ex(VP9(),  adaptiveDrc); }
+    public void testMpeg4_adaptiveDrc() { ex(Mpeg4(), adaptiveDrc); }
+    public void testH263_adaptiveDrc() { ex(H263(), adaptiveDrc); }
 
     public void testH264_adaptiveDrcEarlyEos() { ex(H264(), new AdaptiveDrcEarlyEosTest()); }
     public void testHEVC_adaptiveDrcEarlyEos() { ex(HEVC(), new AdaptiveDrcEarlyEosTest()); }
diff --git a/tests/tests/media/src/android/media/cts/AudioManagerTest.java b/tests/tests/media/src/android/media/cts/AudioManagerTest.java
index 3eaafd4..e65fb0b 100644
--- a/tests/tests/media/src/android/media/cts/AudioManagerTest.java
+++ b/tests/tests/media/src/android/media/cts/AudioManagerTest.java
@@ -125,8 +125,6 @@
     public void testAccessMode() throws Exception {
         mAudioManager.setMode(MODE_RINGTONE);
         assertEquals(MODE_RINGTONE, mAudioManager.getMode());
-        mAudioManager.setMode(MODE_IN_CALL);
-        assertEquals(MODE_IN_CALL, mAudioManager.getMode());
         mAudioManager.setMode(MODE_IN_COMMUNICATION);
         assertEquals(MODE_IN_COMMUNICATION, mAudioManager.getMode());
         mAudioManager.setMode(MODE_NORMAL);
diff --git a/tests/tests/media/src/android/media/cts/DecoderTest.java b/tests/tests/media/src/android/media/cts/DecoderTest.java
index 440f354..f418649 100644
--- a/tests/tests/media/src/android/media/cts/DecoderTest.java
+++ b/tests/tests/media/src/android/media/cts/DecoderTest.java
@@ -138,6 +138,10 @@
         testTimeStampOrdering(R.raw.sinesweeptsaac);
     }
 
+    public void testDecode51M4a() throws Exception {
+        decodeToMemory(R.raw.sinesweep51m4a, RESET_MODE_NONE, CONFIG_MODE_NONE, -1, null);
+    }
+
     private void testTimeStampOrdering(int res) throws Exception {
         List<Long> timestamps = new ArrayList<Long>();
         decodeToMemory(res, RESET_MODE_NONE, CONFIG_MODE_NONE, -1, timestamps);
diff --git a/tests/tests/media/src/android/media/cts/MediaCodecCapabilitiesTest.java b/tests/tests/media/src/android/media/cts/MediaCodecCapabilitiesTest.java
index a3f1815..e6530ec 100644
--- a/tests/tests/media/src/android/media/cts/MediaCodecCapabilitiesTest.java
+++ b/tests/tests/media/src/android/media/cts/MediaCodecCapabilitiesTest.java
@@ -212,6 +212,10 @@
                 continue;
             }
 
+            if (!supportsMimeType(codecInfo, mimeType)) {
+                continue;
+            }
+
             CodecCapabilities capabilities = codecInfo.getCapabilitiesForType(mimeType);
             for (CodecProfileLevel profileLevel : capabilities.profileLevels) {
                 if (profileLevel.profile == profile
@@ -224,4 +228,14 @@
         return false;
     }
 
+    private static boolean supportsMimeType(MediaCodecInfo codecInfo, String mimeType) {
+        String[] supportedMimeTypes = codecInfo.getSupportedTypes();
+        for (String supportedMimeType : supportedMimeTypes) {
+            if (mimeType.equalsIgnoreCase(supportedMimeType)) {
+                return true;
+            }
+        }
+        return false;
+    }
+
 }
diff --git a/tests/tests/media/src/android/media/cts/MediaPlayerTest.java b/tests/tests/media/src/android/media/cts/MediaPlayerTest.java
index 30d164c..10ec741 100644
--- a/tests/tests/media/src/android/media/cts/MediaPlayerTest.java
+++ b/tests/tests/media/src/android/media/cts/MediaPlayerTest.java
@@ -237,6 +237,98 @@
         }
     }
 
+    static class OutputListener {
+        int mSession;
+        AudioEffect mVc;
+        Visualizer mVis;
+        byte [] mVisData;
+        boolean mSoundDetected;
+        OutputListener(int session) {
+            mSession = session;
+            // creating a volume controller on output mix ensures that ro.audio.silent mutes
+            // audio after the effects and not before
+            mVc = new AudioEffect(
+                    AudioEffect.EFFECT_TYPE_NULL,
+                    UUID.fromString("119341a0-8469-11df-81f9-0002a5d5c51b"),
+                    0,
+                    session);
+            mVc.setEnabled(true);
+            mVis = new Visualizer(session);
+            int size = 256;
+            int[] range = Visualizer.getCaptureSizeRange();
+            if (size < range[0]) {
+                size = range[0];
+            }
+            if (size > range[1]) {
+                size = range[1];
+            }
+            assertTrue(mVis.setCaptureSize(size) == Visualizer.SUCCESS);
+
+            mVis.setDataCaptureListener(new Visualizer.OnDataCaptureListener() {
+                @Override
+                public void onWaveFormDataCapture(Visualizer visualizer,
+                        byte[] waveform, int samplingRate) {
+                    if (!mSoundDetected) {
+                        for (int i = 0; i < waveform.length; i++) {
+                            // 8 bit unsigned PCM, zero level is at 128, which is -128 when
+                            // seen as a signed byte
+                            if (waveform[i] != -128) {
+                                mSoundDetected = true;
+                                break;
+                            }
+                        }
+                    }
+                }
+
+                @Override
+                public void onFftDataCapture(Visualizer visualizer, byte[] fft, int samplingRate) {
+                }
+            }, 10000 /* milliHertz */, true /* PCM */, false /* FFT */);
+            assertTrue(mVis.setEnabled(true) == Visualizer.SUCCESS);
+        }
+
+        void reset() {
+            mSoundDetected = false;
+        }
+
+        boolean heardSound() {
+            return mSoundDetected;
+        }
+
+        void release() {
+            mVis.release();
+            mVc.release();
+        }
+    }
+
+    public void testPlayAudioTwice() throws Exception {
+        final int resid = R.raw.camera_click;
+
+        MediaPlayer mp = MediaPlayer.create(mContext, resid);
+        try {
+            mp.setAudioStreamType(AudioManager.STREAM_MUSIC);
+            mp.setWakeMode(mContext, PowerManager.PARTIAL_WAKE_LOCK);
+
+            OutputListener listener = new OutputListener(mp.getAudioSessionId());
+
+            Thread.sleep(SLEEP_TIME);
+            assertFalse("noise heard before test started", listener.heardSound());
+
+            mp.start();
+            Thread.sleep(SLEEP_TIME);
+            assertFalse("player was still playing after " + SLEEP_TIME + " ms", mp.isPlaying());
+            assertTrue("nothing heard while test ran", listener.heardSound());
+            listener.reset();
+            mp.seekTo(0);
+            mp.start();
+            Thread.sleep(SLEEP_TIME);
+            assertTrue("nothing heard when sound was replayed", listener.heardSound());
+            listener.release();
+        } finally {
+            mp.release();
+        }
+    }
+
     public void testPlayVideo() throws Exception {
         playVideoTest(R.raw.testvideo, 352, 288);
     }
@@ -945,24 +1037,24 @@
             // Waits until at least one subtitle is fired. Timeout is 1 sec.
             selectSubtitleTrack(0);
             mOnTimedTextCalled.reset();
-            assertTrue(mOnTimedTextCalled.waitForSignal(1000));
+            assertTrue(mOnTimedTextCalled.waitForSignal(1500));
 
             // Try deselecting track.
             deselectSubtitleTrack(0);
             mOnTimedTextCalled.reset();
-            assertFalse(mOnTimedTextCalled.waitForSignal(1000));
+            assertFalse(mOnTimedTextCalled.waitForSignal(1500));
         }
 
         // Run the same test for external subtitle track.
         for (int i = 0; i < 2; i++) {
             selectSubtitleTrack(2);
             mOnTimedTextCalled.reset();
-            assertTrue(mOnTimedTextCalled.waitForSignal(1000));
+            assertTrue(mOnTimedTextCalled.waitForSignal(1500));
 
             // Try deselecting track.
             deselectSubtitleTrack(2);
             mOnTimedTextCalled.reset();
-            assertFalse(mOnTimedTextCalled.waitForSignal(1000));
+            assertFalse(mOnTimedTextCalled.waitForSignal(1500));
         }
 
         try {
@@ -985,7 +1077,7 @@
         mMediaPlayer.setOnTimedTextListener(new MediaPlayer.OnTimedTextListener() {
             @Override
             public void onTimedText(MediaPlayer mp, TimedText text) {
-                final int toleranceMs = 150;
+                final int toleranceMs = 500;
                 final int durationMs = 500;
                 int posMs = mMediaPlayer.getCurrentPosition();
                 if (text != null) {
@@ -1030,19 +1122,19 @@
         // Waits until at least two subtitles are fired. Timeout is 2 sec.
         // Please refer the test srt files:
         // test_subtitle1_srt.3gp and test_subtitle2_srt.3gp
-        assertTrue(mOnTimedTextCalled.waitForCountedSignals(2, 2000) >= 2);
+        assertTrue(mOnTimedTextCalled.waitForCountedSignals(2, 2500) >= 2);
 
         selectSubtitleTrack(1);
         mOnTimedTextCalled.reset();
-        assertTrue(mOnTimedTextCalled.waitForCountedSignals(2, 2000) >= 2);
+        assertTrue(mOnTimedTextCalled.waitForCountedSignals(2, 2500) >= 2);
 
         selectSubtitleTrack(2);
         mOnTimedTextCalled.reset();
-        assertTrue(mOnTimedTextCalled.waitForCountedSignals(2, 2000) >= 2);
+        assertTrue(mOnTimedTextCalled.waitForCountedSignals(2, 2500) >= 2);
 
         selectSubtitleTrack(3);
         mOnTimedTextCalled.reset();
-        assertTrue(mOnTimedTextCalled.waitForCountedSignals(2, 2000) >= 2);
+        assertTrue(mOnTimedTextCalled.waitForCountedSignals(2, 2500) >= 2);
         mMediaPlayer.stop();
     }
 
diff --git a/tests/tests/media/src/android/media/cts/Vp8CodecTestBase.java b/tests/tests/media/src/android/media/cts/Vp8CodecTestBase.java
index a4051c9..5e38842 100644
--- a/tests/tests/media/src/android/media/cts/Vp8CodecTestBase.java
+++ b/tests/tests/media/src/android/media/cts/Vp8CodecTestBase.java
@@ -390,6 +390,32 @@
         return yuv;
     }
 
+    /**
+     * Packs YUV420 frame by moving it to a smaller size buffer with stride and slice
+     * height equal to the original frame width and height.
+     */
+    private static byte[] PackYUV420(int width, int height,
+            int stride, int sliceHeight, byte[] src) {
+        byte[] dst = new byte[width * height * 3 / 2];
+        // Y copy.
+        for (int i = 0; i < height; i++) {
+            System.arraycopy(src, i * stride, dst, i * width, width);
+        }
+        // U and V copy.
+        int u_src_offset = stride * sliceHeight;
+        int v_src_offset = u_src_offset + u_src_offset / 4;
+        int u_dst_offset = width * height;
+        int v_dst_offset = u_dst_offset + u_dst_offset / 4;
+        for (int i = 0; i < height / 2; i++) {
+            System.arraycopy(src, u_src_offset + i * (stride / 2),
+                    dst, u_dst_offset + i * (width / 2), width / 2);
+            System.arraycopy(src, v_src_offset + i * (stride / 2),
+                    dst, v_dst_offset + i * (width / 2), width / 2);
+        }
+        return dst;
+    }
+
+
     private static void imageUpscale1To2(byte[] src, int srcByteOffset, int srcStride,
             byte[] dst, int dstByteOffset, int dstWidth, int dstHeight) {
         for (int i = 0; i < dstHeight/2 - 1; i++) {
@@ -624,6 +650,8 @@
                     }
                     Log.d(TAG, "Frame stride and slice height: " + frameStride +
                             " x " + frameSliceHeight);
+                    frameStride = Math.max(frameWidth, frameStride);
+                    frameSliceHeight = Math.max(frameHeight, frameSliceHeight);
                 }
                 result = decoder.dequeueOutputBuffer(bufferInfo, DEFAULT_DEQUEUE_TIMEOUT_US);
             }
@@ -645,12 +673,19 @@
                         byte[] frame = new byte[bufferInfo.size];
                         outputBuffers[outputBufIndex].position(bufferInfo.offset);
                         outputBuffers[outputBufIndex].get(frame, 0, bufferInfo.size);
-                        // Convert NV12 to YUV420 if necessary
+                        // Convert NV12 to YUV420 if necessary.
                         if (frameColorFormat != CodecCapabilities.COLOR_FormatYUV420Planar) {
                             frame = NV12ToYUV420(frameWidth, frameHeight,
                                     frameStride, frameSliceHeight, frame);
                         }
-                        yuv.write(frame);
+                        int writeLength = Math.min(frameWidth * frameHeight * 3 / 2, frame.length);
+                        // Pack frame if necessary.
+                        if (writeLength < frame.length &&
+                                (frameStride > frameWidth || frameSliceHeight > frameHeight)) {
+                            frame = PackYUV420(frameWidth, frameHeight,
+                                    frameStride, frameSliceHeight, frame);
+                        }
+                        yuv.write(frame, 0, writeLength);
                     }
                     outputFrameIndex++;
 
diff --git a/tests/tests/os/src/android/os/cts/BinderTest.java b/tests/tests/os/src/android/os/cts/BinderTest.java
index c3f2bcb..7a30169 100644
--- a/tests/tests/os/src/android/os/cts/BinderTest.java
+++ b/tests/tests/os/src/android/os/cts/BinderTest.java
@@ -51,7 +51,8 @@
     @Override
     protected void setUp() throws Exception {
         super.setUp();
-        mService = new Intent(LocalService.SERVICE_LOCAL);
+        mService = new Intent(
+                LocalService.SERVICE_LOCAL, null /*uri*/, mContext, LocalService.class);
         mBinder = new MockBinder();
         mStartReceiver = new Binder() {
             @Override
diff --git a/tests/tests/os/src/android/os/cts/CpuFeaturesTest.java b/tests/tests/os/src/android/os/cts/CpuFeaturesTest.java
index c5fb137..0b389a4 100644
--- a/tests/tests/os/src/android/os/cts/CpuFeaturesTest.java
+++ b/tests/tests/os/src/android/os/cts/CpuFeaturesTest.java
@@ -54,17 +54,16 @@
         assertHwCap("IDIVT", hwcaps, CpuFeatures.HWCAP_IDIVT);
     }
 
-    private static List<String> getFeaturesFromCpuinfo() throws IOException {
+    private static String getFieldFromCpuinfo(String field) throws IOException {
         BufferedReader br = new BufferedReader(new FileReader("/proc/cpuinfo"));
-        Pattern p = Pattern.compile("Features\\s*:\\s*(.*)");
+        Pattern p = Pattern.compile(field + "\\s*:\\s*(.*)");
 
         try {
             String line;
             while ((line = br.readLine()) != null) {
                 Matcher m = p.matcher(line);
                 if (m.matches()) {
-                    String[] features = m.group(1).split("\\s");
-                    return Arrays.asList(features);
+                    return m.group(1);
                 }
             }
        } finally {
@@ -74,31 +73,85 @@
        return null;
     }
 
+    private static List<String> getFeaturesFromCpuinfo() throws IOException {
+        String features = getFieldFromCpuinfo("Features");
+        if (features == null)
+            return null;
+
+        return Arrays.asList(features.split("\\s"));
+    }
+
+    private static final String[] armv8RequiredFeatures = {
+            "wp", "half", "thumb", "fastmult", "vfp", "edsp", "neon",
+            "vfpv3", "tlsi", "vfpv4", "idiva", "idivt" };
+
+    private static void assertInCpuinfo(List<String> features,
+            String feature) {
+        assertTrue("/proc/cpuinfo does not advertise required feature " + feature + " to 32-bit ARM processes",
+                features.contains(feature));
+    }
+
     private static void assertNotInCpuinfo(List<String> features,
             String feature) {
-        assertFalse("/proc/cpuinfo advertises required feature " + feature,
+        assertFalse("/proc/cpuinfo advertises required feature " + feature + " to 64-bit ARM processes",
                 features.contains(feature));
     }
 
+    public void testArmCpuinfo() throws IOException {
+        if (!CpuFeatures.isArmCpu())
+            return;
+
+        String cpuArch = getFieldFromCpuinfo("CPU architecture");
+        /* When /proc/cpuinfo is read by 32-bit ARM processes, the CPU
+         * architecture field must be present and contain an integer.
+         */
+        assertNotNull("Failed to read CPU architecture field from /proc/cpuinfo",
+                cpuArch);
+
+        int cpuArchInt = 0;
+        try {
+            cpuArchInt = Integer.parseInt(cpuArch);
+        } catch (NumberFormatException e) {
+            fail("/proc/cpuinfo reported non-integer CPU architecture " + cpuArch);
+        }
+
+        if (CpuFeatures.isArm64CpuIn32BitMode()) {
+            assertTrue("/proc/cpuinfo reported 32-bit only CPU architecture " + cpuArchInt + " on ARM64 CPU",
+                    cpuArchInt >= 8);
+        }
+
+        List<String> features = getFeaturesFromCpuinfo();
+        /* When /proc/cpuinfo is read by 32-bit ARM processes, the Features
+         * field must be present.  On ARMv8+ devices specifically, it must
+         * include ARMv7-optional features that are now required by ARMv8.
+         */
+        assertNotNull("Failed to read Features field from /proc/cpuinfo",
+                features);
+
+        if (CpuFeatures.isArm64CpuIn32BitMode()) {
+            for (String feature : armv8RequiredFeatures) {
+                assertInCpuinfo(features, feature);
+            }
+        }
+    }
+
     public void testArm64Cpuinfo() throws IOException {
         if (!CpuFeatures.isArm64Cpu()) {
             return;
         }
 
         List<String> features = getFeaturesFromCpuinfo();
-        assertNotNull("Failed to parse /proc/cpuinfo", features);
+        /* When /proc/cpuinfo is read by 64-bit ARM processes, the Features
+         * field in /proc/cpuinfo must not include ARMv8-required features.
+         * This can be satisified either by not listing required features, or by
+         * not having a Features field at all.
+         */
+        if (features == null) {
+            return;
+        }
 
-        assertNotInCpuinfo(features, "wp");
-        assertNotInCpuinfo(features, "half");
-        assertNotInCpuinfo(features, "thumb");
-        assertNotInCpuinfo(features, "fastmult");
-        assertNotInCpuinfo(features, "vfp");
-        assertNotInCpuinfo(features, "edsp");
-        assertNotInCpuinfo(features, "neon");
-        assertNotInCpuinfo(features, "vfpv3");
-        assertNotInCpuinfo(features, "tls");
-        assertNotInCpuinfo(features, "vfpv4");
-        assertNotInCpuinfo(features, "idiva");
-        assertNotInCpuinfo(features, "idivt");
+        for (String feature : armv8RequiredFeatures) {
+            assertNotInCpuinfo(features, feature);
+        }
     }
 }
diff --git a/tests/tests/os/src/android/os/cts/CpuInstructionsTest.java b/tests/tests/os/src/android/os/cts/CpuInstructionsTest.java
new file mode 100644
index 0000000..c38def7
--- /dev/null
+++ b/tests/tests/os/src/android/os/cts/CpuInstructionsTest.java
@@ -0,0 +1,48 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
+package android.os.cts;
+
+import android.os.cts.CpuFeatures;
+import android.os.cts.CpuInstructions;
+
+import junit.framework.TestCase;
+
+public class CpuInstructionsTest extends TestCase {
+
+    public void testArmVirtualCounter() {
+        if (!CpuFeatures.isArm64Cpu()) {
+            return;
+        }
+
+        assertTrue("Machine does not allow access to CNTVCT register",
+                CpuInstructions.canReadCntvct());
+    }
+
+    public void testEmulatedArmCpuFeatures() {
+        if (!CpuFeatures.isArm64CpuIn32BitMode()) {
+            return;
+        }
+
+        assertTrue("Machine does not support ARM swp instruction emulation",
+                CpuInstructions.hasSwp());
+        assertTrue("Machine does not support ARM setend instruction emulation",
+                CpuInstructions.hasSetend());
+        assertTrue("Machine does not support ARM CP15 barrier emulation",
+                CpuInstructions.hasCp15Barriers());
+    }
+}
diff --git a/tests/tests/os/src/android/os/cts/Debug_InstructionCountTest.java b/tests/tests/os/src/android/os/cts/Debug_InstructionCountTest.java
index 815cb61..24b8dea 100644
--- a/tests/tests/os/src/android/os/cts/Debug_InstructionCountTest.java
+++ b/tests/tests/os/src/android/os/cts/Debug_InstructionCountTest.java
@@ -26,33 +26,9 @@
     public void testDebugInstructionCount() {
         Debug.InstructionCount instructionCount = new Debug.InstructionCount();
 
-        assertTrue(instructionCount.resetAndStart());
-        addTest(1, 2);
-        instructionCount.collect();
-        int insCountsFirst = instructionCount.globalTotal();
-        int methodInvFirst = instructionCount.globalMethodInvocations();
-
-        assertTrue(instructionCount.resetAndStart());
-        addTest(1, 2);
-        addTest(1, 2);
-        instructionCount.collect();
-        int insCountsSecond = instructionCount.globalTotal();
-        int methodInvSecond = instructionCount.globalMethodInvocations();
-
-        assertTrue(instructionCount.resetAndStart());
-        addTest(1, 2);
-        addTest(1, 2);
-        addTest(1, 2);
-        instructionCount.collect();
-        int insCountsThird = instructionCount.globalTotal();
-        int methodInvThird = instructionCount.globalMethodInvocations();
-
-        assertEquals(insCountsThird - insCountsFirst, (insCountsSecond - insCountsFirst) * 2);
-        assertEquals(methodInvThird - methodInvFirst, (methodInvSecond - methodInvFirst) * 2);
-    }
-
-    // must not be private, otherwise javac may inline the code
-    protected int addTest(int a, int b) {
-        return a + b;
+        assertFalse(instructionCount.resetAndStart());
+        assertFalse(instructionCount.collect());
+        assertEquals(0, instructionCount.globalTotal());
+        assertEquals(0, instructionCount.globalMethodInvocations());
     }
 }
diff --git a/tests/tests/os/src/android/os/cts/ProcessTest.java b/tests/tests/os/src/android/os/cts/ProcessTest.java
index 1563068..90c2eb9 100644
--- a/tests/tests/os/src/android/os/cts/ProcessTest.java
+++ b/tests/tests/os/src/android/os/cts/ProcessTest.java
@@ -68,9 +68,13 @@
             }
         };
         mIntent = new Intent(REMOTE_SERVICE);
+        mIntent.setPackage(getContext().getPackageName());
         getContext().startService(mIntent);
-        getContext().bindService(new Intent(ISecondary.class.getName()),
-                mSecondaryConnection, Context.BIND_AUTO_CREATE);
+
+        Intent secondaryIntent = new Intent(ISecondary.class.getName());
+        secondaryIntent.setPackage(getContext().getPackageName());
+        getContext().bindService(secondaryIntent, mSecondaryConnection,
+                Context.BIND_AUTO_CREATE);
         synchronized (mSync) {
             if (!mHasConnected) {
                 try {
diff --git a/tests/tests/os/src/android/os/cts/RemoteCallbackListTest.java b/tests/tests/os/src/android/os/cts/RemoteCallbackListTest.java
index 130df05..4c3f3cf 100644
--- a/tests/tests/os/src/android/os/cts/RemoteCallbackListTest.java
+++ b/tests/tests/os/src/android/os/cts/RemoteCallbackListTest.java
@@ -60,8 +60,12 @@
             }
         };
         mIntent = new Intent(SERVICE_ACTION);
-        assertTrue(mContext.bindService(new Intent(ISecondary.class.getName()),
-                mSecondaryConnection, Context.BIND_AUTO_CREATE));
+        mIntent.setPackage(mContext.getPackageName());
+
+        Intent secondaryIntent = new Intent(ISecondary.class.getName());
+        secondaryIntent.setPackage(mContext.getPackageName());
+        assertTrue(mContext.bindService(secondaryIntent, mSecondaryConnection,
+                Context.BIND_AUTO_CREATE));
 
     }
 
diff --git a/tests/tests/os/src/android/os/cts/TokenWatcherTest.java b/tests/tests/os/src/android/os/cts/TokenWatcherTest.java
index 5a4ffcb..70e839a 100644
--- a/tests/tests/os/src/android/os/cts/TokenWatcherTest.java
+++ b/tests/tests/os/src/android/os/cts/TokenWatcherTest.java
@@ -81,9 +81,12 @@
             }
         };
         mIntent = new Intent(EMPTY_SERVICE);
+        mIntent.setPackage(getContext().getPackageName());
         getContext().startService(mIntent);
-        getContext().bindService(new Intent(IEmptyService.class.getName()),
-                mServiceConnection, Context.BIND_AUTO_CREATE);
+
+        Intent secondaryIntent = new Intent(IEmptyService.class.getName());
+        secondaryIntent.setPackage(getContext().getPackageName());
+        getContext().bindService(secondaryIntent, mServiceConnection, Context.BIND_AUTO_CREATE);
         synchronized (mSync) {
             if (!mHasConnected) {
                 try {
diff --git a/tests/tests/permission/src/android/permission/cts/TelephonyManagerPermissionTest.java b/tests/tests/permission/src/android/permission/cts/TelephonyManagerPermissionTest.java
index 2681c0f..607f301 100644
--- a/tests/tests/permission/src/android/permission/cts/TelephonyManagerPermissionTest.java
+++ b/tests/tests/permission/src/android/permission/cts/TelephonyManagerPermissionTest.java
@@ -18,6 +18,7 @@
 
 import android.content.Context;
 import android.content.pm.PackageManager;
+import android.media.AudioManager;
 import android.telephony.TelephonyManager;
 import android.test.AndroidTestCase;
 import android.test.suitebuilder.annotation.SmallTest;
@@ -29,6 +30,7 @@
 
     private boolean mHasTelephony;
     TelephonyManager mTelephonyManager = null;
+    private AudioManager mAudioManager;
 
     @Override
     protected void setUp() throws Exception {
@@ -37,6 +39,8 @@
                 PackageManager.FEATURE_TELEPHONY);
         mTelephonyManager = (TelephonyManager) mContext.getSystemService(Context.TELEPHONY_SERVICE);
         assertNotNull(mTelephonyManager);
+        mAudioManager = (AudioManager) mContext.getSystemService(Context.AUDIO_SERVICE);
+        assertNotNull(mAudioManager);
     }
 
     /**
@@ -138,4 +142,21 @@
             // expected
         }
     }
+    /**
+     * Verify that AudioManager.setMode requires Permission.
+     * <p>
+     * Requires Permissions:
+     * {@link android.Manifest.permission#MODIFY_AUDIO_SETTINGS} and
+     * {@link android.Manifest.permission#MODIFY_PHONE_STATE} for
+     * {@link AudioManager#MODE_IN_CALL}.
+     */
+    @SmallTest
+    public void testSetMode() {
+        if (!mHasTelephony) {
+            return;
+        }
+        int audioMode = mAudioManager.getMode();
+        mAudioManager.setMode(AudioManager.MODE_IN_CALL);
+        assertEquals(audioMode, mAudioManager.getMode());
+    }
 }
diff --git a/tests/tests/preference/Android.mk b/tests/tests/preference/Android.mk
index 5860406..7534641 100644
--- a/tests/tests/preference/Android.mk
+++ b/tests/tests/preference/Android.mk
@@ -26,8 +26,6 @@
 
 LOCAL_PACKAGE_NAME := CtsPreferenceTestCases
 
-LOCAL_INSTRUMENTATION_FOR := CtsTestStubs
-
 LOCAL_SDK_VERSION := current
 
 include $(BUILD_CTS_PACKAGE)
diff --git a/tests/tests/print/src/android/print/cts/BasePrintTest.java b/tests/tests/print/src/android/print/cts/BasePrintTest.java
index acb4369..a8e8a95 100644
--- a/tests/tests/print/src/android/print/cts/BasePrintTest.java
+++ b/tests/tests/print/src/android/print/cts/BasePrintTest.java
@@ -56,6 +56,7 @@
 import org.mockito.InOrder;
 import org.mockito.stubbing.Answer;
 
+import java.io.File;
 import java.io.FileOutputStream;
 import java.io.IOException;
 import java.util.List;
@@ -217,41 +218,72 @@
     }
 
     protected void selectPrinter(String printerName) throws UiObjectNotFoundException {
-        UiObject destinationSpinner = new UiObject(new UiSelector().resourceId(
-                "com.android.printspooler:id/destination_spinner"));
-        destinationSpinner.click();
-        UiObject printerOption = new UiObject(new UiSelector().text(printerName));
-        printerOption.click();
+        try {
+            UiObject destinationSpinner = new UiObject(new UiSelector().resourceId(
+                    "com.android.printspooler:id/destination_spinner"));
+            destinationSpinner.click();
+            UiObject printerOption = new UiObject(new UiSelector().text(printerName));
+            printerOption.click();
+        } catch (UiObjectNotFoundException e) {
+            dumpWindowHierarchy();
+            throw new UiObjectNotFoundException(e);
+        }
     }
 
     protected void changeOrientation(String orientation) throws UiObjectNotFoundException {
-        UiObject orientationSpinner = new UiObject(new UiSelector().resourceId(
-                "com.android.printspooler:id/orientation_spinner"));
-        orientationSpinner.click();
-        UiObject orientationOption = new UiObject(new UiSelector().text(orientation));
-        orientationOption.click();
+        try {
+            UiObject orientationSpinner = new UiObject(new UiSelector().resourceId(
+                    "com.android.printspooler:id/orientation_spinner"));
+            orientationSpinner.click();
+            UiObject orientationOption = new UiObject(new UiSelector().text(orientation));
+            orientationOption.click();
+        } catch (UiObjectNotFoundException e) {
+            dumpWindowHierarchy();
+            throw new UiObjectNotFoundException(e);
+        }
     }
 
     protected void changeMediaSize(String mediaSize) throws UiObjectNotFoundException {
-        UiObject mediaSizeSpinner = new UiObject(new UiSelector().resourceId(
-                "com.android.printspooler:id/paper_size_spinner"));
-        mediaSizeSpinner.click();
-        UiObject mediaSizeOption = new UiObject(new UiSelector().text(mediaSize));
-        mediaSizeOption.click();
+        try {
+            UiObject mediaSizeSpinner = new UiObject(new UiSelector().resourceId(
+                    "com.android.printspooler:id/paper_size_spinner"));
+            mediaSizeSpinner.click();
+            UiObject mediaSizeOption = new UiObject(new UiSelector().text(mediaSize));
+            mediaSizeOption.click();
+        } catch (UiObjectNotFoundException e) {
+            dumpWindowHierarchy();
+            throw new UiObjectNotFoundException(e);
+        }
     }
 
     protected void changeColor(String color) throws UiObjectNotFoundException {
-        UiObject colorSpinner = new UiObject(new UiSelector().resourceId(
-                "com.android.printspooler:id/color_spinner"));
-        colorSpinner.click();
-        UiObject colorOption = new UiObject(new UiSelector().text(color));
-        colorOption.click();
+        try {
+            UiObject colorSpinner = new UiObject(new UiSelector().resourceId(
+                    "com.android.printspooler:id/color_spinner"));
+            colorSpinner.click();
+            UiObject colorOption = new UiObject(new UiSelector().text(color));
+            colorOption.click();
+        } catch (UiObjectNotFoundException e) {
+            dumpWindowHierarchy();
+            throw new UiObjectNotFoundException(e);
+        }
     }
 
     protected void clickPrintButton() throws UiObjectNotFoundException {
-        UiObject printButton = new UiObject(new UiSelector().resourceId(
-                "com.android.printspooler:id/print_button"));
-        printButton.click();
+        try {
+            UiObject printButton = new UiObject(new UiSelector().resourceId(
+                    "com.android.printspooler:id/print_button"));
+            printButton.click();
+        } catch (UiObjectNotFoundException e) {
+            dumpWindowHierarchy();
+            throw new UiObjectNotFoundException(e);
+        }
+    }
+
+    private void dumpWindowHierarchy() {
+        String name = "print-test-failure-" + System.currentTimeMillis() + ".xml";
+        File file = new File(getActivity().getFilesDir(), name);
+        getUiDevice().dumpWindowHierarchy(file.toString());
     }
 
     protected PrintDocumentActivity getActivity() {
diff --git a/tests/tests/print/src/android/print/cts/PageRangeAdjustmentTest.java b/tests/tests/print/src/android/print/cts/PageRangeAdjustmentTest.java
index 524c83d..4952cbd 100644
--- a/tests/tests/print/src/android/print/cts/PageRangeAdjustmentTest.java
+++ b/tests/tests/print/src/android/print/cts/PageRangeAdjustmentTest.java
@@ -174,10 +174,9 @@
             public Void answer(InvocationOnMock invocation) {
                 PrintJob printJob = (PrintJob) invocation.getArguments()[0];
                 PageRange[] pages = printJob.getInfo().getPages();
-                // We always ask for some pages for preview and in this
-                // case we write all, i.e. more than needed.
-                assertTrue(pages.length == 1 && pages[0].getStart() == 1
-                        && pages[0].getEnd() == 1);
+                // We asked for some pages, the app wrote more, but the system
+                // pruned extra pages, hence we expect to print all pages.
+                assertTrue(pages.length == 1 && PageRange.ALL_PAGES.equals(pages[0]));
                 printJob.complete();
                 onPrintJobQueuedCalled();
                 return null;
@@ -285,11 +284,10 @@
                 PrintJobInfo printJobInfo = printJob.getInfo();
                 PageRange[] pages = printJobInfo.getPages();
                 // We asked only for page 60 (index 59) but got 60 and 61 (indices
-                // 59, 60), hence the written document has two pages (60 and 61)
-                // and the first one, i.e. 3 should be printed.
-                assertTrue(pages.length == 1 && pages[0].getStart() == 0
-                        && pages[0].getEnd() == 0);
-                assertSame(printJob.getDocument().getInfo().getPageCount(), 2);
+                // 59, 60), but the system pruned the extra page, hence we expect
+                // to print all pages.
+                assertTrue(pages.length == 1 && PageRange.ALL_PAGES.equals(pages[0]));
+                assertSame(printJob.getDocument().getInfo().getPageCount(), 1);
                 printJob.complete();
                 onPrintJobQueuedCalled();
                 return null;
@@ -497,12 +495,11 @@
                     PrintJobInfo printJobInfo = printJob.getInfo();
                     PageRange[] pages = printJobInfo.getPages();
                     // We asked only for page 3 (index 2) but got this page when
-                    // we were getting the pages for preview (indices 0 - 49), hence
-                    // the written document has fifty pages (0 - 49) and the third one,
-                    // i.e. index 2 should be printed.
-                    assertTrue(pages.length == 1 && pages[0].getStart() == 2
-                            && pages[0].getEnd() == 2);
-                    assertSame(printJob.getDocument().getInfo().getPageCount(), 50);
+                    // we were getting the pages for preview (indices 0 - 49),
+                    // but the framework pruned extra pages, hence we should be asked
+                    // to print all pages from a single page document.
+                    assertTrue(pages.length == 1 && PageRange.ALL_PAGES.equals(pages[0]));
+                    assertSame(printJob.getDocument().getInfo().getPageCount(), 1);
                     printJob.complete();
                     onPrintJobQueuedCalled();
                     return null;
diff --git a/tests/tests/print/src/android/print/cts/PrinterDiscoverySessionLifecycleTest.java b/tests/tests/print/src/android/print/cts/PrinterDiscoverySessionLifecycleTest.java
index 7ec12c6..b092044 100644
--- a/tests/tests/print/src/android/print/cts/PrinterDiscoverySessionLifecycleTest.java
+++ b/tests/tests/print/src/android/print/cts/PrinterDiscoverySessionLifecycleTest.java
@@ -41,6 +41,7 @@
 
 import junit.framework.AssertionFailedError;
 import org.mockito.InOrder;
+import org.mockito.exceptions.verification.VerificationInOrderFailure;
 import org.mockito.invocation.InvocationOnMock;
 import org.mockito.stubbing.Answer;
 
@@ -251,7 +252,7 @@
         priorityList.add(firstPrinterId);
         try {
             inOrder.verify(firstSessionCallbacks).onStartPrinterDiscovery(priorityList);
-        } catch (AssertionFailedError error) {
+        } catch (VerificationInOrderFailure error) {
             inOrder.verify(firstSessionCallbacks).onValidatePrinters(priorityList);
         }
 
diff --git a/tests/tests/provider/Android.mk b/tests/tests/provider/Android.mk
index 4c5875b..81ff9ee 100644
--- a/tests/tests/provider/Android.mk
+++ b/tests/tests/provider/Android.mk
@@ -23,12 +23,10 @@
 
 LOCAL_JAVA_LIBRARIES := android.test.runner telephony-common
 
-LOCAL_STATIC_JAVA_LIBRARIES := ctstestrunner
+LOCAL_STATIC_JAVA_LIBRARIES := ctsdeviceutil ctstestrunner
 
 LOCAL_SRC_FILES := $(call all-java-files-under, src)
 
 LOCAL_PACKAGE_NAME := CtsProviderTestCases
 
-LOCAL_INSTRUMENTATION_FOR := CtsTestStubs
-
 include $(BUILD_CTS_PACKAGE)
diff --git a/tests/tests/provider/AndroidManifest.xml b/tests/tests/provider/AndroidManifest.xml
index 7bf44b7..abda46c 100644
--- a/tests/tests/provider/AndroidManifest.xml
+++ b/tests/tests/provider/AndroidManifest.xml
@@ -23,10 +23,36 @@
     <uses-permission android:name="android.permission.AUTHENTICATE_ACCOUNTS" />
     <uses-permission android:name="android.permission.GET_ACCOUNTS" />
     <uses-permission android:name="android.permission.USE_CREDENTIALS" />
+    <uses-permission android:name="android.permission.READ_SYNC_SETTINGS" />
+    <uses-permission android:name="android.permission.WRITE_SYNC_SETTINGS" />
+    <uses-permission android:name="com.android.browser.permission.READ_HISTORY_BOOKMARKS" />
+    <uses-permission android:name="com.android.browser.permission.WRITE_HISTORY_BOOKMARKS" />
+    <uses-permission android:name="android.permission.WRITE_CALENDAR" />
+    <uses-permission android:name="android.permission.READ_CALENDAR" />
+    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
+    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
+    <uses-permission android:name="android.permission.WRITE_SETTINGS" />
+    <uses-permission android:name="android.permission.WRITE_USER_DICTIONARY" />
+    <uses-permission android:name="android.permission.READ_USER_DICTIONARY" />
+    <uses-permission android:name="com.android.voicemail.permission.ADD_VOICEMAIL" />
+    <uses-permission android:name="android.permission.WRITE_CALL_LOG" />
+    <uses-permission android:name="android.permission.WRITE_CONTACTS" />
+    <uses-permission android:name="android.permission.WRITE_SOCIAL_STREAM" />
+    <uses-permission android:name="android.permission.READ_CALL_LOG" />
+    <uses-permission android:name="android.permission.READ_CONTACTS" />
+    <uses-permission android:name="android.permission.READ_SOCIAL_STREAM" />
 
     <application>
         <uses-library android:name="android.test.runner"/>
 
+        <activity android:name="android.provider.cts.BrowserStubActivity"
+            android:label="BrowserStubActivity">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="android.intent.category.FRAMEWORK_INSTRUMENTATION_TEST" />
+            </intent-filter>
+        </activity>
+
         <service android:name="android.provider.cts.contacts.account.MockAccountService"
                  process="com.android.cts.provider"
                  android:exported="true">
@@ -41,14 +67,14 @@
     </application>
 
     <instrumentation android:name="android.support.test.runner.AndroidJUnitRunner"
-                     android:targetPackage="com.android.cts.stub"
+                     android:targetPackage="com.android.cts.provider"
                      android:label="CTS tests of android.provider">
         <meta-data android:name="listener"
             android:value="com.android.cts.runner.CtsTestRunListener" />
     </instrumentation>
 
     <instrumentation android:name="android.provider.cts.CalendarTest$CalendarEmmaTestRunner"
-                     android:targetPackage="com.android.cts.stub"
+                     android:targetPackage="com.android.cts.provider"
                      android:label="Augmented CTS tests of Calendar provider"/>
 
 </manifest>
diff --git a/tests/tests/provider/res/drawable/scenery.jpg b/tests/tests/provider/res/drawable/scenery.jpg
new file mode 100644
index 0000000..7a6145b
--- /dev/null
+++ b/tests/tests/provider/res/drawable/scenery.jpg
Binary files differ
diff --git a/tests/tests/provider/res/drawable/size_48x48.jpg b/tests/tests/provider/res/drawable/size_48x48.jpg
new file mode 100644
index 0000000..5c2291e
--- /dev/null
+++ b/tests/tests/provider/res/drawable/size_48x48.jpg
Binary files differ
diff --git a/tests/tests/provider/res/drawable/testimage.jpg b/tests/tests/provider/res/drawable/testimage.jpg
new file mode 100644
index 0000000..754df0c
--- /dev/null
+++ b/tests/tests/provider/res/drawable/testimage.jpg
Binary files differ
diff --git a/tests/tests/provider/res/raw/scenery.jpg b/tests/tests/provider/res/raw/scenery.jpg
new file mode 100644
index 0000000..7d1f5e1
--- /dev/null
+++ b/tests/tests/provider/res/raw/scenery.jpg
Binary files differ
diff --git a/tests/tests/provider/res/raw/testmp3.mp3 b/tests/tests/provider/res/raw/testmp3.mp3
new file mode 100755
index 0000000..657faf7
--- /dev/null
+++ b/tests/tests/provider/res/raw/testmp3.mp3
Binary files differ
diff --git a/tests/tests/provider/res/raw/testmp3_2.mp3 b/tests/tests/provider/res/raw/testmp3_2.mp3
new file mode 100644
index 0000000..6a70c69
--- /dev/null
+++ b/tests/tests/provider/res/raw/testmp3_2.mp3
Binary files differ
diff --git a/tests/tests/provider/res/raw/testvideo.3gp b/tests/tests/provider/res/raw/testvideo.3gp
new file mode 100644
index 0000000..1503272
--- /dev/null
+++ b/tests/tests/provider/res/raw/testvideo.3gp
Binary files differ
diff --git a/tests/tests/provider/res/values/arrays.xml b/tests/tests/provider/res/values/arrays.xml
new file mode 100644
index 0000000..71e0133
--- /dev/null
+++ b/tests/tests/provider/res/values/arrays.xml
@@ -0,0 +1,57 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ * Copyright (C) 2008 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ -->
+
+<resources>
+    <item type="integer" name="reference" format="integer">101</item>
+
+      <string-array name="strings">
+        <item>zero</item>
+        <item>1</item>
+        <item>@string/reference</item>
+    </string-array>
+
+    <integer-array name="integers">
+        <item>0</item>
+        <item>1</item>
+        <item>@integer/reference</item>
+    </integer-array>
+
+    <array name="difficultyLevel">
+        <item>Easy</item>
+        <item>Medium</item>
+        <item>Hard</item>
+    </array>
+
+    <string-array name="string">
+        <item>Test String 1</item>
+        <item>Test String 2</item>
+        <item>Test String 3</item>
+    </string-array>
+
+    <integer-array name="table_row_layout">
+        <item>1</item>
+        <item>2</item>
+        <item>3</item>
+        <item>4</item>
+        <item>5</item>
+        <item>6</item>
+        <item>7</item>
+        <item>8</item>
+        <item>9</item>
+        <item>10</item>
+    </integer-array>
+</resources>
diff --git a/tests/tests/provider/res/values/strings.xml b/tests/tests/provider/res/values/strings.xml
index b599c31..eb10ca1 100644
--- a/tests/tests/provider/res/values/strings.xml
+++ b/tests/tests/provider/res/values/strings.xml
@@ -15,6 +15,168 @@
   -->
 
 <resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="permlab_testGranted">Test Granted</string>
+    <string name="permdesc_testGranted">Used for running CTS tests, for testing operations
+        where we have the permission.</string>
+    <string name="permlab_testDynamic">Test Dynamic</string>
+    <string name="permdesc_testDynamic">Used for running CTS tests, for testing adding
+        dynamic permissions.</string>
+    <string name="permlab_testDenied">Test Denied</string>
+    <string name="permdesc_testDenied">Used for running CTS tests, for testing operations
+        where we do not have the permission.</string>
+    <string name="explain">1. click start. \n2. if above image shaked, then press pass button,
+         else press failed button.</string>
+    <string name="text_view_hello">Hello! Text view!</string>
+    <string name="text_view_hello_two_lines">Hello! \nText view!</string>
+    <string name="text_view_simple_hint">This is a hint.</string>
+    <string name="text_view_hint">This is a string for testing hint of textview.</string>
+    <string name="activity_forwarding">App/Forwarding</string>
+    <string name="forwarding">$$$</string>
+    <string name="go">Go</string>
+    <string name="back">Back</string>
+    <string name="forward_target">
+        Press back button and notice we don\'t see the previous activity.
+    </string>
+    <string name="edit_text">testing</string>
+    <string name="text">DialogTest</string>
+    <string name="text_country">Country</string>
+    <string name="text_name">Name</string>
+    <string name="hello_world">Hello, World!</string>
+    <string name="hello_android">Hello, Android!</string>
+    <string name="alert_dialog_username">Name:</string>
+    <string name="alert_dialog_password">Password:</string>
+    <string name="alert_dialog_positive">Positive</string>
+    <string name="alert_dialog_negative">Negative</string>
+    <string name="alert_dialog_neutral">Neutral</string>
+    <string name="notify">Notify </string>
+    <string name="tabs_1">testing</string>
+    <string name="table_layout_first">first</string>
+    <string name="table_layout_second">second</string>
+    <string name="table_layout_third">third</string>
+    <string name="table_layout_long">Very long to make the string out of the screen</string>
+    <string name="chronometer_text">Test Chronometer</string>
+    <string name="am">AM</string>
+    <string name="pm">PM</string>
+    <string name="viewgroup_test">ViewGroup test</string>
+    <string name="viewanimator_test">ViewAnimator test</string>
+    <string name="id_ok">OK</string>
+    <string name="id_cancel">Cancel</string>
+    <string name="context_test_string1">This is %s string.</string>
+    <string name="context_test_string2">This is test string.</string>
+    <string name="animationutils_test_instructions">Choose different animations</string>
+    <string name="animationutils_test_alpha">Alpha animation</string>
+    <string name="animationutils_test_scale">Scale animation</string>
+    <string name="animationutils_test_rotate">Rotate animation</string>
+    <string name="animationutils_test_translate">Translate animation</string>
+    <string name="animationutils_test_set">Animation set</string>
+    <string name="animationutils_test_layout">Layout animation</string>
+    <string name="animationutils_test_gridlayout">Grid layout animation</string>
+    <string name="twolinelistitem_test_text1">text1</string>
+    <string name="twolinelistitem_test_text2">text2</string>
+    <string name="metadata_text">metadata text</string>
+    <string name="horizontal_text_1">horizontal 1</string>
+    <string name="horizontal_text_2">horizontal 2</string>
+    <string name="horizontal_text_3">horizontal 3</string>
+    <string name="vertical_text_1">vertical 1</string>
+    <string name="vertical_text_2">vertical 2</string>
+    <string name="vertical_text_3">vertical 3</string>
+    <string name="reference">here</string>
+    <string name="coerceIntegerToString">100</string>
+    <string name="coerceBooleanToString">true</string>
+    <string name="coerceColorToString">#fff</string>
+    <string name="coerceFloatToString">100.0</string>
+    <string name="coerceDimensionToString">100px</string>
+    <string name="coerceFractionToString">100<xliff:g id="percent">%</xliff:g></string>
+    <string name="formattedStringNone">Format[]</string>
+    <string name="formattedStringOne">Format[<xliff:g id="format">%d</xliff:g>]</string>
+    <string name="formattedStringTwo">Format[<xliff:g id="format">%3$d,%2$s</xliff:g>]</string>
+    <string name="checkboxpref_key">checkboxpref_key</string>
+    <string name="checkboxpref_title">title of preference</string>
+    <string name="checkboxpref_summary">summary of preference</string>
+    <string name="checkboxpref_summary_on">summary on of preference</string>
+    <string name="checkboxpref_summary_off">summary off of preference</string>
+    <string name="checkboxpref_depend">checkboxpref_depend</string>
+    <string name="checkboxpref_depend_title"> depend title of preference</string>
+    <string name="checkboxpref_depend_summary"> depend summary of preference</string>
+    <string name="edittextpref_key">edittextpref_key</string>
+    <string name="edittextpref_default_value">default value of preference</string>
+    <string name="edittextpref_title">title of edit text preference</string>
+    <string name="edittextpref_summary">summary of edit text preference</string>
+    <string name="edittextpref_dialog_title">dialog title of edit text preference</string>
+    <string name="edittextpref_text">text of  edit text preference</string>
+    <string name="listpref_key">listpref_key</string>
+    <string name="listpref_title">title of list preference</string>
+    <string name="listpref_summary">summary of list preference</string>
+    <string name="listpref_dialogtitle">dialog title of list preference</string>
+    <string name="easy">Easy</string>
+    <string name="medium">Medium</string>
+    <string name="hard">Hard</string>
+    <string name="footer_view">Footer view</string>
+    <string name="header_view">Header view</string>
+    <string name="dialogpref_title">title of dialog preference </string>
+    <string name="dialogpref_dialog_title">dialog title of dialog preference </string>
+    <string name="dialogpref_key">dialogpref_key</string>
+    <string name="dialogpref_default_value">default value of dialog preference</string>
+    <string name="dialogpref_summary">summary of dialog preference</string>
+    <string name="dialogpref_message">message of dialog preference</string>
+    <string name="dialogpref_sure">Sure</string>
+    <string name="dialogpref_cancel">Cancel</string>
+    <string name="pref_key">pref_key</string>
+    <string name="pref_title">title of preference</string>
+    <string name="pref_summary">summary of preference</string>
+    <string name="pref_depend_key">pref_depend_key</string>
+    <string name="pref_depend_title"> depend title of preference</string>
+    <string name="pref_depend_summary"> depend summary of preference</string>
+    <string name="android_intent_action_preference">android.intent.action.PREFERENCE</string>
+    <string name="def_pref_key">def_pref_key</string>
+    <string name="def_pref_title">default preference</string>
+    <string name="def_pref_summary">This is default preference of cts</string>
+    <string name="relative_view1">view 1</string>
+    <string name="relative_view2">view 2</string>
+    <string name="relative_view3">view 3</string>
+    <string name="relative_view4">view 4</string>
+    <string name="relative_view5">view 5</string>
+    <string name="relative_view6">view 6</string>
+    <string name="relative_view7">view 7</string>
+    <string name="relative_view8">view 8</string>
+    <string name="relative_view9">view 9</string>
+    <string name="relative_view10">view 10</string>
+    <string name="relative_view11">view 11</string>
+    <string name="relative_view12">view 12</string>
+    <string name="relative_view13">view 13</string>
+    <string name="country">Country:</string>
+    <string name="symbol">Symbol:</string>
+    <string name="country_warning">No such country registered</string>
+    <string name="version_cur">base</string>
+    <string name="version_old">base</string>
+    <string name="version_v3">base</string>
+    <string name="authenticator_label">Android CTS</string>
+    <string name="search_label">Android CTS</string>
+    <string name="tag1">tag 1</string>
+    <string name="tag2">tag 2</string>
+
+    <string name="button">Button</string>
+    <string name="holo_test">Holo Test</string>
+    <string name="holo_generator">Holo Generator</string>
+    <string name="holo_light_test">Holo Light Test</string>
+    <string name="holo_light_generator">Holo Light Generator</string>
+    <string name="reference_image">Reference Image: </string>
+    <string name="generated_image">Generated Image: </string>
+    <string name="themes_prompt">Select a Theme:</string>
+    <string name="sample_text">Sample text goes here. I wanted something creative and whimsical
+    but then I just got bored...</string>
+    <string name="long_text">This is a really long string which exceeds the width of the view.
+New devices have a much larger screen which actually enables long strings to be displayed
+with no fading. I have made this string longer to fix this case. If you are correcting this
+text, I would love to see the kind of devices you guys now use! Guys, maybe some devices need longer string!
+I think so, so how about double this string, like copy and paste!
+This is a really long string which exceeds the width of the view.
+New devices have a much larger screen which actually enables long strings to be displayed
+with no fading. I have made this string longer to fix this case. If you are correcting this
+text, I would love to see the kind of devices you guys now use! Guys, maybe some devices need longer string!
+I think so, so how about double this string, like copy and paste! </string>
+    <string name="rectangle200">"M 0,0 l 200,0 l 0, 200 l -200, 0 z"</string>
+
     <!-- Label for this package -->
     <string name="label">Contacts provider</string>
 </resources>
diff --git a/tests/src/android/provider/cts/BrowserStubActivity.java b/tests/tests/provider/src/android/provider/cts/BrowserStubActivity.java
similarity index 100%
rename from tests/src/android/provider/cts/BrowserStubActivity.java
rename to tests/tests/provider/src/android/provider/cts/BrowserStubActivity.java
diff --git a/tests/tests/provider/src/android/provider/cts/ContactsContract_PhotoTest.java b/tests/tests/provider/src/android/provider/cts/ContactsContract_PhotoTest.java
index fbd092f..45ba8b8 100644
--- a/tests/tests/provider/src/android/provider/cts/ContactsContract_PhotoTest.java
+++ b/tests/tests/provider/src/android/provider/cts/ContactsContract_PhotoTest.java
@@ -19,7 +19,6 @@
 import android.content.ContentProviderClient;
 import android.content.ContentResolver;
 import android.content.Context;
-import android.os.cts.FileUtils;
 import android.provider.ContactsContract;
 import android.provider.ContactsContract.CommonDataKinds.Photo;
 import android.provider.ContactsContract.Contacts;
diff --git a/tests/tests/provider/src/android/provider/cts/ContactsTest.java b/tests/tests/provider/src/android/provider/cts/ContactsTest.java
index db1c4f7..9a3fc19 100644
--- a/tests/tests/provider/src/android/provider/cts/ContactsTest.java
+++ b/tests/tests/provider/src/android/provider/cts/ContactsTest.java
@@ -219,12 +219,12 @@
         try {
             Context context = getInstrumentation().getTargetContext();
             InputStream inputStream = context.getResources().openRawResource(
-                    com.android.cts.stub.R.drawable.testimage);
+                    com.android.cts.provider.R.drawable.testimage);
             int size = inputStream.available();
             byte[] data =  new byte[size];
             inputStream.read(data);
             BitmapDrawable sourceDrawable = (BitmapDrawable) context.getResources().getDrawable(
-                    com.android.cts.stub.R.drawable.testimage);
+                    com.android.cts.provider.R.drawable.testimage);
             // Test: insert
             ContentValues value = new ContentValues();
             value.put(Photos.PERSON_ID, 1);
diff --git a/tests/tests/provider/src/android/provider/cts/Contacts_PeopleTest.java b/tests/tests/provider/src/android/provider/cts/Contacts_PeopleTest.java
index e5085b8..6b5de96 100644
--- a/tests/tests/provider/src/android/provider/cts/Contacts_PeopleTest.java
+++ b/tests/tests/provider/src/android/provider/cts/Contacts_PeopleTest.java
@@ -257,7 +257,7 @@
         Context context = getInstrumentation().getTargetContext();
         try {
             InputStream inputStream = context.getResources().openRawResource(
-                    com.android.cts.stub.R.drawable.testimage);
+                    com.android.cts.provider.R.drawable.testimage);
             int size = inputStream.available();
             byte[] data =  new byte[size];
             inputStream.read(data);
@@ -275,12 +275,12 @@
             assertNull(photoStream);
 
             bitmap = People.loadContactPhoto(context, mPeopleRowsAdded.get(0),
-                    com.android.cts.stub.R.drawable.size_48x48, null);
+                    com.android.cts.provider.R.drawable.size_48x48, null);
             assertEquals(96, bitmap.getWidth());
             assertEquals(64, bitmap.getHeight());
 
             bitmap = People.loadContactPhoto(context, null,
-                    com.android.cts.stub.R.drawable.size_48x48, null);
+                    com.android.cts.provider.R.drawable.size_48x48, null);
             assertNotNull(bitmap);
         } catch (IOException e) {
             fail("Unexpected IOException");
diff --git a/tests/tests/provider/src/android/provider/cts/FileUtils.java b/tests/tests/provider/src/android/provider/cts/FileUtils.java
new file mode 100644
index 0000000..0766e6d
--- /dev/null
+++ b/tests/tests/provider/src/android/provider/cts/FileUtils.java
@@ -0,0 +1,86 @@
+/*
+ * Copyright (C) 2011 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.provider.cts;
+
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+
+/** Bits and pieces copied from hidden API of android.os.FileUtils. */
+public class FileUtils {
+
+    /**
+     * Copy data from a source stream to destFile.
+     * Return true if succeed, return false if failed.
+     */
+    public static boolean copyToFile(InputStream inputStream, File destFile) {
+        try {
+            if (destFile.exists()) {
+                destFile.delete();
+            }
+            FileOutputStream out = new FileOutputStream(destFile);
+            try {
+                byte[] buffer = new byte[4096];
+                int bytesRead;
+                while ((bytesRead = inputStream.read(buffer)) >= 0) {
+                    out.write(buffer, 0, bytesRead);
+                }
+            } finally {
+                out.flush();
+                try {
+                    out.getFD().sync();
+                } catch (IOException e) {
+                }
+                out.close();
+            }
+            return true;
+        } catch (IOException e) {
+            return false;
+        }
+    }
+
+    public static void createFile(File file, int numBytes) throws IOException {
+        File parentFile = file.getParentFile();
+        if (parentFile != null) {
+            parentFile.mkdirs();
+        }
+        byte[] buffer = new byte[numBytes];
+        FileOutputStream output = new FileOutputStream(file);
+        try {
+            output.write(buffer);
+        } finally {
+            output.close();
+        }
+    }
+
+    public static byte[] readInputStreamFully(InputStream is) {
+        ByteArrayOutputStream os = new ByteArrayOutputStream();
+        byte[] buffer = new byte[32768];
+        int count;
+        try {
+            while ((count = is.read(buffer)) != -1) {
+                os.write(buffer, 0, count);
+            }
+            is.close();
+        } catch (IOException e) {
+            throw new RuntimeException(e);
+        }
+        return os.toByteArray();
+    }
+}
diff --git a/tests/src/android/provider/cts/MediaStoreAudioTestHelper.java b/tests/tests/provider/src/android/provider/cts/MediaStoreAudioTestHelper.java
similarity index 100%
rename from tests/src/android/provider/cts/MediaStoreAudioTestHelper.java
rename to tests/tests/provider/src/android/provider/cts/MediaStoreAudioTestHelper.java
diff --git a/tests/tests/provider/src/android/provider/cts/MediaStore_Audio_AlbumsTest.java b/tests/tests/provider/src/android/provider/cts/MediaStore_Audio_AlbumsTest.java
index b265cbf..bad1108 100644
--- a/tests/tests/provider/src/android/provider/cts/MediaStore_Audio_AlbumsTest.java
+++ b/tests/tests/provider/src/android/provider/cts/MediaStore_Audio_AlbumsTest.java
@@ -16,7 +16,7 @@
 
 package android.provider.cts;
 
-import com.android.cts.stub.R;
+import com.android.cts.provider.R;
 
 import android.content.ContentResolver;
 import android.content.ContentValues;
diff --git a/tests/tests/provider/src/android/provider/cts/MediaStore_FilesTest.java b/tests/tests/provider/src/android/provider/cts/MediaStore_FilesTest.java
index 356fe3c..67396d4 100644
--- a/tests/tests/provider/src/android/provider/cts/MediaStore_FilesTest.java
+++ b/tests/tests/provider/src/android/provider/cts/MediaStore_FilesTest.java
@@ -16,7 +16,7 @@
 
 package android.provider.cts;
 
-import com.android.cts.stub.R;
+import com.android.cts.provider.R;
 
 import android.content.ContentResolver;
 import android.content.ContentUris;
diff --git a/tests/tests/provider/src/android/provider/cts/MediaStore_Images_MediaTest.java b/tests/tests/provider/src/android/provider/cts/MediaStore_Images_MediaTest.java
index e68286f..bc86b0a 100644
--- a/tests/tests/provider/src/android/provider/cts/MediaStore_Images_MediaTest.java
+++ b/tests/tests/provider/src/android/provider/cts/MediaStore_Images_MediaTest.java
@@ -16,7 +16,7 @@
 
 package android.provider.cts;
 
-import com.android.cts.stub.R;
+import com.android.cts.provider.R;
 
 import android.content.ContentResolver;
 import android.content.ContentValues;
@@ -26,7 +26,6 @@
 import android.graphics.BitmapFactory;
 import android.net.Uri;
 import android.os.Environment;
-import android.os.cts.FileUtils;
 import android.provider.MediaStore.Images.Media;
 import android.provider.MediaStore.Images.Thumbnails;
 import android.test.InstrumentationTestCase;
diff --git a/tests/tests/provider/src/android/provider/cts/MediaStore_Images_ThumbnailsTest.java b/tests/tests/provider/src/android/provider/cts/MediaStore_Images_ThumbnailsTest.java
index 60bf011..025be2c 100644
--- a/tests/tests/provider/src/android/provider/cts/MediaStore_Images_ThumbnailsTest.java
+++ b/tests/tests/provider/src/android/provider/cts/MediaStore_Images_ThumbnailsTest.java
@@ -16,7 +16,7 @@
 
 package android.provider.cts;
 
-import com.android.cts.stub.R;
+import com.android.cts.provider.R;
 
 import android.content.ContentResolver;
 import android.content.ContentUris;
diff --git a/tests/tests/provider/src/android/provider/cts/MediaStore_VideoTest.java b/tests/tests/provider/src/android/provider/cts/MediaStore_VideoTest.java
index 366fc57..2c9ebd1 100644
--- a/tests/tests/provider/src/android/provider/cts/MediaStore_VideoTest.java
+++ b/tests/tests/provider/src/android/provider/cts/MediaStore_VideoTest.java
@@ -16,7 +16,7 @@
 
 package android.provider.cts;
 
-import com.android.cts.stub.R;
+import com.android.cts.provider.R;
 
 import android.content.ContentResolver;
 import android.content.ContentValues;
diff --git a/tests/tests/provider/src/android/provider/cts/MediaStore_Video_MediaTest.java b/tests/tests/provider/src/android/provider/cts/MediaStore_Video_MediaTest.java
index c9461b4..c3f5070 100644
--- a/tests/tests/provider/src/android/provider/cts/MediaStore_Video_MediaTest.java
+++ b/tests/tests/provider/src/android/provider/cts/MediaStore_Video_MediaTest.java
@@ -17,7 +17,7 @@
 package android.provider.cts;
 
 
-import com.android.cts.stub.R;
+import com.android.cts.provider.R;
 
 import android.content.ContentResolver;
 import android.content.ContentValues;
@@ -25,7 +25,6 @@
 import android.database.Cursor;
 import android.net.Uri;
 import android.os.Environment;
-import android.os.cts.FileUtils;
 import android.provider.MediaStore;
 import android.provider.MediaStore.Video.Media;
 import android.provider.MediaStore.Video.VideoColumns;
diff --git a/tests/tests/provider/src/android/provider/cts/MediaStore_Video_ThumbnailsTest.java b/tests/tests/provider/src/android/provider/cts/MediaStore_Video_ThumbnailsTest.java
index ac0bc03..e74cce4 100644
--- a/tests/tests/provider/src/android/provider/cts/MediaStore_Video_ThumbnailsTest.java
+++ b/tests/tests/provider/src/android/provider/cts/MediaStore_Video_ThumbnailsTest.java
@@ -16,7 +16,7 @@
 
 package android.provider.cts;
 
-import com.android.cts.stub.R;
+import com.android.cts.provider.R;
 
 import android.content.ContentResolver;
 import android.content.ContentUris;
diff --git a/tests/tests/provider/src/android/provider/cts/PhotoUtil.java b/tests/tests/provider/src/android/provider/cts/PhotoUtil.java
new file mode 100644
index 0000000..3f5f873
--- /dev/null
+++ b/tests/tests/provider/src/android/provider/cts/PhotoUtil.java
@@ -0,0 +1,31 @@
+/*
+ * Copyright (C) 2012 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.provider.cts;
+
+import com.android.cts.provider.R;
+
+import android.content.Context;
+
+import java.io.InputStream;
+
+public class PhotoUtil {
+
+    public static byte[] getTestPhotoData(Context context) {
+        InputStream input = context.getResources().openRawResource(R.drawable.testimage);
+        return FileUtils.readInputStreamFully(input);
+    }
+}
diff --git a/tests/src/android/provider/cts/TestSearchRecentSuggestionsProvider.java b/tests/tests/provider/src/android/provider/cts/TestSearchRecentSuggestionsProvider.java
similarity index 100%
rename from tests/src/android/provider/cts/TestSearchRecentSuggestionsProvider.java
rename to tests/tests/provider/src/android/provider/cts/TestSearchRecentSuggestionsProvider.java
diff --git a/tests/tests/renderscript/libcoremathtestcpp/CoreMathTestJni.cpp b/tests/tests/renderscript/libcoremathtestcpp/CoreMathTestJni.cpp
index 90c8100..8fd3747 100644
--- a/tests/tests/renderscript/libcoremathtestcpp/CoreMathTestJni.cpp
+++ b/tests/tests/renderscript/libcoremathtestcpp/CoreMathTestJni.cpp
@@ -237,8 +237,9 @@
 extern "C" JNIEXPORT jobject JNICALL
 Java_android_renderscript_cts_CoreMathVerifier_lgamma2(JNIEnv* env, jclass, jfloat x) {
     JavaStruct result(env, "LgammaResult");
-    result.SetFloat("lgamma", lgammaf(x));
-    result.SetInt("gammaSign", signgam);
+    int sign = 0;
+    result.SetFloat("lgamma", lgammaf_r(x, &sign));
+    result.SetInt("gammaSign", sign);
     return result.getObject();
 }
 
@@ -356,7 +357,7 @@
 Java_android_renderscript_cts_CoreMathVerifier_remquo(JNIEnv* env, jclass, jfloat numerator,
                                                       jfloat denominator) {
     JavaStruct result(env, "RemquoResult");
-    int quotient = 0.0;
+    int quotient = 0;
     result.SetFloat("remainder", remquof(numerator, denominator, &quotient));
     result.SetInt("quotient", quotient);
     return result.getObject();
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/CoreMathVerifier.java b/tests/tests/renderscript/src/android/renderscript/cts/CoreMathVerifier.java
index 217e7c6..dfcf1f5 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/CoreMathVerifier.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/CoreMathVerifier.java
@@ -1332,6 +1332,9 @@
             lgamma(in.max32()));
     }
 
+    /* TODO Until -0 handling is corrected in bionic & associated drivers, we temporarily
+     * disable the verification of -0.  We do this with a custom verifier.  Once bionic
+     * is fixed, we can restore computeLgamma and remove verifyLgamma.
     static public void computeLgamma(TestLgamma.ArgumentsFloatIntFloat args, Target t) {
         t.setPrecision(16, 128, false);
         Target.Floaty in = t.new32(args.inX);
@@ -1341,6 +1344,33 @@
         args.out = t.new32(result.lgamma, resultMin.lgamma, resultMax.lgamma);
         args.outY = result.gammaSign;
     }
+    */
+    static public String verifyLgamma(TestLgamma.ArgumentsFloatIntFloat args, Target t) {
+        t.setPrecision(16, 128, false);
+        Target.Floaty in = t.new32(args.inX);
+        LgammaResult result = lgamma2(in.mid32());
+        LgammaResult resultMin = lgamma2(in.min32());
+        LgammaResult resultMax = lgamma2(in.max32());
+        Target.Floaty expectedOut = t.new32(result.lgamma, resultMin.lgamma, resultMax.lgamma);
+        boolean isNegativeZero = args.inX == 0.f && 1.f / args.inX < 0.f;
+        /* TODO The current implementation of bionic does not handle the -0.f case correctly.
+         * It should set the sign to -1 but sets it to 1.
+         */
+        if (!expectedOut.couldBe(args.out) ||
+            (args.outY != result.gammaSign && !isNegativeZero)) {
+            StringBuilder message = new StringBuilder();
+            message.append(String.format("Input in %14.8g {%8x}:\n", args.inX, Float.floatToRawIntBits(args.inX)));
+            message.append("Expected out: ");
+            message.append(expectedOut.toString());
+            message.append("\n");
+            message.append(String.format("Actual   out: %14.8g {%8x}", args.out, Float.floatToRawIntBits(args.out)));
+            message.append(String.format("Expected outY: %d\n", result.gammaSign));
+            message.append(String.format("Actual   outY: %d\n", args.outY));
+            return message.toString();
+        }
+
+        return null;
+    }
 
     // TODO The relaxed ulf for the various log are taken from the old tests.
     // They are not consistent.
@@ -1787,21 +1817,29 @@
 
     static public String verifyRemquo(TestRemquo.ArgumentsFloatFloatIntFloat args, Target t) {
         t.setPrecision(0, 0, false);
-        RemquoResult result = remquo(args.inB, args.inC);
-        // If the remainder is NaN, we don't validate the quotient.  It's because of a division
-        // by zero.
-        if (args.out != args.out && result.remainder != result.remainder) {
-            return null;
+        RemquoResult expected = remquo(args.inB, args.inC);
+        // If the expected remainder is NaN, we don't validate the quotient.  It's because of
+        // a division by zero.
+        if (expected.remainder != expected.remainder) {
+            // Check that the value we got is NaN too.
+            if (args.out == args.out) {
+                return "Expected a remainder of NaN but got " +  Float.toString(args.out);
+            }
+        } else {
+            // The quotient should have the same lowest three bits.
+            if ((args.outD & 0x07) != (expected.quotient & 0x07)) {
+                return "Quotient returned " +  Integer.toString(args.outD) +
+                    " does not have the same lower three bits as the expected " +
+                    Integer.toString(expected.quotient);
+            }
+            Target.Floaty remainder = t.new32(expected.remainder);
+            if (!remainder.couldBe(args.out)) {
+                return "Remainder returned " + Float.toString(args.out) +
+                    " is not similar to the expected " +
+                    remainder.toString();
+            }
         }
-        Target.Floaty remainder = t.new32(result.remainder);
-        // The quotient should have the same sign and the same lowest three bits.
-        if (Integer.signum(args.outD) == Integer.signum(result.quotient) &&
-                (args.outD & 0x07) == (result.quotient & 0x07) &&
-                remainder.couldBe(args.out)) {
-            return null;
-        }
-        return "Expected quotient similar to " + Integer.toString(args.outD) + " and " +
-            remainder.toString();
+        return null;
     }
 
     static public void computeRint(TestRint.ArgumentsFloatFloat args, Target t) {
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/IntrinsicLut.java b/tests/tests/renderscript/src/android/renderscript/cts/IntrinsicLut.java
new file mode 100644
index 0000000..1567639
--- /dev/null
+++ b/tests/tests/renderscript/src/android/renderscript/cts/IntrinsicLut.java
@@ -0,0 +1,87 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.renderscript.cts;
+
+import android.renderscript.*;
+import android.util.Log;
+
+public class IntrinsicLut extends IntrinsicBase {
+    private ScriptIntrinsicLUT mIntrinsic;
+    private ScriptC_intrinsic_lut mScript;
+
+    short mRed[] = new short[256];
+    short mGreen[] = new short[256];
+    short mBlue[] = new short[256];
+    short mAlpha[] = new short[256];
+
+
+
+    public void createTest() {
+        java.util.Random r = new java.util.Random(100);
+
+        mIntrinsic = ScriptIntrinsicLUT.create(mRS, Element.U8_4(mRS));
+        mScript = new ScriptC_intrinsic_lut(mRS);
+
+        for (int ct=0; ct < 256; ct++) {
+            mRed[ct] = (short)r.nextInt(256);
+            mGreen[ct] = (short)r.nextInt(256);
+            mBlue[ct] = (short)r.nextInt(256);
+            mAlpha[ct] = (short)r.nextInt(256);
+            mIntrinsic.setRed(ct, mRed[ct]);
+            mIntrinsic.setGreen(ct, mGreen[ct]);
+            mIntrinsic.setBlue(ct, mBlue[ct]);
+            mIntrinsic.setAlpha(ct, mAlpha[ct]);
+        }
+        mScript.set_red(mRed);
+        mScript.set_green(mGreen);
+        mScript.set_blue(mBlue);
+        mScript.set_alpha(mAlpha);
+    }
+
+
+
+    public void test() {
+        createTest();
+        makeBuffers(97, 97, Element.U8_4(mRS));
+
+        mIntrinsic.forEach(mAllocSrc, mAllocDst);
+        mScript.forEach_root(mAllocSrc, mAllocRef);
+
+        mVerify.set_gAllowedIntError(0);
+        mVerify.invoke_verify(mAllocRef, mAllocDst, mAllocSrc);
+        mRS.finish();
+        checkError();
+    }
+
+    public void test1C() {
+        createTest();
+        makeBuffers(97, 97, Element.U8_4(mRS));
+
+        Script.LaunchOptions lo = makeClipper(11, 11, 87, 87);
+
+        mIntrinsic.forEach(mAllocSrc, mAllocDst, lo);
+        mScript.forEach_root(mAllocSrc, mAllocRef, lo);
+
+        mVerify.set_gAllowedIntError(0);
+        mVerify.invoke_verify(mAllocRef, mAllocDst, mAllocSrc);
+        mRS.finish();
+        checkError();
+    }
+
+
+
+}
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/TestLgamma.java b/tests/tests/renderscript/src/android/renderscript/cts/TestLgamma.java
index 8ec06e7..113df19 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/TestLgamma.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestLgamma.java
@@ -278,7 +278,7 @@
     public class ArgumentsFloatIntFloat {
         public float inX;
         public int outY;
-        public Target.Floaty out;
+        public float out;
     }
 
     private void checkLgammaFloatIntFloat() {
@@ -315,42 +315,26 @@
                 // Extract the inputs.
                 ArgumentsFloatIntFloat args = new ArgumentsFloatIntFloat();
                 args.inX = arrayInX[i];
-                // Figure out what the outputs should have been.
+                // Extract the outputs.
+                args.outY = arrayOutY[i * 1 + j];
+                args.out = arrayOut[i * 1 + j];
+                // Ask the CoreMathVerifier to validate.
                 Target target = new Target(relaxed);
-                CoreMathVerifier.computeLgamma(args, target);
-                // Validate the outputs.
-                boolean valid = true;
-                if (args.outY != arrayOutY[i * 1 + j]) {
-                    valid = false;
-                }
-                if (!args.out.couldBe(arrayOut[i * 1 + j])) {
-                    valid = false;
-                }
+                String errorMessage = CoreMathVerifier.verifyLgamma(args, target);
+                boolean valid = errorMessage == null;
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
                     message.append("Input inX: ");
                     message.append(String.format("%14.8g {%8x} %15a",
                             args.inX, Float.floatToRawIntBits(args.inX), args.inX));
                     message.append("\n");
-                    message.append("Expected output outY: ");
+                    message.append("Output outY: ");
                     message.append(String.format("%d", args.outY));
                     message.append("\n");
-                    message.append("Actual   output outY: ");
-                    message.append(String.format("%d", arrayOutY[i * 1 + j]));
-                    if (args.outY != arrayOutY[i * 1 + j]) {
-                        message.append(" FAIL");
-                    }
+                    message.append("Output out: ");
+                    message.append(Float.toString(args.out));
                     message.append("\n");
-                    message.append("Expected output out: ");
-                    message.append(args.out.toString());
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    message.append(String.format("%14.8g {%8x} %15a",
-                            arrayOut[i * 1 + j], Float.floatToRawIntBits(arrayOut[i * 1 + j]), arrayOut[i * 1 + j]));
-                    if (!args.out.couldBe(arrayOut[i * 1 + j])) {
-                        message.append(" FAIL");
-                    }
-                    message.append("\n");
+                    message.append(errorMessage);
                     assertTrue("Incorrect output for checkLgammaFloatIntFloat" +
                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
                 }
@@ -392,42 +376,26 @@
                 // Extract the inputs.
                 ArgumentsFloatIntFloat args = new ArgumentsFloatIntFloat();
                 args.inX = arrayInX[i * 2 + j];
-                // Figure out what the outputs should have been.
+                // Extract the outputs.
+                args.outY = arrayOutY[i * 2 + j];
+                args.out = arrayOut[i * 2 + j];
+                // Ask the CoreMathVerifier to validate.
                 Target target = new Target(relaxed);
-                CoreMathVerifier.computeLgamma(args, target);
-                // Validate the outputs.
-                boolean valid = true;
-                if (args.outY != arrayOutY[i * 2 + j]) {
-                    valid = false;
-                }
-                if (!args.out.couldBe(arrayOut[i * 2 + j])) {
-                    valid = false;
-                }
+                String errorMessage = CoreMathVerifier.verifyLgamma(args, target);
+                boolean valid = errorMessage == null;
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
                     message.append("Input inX: ");
                     message.append(String.format("%14.8g {%8x} %15a",
                             args.inX, Float.floatToRawIntBits(args.inX), args.inX));
                     message.append("\n");
-                    message.append("Expected output outY: ");
+                    message.append("Output outY: ");
                     message.append(String.format("%d", args.outY));
                     message.append("\n");
-                    message.append("Actual   output outY: ");
-                    message.append(String.format("%d", arrayOutY[i * 2 + j]));
-                    if (args.outY != arrayOutY[i * 2 + j]) {
-                        message.append(" FAIL");
-                    }
+                    message.append("Output out: ");
+                    message.append(Float.toString(args.out));
                     message.append("\n");
-                    message.append("Expected output out: ");
-                    message.append(args.out.toString());
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    message.append(String.format("%14.8g {%8x} %15a",
-                            arrayOut[i * 2 + j], Float.floatToRawIntBits(arrayOut[i * 2 + j]), arrayOut[i * 2 + j]));
-                    if (!args.out.couldBe(arrayOut[i * 2 + j])) {
-                        message.append(" FAIL");
-                    }
-                    message.append("\n");
+                    message.append(errorMessage);
                     assertTrue("Incorrect output for checkLgammaFloat2Int2Float2" +
                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
                 }
@@ -469,42 +437,26 @@
                 // Extract the inputs.
                 ArgumentsFloatIntFloat args = new ArgumentsFloatIntFloat();
                 args.inX = arrayInX[i * 4 + j];
-                // Figure out what the outputs should have been.
+                // Extract the outputs.
+                args.outY = arrayOutY[i * 4 + j];
+                args.out = arrayOut[i * 4 + j];
+                // Ask the CoreMathVerifier to validate.
                 Target target = new Target(relaxed);
-                CoreMathVerifier.computeLgamma(args, target);
-                // Validate the outputs.
-                boolean valid = true;
-                if (args.outY != arrayOutY[i * 4 + j]) {
-                    valid = false;
-                }
-                if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                    valid = false;
-                }
+                String errorMessage = CoreMathVerifier.verifyLgamma(args, target);
+                boolean valid = errorMessage == null;
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
                     message.append("Input inX: ");
                     message.append(String.format("%14.8g {%8x} %15a",
                             args.inX, Float.floatToRawIntBits(args.inX), args.inX));
                     message.append("\n");
-                    message.append("Expected output outY: ");
+                    message.append("Output outY: ");
                     message.append(String.format("%d", args.outY));
                     message.append("\n");
-                    message.append("Actual   output outY: ");
-                    message.append(String.format("%d", arrayOutY[i * 4 + j]));
-                    if (args.outY != arrayOutY[i * 4 + j]) {
-                        message.append(" FAIL");
-                    }
+                    message.append("Output out: ");
+                    message.append(Float.toString(args.out));
                     message.append("\n");
-                    message.append("Expected output out: ");
-                    message.append(args.out.toString());
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    message.append(String.format("%14.8g {%8x} %15a",
-                            arrayOut[i * 4 + j], Float.floatToRawIntBits(arrayOut[i * 4 + j]), arrayOut[i * 4 + j]));
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
-                    }
-                    message.append("\n");
+                    message.append(errorMessage);
                     assertTrue("Incorrect output for checkLgammaFloat3Int3Float3" +
                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
                 }
@@ -546,42 +498,26 @@
                 // Extract the inputs.
                 ArgumentsFloatIntFloat args = new ArgumentsFloatIntFloat();
                 args.inX = arrayInX[i * 4 + j];
-                // Figure out what the outputs should have been.
+                // Extract the outputs.
+                args.outY = arrayOutY[i * 4 + j];
+                args.out = arrayOut[i * 4 + j];
+                // Ask the CoreMathVerifier to validate.
                 Target target = new Target(relaxed);
-                CoreMathVerifier.computeLgamma(args, target);
-                // Validate the outputs.
-                boolean valid = true;
-                if (args.outY != arrayOutY[i * 4 + j]) {
-                    valid = false;
-                }
-                if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                    valid = false;
-                }
+                String errorMessage = CoreMathVerifier.verifyLgamma(args, target);
+                boolean valid = errorMessage == null;
                 if (!valid) {
                     StringBuilder message = new StringBuilder();
                     message.append("Input inX: ");
                     message.append(String.format("%14.8g {%8x} %15a",
                             args.inX, Float.floatToRawIntBits(args.inX), args.inX));
                     message.append("\n");
-                    message.append("Expected output outY: ");
+                    message.append("Output outY: ");
                     message.append(String.format("%d", args.outY));
                     message.append("\n");
-                    message.append("Actual   output outY: ");
-                    message.append(String.format("%d", arrayOutY[i * 4 + j]));
-                    if (args.outY != arrayOutY[i * 4 + j]) {
-                        message.append(" FAIL");
-                    }
+                    message.append("Output out: ");
+                    message.append(Float.toString(args.out));
                     message.append("\n");
-                    message.append("Expected output out: ");
-                    message.append(args.out.toString());
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    message.append(String.format("%14.8g {%8x} %15a",
-                            arrayOut[i * 4 + j], Float.floatToRawIntBits(arrayOut[i * 4 + j]), arrayOut[i * 4 + j]));
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
-                    }
-                    message.append("\n");
+                    message.append(errorMessage);
                     assertTrue("Incorrect output for checkLgammaFloat4Int4Float4" +
                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
                 }
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/TestNativeAcos.java b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeAcos.java
index bda06c7..430cf59 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/TestNativeAcos.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeAcos.java
@@ -72,7 +72,7 @@
                 CoreMathVerifier.computeNativeAcos(args, target);
                 // Validate the outputs.
                 boolean valid = true;
-                if (!args.out.couldBe(arrayOut[i * 1 + j])) {
+                if (!args.out.couldBe(arrayOut[i * 1 + j], 0.0005)) {
                     valid = false;
                 }
                 if (!valid) {
@@ -87,7 +87,7 @@
                     message.append("Actual   output out: ");
                     message.append(String.format("%14.8g {%8x} %15a",
                             arrayOut[i * 1 + j], Float.floatToRawIntBits(arrayOut[i * 1 + j]), arrayOut[i * 1 + j]));
-                    if (!args.out.couldBe(arrayOut[i * 1 + j])) {
+                    if (!args.out.couldBe(arrayOut[i * 1 + j], 0.0005)) {
                         message.append(" FAIL");
                     }
                     message.append("\n");
@@ -131,7 +131,7 @@
                 CoreMathVerifier.computeNativeAcos(args, target);
                 // Validate the outputs.
                 boolean valid = true;
-                if (!args.out.couldBe(arrayOut[i * 2 + j])) {
+                if (!args.out.couldBe(arrayOut[i * 2 + j], 0.0005)) {
                     valid = false;
                 }
                 if (!valid) {
@@ -146,7 +146,7 @@
                     message.append("Actual   output out: ");
                     message.append(String.format("%14.8g {%8x} %15a",
                             arrayOut[i * 2 + j], Float.floatToRawIntBits(arrayOut[i * 2 + j]), arrayOut[i * 2 + j]));
-                    if (!args.out.couldBe(arrayOut[i * 2 + j])) {
+                    if (!args.out.couldBe(arrayOut[i * 2 + j], 0.0005)) {
                         message.append(" FAIL");
                     }
                     message.append("\n");
@@ -190,7 +190,7 @@
                 CoreMathVerifier.computeNativeAcos(args, target);
                 // Validate the outputs.
                 boolean valid = true;
-                if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                if (!args.out.couldBe(arrayOut[i * 4 + j], 0.0005)) {
                     valid = false;
                 }
                 if (!valid) {
@@ -205,7 +205,7 @@
                     message.append("Actual   output out: ");
                     message.append(String.format("%14.8g {%8x} %15a",
                             arrayOut[i * 4 + j], Float.floatToRawIntBits(arrayOut[i * 4 + j]), arrayOut[i * 4 + j]));
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                    if (!args.out.couldBe(arrayOut[i * 4 + j], 0.0005)) {
                         message.append(" FAIL");
                     }
                     message.append("\n");
@@ -249,7 +249,7 @@
                 CoreMathVerifier.computeNativeAcos(args, target);
                 // Validate the outputs.
                 boolean valid = true;
-                if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                if (!args.out.couldBe(arrayOut[i * 4 + j], 0.0005)) {
                     valid = false;
                 }
                 if (!valid) {
@@ -264,7 +264,7 @@
                     message.append("Actual   output out: ");
                     message.append(String.format("%14.8g {%8x} %15a",
                             arrayOut[i * 4 + j], Float.floatToRawIntBits(arrayOut[i * 4 + j]), arrayOut[i * 4 + j]));
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                    if (!args.out.couldBe(arrayOut[i * 4 + j], 0.0005)) {
                         message.append(" FAIL");
                     }
                     message.append("\n");
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/TestNativeAcosh.java b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeAcosh.java
index 7e84c96..d4a840a 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/TestNativeAcosh.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeAcosh.java
@@ -72,7 +72,7 @@
                 CoreMathVerifier.computeNativeAcosh(args, target);
                 // Validate the outputs.
                 boolean valid = true;
-                if (!args.out.couldBe(arrayOut[i * 1 + j])) {
+                if (!args.out.couldBe(arrayOut[i * 1 + j], 0.0005)) {
                     valid = false;
                 }
                 if (!valid) {
@@ -87,7 +87,7 @@
                     message.append("Actual   output out: ");
                     message.append(String.format("%14.8g {%8x} %15a",
                             arrayOut[i * 1 + j], Float.floatToRawIntBits(arrayOut[i * 1 + j]), arrayOut[i * 1 + j]));
-                    if (!args.out.couldBe(arrayOut[i * 1 + j])) {
+                    if (!args.out.couldBe(arrayOut[i * 1 + j], 0.0005)) {
                         message.append(" FAIL");
                     }
                     message.append("\n");
@@ -131,7 +131,7 @@
                 CoreMathVerifier.computeNativeAcosh(args, target);
                 // Validate the outputs.
                 boolean valid = true;
-                if (!args.out.couldBe(arrayOut[i * 2 + j])) {
+                if (!args.out.couldBe(arrayOut[i * 2 + j], 0.0005)) {
                     valid = false;
                 }
                 if (!valid) {
@@ -146,7 +146,7 @@
                     message.append("Actual   output out: ");
                     message.append(String.format("%14.8g {%8x} %15a",
                             arrayOut[i * 2 + j], Float.floatToRawIntBits(arrayOut[i * 2 + j]), arrayOut[i * 2 + j]));
-                    if (!args.out.couldBe(arrayOut[i * 2 + j])) {
+                    if (!args.out.couldBe(arrayOut[i * 2 + j], 0.0005)) {
                         message.append(" FAIL");
                     }
                     message.append("\n");
@@ -190,7 +190,7 @@
                 CoreMathVerifier.computeNativeAcosh(args, target);
                 // Validate the outputs.
                 boolean valid = true;
-                if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                if (!args.out.couldBe(arrayOut[i * 4 + j], 0.0005)) {
                     valid = false;
                 }
                 if (!valid) {
@@ -205,7 +205,7 @@
                     message.append("Actual   output out: ");
                     message.append(String.format("%14.8g {%8x} %15a",
                             arrayOut[i * 4 + j], Float.floatToRawIntBits(arrayOut[i * 4 + j]), arrayOut[i * 4 + j]));
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                    if (!args.out.couldBe(arrayOut[i * 4 + j], 0.0005)) {
                         message.append(" FAIL");
                     }
                     message.append("\n");
@@ -249,7 +249,7 @@
                 CoreMathVerifier.computeNativeAcosh(args, target);
                 // Validate the outputs.
                 boolean valid = true;
-                if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                if (!args.out.couldBe(arrayOut[i * 4 + j], 0.0005)) {
                     valid = false;
                 }
                 if (!valid) {
@@ -264,7 +264,7 @@
                     message.append("Actual   output out: ");
                     message.append(String.format("%14.8g {%8x} %15a",
                             arrayOut[i * 4 + j], Float.floatToRawIntBits(arrayOut[i * 4 + j]), arrayOut[i * 4 + j]));
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                    if (!args.out.couldBe(arrayOut[i * 4 + j], 0.0005)) {
                         message.append(" FAIL");
                     }
                     message.append("\n");
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/TestNativeAcospi.java b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeAcospi.java
index 75a29ae..187b787 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/TestNativeAcospi.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeAcospi.java
@@ -72,7 +72,7 @@
                 CoreMathVerifier.computeNativeAcospi(args, target);
                 // Validate the outputs.
                 boolean valid = true;
-                if (!args.out.couldBe(arrayOut[i * 1 + j])) {
+                if (!args.out.couldBe(arrayOut[i * 1 + j], 0.0005)) {
                     valid = false;
                 }
                 if (!valid) {
@@ -87,7 +87,7 @@
                     message.append("Actual   output out: ");
                     message.append(String.format("%14.8g {%8x} %15a",
                             arrayOut[i * 1 + j], Float.floatToRawIntBits(arrayOut[i * 1 + j]), arrayOut[i * 1 + j]));
-                    if (!args.out.couldBe(arrayOut[i * 1 + j])) {
+                    if (!args.out.couldBe(arrayOut[i * 1 + j], 0.0005)) {
                         message.append(" FAIL");
                     }
                     message.append("\n");
@@ -131,7 +131,7 @@
                 CoreMathVerifier.computeNativeAcospi(args, target);
                 // Validate the outputs.
                 boolean valid = true;
-                if (!args.out.couldBe(arrayOut[i * 2 + j])) {
+                if (!args.out.couldBe(arrayOut[i * 2 + j], 0.0005)) {
                     valid = false;
                 }
                 if (!valid) {
@@ -146,7 +146,7 @@
                     message.append("Actual   output out: ");
                     message.append(String.format("%14.8g {%8x} %15a",
                             arrayOut[i * 2 + j], Float.floatToRawIntBits(arrayOut[i * 2 + j]), arrayOut[i * 2 + j]));
-                    if (!args.out.couldBe(arrayOut[i * 2 + j])) {
+                    if (!args.out.couldBe(arrayOut[i * 2 + j], 0.0005)) {
                         message.append(" FAIL");
                     }
                     message.append("\n");
@@ -190,7 +190,7 @@
                 CoreMathVerifier.computeNativeAcospi(args, target);
                 // Validate the outputs.
                 boolean valid = true;
-                if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                if (!args.out.couldBe(arrayOut[i * 4 + j], 0.0005)) {
                     valid = false;
                 }
                 if (!valid) {
@@ -205,7 +205,7 @@
                     message.append("Actual   output out: ");
                     message.append(String.format("%14.8g {%8x} %15a",
                             arrayOut[i * 4 + j], Float.floatToRawIntBits(arrayOut[i * 4 + j]), arrayOut[i * 4 + j]));
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                    if (!args.out.couldBe(arrayOut[i * 4 + j], 0.0005)) {
                         message.append(" FAIL");
                     }
                     message.append("\n");
@@ -249,7 +249,7 @@
                 CoreMathVerifier.computeNativeAcospi(args, target);
                 // Validate the outputs.
                 boolean valid = true;
-                if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                if (!args.out.couldBe(arrayOut[i * 4 + j], 0.0005)) {
                     valid = false;
                 }
                 if (!valid) {
@@ -264,7 +264,7 @@
                     message.append("Actual   output out: ");
                     message.append(String.format("%14.8g {%8x} %15a",
                             arrayOut[i * 4 + j], Float.floatToRawIntBits(arrayOut[i * 4 + j]), arrayOut[i * 4 + j]));
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                    if (!args.out.couldBe(arrayOut[i * 4 + j], 0.0005)) {
                         message.append(" FAIL");
                     }
                     message.append("\n");
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/TestNativeAsin.java b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeAsin.java
index 30bab7e..b9f61a6 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/TestNativeAsin.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeAsin.java
@@ -72,7 +72,7 @@
                 CoreMathVerifier.computeNativeAsin(args, target);
                 // Validate the outputs.
                 boolean valid = true;
-                if (!args.out.couldBe(arrayOut[i * 1 + j])) {
+                if (!args.out.couldBe(arrayOut[i * 1 + j], 0.0005)) {
                     valid = false;
                 }
                 if (!valid) {
@@ -87,7 +87,7 @@
                     message.append("Actual   output out: ");
                     message.append(String.format("%14.8g {%8x} %15a",
                             arrayOut[i * 1 + j], Float.floatToRawIntBits(arrayOut[i * 1 + j]), arrayOut[i * 1 + j]));
-                    if (!args.out.couldBe(arrayOut[i * 1 + j])) {
+                    if (!args.out.couldBe(arrayOut[i * 1 + j], 0.0005)) {
                         message.append(" FAIL");
                     }
                     message.append("\n");
@@ -131,7 +131,7 @@
                 CoreMathVerifier.computeNativeAsin(args, target);
                 // Validate the outputs.
                 boolean valid = true;
-                if (!args.out.couldBe(arrayOut[i * 2 + j])) {
+                if (!args.out.couldBe(arrayOut[i * 2 + j], 0.0005)) {
                     valid = false;
                 }
                 if (!valid) {
@@ -146,7 +146,7 @@
                     message.append("Actual   output out: ");
                     message.append(String.format("%14.8g {%8x} %15a",
                             arrayOut[i * 2 + j], Float.floatToRawIntBits(arrayOut[i * 2 + j]), arrayOut[i * 2 + j]));
-                    if (!args.out.couldBe(arrayOut[i * 2 + j])) {
+                    if (!args.out.couldBe(arrayOut[i * 2 + j], 0.0005)) {
                         message.append(" FAIL");
                     }
                     message.append("\n");
@@ -190,7 +190,7 @@
                 CoreMathVerifier.computeNativeAsin(args, target);
                 // Validate the outputs.
                 boolean valid = true;
-                if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                if (!args.out.couldBe(arrayOut[i * 4 + j], 0.0005)) {
                     valid = false;
                 }
                 if (!valid) {
@@ -205,7 +205,7 @@
                     message.append("Actual   output out: ");
                     message.append(String.format("%14.8g {%8x} %15a",
                             arrayOut[i * 4 + j], Float.floatToRawIntBits(arrayOut[i * 4 + j]), arrayOut[i * 4 + j]));
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                    if (!args.out.couldBe(arrayOut[i * 4 + j], 0.0005)) {
                         message.append(" FAIL");
                     }
                     message.append("\n");
@@ -249,7 +249,7 @@
                 CoreMathVerifier.computeNativeAsin(args, target);
                 // Validate the outputs.
                 boolean valid = true;
-                if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                if (!args.out.couldBe(arrayOut[i * 4 + j], 0.0005)) {
                     valid = false;
                 }
                 if (!valid) {
@@ -264,7 +264,7 @@
                     message.append("Actual   output out: ");
                     message.append(String.format("%14.8g {%8x} %15a",
                             arrayOut[i * 4 + j], Float.floatToRawIntBits(arrayOut[i * 4 + j]), arrayOut[i * 4 + j]));
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                    if (!args.out.couldBe(arrayOut[i * 4 + j], 0.0005)) {
                         message.append(" FAIL");
                     }
                     message.append("\n");
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/TestNativeAsinh.java b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeAsinh.java
index 8edf947..f8382a8 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/TestNativeAsinh.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeAsinh.java
@@ -72,7 +72,7 @@
                 CoreMathVerifier.computeNativeAsinh(args, target);
                 // Validate the outputs.
                 boolean valid = true;
-                if (!args.out.couldBe(arrayOut[i * 1 + j])) {
+                if (!args.out.couldBe(arrayOut[i * 1 + j], 0.0005)) {
                     valid = false;
                 }
                 if (!valid) {
@@ -87,7 +87,7 @@
                     message.append("Actual   output out: ");
                     message.append(String.format("%14.8g {%8x} %15a",
                             arrayOut[i * 1 + j], Float.floatToRawIntBits(arrayOut[i * 1 + j]), arrayOut[i * 1 + j]));
-                    if (!args.out.couldBe(arrayOut[i * 1 + j])) {
+                    if (!args.out.couldBe(arrayOut[i * 1 + j], 0.0005)) {
                         message.append(" FAIL");
                     }
                     message.append("\n");
@@ -131,7 +131,7 @@
                 CoreMathVerifier.computeNativeAsinh(args, target);
                 // Validate the outputs.
                 boolean valid = true;
-                if (!args.out.couldBe(arrayOut[i * 2 + j])) {
+                if (!args.out.couldBe(arrayOut[i * 2 + j], 0.0005)) {
                     valid = false;
                 }
                 if (!valid) {
@@ -146,7 +146,7 @@
                     message.append("Actual   output out: ");
                     message.append(String.format("%14.8g {%8x} %15a",
                             arrayOut[i * 2 + j], Float.floatToRawIntBits(arrayOut[i * 2 + j]), arrayOut[i * 2 + j]));
-                    if (!args.out.couldBe(arrayOut[i * 2 + j])) {
+                    if (!args.out.couldBe(arrayOut[i * 2 + j], 0.0005)) {
                         message.append(" FAIL");
                     }
                     message.append("\n");
@@ -190,7 +190,7 @@
                 CoreMathVerifier.computeNativeAsinh(args, target);
                 // Validate the outputs.
                 boolean valid = true;
-                if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                if (!args.out.couldBe(arrayOut[i * 4 + j], 0.0005)) {
                     valid = false;
                 }
                 if (!valid) {
@@ -205,7 +205,7 @@
                     message.append("Actual   output out: ");
                     message.append(String.format("%14.8g {%8x} %15a",
                             arrayOut[i * 4 + j], Float.floatToRawIntBits(arrayOut[i * 4 + j]), arrayOut[i * 4 + j]));
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                    if (!args.out.couldBe(arrayOut[i * 4 + j], 0.0005)) {
                         message.append(" FAIL");
                     }
                     message.append("\n");
@@ -249,7 +249,7 @@
                 CoreMathVerifier.computeNativeAsinh(args, target);
                 // Validate the outputs.
                 boolean valid = true;
-                if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                if (!args.out.couldBe(arrayOut[i * 4 + j], 0.0005)) {
                     valid = false;
                 }
                 if (!valid) {
@@ -264,7 +264,7 @@
                     message.append("Actual   output out: ");
                     message.append(String.format("%14.8g {%8x} %15a",
                             arrayOut[i * 4 + j], Float.floatToRawIntBits(arrayOut[i * 4 + j]), arrayOut[i * 4 + j]));
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                    if (!args.out.couldBe(arrayOut[i * 4 + j], 0.0005)) {
                         message.append(" FAIL");
                     }
                     message.append("\n");
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/TestNativeAsinpi.java b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeAsinpi.java
index 08eb07d..e0029b7 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/TestNativeAsinpi.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeAsinpi.java
@@ -72,7 +72,7 @@
                 CoreMathVerifier.computeNativeAsinpi(args, target);
                 // Validate the outputs.
                 boolean valid = true;
-                if (!args.out.couldBe(arrayOut[i * 1 + j])) {
+                if (!args.out.couldBe(arrayOut[i * 1 + j], 0.0005)) {
                     valid = false;
                 }
                 if (!valid) {
@@ -87,7 +87,7 @@
                     message.append("Actual   output out: ");
                     message.append(String.format("%14.8g {%8x} %15a",
                             arrayOut[i * 1 + j], Float.floatToRawIntBits(arrayOut[i * 1 + j]), arrayOut[i * 1 + j]));
-                    if (!args.out.couldBe(arrayOut[i * 1 + j])) {
+                    if (!args.out.couldBe(arrayOut[i * 1 + j], 0.0005)) {
                         message.append(" FAIL");
                     }
                     message.append("\n");
@@ -131,7 +131,7 @@
                 CoreMathVerifier.computeNativeAsinpi(args, target);
                 // Validate the outputs.
                 boolean valid = true;
-                if (!args.out.couldBe(arrayOut[i * 2 + j])) {
+                if (!args.out.couldBe(arrayOut[i * 2 + j], 0.0005)) {
                     valid = false;
                 }
                 if (!valid) {
@@ -146,7 +146,7 @@
                     message.append("Actual   output out: ");
                     message.append(String.format("%14.8g {%8x} %15a",
                             arrayOut[i * 2 + j], Float.floatToRawIntBits(arrayOut[i * 2 + j]), arrayOut[i * 2 + j]));
-                    if (!args.out.couldBe(arrayOut[i * 2 + j])) {
+                    if (!args.out.couldBe(arrayOut[i * 2 + j], 0.0005)) {
                         message.append(" FAIL");
                     }
                     message.append("\n");
@@ -190,7 +190,7 @@
                 CoreMathVerifier.computeNativeAsinpi(args, target);
                 // Validate the outputs.
                 boolean valid = true;
-                if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                if (!args.out.couldBe(arrayOut[i * 4 + j], 0.0005)) {
                     valid = false;
                 }
                 if (!valid) {
@@ -205,7 +205,7 @@
                     message.append("Actual   output out: ");
                     message.append(String.format("%14.8g {%8x} %15a",
                             arrayOut[i * 4 + j], Float.floatToRawIntBits(arrayOut[i * 4 + j]), arrayOut[i * 4 + j]));
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                    if (!args.out.couldBe(arrayOut[i * 4 + j], 0.0005)) {
                         message.append(" FAIL");
                     }
                     message.append("\n");
@@ -249,7 +249,7 @@
                 CoreMathVerifier.computeNativeAsinpi(args, target);
                 // Validate the outputs.
                 boolean valid = true;
-                if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                if (!args.out.couldBe(arrayOut[i * 4 + j], 0.0005)) {
                     valid = false;
                 }
                 if (!valid) {
@@ -264,7 +264,7 @@
                     message.append("Actual   output out: ");
                     message.append(String.format("%14.8g {%8x} %15a",
                             arrayOut[i * 4 + j], Float.floatToRawIntBits(arrayOut[i * 4 + j]), arrayOut[i * 4 + j]));
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                    if (!args.out.couldBe(arrayOut[i * 4 + j], 0.0005)) {
                         message.append(" FAIL");
                     }
                     message.append("\n");
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/TestNativeAtan.java b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeAtan.java
index 316eb6d..26225c5 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/TestNativeAtan.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeAtan.java
@@ -72,7 +72,7 @@
                 CoreMathVerifier.computeNativeAtan(args, target);
                 // Validate the outputs.
                 boolean valid = true;
-                if (!args.out.couldBe(arrayOut[i * 1 + j])) {
+                if (!args.out.couldBe(arrayOut[i * 1 + j], 0.0005)) {
                     valid = false;
                 }
                 if (!valid) {
@@ -87,7 +87,7 @@
                     message.append("Actual   output out: ");
                     message.append(String.format("%14.8g {%8x} %15a",
                             arrayOut[i * 1 + j], Float.floatToRawIntBits(arrayOut[i * 1 + j]), arrayOut[i * 1 + j]));
-                    if (!args.out.couldBe(arrayOut[i * 1 + j])) {
+                    if (!args.out.couldBe(arrayOut[i * 1 + j], 0.0005)) {
                         message.append(" FAIL");
                     }
                     message.append("\n");
@@ -131,7 +131,7 @@
                 CoreMathVerifier.computeNativeAtan(args, target);
                 // Validate the outputs.
                 boolean valid = true;
-                if (!args.out.couldBe(arrayOut[i * 2 + j])) {
+                if (!args.out.couldBe(arrayOut[i * 2 + j], 0.0005)) {
                     valid = false;
                 }
                 if (!valid) {
@@ -146,7 +146,7 @@
                     message.append("Actual   output out: ");
                     message.append(String.format("%14.8g {%8x} %15a",
                             arrayOut[i * 2 + j], Float.floatToRawIntBits(arrayOut[i * 2 + j]), arrayOut[i * 2 + j]));
-                    if (!args.out.couldBe(arrayOut[i * 2 + j])) {
+                    if (!args.out.couldBe(arrayOut[i * 2 + j], 0.0005)) {
                         message.append(" FAIL");
                     }
                     message.append("\n");
@@ -190,7 +190,7 @@
                 CoreMathVerifier.computeNativeAtan(args, target);
                 // Validate the outputs.
                 boolean valid = true;
-                if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                if (!args.out.couldBe(arrayOut[i * 4 + j], 0.0005)) {
                     valid = false;
                 }
                 if (!valid) {
@@ -205,7 +205,7 @@
                     message.append("Actual   output out: ");
                     message.append(String.format("%14.8g {%8x} %15a",
                             arrayOut[i * 4 + j], Float.floatToRawIntBits(arrayOut[i * 4 + j]), arrayOut[i * 4 + j]));
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                    if (!args.out.couldBe(arrayOut[i * 4 + j], 0.0005)) {
                         message.append(" FAIL");
                     }
                     message.append("\n");
@@ -249,7 +249,7 @@
                 CoreMathVerifier.computeNativeAtan(args, target);
                 // Validate the outputs.
                 boolean valid = true;
-                if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                if (!args.out.couldBe(arrayOut[i * 4 + j], 0.0005)) {
                     valid = false;
                 }
                 if (!valid) {
@@ -264,7 +264,7 @@
                     message.append("Actual   output out: ");
                     message.append(String.format("%14.8g {%8x} %15a",
                             arrayOut[i * 4 + j], Float.floatToRawIntBits(arrayOut[i * 4 + j]), arrayOut[i * 4 + j]));
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                    if (!args.out.couldBe(arrayOut[i * 4 + j], 0.0005)) {
                         message.append(" FAIL");
                     }
                     message.append("\n");
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/TestNativeAtan2.java b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeAtan2.java
index 5ca8f05..c33523c 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/TestNativeAtan2.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeAtan2.java
@@ -79,7 +79,7 @@
                 CoreMathVerifier.computeNativeAtan2(args, target);
                 // Validate the outputs.
                 boolean valid = true;
-                if (!args.out.couldBe(arrayOut[i * 1 + j])) {
+                if (!args.out.couldBe(arrayOut[i * 1 + j], 0.0005)) {
                     valid = false;
                 }
                 if (!valid) {
@@ -98,7 +98,7 @@
                     message.append("Actual   output out: ");
                     message.append(String.format("%14.8g {%8x} %15a",
                             arrayOut[i * 1 + j], Float.floatToRawIntBits(arrayOut[i * 1 + j]), arrayOut[i * 1 + j]));
-                    if (!args.out.couldBe(arrayOut[i * 1 + j])) {
+                    if (!args.out.couldBe(arrayOut[i * 1 + j], 0.0005)) {
                         message.append(" FAIL");
                     }
                     message.append("\n");
@@ -148,7 +148,7 @@
                 CoreMathVerifier.computeNativeAtan2(args, target);
                 // Validate the outputs.
                 boolean valid = true;
-                if (!args.out.couldBe(arrayOut[i * 2 + j])) {
+                if (!args.out.couldBe(arrayOut[i * 2 + j], 0.0005)) {
                     valid = false;
                 }
                 if (!valid) {
@@ -167,7 +167,7 @@
                     message.append("Actual   output out: ");
                     message.append(String.format("%14.8g {%8x} %15a",
                             arrayOut[i * 2 + j], Float.floatToRawIntBits(arrayOut[i * 2 + j]), arrayOut[i * 2 + j]));
-                    if (!args.out.couldBe(arrayOut[i * 2 + j])) {
+                    if (!args.out.couldBe(arrayOut[i * 2 + j], 0.0005)) {
                         message.append(" FAIL");
                     }
                     message.append("\n");
@@ -217,7 +217,7 @@
                 CoreMathVerifier.computeNativeAtan2(args, target);
                 // Validate the outputs.
                 boolean valid = true;
-                if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                if (!args.out.couldBe(arrayOut[i * 4 + j], 0.0005)) {
                     valid = false;
                 }
                 if (!valid) {
@@ -236,7 +236,7 @@
                     message.append("Actual   output out: ");
                     message.append(String.format("%14.8g {%8x} %15a",
                             arrayOut[i * 4 + j], Float.floatToRawIntBits(arrayOut[i * 4 + j]), arrayOut[i * 4 + j]));
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                    if (!args.out.couldBe(arrayOut[i * 4 + j], 0.0005)) {
                         message.append(" FAIL");
                     }
                     message.append("\n");
@@ -286,7 +286,7 @@
                 CoreMathVerifier.computeNativeAtan2(args, target);
                 // Validate the outputs.
                 boolean valid = true;
-                if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                if (!args.out.couldBe(arrayOut[i * 4 + j], 0.0005)) {
                     valid = false;
                 }
                 if (!valid) {
@@ -305,7 +305,7 @@
                     message.append("Actual   output out: ");
                     message.append(String.format("%14.8g {%8x} %15a",
                             arrayOut[i * 4 + j], Float.floatToRawIntBits(arrayOut[i * 4 + j]), arrayOut[i * 4 + j]));
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                    if (!args.out.couldBe(arrayOut[i * 4 + j], 0.0005)) {
                         message.append(" FAIL");
                     }
                     message.append("\n");
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/TestNativeAtan2pi.java b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeAtan2pi.java
index f05d924..dd62b78 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/TestNativeAtan2pi.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeAtan2pi.java
@@ -79,7 +79,7 @@
                 CoreMathVerifier.computeNativeAtan2pi(args, target);
                 // Validate the outputs.
                 boolean valid = true;
-                if (!args.out.couldBe(arrayOut[i * 1 + j])) {
+                if (!args.out.couldBe(arrayOut[i * 1 + j], 0.0005)) {
                     valid = false;
                 }
                 if (!valid) {
@@ -98,7 +98,7 @@
                     message.append("Actual   output out: ");
                     message.append(String.format("%14.8g {%8x} %15a",
                             arrayOut[i * 1 + j], Float.floatToRawIntBits(arrayOut[i * 1 + j]), arrayOut[i * 1 + j]));
-                    if (!args.out.couldBe(arrayOut[i * 1 + j])) {
+                    if (!args.out.couldBe(arrayOut[i * 1 + j], 0.0005)) {
                         message.append(" FAIL");
                     }
                     message.append("\n");
@@ -148,7 +148,7 @@
                 CoreMathVerifier.computeNativeAtan2pi(args, target);
                 // Validate the outputs.
                 boolean valid = true;
-                if (!args.out.couldBe(arrayOut[i * 2 + j])) {
+                if (!args.out.couldBe(arrayOut[i * 2 + j], 0.0005)) {
                     valid = false;
                 }
                 if (!valid) {
@@ -167,7 +167,7 @@
                     message.append("Actual   output out: ");
                     message.append(String.format("%14.8g {%8x} %15a",
                             arrayOut[i * 2 + j], Float.floatToRawIntBits(arrayOut[i * 2 + j]), arrayOut[i * 2 + j]));
-                    if (!args.out.couldBe(arrayOut[i * 2 + j])) {
+                    if (!args.out.couldBe(arrayOut[i * 2 + j], 0.0005)) {
                         message.append(" FAIL");
                     }
                     message.append("\n");
@@ -217,7 +217,7 @@
                 CoreMathVerifier.computeNativeAtan2pi(args, target);
                 // Validate the outputs.
                 boolean valid = true;
-                if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                if (!args.out.couldBe(arrayOut[i * 4 + j], 0.0005)) {
                     valid = false;
                 }
                 if (!valid) {
@@ -236,7 +236,7 @@
                     message.append("Actual   output out: ");
                     message.append(String.format("%14.8g {%8x} %15a",
                             arrayOut[i * 4 + j], Float.floatToRawIntBits(arrayOut[i * 4 + j]), arrayOut[i * 4 + j]));
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                    if (!args.out.couldBe(arrayOut[i * 4 + j], 0.0005)) {
                         message.append(" FAIL");
                     }
                     message.append("\n");
@@ -286,7 +286,7 @@
                 CoreMathVerifier.computeNativeAtan2pi(args, target);
                 // Validate the outputs.
                 boolean valid = true;
-                if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                if (!args.out.couldBe(arrayOut[i * 4 + j], 0.0005)) {
                     valid = false;
                 }
                 if (!valid) {
@@ -305,7 +305,7 @@
                     message.append("Actual   output out: ");
                     message.append(String.format("%14.8g {%8x} %15a",
                             arrayOut[i * 4 + j], Float.floatToRawIntBits(arrayOut[i * 4 + j]), arrayOut[i * 4 + j]));
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                    if (!args.out.couldBe(arrayOut[i * 4 + j], 0.0005)) {
                         message.append(" FAIL");
                     }
                     message.append("\n");
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/TestNativeAtanh.java b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeAtanh.java
index 95f4704..6161483 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/TestNativeAtanh.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeAtanh.java
@@ -72,7 +72,7 @@
                 CoreMathVerifier.computeNativeAtanh(args, target);
                 // Validate the outputs.
                 boolean valid = true;
-                if (!args.out.couldBe(arrayOut[i * 1 + j])) {
+                if (!args.out.couldBe(arrayOut[i * 1 + j], 0.0005)) {
                     valid = false;
                 }
                 if (!valid) {
@@ -87,7 +87,7 @@
                     message.append("Actual   output out: ");
                     message.append(String.format("%14.8g {%8x} %15a",
                             arrayOut[i * 1 + j], Float.floatToRawIntBits(arrayOut[i * 1 + j]), arrayOut[i * 1 + j]));
-                    if (!args.out.couldBe(arrayOut[i * 1 + j])) {
+                    if (!args.out.couldBe(arrayOut[i * 1 + j], 0.0005)) {
                         message.append(" FAIL");
                     }
                     message.append("\n");
@@ -131,7 +131,7 @@
                 CoreMathVerifier.computeNativeAtanh(args, target);
                 // Validate the outputs.
                 boolean valid = true;
-                if (!args.out.couldBe(arrayOut[i * 2 + j])) {
+                if (!args.out.couldBe(arrayOut[i * 2 + j], 0.0005)) {
                     valid = false;
                 }
                 if (!valid) {
@@ -146,7 +146,7 @@
                     message.append("Actual   output out: ");
                     message.append(String.format("%14.8g {%8x} %15a",
                             arrayOut[i * 2 + j], Float.floatToRawIntBits(arrayOut[i * 2 + j]), arrayOut[i * 2 + j]));
-                    if (!args.out.couldBe(arrayOut[i * 2 + j])) {
+                    if (!args.out.couldBe(arrayOut[i * 2 + j], 0.0005)) {
                         message.append(" FAIL");
                     }
                     message.append("\n");
@@ -190,7 +190,7 @@
                 CoreMathVerifier.computeNativeAtanh(args, target);
                 // Validate the outputs.
                 boolean valid = true;
-                if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                if (!args.out.couldBe(arrayOut[i * 4 + j], 0.0005)) {
                     valid = false;
                 }
                 if (!valid) {
@@ -205,7 +205,7 @@
                     message.append("Actual   output out: ");
                     message.append(String.format("%14.8g {%8x} %15a",
                             arrayOut[i * 4 + j], Float.floatToRawIntBits(arrayOut[i * 4 + j]), arrayOut[i * 4 + j]));
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                    if (!args.out.couldBe(arrayOut[i * 4 + j], 0.0005)) {
                         message.append(" FAIL");
                     }
                     message.append("\n");
@@ -249,7 +249,7 @@
                 CoreMathVerifier.computeNativeAtanh(args, target);
                 // Validate the outputs.
                 boolean valid = true;
-                if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                if (!args.out.couldBe(arrayOut[i * 4 + j], 0.0005)) {
                     valid = false;
                 }
                 if (!valid) {
@@ -264,7 +264,7 @@
                     message.append("Actual   output out: ");
                     message.append(String.format("%14.8g {%8x} %15a",
                             arrayOut[i * 4 + j], Float.floatToRawIntBits(arrayOut[i * 4 + j]), arrayOut[i * 4 + j]));
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                    if (!args.out.couldBe(arrayOut[i * 4 + j], 0.0005)) {
                         message.append(" FAIL");
                     }
                     message.append("\n");
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/TestNativeAtanpi.java b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeAtanpi.java
index bd07ad8..1e88568 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/TestNativeAtanpi.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeAtanpi.java
@@ -72,7 +72,7 @@
                 CoreMathVerifier.computeNativeAtanpi(args, target);
                 // Validate the outputs.
                 boolean valid = true;
-                if (!args.out.couldBe(arrayOut[i * 1 + j])) {
+                if (!args.out.couldBe(arrayOut[i * 1 + j], 0.0005)) {
                     valid = false;
                 }
                 if (!valid) {
@@ -87,7 +87,7 @@
                     message.append("Actual   output out: ");
                     message.append(String.format("%14.8g {%8x} %15a",
                             arrayOut[i * 1 + j], Float.floatToRawIntBits(arrayOut[i * 1 + j]), arrayOut[i * 1 + j]));
-                    if (!args.out.couldBe(arrayOut[i * 1 + j])) {
+                    if (!args.out.couldBe(arrayOut[i * 1 + j], 0.0005)) {
                         message.append(" FAIL");
                     }
                     message.append("\n");
@@ -131,7 +131,7 @@
                 CoreMathVerifier.computeNativeAtanpi(args, target);
                 // Validate the outputs.
                 boolean valid = true;
-                if (!args.out.couldBe(arrayOut[i * 2 + j])) {
+                if (!args.out.couldBe(arrayOut[i * 2 + j], 0.0005)) {
                     valid = false;
                 }
                 if (!valid) {
@@ -146,7 +146,7 @@
                     message.append("Actual   output out: ");
                     message.append(String.format("%14.8g {%8x} %15a",
                             arrayOut[i * 2 + j], Float.floatToRawIntBits(arrayOut[i * 2 + j]), arrayOut[i * 2 + j]));
-                    if (!args.out.couldBe(arrayOut[i * 2 + j])) {
+                    if (!args.out.couldBe(arrayOut[i * 2 + j], 0.0005)) {
                         message.append(" FAIL");
                     }
                     message.append("\n");
@@ -190,7 +190,7 @@
                 CoreMathVerifier.computeNativeAtanpi(args, target);
                 // Validate the outputs.
                 boolean valid = true;
-                if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                if (!args.out.couldBe(arrayOut[i * 4 + j], 0.0005)) {
                     valid = false;
                 }
                 if (!valid) {
@@ -205,7 +205,7 @@
                     message.append("Actual   output out: ");
                     message.append(String.format("%14.8g {%8x} %15a",
                             arrayOut[i * 4 + j], Float.floatToRawIntBits(arrayOut[i * 4 + j]), arrayOut[i * 4 + j]));
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                    if (!args.out.couldBe(arrayOut[i * 4 + j], 0.0005)) {
                         message.append(" FAIL");
                     }
                     message.append("\n");
@@ -249,7 +249,7 @@
                 CoreMathVerifier.computeNativeAtanpi(args, target);
                 // Validate the outputs.
                 boolean valid = true;
-                if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                if (!args.out.couldBe(arrayOut[i * 4 + j], 0.0005)) {
                     valid = false;
                 }
                 if (!valid) {
@@ -264,7 +264,7 @@
                     message.append("Actual   output out: ");
                     message.append(String.format("%14.8g {%8x} %15a",
                             arrayOut[i * 4 + j], Float.floatToRawIntBits(arrayOut[i * 4 + j]), arrayOut[i * 4 + j]));
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                    if (!args.out.couldBe(arrayOut[i * 4 + j], 0.0005)) {
                         message.append(" FAIL");
                     }
                     message.append("\n");
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/TestNativeSincos.java b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeSincos.java
index c497ed0..380f2b4 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/TestNativeSincos.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestNativeSincos.java
@@ -79,10 +79,10 @@
                 CoreMathVerifier.computeNativeSincos(args, target);
                 // Validate the outputs.
                 boolean valid = true;
-                if (!args.outCosptr.couldBe(arrayOutCosptr[i * 1 + j])) {
+                if (!args.outCosptr.couldBe(arrayOutCosptr[i * 1 + j], 0.0005)) {
                     valid = false;
                 }
-                if (!args.out.couldBe(arrayOut[i * 1 + j])) {
+                if (!args.out.couldBe(arrayOut[i * 1 + j], 0.0005)) {
                     valid = false;
                 }
                 if (!valid) {
@@ -97,7 +97,7 @@
                     message.append("Actual   output outCosptr: ");
                     message.append(String.format("%14.8g {%8x} %15a",
                             arrayOutCosptr[i * 1 + j], Float.floatToRawIntBits(arrayOutCosptr[i * 1 + j]), arrayOutCosptr[i * 1 + j]));
-                    if (!args.outCosptr.couldBe(arrayOutCosptr[i * 1 + j])) {
+                    if (!args.outCosptr.couldBe(arrayOutCosptr[i * 1 + j], 0.0005)) {
                         message.append(" FAIL");
                     }
                     message.append("\n");
@@ -107,7 +107,7 @@
                     message.append("Actual   output out: ");
                     message.append(String.format("%14.8g {%8x} %15a",
                             arrayOut[i * 1 + j], Float.floatToRawIntBits(arrayOut[i * 1 + j]), arrayOut[i * 1 + j]));
-                    if (!args.out.couldBe(arrayOut[i * 1 + j])) {
+                    if (!args.out.couldBe(arrayOut[i * 1 + j], 0.0005)) {
                         message.append(" FAIL");
                     }
                     message.append("\n");
@@ -157,10 +157,10 @@
                 CoreMathVerifier.computeNativeSincos(args, target);
                 // Validate the outputs.
                 boolean valid = true;
-                if (!args.outCosptr.couldBe(arrayOutCosptr[i * 2 + j])) {
+                if (!args.outCosptr.couldBe(arrayOutCosptr[i * 2 + j], 0.0005)) {
                     valid = false;
                 }
-                if (!args.out.couldBe(arrayOut[i * 2 + j])) {
+                if (!args.out.couldBe(arrayOut[i * 2 + j], 0.0005)) {
                     valid = false;
                 }
                 if (!valid) {
@@ -175,7 +175,7 @@
                     message.append("Actual   output outCosptr: ");
                     message.append(String.format("%14.8g {%8x} %15a",
                             arrayOutCosptr[i * 2 + j], Float.floatToRawIntBits(arrayOutCosptr[i * 2 + j]), arrayOutCosptr[i * 2 + j]));
-                    if (!args.outCosptr.couldBe(arrayOutCosptr[i * 2 + j])) {
+                    if (!args.outCosptr.couldBe(arrayOutCosptr[i * 2 + j], 0.0005)) {
                         message.append(" FAIL");
                     }
                     message.append("\n");
@@ -185,7 +185,7 @@
                     message.append("Actual   output out: ");
                     message.append(String.format("%14.8g {%8x} %15a",
                             arrayOut[i * 2 + j], Float.floatToRawIntBits(arrayOut[i * 2 + j]), arrayOut[i * 2 + j]));
-                    if (!args.out.couldBe(arrayOut[i * 2 + j])) {
+                    if (!args.out.couldBe(arrayOut[i * 2 + j], 0.0005)) {
                         message.append(" FAIL");
                     }
                     message.append("\n");
@@ -235,10 +235,10 @@
                 CoreMathVerifier.computeNativeSincos(args, target);
                 // Validate the outputs.
                 boolean valid = true;
-                if (!args.outCosptr.couldBe(arrayOutCosptr[i * 4 + j])) {
+                if (!args.outCosptr.couldBe(arrayOutCosptr[i * 4 + j], 0.0005)) {
                     valid = false;
                 }
-                if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                if (!args.out.couldBe(arrayOut[i * 4 + j], 0.0005)) {
                     valid = false;
                 }
                 if (!valid) {
@@ -253,7 +253,7 @@
                     message.append("Actual   output outCosptr: ");
                     message.append(String.format("%14.8g {%8x} %15a",
                             arrayOutCosptr[i * 4 + j], Float.floatToRawIntBits(arrayOutCosptr[i * 4 + j]), arrayOutCosptr[i * 4 + j]));
-                    if (!args.outCosptr.couldBe(arrayOutCosptr[i * 4 + j])) {
+                    if (!args.outCosptr.couldBe(arrayOutCosptr[i * 4 + j], 0.0005)) {
                         message.append(" FAIL");
                     }
                     message.append("\n");
@@ -263,7 +263,7 @@
                     message.append("Actual   output out: ");
                     message.append(String.format("%14.8g {%8x} %15a",
                             arrayOut[i * 4 + j], Float.floatToRawIntBits(arrayOut[i * 4 + j]), arrayOut[i * 4 + j]));
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                    if (!args.out.couldBe(arrayOut[i * 4 + j], 0.0005)) {
                         message.append(" FAIL");
                     }
                     message.append("\n");
@@ -313,10 +313,10 @@
                 CoreMathVerifier.computeNativeSincos(args, target);
                 // Validate the outputs.
                 boolean valid = true;
-                if (!args.outCosptr.couldBe(arrayOutCosptr[i * 4 + j])) {
+                if (!args.outCosptr.couldBe(arrayOutCosptr[i * 4 + j], 0.0005)) {
                     valid = false;
                 }
-                if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                if (!args.out.couldBe(arrayOut[i * 4 + j], 0.0005)) {
                     valid = false;
                 }
                 if (!valid) {
@@ -331,7 +331,7 @@
                     message.append("Actual   output outCosptr: ");
                     message.append(String.format("%14.8g {%8x} %15a",
                             arrayOutCosptr[i * 4 + j], Float.floatToRawIntBits(arrayOutCosptr[i * 4 + j]), arrayOutCosptr[i * 4 + j]));
-                    if (!args.outCosptr.couldBe(arrayOutCosptr[i * 4 + j])) {
+                    if (!args.outCosptr.couldBe(arrayOutCosptr[i * 4 + j], 0.0005)) {
                         message.append(" FAIL");
                     }
                     message.append("\n");
@@ -341,7 +341,7 @@
                     message.append("Actual   output out: ");
                     message.append(String.format("%14.8g {%8x} %15a",
                             arrayOut[i * 4 + j], Float.floatToRawIntBits(arrayOut[i * 4 + j]), arrayOut[i * 4 + j]));
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                    if (!args.out.couldBe(arrayOut[i * 4 + j], 0.0005)) {
                         message.append(" FAIL");
                     }
                     message.append("\n");
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/intrinsic_lut.rs b/tests/tests/renderscript/src/android/renderscript/cts/intrinsic_lut.rs
new file mode 100644
index 0000000..8852085
--- /dev/null
+++ b/tests/tests/renderscript/src/android/renderscript/cts/intrinsic_lut.rs
@@ -0,0 +1,32 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "shared.rsh"
+
+short red[256];
+short green[256];
+short blue[256];
+short alpha[256];
+
+uchar4 __attribute__((kernel)) root(uchar4 in) {
+    uchar4 tmp;
+    tmp.r = red[in.r];
+    tmp.g = green[in.g];
+    tmp.b = blue[in.b];
+    tmp.a = alpha[in.a];
+    return tmp;
+}
+
diff --git a/tests/tests/sax/Android.mk b/tests/tests/sax/Android.mk
index 2ed7644..a468778 100644
--- a/tests/tests/sax/Android.mk
+++ b/tests/tests/sax/Android.mk
@@ -27,8 +27,6 @@
 
 LOCAL_PACKAGE_NAME := CtsSaxTestCases
 
-LOCAL_INSTRUMENTATION_FOR := CtsTestStubs
-
 LOCAL_SDK_VERSION := current
 
 include $(BUILD_CTS_PACKAGE)
diff --git a/tests/tests/sax/AndroidManifest.xml b/tests/tests/sax/AndroidManifest.xml
index d1a6f91..63c568b 100644
--- a/tests/tests/sax/AndroidManifest.xml
+++ b/tests/tests/sax/AndroidManifest.xml
@@ -23,7 +23,7 @@
     </application>
 
     <instrumentation android:name="android.support.test.runner.AndroidJUnitRunner"
-                     android:targetPackage="com.android.cts.stub"
+                     android:targetPackage="com.android.cts.sax"
                      android:label="CTS tests of android.sax">
         <meta-data android:name="listener"
             android:value="com.android.cts.runner.CtsTestRunListener" />
diff --git a/tests/tests/security/jni/android_security_cts_NativeCodeTest.cpp b/tests/tests/security/jni/android_security_cts_NativeCodeTest.cpp
index dde06a2..faa6eea 100644
--- a/tests/tests/security/jni/android_security_cts_NativeCodeTest.cpp
+++ b/tests/tests/security/jni/android_security_cts_NativeCodeTest.cpp
@@ -30,6 +30,7 @@
 #include <stdlib.h>
 #include <sys/mman.h>
 #include <sys/stat.h>
+#include <sys/utsname.h>
 #include <fcntl.h>
 #include <cutils/log.h>
 #include <linux/perf_event.h>
@@ -102,6 +103,17 @@
     struct iovec iov;
     struct sock_diag_req* sock_diag_data;
 
+    int major, minor;
+    struct utsname uts;
+    if (uname(&uts) != -1 &&
+        sscanf(uts.release, "%d.%d", &major, &minor) == 2 &&
+        ((major > 3) || ((major == 3) && (minor > 8)))) {
+        // Kernels above 3.8 are patched against CVE-2013-1763
+        // This test generates false positives if run on > 3.8.
+        // b/17253473
+        return PASSED;
+    }
+
     fd = socket(AF_NETLINK, SOCK_RAW, NETLINK_SOCK_DIAG);
     if (fd == -1) {
         switch (errno) {
diff --git a/tests/tests/security/src/android/security/cts/SqliteJournalLeakTest.java b/tests/tests/security/src/android/security/cts/SqliteJournalLeakTest.java
deleted file mode 100644
index 109aa21..0000000
--- a/tests/tests/security/src/android/security/cts/SqliteJournalLeakTest.java
+++ /dev/null
@@ -1,115 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.security.cts;
-
-import android.content.Intent;
-import android.net.Uri;
-import android.os.Environment;
-import android.test.AndroidTestCase;
-
-import java.io.BufferedReader;
-import java.io.File;
-import java.io.FileNotFoundException;
-import java.io.FileOutputStream;
-import java.io.FileReader;
-import java.io.InputStreamReader;
-import java.io.IOException;
-
-
-public class SqliteJournalLeakTest extends AndroidTestCase {
-
-    private static final int REPEAT = 5;
-
-    private static final String[] DATABASES = {
-        "/com.android.bluetooth/databases/btopp.db",
-        "/com.android.browser/app_appcache/ApplicationCache.db",
-        "/com.android.browser/app_databases/Databases.db",
-        "/com.android.browser/app_geolocation/CachedGeoposition.db",
-        "/com.android.browser/app_geolocation/GeolocationPermissions.db",
-        "/com.android.browser/app_icons/WebpageIcons.db",
-        "/com.android.browser/databases/browser.db",
-        "/com.android.browser/databases/launcher.db",
-        "/com.android.browser/databases/webview.db",
-        "/com.android.browser/databases/webviewCache.db",
-        "/com.android.email/databases/EmailProvider.db",
-        "/com.android.email/databases/EmailProviderBody.db",
-        "/com.android.email/databases/webview.db",
-        "/com.android.email/databases/webviewCache.db",
-        "/com.android.providers.calendar/databases/calendar.db",
-        "/com.android.providers.contacts/databases/contacts2.db",
-        "/com.android.providers.downloads/databases/downloads.db",
-        "/com.android.providers.drm/databases/drm.db",
-        "/com.android.providers.media/databases/internal.db",
-        "/com.android.providers.settings/databases/settings.db",
-        "/com.android.providers.tasks/databases/tasks.db",
-        "/com.android.providers.telephony/optable.db",
-        "/com.android.providers.telephony/databases/mmssms.db",
-        "/com.android.providers.telephony/databases/nwk_info.db",
-        "/com.android.providers.telephony/databases/telephony.db",
-        "/com.android.providers.telephony/databases/tether_dun.db",
-        "/com.android.providers.userdictionary/databases/user_dict.db",
-        "/com.android.settings/databases/webview.db",
-        "/com.android.settings/databases/webviewCache.db",
-        "/com.android.vending/databases/billing4.db",
-        "/com.android.vending/databases/market_assets.db",
-        "/com.android.vending/databases/suggestions.db",
-        "/com.android.vending/databases/webview.db",
-        "/com.android.vending/databases/webviewCache.db"
-    };
-
-    /**
-     * This method triggers activities that should cause database writes.
-     * The goal of this is to try to make potentially short-lived journal
-     * files show up.
-     */
-    private void doActivity() {
-        Intent webIntent = new Intent(Intent.ACTION_VIEW);
-        webIntent.setData(Uri.parse("http:///localhost"));
-        webIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
-        getContext().startActivity(webIntent);
-        Intent dictIntent = new Intent("android.settings.USER_DICTIONARY_SETTINGS");
-        dictIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
-        getContext().startActivity(dictIntent);
-    }
-
-    private void checkDatabases(String suffix) {
-        String msg = " is world readable. Please set its permissions to 600"
-            + " by setting -DSQLITE_DEFAULT_FILE_PERMISSIONS=0600 in external/sqlite/dist/"
-            + "Android.mk; see CVE-2011-3901.";
-        String base = Environment.getDataDirectory().getAbsolutePath();
-        for(int i=REPEAT; i > 0; i--) {
-            doActivity();
-            for (String name : DATABASES) {
-                name = base + "/data" + name + suffix;
-                File f = new File(name);
-                assertFalse(name + msg, f.canRead());
-            }
-        }
-    }
-
-    public void testJournal() {
-        checkDatabases("-journal");
-    }
-
-    public void testWal() {
-        checkDatabases("-wal");
-    }
-
-    public void testShm() {
-        checkDatabases("-shm");
-    }
-}
diff --git a/tests/tests/speech/Android.mk b/tests/tests/speech/Android.mk
index 75f7e4c..6bec012 100755
--- a/tests/tests/speech/Android.mk
+++ b/tests/tests/speech/Android.mk
@@ -29,6 +29,4 @@
 
 LOCAL_SDK_VERSION := current
 
-LOCAL_INSTRUMENTATION_FOR := CtsTestStubs
-
 include $(BUILD_CTS_PACKAGE)
diff --git a/tests/tests/speech/AndroidManifest.xml b/tests/tests/speech/AndroidManifest.xml
index 788f7cc..2e7f0b6 100755
--- a/tests/tests/speech/AndroidManifest.xml
+++ b/tests/tests/speech/AndroidManifest.xml
@@ -21,12 +21,20 @@
     <uses-permission android:name="android.permission.DISABLE_KEYGUARD" />
     <application>
         <uses-library android:name="android.test.runner" />
+
+        <service android:name="android.speech.tts.cts.StubTextToSpeechService">
+            <intent-filter>
+                <action android:name="android.intent.action.TTS_SERVICE" />
+                <category android:name="android.intent.category.DEFAULT" />
+            </intent-filter>
+        </service>
+
     </application>
 
     <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
 
     <instrumentation android:name="android.support.test.runner.AndroidJUnitRunner"
-                     android:targetPackage="com.android.cts.stub"
+                     android:targetPackage="com.android.cts.speech"
                      android:label="CTS tests of android.speech">
         <meta-data android:name="listener"
             android:value="com.android.cts.runner.CtsTestRunListener" />
diff --git a/tests/src/android/speech/tts/cts/StubTextToSpeechService.java b/tests/tests/speech/src/android/speech/tts/cts/StubTextToSpeechService.java
similarity index 100%
rename from tests/src/android/speech/tts/cts/StubTextToSpeechService.java
rename to tests/tests/speech/src/android/speech/tts/cts/StubTextToSpeechService.java
diff --git a/tests/tests/speech/src/android/speech/tts/cts/TextToSpeechWrapper.java b/tests/tests/speech/src/android/speech/tts/cts/TextToSpeechWrapper.java
index cba242f..f0d55bf 100644
--- a/tests/tests/speech/src/android/speech/tts/cts/TextToSpeechWrapper.java
+++ b/tests/tests/speech/src/android/speech/tts/cts/TextToSpeechWrapper.java
@@ -34,7 +34,7 @@
 public class TextToSpeechWrapper {
     private static final String LOG_TAG = "TextToSpeechServiceTest";
 
-    public static final String MOCK_TTS_ENGINE = "com.android.cts.stub";
+    public static final String MOCK_TTS_ENGINE = "com.android.cts.speech";
 
     private final Context mContext;
     private TextToSpeech mTts;
diff --git a/tests/tests/telecomm/Android.mk b/tests/tests/telecomm/Android.mk
index 70ed780..de1d8b3 100644
--- a/tests/tests/telecomm/Android.mk
+++ b/tests/tests/telecomm/Android.mk
@@ -28,7 +28,7 @@
 
 LOCAL_SRC_FILES := $(call all-java-files-under, src)
 
-LOCAL_PACKAGE_NAME := CtsTelecommTestCases
+LOCAL_PACKAGE_NAME := CtsTelecomTestCases
 
 LOCAL_INSTRUMENTATION_FOR := CtsTestStubs
 
diff --git a/tests/tests/telecomm/AndroidManifest.xml b/tests/tests/telecomm/AndroidManifest.xml
index 9f7b307..97906c6 100644
--- a/tests/tests/telecomm/AndroidManifest.xml
+++ b/tests/tests/telecomm/AndroidManifest.xml
@@ -15,18 +15,18 @@
 -->
 
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
-    package="com.android.cts.telecomm">
+    package="com.android.cts.telecom">
 
     <uses-permission android:name="android.permission.DISABLE_KEYGUARD" />
     <!-- We won't be granted this, but we should at least ask for it (to make sure we don't get it). -->
-    <uses-permission android:name="com.android.telecomm.permission.REGISTER_PROVIDER_OR_SUBSCRIPTION" />
+    <uses-permission android:name="com.android.server.telecom.permission.REGISTER_PROVIDER_OR_SUBSCRIPTION" />
     <application>
         <uses-library android:name="android.test.runner" />
     </application>
 
     <instrumentation android:name="android.support.test.runner.AndroidJUnitRunner"
                      android:targetPackage="com.android.cts.stub"
-                     android:label="CTS tests of android.telecomm">
+                     android:label="CTS tests of android.telecom">
         <meta-data android:name="listener"
             android:value="com.android.cts.runner.CtsTestRunListener" />
     </instrumentation>
diff --git a/tests/tests/telecomm/src/android/telecom/cts/ConnectionTest.java b/tests/tests/telecomm/src/android/telecom/cts/ConnectionTest.java
new file mode 100644
index 0000000..e552733
--- /dev/null
+++ b/tests/tests/telecomm/src/android/telecom/cts/ConnectionTest.java
@@ -0,0 +1,111 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.telecom.cts;
+
+import android.telecom.Connection;
+import android.telecom.DisconnectCause;
+import android.test.AndroidTestCase;
+
+import java.util.concurrent.Semaphore;
+import java.util.concurrent.TimeUnit;
+
+public class ConnectionTest extends AndroidTestCase {
+    public void testStateCallbacks() {
+        final Semaphore lock = new Semaphore(0);
+        Connection connection = createConnection(lock);
+
+        waitForStateChange(lock);
+        assertEquals(Connection.STATE_NEW, connection.getState());
+
+        connection.setInitializing();
+        waitForStateChange(lock);
+        assertEquals(Connection.STATE_INITIALIZING, connection.getState());
+
+        connection.setInitialized();
+        waitForStateChange(lock);
+        assertEquals(Connection.STATE_NEW, connection.getState());
+
+        connection.setRinging();
+        waitForStateChange(lock);
+        assertEquals(Connection.STATE_RINGING, connection.getState());
+
+        connection.setDialing();
+        waitForStateChange(lock);
+        assertEquals(Connection.STATE_DIALING, connection.getState());
+
+        connection.setActive();
+        waitForStateChange(lock);
+        assertEquals(Connection.STATE_ACTIVE, connection.getState());
+
+        connection.setOnHold();
+        waitForStateChange(lock);
+        assertEquals(Connection.STATE_HOLDING, connection.getState());
+
+        connection.setDisconnected(
+                new DisconnectCause(DisconnectCause.LOCAL, "Test call"));
+        waitForStateChange(lock);
+        assertEquals(Connection.STATE_DISCONNECTED, connection.getState());
+
+        connection.setRinging();
+        waitForStateChange(lock);
+        assertEquals("Connection should not move out of STATE_DISCONNECTED.",
+                Connection.STATE_DISCONNECTED, connection.getState());
+    }
+
+    public void testFailedState() {
+        Connection connection = Connection.createFailedConnection(
+                new DisconnectCause(DisconnectCause.LOCAL, "Test call"));
+        assertEquals(Connection.STATE_DISCONNECTED, connection.getState());
+
+        connection.setRinging();
+        assertEquals("Connection should not move out of STATE_DISCONNECTED.",
+                Connection.STATE_DISCONNECTED, connection.getState());
+    }
+
+    public void testCanceledState() {
+        Connection connection = Connection.createCanceledConnection();
+        assertEquals(Connection.STATE_DISCONNECTED, connection.getState());
+
+        connection.setDialing();
+        assertEquals("Connection should not move out of STATE_DISCONNECTED",
+                Connection.STATE_DISCONNECTED, connection.getState());
+    }
+
+    private static Connection createConnection(final Semaphore lock) {
+        Connection.Listener listener = new Connection.Listener() {
+            @Override
+            public void onStateChanged(Connection c, int state) {
+                lock.release();
+            }
+        };
+
+        Connection connection = new BasicConnection();
+        connection.addConnectionListener(listener);
+        return connection;
+    }
+
+    private static void waitForStateChange(Semaphore lock) {
+        try {
+            lock.tryAcquire(1000, TimeUnit.MILLISECONDS);
+        } catch (InterruptedException e) {
+            fail("State transition timed out");
+        }
+    }
+
+    private static final class BasicConnection extends Connection {
+    }
+}
diff --git a/tests/tests/telecomm/src/android/telecom/cts/TelecomManagerTest.java b/tests/tests/telecomm/src/android/telecom/cts/TelecomManagerTest.java
new file mode 100644
index 0000000..8f97d77
--- /dev/null
+++ b/tests/tests/telecomm/src/android/telecom/cts/TelecomManagerTest.java
@@ -0,0 +1,63 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.telecom.cts;
+
+import android.content.ComponentName;
+import android.content.pm.PackageManager;
+import android.net.Uri;
+import android.telecom.PhoneAccount;
+import android.telecom.PhoneAccountHandle;
+import android.telecom.PhoneCapabilities;
+import android.telecom.TelecomManager;
+import android.test.AndroidTestCase;
+import android.util.Log;
+
+import java.util.List;
+
+public class TelecomManagerTest extends AndroidTestCase {
+    private static final String TAG = "TelecommManagerTest";
+
+    public void testRegisterAccountsBlocked() {
+        PackageManager pm = getContext().getPackageManager();
+        if (!pm.hasSystemFeature(PackageManager.FEATURE_CONNECTION_SERVICE)) {
+            Log.d(TAG, "Skipping the test because FEATURE_CONNECTION_SERVICE is disabled.");
+            return;
+        }
+
+        PhoneAccount phoneAccount = new PhoneAccount.Builder(
+                new PhoneAccountHandle(
+                        new ComponentName(getContext(), TelecomManagerTest.class),
+                        "testRegisterAccountsBlocked"),
+                "Mock PhoneAccount")
+                .setAddress(Uri.parse("tel:6502637643"))
+                .setSubscriptionAddress(Uri.parse("tel:650-263-7643"))
+                .setCapabilities(PhoneCapabilities.ALL)
+                .setIconResId(0)
+                .setShortDescription("PhoneAccount used in TelecomManagerTest")
+                .build();
+
+        TelecomManager tm = TelecomManager.from(getContext());
+        List<PhoneAccountHandle> handles = tm.getCallCapablePhoneAccounts();
+
+        try {
+            tm.registerPhoneAccount(phoneAccount);
+            fail("This should have failed (CTS can't get the permission)");
+        } catch (SecurityException e) {
+            assertEquals(handles, tm.getCallCapablePhoneAccounts());
+        }
+    }
+}
diff --git a/tests/tests/telecomm/src/android/telecomm/cts/ConnectionTest.java b/tests/tests/telecomm/src/android/telecomm/cts/ConnectionTest.java
deleted file mode 100644
index 0883cff..0000000
--- a/tests/tests/telecomm/src/android/telecomm/cts/ConnectionTest.java
+++ /dev/null
@@ -1,110 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.telecomm.cts;
-
-import android.telecomm.Connection;
-import android.telephony.DisconnectCause;
-import android.test.AndroidTestCase;
-
-import java.util.concurrent.Semaphore;
-import java.util.concurrent.TimeUnit;
-
-public class ConnectionTest extends AndroidTestCase {
-    public void testStateCallbacks() {
-        final Semaphore lock = new Semaphore(0);
-        Connection connection = createConnection(lock);
-
-        waitForStateChange(lock);
-        assertEquals(Connection.STATE_NEW, connection.getState());
-
-        connection.setInitializing();
-        waitForStateChange(lock);
-        assertEquals(Connection.STATE_INITIALIZING, connection.getState());
-
-        connection.setInitialized();
-        waitForStateChange(lock);
-        assertEquals(Connection.STATE_NEW, connection.getState());
-
-        connection.setRinging();
-        waitForStateChange(lock);
-        assertEquals(Connection.STATE_RINGING, connection.getState());
-
-        connection.setDialing();
-        waitForStateChange(lock);
-        assertEquals(Connection.STATE_DIALING, connection.getState());
-
-        connection.setActive();
-        waitForStateChange(lock);
-        assertEquals(Connection.STATE_ACTIVE, connection.getState());
-
-        connection.setOnHold();
-        waitForStateChange(lock);
-        assertEquals(Connection.STATE_HOLDING, connection.getState());
-
-        connection.setDisconnected(DisconnectCause.LOCAL, "Test call");
-        waitForStateChange(lock);
-        assertEquals(Connection.STATE_DISCONNECTED, connection.getState());
-
-        connection.setRinging();
-        waitForStateChange(lock);
-        assertEquals("Connection should not move out of STATE_DISCONNECTED.",
-                Connection.STATE_DISCONNECTED, connection.getState());
-    }
-
-    public void testFailedState() {
-        Connection connection =
-                Connection.createFailedConnection(DisconnectCause.LOCAL, "Test call");
-        assertEquals(Connection.STATE_DISCONNECTED, connection.getState());
-
-        connection.setRinging();
-        assertEquals("Connection should not move out of STATE_DISCONNECTED.",
-                Connection.STATE_DISCONNECTED, connection.getState());
-    }
-
-    public void testCanceledState() {
-        Connection connection = Connection.createCanceledConnection();
-        assertEquals(Connection.STATE_DISCONNECTED, connection.getState());
-
-        connection.setDialing();
-        assertEquals("Connection should not move out of STATE_DISCONNECTED",
-                Connection.STATE_DISCONNECTED, connection.getState());
-    }
-
-    private static Connection createConnection(final Semaphore lock) {
-        Connection.Listener listener = new Connection.Listener() {
-            @Override
-            public void onStateChanged(Connection c, int state) {
-                lock.release();
-            }
-        };
-
-        Connection connection = new BasicConnection();
-        connection.addConnectionListener(listener);
-        return connection;
-    }
-
-    private static void waitForStateChange(Semaphore lock) {
-        try {
-            lock.tryAcquire(1000, TimeUnit.MILLISECONDS);
-        } catch (InterruptedException e) {
-            fail("State transition timed out");
-        }
-    }
-
-    private static final class BasicConnection extends Connection {
-    }
-}
diff --git a/tests/tests/telecomm/src/android/telecomm/cts/TelecommManagerTest.java b/tests/tests/telecomm/src/android/telecomm/cts/TelecommManagerTest.java
deleted file mode 100644
index 3c218e0..0000000
--- a/tests/tests/telecomm/src/android/telecomm/cts/TelecommManagerTest.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.telecomm.cts;
-
-import android.content.ComponentName;
-import android.net.Uri;
-import android.telecomm.PhoneAccount;
-import android.telecomm.PhoneAccountHandle;
-import android.telecomm.PhoneCapabilities;
-import android.telecomm.TelecommManager;
-import android.test.AndroidTestCase;
-
-import java.util.List;
-
-public class TelecommManagerTest extends AndroidTestCase {
-    public void testRegisterAccountsBlocked() {
-        PhoneAccount phoneAccount = new PhoneAccount.Builder(
-                new PhoneAccountHandle(
-                        new ComponentName(getContext(), TelecommManagerTest.class),
-                        "testRegisterAccountsBlocked"),
-                "Mock PhoneAccount")
-                .setAddress(Uri.parse("tel:6502637643"))
-                .setSubscriptionAddress(Uri.parse("tel:650-263-7643"))
-                .setCapabilities(PhoneCapabilities.ALL)
-                .setIconResId(0)
-                .setShortDescription("PhoneAccount used in TelecommManagerTest")
-                .build();
-
-        TelecommManager tm = TelecommManager.from(getContext());
-        List<PhoneAccountHandle> handles = tm.getEnabledPhoneAccounts();
-
-        try {
-            tm.registerPhoneAccount(phoneAccount);
-            fail("This should have failed (CTS can't get the permission)");
-        } catch (SecurityException e) {
-            assertEquals(handles, tm.getEnabledPhoneAccounts());
-        }
-    }
-}
diff --git a/tests/tests/telephony/src/android/telephony/cts/SimRestrictedApisTest.java b/tests/tests/telephony/src/android/telephony/cts/SimRestrictedApisTest.java
index 8cf6752..18b0d12 100644
--- a/tests/tests/telephony/src/android/telephony/cts/SimRestrictedApisTest.java
+++ b/tests/tests/telephony/src/android/telephony/cts/SimRestrictedApisTest.java
@@ -35,13 +35,13 @@
     }
 
     /**
-     * Tests the SmsManager.injectSmsPdu() API. This makes a call to updateMmsDownloadStatus() API
-     * and expects a SecurityException since the test apk is not signed by a certificate on the
-     * SIM.
+     * Tests the SmsManager.updateMmsDownloadStatus() API. This makes a call to
+     * updateMmsDownloadStatus() API and expects a SecurityException since the test apk is not
+     * signed by a certificate on the SIM.
      */
     public void testUpdateMmsDownloadStatus() {
         try {
-            SmsManager.getDefault().updateMmsDownloadStatus(0, TEST_PDU);
+            SmsManager.getDefault().updateMmsDownloadStatus(null, 0, 0, null);
             fail("Expected SecurityException. App doesn't have carrier privileges.");
         } catch (SecurityException expected) {}
     }
@@ -53,7 +53,7 @@
      */
     public void testUpdateMmsSendStatus() {
         try {
-            SmsManager.getDefault().updateMmsSendStatus(0, false);
+            SmsManager.getDefault().updateMmsSendStatus(null, 0, TEST_PDU, 0, null);
             fail("Expected SecurityException. App doesn't have carrier privileges.");
         } catch (SecurityException expected) {}
     }
diff --git a/tests/tests/text/Android.mk b/tests/tests/text/Android.mk
index ae14124..df2d324 100644
--- a/tests/tests/text/Android.mk
+++ b/tests/tests/text/Android.mk
@@ -23,14 +23,12 @@
 
 LOCAL_JAVA_LIBRARIES := android.test.runner
 
-LOCAL_STATIC_JAVA_LIBRARIES := ctstestrunner
+LOCAL_STATIC_JAVA_LIBRARIES := ctsdeviceutil ctstestrunner
 
 LOCAL_SRC_FILES := $(call all-java-files-under, src)
 
 LOCAL_PACKAGE_NAME := CtsTextTestCases
 
-LOCAL_INSTRUMENTATION_FOR := CtsTestStubs
-
 # uncomment when dalvik.annotation.Test* are removed or part of SDK
 #LOCAL_SDK_VERSION := current
 
diff --git a/tests/tests/text/AndroidManifest.xml b/tests/tests/text/AndroidManifest.xml
index 63f6d59..0b31354 100644
--- a/tests/tests/text/AndroidManifest.xml
+++ b/tests/tests/text/AndroidManifest.xml
@@ -19,12 +19,64 @@
     package="com.android.cts.text">
 
     <uses-permission android:name="android.permission.DISABLE_KEYGUARD" />
+    <uses-permission android:name="android.permission.WRITE_SETTINGS" />
     <application>
-        <uses-library android:name="android.test.runner" />
+        <uses-library android:name="android.test.runner"
+            android:maxRecents="1"/>
+
+        <activity android:name="android.text.cts.EmojiCtsActivity"
+            android:label="AvailableIntentsActivity">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="android.intent.category.FRAMEWORK_INSTRUMENTATION_TEST" />
+            </intent-filter>
+        </activity>
+
+        <activity android:name="android.text.method.cts.KeyListenerCtsActivity"
+            android:label="KeyListenerCtsActivity"/>
+
+        <activity android:name="android.text.method.cts.CtsActivity"
+            android:label="CtsActivity">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="android.intent.category.FRAMEWORK_INSTRUMENTATION_TEST" />
+            </intent-filter>
+        </activity>
+
+        <activity android:name="android.text.style.cts.URLSpanCtsActivity"
+            android:label="URLSpanCtsActivity">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="android.intent.category.FRAMEWORK_INSTRUMENTATION_TEST" />
+            </intent-filter>
+        </activity>
+
+        <activity android:name="android.text.style.cts.MockURLSpanTestActivity"
+            android:label="MockURLSpanTestActivity"
+            android:launchMode="singleTask"
+            android:alwaysRetainTaskState="true"
+            android:configChanges="orientation|keyboardHidden">
+            <intent-filter>
+                <action android:name="android.intent.action.VIEW" />
+                <category android:name="android.intent.category.DEFAULT" />
+                <category android:name="android.intent.category.BROWSABLE" />
+                <category android:name="android.intent.category.FRAMEWORK_INSTRUMENTATION_TEST" />
+                <data android:scheme="ctstest" />
+            </intent-filter>
+        </activity>
+
+        <activity android:name="android.text.method.cts.CtsActivity"
+            android:label="CtsActivity">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="android.intent.category.FRAMEWORK_INSTRUMENTATION_TEST" />
+            </intent-filter>
+        </activity>
+
     </application>
 
     <instrumentation android:name="android.support.test.runner.AndroidJUnitRunner"
-                     android:targetPackage="com.android.cts.stub"
+                     android:targetPackage="com.android.cts.text"
                      android:label="CTS tests of android.text">
         <meta-data android:name="listener"
             android:value="com.android.cts.runner.CtsTestRunListener" />
diff --git a/tests/tests/text/res/drawable/pass.jpg b/tests/tests/text/res/drawable/pass.jpg
new file mode 100644
index 0000000..2f4b083
--- /dev/null
+++ b/tests/tests/text/res/drawable/pass.jpg
Binary files differ
diff --git a/tests/tests/text/res/drawable/scenery.jpg b/tests/tests/text/res/drawable/scenery.jpg
new file mode 100644
index 0000000..7a6145b
--- /dev/null
+++ b/tests/tests/text/res/drawable/scenery.jpg
Binary files differ
diff --git a/tests/tests/text/res/layout/keylistener_layout.xml b/tests/tests/text/res/layout/keylistener_layout.xml
new file mode 100644
index 0000000..96a419d
--- /dev/null
+++ b/tests/tests/text/res/layout/keylistener_layout.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ * Copyright (C) 2009 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ -->
+<TextView xmlns:android="http://schemas.android.com/apk/res/android"
+    android:id="@+id/keylistener_textview"
+    android:layout_width="wrap_content"
+    android:layout_height="wrap_content"
+/>
+
diff --git a/tests/tests/text/res/layout/urlspan_layout.xml b/tests/tests/text/res/layout/urlspan_layout.xml
new file mode 100644
index 0000000..2ca95ac
--- /dev/null
+++ b/tests/tests/text/res/layout/urlspan_layout.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ * Copyright (C) 2008 The Android Open Source Project.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ -->
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:orientation="vertical">
+
+    <TextView android:id="@+id/url"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:paddingLeft="4dip"
+        android:focusable="true"
+        android:focusableInTouchMode="true"
+        android:text="@string/text_view_hello"/>
+
+</LinearLayout>
diff --git a/tests/tests/text/res/layout/webview_layout.xml b/tests/tests/text/res/layout/webview_layout.xml
new file mode 100644
index 0000000..7a0ed0d
--- /dev/null
+++ b/tests/tests/text/res/layout/webview_layout.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ * Copyright (C) 2009 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ -->
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:orientation="vertical"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content">
+
+    <WebView android:id="@+id/web_page"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content" />
+</LinearLayout>
diff --git a/tests/tests/text/res/values/attrs.xml b/tests/tests/text/res/values/attrs.xml
new file mode 100644
index 0000000..4c3d9db
--- /dev/null
+++ b/tests/tests/text/res/values/attrs.xml
@@ -0,0 +1,145 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ * Copyright (C) 2008 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ -->
+
+<resources>
+    <declare-styleable name="Style1">
+        <attr name="Type1" format="integer">
+            <enum name="type" value="28" />
+            <enum name="data" value="0xff00ff00" />
+            <enum name="asset_cookie" value="0" />
+            <enum name="resource_id" value="0" />
+            <enum name="changing_config" value="0" />
+        </attr>
+        <attr name="Type2" format="integer">
+            <enum name="type" value="28" />
+            <enum name="data" value="0xff0000ff" />
+            <enum name="asset_cookie" value="0" />
+            <enum name="resource_id" value="0" />
+            <enum name="changing_config" value="0" />
+        </attr>
+    </declare-styleable>
+    <attr name="type1" format="boolean"/>
+    <attr name="type2" format="boolean"/>
+    <attr name="type3" format="color"/>
+    <attr name="type4" format="reference|color"/>
+    <attr name="type5" format="dimension"/>
+    <attr name="type6" format="dimension"/>
+    <attr name="type7" format="dimension"/>
+    <attr name="type8" format="reference"/>
+    <attr name="type9" format="float"/>
+    <attr name="type10" format="fraction"/>
+    <attr name="type11" format="integer"/>
+    <attr name="type12" format="integer"/>
+    <attr name="type13" format="reference|string"/>
+    <attr name="type14" format="string"/>
+    <attr name="type15" format="reference"/>
+    <attr name="type16" format="string"/>
+    <declare-styleable name="style1">
+        <attr name="type1"/>
+        <attr name="type2"/>
+        <attr name="type3"/>
+        <attr name="type4"/>
+        <attr name="type5"/>
+        <attr name="type6"/>
+        <attr name="type7"/>
+        <attr name="type8"/>
+        <attr name="type9"/>
+        <attr name="type10"/>
+        <attr name="type11"/>
+        <attr name="type12"/>
+        <attr name="type13"/>
+        <attr name="type14"/>
+        <attr name="type15"/>
+        <attr name="type16"/>
+    </declare-styleable>
+    <attr name="testEnum">
+        <enum name="val1" value="1" />
+        <enum name="val2" value="2" />
+        <enum name="val10" value="10" />
+    </attr>
+    <attr name="testFlags">
+        <flag name="bit1" value="0x1" />
+        <flag name="bit2" value="0x2" />
+        <flag name="bit31" value="0x40000000" />
+    </attr>
+    <attr name="testString" format="string" />
+    <declare-styleable name="EnumStyle">
+        <attr name="testEnum" />
+    </declare-styleable>
+    <declare-styleable name="FlagStyle">
+        <attr name="testFlags" />
+    </declare-styleable>
+    <declare-styleable name="TestConfig">
+        <attr name="testString" />
+    </declare-styleable>
+    <!-- Size of text. Recommended dimension type for text is "sp" for scaled-pixels (example: 15sp).
+         Supported values include the following:<p/>
+    <ul>
+        <li><b>px</b> Pixels</li>
+        <li><b>sp</b> Scaled pixels (scaled to relative pixel size on screen). See {@link android.util.DisplayMetrics} for more information.</li>
+        <li><b>pt</b> Points</li>
+        <li><b>dip</b> Device independent pixels. See {@link android.util.DisplayMetrics} for more information.</li>
+    </ul>
+    -->
+    <attr name="textSize" format="dimension" />
+    <attr name="typeface">
+        <enum name="normal" value="0" />
+        <enum name="sans" value="1" />
+        <enum name="serif" value="2" />
+        <enum name="monospace" value="3" />
+    </attr>
+    <!-- Default text typeface style. -->
+    <attr name="textStyle">
+        <flag name="normal" value="0" />
+        <flag name="bold" value="1" />
+        <flag name="italic" value="2" />
+    </attr>
+    <!-- Color of text (usually same as colorForeground). -->
+    <attr name="textColor" format="reference|color" />
+    <!-- Color of highlighted text. -->
+    <attr name="textColorHighlight" format="reference|color" />
+    <!-- Color of hint text (displayed when the field is empty). -->
+    <attr name="textColorHint" format="reference|color" />
+    <!-- Color of link text (URLs). -->
+    <attr name="textColorLink" format="reference|color" />
+    <declare-styleable name="TextAppearance">
+        <attr name="textColor"/>
+        <attr name="textSize"/>
+        <attr name="textStyle"/>
+        <attr name="typeface"/>
+        <attr name="textColorHighlight"/>
+        <attr name="textColorHint"/>
+        <attr name="textColorLink"/>
+    </declare-styleable>
+    <!-- Integer used to uniquely identify theme overrides. -->
+    <attr name="themeType" format="integer"/>
+    <!-- Theme reference used to override parent theme. -->
+    <attr name="themeOverrideAttr" format="reference"/>
+
+    <!-- Drawable theming attributes -->
+    <attr name="themeBoolean" />
+    <attr name="themeColor" />
+    <attr name="themeFloat" />
+    <attr name="themeInteger" />
+    <attr name="themeDimension" />
+    <attr name="themeDrawable" />
+    <attr name="themeBitmap" />
+    <attr name="themeNinePatch" />
+    <attr name="themeGravity" />
+    <attr name="themeTileMode" />
+    <attr name="themeAngle" />
+</resources>
diff --git a/tests/tests/text/res/values/strings.xml b/tests/tests/text/res/values/strings.xml
new file mode 100644
index 0000000..c167278
--- /dev/null
+++ b/tests/tests/text/res/values/strings.xml
@@ -0,0 +1,179 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2008 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="permlab_testGranted">Test Granted</string>
+    <string name="permdesc_testGranted">Used for running CTS tests, for testing operations
+        where we have the permission.</string>
+    <string name="permlab_testDynamic">Test Dynamic</string>
+    <string name="permdesc_testDynamic">Used for running CTS tests, for testing adding
+        dynamic permissions.</string>
+    <string name="permlab_testDenied">Test Denied</string>
+    <string name="permdesc_testDenied">Used for running CTS tests, for testing operations
+        where we do not have the permission.</string>
+    <string name="explain">1. click start. \n2. if above image shaked, then press pass button,
+         else press failed button.</string>
+    <string name="text_view_hello">Hello! Text view!</string>
+    <string name="text_view_hello_two_lines">Hello! \nText view!</string>
+    <string name="text_view_simple_hint">This is a hint.</string>
+    <string name="text_view_hint">This is a string for testing hint of textview.</string>
+    <string name="activity_forwarding">App/Forwarding</string>
+    <string name="forwarding">$$$</string>
+    <string name="go">Go</string>
+    <string name="back">Back</string>
+    <string name="forward_target">
+        Press back button and notice we don\'t see the previous activity.
+    </string>
+    <string name="edit_text">testing</string>
+    <string name="text">DialogTest</string>
+    <string name="text_country">Country</string>
+    <string name="text_name">Name</string>
+    <string name="hello_world">Hello, World!</string>
+    <string name="hello_android">Hello, Android!</string>
+    <string name="alert_dialog_username">Name:</string>
+    <string name="alert_dialog_password">Password:</string>
+    <string name="alert_dialog_positive">Positive</string>
+    <string name="alert_dialog_negative">Negative</string>
+    <string name="alert_dialog_neutral">Neutral</string>
+    <string name="notify">Notify </string>
+    <string name="tabs_1">testing</string>
+    <string name="table_layout_first">first</string>
+    <string name="table_layout_second">second</string>
+    <string name="table_layout_third">third</string>
+    <string name="table_layout_long">Very long to make the string out of the screen</string>
+    <string name="chronometer_text">Test Chronometer</string>
+    <string name="am">AM</string>
+    <string name="pm">PM</string>
+    <string name="viewgroup_test">ViewGroup test</string>
+    <string name="viewanimator_test">ViewAnimator test</string>
+    <string name="id_ok">OK</string>
+    <string name="id_cancel">Cancel</string>
+    <string name="context_test_string1">This is %s string.</string>
+    <string name="context_test_string2">This is test string.</string>
+    <string name="animationutils_test_instructions">Choose different animations</string>
+    <string name="animationutils_test_alpha">Alpha animation</string>
+    <string name="animationutils_test_scale">Scale animation</string>
+    <string name="animationutils_test_rotate">Rotate animation</string>
+    <string name="animationutils_test_translate">Translate animation</string>
+    <string name="animationutils_test_set">Animation set</string>
+    <string name="animationutils_test_layout">Layout animation</string>
+    <string name="animationutils_test_gridlayout">Grid layout animation</string>
+    <string name="twolinelistitem_test_text1">text1</string>
+    <string name="twolinelistitem_test_text2">text2</string>
+    <string name="metadata_text">metadata text</string>
+    <string name="horizontal_text_1">horizontal 1</string>
+    <string name="horizontal_text_2">horizontal 2</string>
+    <string name="horizontal_text_3">horizontal 3</string>
+    <string name="vertical_text_1">vertical 1</string>
+    <string name="vertical_text_2">vertical 2</string>
+    <string name="vertical_text_3">vertical 3</string>
+    <string name="reference">here</string>
+    <string name="coerceIntegerToString">100</string>
+    <string name="coerceBooleanToString">true</string>
+    <string name="coerceColorToString">#fff</string>
+    <string name="coerceFloatToString">100.0</string>
+    <string name="coerceDimensionToString">100px</string>
+    <string name="coerceFractionToString">100<xliff:g id="percent">%</xliff:g></string>
+    <string name="formattedStringNone">Format[]</string>
+    <string name="formattedStringOne">Format[<xliff:g id="format">%d</xliff:g>]</string>
+    <string name="formattedStringTwo">Format[<xliff:g id="format">%3$d,%2$s</xliff:g>]</string>
+    <string name="checkboxpref_key">checkboxpref_key</string>
+   <string name="checkboxpref_title">title of preference</string>
+   <string name="checkboxpref_summary">summary of preference</string>
+   <string name="checkboxpref_summary_on">summary on of preference</string>
+   <string name="checkboxpref_summary_off">summary off of preference</string>
+   <string name="checkboxpref_depend">checkboxpref_depend</string>
+   <string name="checkboxpref_depend_title"> depend title of preference</string>
+   <string name="checkboxpref_depend_summary"> depend summary of preference</string>
+   <string name="edittextpref_key">edittextpref_key</string>
+   <string name="edittextpref_default_value">default value of preference</string>
+   <string name="edittextpref_title">title of edit text preference</string>
+   <string name="edittextpref_summary">summary of edit text preference</string>
+   <string name="edittextpref_dialog_title">dialog title of edit text preference</string>
+   <string name="edittextpref_text">text of  edit text preference</string>
+   <string name="listpref_key">listpref_key</string>
+   <string name="listpref_title">title of list preference</string>
+   <string name="listpref_summary">summary of list preference</string>
+   <string name="listpref_dialogtitle">dialog title of list preference</string>
+   <string name="easy">Easy</string>
+   <string name="medium">Medium</string>
+   <string name="hard">Hard</string>
+   <string name="footer_view">Footer view</string>
+   <string name="header_view">Header view</string>
+   <string name="dialogpref_title">title of dialog preference </string>
+   <string name="dialogpref_dialog_title">dialog title of dialog preference </string>
+   <string name="dialogpref_key">dialogpref_key</string>
+   <string name="dialogpref_default_value">default value of dialog preference</string>
+   <string name="dialogpref_summary">summary of dialog preference</string>
+   <string name="dialogpref_message">message of dialog preference</string>
+   <string name="dialogpref_sure">Sure</string>
+   <string name="dialogpref_cancel">Cancel</string>
+   <string name="pref_key">pref_key</string>
+   <string name="pref_title">title of preference</string>
+   <string name="pref_summary">summary of preference</string>
+   <string name="pref_depend_key">pref_depend_key</string>
+   <string name="pref_depend_title"> depend title of preference</string>
+   <string name="pref_depend_summary"> depend summary of preference</string>
+   <string name="android_intent_action_preference">android.intent.action.PREFERENCE</string>
+   <string name="def_pref_key">def_pref_key</string>
+   <string name="def_pref_title">default preference</string>
+   <string name="def_pref_summary">This is default preference of cts</string>
+   <string name="relative_view1">view 1</string>
+   <string name="relative_view2">view 2</string>
+   <string name="relative_view3">view 3</string>
+   <string name="relative_view4">view 4</string>
+   <string name="relative_view5">view 5</string>
+   <string name="relative_view6">view 6</string>
+   <string name="relative_view7">view 7</string>
+   <string name="relative_view8">view 8</string>
+   <string name="relative_view9">view 9</string>
+   <string name="relative_view10">view 10</string>
+   <string name="relative_view11">view 11</string>
+   <string name="relative_view12">view 12</string>
+   <string name="relative_view13">view 13</string>
+   <string name="country">Country:</string>
+   <string name="symbol">Symbol:</string>
+   <string name="country_warning">No such country registered</string>
+   <string name="version_cur">base</string>
+   <string name="version_old">base</string>
+   <string name="version_v3">base</string>
+   <string name="authenticator_label">Android CTS</string>
+   <string name="search_label">Android CTS</string>
+   <string name="tag1">tag 1</string>
+   <string name="tag2">tag 2</string>
+
+   <string name="button">Button</string>
+   <string name="holo_test">Holo Test</string>
+   <string name="holo_generator">Holo Generator</string>
+   <string name="holo_light_test">Holo Light Test</string>
+   <string name="holo_light_generator">Holo Light Generator</string>
+   <string name="reference_image">Reference Image: </string>
+   <string name="generated_image">Generated Image: </string>
+   <string name="themes_prompt">Select a Theme:</string>
+   <string name="sample_text">Sample text goes here. I wanted something creative and whimsical
+but then I just got bored...</string>
+    <string name="long_text">This is a really long string which exceeds the width of the view.
+New devices have a much larger screen which actually enables long strings to be displayed
+with no fading. I have made this string longer to fix this case. If you are correcting this
+text, I would love to see the kind of devices you guys now use! Guys, maybe some devices need longer string!
+I think so, so how about double this string, like copy and paste!
+This is a really long string which exceeds the width of the view.
+New devices have a much larger screen which actually enables long strings to be displayed
+with no fading. I have made this string longer to fix this case. If you are correcting this
+text, I would love to see the kind of devices you guys now use! Guys, maybe some devices need longer string!
+I think so, so how about double this string, like copy and paste! </string>
+    <string name="rectangle200">"M 0,0 l 200,0 l 0, 200 l -200, 0 z"</string>
+</resources>
diff --git a/tests/tests/text/src/android/text/cts/EmojiCtsActivity.java b/tests/tests/text/src/android/text/cts/EmojiCtsActivity.java
new file mode 100644
index 0000000..eb88426
--- /dev/null
+++ b/tests/tests/text/src/android/text/cts/EmojiCtsActivity.java
@@ -0,0 +1,50 @@
+/*
+ * Copyright (C) 2013 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.text.cts;
+
+import com.android.cts.text.R;
+
+import android.app.Activity;
+import android.os.Bundle;
+import android.webkit.WebView;
+
+public class EmojiCtsActivity extends Activity {
+    private WebView mWebView;
+
+    @Override
+    public void onCreate(Bundle savedInstanceState) {
+        try {
+            super.onCreate(savedInstanceState);
+            setContentView(R.layout.webview_layout);
+            mWebView = (WebView) findViewById(R.id.web_page);
+        } catch (Exception e) {
+            NullWebViewUtils.determineIfWebViewAvailable(this, e);
+        }
+    }
+
+    public WebView getWebView() {
+        return mWebView;
+    }
+
+    @Override
+    public void onDestroy() {
+        if (mWebView != null) {
+            mWebView.destroy();
+        }
+        super.onDestroy();
+    }
+}
diff --git a/tests/tests/text/src/android/text/cts/EmojiTest.java b/tests/tests/text/src/android/text/cts/EmojiTest.java
index 4bcc0e1..5e2ca93 100644
--- a/tests/tests/text/src/android/text/cts/EmojiTest.java
+++ b/tests/tests/text/src/android/text/cts/EmojiTest.java
@@ -25,15 +25,13 @@
 import android.view.KeyEvent;
 import android.view.Menu;
 import android.view.View;
-import android.webkit.cts.NullWebViewUtils;
-import android.webkit.cts.WebViewOnUiThread;
 import android.widget.TextView;
 import android.widget.EditText;
 
-public class EmojiTest extends ActivityInstrumentationTestCase2<EmojiStubActivity> {
+public class EmojiTest extends ActivityInstrumentationTestCase2<EmojiCtsActivity> {
 
     public EmojiTest() {
-        super("com.android.cts.stub", EmojiStubActivity.class);
+        super("com.android.cts.stub", EmojiCtsActivity.class);
     }
 
     protected void setUp() throws Exception {
@@ -94,7 +92,7 @@
 
             // Trigger activity bringup so we can determine if a WebView is available on this
             // device.
-            EmojiStubActivity activity = getActivity();
+            EmojiCtsActivity activity = getActivity();
             if (NullWebViewUtils.isWebViewAvailable()) {
                 CaptureWebView cwebview = new CaptureWebView(getInstrumentation().getContext());
                 mBitmapA = cwebview.capture(Character.toChars(comparedCodePoints[i][0]));
diff --git a/tests/tests/text/src/android/text/cts/NullWebViewUtils.java b/tests/tests/text/src/android/text/cts/NullWebViewUtils.java
new file mode 100644
index 0000000..86d0843
--- /dev/null
+++ b/tests/tests/text/src/android/text/cts/NullWebViewUtils.java
@@ -0,0 +1,88 @@
+/*
+ * Copyright (C) 2010 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.text.cts;
+
+import android.content.Context;
+import android.content.pm.PackageManager;
+
+/**
+ * Utilities to enable the android.webkit.* CTS tests (and others that rely on a functioning
+ * android.webkit.WebView implementation) to determine whether a functioning WebView is present
+ * on the device or not.
+ *
+ * Test cases that require android.webkit.* classes should wrap their first usage of WebView in a
+ * try catch block, and pass any exception that is thrown to
+ * NullWebViewUtils.determineIfWebViewAvailable. The return value of
+ * NullWebViewUtils.isWebViewAvailable will then determine if the test should expect to be able to
+ * use a WebView.
+ */
+public class NullWebViewUtils {
+
+    private static boolean sWebViewUnavailable;
+
+    /**
+     * @param context Current Activity context, used to query the PackageManager.
+     * @param t       An exception thrown by trying to invoke android.webkit.* APIs.
+     */
+    public static void determineIfWebViewAvailable(Context context, Throwable t) {
+        sWebViewUnavailable = !hasWebViewFeature(context) && checkCauseWasUnsupportedOperation(t);
+    }
+
+    /**
+     * After calling determineIfWebViewAvailable, this returns whether a WebView is available on the
+     * device and wheter the test can rely on it.
+     * @return True iff. PackageManager determined that there is no WebView on the device and the
+     *         exception thrown from android.webkit.* was UnsupportedOperationException.
+     */
+    public static boolean isWebViewAvailable() {
+        return !sWebViewUnavailable;
+    }
+
+    private static boolean hasWebViewFeature(Context context) {
+        // Query the system property that determins if there is a functional WebView on the device.
+        PackageManager pm = context.getPackageManager();
+        return pm.hasSystemFeature(PackageManager.FEATURE_WEBVIEW);
+    }
+
+    private static boolean checkCauseWasUnsupportedOperation(Throwable t) {
+        if (t == null) return false;
+        while (t.getCause() != null) {
+            t = t.getCause();
+        }
+        return t instanceof UnsupportedOperationException;
+    }
+
+    /**
+     * Some CTS tests (by design) first use android.webkit.* from a background thread. This helper
+     * allows the test to catch the UnsupportedOperationException from that background thread, and
+     * then query the result from the test main thread.
+     */
+    public static class NullWebViewFromThreadExceptionHandler
+            implements Thread.UncaughtExceptionHandler {
+        private Throwable mPendingException;
+
+        @Override
+        public void uncaughtException(Thread t, Throwable e) {
+            mPendingException = e;
+        }
+
+        public boolean isWebViewAvailable(Context context) {
+            return hasWebViewFeature(context) ||
+                    !checkCauseWasUnsupportedOperation(mPendingException);
+        }
+    }
+}
\ No newline at end of file
diff --git a/tests/tests/text/src/android/text/cts/WebViewOnUiThread.java b/tests/tests/text/src/android/text/cts/WebViewOnUiThread.java
new file mode 100644
index 0000000..3d62ce4
--- /dev/null
+++ b/tests/tests/text/src/android/text/cts/WebViewOnUiThread.java
@@ -0,0 +1,980 @@
+/*
+ * Copyright (C) 2011 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.text.cts;
+
+import android.cts.util.PollingCheck;
+import android.graphics.Bitmap;
+import android.graphics.Picture;
+import android.graphics.Rect;
+import android.os.Bundle;
+import android.os.Looper;
+import android.os.Message;
+import android.os.SystemClock;
+import android.print.PrintDocumentAdapter;
+import android.test.InstrumentationTestCase;
+import android.util.DisplayMetrics;
+import android.view.View;
+import android.view.ViewGroup;
+import android.view.ViewParent;
+import android.webkit.DownloadListener;
+import android.webkit.CookieManager;
+import android.webkit.ValueCallback;
+import android.webkit.WebBackForwardList;
+import android.webkit.WebChromeClient;
+import android.webkit.WebSettings;
+import android.webkit.WebView.HitTestResult;
+import android.webkit.WebView.PictureListener;
+import android.webkit.WebView;
+import android.webkit.WebViewClient;
+
+import junit.framework.Assert;
+
+import java.io.File;
+import java.util.concurrent.Callable;
+import java.util.Map;
+
+/**
+ * Many tests need to run WebView code in the UI thread. This class
+ * wraps a WebView so that calls are ensured to arrive on the UI thread.
+ *
+ * All methods may be run on either the UI thread or test thread.
+ */
+public class WebViewOnUiThread {
+    /**
+     * The maximum time, in milliseconds (10 seconds) to wait for a load
+     * to be triggered.
+     */
+    private static final long LOAD_TIMEOUT = 10000;
+
+    /**
+     * Set to true after onPageFinished is called.
+     */
+    private boolean mLoaded;
+
+    /**
+     * Set to true after onNewPicture is called. Reset when onPageStarted
+     * is called.
+     */
+    private boolean mNewPicture;
+
+    /**
+     * The progress, in percentage, of the page load. Valid values are between
+     * 0 and 100.
+     */
+    private int mProgress;
+
+    /**
+     * The test that this class is being used in. Used for runTestOnUiThread.
+     */
+    private InstrumentationTestCase mTest;
+
+    /**
+     * The WebView that calls will be made on.
+     */
+    private WebView mWebView;
+
+    /**
+     * Initializes the webView with a WebViewClient, WebChromeClient,
+     * and PictureListener to prepare for loadUrlAndWaitForCompletion.
+     *
+     * A new WebViewOnUiThread should be called during setUp so as to
+     * reinitialize between calls.
+     *
+     * @param test The test in which this is being run.
+     * @param webView The webView that the methods should call.
+     * @see loadUrlAndWaitForCompletion
+     */
+    public WebViewOnUiThread(InstrumentationTestCase test, WebView webView) {
+        mTest = test;
+        mWebView = webView;
+        final WebViewClient webViewClient = new WaitForLoadedClient(this);
+        final WebChromeClient webChromeClient = new WaitForProgressClient(this);
+        runOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                mWebView.setWebViewClient(webViewClient);
+                mWebView.setWebChromeClient(webChromeClient);
+                mWebView.setPictureListener(new WaitForNewPicture());
+            }
+        });
+    }
+
+    /**
+     * Called after a test is complete and the WebView should be disengaged from
+     * the tests.
+     */
+    public void cleanUp() {
+        clearHistory();
+        clearCache(true);
+        setPictureListener(null);
+        setWebChromeClient(null);
+        setWebViewClient(null);
+    }
+
+    /**
+     * Called from WaitForNewPicture, this is used to indicate that
+     * the page has been drawn.
+     */
+    synchronized public void onNewPicture() {
+        mNewPicture = true;
+        this.notifyAll();
+    }
+
+    /**
+     * Called from WaitForLoadedClient, this is used to clear the picture
+     * draw state so that draws before the URL begins loading don't count.
+     */
+    synchronized public void onPageStarted() {
+        mNewPicture = false; // Earlier paints won't count.
+    }
+
+    /**
+     * Called from WaitForLoadedClient, this is used to indicate that
+     * the page is loaded, but not drawn yet.
+     */
+    synchronized public void onPageFinished() {
+        mLoaded = true;
+        this.notifyAll();
+    }
+
+    /**
+     * Called from the WebChrome client, this sets the current progress
+     * for a page.
+     * @param progress The progress made so far between 0 and 100.
+     */
+    synchronized public void onProgressChanged(int progress) {
+        mProgress = progress;
+        this.notifyAll();
+    }
+
+    public void setWebViewClient(final WebViewClient webViewClient) {
+        runOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                mWebView.setWebViewClient(webViewClient);
+            }
+        });
+    }
+
+    public void setWebChromeClient(final WebChromeClient webChromeClient) {
+        runOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                mWebView.setWebChromeClient(webChromeClient);
+            }
+        });
+    }
+
+    public void setPictureListener(final PictureListener pictureListener) {
+        runOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                mWebView.setPictureListener(pictureListener);
+            }
+        });
+    }
+
+    public void setNetworkAvailable(final boolean available) {
+        runOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                mWebView.setNetworkAvailable(available);
+            }
+        });
+    }
+
+    public void setDownloadListener(final DownloadListener listener) {
+        runOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                mWebView.setDownloadListener(listener);
+            }
+        });
+    }
+
+    public void setBackgroundColor(final int color) {
+        runOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                mWebView.setBackgroundColor(color);
+            }
+        });
+    }
+
+    public void clearCache(final boolean includeDiskFiles) {
+        runOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                mWebView.clearCache(includeDiskFiles);
+            }
+        });
+    }
+
+    public void clearHistory() {
+        runOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                mWebView.clearHistory();
+            }
+        });
+    }
+
+    public void requestFocus() {
+        runOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                mWebView.requestFocus();
+            }
+        });
+    }
+
+    public boolean canZoomIn() {
+        return getValue(new ValueGetter<Boolean>() {
+            @Override
+            public Boolean capture() {
+                return mWebView.canZoomIn();
+            }
+        });
+    }
+
+    public boolean zoomIn() {
+        return getValue(new ValueGetter<Boolean>() {
+            @Override
+            public Boolean capture() {
+                return mWebView.zoomIn();
+            }
+        });
+    }
+
+    public boolean zoomOut() {
+        return getValue(new ValueGetter<Boolean>() {
+            @Override
+            public Boolean capture() {
+                return mWebView.zoomOut();
+            }
+        });
+    }
+
+    public void setFindListener(final WebView.FindListener listener) {
+        runOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                mWebView.setFindListener(listener);
+            }
+        });
+    }
+
+    public void removeJavascriptInterface(final String interfaceName) {
+        runOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                mWebView.removeJavascriptInterface(interfaceName);
+            }
+        });
+    }
+
+    public void addJavascriptInterface(final Object object, final String name) {
+        runOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                mWebView.addJavascriptInterface(object, name);
+            }
+        });
+    }
+
+    public void flingScroll(final int vx, final int vy) {
+        runOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                mWebView.flingScroll(vx, vy);
+            }
+        });
+    }
+
+    public void requestFocusNodeHref(final Message hrefMsg) {
+        runOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                mWebView.requestFocusNodeHref(hrefMsg);
+            }
+        });
+    }
+
+    public void requestImageRef(final Message msg) {
+        runOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                mWebView.requestImageRef(msg);
+            }
+        });
+    }
+
+    public void setInitialScale(final int scaleInPercent) {
+        runOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                mWebView.setInitialScale(scaleInPercent);
+            }
+        });
+    }
+
+    public void clearSslPreferences() {
+        runOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                mWebView.clearSslPreferences();
+            }
+        });
+    }
+
+    public void clearClientCertPreferences(final Runnable onCleared) {
+        runOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                WebView.clearClientCertPreferences(onCleared);
+            }
+        });
+    }
+
+    public void resumeTimers() {
+        runOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                mWebView.resumeTimers();
+            }
+        });
+    }
+
+    public void findNext(final boolean forward) {
+        runOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                mWebView.findNext(forward);
+            }
+        });
+    }
+
+    public void clearMatches() {
+        runOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                mWebView.clearMatches();
+            }
+        });
+    }
+
+    /**
+     * Calls loadUrl on the WebView and then waits onPageFinished,
+     * onNewPicture and onProgressChange to reach 100.
+     * Test fails if the load timeout elapses.
+     * @param url The URL to load.
+     */
+    public void loadUrlAndWaitForCompletion(final String url) {
+        callAndWait(new Runnable() {
+            @Override
+            public void run() {
+                mWebView.loadUrl(url);
+            }
+        });
+    }
+
+    /**
+     * Calls loadUrl on the WebView and then waits onPageFinished,
+     * onNewPicture and onProgressChange to reach 100.
+     * Test fails if the load timeout elapses.
+     * @param url The URL to load.
+     * @param extraHeaders The additional headers to be used in the HTTP request.
+     */
+    public void loadUrlAndWaitForCompletion(final String url,
+            final Map<String, String> extraHeaders) {
+        callAndWait(new Runnable() {
+            @Override
+            public void run() {
+                mWebView.loadUrl(url, extraHeaders);
+            }
+        });
+    }
+
+    public void loadUrl(final String url) {
+        runOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                mWebView.loadUrl(url);
+            }
+        });
+    }
+
+    public void stopLoading() {
+        runOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                mWebView.stopLoading();
+            }
+        });
+    }
+
+    public void postUrlAndWaitForCompletion(final String url, final byte[] postData) {
+        callAndWait(new Runnable() {
+            @Override
+            public void run() {
+                mWebView.postUrl(url, postData);
+            }
+        });
+    }
+
+    public void loadDataAndWaitForCompletion(final String data,
+            final String mimeType, final String encoding) {
+        callAndWait(new Runnable() {
+            @Override
+            public void run() {
+                mWebView.loadData(data, mimeType, encoding);
+            }
+        });
+    }
+
+    public void loadDataWithBaseURLAndWaitForCompletion(final String baseUrl,
+            final String data, final String mimeType, final String encoding,
+            final String historyUrl) {
+        callAndWait(new Runnable() {
+            @Override
+            public void run() {
+                mWebView.loadDataWithBaseURL(baseUrl, data, mimeType, encoding,
+                        historyUrl);
+            }
+        });
+    }
+
+    /**
+     * Reloads a page and waits for it to complete reloading. Use reload
+     * if it is a form resubmission and the onFormResubmission responds
+     * by telling WebView not to resubmit it.
+     */
+    public void reloadAndWaitForCompletion() {
+        callAndWait(new Runnable() {
+            @Override
+            public void run() {
+                mWebView.reload();
+            }
+        });
+    }
+
+    /**
+     * Reload the previous URL. Use reloadAndWaitForCompletion unless
+     * it is a form resubmission and the onFormResubmission responds
+     * by telling WebView not to resubmit it.
+     */
+    public void reload() {
+        runOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                mWebView.reload();
+            }
+        });
+    }
+
+    /**
+     * Use this only when JavaScript causes a page load to wait for the
+     * page load to complete. Otherwise use loadUrlAndWaitForCompletion or
+     * similar functions.
+     */
+    public void waitForLoadCompletion() {
+        waitForCriteria(LOAD_TIMEOUT,
+                new Callable<Boolean>() {
+                    @Override
+                    public Boolean call() {
+                        return isLoaded();
+                    }
+                });
+        clearLoad();
+    }
+
+    private void waitForCriteria(long timeout, Callable<Boolean> doneCriteria) {
+        if (isUiThread()) {
+            waitOnUiThread(timeout, doneCriteria);
+        } else {
+            waitOnTestThread(timeout, doneCriteria);
+        }
+    }
+
+    public String getTitle() {
+        return getValue(new ValueGetter<String>() {
+            @Override
+            public String capture() {
+                return mWebView.getTitle();
+            }
+        });
+    }
+
+    public WebSettings getSettings() {
+        return getValue(new ValueGetter<WebSettings>() {
+            @Override
+            public WebSettings capture() {
+                return mWebView.getSettings();
+            }
+        });
+    }
+
+    public WebBackForwardList copyBackForwardList() {
+        return getValue(new ValueGetter<WebBackForwardList>() {
+            @Override
+            public WebBackForwardList capture() {
+                return mWebView.copyBackForwardList();
+            }
+        });
+    }
+
+    public Bitmap getFavicon() {
+        return getValue(new ValueGetter<Bitmap>() {
+            @Override
+            public Bitmap capture() {
+                return mWebView.getFavicon();
+            }
+        });
+    }
+
+    public String getUrl() {
+        return getValue(new ValueGetter<String>() {
+            @Override
+            public String capture() {
+                return mWebView.getUrl();
+            }
+        });
+    }
+
+    public int getProgress() {
+        return getValue(new ValueGetter<Integer>() {
+            @Override
+            public Integer capture() {
+                return mWebView.getProgress();
+            }
+        });
+    }
+
+    public int getHeight() {
+        return getValue(new ValueGetter<Integer>() {
+            @Override
+            public Integer capture() {
+                return mWebView.getHeight();
+            }
+        });
+    }
+
+    public int getContentHeight() {
+        return getValue(new ValueGetter<Integer>() {
+            @Override
+            public Integer capture() {
+                return mWebView.getContentHeight();
+            }
+        });
+    }
+
+    public boolean savePicture(final Bundle b, final File dest) {
+        return getValue(new ValueGetter<Boolean>() {
+            @Override
+            public Boolean capture() {
+                return mWebView.savePicture(b, dest);
+            }
+        });
+    }
+
+    public boolean pageUp(final boolean top) {
+        return getValue(new ValueGetter<Boolean>() {
+            @Override
+            public Boolean capture() {
+                return mWebView.pageUp(top);
+            }
+        });
+    }
+
+    public boolean pageDown(final boolean bottom) {
+        return getValue(new ValueGetter<Boolean>() {
+            @Override
+            public Boolean capture() {
+                return mWebView.pageDown(bottom);
+            }
+        });
+    }
+
+    public int[] getLocationOnScreen() {
+        final int[] location = new int[2];
+        return getValue(new ValueGetter<int[]>() {
+            @Override
+            public int[] capture() {
+                mWebView.getLocationOnScreen(location);
+                return location;
+            }
+        });
+    }
+
+    public float getScale() {
+        return getValue(new ValueGetter<Float>() {
+            @Override
+            public Float capture() {
+                return mWebView.getScale();
+            }
+        });
+    }
+
+    public boolean requestFocus(final int direction,
+            final Rect previouslyFocusedRect) {
+        return getValue(new ValueGetter<Boolean>() {
+            @Override
+            public Boolean capture() {
+                return mWebView.requestFocus(direction, previouslyFocusedRect);
+            }
+        });
+    }
+
+    public HitTestResult getHitTestResult() {
+        return getValue(new ValueGetter<HitTestResult>() {
+            @Override
+            public HitTestResult capture() {
+                return mWebView.getHitTestResult();
+            }
+        });
+    }
+
+    public int getScrollX() {
+        return getValue(new ValueGetter<Integer>() {
+            @Override
+            public Integer capture() {
+                return mWebView.getScrollX();
+            }
+        });
+    }
+
+    public int getScrollY() {
+        return getValue(new ValueGetter<Integer>() {
+            @Override
+            public Integer capture() {
+                return mWebView.getScrollY();
+            }
+        });
+    }
+
+    public final DisplayMetrics getDisplayMetrics() {
+        return getValue(new ValueGetter<DisplayMetrics>() {
+            @Override
+            public DisplayMetrics capture() {
+                return mWebView.getContext().getResources().getDisplayMetrics();
+            }
+        });
+    }
+
+    public boolean requestChildRectangleOnScreen(final View child,
+            final Rect rect,
+            final boolean immediate) {
+        return getValue(new ValueGetter<Boolean>() {
+            @Override
+            public Boolean capture() {
+                return mWebView.requestChildRectangleOnScreen(child, rect,
+                        immediate);
+            }
+        });
+    }
+
+    public int findAll(final String find) {
+        return getValue(new ValueGetter<Integer>() {
+            @Override
+            public Integer capture() {
+                return mWebView.findAll(find);
+            }
+        });
+    }
+
+    public Picture capturePicture() {
+        return getValue(new ValueGetter<Picture>() {
+            @Override
+            public Picture capture() {
+                return mWebView.capturePicture();
+            }
+        });
+    }
+
+    public void evaluateJavascript(final String script, final ValueCallback<String> result) {
+        runOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                mWebView.evaluateJavascript(script, result);
+            }
+        });
+    }
+
+    public WebView createWebView() {
+        return getValue(new ValueGetter<WebView>() {
+            @Override
+            public WebView capture() {
+                return new WebView(mWebView.getContext());
+            }
+        });
+    }
+
+    public PrintDocumentAdapter createPrintDocumentAdapter() {
+        return getValue(new ValueGetter<PrintDocumentAdapter>() {
+            @Override
+            public PrintDocumentAdapter capture() {
+                return mWebView.createPrintDocumentAdapter();
+            }
+        });
+    }
+
+    public void setLayoutHeightToMatchParent() {
+        runOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                ViewParent parent = mWebView.getParent();
+                if (parent instanceof ViewGroup) {
+                    ((ViewGroup) parent).getLayoutParams().height =
+                        ViewGroup.LayoutParams.MATCH_PARENT;
+                }
+                mWebView.getLayoutParams().height = ViewGroup.LayoutParams.MATCH_PARENT;
+                mWebView.requestLayout();
+            }
+        });
+    }
+
+    public void setAcceptThirdPartyCookies(final boolean accept) {
+        runOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                CookieManager.getInstance().setAcceptThirdPartyCookies(mWebView, accept);
+            }
+        });
+    }
+
+    public boolean acceptThirdPartyCookies() {
+        return getValue(new ValueGetter<Boolean>() {
+            @Override
+            public Boolean capture() {
+                return CookieManager.getInstance().acceptThirdPartyCookies(mWebView);
+            }
+        });
+    }
+
+    /**
+     * Helper for running code on the UI thread where an exception is
+     * a test failure. If this is already the UI thread then it runs
+     * the code immediately.
+     *
+     * @see runTestOnUiThread
+     * @param r The code to run in the UI thread
+     */
+    public void runOnUiThread(Runnable r) {
+        try {
+            if (isUiThread()) {
+                r.run();
+            } else {
+                mTest.runTestOnUiThread(r);
+            }
+        } catch (Throwable t) {
+            Assert.fail("Unexpected error while running on UI thread: "
+                    + t.getMessage());
+        }
+    }
+
+    /**
+     * Accessor for underlying WebView.
+     * @return The WebView being wrapped by this class.
+     */
+    public WebView getWebView() {
+        return mWebView;
+    }
+
+    private<T> T getValue(ValueGetter<T> getter) {
+        runOnUiThread(getter);
+        return getter.getValue();
+    }
+
+    private abstract class ValueGetter<T> implements Runnable {
+        private T mValue;
+
+        @Override
+        public void run() {
+            mValue = capture();
+        }
+
+        protected abstract T capture();
+
+        public T getValue() {
+           return mValue;
+        }
+    }
+
+    /**
+     * Returns true if the current thread is the UI thread based on the
+     * Looper.
+     */
+    private static boolean isUiThread() {
+        return (Looper.myLooper() == Looper.getMainLooper());
+    }
+
+    /**
+     * @return Whether or not the load has finished.
+     */
+    private synchronized boolean isLoaded() {
+        return mLoaded && mNewPicture && mProgress == 100;
+    }
+
+    /**
+     * Makes a WebView call, waits for completion and then resets the
+     * load state in preparation for the next load call.
+     * @param call The call to make on the UI thread prior to waiting.
+     */
+    private void callAndWait(Runnable call) {
+        Assert.assertTrue("WebViewOnUiThread.load*AndWaitForCompletion calls "
+                + "may not be mixed with load* calls directly on WebView "
+                + "without calling waitForLoadCompletion after the load",
+                !isLoaded());
+        clearLoad(); // clear any extraneous signals from a previous load.
+        runOnUiThread(call);
+        waitForLoadCompletion();
+    }
+
+    /**
+     * Called whenever a load has been completed so that a subsequent call to
+     * waitForLoadCompletion doesn't return immediately.
+     */
+    synchronized private void clearLoad() {
+        mLoaded = false;
+        mNewPicture = false;
+        mProgress = 0;
+    }
+
+    /**
+     * Uses a polling mechanism, while pumping messages to check when the
+     * criteria is met.
+     */
+    private void waitOnUiThread(long timeout, final Callable<Boolean> doneCriteria) {
+        new PollingCheck(timeout) {
+            @Override
+            protected boolean check() {
+                pumpMessages();
+                try {
+                    return doneCriteria.call();
+                } catch (Exception e) {
+                    Assert.fail("Unexpected error while checking the criteria: "
+                            + e.getMessage());
+                    return true;
+                }
+            }
+        }.run();
+    }
+
+    /**
+     * Uses a wait/notify to check when the criteria is met.
+     */
+    private synchronized void waitOnTestThread(long timeout, Callable<Boolean> doneCriteria) {
+        try {
+            long waitEnd = SystemClock.uptimeMillis() + timeout;
+            long timeRemaining = timeout;
+            while (!doneCriteria.call() && timeRemaining > 0) {
+                this.wait(timeRemaining);
+                timeRemaining = waitEnd - SystemClock.uptimeMillis();
+            }
+            Assert.assertTrue("Action failed to complete before timeout", doneCriteria.call());
+        } catch (InterruptedException e) {
+            // We'll just drop out of the loop and fail
+        } catch (Exception e) {
+            Assert.fail("Unexpected error while checking the criteria: "
+                    + e.getMessage());
+        }
+    }
+
+    /**
+     * Pumps all currently-queued messages in the UI thread and then exits.
+     * This is useful to force processing while running tests in the UI thread.
+     */
+    private void pumpMessages() {
+        class ExitLoopException extends RuntimeException {
+        }
+
+        // Force loop to exit when processing this. Loop.quit() doesn't
+        // work because this is the main Loop.
+        mWebView.getHandler().post(new Runnable() {
+            @Override
+            public void run() {
+                throw new ExitLoopException(); // exit loop!
+            }
+        });
+        try {
+            // Pump messages until our message gets through.
+            Looper.loop();
+        } catch (ExitLoopException e) {
+        }
+    }
+
+    /**
+     * A WebChromeClient used to capture the onProgressChanged for use
+     * in waitFor functions. If a test must override the WebChromeClient,
+     * it can derive from this class or call onProgressChanged
+     * directly.
+     */
+    public static class WaitForProgressClient extends WebChromeClient {
+        private WebViewOnUiThread mOnUiThread;
+
+        public WaitForProgressClient(WebViewOnUiThread onUiThread) {
+            mOnUiThread = onUiThread;
+        }
+
+        @Override
+        public void onProgressChanged(WebView view, int newProgress) {
+            super.onProgressChanged(view, newProgress);
+            mOnUiThread.onProgressChanged(newProgress);
+        }
+    }
+
+    /**
+     * A WebViewClient that captures the onPageFinished for use in
+     * waitFor functions. Using initializeWebView sets the WaitForLoadedClient
+     * into the WebView. If a test needs to set a specific WebViewClient and
+     * needs the waitForCompletion capability then it should derive from
+     * WaitForLoadedClient or call WebViewOnUiThread.onPageFinished.
+     */
+    public static class WaitForLoadedClient extends WebViewClient {
+        private WebViewOnUiThread mOnUiThread;
+
+        public WaitForLoadedClient(WebViewOnUiThread onUiThread) {
+            mOnUiThread = onUiThread;
+        }
+
+        @Override
+        public void onPageFinished(WebView view, String url) {
+            super.onPageFinished(view, url);
+            mOnUiThread.onPageFinished();
+        }
+
+        @Override
+        public void onPageStarted(WebView view, String url, Bitmap favicon) {
+            super.onPageStarted(view, url, favicon);
+            mOnUiThread.onPageStarted();
+        }
+    }
+
+    /**
+     * A PictureListener that captures the onNewPicture for use in
+     * waitForLoadCompletion. Using initializeWebView sets the PictureListener
+     * into the WebView. If a test needs to set a specific PictureListener and
+     * needs the waitForCompletion capability then it should call
+     * WebViewOnUiThread.onNewPicture.
+     */
+    private class WaitForNewPicture implements PictureListener {
+        @Override
+        public void onNewPicture(WebView view, Picture picture) {
+            WebViewOnUiThread.this.onNewPicture();
+        }
+    }
+}
diff --git a/tests/tests/text/src/android/text/cts/WidgetTestUtils.java b/tests/tests/text/src/android/text/cts/WidgetTestUtils.java
new file mode 100644
index 0000000..d41b242
--- /dev/null
+++ b/tests/tests/text/src/android/text/cts/WidgetTestUtils.java
@@ -0,0 +1,138 @@
+/*
+ * Copyright (C) 2008 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.text.cts;
+
+import org.xmlpull.v1.XmlPullParser;
+import org.xmlpull.v1.XmlPullParserException;
+
+import android.content.Context;
+import android.content.res.Resources;
+import android.graphics.Bitmap;
+import android.graphics.BitmapFactory;
+
+import java.io.IOException;
+
+import junit.framework.Assert;
+
+/**
+ * The useful methods for widget test.
+ */
+public class WidgetTestUtils {
+    /**
+     * Assert that two bitmaps are equal.
+     *
+     * @param Bitmap b1 the first bitmap which needs to compare.
+     * @param Bitmap b2 the second bitmap which needs to compare.
+     */
+    public static void assertEquals(Bitmap b1, Bitmap b2) {
+        if (b1 == b2) {
+            return;
+        }
+
+        if (b1 == null || b2 == null) {
+            Assert.fail("the bitmaps are not equal");
+        }
+
+        // b1 and b2 are all not null.
+        if (b1.getWidth() != b2.getWidth() || b1.getHeight() != b2.getHeight()
+            || b1.getConfig() != b2.getConfig()) {
+            Assert.fail("the bitmaps are not equal");
+        }
+
+        int w = b1.getWidth();
+        int h = b1.getHeight();
+        int s = w * h;
+        int[] pixels1 = new int[s];
+        int[] pixels2 = new int[s];
+
+        b1.getPixels(pixels1, 0, w, 0, 0, w, h);
+        b2.getPixels(pixels2, 0, w, 0, 0, w, h);
+
+        for (int i = 0; i < s; i++) {
+            if (pixels1[i] != pixels2[i]) {
+                Assert.fail("the bitmaps are not equal");
+            }
+        }
+    }
+
+    /**
+     * Find beginning of the special element.
+     * @param parser XmlPullParser will be parsed.
+     * @param firstElementName the target element name.
+     *
+     * @throws XmlPullParserException if XML Pull Parser related faults occur.
+     * @throws IOException if I/O-related error occur when parsing.
+     */
+    public static final void beginDocument(XmlPullParser parser, String firstElementName)
+            throws XmlPullParserException, IOException {
+        Assert.assertNotNull(parser);
+        Assert.assertNotNull(firstElementName);
+
+        int type;
+        while ((type = parser.next()) != XmlPullParser.START_TAG
+                && type != XmlPullParser.END_DOCUMENT) {
+            ;
+        }
+
+        if (!parser.getName().equals(firstElementName)) {
+            throw new XmlPullParserException("Unexpected start tag: found " + parser.getName()
+                    + ", expected " + firstElementName);
+        }
+    }
+
+    /**
+     * Compare the expected pixels with actual, scaling for the target context density
+     *
+     * @throws AssertionFailedError
+     */
+    public static void assertScaledPixels(int expected, int actual, Context context) {
+        Assert.assertEquals(expected * context.getResources().getDisplayMetrics().density,
+                actual, 3);
+    }
+
+    /** Converts dips into pixels using the {@link Context}'s density. */
+    public static int convertDipToPixels(Context context, int dip) {
+      float density = context.getResources().getDisplayMetrics().density;
+      return Math.round(density * dip);
+    }
+
+    /**
+     * Retrieve a bitmap that can be used for comparison on any density
+     * @param resources
+     * @return the {@link Bitmap} or <code>null</code>
+     */
+    public static Bitmap getUnscaledBitmap(Resources resources, int resId) {
+        BitmapFactory.Options options = new BitmapFactory.Options();
+        options.inScaled = false;
+        return BitmapFactory.decodeResource(resources, resId, options);
+    }
+
+    /**
+     * Retrieve a dithered bitmap that can be used for comparison on any density
+     * @param resources
+     * @param config the preferred config for the returning bitmap
+     * @return the {@link Bitmap} or <code>null</code>
+     */
+    public static Bitmap getUnscaledAndDitheredBitmap(Resources resources,
+            int resId, Bitmap.Config config) {
+        BitmapFactory.Options options = new BitmapFactory.Options();
+        options.inDither = true;
+        options.inScaled = false;
+        options.inPreferredConfig = config;
+        return BitmapFactory.decodeResource(resources, resId, options);
+    }
+}
diff --git a/tests/tests/text/src/android/text/format/cts/LocaleUtils.java b/tests/tests/text/src/android/text/format/cts/LocaleUtils.java
new file mode 100644
index 0000000..131d745
--- /dev/null
+++ b/tests/tests/text/src/android/text/format/cts/LocaleUtils.java
@@ -0,0 +1,31 @@
+/*
+ * Copyright (C) 2010 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.text.format.cts;
+
+import android.content.Context;
+
+import java.util.Locale;
+
+public class LocaleUtils {
+
+    /** Return whether or not the given locale is the device's current locale. */
+    public static boolean isCurrentLocale(Context context, Locale locale) {
+        // TODO: Change the locale on the device using public API if it becomes available.
+        Locale currentLocale = context.getResources().getConfiguration().locale;
+        return locale.equals(currentLocale);
+    }
+}
diff --git a/tests/tests/text/src/android/text/method/cts/ArrowKeyMovementMethodTest.java b/tests/tests/text/src/android/text/method/cts/ArrowKeyMovementMethodTest.java
index e20920a..74fab00 100644
--- a/tests/tests/text/src/android/text/method/cts/ArrowKeyMovementMethodTest.java
+++ b/tests/tests/text/src/android/text/method/cts/ArrowKeyMovementMethodTest.java
@@ -42,7 +42,7 @@
  *
  * @see android.widget.cts.TextViewTest
  */
-public class ArrowKeyMovementMethodTest extends ActivityInstrumentationTestCase2<StubActivity> {
+public class ArrowKeyMovementMethodTest extends ActivityInstrumentationTestCase2<CtsActivity> {
     private static final String THREE_LINES_TEXT = "first line\nsecond line\nlast line";
     private static final int END_OF_ALL_TEXT = THREE_LINES_TEXT.length();
     private static final int END_OF_1ST_LINE = THREE_LINES_TEXT.indexOf('\n');
@@ -56,7 +56,7 @@
     private MyMetaKeyKeyListener mMetaListener;
 
     public ArrowKeyMovementMethodTest() {
-        super("com.android.cts.stub", StubActivity.class);
+        super("com.android.cts.stub", CtsActivity.class);
     }
 
     @Override
diff --git a/tests/tests/text/src/android/text/method/cts/CharacterPickerDialogTest.java b/tests/tests/text/src/android/text/method/cts/CharacterPickerDialogTest.java
index 1e7150b..3c20988 100644
--- a/tests/tests/text/src/android/text/method/cts/CharacterPickerDialogTest.java
+++ b/tests/tests/text/src/android/text/method/cts/CharacterPickerDialogTest.java
@@ -30,11 +30,11 @@
 import android.widget.TextView;
 
 public class CharacterPickerDialogTest extends
-        ActivityInstrumentationTestCase2<StubActivity> {
+        ActivityInstrumentationTestCase2<CtsActivity> {
     private Activity mActivity;
 
     public CharacterPickerDialogTest() {
-        super("com.android.cts.stub", StubActivity.class);
+        super("com.android.cts.stub", CtsActivity.class);
     }
 
     @Override
diff --git a/tests/tests/text/src/android/text/method/cts/CtsActivity.java b/tests/tests/text/src/android/text/method/cts/CtsActivity.java
new file mode 100644
index 0000000..edf3a0e
--- /dev/null
+++ b/tests/tests/text/src/android/text/method/cts/CtsActivity.java
@@ -0,0 +1,37 @@
+/*
+ * Copyright (C) 2009 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.text.method.cts;
+
+import android.app.Activity;
+import android.text.method.ArrowKeyMovementMethod;
+import android.text.method.LinkMovementMethod;
+import android.text.method.ScrollingMovementMethod;
+
+/**
+ * This Activity is used for testing:
+ * {@link LinkMovementMethod}
+ * {@link ArrowKeyMovementMethod}
+ * {@link ScrollingMovementMethod}
+ *
+ * The content view will be set in the test cases.
+ *
+ * @see LinkMovementMethodTest
+ * @see ArrowKeyMovementMethodTest
+ * @see ScrollingMovementMethodTest
+ */
+public class CtsActivity extends Activity {
+}
diff --git a/tests/tests/text/src/android/text/method/cts/KeyListenerCtsActivity.java b/tests/tests/text/src/android/text/method/cts/KeyListenerCtsActivity.java
new file mode 100644
index 0000000..c6483a2
--- /dev/null
+++ b/tests/tests/text/src/android/text/method/cts/KeyListenerCtsActivity.java
@@ -0,0 +1,102 @@
+/*
+ * Copyright (C) 2009 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.text.method.cts;
+
+import com.android.cts.text.R;
+
+import android.app.Activity;
+import android.os.Bundle;
+import android.os.SystemClock;
+import android.text.method.BaseKeyListener;
+import android.text.method.DateKeyListener;
+import android.text.method.DateTimeKeyListener;
+import android.text.method.DigitsKeyListener;
+import android.text.method.MultiTapKeyListener;
+import android.text.method.NumberKeyListener;
+import android.text.method.QwertyKeyListener;
+import android.text.method.TextKeyListener;
+import android.text.method.TimeKeyListener;
+import android.util.Log;
+
+/**
+ * This Activity is used for testing:
+ * {@link DigitsKeyListener}
+ * {@link BaseKeyListener}
+ * {@link MultiTapKeyListener}
+ * {@link NumberKeyListener}
+ * {@link QwertyKeyListener}
+ * {@link TextKeyListener}
+ * {@link DateKeyListener}
+ * {@link DateTimeKeyListener}
+ * {@link TimeKeyListener}
+ *
+ * @see DigitsKeyListener
+ * @see BaseKeyListener
+ * @see MultiTapKeyListener
+ * @see NumberKeyListener
+ * @see QwertyKeyListener
+ * @see TextKeyListener
+ * @see DateKeyListener
+ * @see DateTimeKeyListener
+ * @see TimeKeyListener
+ */
+
+public class KeyListenerCtsActivity extends Activity {
+    private boolean mHasWindowFocus = false;
+    private Object mHasWindowFocusLock = new Object();
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.keylistener_layout);
+    }
+
+    @Override
+    public void onWindowFocusChanged(boolean hasFocus) {
+        super.onWindowFocusChanged(hasFocus);
+        if (!hasFocus) {
+            Log.w("KeyListenerCtsActivity", "KeyListenerCtsActivity lost window focus");
+        }
+        synchronized(mHasWindowFocusLock) {
+            mHasWindowFocus = hasFocus;
+            mHasWindowFocusLock.notify();
+        }
+    }
+
+    /**
+     * Blocks the calling thread until the {@link KeyListenerCtsActivity} has window focus or the
+     * specified duration (in milliseconds) has passed.
+     */
+    public boolean waitForWindowFocus(long durationMillis) {
+        long elapsedMillis = SystemClock.elapsedRealtime();
+        synchronized(mHasWindowFocusLock) {
+            mHasWindowFocus = hasWindowFocus();
+            while (!mHasWindowFocus && durationMillis > 0) {
+                long newElapsedMillis = SystemClock.elapsedRealtime();
+                durationMillis -= (newElapsedMillis - elapsedMillis);
+                elapsedMillis = newElapsedMillis;
+                if (durationMillis > 0) {
+                    try {
+                        mHasWindowFocusLock.wait(durationMillis);
+                    } catch (InterruptedException e) {
+                    }
+                }
+            }
+            return mHasWindowFocus;
+        }
+    }
+}
diff --git a/tests/tests/text/src/android/text/method/cts/KeyListenerTestCase.java b/tests/tests/text/src/android/text/method/cts/KeyListenerTestCase.java
index 375ea54..a5a76af 100644
--- a/tests/tests/text/src/android/text/method/cts/KeyListenerTestCase.java
+++ b/tests/tests/text/src/android/text/method/cts/KeyListenerTestCase.java
@@ -16,12 +16,12 @@
 
 package android.text.method.cts;
 
-import com.android.cts.stub.R;
+import com.android.cts.text.R;
 
 import android.app.Instrumentation;
 import android.test.ActivityInstrumentationTestCase2;
 import android.text.format.DateUtils;
-import android.text.method.cts.KeyListenerStubActivity;
+import android.text.method.cts.KeyListenerCtsActivity;
 import android.text.method.KeyListener;
 import android.view.WindowManager;
 import android.widget.TextView;
@@ -47,13 +47,13 @@
  * @see TextKeyKeyListenerTest
  */
 public abstract class KeyListenerTestCase extends
-        ActivityInstrumentationTestCase2<KeyListenerStubActivity> {
-    protected KeyListenerStubActivity mActivity;
+        ActivityInstrumentationTestCase2<KeyListenerCtsActivity> {
+    protected KeyListenerCtsActivity mActivity;
     protected Instrumentation mInstrumentation;
     protected TextView mTextView;
 
     public KeyListenerTestCase() {
-        super("com.android.cts.stub", KeyListenerStubActivity.class);
+        super("com.android.cts.stub", KeyListenerCtsActivity.class);
     }
 
     @Override
diff --git a/tests/tests/text/src/android/text/method/cts/LinkMovementMethodTest.java b/tests/tests/text/src/android/text/method/cts/LinkMovementMethodTest.java
index b67f313..8027d49 100644
--- a/tests/tests/text/src/android/text/method/cts/LinkMovementMethodTest.java
+++ b/tests/tests/text/src/android/text/method/cts/LinkMovementMethodTest.java
@@ -42,7 +42,7 @@
  * @see android.widget.cts.TextViewTest
  */
 public class LinkMovementMethodTest extends
-        ActivityInstrumentationTestCase2<StubActivity> {
+        ActivityInstrumentationTestCase2<CtsActivity> {
     private static final String CONTENT = "clickable\nunclickable\nclickable";
 
     private LinkMovementMethod mMethod;
@@ -56,7 +56,7 @@
     private MockClickableSpan mClickable1;
 
     public LinkMovementMethodTest() {
-        super("com.android.cts.stub", StubActivity.class);
+        super("com.android.cts.stub", CtsActivity.class);
     }
 
     @Override
diff --git a/tests/tests/text/src/android/text/method/cts/PasswordTransformationMethodTest.java b/tests/tests/text/src/android/text/method/cts/PasswordTransformationMethodTest.java
index 471f67a..66e4fc8 100644
--- a/tests/tests/text/src/android/text/method/cts/PasswordTransformationMethodTest.java
+++ b/tests/tests/text/src/android/text/method/cts/PasswordTransformationMethodTest.java
@@ -35,7 +35,7 @@
  * Test {@link PasswordTransformationMethod}.
  */
 public class PasswordTransformationMethodTest extends
-        ActivityInstrumentationTestCase2<StubActivity> {
+        ActivityInstrumentationTestCase2<CtsActivity> {
     private static final int EDIT_TXT_ID = 1;
 
     /** original text */
@@ -49,7 +49,7 @@
 
     private boolean isPasswordPrefSaved;
 
-    private StubActivity mActivity;
+    private CtsActivity mActivity;
 
     private MockPasswordTransformationMethod mMethod;
 
@@ -58,7 +58,7 @@
     private CharSequence mTransformedText;
 
     public PasswordTransformationMethodTest() {
-        super("com.android.cts.stub", StubActivity.class);
+        super("com.android.cts.stub", CtsActivity.class);
     }
 
     @Override
diff --git a/tests/tests/text/src/android/text/method/cts/ReplacementTransformationMethodTest.java b/tests/tests/text/src/android/text/method/cts/ReplacementTransformationMethodTest.java
index 3c05f30..7dabd16 100644
--- a/tests/tests/text/src/android/text/method/cts/ReplacementTransformationMethodTest.java
+++ b/tests/tests/text/src/android/text/method/cts/ReplacementTransformationMethodTest.java
@@ -27,7 +27,7 @@
  * Test {@link ReplacementTransformationMethod}.
  */
 public class ReplacementTransformationMethodTest extends
-        ActivityInstrumentationTestCase2<StubActivity> {
+        ActivityInstrumentationTestCase2<CtsActivity> {
     private final char[] ORIGINAL = new char[] { '0', '1' };
     private final char[] ORIGINAL_WITH_MORE_CHARS = new char[] { '0', '1', '2' };
     private final char[] ORIGINAL_WITH_SAME_CHARS = new char[] { '0', '0' };
@@ -37,7 +37,7 @@
     private EditText mEditText;
 
     public ReplacementTransformationMethodTest() {
-        super("com.android.cts.stub", StubActivity.class);
+        super("com.android.cts.stub", CtsActivity.class);
     }
 
     @Override
diff --git a/tests/tests/text/src/android/text/method/cts/ScrollingMovementMethodTest.java b/tests/tests/text/src/android/text/method/cts/ScrollingMovementMethodTest.java
index b119c9d..f9a7d0d 100644
--- a/tests/tests/text/src/android/text/method/cts/ScrollingMovementMethodTest.java
+++ b/tests/tests/text/src/android/text/method/cts/ScrollingMovementMethodTest.java
@@ -33,7 +33,7 @@
 import android.view.ViewGroup.LayoutParams;
 import android.widget.TextView;
 import android.widget.TextView.BufferType;
-import android.widget.cts.WidgetTestUtils;
+import android.text.cts.WidgetTestUtils;
 
 /**
  * Test {@link ScrollingMovementMethod}. The class is an implementation of interface
@@ -43,7 +43,7 @@
  *
  * @see android.widget.cts.TextViewTest
  */
-public class ScrollingMovementMethodTest extends ActivityInstrumentationTestCase2<StubActivity> {
+public class ScrollingMovementMethodTest extends ActivityInstrumentationTestCase2<CtsActivity> {
     private static final int LITTLE_SPACE = 20;
 
     private static final String THREE_LINES_TEXT = "first line\nsecond line\nlast line";
@@ -55,7 +55,7 @@
     private int mScaledTouchSlop;
 
     public ScrollingMovementMethodTest() {
-        super("com.android.cts.stub", StubActivity.class);
+        super("com.android.cts.stub", CtsActivity.class);
     }
 
     @Override
diff --git a/tests/tests/text/src/android/text/method/cts/SingleLineTransformationMethodTest.java b/tests/tests/text/src/android/text/method/cts/SingleLineTransformationMethodTest.java
index 8d88a8a..89f1026 100644
--- a/tests/tests/text/src/android/text/method/cts/SingleLineTransformationMethodTest.java
+++ b/tests/tests/text/src/android/text/method/cts/SingleLineTransformationMethodTest.java
@@ -26,9 +26,9 @@
  * Test {@link SingleLineTransformationMethod}.
  */
 public class SingleLineTransformationMethodTest
-        extends ActivityInstrumentationTestCase2<StubActivity> {
+        extends ActivityInstrumentationTestCase2<CtsActivity> {
     public SingleLineTransformationMethodTest() {
-        super("com.android.cts.stub", StubActivity.class);
+        super("com.android.cts.stub", CtsActivity.class);
     }
 
     public void testConstructor() {
diff --git a/tests/tests/text/src/android/text/method/cts/TextMethodUtils.java b/tests/tests/text/src/android/text/method/cts/TextMethodUtils.java
new file mode 100644
index 0000000..0785cff
--- /dev/null
+++ b/tests/tests/text/src/android/text/method/cts/TextMethodUtils.java
@@ -0,0 +1,55 @@
+/*
+ * Copyright (C) 2008 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.text.method.cts;
+
+import android.view.KeyEvent;
+
+import junit.framework.Assert;
+
+public class TextMethodUtils {
+    /**
+     * Assert that two char arrays are equal.
+     *
+     * @param expected the expected char array.
+     * @param actual the actual char array.
+     */
+    public static void assertEquals(char[] expected, char[] actual) {
+        if (expected != actual) {
+            if (expected == null || actual == null) {
+                Assert.fail("the char arrays are not equal");
+            }
+
+            Assert.assertEquals(String.valueOf(expected), String.valueOf(actual));
+        }
+    }
+
+    /**
+     * Get an unaccepted key code.
+     *
+     * @param acceptedChars accepted chars array.
+     * @return return key code if we find unaccepted one, or return -1.
+     */
+    public static int getUnacceptedKeyCode(char[] acceptedChars) {
+        for (int keyCode = KeyEvent.KEYCODE_A; keyCode <= KeyEvent.KEYCODE_Z; keyCode++) {
+            KeyEvent event = new KeyEvent(KeyEvent.ACTION_DOWN, keyCode);
+            if ('\0' == event.getMatch(acceptedChars)) {
+                return keyCode;
+            }
+        }
+        return -1;
+    }
+}
diff --git a/tests/tests/text/src/android/text/method/cts/TouchTest.java b/tests/tests/text/src/android/text/method/cts/TouchTest.java
index 58e889a..2d3d146 100644
--- a/tests/tests/text/src/android/text/method/cts/TouchTest.java
+++ b/tests/tests/text/src/android/text/method/cts/TouchTest.java
@@ -29,7 +29,7 @@
 import android.view.MotionEvent;
 import android.widget.TextView;
 
-public class TouchTest extends ActivityInstrumentationTestCase2<StubActivity> {
+public class TouchTest extends ActivityInstrumentationTestCase2<CtsActivity> {
     private Activity mActivity;
     private static final String LONG_TEXT = "Scrolls the specified widget to the specified " +
             "coordinates, except constrains the X scrolling position to the horizontal regions " +
@@ -43,7 +43,7 @@
     private boolean mReturnFromTouchEvent;
 
     public TouchTest() {
-        super("com.android.cts.stub", StubActivity.class);
+        super("com.android.cts.stub", CtsActivity.class);
     }
 
     @Override
diff --git a/tests/tests/text/src/android/text/style/cts/DrawableMarginSpanTest.java b/tests/tests/text/src/android/text/style/cts/DrawableMarginSpanTest.java
index bea0944..3813a94 100644
--- a/tests/tests/text/src/android/text/style/cts/DrawableMarginSpanTest.java
+++ b/tests/tests/text/src/android/text/style/cts/DrawableMarginSpanTest.java
@@ -16,7 +16,7 @@
 
 package android.text.style.cts;
 
-import com.android.cts.stub.R;
+import com.android.cts.text.R;
 
 
 import android.graphics.Canvas;
diff --git a/tests/tests/text/src/android/text/style/cts/DynamicDrawableSpanTest.java b/tests/tests/text/src/android/text/style/cts/DynamicDrawableSpanTest.java
index 0cd072a..9723556 100644
--- a/tests/tests/text/src/android/text/style/cts/DynamicDrawableSpanTest.java
+++ b/tests/tests/text/src/android/text/style/cts/DynamicDrawableSpanTest.java
@@ -16,7 +16,7 @@
 
 package android.text.style.cts;
 
-import com.android.cts.stub.R;
+import com.android.cts.text.R;
 
 
 import android.graphics.Canvas;
diff --git a/tests/tests/text/src/android/text/style/cts/ImageSpanTest.java b/tests/tests/text/src/android/text/style/cts/ImageSpanTest.java
index 1499d62..a98c748 100644
--- a/tests/tests/text/src/android/text/style/cts/ImageSpanTest.java
+++ b/tests/tests/text/src/android/text/style/cts/ImageSpanTest.java
@@ -16,7 +16,7 @@
 
 package android.text.style.cts;
 
-import com.android.cts.stub.R;
+import com.android.cts.text.R;
 
 
 import android.content.Context;
@@ -27,7 +27,7 @@
 import android.test.AndroidTestCase;
 import android.text.style.DynamicDrawableSpan;
 import android.text.style.ImageSpan;
-import android.widget.cts.WidgetTestUtils;
+import android.text.cts.WidgetTestUtils;
 
 public class ImageSpanTest extends AndroidTestCase {
     public void testConstructor() {
diff --git a/tests/tests/text/src/android/text/style/cts/MockURLSpanTestActivity.java b/tests/tests/text/src/android/text/style/cts/MockURLSpanTestActivity.java
new file mode 100644
index 0000000..dbd154b
--- /dev/null
+++ b/tests/tests/text/src/android/text/style/cts/MockURLSpanTestActivity.java
@@ -0,0 +1,33 @@
+/*
+ * Copyright (C) 2009 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.text.style.cts;
+
+import com.android.cts.text.R;
+
+import android.app.Activity;
+import android.os.Bundle;
+
+/**
+ * A Mock application for {@link URLSpan} test.
+ */
+public class MockURLSpanTestActivity extends Activity {
+    @Override
+    public void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.urlspan_layout);
+    }
+}
diff --git a/tests/tests/text/src/android/text/style/cts/URLSpanCtsActivity.java b/tests/tests/text/src/android/text/style/cts/URLSpanCtsActivity.java
new file mode 100644
index 0000000..8d885bc
--- /dev/null
+++ b/tests/tests/text/src/android/text/style/cts/URLSpanCtsActivity.java
@@ -0,0 +1,33 @@
+/*
+ * Copyright (C) 2008 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.text.style.cts;
+
+import com.android.cts.text.R;
+
+import android.app.Activity;
+import android.os.Bundle;
+
+/**
+ * A minimal application for {@link URLSpan} test.
+ */
+public class URLSpanCtsActivity extends Activity {
+    @Override
+    public void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.urlspan_layout);
+    }
+}
diff --git a/tests/tests/text/src/android/text/style/cts/URLSpanTest.java b/tests/tests/text/src/android/text/style/cts/URLSpanTest.java
index 3209b66..832e48d 100644
--- a/tests/tests/text/src/android/text/style/cts/URLSpanTest.java
+++ b/tests/tests/text/src/android/text/style/cts/URLSpanTest.java
@@ -16,7 +16,7 @@
 
 package android.text.style.cts;
 
-import com.android.cts.stub.R;
+import com.android.cts.text.R;
 
 
 import android.app.Activity;
@@ -27,13 +27,13 @@
 import android.text.style.URLSpan;
 import android.widget.TextView;
 
-public class URLSpanTest extends ActivityInstrumentationTestCase2<URLSpanStubActivity> {
+public class URLSpanTest extends ActivityInstrumentationTestCase2<URLSpanCtsActivity> {
     // The scheme of TEST_URL must be "ctstest" to launch MockURLSpanTestActivity
     private static final String TEST_URL = "ctstest://urlSpan/test";
     private Activity mActivity;
 
     public URLSpanTest() {
-        super("com.android.cts.stub", URLSpanStubActivity.class);
+        super("com.android.cts.stub", URLSpanCtsActivity.class);
     }
 
     @Override
diff --git a/tests/tests/uiautomation/AndroidManifest.xml b/tests/tests/uiautomation/AndroidManifest.xml
index 06b31c8..d99e999 100644
--- a/tests/tests/uiautomation/AndroidManifest.xml
+++ b/tests/tests/uiautomation/AndroidManifest.xml
@@ -19,6 +19,8 @@
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
         package="android.app.cts.uiautomation">
 
+  <uses-permission android:name="android.permission.DISABLE_KEYGUARD" />
+
   <application android:theme="@android:style/Theme.Holo.NoActionBar" >
 
       <uses-library android:name="android.test.runner"/>
diff --git a/tests/tests/uiautomation/src/android/app/uiautomation/cts/UiAutomationTestFirstActivity.java b/tests/tests/uiautomation/src/android/app/uiautomation/cts/UiAutomationTestFirstActivity.java
index 49791ab..a798b1b 100644
--- a/tests/tests/uiautomation/src/android/app/uiautomation/cts/UiAutomationTestFirstActivity.java
+++ b/tests/tests/uiautomation/src/android/app/uiautomation/cts/UiAutomationTestFirstActivity.java
@@ -20,6 +20,7 @@
 
 import android.app.Activity;
 import android.os.Bundle;
+import android.view.WindowManager;
 import android.widget.ArrayAdapter;
 import android.widget.ListView;
 
@@ -32,6 +33,10 @@
         super.onCreate(savedInstanceState);
         setContentView(R.layout.ui_automation_test);
 
+        getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON
+                | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON
+                | WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD);
+
         String[] cheeses = getResources().getStringArray(R.array.some_cheeses);
         ArrayAdapter<String> cheeseAdapter = new ArrayAdapter<String>(this,
                 android.R.layout.simple_list_item_1, cheeses);
diff --git a/tests/tests/uiautomation/src/android/app/uiautomation/cts/UiAutomationTestSecondActivity.java b/tests/tests/uiautomation/src/android/app/uiautomation/cts/UiAutomationTestSecondActivity.java
index 7def379..e6fc743 100644
--- a/tests/tests/uiautomation/src/android/app/uiautomation/cts/UiAutomationTestSecondActivity.java
+++ b/tests/tests/uiautomation/src/android/app/uiautomation/cts/UiAutomationTestSecondActivity.java
@@ -19,6 +19,7 @@
 import android.app.Activity;
 import android.app.cts.uiautomation.R;
 import android.os.Bundle;
+import android.view.WindowManager;
 import android.widget.ArrayAdapter;
 import android.widget.ListView;
 
@@ -31,6 +32,10 @@
         super.onCreate(savedInstanceState);
         setContentView(R.layout.ui_automation_test);
 
+        getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON
+                | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON
+                | WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD);
+
         String[] cheeses = getResources().getStringArray(R.array.some_cheeses);
         ArrayAdapter<String> cheeseAdapter = new ArrayAdapter<String>(this,
                 android.R.layout.simple_list_item_1, cheeses);
diff --git a/tests/tests/uirendering/src/android/uirendering/cts/bitmapverifiers/ColorVerifier.java b/tests/tests/uirendering/src/android/uirendering/cts/bitmapverifiers/ColorVerifier.java
index f8d624f..ea836ea 100644
--- a/tests/tests/uirendering/src/android/uirendering/cts/bitmapverifiers/ColorVerifier.java
+++ b/tests/tests/uirendering/src/android/uirendering/cts/bitmapverifiers/ColorVerifier.java
@@ -22,7 +22,7 @@
     private int mColor;
 
     public ColorVerifier(int color) {
-        this(color, 0);
+        this(color, 20);
     }
 
     public ColorVerifier(int color, int threshold) {
diff --git a/tests/tests/uirendering/src/android/uirendering/cts/bitmapverifiers/RectVerifier.java b/tests/tests/uirendering/src/android/uirendering/cts/bitmapverifiers/RectVerifier.java
index b28812c..06a430b 100644
--- a/tests/tests/uirendering/src/android/uirendering/cts/bitmapverifiers/RectVerifier.java
+++ b/tests/tests/uirendering/src/android/uirendering/cts/bitmapverifiers/RectVerifier.java
@@ -26,7 +26,7 @@
     private Rect mInnerRect;
 
     public RectVerifier(int outerColor, int innerColor, Rect innerRect) {
-        this(outerColor, innerColor, innerRect, 10);
+        this(outerColor, innerColor, innerRect, 20);
     }
 
     public RectVerifier(int outerColor, int innerColor, Rect innerRect, int tolerance) {
diff --git a/tests/tests/uirendering/src/android/uirendering/cts/bitmapverifiers/SamplePointVerifier.java b/tests/tests/uirendering/src/android/uirendering/cts/bitmapverifiers/SamplePointVerifier.java
index 7be2987..cb62694 100644
--- a/tests/tests/uirendering/src/android/uirendering/cts/bitmapverifiers/SamplePointVerifier.java
+++ b/tests/tests/uirendering/src/android/uirendering/cts/bitmapverifiers/SamplePointVerifier.java
@@ -18,6 +18,7 @@
 import android.graphics.Bitmap;
 import android.graphics.Point;
 import android.uirendering.cts.testinfrastructure.ActivityTestBase;
+import android.uirendering.cts.util.CompareUtils;
 import android.util.Log;
 
 import java.util.Arrays;
@@ -29,6 +30,7 @@
     private static final String TAG = "SamplePoint";
     private Point[] mTestPoints;
     private int[] mExpectedColors;
+    private int mTolerance = 20;
 
     public SamplePointVerifier(Point[] testPoints, int[] expectedColors) {
         mTestPoints = testPoints;
@@ -44,7 +46,7 @@
             int x = mTestPoints[i].x;
             int y = mTestPoints[i].y;
             int index = indexFromXAndY(x, y, stride, offset);
-            if (mExpectedColors[i] != bitmap[index]) {
+            if (!verifyPixel(bitmap[index], mExpectedColors[i])) {
                 Log.d(TAG, "Expected : " + Integer.toHexString(mExpectedColors[i]) +
                         " at position x = " + x + " y = " + y + " , tested color : " +
                         Integer.toHexString(bitmap[index]));
@@ -62,4 +64,8 @@
         }
         return success;
     }
+
+    protected boolean verifyPixel(int color, int expectedColor) {
+        return CompareUtils.verifyPixelWithThreshold(color, expectedColor, mTolerance);
+    }
 }
diff --git a/tests/tests/uirendering/src/android/uirendering/cts/testclasses/BitmapFilterTests.java b/tests/tests/uirendering/src/android/uirendering/cts/testclasses/BitmapFilterTests.java
index 833e618..ddae100 100644
--- a/tests/tests/uirendering/src/android/uirendering/cts/testclasses/BitmapFilterTests.java
+++ b/tests/tests/uirendering/src/android/uirendering/cts/testclasses/BitmapFilterTests.java
@@ -69,6 +69,8 @@
     private static Bitmap mBigGridBitmap = createGridBitmap(BIG_GRID_SIZE, BIG_GRID_SIZE);
     private static final int HALFWAY_COLOR = Color.argb(255, 127, 127, 127);
 
+    /* All of these tests seem to be broken.
+     * TODO: fix in L MR1
     @SmallTest
     public void testPaintFilterScaleUp() {
         runScaleTest(FilterEnum.PAINT_FILTER, true, mBlackWhiteVerifier);
@@ -76,7 +78,7 @@
 
     @SmallTest
     public void testPaintFilterScaleDown() {
-        runScaleTest(FilterEnum.PAINT_FILTER, false, new ColorVerifier(HALFWAY_COLOR));
+        runScaleTest(FilterEnum.PAINT_FILTER, false, new ColorVerifier(HALFWAY_COLOR, 15));
     }
 
     @SmallTest
@@ -98,10 +100,10 @@
     public void testDrawFilterScaleDown() {
         runScaleTest(FilterEnum.ADD_FILTER, false, new ColorVerifier(HALFWAY_COLOR));
     }
-
+*/
     private void runScaleTest(final FilterEnum filterEnum, final boolean scaleUp,
             BitmapVerifier bitmapVerifier) {
-        final int gridWidth = scaleUp ? BIG_GRID_SIZE : SMALL_GRID_SIZE;
+        final int gridWidth = scaleUp ? SMALL_GRID_SIZE : BIG_GRID_SIZE;
         final Paint paint = new Paint(filterEnum.equals(FilterEnum.ADD_FILTER) ?
                 0 : Paint.FILTER_BITMAP_FLAG);
         CanvasClient canvasClient = new CanvasClient() {
diff --git a/tests/tests/uirendering/src/android/uirendering/cts/testclasses/ExactCanvasTests.java b/tests/tests/uirendering/src/android/uirendering/cts/testclasses/ExactCanvasTests.java
index f1d6661..3088142 100644
--- a/tests/tests/uirendering/src/android/uirendering/cts/testclasses/ExactCanvasTests.java
+++ b/tests/tests/uirendering/src/android/uirendering/cts/testclasses/ExactCanvasTests.java
@@ -210,7 +210,6 @@
                     }
                 })
                 .addLayout(R.layout.blue_padded_square, null)
-                .addWebView("file:///android_asset/blue_padded_square.html", null)
                 .runWithVerifier(verifier);
     }
 
diff --git a/tests/tests/uirendering/src/android/uirendering/cts/testclasses/SweepTests.java b/tests/tests/uirendering/src/android/uirendering/cts/testclasses/SweepTests.java
index 8b7618e..7947286 100644
--- a/tests/tests/uirendering/src/android/uirendering/cts/testclasses/SweepTests.java
+++ b/tests/tests/uirendering/src/android/uirendering/cts/testclasses/SweepTests.java
@@ -342,6 +342,8 @@
                 null, bitmapVerifiers);
     }
 
+    /*
+     * TODO: fix this test for L MR1
     @SmallTest
     public void testShaderSweeps() {
         int mask = DisplayModifier.Accessor.AA_MASK |
@@ -350,6 +352,7 @@
                 DisplayModifier.Accessor.SHAPES_MASK;
         sweepModifiersForMask(mask, null, DEFAULT_MSSIM_COMPARER, null);
     }
+     */
 
     protected void sweepModifiersForMask(int mask, final DisplayModifier drawOp,
             BitmapComparer[] bitmapComparers, BitmapVerifier[] bitmapVerifiers) {
diff --git a/tests/tests/uirendering/src/android/uirendering/cts/testinfrastructure/DisplayModifier.java b/tests/tests/uirendering/src/android/uirendering/cts/testinfrastructure/DisplayModifier.java
index 50880e9..684293d 100644
--- a/tests/tests/uirendering/src/android/uirendering/cts/testinfrastructure/DisplayModifier.java
+++ b/tests/tests/uirendering/src/android/uirendering/cts/testinfrastructure/DisplayModifier.java
@@ -275,6 +275,7 @@
                                     paint.setShader(ResourceModifier.instance().composeShader);
                                 }
                             });
+                            /*
                             put("bad composeShader", new DisplayModifier() {
                                 @Override
                                 public void modifyDrawing(Paint paint, Canvas canvas) {
@@ -288,6 +289,7 @@
                                             ResourceModifier.instance().doubleGradientComposeShader);
                                 }
                             });
+                            */
                             put("horGradient", new DisplayModifier() {
                                 @Override
                                 public void modifyDrawing(Paint paint, Canvas canvas) {
@@ -372,12 +374,16 @@
                                     canvas.drawLines(gLinePts, paint);
                                 }
                             });
+                            /* drawPoints does not work with zero stroke width,
+                             * but it isn't a regression
+                             * TODO: fix hardware canvas so that drawPoints works
                             put("plusPoints", new DisplayModifier() {
                                 @Override
                                 public void modifyDrawing(Paint paint, Canvas canvas) {
                                     canvas.drawPoints(gPts, paint);
                                 }
                             });
+                             */
                             put("text", new DisplayModifier() {
                                 @Override
                                 public void modifyDrawing(Paint paint, Canvas canvas) {
diff --git a/tests/tests/uirendering/src/android/uirendering/cts/testinfrastructure/DrawActivity.java b/tests/tests/uirendering/src/android/uirendering/cts/testinfrastructure/DrawActivity.java
index 1f12dcb..4d4a012 100644
--- a/tests/tests/uirendering/src/android/uirendering/cts/testinfrastructure/DrawActivity.java
+++ b/tests/tests/uirendering/src/android/uirendering/cts/testinfrastructure/DrawActivity.java
@@ -32,7 +32,7 @@
 public class DrawActivity extends Activity {
     private final static long TIME_OUT = 10000;
     private final Object mLock = new Object();
-    public static final int MIN_NUMBER_OF_DRAWS = 5;
+    public static final int MIN_NUMBER_OF_DRAWS = 20;
 
     private Handler mHandler;
     private View mView;
diff --git a/tests/tests/uirendering/src/android/uirendering/cts/util/CompareUtils.java b/tests/tests/uirendering/src/android/uirendering/cts/util/CompareUtils.java
index d68566d..4f246a4 100644
--- a/tests/tests/uirendering/src/android/uirendering/cts/util/CompareUtils.java
+++ b/tests/tests/uirendering/src/android/uirendering/cts/util/CompareUtils.java
@@ -10,6 +10,6 @@
         int diff = Math.abs(Color.red(color) - Color.red(expectedColor))
                 + Math.abs(Color.green(color) - Color.green(expectedColor))
                 + Math.abs(Color.blue(color) - Color.blue(expectedColor));
-        return diff < threshold;
+        return diff <= threshold;
     }
 }
diff --git a/tests/tests/util/Android.mk b/tests/tests/util/Android.mk
index 6ede3fb..75d23d7 100644
--- a/tests/tests/util/Android.mk
+++ b/tests/tests/util/Android.mk
@@ -27,8 +27,6 @@
 
 LOCAL_PACKAGE_NAME := CtsUtilTestCases
 
-LOCAL_INSTRUMENTATION_FOR := CtsTestStubs
-
 LOCAL_SDK_VERSION := current
 
 include $(BUILD_CTS_PACKAGE)
diff --git a/tests/tests/util/AndroidManifest.xml b/tests/tests/util/AndroidManifest.xml
index ab417bd..e40087a 100644
--- a/tests/tests/util/AndroidManifest.xml
+++ b/tests/tests/util/AndroidManifest.xml
@@ -19,12 +19,13 @@
     package="com.android.cts.util">
 
     <uses-permission android:name="android.permission.DISABLE_KEYGUARD" />
+    <uses-permission android:name="android.permission.READ_LOGS" />
     <application>
         <uses-library android:name="android.test.runner" />
     </application>
 
     <instrumentation android:name="android.support.test.runner.AndroidJUnitRunner"
-                     android:targetPackage="com.android.cts.stub"
+                     android:targetPackage="com.android.cts.util"
                      android:label="CTS tests of android.util">
         <meta-data android:name="listener"
             android:value="com.android.cts.runner.CtsTestRunListener" />
diff --git a/tests/tests/util/res/layout/xml_test.xml b/tests/tests/util/res/layout/xml_test.xml
new file mode 100644
index 0000000..4702281
--- /dev/null
+++ b/tests/tests/util/res/layout/xml_test.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2008 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content">
+</LinearLayout>
diff --git a/tests/tests/util/src/android/util/cts/XmlTest.java b/tests/tests/util/src/android/util/cts/XmlTest.java
index 24f8c74..833bd3c 100644
--- a/tests/tests/util/src/android/util/cts/XmlTest.java
+++ b/tests/tests/util/src/android/util/cts/XmlTest.java
@@ -391,7 +391,7 @@
 
     public void testAsAttributeSet() {
         XmlResourceParser xp = getContext().getResources().getLayout(
-                com.android.cts.stub.R.layout.xml_test);
+                com.android.cts.util.R.layout.xml_test);
         int eventType = -1;
         try {
             eventType = xp.getEventType();
diff --git a/tests/tests/view/Android.mk b/tests/tests/view/Android.mk
index 2c07cc3..027e321 100644
--- a/tests/tests/view/Android.mk
+++ b/tests/tests/view/Android.mk
@@ -17,18 +17,16 @@
 include $(CLEAR_VARS)
 
 # don't include this package in any target
-LOCAL_MODULE_TAGS := optional
+LOCAL_MODULE_TAGS := tests
 # and when built explicitly put it in the data partition
 LOCAL_MODULE_PATH := $(TARGET_OUT_DATA_APPS)
 
 LOCAL_JAVA_LIBRARIES := android.test.runner
 
-LOCAL_STATIC_JAVA_LIBRARIES := ctstestrunner
+LOCAL_STATIC_JAVA_LIBRARIES := ctsdeviceutil ctstestrunner
 
 LOCAL_SRC_FILES := $(call all-java-files-under, src)
 
 LOCAL_PACKAGE_NAME := CtsViewTestCases
 
-LOCAL_INSTRUMENTATION_FOR := CtsTestStubs
-
 include $(BUILD_CTS_PACKAGE)
diff --git a/tests/tests/view/AndroidManifest.xml b/tests/tests/view/AndroidManifest.xml
index 4cdeab2..6806d29 100644
--- a/tests/tests/view/AndroidManifest.xml
+++ b/tests/tests/view/AndroidManifest.xml
@@ -19,12 +19,166 @@
     package="com.android.cts.view">
 
     <uses-permission android:name="android.permission.DISABLE_KEYGUARD" />
-    <application>
+    <application android:label="Android TestCase"
+                android:icon="@drawable/size_48x48"
+                android:maxRecents="1"
+                android:multiArch="true"
+                android:name="android.view.cts.MockApplication"
+                android:supportsRtl="true">
         <uses-library android:name="android.test.runner" />
+        
+        <activity android:name="android.view.cts.ViewStubCtsActivity"
+            android:label="ViewStubCtsActivity">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN"/>
+                <category android:name="android.intent.category.FRAMEWORK_INSTRUMENTATION_TEST" />
+            </intent-filter>
+        </activity>
+        
+        <activity android:name="android.view.cts.UsingViewsCtsActivity"
+            android:label="Using Views Test">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="android.intent.category.FRAMEWORK_INSTRUMENTATION_TEST" />
+            </intent-filter>
+        </activity>
+        
+        <activity android:name="android.view.cts.FocusHandlingCtsActivity"
+            android:label="Focus Handling Test">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="android.intent.category.FRAMEWORK_INSTRUMENTATION_TEST" />
+            </intent-filter>
+        </activity>
+        
+        <activity android:name="android.view.cts.ViewGroupCtsActivity" android:label="ViewGroupCtsActivity">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN"/>
+                <category android:name="android.intent.category.FRAMEWORK_INSTRUMENTATION_TEST" />
+            </intent-filter>
+        </activity>
+        
+        <activity android:name="android.view.cts.ViewTestCtsActivity"
+            android:label="ViewTestCtsActivity">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="android.intent.category.FRAMEWORK_INSTRUMENTATION_TEST" />
+            </intent-filter>
+        </activity>
+        
+        <activity android:name="android.view.cts.ViewLayoutPositionTestCtsActivity"
+            android:label="ViewTestCtsActivity">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="android.intent.category.FRAMEWORK_INSTRUMENTATION_TEST" />
+            </intent-filter>
+        </activity>
+
+        <activity android:name="android.view.cts.WindowCtsActivity"
+            android:theme="@android:style/Theme.Holo.NoActionBar"
+            android:label="WindowCtsActivity">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="android.intent.category.FRAMEWORK_INSTRUMENTATION_TEST" />
+            </intent-filter>
+        </activity>
+        
+        <activity android:name="android.view.animation.cts.AnimationTestCtsActivity"
+            android:label="AnimationTestCtsActivity">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN"/>
+                <category android:name="android.intent.category.FRAMEWORK_INSTRUMENTATION_TEST" />
+            </intent-filter>
+        </activity>
+
+        <activity android:name="android.view.animation.cts.GridLayoutAnimCtsActivity"
+            android:label="GridLayoutAnimCtsActivity">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN"/>
+                <category android:name="android.intent.category.FRAMEWORK_INSTRUMENTATION_TEST" />
+            </intent-filter>
+        </activity>
+
+        <activity android:name="android.view.animation.cts.LayoutAnimCtsActivity"
+            android:label="LayoutAnimCtsActivity">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN"/>
+                <category android:name="android.intent.category.FRAMEWORK_INSTRUMENTATION_TEST" />
+            </intent-filter>
+        </activity>
+        
+        <activity android:name="android.view.inputmethod.cts.InputMethodCtsActivity"
+            android:label="InputMethodCtsActivity">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN"/>
+                <category android:name="android.intent.category.FRAMEWORK_INSTRUMENTATION_TEST" />
+            </intent-filter>
+        </activity>
+        <service android:name="android.view.inputmethod.cts.InputMethodInfoStub"
+            android:label="InputMethodInfoStub">
+            <intent-filter>
+                <action android:name="android.view.InputMethod" />
+            </intent-filter>
+            <meta-data android:name="android.view.im"
+                android:resource="@xml/method" />
+        </service>
+
+        <activity android:name="android.view.cts.MenuInflaterCtsActivity"
+            android:label="MenuInflaterCtsActivity">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN"/>
+                <category android:name="android.intent.category.FRAMEWORK_INSTRUMENTATION_TEST" />
+            </intent-filter>
+        </activity>
+
+        <activity android:name="android.view.cts.SurfaceViewCtsActivity"
+            android:label="SurfaceViewCtsActivity">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN"/>
+                <category android:name="android.intent.category.FRAMEWORK_INSTRUMENTATION_TEST" />
+            </intent-filter>
+        </activity>
+
+        <activity android:name="android.view.cts.FocusFinderCtsActivity"
+            android:label="FocusFinderCtsActivity">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="android.intent.category.DEFAULT" />
+            </intent-filter>
+        </activity>
+
+        <activity android:name="android.view.cts.GestureDetectorCtsActivity"
+            android:label="GestureDetectorCtsActivity"
+            android:theme="@android:style/Theme.NoTitleBar.Fullscreen" />
+            
+        <activity android:name="android.view.cts.GLSurfaceViewCtsActivity"
+            android:label="GLSurfaceViewCts"/>
+
+        <activity android:name="android.view.cts.MockActivity" android:label="MockActivity">
+            <meta-data android:name="android.view.merge"
+                android:resource="@xml/merge" />
+        </activity>
+
+        <activity android:name="android.view.cts.ViewGroupCtsActivity"
+            android:label="WidgetViewGroupCtsActivity">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="android.intent.category.FRAMEWORK_INSTRUMENTATION_TEST" />
+            </intent-filter>
+        </activity>
+
+        <activity android:name="android.view.cts.CtsActivity"
+            android:label="CtsActivity">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="android.intent.category.FRAMEWORK_INSTRUMENTATION_TEST" />
+            </intent-filter>
+        </activity>
+
     </application>
 
     <instrumentation android:name="android.support.test.runner.AndroidJUnitRunner"
-                     android:targetPackage="com.android.cts.stub"
+                     android:targetPackage="com.android.cts.view"
                      android:label="CTS tests of android.view">
         <meta-data android:name="listener"
             android:value="com.android.cts.runner.CtsTestRunListener" />
diff --git a/tests/tests/view/res/anim/accelerate_alpha.xml b/tests/tests/view/res/anim/accelerate_alpha.xml
new file mode 100644
index 0000000..594652b
--- /dev/null
+++ b/tests/tests/view/res/anim/accelerate_alpha.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<alpha xmlns:android="http://schemas.android.com/apk/res/android"
+    android:interpolator="@android:anim/accelerate_interpolator"
+    android:fromAlpha="0.1"
+    android:toAlpha="0.9"
+    android:duration="1000" />
diff --git a/tests/tests/view/res/anim/accelerate_decelerate_alpha.xml b/tests/tests/view/res/anim/accelerate_decelerate_alpha.xml
new file mode 100644
index 0000000..7c892b2
--- /dev/null
+++ b/tests/tests/view/res/anim/accelerate_decelerate_alpha.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<alpha xmlns:android="http://schemas.android.com/apk/res/android"
+    android:interpolator="@android:anim/accelerate_decelerate_interpolator"
+    android:fromAlpha="0.0"
+    android:toAlpha="1.0"
+    android:duration="2000" />
diff --git a/tests/tests/view/res/anim/alpha.xml b/tests/tests/view/res/anim/alpha.xml
new file mode 100644
index 0000000..8893d66
--- /dev/null
+++ b/tests/tests/view/res/anim/alpha.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2008 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<alpha xmlns:android="http://schemas.android.com/apk/res/android"
+       android:fromAlpha="0.0"
+       android:toAlpha="1.0"
+       android:duration="500" />
diff --git a/tests/tests/view/res/anim/anim_alpha.xml b/tests/tests/view/res/anim/anim_alpha.xml
new file mode 100644
index 0000000..b5794c3
--- /dev/null
+++ b/tests/tests/view/res/anim/anim_alpha.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ * Copyright (C) 2008 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ -->
+
+<alpha xmlns:android="http://schemas.android.com/apk/res/android"
+       android:interpolator="@android:anim/accelerate_interpolator"
+       android:fromAlpha="0.0"
+       android:toAlpha="1.0"
+       android:duration="500" />
+
diff --git a/tests/tests/view/res/anim/anim_gridlayout.xml b/tests/tests/view/res/anim/anim_gridlayout.xml
new file mode 100644
index 0000000..be42d76
--- /dev/null
+++ b/tests/tests/view/res/anim/anim_gridlayout.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2008 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<gridLayoutAnimation xmlns:android="http://schemas.android.com/apk/res/android"
+        android:delay="10%"
+        android:rowDelay="50%"
+        android:directionPriority="column"
+        android:animation="@anim/anim_alpha" />
diff --git a/tests/tests/view/res/anim/anim_rotate.xml b/tests/tests/view/res/anim/anim_rotate.xml
new file mode 100644
index 0000000..4fbadcf
--- /dev/null
+++ b/tests/tests/view/res/anim/anim_rotate.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ * Copyright (C) 2008 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ -->
+
+<rotate xmlns:android="http://schemas.android.com/apk/res/android"
+    android:interpolator="@android:anim/decelerate_interpolator"
+    android:fromDegrees="0"
+    android:toDegrees="-45"
+    android:toYScale="0.0"
+    android:pivotX="50%"
+    android:pivotY="50%"
+    android:duration="700" />
diff --git a/tests/tests/view/res/anim/anim_scale.xml b/tests/tests/view/res/anim/anim_scale.xml
new file mode 100644
index 0000000..96a3e28
--- /dev/null
+++ b/tests/tests/view/res/anim/anim_scale.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ * Copyright (C) 2008 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ -->
+
+<scale xmlns:android="http://schemas.android.com/apk/res/android"
+    android:interpolator="@android:anim/accelerate_decelerate_interpolator"
+    android:fromXScale="1.0"
+    android:toXScale="1.4"
+    android:fromYScale="1.0"
+    android:toYScale="0.6"
+    android:pivotX="50%"
+    android:pivotY="50%"
+    android:fillAfter="false"
+    android:duration="600" />
diff --git a/tests/tests/view/res/anim/anim_set.xml b/tests/tests/view/res/anim/anim_set.xml
new file mode 100644
index 0000000..7d139a8
--- /dev/null
+++ b/tests/tests/view/res/anim/anim_set.xml
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ * Copyright (C) 2009 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ -->
+
+<set xmlns:android="http://schemas.android.com/apk/res/android" android:shareInterpolator="false">
+
+    <scale
+        android:interpolator="@android:anim/accelerate_decelerate_interpolator"
+        android:fromXScale="1.0"
+        android:toXScale="1.4"
+        android:fromYScale="1.0"
+        android:toYScale="0.6"
+        android:pivotX="50%"
+        android:pivotY="50%"
+        android:fillAfter="false"
+        android:duration="900" />
+
+    <set
+        android:interpolator="@android:anim/accelerate_interpolator"
+                android:startOffset="700">
+
+        <scale
+            android:fromXScale="1.4"
+            android:toXScale="0.0"
+            android:fromYScale="0.6"
+            android:toYScale="0.0"
+            android:pivotX="50%"
+            android:pivotY="50%"
+            android:duration="400" />
+
+        <rotate
+            android:fromDegrees="0"
+            android:toDegrees="-45"
+            android:toYScale="0.0"
+            android:pivotX="50%"
+            android:pivotY="50%"
+            android:duration="400" />
+    </set>
+
+</set>
diff --git a/tests/tests/view/res/anim/anim_translate.xml b/tests/tests/view/res/anim/anim_translate.xml
new file mode 100644
index 0000000..6659c2b
--- /dev/null
+++ b/tests/tests/view/res/anim/anim_translate.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ * Copyright (C) 2008 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ -->
+
+<translate xmlns:android="http://schemas.android.com/apk/res/android"
+    android:interpolator="@android:anim/accelerate_interpolator"
+    android:fromXDelta="100%p"
+    android:toXDelta="0"
+    android:fromYDelta="100%p"
+    android:toYDelta="0"
+    android:duration="800" />
diff --git a/tests/tests/view/res/anim/cycle_alpha.xml b/tests/tests/view/res/anim/cycle_alpha.xml
new file mode 100644
index 0000000..0a3b53c
--- /dev/null
+++ b/tests/tests/view/res/anim/cycle_alpha.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ * Copyright (C) 2009 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ -->
+
+<alpha xmlns:android="http://schemas.android.com/apk/res/android"
+       android:interpolator="@anim/cycle_interpolator"
+       android:fromAlpha="0.0"
+       android:toAlpha="1.0"
+       android:duration="2000" />
diff --git a/tests/tests/view/res/anim/cycle_interpolator.xml b/tests/tests/view/res/anim/cycle_interpolator.xml
new file mode 100644
index 0000000..d1586e5
--- /dev/null
+++ b/tests/tests/view/res/anim/cycle_interpolator.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ * Copyright (C) 2009 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ -->
+
+ <cycleInterpolator xmlns:android="http://schemas.android.com/apk/res/android" android:cycles="1" />
diff --git a/tests/tests/view/res/anim/decelerate_alpha.xml b/tests/tests/view/res/anim/decelerate_alpha.xml
new file mode 100644
index 0000000..793807e
--- /dev/null
+++ b/tests/tests/view/res/anim/decelerate_alpha.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2007 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<alpha xmlns:android="http://schemas.android.com/apk/res/android"
+    android:interpolator="@android:anim/decelerate_interpolator"
+    android:fromAlpha="0.0"
+    android:toAlpha="1.0"
+    android:duration="2000" />
diff --git a/tests/tests/view/res/anim/layout_anim_controller_animation.xml b/tests/tests/view/res/anim/layout_anim_controller_animation.xml
new file mode 100644
index 0000000..1e3608c
--- /dev/null
+++ b/tests/tests/view/res/anim/layout_anim_controller_animation.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ * Copyright (C) 2009 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ -->
+
+<alpha xmlns:android="http://schemas.android.com/apk/res/android"
+       android:interpolator="@android:anim/accelerate_interpolator"
+       android:fillAfter="true"
+       android:fromAlpha="0.0"
+       android:toAlpha="1.0"
+       android:duration="1000" />
diff --git a/tests/tests/view/res/drawable/faces.jpg b/tests/tests/view/res/drawable/faces.jpg
new file mode 100644
index 0000000..0672022
--- /dev/null
+++ b/tests/tests/view/res/drawable/faces.jpg
Binary files differ
diff --git a/tests/tests/view/res/drawable/failed.jpg b/tests/tests/view/res/drawable/failed.jpg
new file mode 100644
index 0000000..1bb9b52
--- /dev/null
+++ b/tests/tests/view/res/drawable/failed.jpg
Binary files differ
diff --git a/tests/tests/view/res/drawable/icon_black.jpg b/tests/tests/view/res/drawable/icon_black.jpg
new file mode 100644
index 0000000..4c9062a
--- /dev/null
+++ b/tests/tests/view/res/drawable/icon_black.jpg
Binary files differ
diff --git a/tests/tests/view/res/drawable/icon_blue.jpg b/tests/tests/view/res/drawable/icon_blue.jpg
new file mode 100644
index 0000000..9e6c1c8
--- /dev/null
+++ b/tests/tests/view/res/drawable/icon_blue.jpg
Binary files differ
diff --git a/tests/tests/view/res/drawable/icon_green.jpg b/tests/tests/view/res/drawable/icon_green.jpg
new file mode 100644
index 0000000..55a78f2
--- /dev/null
+++ b/tests/tests/view/res/drawable/icon_green.jpg
Binary files differ
diff --git a/tests/tests/view/res/drawable/icon_red.jpg b/tests/tests/view/res/drawable/icon_red.jpg
new file mode 100644
index 0000000..6bc9e1f
--- /dev/null
+++ b/tests/tests/view/res/drawable/icon_red.jpg
Binary files differ
diff --git a/tests/tests/view/res/drawable/icon_yellow.jpg b/tests/tests/view/res/drawable/icon_yellow.jpg
new file mode 100644
index 0000000..e748059
--- /dev/null
+++ b/tests/tests/view/res/drawable/icon_yellow.jpg
Binary files differ
diff --git a/tests/tests/view/res/drawable/ninepatch_0.9.png b/tests/tests/view/res/drawable/ninepatch_0.9.png
new file mode 100644
index 0000000..24019d8
--- /dev/null
+++ b/tests/tests/view/res/drawable/ninepatch_0.9.png
Binary files differ
diff --git a/tests/tests/view/res/drawable/ninepatch_1.9.png b/tests/tests/view/res/drawable/ninepatch_1.9.png
new file mode 100644
index 0000000..c56b1db
--- /dev/null
+++ b/tests/tests/view/res/drawable/ninepatch_1.9.png
Binary files differ
diff --git a/tests/tests/view/res/drawable/no_padding.png b/tests/tests/view/res/drawable/no_padding.png
new file mode 100644
index 0000000..7d4c27c
--- /dev/null
+++ b/tests/tests/view/res/drawable/no_padding.png
Binary files differ
diff --git a/tests/tests/view/res/drawable/padding_0.9.png b/tests/tests/view/res/drawable/padding_0.9.png
new file mode 100644
index 0000000..0127bf4
--- /dev/null
+++ b/tests/tests/view/res/drawable/padding_0.9.png
Binary files differ
diff --git a/tests/tests/view/res/drawable/pass.jpg b/tests/tests/view/res/drawable/pass.jpg
new file mode 100644
index 0000000..2f4b083
--- /dev/null
+++ b/tests/tests/view/res/drawable/pass.jpg
Binary files differ
diff --git a/tests/tests/view/res/drawable/scenery.jpg b/tests/tests/view/res/drawable/scenery.jpg
new file mode 100644
index 0000000..7a6145b
--- /dev/null
+++ b/tests/tests/view/res/drawable/scenery.jpg
Binary files differ
diff --git a/tests/tests/view/res/drawable/size_48x48.jpg b/tests/tests/view/res/drawable/size_48x48.jpg
new file mode 100644
index 0000000..5c2291e
--- /dev/null
+++ b/tests/tests/view/res/drawable/size_48x48.jpg
Binary files differ
diff --git a/tests/tests/view/res/drawable/start.jpg b/tests/tests/view/res/drawable/start.jpg
new file mode 100644
index 0000000..54e05e0
--- /dev/null
+++ b/tests/tests/view/res/drawable/start.jpg
Binary files differ
diff --git a/tests/tests/view/res/layout/abslistview_layout.xml b/tests/tests/view/res/layout/abslistview_layout.xml
new file mode 100644
index 0000000..a090ce3
--- /dev/null
+++ b/tests/tests/view/res/layout/abslistview_layout.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2008 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<ViewGroup_Layout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:id="@+id/abslistview_root"
+    android:layout_width="25px"
+    android:layout_height="25px" >
+
+   <GridView
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content" />
+
+   <ListView>
+        <TextView
+            android:text="@string/table_layout_first"
+            android:padding="3dip" />
+        <TextView
+            android:text="@string/table_layout_second"
+            android:padding="3dip" />
+        <TextView
+            android:text="@string/table_layout_third"
+            android:padding="3dip" />
+    </ListView>
+</ViewGroup_Layout>
+
diff --git a/tests/tests/view/res/layout/anim_layout.xml b/tests/tests/view/res/layout/anim_layout.xml
new file mode 100644
index 0000000..b6aa906
--- /dev/null
+++ b/tests/tests/view/res/layout/anim_layout.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ * Copyright (C) 2008 The Android Open Source Project.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ -->
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+                android:layout_width="match_parent"
+                android:layout_height="match_parent"
+                android:id="@+id/anim_window_parent">
+
+    <TextView android:id="@+id/anim_window"
+        android:layout_width="100dip"
+        android:layout_height="20dip"
+        android:text="@string/text_view_hello"/>
+
+</LinearLayout>
diff --git a/tests/tests/view/res/layout/focus_finder_layout.xml b/tests/tests/view/res/layout/focus_finder_layout.xml
new file mode 100644
index 0000000..0502fd8
--- /dev/null
+++ b/tests/tests/view/res/layout/focus_finder_layout.xml
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2010 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent">
+    <TableLayout android:id="@+id/layout"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_centerInParent="true">
+        <TableRow>
+            <android.view.cts.TestButton android:id="@+id/top_left_button"
+                    android:layout_width="match_parent"
+                    android:layout_height="match_parent"
+                    android:text="TL" />
+            <android.view.cts.TestButton android:id="@+id/top_right_button"
+                    android:layout_width="match_parent"
+                    android:layout_height="match_parent"
+                    android:text="TR" />
+        </TableRow>
+        <TableRow>
+            <android.view.cts.TestButton android:id="@+id/bottom_left_button"
+                    android:layout_width="match_parent"
+                    android:layout_height="match_parent"
+                    android:text="BL" />
+            <android.view.cts.TestButton android:id="@+id/bottom_right_button"
+                    android:layout_width="match_parent"
+                    android:layout_height="match_parent"
+                    android:text="BR" />
+        </TableRow>  
+    </TableLayout>
+</RelativeLayout>
+
diff --git a/tests/tests/view/res/layout/focus_handling_layout.xml b/tests/tests/view/res/layout/focus_handling_layout.xml
new file mode 100644
index 0000000..84c8e6a
--- /dev/null
+++ b/tests/tests/view/res/layout/focus_handling_layout.xml
@@ -0,0 +1,57 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent">
+
+    <View
+        android:id="@+id/view1"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:text="@string/id_ok"/>
+
+    <View
+        android:id="@+id/view2"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_toRightOf="@id/view1"
+        android:layout_alignTop="@id/view1"
+        android:nextFocusLeft="@id/view1"
+        android:text="@string/id_ok"/>
+
+    <View
+        android:id="@+id/view3"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_below="@id/view1"
+        android:layout_alignLeft="@id/view1"
+        android:nextFocusUp="@id/view1"
+        android:text="@string/id_ok"/>
+
+    <View
+        android:id="@+id/view4"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_toRightOf="@id/view3"
+        android:layout_alignTop="@id/view3"
+        android:layout_alignRight="@id/view2"
+        android:nextFocusUp="@id/view2"
+        android:nextFocusLeft="@id/view3"
+        android:text="@string/id_ok"/>
+</RelativeLayout>
+
diff --git a/tests/tests/view/res/layout/gridlayout_anim_controller_layout.xml b/tests/tests/view/res/layout/gridlayout_anim_controller_layout.xml
new file mode 100644
index 0000000..0ff2d46
--- /dev/null
+++ b/tests/tests/view/res/layout/gridlayout_anim_controller_layout.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<GridView xmlns:android="http://schemas.android.com/apk/res/android"
+    android:id="@+id/gridlayout_anim_gridview"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:padding="10dp"
+    android:verticalSpacing="20dp"
+    android:horizontalSpacing="20dp"
+    android:numColumns="3"
+    android:columnWidth="60dp"
+    android:stretchMode="columnWidth"
+    android:gravity="center"
+/>
diff --git a/tests/tests/view/res/layout/inflater_layout.xml b/tests/tests/view/res/layout/inflater_layout.xml
new file mode 100644
index 0000000..cff224e
--- /dev/null
+++ b/tests/tests/view/res/layout/inflater_layout.xml
@@ -0,0 +1,66 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2008 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content">
+
+    <TextView android:id="@+id/numeric_default"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:editable="true"/>
+
+    <TextView android:id="@+id/numeric_integer"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:numeric="integer"/>
+
+    <TextView android:id="@+id/numeric_signed"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:numeric="signed"/>
+
+    <TextView android:id="@+id/numeric_decimal"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:numeric="decimal"/>
+
+    <TextView android:id="@+id/numeric_signed_integer"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:numeric="signed|integer"/>
+
+    <TextView android:id="@+id/numeric_integer_decimal"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:numeric="integer|decimal"/>
+
+    <TextView android:id="@+id/numeric_signed_decimal"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:numeric="signed|decimal"/>
+
+    <TextView android:id="@+id/numeric_signed_decimal_integer"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:numeric="signed|integer|decimal"/>
+
+     <android.view.cts.MockViewStub class="android.view.cts.MockViewStub"
+        android:id="@+id/autotext_default"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"/>
+
+</LinearLayout>
diff --git a/tests/tests/view/res/layout/inflater_layout_tags.xml b/tests/tests/view/res/layout/inflater_layout_tags.xml
new file mode 100644
index 0000000..dc3eb29
--- /dev/null
+++ b/tests/tests/view/res/layout/inflater_layout_tags.xml
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+-->
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:id="@+id/viewlayout_root"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:orientation="vertical" >
+
+    <tag
+        android:id="@+id/tag_viewlayout_root"
+        android:value="@string/tag1" />
+
+    <View
+        android:id="@+id/mock_view"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content" >
+
+        <tag
+            android:id="@+id/tag_mock_view"
+            android:value="@string/tag2" />
+    </View>
+
+</LinearLayout>
\ No newline at end of file
diff --git a/tests/tests/view/res/layout/inflater_override_theme_layout.xml b/tests/tests/view/res/layout/inflater_override_theme_layout.xml
new file mode 100644
index 0000000..2d2a578
--- /dev/null
+++ b/tests/tests/view/res/layout/inflater_override_theme_layout.xml
@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2013 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content"
+    android:orientation="vertical"
+    android:theme="@style/Theme_OverrideOuter" >
+
+    <View
+        android:id="@+id/view_outer"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content" />
+
+    <LinearLayout
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:orientation="vertical"
+        android:theme="@style/Theme_OverrideInner" >
+
+        <View
+            android:id="@+id/view_inner"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content" />
+        <View
+            android:id="@+id/view_attr"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:theme="?attr/themeOverrideAttr" />
+    </LinearLayout>
+
+</LinearLayout>
diff --git a/tests/tests/view/res/layout/inputmethod_edittext.xml b/tests/tests/view/res/layout/inputmethod_edittext.xml
new file mode 100755
index 0000000..849b411
--- /dev/null
+++ b/tests/tests/view/res/layout/inputmethod_edittext.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2008 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+                  android:layout_width="fill_parent"
+                  android:layout_height="wrap_content"
+                  android:background="@drawable/blue"
+                android:padding="10px">
+
+    <EditText android:id="@+id/entry"
+              android:layout_width="fill_parent"
+              android:layout_height="wrap_content"
+              android:background="@android:drawable/editbox_background"/>
+
+</RelativeLayout>
diff --git a/tests/tests/view/res/layout/scrollview_layout.xml b/tests/tests/view/res/layout/scrollview_layout.xml
new file mode 100644
index 0000000..c5b7b43
--- /dev/null
+++ b/tests/tests/view/res/layout/scrollview_layout.xml
@@ -0,0 +1,105 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2008 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<android.view.cts.MyScrollView xmlns:android="http://schemas.android.com/apk/res/android"
+    android:id="@+id/scroll_view"
+    android:layout_width="100dip"
+    android:layout_height="100dip">
+
+    <LinearLayout
+        android:orientation="vertical"
+        android:layout_width="250dip"
+        android:layout_height="wrap_content">
+
+        <Button
+            android:id="@+id/first_child"
+            android:layout_width="250dip"
+            android:layout_height="100dip"
+            android:text="@string/vertical_text_1"/>
+
+        <Button
+            android:layout_width="250dip"
+            android:layout_height="100dip"
+            android:text="@string/vertical_text_2"/>
+
+        <Button
+            android:layout_width="250dip"
+            android:layout_height="100dip"
+            android:text="@string/vertical_text_3"/>
+
+        <Button
+            android:layout_width="250dip"
+            android:layout_height="100dip"
+            android:text="@string/vertical_text_1"/>
+
+        <Button
+            android:layout_width="250dip"
+            android:layout_height="100dip"
+            android:text="@string/vertical_text_2"/>
+
+        <Button
+            android:layout_width="250dip"
+            android:layout_height="100dip"
+            android:text="@string/vertical_text_3"/>
+
+        <Button
+            android:layout_width="250dip"
+            android:layout_height="100dip"
+            android:text="@string/vertical_text_1"/>
+
+        <Button
+            android:layout_width="250dip"
+            android:layout_height="100dip"
+            android:text="@string/vertical_text_2"/>
+
+        <Button
+            android:layout_width="250dip"
+            android:layout_height="100dip"
+            android:text="@string/vertical_text_3"/>
+
+        <Button
+            android:layout_width="250dip"
+            android:layout_height="100dip"
+            android:text="@string/vertical_text_1"/>
+
+        <Button
+            android:layout_width="250dip"
+            android:layout_height="100dip"
+            android:text="@string/vertical_text_2"/>
+
+        <Button
+            android:layout_width="250dip"
+            android:layout_height="100dip"
+            android:text="@string/vertical_text_3"/>
+
+        <Button
+            android:layout_width="250dip"
+            android:layout_height="100dip"
+            android:text="@string/vertical_text_1"/>
+
+        <Button
+            android:layout_width="250dip"
+            android:layout_height="100dip"
+            android:text="@string/vertical_text_2"/>
+
+        <Button
+            android:id="@+id/last_child"
+            android:layout_width="250dip"
+            android:layout_height="100dip"
+            android:text="@string/vertical_text_3"/>
+    </LinearLayout>
+
+</android.view.cts.MyScrollView>
diff --git a/tests/tests/view/res/layout/searchview.xml b/tests/tests/view/res/layout/searchview.xml
new file mode 100644
index 0000000..dba105a
--- /dev/null
+++ b/tests/tests/view/res/layout/searchview.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2011 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+    <SearchView android:id="@+id/searchView1"
+                android:layout_width="fill_parent"
+                android:layout_height="fill_parent"
+                xmlns:android="http://schemas.android.com/apk/res/android">
+    </SearchView>
diff --git a/tests/tests/view/res/layout/textview_layout.xml b/tests/tests/view/res/layout/textview_layout.xml
new file mode 100644
index 0000000..c09b93a
--- /dev/null
+++ b/tests/tests/view/res/layout/textview_layout.xml
@@ -0,0 +1,220 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2008 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:id="@+id/layout_textviewtest">
+
+    <ScrollView android:layout_width="match_parent"
+            android:layout_height="match_parent">
+
+        <LinearLayout android:orientation="vertical"
+                android:layout_width="match_parent"
+                android:layout_height="match_parent">
+
+            <TextView android:id="@+id/textview_textAttr"
+                    android:text="@string/text_view_hello"
+                    android:textColor="@drawable/black"
+                    android:textColorHighlight="@drawable/yellow"
+                    android:textColorHint="@drawable/red"
+                    android:textColorLink="@drawable/blue"
+                    android:textScaleX="1.2"
+                    android:typeface="normal"
+                    android:textSize="20px"
+                    android:textStyle="normal"
+                    android:textAppearance="@null"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"/>
+        
+            <TextView android:id="@+id/textview_password"
+                    android:password="true"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"/>
+        
+            <TextView android:id="@+id/textview_singleLine"
+                    android:singleLine="true"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"/>
+        
+            <TextView android:id="@+id/textview_text"
+                    android:text="@string/text_view_hello"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"/>
+
+            <TextView android:id="@+id/textview_text_two_lines"
+                    android:text="@string/text_view_hello_two_lines"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"/>
+
+            <android.view.cts.MockTextView
+                    android:id="@+id/mock_textview_left"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:requiresFadingEdge="horizontal"
+                    android:singleLine="true"
+                    android:text="@string/long_text"
+                    android:gravity="left"
+                    />
+
+            <android.view.cts.MockTextView
+                    android:id="@+id/mock_textview_right"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:requiresFadingEdge="horizontal"
+                    android:singleLine="true"
+                    android:text="@string/long_text"
+                    android:gravity="right"
+                    />
+
+            <android.view.cts.MockTextView
+                    android:id="@+id/mock_textview_center"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:requiresFadingEdge="horizontal"
+                    android:singleLine="true"
+                    android:text="@string/long_text"
+                    android:gravity="center"
+                    />
+        </LinearLayout>
+
+    </ScrollView>
+
+    <TextView android:id="@+id/textview_ltr"
+              android:layout_height="wrap_content"
+              android:layout_width="wrap_content"/>
+
+    <TextView android:id="@+id/textview_rtl"
+              android:layout_height="wrap_content"
+              android:layout_width="wrap_content"/>
+
+    <TextView android:id="@+id/textview_drawable_1_1"
+              android:layout_height="wrap_content"
+              android:layout_width="wrap_content"
+              android:drawableLeft="@drawable/icon_blue"
+              android:drawableRight="@drawable/icon_red"
+              android:drawableTop="@drawable/icon_green"
+              android:drawableBottom="@drawable/icon_yellow"
+            />
+
+    <TextView android:id="@+id/textview_drawable_1_2"
+              android:layout_height="wrap_content"
+              android:layout_width="wrap_content"
+              android:drawableLeft="@drawable/icon_blue"
+              android:drawableRight="@drawable/icon_red"
+              android:drawableTop="@drawable/icon_green"
+              android:drawableBottom="@drawable/icon_yellow"
+              android:layoutDirection="rtl"
+            />
+
+    <TextView android:id="@+id/textview_drawable_2_1"
+              android:layout_height="wrap_content"
+              android:layout_width="wrap_content"
+              android:drawableStart="@drawable/icon_blue"
+              android:drawableEnd="@drawable/icon_red"
+              android:drawableTop="@drawable/icon_green"
+              android:drawableBottom="@drawable/icon_yellow"
+            />
+
+    <TextView android:id="@+id/textview_drawable_2_2"
+              android:layout_height="wrap_content"
+              android:layout_width="wrap_content"
+              android:drawableStart="@drawable/icon_blue"
+              android:drawableEnd="@drawable/icon_red"
+              android:drawableTop="@drawable/icon_green"
+              android:drawableBottom="@drawable/icon_yellow"
+              android:layoutDirection="rtl"
+            />
+
+    <TextView android:id="@+id/textview_drawable_3_1"
+              android:layout_height="wrap_content"
+              android:layout_width="wrap_content"
+              android:drawableLeft="@drawable/icon_black"
+              android:drawableRight="@drawable/icon_black"
+              android:drawableStart="@drawable/icon_blue"
+              android:drawableEnd="@drawable/icon_red"
+              android:drawableTop="@drawable/icon_green"
+              android:drawableBottom="@drawable/icon_yellow"
+            />
+
+    <TextView android:id="@+id/textview_drawable_3_2"
+              android:layout_height="wrap_content"
+              android:layout_width="wrap_content"
+              android:drawableLeft="@drawable/icon_black"
+              android:drawableRight="@drawable/icon_black"
+              android:drawableStart="@drawable/icon_blue"
+              android:drawableEnd="@drawable/icon_red"
+              android:drawableTop="@drawable/icon_green"
+              android:drawableBottom="@drawable/icon_yellow"
+              android:layoutDirection="rtl"
+            />
+
+
+    <LinearLayout android:orientation="vertical"
+                  android:layout_width="match_parent"
+                  android:layout_height="match_parent"
+                  android:layoutDirection="ltr">
+
+        <TextView android:id="@+id/textview_drawable_4_1"
+                  android:layout_height="wrap_content"
+                  android:layout_width="wrap_content"
+                  android:drawableStart="@drawable/icon_blue"
+                  android:drawableEnd="@drawable/icon_red"
+                  android:drawableTop="@drawable/icon_green"
+                  android:drawableBottom="@drawable/icon_yellow"
+                />
+
+        <TextView android:id="@+id/textview_drawable_5_1"
+                  android:layout_height="wrap_content"
+                  android:layout_width="wrap_content"
+                  android:drawableLeft="@drawable/icon_black"
+                  android:drawableRight="@drawable/icon_black"
+                  android:drawableStart="@drawable/icon_blue"
+                  android:drawableEnd="@drawable/icon_red"
+                  android:drawableTop="@drawable/icon_green"
+                  android:drawableBottom="@drawable/icon_yellow"
+                />
+
+    </LinearLayout>
+
+    <LinearLayout android:orientation="vertical"
+                  android:layout_width="match_parent"
+                  android:layout_height="match_parent"
+                  android:layoutDirection="rtl">
+
+        <TextView android:id="@+id/textview_drawable_4_2"
+                  android:layout_height="wrap_content"
+                  android:layout_width="wrap_content"
+                  android:drawableStart="@drawable/icon_blue"
+                  android:drawableEnd="@drawable/icon_red"
+                  android:drawableTop="@drawable/icon_green"
+                  android:drawableBottom="@drawable/icon_yellow"
+                />
+
+        <TextView android:id="@+id/textview_drawable_5_2"
+                  android:layout_height="wrap_content"
+                  android:layout_width="wrap_content"
+                  android:drawableLeft="@drawable/icon_black"
+                  android:drawableRight="@drawable/icon_black"
+                  android:drawableStart="@drawable/icon_blue"
+                  android:drawableEnd="@drawable/icon_red"
+                  android:drawableTop="@drawable/icon_green"
+                  android:drawableBottom="@drawable/icon_yellow"
+                />
+
+    </LinearLayout>
+
+</LinearLayout>
diff --git a/tests/tests/view/res/layout/using_views_layout.xml b/tests/tests/view/res/layout/using_views_layout.xml
new file mode 100644
index 0000000..b35aa08
--- /dev/null
+++ b/tests/tests/view/res/layout/using_views_layout.xml
@@ -0,0 +1,77 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent">
+
+    <TextView
+        android:id="@+id/country"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:text="@string/country"/>
+
+    <EditText
+        android:id="@+id/entry"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:background="@android:drawable/editbox_background"
+        android:layout_below="@id/country"/>
+
+    <Button
+        android:id="@+id/cancel"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_below="@id/entry"
+        android:layout_alignParentRight="true"
+        android:layout_marginLeft="10dip"
+        android:text="@string/id_cancel"/>
+
+    <Button
+        android:id="@+id/ok"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_toLeftOf="@id/cancel"
+        android:layout_alignTop="@id/cancel"
+        android:text="@string/id_ok"/>
+
+    <TextView
+        android:id="@+id/symbol"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:layout_below="@id/ok"
+        android:text="@string/symbol"/>
+
+    <TextView
+        android:id="@+id/symbolball"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:layout_below="@id/symbol"
+        android:layout_marginLeft="20dip"/>
+
+    <TextView
+        android:id="@+id/warning"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:background="#aa0000"
+        android:layout_below="@id/symbolball"
+        android:text="@string/country_warning"
+        android:visibility="invisible"
+        android:layout_weight="2"/>
+
+</RelativeLayout>
+
diff --git a/tests/tests/view/res/layout/view_layout.xml b/tests/tests/view/res/layout/view_layout.xml
new file mode 100644
index 0000000..fa817dc
--- /dev/null
+++ b/tests/tests/view/res/layout/view_layout.xml
@@ -0,0 +1,103 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+ * Copyright (C) 2008 Esmertec AG.
+ * Copyright (C) 2008 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+-->
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:id="@+id/viewlayout_root"
+    android:orientation="vertical"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent">
+
+    <android.view.cts.MockView
+        android:id="@+id/mock_view"
+        android:layout_width="100px"
+        android:layout_height="200px"/>
+
+    <android.view.cts.MockView
+        android:id="@+id/scroll_view"
+        android:layout_width="100px"
+        android:layout_height="200px"
+        android:scrollbars="horizontal|vertical"
+        android:fadingEdge="horizontal|vertical"
+        android:fadingEdgeLength="20px"/>
+
+    <android.view.cts.MockView
+        android:id="@+id/scroll_view_2"
+        android:layout_width="100px"
+        android:layout_height="200px"
+        android:scrollbars="horizontal|vertical"
+        android:requiresFadingEdge="horizontal|vertical"
+        android:fadingEdgeLength="20px"/>
+
+    <View
+        android:id="@+id/fit_windows"
+        android:fitsSystemWindows="true"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"/>
+
+    <android.view.cts.MockView
+            android:id="@+id/mock_view_padding_full"
+            android:layout_width="200px"
+            android:layout_height="200px"
+            android:padding="0px"
+            android:background="@drawable/padding_0" />
+
+    <android.view.cts.MockView
+            android:id="@+id/mock_view_padding_left"
+            android:layout_width="200px"
+            android:layout_height="200px"
+            android:paddingLeft="0px"
+            android:background="@drawable/padding_0" />
+
+    <android.view.cts.MockView
+            android:id="@+id/mock_view_padding_right"
+            android:layout_width="200px"
+            android:layout_height="200px"
+            android:paddingRight="0px"
+            android:background="@drawable/padding_0" />
+
+    <android.view.cts.MockView
+            android:id="@+id/mock_view_padding_top"
+            android:layout_width="200px"
+            android:layout_height="200px"
+            android:paddingTop="0px"
+            android:background="@drawable/padding_0" />
+
+    <android.view.cts.MockView
+            android:id="@+id/mock_view_padding_bottom"
+            android:layout_width="200px"
+            android:layout_height="200px"
+            android:paddingBottom="0dp"
+            android:background="@drawable/padding_0" />
+
+    <android.view.cts.MockView
+            android:id="@+id/mock_view_padding_runtime_updated"
+            android:layout_width="200px"
+            android:layout_height="200px"
+            android:paddingStart="8px"
+            android:paddingEnd="8px"
+            android:background="@drawable/no_padding" />
+
+    <View
+        android:id="@+id/background_tint"
+        android:backgroundTint="@android:color/white"
+        android:backgroundTintMode="src_over"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content" />
+
+</LinearLayout>
diff --git a/tests/tests/view/res/layout/view_layout_position.xml b/tests/tests/view/res/layout/view_layout_position.xml
new file mode 100644
index 0000000..7d28186
--- /dev/null
+++ b/tests/tests/view/res/layout/view_layout_position.xml
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+ * Copyright (C) 2008 Esmertec AG.
+ * Copyright (C) 2008 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+-->
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:orientation="vertical"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent">
+
+    <LinearLayout
+            android:id="@+id/testparent"
+            android:layout_marginLeft = "1dip"
+            android:layout_marginTop = "2dip"
+            android:layout_marginRight = "3dip"
+            android:layout_marginBottom = "4dip"
+            android:orientation="vertical"
+            android:layout_width="match_parent"
+            android:layout_height="match_parent">
+
+        <View
+            android:id="@+id/testview"
+            android:layout_marginLeft = "5dip"
+            android:layout_marginTop = "6dip"
+            android:layout_marginRight = "7dip"
+            android:layout_marginBottom = "8dip"
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"/>
+
+    </LinearLayout>
+</LinearLayout>
diff --git a/tests/tests/view/res/layout/view_visibility_layout.xml b/tests/tests/view/res/layout/view_visibility_layout.xml
new file mode 100644
index 0000000..92d22ed
--- /dev/null
+++ b/tests/tests/view/res/layout/view_visibility_layout.xml
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:orientation="vertical">
+
+    <View
+        android:id="@+id/textview1"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:visibility="visible"/>
+
+    <View
+        android:id="@+id/textview2"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:visibility="invisible"/>
+
+    <View
+        android:id="@+id/textview3"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:visibility="gone"/>
+</LinearLayout>
+
diff --git a/tests/tests/view/res/layout/viewgroup_margin_layout.xml b/tests/tests/view/res/layout/viewgroup_margin_layout.xml
new file mode 100644
index 0000000..8e750c9
--- /dev/null
+++ b/tests/tests/view/res/layout/viewgroup_margin_layout.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ * Copyright (C) 2008 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ -->
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:orientation="vertical"
+    android:padding="10dip"
+    android:layout_width="200dip"
+    android:layout_height="300dip">
+</LinearLayout>
+
diff --git a/tests/tests/view/res/layout/viewgrouptest_stub.xml b/tests/tests/view/res/layout/viewgrouptest_stub.xml
new file mode 100644
index 0000000..1160d0e
--- /dev/null
+++ b/tests/tests/view/res/layout/viewgrouptest_stub.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ * Copyright (C) 2008 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ -->
+
+<android.view.cts.MockLinearLayout
+        xmlns:android="http://schemas.android.com/apk/res/android"
+    android:orientation="vertical"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:id="@+id/mocklinearlayout">
+
+    <!-- view1 goes on top -->
+    <TextView
+        android:id="@+id/viewgrouptest_stub"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+    />
+
+</android.view.cts.MockLinearLayout>
+
diff --git a/tests/tests/view/res/layout/viewstub_layout.xml b/tests/tests/view/res/layout/viewstub_layout.xml
new file mode 100644
index 0000000..5c7ff22
--- /dev/null
+++ b/tests/tests/view/res/layout/viewstub_layout.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ * Copyright (C) 2008 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ -->
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:orientation="vertical"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent">
+
+    <ViewStub android:id="@+id/viewstub"
+        android:inflatedId="@+id/inflated_id"
+        android:layout="@layout/textview_layout"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content" />
+
+</LinearLayout>
diff --git a/tests/tests/view/res/layout/viewtreeobserver_layout.xml b/tests/tests/view/res/layout/viewtreeobserver_layout.xml
new file mode 100644
index 0000000..66e98b2
--- /dev/null
+++ b/tests/tests/view/res/layout/viewtreeobserver_layout.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2008 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+                android:id="@+id/linearlayout"
+                android:orientation="vertical"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content">
+
+    <View android:id="@+id/view1"
+        android:layout_width="match_parent"
+        android:layout_height="10dip"
+        android:focusable="true"/>
+
+    <View android:id="@+id/view2"
+        android:layout_width="match_parent"
+        android:layout_height="10dip"
+        android:focusable="true"/>
+
+    <Button android:id="@+id/button1"
+        android:layout_width="wrap_content"
+        android:layout_height="10dip" />
+
+</LinearLayout>
+
diff --git a/tests/tests/view/res/layout/windowstub_addlayout.xml b/tests/tests/view/res/layout/windowstub_addlayout.xml
new file mode 100644
index 0000000..0d6399e
--- /dev/null
+++ b/tests/tests/view/res/layout/windowstub_addlayout.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ * Copyright (C) 2009 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ -->
+
+<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
+    android:orientation="vertical"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent">
+
+    <TextView android:id="@+id/listview_addwindow"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content" />
+
+</ScrollView>
diff --git a/tests/tests/view/res/layout/windowstub_layout.xml b/tests/tests/view/res/layout/windowstub_layout.xml
new file mode 100644
index 0000000..0cf7d6d
--- /dev/null
+++ b/tests/tests/view/res/layout/windowstub_layout.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ * Copyright (C) 2008 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ -->
+
+<TextView xmlns:android="http://schemas.android.com/apk/res/android"
+        android:id="@+id/listview_window"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content" >
+     </TextView>
diff --git a/tests/tests/view/res/layout/windowstub_presentation.xml b/tests/tests/view/res/layout/windowstub_presentation.xml
new file mode 100644
index 0000000..80490c4
--- /dev/null
+++ b/tests/tests/view/res/layout/windowstub_presentation.xml
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ * Copyright (C) 2013 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ -->
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:orientation="vertical"
+    android:layout_width="fill_parent"
+    android:layout_height="fill_parent">
+    <Button
+        android:id="@+id/presentation_button1"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_gravity="center"
+        android:layout_weight="1"
+        android:text="@string/vertical_text_1" />
+    <Button
+        android:id="@+id/presentation_button2"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_gravity="center"
+        android:layout_weight="1"
+        android:text="@string/vertical_text_2" />
+    <Button
+        android:id="@+id/presentation_button3"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_gravity="center"
+        android:layout_weight="1"
+        android:text="@string/vertical_text_3" />
+</LinearLayout>
diff --git a/tests/tests/view/res/menu/browser.xml b/tests/tests/view/res/menu/browser.xml
new file mode 100644
index 0000000..29e5149
--- /dev/null
+++ b/tests/tests/view/res/menu/browser.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2008 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<menu xmlns:android="http://schemas.android.com/apk/res/android">
+    <group android:id="@+id/MAIN_MENU">
+        <item android:id="@+id/goto_menu_id"
+            android:title="@string/hello_world"
+            android:alphabeticShortcut="l"/>
+    </group>
+
+</menu>
diff --git a/tests/tests/view/res/menu/category_order.xml b/tests/tests/view/res/menu/category_order.xml
new file mode 100644
index 0000000..06a6993
--- /dev/null
+++ b/tests/tests/view/res/menu/category_order.xml
@@ -0,0 +1,57 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2008 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<menu xmlns:android="http://schemas.android.com/apk/res/android">
+
+    <!-- This group uses the default category. -->
+    <group android:id="@+id/most_used_items">
+
+        <item android:id="@+id/last_most_item"
+            android:orderInCategory="5"
+            android:title="Last most often" />
+
+        <item android:id="@+id/middle_most_item"
+            android:orderInCategory="3"
+            android:title="Middle most often" />
+
+        <item android:id="@+id/first_most_item"
+            android:orderInCategory="1"
+            android:title="First most often" />
+
+    </group>
+
+    <!-- This group uses the secondary category, which is used for less oftenly used items.
+         Notice these items will show up after the above items.
+         (Furthermore, notice how the orders in each category are independent from the other
+         category.) -->
+    <group android:id="@+id/least_used_items"
+        android:menuCategory="secondary">
+
+        <item android:id="@+id/last_least_item"
+            android:orderInCategory="4"
+            android:title="Last least often" />
+
+        <item android:id="@+id/middle_least_item"
+            android:orderInCategory="2"
+            android:title="Middle least often" />
+
+        <item android:id="@+id/first_least_item"
+            android:orderInCategory="0"
+            android:title="First least often" />
+
+    </group>
+
+</menu>
diff --git a/tests/tests/view/res/menu/checkable.xml b/tests/tests/view/res/menu/checkable.xml
new file mode 100644
index 0000000..339d9c9
--- /dev/null
+++ b/tests/tests/view/res/menu/checkable.xml
@@ -0,0 +1,92 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2008 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<menu xmlns:android="http://schemas.android.com/apk/res/android">
+
+    <!-- Checkable items appear only in submenus or context menus. -->
+
+    <!-- Carefully look at the attribute name checkableBehavior on groups, but
+         the attribute name checkable on items. The checkableBehavior encompasses
+         the number of items that will be checkable within that group. -->
+
+    <item android:title="None">
+        <menu>
+            <!-- The none checkableBehavior is default, but we explicitly show it here. -->
+            <group android:id="@+id/noncheckable_group"
+                    android:checkableBehavior="none">
+                <!-- Notice how these items inherit from the group. -->
+                <item android:id="@+id/noncheckable_item_1"
+                        android:title="Item 1" />
+                <item android:id="@+id/noncheckable_item_2"
+                        android:title="Item 2" />
+                <item android:id="@+id/noncheckable_item_3"
+                        android:title="Item 3" />
+            </group>
+        </menu>
+    </item>
+
+    <item android:title="All">
+        <menu>
+            <group android:id="@+id/checkable_group"
+                    android:checkableBehavior="all">
+                <!-- Notice how these items inherit from the group. -->
+                <item android:id="@+id/checkable_item_1"
+                        android:title="Item 1" />
+                <item android:id="@+id/checkable_item_2"
+                        android:title="Item 2"
+                        android:checked="true" />
+                <item android:id="@+id/checkable_item_3"
+                        android:title="Item 3"
+                        android:checked="true" />
+            </group>
+        </menu>
+    </item>
+
+    <item android:title="Single">
+        <menu>
+            <group android:id="@+id/exclusive_checkable_group"
+                    android:checkableBehavior="single">
+                <!-- Notice how these items inherit from the group. -->
+                <item android:id="@+id/exclusive_checkable_item_1"
+                        android:title="Item 1" />
+                <item android:id="@+id/exclusive_checkable_item_2"
+                        android:title="Item 2" />
+                <item android:id="@+id/exclusive_checkable_item_3"
+                        android:title="Item 3"
+                        android:checked="true" />
+            </group>
+        </menu>
+    </item>
+
+    <item android:title="All without group"
+            android:id="@+id/submenu">
+        <menu>
+            <!-- Notice how these items have each set. -->
+            <item android:id="@+id/nongroup_checkable_item_1"
+                    android:title="Item 1"
+                    android:checkable="true" />
+            <item android:id="@+id/nongroup_checkable_item_2"
+                    android:title="Item 2"
+                    android:checkable="true"
+                    android:checked="true" />
+            <item android:id="@+id/nongroup_checkable_item_3"
+                    android:title="Item 3"
+                    android:checkable="true"
+                    android:checked="true" />
+        </menu>
+    </item>
+
+</menu>
diff --git a/tests/tests/view/res/menu/menu_searchview.xml b/tests/tests/view/res/menu/menu_searchview.xml
new file mode 100644
index 0000000..d9f6475
--- /dev/null
+++ b/tests/tests/view/res/menu/menu_searchview.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2011 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<menu xmlns:android="http://schemas.android.com/apk/res/android">
+    <item android:id="@+id/menu_search"
+        android:title="Search"
+        android:icon="@android:drawable/ic_menu_search"
+        android:showAsAction="ifRoom"
+        android:actionLayout="@layout/searchview" />
+</menu>
\ No newline at end of file
diff --git a/tests/tests/view/res/menu/title_icon.xml b/tests/tests/view/res/menu/title_icon.xml
new file mode 100644
index 0000000..d8cdc52
--- /dev/null
+++ b/tests/tests/view/res/menu/title_icon.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2008 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<menu xmlns:android="http://schemas.android.com/apk/res/android">
+
+    <item android:id="@+id/start"
+        android:title="Start"
+        android:icon="@drawable/start" />
+
+    <item android:id="@+id/pass"
+        android:title="Pass"
+        android:icon="@drawable/pass" />
+
+    <item android:id="@+id/failed"
+        android:title="Failed"
+        android:icon="@drawable/failed" />
+
+</menu>
diff --git a/tests/tests/view/res/menu/visible_shortcut.xml b/tests/tests/view/res/menu/visible_shortcut.xml
new file mode 100644
index 0000000..4d6f362
--- /dev/null
+++ b/tests/tests/view/res/menu/visible_shortcut.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2008 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<menu xmlns:android="http://schemas.android.com/apk/res/android">
+
+    <item android:id="@+id/visible_item"
+        android:title="Visible"
+        android:alphabeticShortcut="a" />
+
+    <item android:id="@+id/hidden_item"
+        android:title="Hidden"
+        android:visible="false"
+        android:alphabeticShortcut="b" />
+
+    <group android:id="@+id/hidden_group"
+        android:visible="false">
+
+        <item android:id="@+id/hidden_by_group"
+            android:title="Hidden by group"
+            android:alphabeticShortcut="c" />
+
+    </group>
+
+</menu>
diff --git a/tests/tests/view/res/values/arrays.xml b/tests/tests/view/res/values/arrays.xml
new file mode 100644
index 0000000..71e0133
--- /dev/null
+++ b/tests/tests/view/res/values/arrays.xml
@@ -0,0 +1,57 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ * Copyright (C) 2008 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ -->
+
+<resources>
+    <item type="integer" name="reference" format="integer">101</item>
+
+      <string-array name="strings">
+        <item>zero</item>
+        <item>1</item>
+        <item>@string/reference</item>
+    </string-array>
+
+    <integer-array name="integers">
+        <item>0</item>
+        <item>1</item>
+        <item>@integer/reference</item>
+    </integer-array>
+
+    <array name="difficultyLevel">
+        <item>Easy</item>
+        <item>Medium</item>
+        <item>Hard</item>
+    </array>
+
+    <string-array name="string">
+        <item>Test String 1</item>
+        <item>Test String 2</item>
+        <item>Test String 3</item>
+    </string-array>
+
+    <integer-array name="table_row_layout">
+        <item>1</item>
+        <item>2</item>
+        <item>3</item>
+        <item>4</item>
+        <item>5</item>
+        <item>6</item>
+        <item>7</item>
+        <item>8</item>
+        <item>9</item>
+        <item>10</item>
+    </integer-array>
+</resources>
diff --git a/tests/tests/view/res/values/attrs.xml b/tests/tests/view/res/values/attrs.xml
new file mode 100644
index 0000000..4c3d9db
--- /dev/null
+++ b/tests/tests/view/res/values/attrs.xml
@@ -0,0 +1,145 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ * Copyright (C) 2008 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ -->
+
+<resources>
+    <declare-styleable name="Style1">
+        <attr name="Type1" format="integer">
+            <enum name="type" value="28" />
+            <enum name="data" value="0xff00ff00" />
+            <enum name="asset_cookie" value="0" />
+            <enum name="resource_id" value="0" />
+            <enum name="changing_config" value="0" />
+        </attr>
+        <attr name="Type2" format="integer">
+            <enum name="type" value="28" />
+            <enum name="data" value="0xff0000ff" />
+            <enum name="asset_cookie" value="0" />
+            <enum name="resource_id" value="0" />
+            <enum name="changing_config" value="0" />
+        </attr>
+    </declare-styleable>
+    <attr name="type1" format="boolean"/>
+    <attr name="type2" format="boolean"/>
+    <attr name="type3" format="color"/>
+    <attr name="type4" format="reference|color"/>
+    <attr name="type5" format="dimension"/>
+    <attr name="type6" format="dimension"/>
+    <attr name="type7" format="dimension"/>
+    <attr name="type8" format="reference"/>
+    <attr name="type9" format="float"/>
+    <attr name="type10" format="fraction"/>
+    <attr name="type11" format="integer"/>
+    <attr name="type12" format="integer"/>
+    <attr name="type13" format="reference|string"/>
+    <attr name="type14" format="string"/>
+    <attr name="type15" format="reference"/>
+    <attr name="type16" format="string"/>
+    <declare-styleable name="style1">
+        <attr name="type1"/>
+        <attr name="type2"/>
+        <attr name="type3"/>
+        <attr name="type4"/>
+        <attr name="type5"/>
+        <attr name="type6"/>
+        <attr name="type7"/>
+        <attr name="type8"/>
+        <attr name="type9"/>
+        <attr name="type10"/>
+        <attr name="type11"/>
+        <attr name="type12"/>
+        <attr name="type13"/>
+        <attr name="type14"/>
+        <attr name="type15"/>
+        <attr name="type16"/>
+    </declare-styleable>
+    <attr name="testEnum">
+        <enum name="val1" value="1" />
+        <enum name="val2" value="2" />
+        <enum name="val10" value="10" />
+    </attr>
+    <attr name="testFlags">
+        <flag name="bit1" value="0x1" />
+        <flag name="bit2" value="0x2" />
+        <flag name="bit31" value="0x40000000" />
+    </attr>
+    <attr name="testString" format="string" />
+    <declare-styleable name="EnumStyle">
+        <attr name="testEnum" />
+    </declare-styleable>
+    <declare-styleable name="FlagStyle">
+        <attr name="testFlags" />
+    </declare-styleable>
+    <declare-styleable name="TestConfig">
+        <attr name="testString" />
+    </declare-styleable>
+    <!-- Size of text. Recommended dimension type for text is "sp" for scaled-pixels (example: 15sp).
+         Supported values include the following:<p/>
+    <ul>
+        <li><b>px</b> Pixels</li>
+        <li><b>sp</b> Scaled pixels (scaled to relative pixel size on screen). See {@link android.util.DisplayMetrics} for more information.</li>
+        <li><b>pt</b> Points</li>
+        <li><b>dip</b> Device independent pixels. See {@link android.util.DisplayMetrics} for more information.</li>
+    </ul>
+    -->
+    <attr name="textSize" format="dimension" />
+    <attr name="typeface">
+        <enum name="normal" value="0" />
+        <enum name="sans" value="1" />
+        <enum name="serif" value="2" />
+        <enum name="monospace" value="3" />
+    </attr>
+    <!-- Default text typeface style. -->
+    <attr name="textStyle">
+        <flag name="normal" value="0" />
+        <flag name="bold" value="1" />
+        <flag name="italic" value="2" />
+    </attr>
+    <!-- Color of text (usually same as colorForeground). -->
+    <attr name="textColor" format="reference|color" />
+    <!-- Color of highlighted text. -->
+    <attr name="textColorHighlight" format="reference|color" />
+    <!-- Color of hint text (displayed when the field is empty). -->
+    <attr name="textColorHint" format="reference|color" />
+    <!-- Color of link text (URLs). -->
+    <attr name="textColorLink" format="reference|color" />
+    <declare-styleable name="TextAppearance">
+        <attr name="textColor"/>
+        <attr name="textSize"/>
+        <attr name="textStyle"/>
+        <attr name="typeface"/>
+        <attr name="textColorHighlight"/>
+        <attr name="textColorHint"/>
+        <attr name="textColorLink"/>
+    </declare-styleable>
+    <!-- Integer used to uniquely identify theme overrides. -->
+    <attr name="themeType" format="integer"/>
+    <!-- Theme reference used to override parent theme. -->
+    <attr name="themeOverrideAttr" format="reference"/>
+
+    <!-- Drawable theming attributes -->
+    <attr name="themeBoolean" />
+    <attr name="themeColor" />
+    <attr name="themeFloat" />
+    <attr name="themeInteger" />
+    <attr name="themeDimension" />
+    <attr name="themeDrawable" />
+    <attr name="themeBitmap" />
+    <attr name="themeNinePatch" />
+    <attr name="themeGravity" />
+    <attr name="themeTileMode" />
+    <attr name="themeAngle" />
+</resources>
diff --git a/tests/tests/view/res/values/colors.xml b/tests/tests/view/res/values/colors.xml
new file mode 100644
index 0000000..f3cc325
--- /dev/null
+++ b/tests/tests/view/res/values/colors.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ * Copyright (C) 2008 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ -->
+
+<resources>
+    <drawable name="red">#7f00</drawable>
+    <drawable name="blue">#770000ff</drawable>
+    <drawable name="black">#77ffffff</drawable>
+    <drawable name="yellow">#77ffff00</drawable>
+    <color name="testcolor1">#ff00ff00</color>
+    <color name="testcolor2">#ffff0000</color>
+    <color name="failColor">#ff0000ff</color>
+</resources>
diff --git a/tests/tests/view/res/values/strings.xml b/tests/tests/view/res/values/strings.xml
new file mode 100644
index 0000000..c167278
--- /dev/null
+++ b/tests/tests/view/res/values/strings.xml
@@ -0,0 +1,179 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2008 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="permlab_testGranted">Test Granted</string>
+    <string name="permdesc_testGranted">Used for running CTS tests, for testing operations
+        where we have the permission.</string>
+    <string name="permlab_testDynamic">Test Dynamic</string>
+    <string name="permdesc_testDynamic">Used for running CTS tests, for testing adding
+        dynamic permissions.</string>
+    <string name="permlab_testDenied">Test Denied</string>
+    <string name="permdesc_testDenied">Used for running CTS tests, for testing operations
+        where we do not have the permission.</string>
+    <string name="explain">1. click start. \n2. if above image shaked, then press pass button,
+         else press failed button.</string>
+    <string name="text_view_hello">Hello! Text view!</string>
+    <string name="text_view_hello_two_lines">Hello! \nText view!</string>
+    <string name="text_view_simple_hint">This is a hint.</string>
+    <string name="text_view_hint">This is a string for testing hint of textview.</string>
+    <string name="activity_forwarding">App/Forwarding</string>
+    <string name="forwarding">$$$</string>
+    <string name="go">Go</string>
+    <string name="back">Back</string>
+    <string name="forward_target">
+        Press back button and notice we don\'t see the previous activity.
+    </string>
+    <string name="edit_text">testing</string>
+    <string name="text">DialogTest</string>
+    <string name="text_country">Country</string>
+    <string name="text_name">Name</string>
+    <string name="hello_world">Hello, World!</string>
+    <string name="hello_android">Hello, Android!</string>
+    <string name="alert_dialog_username">Name:</string>
+    <string name="alert_dialog_password">Password:</string>
+    <string name="alert_dialog_positive">Positive</string>
+    <string name="alert_dialog_negative">Negative</string>
+    <string name="alert_dialog_neutral">Neutral</string>
+    <string name="notify">Notify </string>
+    <string name="tabs_1">testing</string>
+    <string name="table_layout_first">first</string>
+    <string name="table_layout_second">second</string>
+    <string name="table_layout_third">third</string>
+    <string name="table_layout_long">Very long to make the string out of the screen</string>
+    <string name="chronometer_text">Test Chronometer</string>
+    <string name="am">AM</string>
+    <string name="pm">PM</string>
+    <string name="viewgroup_test">ViewGroup test</string>
+    <string name="viewanimator_test">ViewAnimator test</string>
+    <string name="id_ok">OK</string>
+    <string name="id_cancel">Cancel</string>
+    <string name="context_test_string1">This is %s string.</string>
+    <string name="context_test_string2">This is test string.</string>
+    <string name="animationutils_test_instructions">Choose different animations</string>
+    <string name="animationutils_test_alpha">Alpha animation</string>
+    <string name="animationutils_test_scale">Scale animation</string>
+    <string name="animationutils_test_rotate">Rotate animation</string>
+    <string name="animationutils_test_translate">Translate animation</string>
+    <string name="animationutils_test_set">Animation set</string>
+    <string name="animationutils_test_layout">Layout animation</string>
+    <string name="animationutils_test_gridlayout">Grid layout animation</string>
+    <string name="twolinelistitem_test_text1">text1</string>
+    <string name="twolinelistitem_test_text2">text2</string>
+    <string name="metadata_text">metadata text</string>
+    <string name="horizontal_text_1">horizontal 1</string>
+    <string name="horizontal_text_2">horizontal 2</string>
+    <string name="horizontal_text_3">horizontal 3</string>
+    <string name="vertical_text_1">vertical 1</string>
+    <string name="vertical_text_2">vertical 2</string>
+    <string name="vertical_text_3">vertical 3</string>
+    <string name="reference">here</string>
+    <string name="coerceIntegerToString">100</string>
+    <string name="coerceBooleanToString">true</string>
+    <string name="coerceColorToString">#fff</string>
+    <string name="coerceFloatToString">100.0</string>
+    <string name="coerceDimensionToString">100px</string>
+    <string name="coerceFractionToString">100<xliff:g id="percent">%</xliff:g></string>
+    <string name="formattedStringNone">Format[]</string>
+    <string name="formattedStringOne">Format[<xliff:g id="format">%d</xliff:g>]</string>
+    <string name="formattedStringTwo">Format[<xliff:g id="format">%3$d,%2$s</xliff:g>]</string>
+    <string name="checkboxpref_key">checkboxpref_key</string>
+   <string name="checkboxpref_title">title of preference</string>
+   <string name="checkboxpref_summary">summary of preference</string>
+   <string name="checkboxpref_summary_on">summary on of preference</string>
+   <string name="checkboxpref_summary_off">summary off of preference</string>
+   <string name="checkboxpref_depend">checkboxpref_depend</string>
+   <string name="checkboxpref_depend_title"> depend title of preference</string>
+   <string name="checkboxpref_depend_summary"> depend summary of preference</string>
+   <string name="edittextpref_key">edittextpref_key</string>
+   <string name="edittextpref_default_value">default value of preference</string>
+   <string name="edittextpref_title">title of edit text preference</string>
+   <string name="edittextpref_summary">summary of edit text preference</string>
+   <string name="edittextpref_dialog_title">dialog title of edit text preference</string>
+   <string name="edittextpref_text">text of  edit text preference</string>
+   <string name="listpref_key">listpref_key</string>
+   <string name="listpref_title">title of list preference</string>
+   <string name="listpref_summary">summary of list preference</string>
+   <string name="listpref_dialogtitle">dialog title of list preference</string>
+   <string name="easy">Easy</string>
+   <string name="medium">Medium</string>
+   <string name="hard">Hard</string>
+   <string name="footer_view">Footer view</string>
+   <string name="header_view">Header view</string>
+   <string name="dialogpref_title">title of dialog preference </string>
+   <string name="dialogpref_dialog_title">dialog title of dialog preference </string>
+   <string name="dialogpref_key">dialogpref_key</string>
+   <string name="dialogpref_default_value">default value of dialog preference</string>
+   <string name="dialogpref_summary">summary of dialog preference</string>
+   <string name="dialogpref_message">message of dialog preference</string>
+   <string name="dialogpref_sure">Sure</string>
+   <string name="dialogpref_cancel">Cancel</string>
+   <string name="pref_key">pref_key</string>
+   <string name="pref_title">title of preference</string>
+   <string name="pref_summary">summary of preference</string>
+   <string name="pref_depend_key">pref_depend_key</string>
+   <string name="pref_depend_title"> depend title of preference</string>
+   <string name="pref_depend_summary"> depend summary of preference</string>
+   <string name="android_intent_action_preference">android.intent.action.PREFERENCE</string>
+   <string name="def_pref_key">def_pref_key</string>
+   <string name="def_pref_title">default preference</string>
+   <string name="def_pref_summary">This is default preference of cts</string>
+   <string name="relative_view1">view 1</string>
+   <string name="relative_view2">view 2</string>
+   <string name="relative_view3">view 3</string>
+   <string name="relative_view4">view 4</string>
+   <string name="relative_view5">view 5</string>
+   <string name="relative_view6">view 6</string>
+   <string name="relative_view7">view 7</string>
+   <string name="relative_view8">view 8</string>
+   <string name="relative_view9">view 9</string>
+   <string name="relative_view10">view 10</string>
+   <string name="relative_view11">view 11</string>
+   <string name="relative_view12">view 12</string>
+   <string name="relative_view13">view 13</string>
+   <string name="country">Country:</string>
+   <string name="symbol">Symbol:</string>
+   <string name="country_warning">No such country registered</string>
+   <string name="version_cur">base</string>
+   <string name="version_old">base</string>
+   <string name="version_v3">base</string>
+   <string name="authenticator_label">Android CTS</string>
+   <string name="search_label">Android CTS</string>
+   <string name="tag1">tag 1</string>
+   <string name="tag2">tag 2</string>
+
+   <string name="button">Button</string>
+   <string name="holo_test">Holo Test</string>
+   <string name="holo_generator">Holo Generator</string>
+   <string name="holo_light_test">Holo Light Test</string>
+   <string name="holo_light_generator">Holo Light Generator</string>
+   <string name="reference_image">Reference Image: </string>
+   <string name="generated_image">Generated Image: </string>
+   <string name="themes_prompt">Select a Theme:</string>
+   <string name="sample_text">Sample text goes here. I wanted something creative and whimsical
+but then I just got bored...</string>
+    <string name="long_text">This is a really long string which exceeds the width of the view.
+New devices have a much larger screen which actually enables long strings to be displayed
+with no fading. I have made this string longer to fix this case. If you are correcting this
+text, I would love to see the kind of devices you guys now use! Guys, maybe some devices need longer string!
+I think so, so how about double this string, like copy and paste!
+This is a really long string which exceeds the width of the view.
+New devices have a much larger screen which actually enables long strings to be displayed
+with no fading. I have made this string longer to fix this case. If you are correcting this
+text, I would love to see the kind of devices you guys now use! Guys, maybe some devices need longer string!
+I think so, so how about double this string, like copy and paste! </string>
+    <string name="rectangle200">"M 0,0 l 200,0 l 0, 200 l -200, 0 z"</string>
+</resources>
diff --git a/tests/tests/view/res/values/styles.xml b/tests/tests/view/res/values/styles.xml
new file mode 100644
index 0000000..20c80f8
--- /dev/null
+++ b/tests/tests/view/res/values/styles.xml
@@ -0,0 +1,172 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2008 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android">
+
+    <style name="Whatever">
+        <item name="type1">true</item>
+        <item name="type2">false</item>
+        <item name="type3">#ff0000ff</item>
+        <item name="type4">#ff00ff00</item>
+        <item name="type5">0.75px</item>
+        <item name="type6">10px</item>
+        <item name="type7">18px</item>
+        <item name="type8">@drawable/pass</item>
+        <item name="type9">3.14</item>
+        <item name="type10">100%</item>
+        <item name="type11">365</item>
+        <item name="type12">86400</item>
+        <item name="type13">@string/hello_android</item>
+        <item name="type14">TypedArray Test!</item>
+        <item name="type15">@array/difficultyLevel</item>
+        <item name="type16">Typed Value!</item>
+    </style>
+
+    <style name="TextViewWithoutColorAndAppearance">
+        <item name="android:textSize">18sp</item>
+    </style>
+
+    <style name="TextViewWithColorButWithOutAppearance">
+        <item name="android:textColor">#ff0000ff</item>
+    </style>
+
+    <style name="TextViewWithColorAndAppearance">
+        <item name="android:textColor">#ff0000ff</item>
+        <item name="android:textAppearance">@style/TextAppearance.WithColor</item>
+    </style>
+
+    <style name="TextViewWithoutColorButWithAppearance">
+        <item name="android:textAppearance">@style/TextAppearance.WithColor</item>
+    </style>
+
+    <style name="TextAppearance" parent="android:TextAppearance">
+    </style>
+
+    <style name="TextAppearance.WithColor">
+        <item name="android:textColor">#ffff0000</item>
+    </style>
+
+    <style name="TextAppearance.All">
+        <item name="android:textColor">@drawable/black</item>
+        <item name="android:textSize">20px</item>
+        <item name="android:textStyle">bold</item>
+        <item name="android:textColorHint">@drawable/red</item>
+        <item name="android:textColorLink">@drawable/blue</item>
+        <item name="android:textColorHighlight">@drawable/yellow</item>
+    </style>
+
+    <style name="TextAppearance.Colors">
+        <item name="android:textColor">@drawable/black</item>
+        <item name="android:textColorHint">@drawable/blue</item>
+        <item name="android:textColorLink">@drawable/yellow</item>
+        <item name="android:textColorHighlight">@drawable/red</item>
+    </style>
+
+    <style name="TextAppearance.NotColors">
+        <item name="android:textSize">17px</item>
+        <item name="android:typeface">sans</item>
+        <item name="android:textStyle">normal</item>
+    </style>
+
+    <style name="TextAppearance.Style">
+        <item name="android:textStyle">normal</item>
+    </style>
+
+    <style name="TestEnum1">
+        <item name="testEnum">val1</item>
+    </style>
+
+    <style name="TestEnum2">
+        <item name="testEnum">val2</item>
+    </style>
+
+    <style name="TestEnum10">
+        <item name="testEnum">val10</item>
+    </style>
+
+    <style name="TestFlag1">
+        <item name="testFlags">bit1</item>
+    </style>
+
+    <style name="TestFlag2">
+        <item name="testFlags">bit2</item>
+    </style>
+
+    <style name="TestFlag31">
+        <item name="testFlags">bit31</item>
+    </style>
+
+    <style name="TestFlag1And2">
+        <item name="testFlags">bit1|bit2</item>
+    </style>
+
+    <style name="TestFlag1And2And31">
+        <item name="testFlags">bit1|bit2|bit31</item>
+    </style>
+
+    <style name="TestEnum1.EmptyInherit" />
+
+    <style name="Theme_AlertDialog">
+        <item name="android:textSize">18sp</item>
+    </style>
+
+    <style name="TestProgressBar">
+        <item name="android:indeterminateOnly">false</item>
+        <item name="android:progressDrawable">?android:drawable/progress_horizontal</item>
+        <item name="android:indeterminateDrawable">?android:drawable/progress_horizontal</item>
+        <item name="android:minHeight">20dip</item>
+        <item name="android:maxHeight">20dip</item>
+        <item name="android:focusable">true</item>
+    </style>
+
+    <style name="Test_Theme">
+        <item name="android:windowNoTitle">true</item>
+        <item name="android:panelColorForeground">#ff000000</item>
+        <item name="android:panelColorBackground">#ffffffff</item>
+    </style>
+
+    <style name="Theme_OverrideOuter">
+        <item name="themeType">1</item>
+    </style>
+
+    <style name="Theme_OverrideInner">
+        <item name="themeType">2</item>
+        <item name="themeOverrideAttr">@style/Theme_OverrideAttr</item>
+    </style>
+
+    <style name="Theme_OverrideAttr">
+        <item name="themeType">3</item>
+    </style>
+    
+    <style name="Theme_ThemedDrawableTest">
+        <item name="themeBoolean">true</item>
+        <item name="themeColor">@android:color/black</item>
+        <item name="themeFloat">1.0</item>
+        <item name="themeAngle">45.0</item>
+        <item name="themeInteger">1</item>
+        <item name="themeDimension">1px</item>
+        <item name="themeDrawable">@drawable/icon_black</item>
+        <item name="themeBitmap">@drawable/icon_black</item>
+        <item name="themeNinePatch">@drawable/ninepatch_0</item>
+        <item name="themeGravity">48</item>
+        <item name="themeTileMode">2</item>
+    </style>
+
+    <style name="Theme_NoSwipeDismiss">
+        <item name="android:windowSwipeToDismiss">false</item>
+    </style>
+
+</resources>
diff --git a/tests/tests/view/res/xml/merge.xml b/tests/tests/view/res/xml/merge.xml
new file mode 100644
index 0000000..710e904
--- /dev/null
+++ b/tests/tests/view/res/xml/merge.xml
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<merge xmlns:android="http://schemas.android.com/apk/res/android">
+   <AbsoluteLayout    android:layout_width="20dip"
+               android:layout_height="30dip"
+               android:layout_x="10dip"
+               android:layout_y="20dip">
+
+            <TextView
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_x="0dip"
+                android:layout_y="0dip"
+                android:text="@string/notify"/>
+
+            <TextView
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_x="0dip"
+                android:layout_y="0dip"
+                android:text="@string/notify"/>
+
+    </AbsoluteLayout>
+
+</merge>
diff --git a/tests/tests/view/res/xml/method.xml b/tests/tests/view/res/xml/method.xml
new file mode 100644
index 0000000..763faa5
--- /dev/null
+++ b/tests/tests/view/res/xml/method.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2008 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<input-method xmlns:android="http://schemas.android.com/apk/res/android"
+        android:settingsActivity="android.view.inputmethod.cts.InputMethodInfoStub"
+/>
diff --git a/tests/tests/view/src/android/view/animation/cts/AccelerateDecelerateInterpolatorTest.java b/tests/tests/view/src/android/view/animation/cts/AccelerateDecelerateInterpolatorTest.java
index 20ddb83..6e80d00 100644
--- a/tests/tests/view/src/android/view/animation/cts/AccelerateDecelerateInterpolatorTest.java
+++ b/tests/tests/view/src/android/view/animation/cts/AccelerateDecelerateInterpolatorTest.java
@@ -16,7 +16,7 @@
 
 package android.view.animation.cts;
 
-import com.android.cts.stub.R;
+import com.android.cts.view.R;
 
 
 import android.app.Activity;
@@ -33,7 +33,7 @@
 import android.view.animation.Transformation;
 
 public class AccelerateDecelerateInterpolatorTest
-        extends ActivityInstrumentationTestCase2<AnimationTestStubActivity> {
+        extends ActivityInstrumentationTestCase2<AnimationTestCtsActivity> {
 
     private Activity mActivity;
     private static final float ALPHA_DELTA = 0.001f;
@@ -41,7 +41,7 @@
     private static final long ALPHA_DURATION = 2000;
 
     public AccelerateDecelerateInterpolatorTest() {
-        super("com.android.cts.stub", AnimationTestStubActivity.class);
+        super("com.android.cts.view", AnimationTestCtsActivity.class);
     }
 
     @Override
diff --git a/tests/tests/view/src/android/view/animation/cts/AccelerateInterpolatorTest.java b/tests/tests/view/src/android/view/animation/cts/AccelerateInterpolatorTest.java
index c009533..51b2b09 100644
--- a/tests/tests/view/src/android/view/animation/cts/AccelerateInterpolatorTest.java
+++ b/tests/tests/view/src/android/view/animation/cts/AccelerateInterpolatorTest.java
@@ -16,7 +16,7 @@
 
 package android.view.animation.cts;
 
-import com.android.cts.stub.R;
+import com.android.cts.view.R;
 
 
 import android.app.Activity;
@@ -33,10 +33,10 @@
 import android.view.animation.Transformation;
 
 public class AccelerateInterpolatorTest
-        extends ActivityInstrumentationTestCase2<AnimationTestStubActivity> {
+        extends ActivityInstrumentationTestCase2<AnimationTestCtsActivity> {
 
     public AccelerateInterpolatorTest() {
-        super("com.android.cts.stub", AnimationTestStubActivity.class);
+        super("com.android.cts.view", AnimationTestCtsActivity.class);
     }
 
     private Activity mActivity;
diff --git a/tests/tests/view/src/android/view/animation/cts/AlphaAnimationTest.java b/tests/tests/view/src/android/view/animation/cts/AlphaAnimationTest.java
index bcd4ccd..acfe1a6 100644
--- a/tests/tests/view/src/android/view/animation/cts/AlphaAnimationTest.java
+++ b/tests/tests/view/src/android/view/animation/cts/AlphaAnimationTest.java
@@ -23,7 +23,7 @@
 import android.view.animation.AlphaAnimation;
 import android.view.animation.Transformation;
 
-import com.android.cts.stub.R;
+import com.android.cts.view.R;
 
 /**
  * Test {@link AlphaAnimation}.
diff --git a/tests/tests/view/src/android/view/animation/cts/AnimationSetTest.java b/tests/tests/view/src/android/view/animation/cts/AnimationSetTest.java
index b42c239..0b3bf49 100644
--- a/tests/tests/view/src/android/view/animation/cts/AnimationSetTest.java
+++ b/tests/tests/view/src/android/view/animation/cts/AnimationSetTest.java
@@ -33,11 +33,11 @@
 import android.view.animation.Transformation;
 import android.view.animation.TranslateAnimation;
 
-import com.android.cts.stub.R;
+import com.android.cts.view.R;
 
 
 public class AnimationSetTest
-        extends ActivityInstrumentationTestCase2<AnimationTestStubActivity> {
+        extends ActivityInstrumentationTestCase2<AnimationTestCtsActivity> {
 
     private static final float DELTA = 0.001f;
     private static final long SHORT_CHILD_DURATION = 400;
@@ -51,7 +51,7 @@
     private Activity mActivity;
 
     public AnimationSetTest() {
-        super("com.android.cts.stub", AnimationTestStubActivity.class);
+        super("com.android.cts.view", AnimationTestCtsActivity.class);
     }
 
     @Override
diff --git a/tests/tests/view/src/android/view/animation/cts/AnimationTest.java b/tests/tests/view/src/android/view/animation/cts/AnimationTest.java
index 2d88dc4..31440df 100644
--- a/tests/tests/view/src/android/view/animation/cts/AnimationTest.java
+++ b/tests/tests/view/src/android/view/animation/cts/AnimationTest.java
@@ -16,7 +16,7 @@
 
 package android.view.animation.cts;
 
-import com.android.cts.stub.R;
+import com.android.cts.view.R;
 
 
 import android.app.Activity;
@@ -38,7 +38,7 @@
 /**
  * Test {@link Animation}.
  */
-public class AnimationTest extends ActivityInstrumentationTestCase2<AnimationTestStubActivity> {
+public class AnimationTest extends ActivityInstrumentationTestCase2<AnimationTestCtsActivity> {
     private static final float ALPHA_DELTA = 0.001f;
 
     /** It is defined in R.anim.accelerate_alpha */
@@ -51,7 +51,7 @@
     private Object mLockObject = new Object();
 
     public AnimationTest() {
-        super("com.android.cts.stub", AnimationTestStubActivity.class);
+        super("com.android.cts.view", AnimationTestCtsActivity.class);
     }
 
     @Override
diff --git a/tests/tests/view/src/android/view/animation/cts/AnimationTestCtsActivity.java b/tests/tests/view/src/android/view/animation/cts/AnimationTestCtsActivity.java
new file mode 100644
index 0000000..48692f1
--- /dev/null
+++ b/tests/tests/view/src/android/view/animation/cts/AnimationTestCtsActivity.java
@@ -0,0 +1,30 @@
+/*
+ * Copyright (C) 2008 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.view.animation.cts;
+
+import com.android.cts.view.R;
+
+import android.app.Activity;
+import android.os.Bundle;
+
+public class AnimationTestCtsActivity extends Activity {
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.anim_layout);
+    }
+}
diff --git a/tests/src/android/view/animation/cts/AnimationTestUtils.java b/tests/tests/view/src/android/view/animation/cts/AnimationTestUtils.java
similarity index 100%
rename from tests/src/android/view/animation/cts/AnimationTestUtils.java
rename to tests/tests/view/src/android/view/animation/cts/AnimationTestUtils.java
diff --git a/tests/tests/view/src/android/view/animation/cts/AnimationUtilsTest.java b/tests/tests/view/src/android/view/animation/cts/AnimationUtilsTest.java
index cddbfdf..9de0d87 100644
--- a/tests/tests/view/src/android/view/animation/cts/AnimationUtilsTest.java
+++ b/tests/tests/view/src/android/view/animation/cts/AnimationUtilsTest.java
@@ -16,7 +16,7 @@
 
 package android.view.animation.cts;
 
-import com.android.cts.stub.R;
+import com.android.cts.view.R;
 
 
 import android.content.Context;
@@ -30,22 +30,22 @@
 import android.view.animation.LayoutAnimationController;
 
 public class AnimationUtilsTest extends
-        ActivityInstrumentationTestCase2<AnimationTestStubActivity> {
+        ActivityInstrumentationTestCase2<AnimationTestCtsActivity> {
 
-    private AnimationTestStubActivity mActivity;
+    private AnimationTestCtsActivity mActivity;
 
     public AnimationUtilsTest() {
-        super("com.android.cts.stub", AnimationTestStubActivity.class);
+        super("com.android.cts.view", AnimationTestCtsActivity.class);
     }
 
     @Override
     protected void setUp() throws Exception {
         super.setUp();
-        mActivity = (AnimationTestStubActivity) getActivity();
+        mActivity = (AnimationTestCtsActivity) getActivity();
     }
 
     public void testLoad() {
-        // XML file of com.android.cts.stub.R.anim.anim_alpha
+        // XML file of com.android.cts.view.R.anim.anim_alpha
         // <alpha xmlns:android="http://schemas.android.com/apk/res/android"
         //      android:interpolator="@android:anim/accelerate_interpolator"
         //      android:fromAlpha="0.0"
@@ -61,7 +61,7 @@
                 android.R.anim.accelerate_interpolator);
         assertTrue(interpolator instanceof AccelerateInterpolator);
 
-        // Load LayoutAnimationController from com.android.cts.stub.R.anim.anim_gridlayout
+        // Load LayoutAnimationController from com.android.cts.view.R.anim.anim_gridlayout
         // <gridLayoutAnimation xmlns:android="http://schemas.android.com/apk/res/android"
         //      android:delay="10%"
         //      android:rowDelay="50%"
diff --git a/tests/tests/view/src/android/view/animation/cts/CycleInterpolatorTest.java b/tests/tests/view/src/android/view/animation/cts/CycleInterpolatorTest.java
index 56cb32c..3297377 100644
--- a/tests/tests/view/src/android/view/animation/cts/CycleInterpolatorTest.java
+++ b/tests/tests/view/src/android/view/animation/cts/CycleInterpolatorTest.java
@@ -29,14 +29,14 @@
 import android.view.animation.Interpolator;
 import android.view.animation.Transformation;
 
-import com.android.cts.stub.R;
+import com.android.cts.view.R;
 
 
 /**
  * Test {@link CycleInterpolator}.
  */
 public class CycleInterpolatorTest
-        extends ActivityInstrumentationTestCase2<AnimationTestStubActivity> {
+        extends ActivityInstrumentationTestCase2<AnimationTestCtsActivity> {
 
     private Activity mActivity;
 
@@ -45,7 +45,7 @@
     private static final float ALPHA_DELTA = 0.001f;
 
     public CycleInterpolatorTest() {
-        super("com.android.cts.stub", AnimationTestStubActivity.class);
+        super("com.android.cts.view", AnimationTestCtsActivity.class);
     }
 
     @Override
diff --git a/tests/tests/view/src/android/view/animation/cts/DecelerateInterpolatorTest.java b/tests/tests/view/src/android/view/animation/cts/DecelerateInterpolatorTest.java
index 5bae1f7..deb52dd 100644
--- a/tests/tests/view/src/android/view/animation/cts/DecelerateInterpolatorTest.java
+++ b/tests/tests/view/src/android/view/animation/cts/DecelerateInterpolatorTest.java
@@ -16,7 +16,7 @@
 
 package android.view.animation.cts;
 
-import com.android.cts.stub.R;
+import com.android.cts.view.R;
 
 
 import android.app.Activity;
@@ -36,7 +36,7 @@
  * Test {@link DecelerateInterpolator}.
  */
 public class DecelerateInterpolatorTest
-        extends ActivityInstrumentationTestCase2<AnimationTestStubActivity> {
+        extends ActivityInstrumentationTestCase2<AnimationTestCtsActivity> {
 
     private Activity mActivity;
     private static final float ALPHA_DELTA = 0.001f;
@@ -45,7 +45,7 @@
     private static final long DECELERATE_ALPHA_DURATION = 2000;
 
     public DecelerateInterpolatorTest() {
-        super("com.android.cts.stub", AnimationTestStubActivity.class);
+        super("com.android.cts.view", AnimationTestCtsActivity.class);
     }
 
     @Override
diff --git a/tests/tests/view/src/android/view/animation/cts/GridLayoutAnimCtsActivity.java b/tests/tests/view/src/android/view/animation/cts/GridLayoutAnimCtsActivity.java
new file mode 100644
index 0000000..bf95077
--- /dev/null
+++ b/tests/tests/view/src/android/view/animation/cts/GridLayoutAnimCtsActivity.java
@@ -0,0 +1,115 @@
+/*
+ * Copyright (C) 2009 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.view.animation.cts;
+
+import com.android.cts.view.R;
+
+import android.app.Activity;
+import android.database.DataSetObserver;
+import android.os.Bundle;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.AbsListView;
+import android.widget.GridView;
+import android.widget.ImageView;
+import android.widget.ListAdapter;
+
+public class GridLayoutAnimCtsActivity extends Activity {
+
+    private GridView mGridView;
+    private static final int GRID_NUM = 9;
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.gridlayout_anim_controller_layout);
+        mGridView = (GridView) findViewById(R.id.gridlayout_anim_gridview);
+        mGridView.setAdapter(new MockGridViewAdapter(GRID_NUM));
+    }
+
+    public GridView getGridView() {
+        return mGridView;
+    }
+
+    private class MockGridViewAdapter implements ListAdapter {
+        private final int mCount;
+
+        MockGridViewAdapter(int count) {
+            mCount = count;
+        }
+
+        MockGridViewAdapter() {
+            this(1);
+        }
+
+        public boolean areAllItemsEnabled() {
+            return true;
+        }
+
+        public boolean isEnabled(int position) {
+            return true;
+        }
+
+        public void registerDataSetObserver(DataSetObserver observer) {
+        }
+
+        public void unregisterDataSetObserver(DataSetObserver observer) {
+        }
+
+        public int getCount() {
+            return mCount;
+        }
+
+        public Object getItem(int position) {
+            return position;
+        }
+
+        public long getItemId(int position) {
+            return position;
+        }
+
+        public boolean hasStableIds() {
+            return false;
+        }
+
+        public View getView(int position, View convertView, ViewGroup parent) {
+            if ((convertView != null) && (convertView instanceof ImageView)) {
+                ((ImageView) convertView).setImageResource(R.drawable.size_48x48);
+                return convertView;
+            }
+
+            ImageView newView = new ImageView(GridLayoutAnimCtsActivity.this);
+            AbsListView.LayoutParams params = new AbsListView.LayoutParams(
+                    AbsListView.LayoutParams.WRAP_CONTENT, AbsListView.LayoutParams.WRAP_CONTENT);
+            newView.setLayoutParams(params);
+            newView.setImageResource(R.drawable.size_48x48);
+            return newView;
+        }
+
+        public int getItemViewType(int position) {
+            return 0;
+        }
+
+        public int getViewTypeCount() {
+            return 1;
+        }
+
+        public boolean isEmpty() {
+            return false;
+        }
+    }
+}
diff --git a/tests/tests/view/src/android/view/animation/cts/GridLayoutAnimationControllerTest.java b/tests/tests/view/src/android/view/animation/cts/GridLayoutAnimationControllerTest.java
index 80c40fa..54898b4 100644
--- a/tests/tests/view/src/android/view/animation/cts/GridLayoutAnimationControllerTest.java
+++ b/tests/tests/view/src/android/view/animation/cts/GridLayoutAnimationControllerTest.java
@@ -16,7 +16,7 @@
 
 package android.view.animation.cts;
 
-import com.android.cts.stub.R;
+import com.android.cts.view.R;
 
 
 import android.content.Context;
@@ -35,9 +35,9 @@
 import android.widget.GridView;
 
 public class GridLayoutAnimationControllerTest
-    extends ActivityInstrumentationTestCase2<GridLayoutAnimStubActivity> {
+    extends ActivityInstrumentationTestCase2<GridLayoutAnimCtsActivity> {
 
-    private GridLayoutAnimStubActivity mActivity;
+    private GridLayoutAnimCtsActivity mActivity;
     private Animation mDefaultAnimation;
     private GridLayoutAnimationController mController;
     /** The GridView will be 3*3 */
@@ -58,7 +58,7 @@
     private static final int INDEX_OF_CHILD9 = 8;
 
     public GridLayoutAnimationControllerTest() {
-        super("com.android.cts.stub", GridLayoutAnimStubActivity.class);
+        super("com.android.cts.view", GridLayoutAnimCtsActivity.class);
     }
 
     @Override
diff --git a/tests/tests/view/src/android/view/animation/cts/LayoutAnimCtsActivity.java b/tests/tests/view/src/android/view/animation/cts/LayoutAnimCtsActivity.java
new file mode 100644
index 0000000..0b9203f
--- /dev/null
+++ b/tests/tests/view/src/android/view/animation/cts/LayoutAnimCtsActivity.java
@@ -0,0 +1,38 @@
+/*
+ * Copyright (C) 2009 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.view.animation.cts;
+
+import android.app.ListActivity;
+import android.os.Bundle;
+import android.widget.ArrayAdapter;
+
+
+public class LayoutAnimCtsActivity extends ListActivity {
+
+    private String[] mStrings = {
+            "Android",
+            "CTS",
+            "Test",
+    };
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setListAdapter(new ArrayAdapter<String>(this,
+                android.R.layout.simple_list_item_1, mStrings));
+    }
+}
diff --git a/tests/tests/view/src/android/view/animation/cts/LayoutAnimationControllerTest.java b/tests/tests/view/src/android/view/animation/cts/LayoutAnimationControllerTest.java
index cccf0a6..2f8f36d 100644
--- a/tests/tests/view/src/android/view/animation/cts/LayoutAnimationControllerTest.java
+++ b/tests/tests/view/src/android/view/animation/cts/LayoutAnimationControllerTest.java
@@ -16,7 +16,7 @@
 
 package android.view.animation.cts;
 
-import com.android.cts.stub.R;
+import com.android.cts.view.R;
 
 
 import android.app.ListActivity;
@@ -40,7 +40,7 @@
 import android.widget.ListView;
 
 public class LayoutAnimationControllerTest
-        extends ActivityInstrumentationTestCase2<LayoutAnimStubActivity> {
+        extends ActivityInstrumentationTestCase2<LayoutAnimCtsActivity> {
 
     private ListActivity mActivity;
     private Animation mDefaultAnimation;
@@ -58,7 +58,7 @@
     private static final long DEFAULT_MAX_DURATION = 2000;
 
     public LayoutAnimationControllerTest() {
-        super("com.android.cts.stub", LayoutAnimStubActivity.class);
+        super("com.android.cts.view", LayoutAnimCtsActivity.class);
     }
 
     @Override
diff --git a/tests/tests/view/src/android/view/animation/cts/LinearInterpolatorTest.java b/tests/tests/view/src/android/view/animation/cts/LinearInterpolatorTest.java
index ff9e734..28407f9 100644
--- a/tests/tests/view/src/android/view/animation/cts/LinearInterpolatorTest.java
+++ b/tests/tests/view/src/android/view/animation/cts/LinearInterpolatorTest.java
@@ -26,13 +26,13 @@
 import android.view.animation.LinearInterpolator;
 import android.view.animation.Transformation;
 
-import com.android.cts.stub.R;
+import com.android.cts.view.R;
 
 
 /**
  * Test {@link LinearInterpolator}.
  */
-public class LinearInterpolatorTest extends ActivityInstrumentationTestCase2<AnimationTestStubActivity> {
+public class LinearInterpolatorTest extends ActivityInstrumentationTestCase2<AnimationTestCtsActivity> {
 
     private Activity mActivity;
     private static final float ALPHA_DELTA = 0.001f;
@@ -42,7 +42,7 @@
     private static final long LINEAR_ALPHA_TIME_STEP = LINEAR_ALPHA_DURATION / 5;
 
     public LinearInterpolatorTest() {
-        super("com.android.cts.stub", AnimationTestStubActivity.class);
+        super("com.android.cts.view", AnimationTestCtsActivity.class);
     }
 
     @Override
diff --git a/tests/tests/view/src/android/view/animation/cts/RotateAnimationTest.java b/tests/tests/view/src/android/view/animation/cts/RotateAnimationTest.java
index 0bc7ab0..958133a 100644
--- a/tests/tests/view/src/android/view/animation/cts/RotateAnimationTest.java
+++ b/tests/tests/view/src/android/view/animation/cts/RotateAnimationTest.java
@@ -28,11 +28,11 @@
 import android.view.animation.RotateAnimation;
 import android.view.animation.Transformation;
 
-import com.android.cts.stub.R;
+import com.android.cts.view.R;
 
 
 public class RotateAnimationTest
-        extends ActivityInstrumentationTestCase2<AnimationTestStubActivity> {
+        extends ActivityInstrumentationTestCase2<AnimationTestCtsActivity> {
 
     private Activity mActivity;
 
@@ -42,7 +42,7 @@
     private static final float TO_DEGREE = 90.0f;
 
     public RotateAnimationTest() {
-        super("com.android.cts.stub", AnimationTestStubActivity.class);
+        super("com.android.cts.view", AnimationTestCtsActivity.class);
     }
 
     @Override
diff --git a/tests/tests/view/src/android/view/animation/cts/ScaleAnimationTest.java b/tests/tests/view/src/android/view/animation/cts/ScaleAnimationTest.java
index 243dace..e17435e 100644
--- a/tests/tests/view/src/android/view/animation/cts/ScaleAnimationTest.java
+++ b/tests/tests/view/src/android/view/animation/cts/ScaleAnimationTest.java
@@ -16,7 +16,7 @@
 
 package android.view.animation.cts;
 
-import com.android.cts.stub.R;
+import com.android.cts.view.R;
 
 
 import android.content.res.XmlResourceParser;
@@ -30,7 +30,7 @@
 import android.view.animation.Transformation;
 
 public class ScaleAnimationTest
-        extends ActivityInstrumentationTestCase2<AnimationTestStubActivity> {
+        extends ActivityInstrumentationTestCase2<AnimationTestCtsActivity> {
     private static long DURATION = 1000;
     private static float DELTA = 0.001f;
     private static float FROM_X = 1.0f;
@@ -41,10 +41,10 @@
     private static float PIVOT_Y = 0.6f;
     private static float MID_X = 0.8f;
     private static float MID_Y = 3.3f;
-    private AnimationTestStubActivity mActivity;
+    private AnimationTestCtsActivity mActivity;
 
     public ScaleAnimationTest() {
-        super("com.android.cts.stub", AnimationTestStubActivity.class);
+        super("com.android.cts.view", AnimationTestCtsActivity.class);
     }
 
     @Override
diff --git a/tests/tests/view/src/android/view/animation/cts/TranslateAnimationTest.java b/tests/tests/view/src/android/view/animation/cts/TranslateAnimationTest.java
index 959e506..94ab558 100644
--- a/tests/tests/view/src/android/view/animation/cts/TranslateAnimationTest.java
+++ b/tests/tests/view/src/android/view/animation/cts/TranslateAnimationTest.java
@@ -28,11 +28,11 @@
 import android.view.animation.Transformation;
 import android.view.animation.TranslateAnimation;
 
-import com.android.cts.stub.R;
+import com.android.cts.view.R;
 
 
 public class TranslateAnimationTest
-        extends ActivityInstrumentationTestCase2<AnimationTestStubActivity> {
+        extends ActivityInstrumentationTestCase2<AnimationTestCtsActivity> {
 
     private Activity mActivity;
 
@@ -48,7 +48,7 @@
     private static final float RELATIVE_TO_Y_DELTA = 0.4f;
 
     public TranslateAnimationTest() {
-        super("com.android.cts.stub", AnimationTestStubActivity.class);
+        super("com.android.cts.view", AnimationTestCtsActivity.class);
     }
 
     @Override
diff --git a/tests/tests/view/src/android/view/cts/ContextThemeWrapperTest.java b/tests/tests/view/src/android/view/cts/ContextThemeWrapperTest.java
index 33d1682..c40f095 100644
--- a/tests/tests/view/src/android/view/cts/ContextThemeWrapperTest.java
+++ b/tests/tests/view/src/android/view/cts/ContextThemeWrapperTest.java
@@ -23,7 +23,7 @@
 import android.test.AndroidTestCase;
 import android.view.ContextThemeWrapper;
 
-import com.android.cts.stub.R;
+import com.android.cts.view.R;
 
 
 public class ContextThemeWrapperTest extends AndroidTestCase {
diff --git a/tests/tests/view/src/android/view/cts/CtsActivity.java b/tests/tests/view/src/android/view/cts/CtsActivity.java
new file mode 100644
index 0000000..08607d2
--- /dev/null
+++ b/tests/tests/view/src/android/view/cts/CtsActivity.java
@@ -0,0 +1,26 @@
+/*
+ * Copyright (C) 2009 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.view.cts;
+
+import android.app.Activity;
+
+/**
+ * Stub activity for helping test. It's an empty activity.
+ */
+public class CtsActivity extends Activity {
+
+}
diff --git a/tests/tests/view/src/android/view/cts/DisplayRefreshRateTest.java b/tests/tests/view/src/android/view/cts/DisplayRefreshRateTest.java
index cc2517d..5120604 100644
--- a/tests/tests/view/src/android/view/cts/DisplayRefreshRateTest.java
+++ b/tests/tests/view/src/android/view/cts/DisplayRefreshRateTest.java
@@ -18,7 +18,6 @@
 
 import android.content.Context;
 import android.opengl.GLSurfaceView;
-import android.opengl.cts.GLSurfaceViewStubActivity;
 import android.test.ActivityInstrumentationTestCase2;
 import android.test.UiThreadTest;
 import android.view.Display;
@@ -39,7 +38,7 @@
  * way of measuring the actual refresh rate.
  */
 public class DisplayRefreshRateTest extends
-        ActivityInstrumentationTestCase2<GLSurfaceViewStubActivity> {
+        ActivityInstrumentationTestCase2<GLSurfaceViewCtsActivity> {
 
     // The test passes if
     //   abs(measured_fps - Display.getRefreshRate()) <= FPS_TOLERANCE.
@@ -157,21 +156,21 @@
     private FpsResult mResult;
 
     public DisplayRefreshRateTest() {
-        super(GLSurfaceViewStubActivity.class);
+        super(GLSurfaceViewCtsActivity.class);
         mResult = new FpsResult();
     }
 
     @Override
     protected void setUp() throws Exception {
         super.setUp();
-        GLSurfaceViewStubActivity.setRenderer(new Renderer(mResult));
-        GLSurfaceViewStubActivity.setRenderMode(
+        GLSurfaceViewCtsActivity.setRenderer(new Renderer(mResult));
+        GLSurfaceViewCtsActivity.setRenderMode(
                 GLSurfaceView.RENDERMODE_CONTINUOUSLY);
     }
 
     public void testRefreshRate() throws java.lang.InterruptedException {
         boolean fpsOk = false;
-        GLSurfaceViewStubActivity activity = getActivity();
+        GLSurfaceViewCtsActivity activity = getActivity();
 
         WindowManager wm = (WindowManager)activity
                 .getView()
diff --git a/tests/tests/view/src/android/view/cts/FocusFinderCtsActivity.java b/tests/tests/view/src/android/view/cts/FocusFinderCtsActivity.java
new file mode 100644
index 0000000..14ab577
--- /dev/null
+++ b/tests/tests/view/src/android/view/cts/FocusFinderCtsActivity.java
@@ -0,0 +1,51 @@
+/*
+ * Copyright (C) 2008 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.view.cts;
+
+import com.android.cts.view.R;
+
+import android.app.Activity;
+import android.content.Context;
+import android.os.Bundle;
+import android.util.AttributeSet;
+import android.view.ViewGroup;
+import android.widget.Button;
+
+public class FocusFinderCtsActivity extends Activity {
+
+    public ViewGroup layout;
+
+    public Button topLeftButton;
+
+    public Button topRightButton;
+
+    public Button bottomLeftButton;
+
+    public Button bottomRightButton;
+
+    @Override
+    protected void onCreate(Bundle icicle) {
+        super.onCreate(icicle);
+        setContentView(R.layout.focus_finder_layout);
+        layout = (ViewGroup) findViewById(R.id.layout);
+        topLeftButton = (Button) findViewById(R.id.top_left_button);
+        topRightButton = (Button) findViewById(R.id.top_right_button);
+        bottomLeftButton = (Button) findViewById(R.id.bottom_left_button);
+        bottomRightButton = (Button) findViewById(R.id.bottom_right_button);
+    }
+}
+
diff --git a/tests/tests/view/src/android/view/cts/FocusFinderTest.java b/tests/tests/view/src/android/view/cts/FocusFinderTest.java
index 6e54603..55c288e 100644
--- a/tests/tests/view/src/android/view/cts/FocusFinderTest.java
+++ b/tests/tests/view/src/android/view/cts/FocusFinderTest.java
@@ -24,7 +24,7 @@
 import android.view.ViewGroup;
 import android.widget.Button;
 
-public class FocusFinderTest extends ActivityInstrumentationTestCase2<FocusFinderStubActivity> {
+public class FocusFinderTest extends ActivityInstrumentationTestCase2<FocusFinderCtsActivity> {
 
     private FocusFinder mFocusFinder;
     private ViewGroup mLayout;
@@ -34,7 +34,7 @@
     private Button mBottomRight;
 
     public FocusFinderTest() {
-        super("com.android.cts.stub", FocusFinderStubActivity.class);
+        super("com.android.cts.view", FocusFinderCtsActivity.class);
     }
 
     @Override
diff --git a/tests/tests/view/src/android/view/cts/FocusHandlingCtsActivity.java b/tests/tests/view/src/android/view/cts/FocusHandlingCtsActivity.java
new file mode 100644
index 0000000..5489e2a
--- /dev/null
+++ b/tests/tests/view/src/android/view/cts/FocusHandlingCtsActivity.java
@@ -0,0 +1,34 @@
+/*
+ * Copyright (C) 2009 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.view.cts;
+
+import com.android.cts.view.R;
+
+import android.app.Activity;
+import android.os.Bundle;
+
+/**
+ * A simple activity to test "Focus Handling"
+ */
+public class FocusHandlingCtsActivity extends Activity {
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setTheme(android.R.style.Theme_Holo_NoActionBar);
+        setContentView(R.layout.focus_handling_layout);
+    }
+}
diff --git a/tests/tests/view/src/android/view/cts/GLSurfaceViewCtsActivity.java b/tests/tests/view/src/android/view/cts/GLSurfaceViewCtsActivity.java
new file mode 100644
index 0000000..bc916a7
--- /dev/null
+++ b/tests/tests/view/src/android/view/cts/GLSurfaceViewCtsActivity.java
@@ -0,0 +1,123 @@
+/*
+ * Copyright (C) 2010 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.view.cts;
+
+import android.app.Activity;
+import android.opengl.GLSurfaceView;
+import android.os.Bundle;
+import android.view.Window;
+
+import javax.microedition.khronos.egl.EGLConfig;
+import javax.microedition.khronos.opengles.GL10;
+
+/**
+ * A minimal activity for testing {@link android.opengl.GLSurfaceView}.
+ * Also accepts non-blank renderers to allow its use for more complex tests.
+ */
+public class GLSurfaceViewCtsActivity extends Activity {
+
+    private static class Renderer implements GLSurfaceView.Renderer {
+
+        public void onDrawFrame(GL10 gl) {
+            // Do nothing.
+        }
+
+        public void onSurfaceChanged(GL10 gl, int width, int height) {
+            // Do nothing.
+        }
+
+        public void onSurfaceCreated(GL10 gl, EGLConfig config) {
+            // Do nothing.
+        }
+    }
+
+    private GLSurfaceView mView;
+
+    /** To override the blank renderer, or other settings, these
+     * static set* methods must be called before onCreate() is called.
+     * If using ActivityInstrumentationTestCase2, that means the set
+     * methods need to be called before calling getActivity in the
+     * test setUp().
+     */
+    private static GLSurfaceView.Renderer mRenderer = null;
+    public static void setRenderer(GLSurfaceView.Renderer renderer) {
+        mRenderer = renderer;
+    }
+    public static void resetRenderer() {
+        mRenderer = null;
+    }
+
+    private static int mRenderMode = 0;
+    private static boolean mRenderModeSet = false;
+    public static void setRenderMode(int renderMode) {
+        mRenderModeSet = true;
+        mRenderMode = renderMode;
+    }
+    public static void resetRenderMode() {
+        mRenderModeSet = false;
+        mRenderMode = 0;
+    }
+
+    private static int mGlVersion = 0;
+    private static boolean mGlVersionSet = false;
+    public static void setGlVersion(int glVersion) {
+        mGlVersionSet = true;
+        mGlVersion = glVersion;
+    }
+    public static void resetGlVersion() {
+        mGlVersionSet = false;
+        mGlVersion = 0;
+    }
+
+    @Override
+    public void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        mView = new GLSurfaceView(this);
+        // Only set this if explicitly asked for
+        if (mGlVersionSet) {
+            mView.setEGLContextClientVersion(mGlVersion);
+        }
+        // Use no-op renderer by default
+        if (mRenderer == null) {
+            mView.setRenderer(new Renderer());
+        } else {
+            mView.setRenderer(mRenderer);
+        }
+        // Only set this if explicitly asked for
+        if (mRenderModeSet) {
+            mView.setRenderMode(mRenderMode);
+        }
+        this.requestWindowFeature(Window.FEATURE_NO_TITLE);
+        setContentView(mView);
+    }
+
+    public GLSurfaceView getView() {
+        return mView;
+    }
+
+    @Override
+    protected void onResume() {
+        super.onResume();
+        mView.onResume();
+    }
+
+    @Override
+    protected void onPause() {
+        super.onPause();
+        mView.onPause();
+    }
+}
diff --git a/tests/tests/view/src/android/view/cts/GestureDetectorCtsActivity.java b/tests/tests/view/src/android/view/cts/GestureDetectorCtsActivity.java
new file mode 100644
index 0000000..f02a0d6
--- /dev/null
+++ b/tests/tests/view/src/android/view/cts/GestureDetectorCtsActivity.java
@@ -0,0 +1,142 @@
+/*
+ * Copyright (C) 2009 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.view.cts;
+
+import android.app.Activity;
+import android.os.Bundle;
+import android.os.Handler;
+import android.view.GestureDetector;
+import android.view.MotionEvent;
+import android.view.View;
+import android.view.ViewGroup;
+import android.view.GestureDetector.SimpleOnGestureListener;
+import android.view.View.OnTouchListener;
+import android.widget.Button;
+
+public class GestureDetectorCtsActivity extends Activity {
+
+    public boolean isDown;
+    public boolean isScroll;
+    public boolean isFling;
+    public boolean isSingleTapUp;
+    public boolean onShowPress;
+    public boolean onLongPress;
+    public boolean onDoubleTap;
+    public boolean onDoubleTapEvent;
+    public boolean onSingleTapConfirmed;
+
+    private GestureDetector mGestureDetector;
+    private MockOnGestureListener mOnGestureListener;
+    private Handler mHandler;
+    private View mView;
+    private Button mTop;
+    private Button mButton;
+    private ViewGroup mViewGroup;
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+
+        mOnGestureListener = new MockOnGestureListener();
+        mHandler = new Handler();
+
+        mGestureDetector = new GestureDetector(this, mOnGestureListener, mHandler);
+        mGestureDetector.setOnDoubleTapListener(mOnGestureListener);
+        mView = new View(this);
+        mButton = new Button(this);
+        mTop = new Button(this);
+        mView.setOnTouchListener(new MockOnTouchListener());
+
+        mViewGroup = new ViewGroup(this) {
+            @Override
+            protected void onLayout(boolean changed, int l, int t, int r, int b) {
+            }
+        };
+        mViewGroup.addView(mView);
+        mViewGroup.addView(mTop);
+        mViewGroup.addView(mButton);
+        mViewGroup.setOnTouchListener(new MockOnTouchListener());
+        setContentView(mViewGroup);
+
+    }
+
+    public View getView() {
+        return mView;
+    }
+
+    public ViewGroup getViewGroup() {
+        return mViewGroup;
+    }
+
+    public GestureDetector getGestureDetector() {
+        return mGestureDetector;
+    }
+
+    public class MockOnGestureListener extends SimpleOnGestureListener {
+        public boolean onDown(MotionEvent e) {
+            isDown = true;
+            return true;
+        }
+
+        public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
+            isFling = true;
+            return true;
+        }
+
+        public void onLongPress(MotionEvent e) {
+            onLongPress = true;
+        }
+
+        public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
+            isScroll = true;
+            return true;
+        }
+
+        public void onShowPress(MotionEvent e) {
+            onShowPress = true;
+        }
+
+        public boolean onSingleTapUp(MotionEvent e) {
+            isSingleTapUp = true;
+            return true;
+        }
+
+        public boolean onDoubleTap(MotionEvent e) {
+            onDoubleTap = true;
+            return false;
+        }
+
+        public boolean onDoubleTapEvent(MotionEvent e) {
+            onDoubleTapEvent = true;
+            return false;
+        }
+
+        public boolean onSingleTapConfirmed(MotionEvent e) {
+            onSingleTapConfirmed = true;
+            return false;
+        }
+    }
+
+    class MockOnTouchListener implements OnTouchListener {
+
+        public boolean onTouch(View v, MotionEvent event) {
+            mGestureDetector.onTouchEvent(event);
+            return true;
+        }
+    }
+
+}
diff --git a/tests/tests/view/src/android/view/cts/GestureDetectorTest.java b/tests/tests/view/src/android/view/cts/GestureDetectorTest.java
index e2e5465..3d8ba05 100644
--- a/tests/tests/view/src/android/view/cts/GestureDetectorTest.java
+++ b/tests/tests/view/src/android/view/cts/GestureDetectorTest.java
@@ -23,14 +23,14 @@
 import android.view.GestureDetector.SimpleOnGestureListener;
 
 public class GestureDetectorTest extends
-        ActivityInstrumentationTestCase2<GestureDetectorStubActivity> {
+        ActivityInstrumentationTestCase2<GestureDetectorCtsActivity> {
 
     private GestureDetector mGestureDetector;
-    private GestureDetectorStubActivity mActivity;
+    private GestureDetectorCtsActivity mActivity;
     private Context mContext;
 
     public GestureDetectorTest() {
-        super("com.android.cts.stub", GestureDetectorStubActivity.class);
+        super("com.android.cts.view", GestureDetectorCtsActivity.class);
     }
 
     @Override
diff --git a/tests/tests/view/src/android/view/cts/LayoutInflaterTest.java b/tests/tests/view/src/android/view/cts/LayoutInflaterTest.java
index 07c6e8c..bf83086 100644
--- a/tests/tests/view/src/android/view/cts/LayoutInflaterTest.java
+++ b/tests/tests/view/src/android/view/cts/LayoutInflaterTest.java
@@ -16,12 +16,11 @@
 
 package android.view.cts;
 
-import com.android.cts.stub.R;
+import com.android.cts.view.R;
 import com.android.internal.util.XmlUtils;
 
 import org.xmlpull.v1.XmlPullParser;
 
-import android.app.cts.MockActivity;
 import android.content.ComponentName;
 import android.content.Context;
 import android.content.pm.ActivityInfo;
@@ -212,7 +211,7 @@
 
     public void testInflate() {
         View view = mLayoutInflater.inflate(
-                com.android.cts.stub.R.layout.inflater_layout, null);
+                com.android.cts.view.R.layout.inflater_layout, null);
         assertNotNull(view);
         view = null;
         try {
@@ -385,7 +384,7 @@
 
     public void testInflateTags() {
         final View view = mLayoutInflater.inflate(
-                com.android.cts.stub.R.layout.inflater_layout_tags, null);
+                com.android.cts.view.R.layout.inflater_layout_tags, null);
         assertNotNull(view);
 
         checkViewTag(view, R.id.viewlayout_root, R.id.tag_viewlayout_root, R.string.tag1);
diff --git a/tests/tests/view/src/android/view/cts/MenuInflaterCtsActivity.java b/tests/tests/view/src/android/view/cts/MenuInflaterCtsActivity.java
new file mode 100644
index 0000000..75adede
--- /dev/null
+++ b/tests/tests/view/src/android/view/cts/MenuInflaterCtsActivity.java
@@ -0,0 +1,28 @@
+/*
+ * Copyright (C) 2008 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.view.cts;
+
+import android.app.Activity;
+import android.view.MenuInflater;
+
+/**
+ * Stub activity for testing {@link MenuInflater}.
+ *
+ * @see MenuInflaterTest
+ */
+public class MenuInflaterCtsActivity extends Activity {
+}
diff --git a/tests/tests/view/src/android/view/cts/MenuInflaterTest.java b/tests/tests/view/src/android/view/cts/MenuInflaterTest.java
index cf1047e..bd483f9 100644
--- a/tests/tests/view/src/android/view/cts/MenuInflaterTest.java
+++ b/tests/tests/view/src/android/view/cts/MenuInflaterTest.java
@@ -16,7 +16,7 @@
 
 package android.view.cts;
 
-import com.android.cts.stub.R;
+import com.android.cts.view.R;
 import com.android.internal.view.menu.MenuBuilder;
 
 
@@ -30,18 +30,17 @@
 import android.view.Menu;
 import android.view.MenuInflater;
 import android.view.SubMenu;
-import android.widget.cts.WidgetTestUtils;
 
 /**
  * Test {@link MenuInflater}.
  */
-public class MenuInflaterTest extends ActivityInstrumentationTestCase2<MenuInflaterStubActivity> {
+public class MenuInflaterTest extends ActivityInstrumentationTestCase2<MenuInflaterCtsActivity> {
     private MenuInflater mMenuInflater;
 
     private Activity mActivity;
 
     public MenuInflaterTest() {
-        super("com.android.cts.stub", MenuInflaterStubActivity.class);
+        super("com.android.cts.view", MenuInflaterCtsActivity.class);
     }
 
     @Override
@@ -59,7 +58,7 @@
         Menu menu = new MenuBuilder(mActivity);
         assertEquals(0, menu.size());
 
-        mMenuInflater.inflate(com.android.cts.stub.R.menu.browser, menu);
+        mMenuInflater.inflate(com.android.cts.view.R.menu.browser, menu);
         assertNotNull(menu);
         assertEquals(1, menu.size());
 
@@ -70,7 +69,7 @@
         }
 
         try {
-            mMenuInflater.inflate(com.android.cts.stub.R.menu.browser, null);
+            mMenuInflater.inflate(com.android.cts.view.R.menu.browser, null);
             fail("should throw NullPointerException");
         } catch (NullPointerException e) {
         }
@@ -94,7 +93,7 @@
 
         // the titles and icons
         menu = new MenuBuilder(mActivity);
-        mMenuInflater.inflate(com.android.cts.stub.R.menu.title_icon, menu);
+        mMenuInflater.inflate(com.android.cts.view.R.menu.title_icon, menu);
 
         assertEquals("Start", menu.findItem(R.id.start).getTitle());
         assertIconUsingDrawableRes((BitmapDrawable) menu.findItem(R.id.start).getIcon(),
@@ -110,7 +109,7 @@
 
         // the orders and categories
         menu = new MenuBuilder(mActivity);
-        mMenuInflater.inflate(com.android.cts.stub.R.menu.category_order, menu);
+        mMenuInflater.inflate(com.android.cts.view.R.menu.category_order, menu);
         // default category
         assertEquals(R.id.most_used_items, menu.findItem(R.id.first_most_item).getGroupId());
         assertEquals(1, menu.findItem(R.id.first_most_item).getOrder());
@@ -134,7 +133,7 @@
 
         // the checkables
         menu = new MenuBuilder(mActivity);
-        mMenuInflater.inflate(com.android.cts.stub.R.menu.checkable, menu);
+        mMenuInflater.inflate(com.android.cts.view.R.menu.checkable, menu);
         // noncheckables
         assertEquals(R.id.noncheckable_group,
                 menu.findItem(R.id.noncheckable_item_1).getGroupId());
diff --git a/tests/tests/view/src/android/view/cts/MockActivity.java b/tests/tests/view/src/android/view/cts/MockActivity.java
new file mode 100644
index 0000000..6e12901
--- /dev/null
+++ b/tests/tests/view/src/android/view/cts/MockActivity.java
@@ -0,0 +1,23 @@
+/*
+ * Copyright (C) 2008 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.view.cts;
+
+import android.app.Activity;
+
+public class MockActivity extends Activity {
+
+}
diff --git a/tests/tests/view/src/android/view/cts/MockApplication.java b/tests/tests/view/src/android/view/cts/MockApplication.java
new file mode 100644
index 0000000..e99e6b8
--- /dev/null
+++ b/tests/tests/view/src/android/view/cts/MockApplication.java
@@ -0,0 +1,59 @@
+/*
+ * Copyright (C) 2008 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.view.cts;
+
+import android.app.Application;
+import android.content.res.Configuration;
+
+
+public class MockApplication extends Application {
+
+    public boolean isOnCreateCalled;
+    public boolean isConstructorCalled;
+    public boolean isOnConfigurationChangedCalled;
+    public boolean isOnLowMemoryCalled;
+
+    public MockApplication() {
+        super();
+        isConstructorCalled = true;
+    }
+
+    @Override
+    public void onCreate() {
+        super.onCreate();
+        isOnCreateCalled = true;
+    }
+
+    @Override
+    public void onTerminate() {
+        super.onTerminate();
+        // The documentation states that one cannot rely on this method being called. No need to
+        // test it here.
+    }
+
+    @Override
+    public void onConfigurationChanged(Configuration newConfig) {
+        super.onConfigurationChanged(newConfig);
+        isOnConfigurationChangedCalled = true;
+    }
+
+    @Override
+    public void onLowMemory() {
+        super.onLowMemory();
+        isOnLowMemoryCalled = true;
+    }
+}
diff --git a/tests/tests/view/src/android/view/cts/MockLinearLayout.java b/tests/tests/view/src/android/view/cts/MockLinearLayout.java
new file mode 100644
index 0000000..9fe425b
--- /dev/null
+++ b/tests/tests/view/src/android/view/cts/MockLinearLayout.java
@@ -0,0 +1,44 @@
+/*
+ * Copyright (C) 2008 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.view.cts;
+
+import android.content.Context;
+import android.graphics.Rect;
+import android.util.AttributeSet;
+import android.view.ViewParent;
+import android.widget.LinearLayout;
+
+public class MockLinearLayout extends LinearLayout {
+
+    public boolean mIsInvalidateChildInParentCalled;
+
+    public MockLinearLayout(Context context, AttributeSet attrs) {
+        super(context, attrs);
+    }
+
+    public MockLinearLayout(Context context) {
+        super(context);
+    }
+
+    @Override
+    public ViewParent invalidateChildInParent(int[] location, Rect dirty) {
+        mIsInvalidateChildInParentCalled = true;
+        return super.invalidateChildInParent(location, dirty);
+    }
+
+}
+
diff --git a/tests/tests/view/src/android/view/cts/MockTextView.java b/tests/tests/view/src/android/view/cts/MockTextView.java
new file mode 100644
index 0000000..dc9420d
--- /dev/null
+++ b/tests/tests/view/src/android/view/cts/MockTextView.java
@@ -0,0 +1,224 @@
+/*
+ * Copyright (C) 2011 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.view.cts;
+
+import android.content.Context;
+import android.graphics.Canvas;
+import android.graphics.Rect;
+import android.graphics.drawable.Drawable;
+import android.os.Bundle;
+import android.text.method.MovementMethod;
+import android.util.AttributeSet;
+import android.view.ContextMenu;
+import android.view.KeyEvent;
+import android.widget.TextView;
+
+public class MockTextView extends TextView {
+    private boolean mHasCalledOnCreateContextMenu;
+    private boolean mHasCalledOnFocusChanged;
+    private boolean mHasCalledOnMeasure;
+    private boolean mHasCalledOnTextChanged;
+    private boolean mHasCalledDrawableStateChanged;
+    private boolean mHasCalledOnWindowFocusChanged;
+    private boolean mHasCalledOnPrivateIMECommand;
+    private boolean mHasCalledOnKeyMultiple;
+
+    public MockTextView(Context context) {
+        super(context);
+    }
+
+    public MockTextView(Context context, AttributeSet attrs) {
+        super(context, attrs);
+    }
+
+    public MockTextView(Context context, AttributeSet attrs, int defStyle) {
+        super(context, attrs, defStyle);
+    }
+
+    public boolean hasCalledOnWindowFocusChanged() {
+        return mHasCalledOnWindowFocusChanged;
+    }
+
+    public boolean hasCalledOnCreateContextMenu() {
+        return mHasCalledOnCreateContextMenu;
+    }
+
+    public boolean hasCalledDrawableStateChanged() {
+        return mHasCalledDrawableStateChanged;
+    }
+
+    public boolean hasCalledOnFocusChanged() {
+        return mHasCalledOnFocusChanged;
+    }
+
+    public boolean hasCalledOnMeasure() {
+        return mHasCalledOnMeasure;
+    }
+
+    public boolean hasCalledOnTextChanged() {
+        return mHasCalledOnTextChanged;
+    }
+
+    public boolean hasCalledOnPrivateIMECommand() {
+        return mHasCalledOnPrivateIMECommand;
+    }
+
+    public boolean hasCalledOnKeyMultiple(){
+        return mHasCalledOnKeyMultiple;
+    }
+
+    public void reset() {
+        mHasCalledOnWindowFocusChanged = false;
+        mHasCalledDrawableStateChanged = false;
+        mHasCalledOnCreateContextMenu = false;
+        mHasCalledOnFocusChanged = false;
+        mHasCalledOnMeasure = false;
+        mHasCalledOnTextChanged = false;
+        mHasCalledOnPrivateIMECommand = false;
+        mHasCalledOnKeyMultiple = false;
+    }
+
+    public int computeHorizontalScrollRange() {
+        return super.computeHorizontalScrollRange();
+    }
+
+    public int computeVerticalScrollRange() {
+        return super.computeVerticalScrollRange();
+    }
+
+    @Override
+    protected void drawableStateChanged() {
+        super.drawableStateChanged();
+        mHasCalledDrawableStateChanged = true;
+    }
+
+    public boolean getDefaultEditable() {
+        return super.getDefaultEditable();
+    }
+
+    public MovementMethod getDefaultMovementMethod() {
+        return super.getDefaultMovementMethod();
+    }
+
+    @Override
+    protected void onCreateContextMenu(ContextMenu menu) {
+        super.onCreateContextMenu(menu);
+        mHasCalledOnCreateContextMenu = true;
+    }
+
+    @Override
+    protected void onDetachedFromWindow() {
+        super.onDetachedFromWindow();
+    }
+
+    @Override
+    protected void onDraw(Canvas canvas) {
+        super.onDraw(canvas);
+    }
+
+    @Override
+    protected void onFocusChanged(boolean focused, int direction, Rect previouslyFocusedRect) {
+        super.onFocusChanged(focused, direction, previouslyFocusedRect);
+        mHasCalledOnFocusChanged = true;
+    }
+
+    @Override
+    public boolean onKeyMultiple(int keyCode, int repeatCount, KeyEvent event) {
+        mHasCalledOnKeyMultiple = true;
+        return super.onKeyMultiple(keyCode, repeatCount, event);
+    }
+
+    @Override
+    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
+        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
+        mHasCalledOnMeasure = true;
+    }
+
+    @Override
+    protected void onTextChanged(CharSequence text, int start, int before, int after) {
+        super.onTextChanged(text, start, before, after);
+        mHasCalledOnTextChanged = true;
+    }
+
+    public boolean setFrame(int l, int t, int r, int b) {
+        return super.setFrame(l, t, r, b);
+    }
+
+    @Override
+    public void onWindowFocusChanged(boolean hasWindowFocus) {
+        super.onWindowFocusChanged(hasWindowFocus);
+        mHasCalledOnWindowFocusChanged = true;
+    }
+
+    public float getLeftFadingEdgeStrength() {
+        return super.getLeftFadingEdgeStrength();
+    }
+
+    public float getRightFadingEdgeStrength() {
+        return super.getRightFadingEdgeStrength();
+    }
+
+    @Override
+    public boolean onPrivateIMECommand(String action, Bundle data) {
+        mHasCalledOnPrivateIMECommand = true;
+        return super.onPrivateIMECommand(action, data);
+    }
+
+    public int getFrameLeft() {
+        return mLeft;
+    }
+
+    public int getFrameTop() {
+        return mTop;
+    }
+
+    public int getFrameRight() {
+        return mRight;
+    }
+
+    public int getFrameBottom() {
+        return mBottom;
+    }
+
+    public int getBottomPaddingOffset() {
+        return super.getBottomPaddingOffset();
+    }
+
+    public int getLeftPaddingOffset() {
+        return super.getLeftPaddingOffset();
+    }
+
+    public int getRightPaddingOffset() {
+        return super.getRightPaddingOffset();
+    }
+
+    public int getTopPaddingOffset() {
+        return super.getTopPaddingOffset();
+    }
+
+    public boolean isPaddingOffsetRequired() {
+        return super.isPaddingOffsetRequired();
+    }
+
+    public boolean verifyDrawable(Drawable who) {
+        return super.verifyDrawable(who);
+    }
+
+    public int computeVerticalScrollExtent() {
+        return super.computeVerticalScrollExtent();
+    }
+}
diff --git a/tests/src/android/view/cts/MockView.java b/tests/tests/view/src/android/view/cts/MockView.java
similarity index 100%
rename from tests/src/android/view/cts/MockView.java
rename to tests/tests/view/src/android/view/cts/MockView.java
diff --git a/tests/src/android/view/cts/MockViewStub.java b/tests/tests/view/src/android/view/cts/MockViewStub.java
similarity index 100%
rename from tests/src/android/view/cts/MockViewStub.java
rename to tests/tests/view/src/android/view/cts/MockViewStub.java
diff --git a/tests/tests/view/src/android/view/cts/MyScrollView.java b/tests/tests/view/src/android/view/cts/MyScrollView.java
new file mode 100644
index 0000000..3701ab0
--- /dev/null
+++ b/tests/tests/view/src/android/view/cts/MyScrollView.java
@@ -0,0 +1,69 @@
+/*
+ * Copyright (C) 2009 The Android Open Source Project.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.view.cts;
+
+import android.content.Context;
+import android.graphics.Rect;
+import android.util.AttributeSet;
+import android.view.View;
+import android.widget.ScrollView;
+
+public class MyScrollView extends ScrollView {
+    public MyScrollView(Context context) {
+        super(context);
+    }
+
+    public MyScrollView(Context context, AttributeSet attrs) {
+        super(context, attrs);
+    }
+
+    public MyScrollView(Context context, AttributeSet attrs, int defStyle) {
+        super(context, attrs, defStyle);
+    }
+
+    @Override
+    protected int computeScrollDeltaToGetChildRectOnScreen(Rect rect) {
+        return super.computeScrollDeltaToGetChildRectOnScreen(rect);
+    }
+
+    @Override
+    protected int computeVerticalScrollRange() {
+        return super.computeVerticalScrollRange();
+    }
+
+    @Override
+    protected float getBottomFadingEdgeStrength() {
+        return super.getBottomFadingEdgeStrength();
+    }
+
+    @Override
+    protected float getTopFadingEdgeStrength() {
+        return super.getTopFadingEdgeStrength();
+    }
+
+    @Override
+    protected void measureChild(View c, int pWidthMeasureSpec, int pHeightMeasureSpec) {
+        super.measureChild(c, pWidthMeasureSpec, pHeightMeasureSpec);
+    }
+
+    @Override
+    protected void measureChildWithMargins(View child, int parentWidthMeasureSpec, int widthUsed,
+            int parentHeightMeasureSpec, int heightUsed) {
+        super.measureChildWithMargins(child, parentWidthMeasureSpec, widthUsed,
+                parentHeightMeasureSpec, heightUsed);
+    }
+}
diff --git a/tests/tests/view/src/android/view/cts/SurfaceViewCtsActivity.java b/tests/tests/view/src/android/view/cts/SurfaceViewCtsActivity.java
new file mode 100644
index 0000000..a6bc5fb
--- /dev/null
+++ b/tests/tests/view/src/android/view/cts/SurfaceViewCtsActivity.java
@@ -0,0 +1,272 @@
+/*
+ * Copyright (C) 2009 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package android.view.cts;
+
+import android.app.Activity;
+import android.content.Context;
+import android.graphics.Bitmap;
+import android.graphics.Canvas;
+import android.graphics.Color;
+import android.graphics.Paint;
+import android.graphics.PorterDuff.Mode;
+import android.os.Bundle;
+import android.view.SurfaceHolder;
+import android.view.SurfaceView;
+
+public class SurfaceViewCtsActivity extends Activity {
+    private MockSurfaceView mSurfaceView;
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+
+        // New a MockSurfaceView
+        mSurfaceView = new MockSurfaceView(this);
+        setContentView(mSurfaceView);
+    }
+
+    public MockSurfaceView getSurfaceView() {
+        return mSurfaceView;
+    }
+
+    public class MockSurfaceView extends SurfaceView implements SurfaceHolder.Callback {
+        private static final int FIX_WIDTH = 240;
+        private static final int FIX_HEIGHT = 240;
+        private static final int BITMAP_WIDTH = 100;
+        private static final int BITMAP_HEIGHT = 100;
+        private static final int RECT_LEFT = 20;
+        private static final int RECT_TOP = 100;
+        private static final int RECT_RIGHT = 200;
+        private static final int RECT_BOTTOM = 200;
+
+        private SurfaceHolder mHolder;
+        private MockCanvas mCanvas;
+
+        private boolean mIsDraw;
+        private boolean mIsAttachedToWindow;
+        private boolean mIsDetachedFromWindow;
+        private boolean mIsOnMeasure;
+        private boolean mIsOnScrollChanged;
+        private boolean mIsOnSizeChanged;
+        private boolean mIsOnWindowVisibilityChanged;
+        private boolean mIsDispatchDraw;
+        private boolean mIsSurfaceChanged;
+
+        private int mWidthInOnMeasure;
+        private int mHeightInOnMeasure;
+        private int mOldLOnScrollChanged;
+        private int mOldTOnScrollChanged;
+        private int mOldWOnSizeChanged;
+        private int mOldHOnSizeChanged;
+        private int mVisibilityOnWindowVisibilityChanged;
+
+        public MockSurfaceView(Context context) {
+            super(context);
+            mHolder = getHolder();
+            mHolder.addCallback(this);
+            mHolder.setFixedSize(FIX_WIDTH, FIX_HEIGHT);
+        }
+
+        @Override
+        public void onWindowVisibilityChanged(int visibility) {
+            super.onWindowVisibilityChanged(visibility);
+            mVisibilityOnWindowVisibilityChanged = visibility;
+            mIsOnWindowVisibilityChanged = true;
+        }
+
+        public int getVInOnWindowVisibilityChanged() {
+            return mVisibilityOnWindowVisibilityChanged;
+        }
+
+        @Override
+        public void draw(Canvas canvas) {
+            super.draw(canvas);
+            mIsDraw = true;
+        }
+
+        @Override
+        public void onAttachedToWindow() {
+            super.onAttachedToWindow();
+            mIsAttachedToWindow = true;
+        }
+
+        @Override
+        public void onDetachedFromWindow() {
+            super.onDetachedFromWindow();
+            mIsDetachedFromWindow = true;
+        }
+
+        @Override
+        public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
+            super.onMeasure(widthMeasureSpec, heightMeasureSpec);
+            mWidthInOnMeasure = getDefaultSize(FIX_WIDTH, widthMeasureSpec);
+            mHeightInOnMeasure = getDefaultSize(FIX_HEIGHT, heightMeasureSpec);
+            mIsOnMeasure = true;
+        }
+
+        public int getWidthInOnMeasure() {
+            return mWidthInOnMeasure;
+        }
+
+        public int getHeightInOnMeasure() {
+            return mHeightInOnMeasure;
+        }
+
+        @Override
+        public void onScrollChanged(int l, int t, int oldl, int oldt) {
+            super.onScrollChanged(l, t, oldl, oldt);
+
+            mOldLOnScrollChanged = oldl;
+            mOldTOnScrollChanged = oldt;
+            mIsOnScrollChanged = true;
+        }
+
+        public int getOldHorizontal() {
+            return mOldLOnScrollChanged;
+        }
+
+        public int getOldVertical() {
+            return mOldTOnScrollChanged;
+        }
+
+        @Override
+        public void onSizeChanged(int w, int h, int oldw, int oldh) {
+            super.onSizeChanged(w, h, oldw, oldh);
+
+            mOldWOnSizeChanged = oldw;
+            mOldHOnSizeChanged = oldh;
+            mIsOnSizeChanged = true;
+        }
+
+        public int getOldWidth() {
+            return mOldWOnSizeChanged;
+        }
+
+        public int getOldHeight() {
+            return mOldHOnSizeChanged;
+        }
+
+        @Override
+        protected void dispatchDraw(Canvas canvas) {
+            super.dispatchDraw(canvas);
+            mIsDispatchDraw = true;
+        }
+
+        public void setFormat(int format) {
+            getHolder().setFormat(format);
+        }
+
+        public void surfaceCreated(SurfaceHolder holder) {
+            // Use mock canvas listening to the drawColor() calling.
+            mCanvas = new MockCanvas(Bitmap.createBitmap( BITMAP_WIDTH,
+                                                          BITMAP_HEIGHT,
+                                                          Bitmap.Config.ARGB_8888));
+            draw(mCanvas);
+
+            // Lock the surface, this returns a Canvas that can be used to render into.
+            Canvas canvas = mHolder.lockCanvas();
+            Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
+            paint.setColor(Color.BLUE);
+            canvas.drawRect(RECT_LEFT, RECT_TOP, RECT_RIGHT, RECT_BOTTOM, paint);
+
+            // And finally unlock and post the surface.
+            mHolder.unlockCanvasAndPost(canvas);
+        }
+
+        public void surfaceDestroyed(SurfaceHolder holder) {
+        }
+
+        public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
+            mIsSurfaceChanged = true;
+        }
+
+        public boolean isDraw() {
+            return mIsDraw;
+        }
+
+        public boolean isOnAttachedToWindow() {
+            return mIsAttachedToWindow;
+        }
+
+        public boolean isDetachedFromWindow() {
+            return mIsDetachedFromWindow;
+        }
+
+        public boolean isOnMeasureCalled() {
+            return mIsOnMeasure;
+        }
+
+        public boolean isOnScrollChanged() {
+            return mIsOnScrollChanged;
+        }
+
+        public boolean isOnSizeChangedCalled() {
+            return mIsOnSizeChanged;
+        }
+
+        public void resetOnSizeChangedFlag(boolean b) {
+            mIsOnSizeChanged = b;
+        }
+
+        public boolean isOnWindowVisibilityChanged() {
+            return mIsOnWindowVisibilityChanged;
+        }
+
+        public boolean isDispatchDraw() {
+            return mIsDispatchDraw;
+        }
+
+        public boolean isDrawColor() {
+            if (mCanvas != null) {
+                return mCanvas.isDrawColor();
+            } else {
+                return false;
+            }
+        }
+
+        public boolean isSurfaceChanged() {
+            return mIsSurfaceChanged;
+        }
+
+        public void setDrawColor(boolean isDrawColor) {
+            if (mCanvas != null) {
+                mCanvas.setDrawColor(isDrawColor);
+            }
+        }
+    }
+
+    class MockCanvas extends Canvas {
+        private boolean mIsDrawColor;
+
+        public MockCanvas(Bitmap bitmap) {
+            super(bitmap);
+        }
+
+        @Override
+        public void drawColor(int color, Mode mode) {
+            super.drawColor(color, mode);
+            mIsDrawColor = true;
+        }
+
+        public boolean isDrawColor() {
+            return mIsDrawColor;
+        }
+
+        public void setDrawColor(boolean isDrawColor) {
+            this.mIsDrawColor = isDrawColor;
+        }
+    }
+}
diff --git a/tests/tests/view/src/android/view/cts/SurfaceViewTest.java b/tests/tests/view/src/android/view/cts/SurfaceViewTest.java
index 65f05b8..d3902bb 100644
--- a/tests/tests/view/src/android/view/cts/SurfaceViewTest.java
+++ b/tests/tests/view/src/android/view/cts/SurfaceViewTest.java
@@ -28,16 +28,16 @@
 import android.view.KeyEvent;
 import android.view.SurfaceHolder;
 import android.view.SurfaceView;
-import android.view.cts.SurfaceViewStubActivity.MockSurfaceView;
+import android.view.cts.SurfaceViewCtsActivity.MockSurfaceView;
 
-public class SurfaceViewTest extends ActivityInstrumentationTestCase2<SurfaceViewStubActivity> {
+public class SurfaceViewTest extends ActivityInstrumentationTestCase2<SurfaceViewCtsActivity> {
 
     private Context mContext;
     private Instrumentation mInstrumentation;
     private MockSurfaceView mMockSurfaceView;
 
     public SurfaceViewTest() {
-        super("com.android.cts.stub", SurfaceViewStubActivity.class);
+        super("com.android.cts.view", SurfaceViewCtsActivity.class);
     }
 
     @Override
@@ -45,7 +45,7 @@
         super.setUp();
         mInstrumentation = getInstrumentation();
         mContext = mInstrumentation.getContext();
-        final SurfaceViewStubActivity activity = getActivity();
+        final SurfaceViewCtsActivity activity = getActivity();
         new PollingCheck() {
             @Override
                 protected boolean check() {
diff --git a/tests/src/android/view/cts/TestButton.java b/tests/tests/view/src/android/view/cts/TestButton.java
similarity index 100%
rename from tests/src/android/view/cts/TestButton.java
rename to tests/tests/view/src/android/view/cts/TestButton.java
diff --git a/tests/tests/view/src/android/view/cts/TouchDelegateTest.java b/tests/tests/view/src/android/view/cts/TouchDelegateTest.java
index 4e582a1..34d96bc 100644
--- a/tests/tests/view/src/android/view/cts/TouchDelegateTest.java
+++ b/tests/tests/view/src/android/view/cts/TouchDelegateTest.java
@@ -19,7 +19,6 @@
 
 import android.app.Activity;
 import android.app.Instrumentation;
-import android.app.cts.MockActivity;
 import android.graphics.Rect;
 import android.test.ActivityInstrumentationTestCase2;
 import android.test.UiThreadTest;
@@ -45,7 +44,7 @@
     private Exception mException;
 
     public TouchDelegateTest() {
-        super("com.android.cts.stub", MockActivity.class);
+        super("com.android.cts.view", MockActivity.class);
     }
 
     @Override
diff --git a/tests/tests/view/src/android/view/cts/UsingViewsCtsActivity.java b/tests/tests/view/src/android/view/cts/UsingViewsCtsActivity.java
new file mode 100644
index 0000000..a5ccbcd
--- /dev/null
+++ b/tests/tests/view/src/android/view/cts/UsingViewsCtsActivity.java
@@ -0,0 +1,32 @@
+/*
+ * Copyright (C) 2009 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.view.cts;
+
+import android.app.Activity;
+import android.os.Bundle;
+import com.android.cts.view.R;
+
+/**
+ * A simple activity to test "Using Views"
+ */
+public class UsingViewsCtsActivity extends Activity {
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.using_views_layout);
+    }
+}
diff --git a/tests/tests/view/src/android/view/cts/ViewGroupCtsActivity.java b/tests/tests/view/src/android/view/cts/ViewGroupCtsActivity.java
new file mode 100644
index 0000000..71bb28c
--- /dev/null
+++ b/tests/tests/view/src/android/view/cts/ViewGroupCtsActivity.java
@@ -0,0 +1,70 @@
+/*
+ * Copyright (C) 2008 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.view.cts;
+
+import android.app.Activity;
+import android.app.cts.CTSResult;
+import android.os.Bundle;
+import android.os.Handler;
+import android.widget.TextView;
+
+public class ViewGroupCtsActivity extends Activity {
+
+    public static final String ACTION_INVALIDATE_CHILD = "invalidateChild";
+
+    private final Handler mHandler = new Handler();
+    private static CTSResult sResult;
+    public static void setResult(CTSResult result) {
+        sResult = result;
+    }
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(com.android.cts.view.R.layout.viewgrouptest_stub);
+        TextView textView = (TextView)findViewById(com.android.cts.view.R.id.viewgrouptest_stub);
+        textView.setText("test");
+    }
+
+    @Override
+    protected void onResume() {
+        super.onResume();
+
+        String action = getIntent().getAction();
+        if (action.equals(ACTION_INVALIDATE_CHILD)) {
+            mHandler.postDelayed(new Runnable() {
+                public void run() {
+                    MockLinearLayout mll =
+                        (MockLinearLayout) findViewById(com.android.cts.view.R.id.
+                                                                        mocklinearlayout);
+                    if (!mll.mIsInvalidateChildInParentCalled) {
+                        fail();
+                        return;
+                    }
+                    sResult.setResult(CTSResult.RESULT_OK);
+                    finish();
+                }
+            }, 2000);
+        }
+    }
+
+    private void fail() {
+        sResult.setResult(CTSResult.RESULT_FAIL);
+        finish();
+    }
+}
+
diff --git a/tests/tests/view/src/android/view/cts/ViewGroupTest.java b/tests/tests/view/src/android/view/cts/ViewGroupTest.java
index b46c031..55428de 100644
--- a/tests/tests/view/src/android/view/cts/ViewGroupTest.java
+++ b/tests/tests/view/src/android/view/cts/ViewGroupTest.java
@@ -54,7 +54,6 @@
 import android.view.animation.Transformation;
 import android.view.animation.Animation.AnimationListener;
 import android.widget.TextView;
-import android.widget.cts.ViewGroupStubActivity;
 
 import java.util.ArrayList;
 
@@ -723,7 +722,7 @@
     public void testGenerateLayoutParamsWithParaAttributeSet() throws Exception{
         MockViewGroup vg = new MockViewGroup(mContext);
         XmlResourceParser set = mContext.getResources().getLayout(
-                com.android.cts.stub.R.layout.abslistview_layout);
+                com.android.cts.view.R.layout.abslistview_layout);
         XmlUtils.beginDocument(set, "ViewGroup_Layout");
         LayoutParams lp = vg.generateLayoutParams(set);
         assertNotNull(lp);
@@ -862,15 +861,15 @@
     private void setupActivity(String action) {
 
         Intent intent = new Intent(getInstrumentation().getTargetContext(),
-                ViewGroupStubActivity.class);
+                ViewGroupCtsActivity.class);
         intent.setAction(action);
         intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
         getInstrumentation().getTargetContext().startActivity(intent);
     }
 
     public void testInvalidateChild() {
-        ViewGroupStubActivity.setResult(this);
-        setupActivity(ViewGroupStubActivity.ACTION_INVALIDATE_CHILD);
+        ViewGroupCtsActivity.setResult(this);
+        setupActivity(ViewGroupCtsActivity.ACTION_INVALIDATE_CHILD);
         waitForResult();
         assertEquals(CTSResult.RESULT_OK, mResultCode);
     }
diff --git a/tests/tests/view/src/android/view/cts/ViewGroup_LayoutParamsTest.java b/tests/tests/view/src/android/view/cts/ViewGroup_LayoutParamsTest.java
index 37bac7c..ded715a 100644
--- a/tests/tests/view/src/android/view/cts/ViewGroup_LayoutParamsTest.java
+++ b/tests/tests/view/src/android/view/cts/ViewGroup_LayoutParamsTest.java
@@ -28,7 +28,7 @@
 import android.view.ViewGroup;
 import android.view.ViewGroup.LayoutParams;
 
-import com.android.cts.stub.R;
+import com.android.cts.view.R;
 import com.android.internal.util.XmlUtils;
 
 
diff --git a/tests/tests/view/src/android/view/cts/ViewGroup_MarginLayoutParamsTest.java b/tests/tests/view/src/android/view/cts/ViewGroup_MarginLayoutParamsTest.java
index fe364bc..d3fed0d 100644
--- a/tests/tests/view/src/android/view/cts/ViewGroup_MarginLayoutParamsTest.java
+++ b/tests/tests/view/src/android/view/cts/ViewGroup_MarginLayoutParamsTest.java
@@ -25,7 +25,7 @@
 
 import android.widget.LinearLayout;
 import com.android.internal.util.XmlUtils;
-import com.android.cts.stub.R;
+import com.android.cts.view.R;
 
 
 public class ViewGroup_MarginLayoutParamsTest extends InstrumentationTestCase {
diff --git a/tests/tests/view/src/android/view/cts/ViewLayoutPositionTestCtsActivity.java b/tests/tests/view/src/android/view/cts/ViewLayoutPositionTestCtsActivity.java
new file mode 100644
index 0000000..69dc70f
--- /dev/null
+++ b/tests/tests/view/src/android/view/cts/ViewLayoutPositionTestCtsActivity.java
@@ -0,0 +1,29 @@
+/*
+ * Copyright (C) 2008 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.view.cts;
+
+import android.app.Activity;
+import android.os.Bundle;
+import com.android.cts.view.R;
+
+public class ViewLayoutPositionTestCtsActivity extends Activity {
+    @Override
+    protected void onCreate(Bundle icicle) {
+        super.onCreate(icicle);
+        setContentView(R.layout.view_layout_position);
+    }
+}
diff --git a/tests/tests/view/src/android/view/cts/ViewStubCtsActivity.java b/tests/tests/view/src/android/view/cts/ViewStubCtsActivity.java
new file mode 100644
index 0000000..d2f2a4f
--- /dev/null
+++ b/tests/tests/view/src/android/view/cts/ViewStubCtsActivity.java
@@ -0,0 +1,29 @@
+/*
+ * Copyright (C) 2008 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.view.cts;
+
+import android.app.Activity;
+import android.os.Bundle;
+import com.android.cts.view.R;
+
+public class ViewStubCtsActivity extends Activity {
+    @Override
+    protected void onCreate(Bundle icicle) {
+        super.onCreate(icicle);
+        setContentView(R.layout.viewstub_layout);
+    }
+}
diff --git a/tests/tests/view/src/android/view/cts/ViewStubTest.java b/tests/tests/view/src/android/view/cts/ViewStubTest.java
index 07834d2..53e251a 100644
--- a/tests/tests/view/src/android/view/cts/ViewStubTest.java
+++ b/tests/tests/view/src/android/view/cts/ViewStubTest.java
@@ -16,7 +16,7 @@
 
 package android.view.cts;
 
-import com.android.cts.stub.R;
+import com.android.cts.view.R;
 
 import dalvik.annotation.KnownFailure;
 
@@ -37,12 +37,12 @@
 /**
  * Test {@link ViewStub}.
  */
-public class ViewStubTest extends ActivityInstrumentationTestCase<ViewStubStubActivity> {
+public class ViewStubTest extends ActivityInstrumentationTestCase<ViewStubCtsActivity> {
     private Context mContext;
     private Activity mActivity;
 
     public ViewStubTest() {
-        super("com.android.cts.stub", ViewStubStubActivity.class);
+        super("com.android.cts.view", ViewStubCtsActivity.class);
     }
 
     @Override
diff --git a/tests/tests/view/src/android/view/cts/ViewTest.java b/tests/tests/view/src/android/view/cts/ViewTest.java
index 1c579ab..e8da40e 100644
--- a/tests/tests/view/src/android/view/cts/ViewTest.java
+++ b/tests/tests/view/src/android/view/cts/ViewTest.java
@@ -22,7 +22,7 @@
 import android.graphics.ColorFilter;
 import android.graphics.PorterDuff;
 
-import com.android.cts.stub.R;
+import com.android.cts.view.R;
 import com.android.internal.view.menu.ContextMenuBuilder;
 import com.google.android.collect.Lists;
 
@@ -81,7 +81,6 @@
 import android.widget.EditText;
 import android.widget.LinearLayout;
 import android.widget.ListView;
-import android.widget.cts.StubActivity;
 
 import java.util.ArrayList;
 import java.util.Arrays;
@@ -90,14 +89,14 @@
 /**
  * Test {@link View}.
  */
-public class ViewTest extends ActivityInstrumentationTestCase2<ViewTestStubActivity> {
+public class ViewTest extends ActivityInstrumentationTestCase2<ViewTestCtsActivity> {
     public ViewTest() {
-        super(ViewTestStubActivity.class);
+        super(ViewTestCtsActivity.class);
     }
 
     private Resources mResources;
     private MockViewParent mMockParent;
-    private ViewTestStubActivity mActivity;
+    private ViewTestCtsActivity mActivity;
 
     /** timeout delta when wait in case the system is sluggish */
     private static final long TIMEOUT_DELTA = 10000;
@@ -2474,7 +2473,7 @@
         assertFalse(view.hasCalledOnWindowFocusChanged());
         assertFalse(view.hasCalledDispatchWindowFocusChanged());
 
-        StubActivity activity = launchActivity("com.android.cts.stub", StubActivity.class, null);
+        CtsActivity activity = launchActivity("com.android.cts.view", CtsActivity.class, null);
 
         // Wait until the window lost focus.
         new PollingCheck(TIMEOUT_DELTA) {
diff --git a/tests/tests/view/src/android/view/cts/ViewTestCtsActivity.java b/tests/tests/view/src/android/view/cts/ViewTestCtsActivity.java
new file mode 100644
index 0000000..01215bc
--- /dev/null
+++ b/tests/tests/view/src/android/view/cts/ViewTestCtsActivity.java
@@ -0,0 +1,69 @@
+/*
+ * Copyright (C) 2008 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.view.cts;
+
+import android.app.Activity;
+import android.os.Bundle;
+import android.os.SystemClock;
+import android.util.Log;
+import com.android.cts.view.R;
+
+public class ViewTestCtsActivity extends Activity {
+    private boolean mHasWindowFocus = false;
+    private Object mHasWindowFocusLock = new Object();
+
+    @Override
+    protected void onCreate(Bundle icicle) {
+        super.onCreate(icicle);
+        setContentView(R.layout.view_layout);
+    }
+
+    @Override
+    public void onWindowFocusChanged(boolean hasFocus) {
+        super.onWindowFocusChanged(hasFocus);
+        if (!hasFocus) {
+            Log.w("ViewTestCtsActivity", "ViewTestCtsActivity lost window focus");
+        }
+        synchronized(mHasWindowFocusLock) {
+            mHasWindowFocus = hasFocus;
+            mHasWindowFocusLock.notify();
+        }
+    }
+
+    /**
+     * Blocks the calling thread until the {@link ViewTestCtsActivity} has window focus or the
+     * specified duration (in milliseconds) has passed.
+     */
+    public boolean waitForWindowFocus(long durationMillis) {
+        long elapsedMillis = SystemClock.elapsedRealtime();
+        synchronized(mHasWindowFocusLock) {
+            mHasWindowFocus = hasWindowFocus();
+            while (!mHasWindowFocus && durationMillis > 0) {
+                long newElapsedMillis = SystemClock.elapsedRealtime();
+                durationMillis -= (newElapsedMillis - elapsedMillis);
+                elapsedMillis = newElapsedMillis;
+                if (durationMillis > 0) {
+                    try {
+                        mHasWindowFocusLock.wait(durationMillis);
+                    } catch (InterruptedException e) {
+                    }
+                }
+            }
+            return mHasWindowFocus;
+        }
+    }
+}
diff --git a/tests/tests/view/src/android/view/cts/ViewTreeObserverTest.java b/tests/tests/view/src/android/view/cts/ViewTreeObserverTest.java
index cc05853..1b21dac 100644
--- a/tests/tests/view/src/android/view/cts/ViewTreeObserverTest.java
+++ b/tests/tests/view/src/android/view/cts/ViewTreeObserverTest.java
@@ -16,11 +16,10 @@
 
 package android.view.cts;
 
-import com.android.cts.stub.R;
+import com.android.cts.view.R;
 
 import android.app.Activity;
 import android.app.Instrumentation;
-import android.app.cts.MockActivity;
 import android.cts.util.PollingCheck;
 import android.test.ActivityInstrumentationTestCase2;
 import android.test.TouchUtils;
diff --git a/tests/tests/view/src/android/view/cts/View_AnimationTest.java b/tests/tests/view/src/android/view/cts/View_AnimationTest.java
index bd86ed9..64bb2f7 100644
--- a/tests/tests/view/src/android/view/cts/View_AnimationTest.java
+++ b/tests/tests/view/src/android/view/cts/View_AnimationTest.java
@@ -24,13 +24,13 @@
 import android.view.animation.TranslateAnimation;
 import android.view.animation.cts.AnimationTestUtils;
 
-import com.android.cts.stub.R;
+import com.android.cts.view.R;
 
 
 /**
  * Test {@link View}.
  */
-public class View_AnimationTest extends ActivityInstrumentationTestCase2<ViewTestStubActivity> {
+public class View_AnimationTest extends ActivityInstrumentationTestCase2<ViewTestCtsActivity> {
 
     private static final int TIME_OUT = 5000;
     private static final int DURATION = 2000;
@@ -40,7 +40,7 @@
     private TranslateAnimation mAnimation;
 
     public View_AnimationTest() {
-        super("com.android.cts.stub", ViewTestStubActivity.class);
+        super("com.android.cts.view", ViewTestCtsActivity.class);
     }
 
     @Override
diff --git a/tests/tests/view/src/android/view/cts/View_FocusHandlingTest.java b/tests/tests/view/src/android/view/cts/View_FocusHandlingTest.java
index 929ac7f..97992ee 100644
--- a/tests/tests/view/src/android/view/cts/View_FocusHandlingTest.java
+++ b/tests/tests/view/src/android/view/cts/View_FocusHandlingTest.java
@@ -16,7 +16,7 @@
 
 package android.view.cts;
 
-import com.android.cts.stub.R;
+import com.android.cts.view.R;
 
 
 import android.app.Activity;
@@ -26,9 +26,9 @@
 import android.view.View;
 
 public class View_FocusHandlingTest
-        extends ActivityInstrumentationTestCase2<FocusHandlingStubActivity> {
+        extends ActivityInstrumentationTestCase2<FocusHandlingCtsActivity> {
     public View_FocusHandlingTest() {
-        super("com.android.cts.stub", FocusHandlingStubActivity.class);
+        super("com.android.cts.view", FocusHandlingCtsActivity.class);
     }
 
     @UiThreadTest
diff --git a/tests/tests/view/src/android/view/cts/View_IdsTest.java b/tests/tests/view/src/android/view/cts/View_IdsTest.java
index ce94771..e65ccf5 100644
--- a/tests/tests/view/src/android/view/cts/View_IdsTest.java
+++ b/tests/tests/view/src/android/view/cts/View_IdsTest.java
@@ -16,7 +16,7 @@
 
 package android.view.cts;
 
-import com.android.cts.stub.R;
+import com.android.cts.view.R;
 
 
 import android.app.Activity;
@@ -27,9 +27,9 @@
 import android.widget.EditText;
 import android.widget.TextView;
 
-public class View_IdsTest extends ActivityInstrumentationTestCase2<UsingViewsStubActivity> {
+public class View_IdsTest extends ActivityInstrumentationTestCase2<UsingViewsCtsActivity> {
     public View_IdsTest() {
-        super("com.android.cts.stub", UsingViewsStubActivity.class);
+        super("com.android.cts.view", UsingViewsCtsActivity.class);
     }
 
     @UiThreadTest
diff --git a/tests/tests/view/src/android/view/cts/View_LayoutPositionTest.java b/tests/tests/view/src/android/view/cts/View_LayoutPositionTest.java
index db21be1..3938607 100644
--- a/tests/tests/view/src/android/view/cts/View_LayoutPositionTest.java
+++ b/tests/tests/view/src/android/view/cts/View_LayoutPositionTest.java
@@ -16,7 +16,7 @@
 
 package android.view.cts;
 
-import com.android.cts.stub.R;
+import com.android.cts.view.R;
 
 
 import android.app.Activity;
@@ -31,12 +31,12 @@
  * This part contains size, padding, margin, layout and drawing
  */
 public class View_LayoutPositionTest
-        extends ActivityInstrumentationTestCase2<ViewLayoutPositionTestStubActivity> {
+        extends ActivityInstrumentationTestCase2<ViewLayoutPositionTestCtsActivity> {
 
     private Activity mActivity;
 
     public View_LayoutPositionTest() {
-        super("com.android.cts.stub", ViewLayoutPositionTestStubActivity.class);
+        super("com.android.cts.view", ViewLayoutPositionTestCtsActivity.class);
     }
 
     @Override
diff --git a/tests/tests/view/src/android/view/cts/View_UsingViewsTest.java b/tests/tests/view/src/android/view/cts/View_UsingViewsTest.java
index 74f3c13..f6d067d 100644
--- a/tests/tests/view/src/android/view/cts/View_UsingViewsTest.java
+++ b/tests/tests/view/src/android/view/cts/View_UsingViewsTest.java
@@ -16,7 +16,7 @@
 
 package android.view.cts;
 
-import com.android.cts.stub.R;
+import com.android.cts.view.R;
 
 
 import android.app.Activity;
@@ -37,7 +37,7 @@
 import android.widget.TextView;
 
 
-public class View_UsingViewsTest extends ActivityInstrumentationTestCase2<UsingViewsStubActivity> {
+public class View_UsingViewsTest extends ActivityInstrumentationTestCase2<UsingViewsCtsActivity> {
     /**
      * country of Argentina
      */
@@ -78,7 +78,7 @@
     private TextView mWarningTextView;
 
     public View_UsingViewsTest() {
-        super("com.android.cts.stub", UsingViewsStubActivity.class);
+        super("com.android.cts.view", UsingViewsCtsActivity.class);
     }
 
     @Override
diff --git a/tests/tests/view/src/android/view/cts/WidgetTestUtils.java b/tests/tests/view/src/android/view/cts/WidgetTestUtils.java
new file mode 100644
index 0000000..e82e9df
--- /dev/null
+++ b/tests/tests/view/src/android/view/cts/WidgetTestUtils.java
@@ -0,0 +1,138 @@
+/*
+ * Copyright (C) 2008 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.view.cts;
+
+import org.xmlpull.v1.XmlPullParser;
+import org.xmlpull.v1.XmlPullParserException;
+
+import android.content.Context;
+import android.content.res.Resources;
+import android.graphics.Bitmap;
+import android.graphics.BitmapFactory;
+
+import java.io.IOException;
+
+import junit.framework.Assert;
+
+/**
+ * The useful methods for widget test.
+ */
+public class WidgetTestUtils {
+    /**
+     * Assert that two bitmaps are equal.
+     *
+     * @param Bitmap b1 the first bitmap which needs to compare.
+     * @param Bitmap b2 the second bitmap which needs to compare.
+     */
+    public static void assertEquals(Bitmap b1, Bitmap b2) {
+        if (b1 == b2) {
+            return;
+        }
+
+        if (b1 == null || b2 == null) {
+            Assert.fail("the bitmaps are not equal");
+        }
+
+        // b1 and b2 are all not null.
+        if (b1.getWidth() != b2.getWidth() || b1.getHeight() != b2.getHeight()
+            || b1.getConfig() != b2.getConfig()) {
+            Assert.fail("the bitmaps are not equal");
+        }
+
+        int w = b1.getWidth();
+        int h = b1.getHeight();
+        int s = w * h;
+        int[] pixels1 = new int[s];
+        int[] pixels2 = new int[s];
+
+        b1.getPixels(pixels1, 0, w, 0, 0, w, h);
+        b2.getPixels(pixels2, 0, w, 0, 0, w, h);
+
+        for (int i = 0; i < s; i++) {
+            if (pixels1[i] != pixels2[i]) {
+                Assert.fail("the bitmaps are not equal");
+            }
+        }
+    }
+
+    /**
+     * Find beginning of the special element.
+     * @param parser XmlPullParser will be parsed.
+     * @param firstElementName the target element name.
+     *
+     * @throws XmlPullParserException if XML Pull Parser related faults occur.
+     * @throws IOException if I/O-related error occur when parsing.
+     */
+    public static final void beginDocument(XmlPullParser parser, String firstElementName)
+            throws XmlPullParserException, IOException {
+        Assert.assertNotNull(parser);
+        Assert.assertNotNull(firstElementName);
+
+        int type;
+        while ((type = parser.next()) != XmlPullParser.START_TAG
+                && type != XmlPullParser.END_DOCUMENT) {
+            ;
+        }
+
+        if (!parser.getName().equals(firstElementName)) {
+            throw new XmlPullParserException("Unexpected start tag: found " + parser.getName()
+                    + ", expected " + firstElementName);
+        }
+    }
+
+    /**
+     * Compare the expected pixels with actual, scaling for the target context density
+     *
+     * @throws AssertionFailedError
+     */
+    public static void assertScaledPixels(int expected, int actual, Context context) {
+        Assert.assertEquals(expected * context.getResources().getDisplayMetrics().density,
+                actual, 3);
+    }
+
+    /** Converts dips into pixels using the {@link Context}'s density. */
+    public static int convertDipToPixels(Context context, int dip) {
+      float density = context.getResources().getDisplayMetrics().density;
+      return Math.round(density * dip);
+    }
+
+    /**
+     * Retrieve a bitmap that can be used for comparison on any density
+     * @param resources
+     * @return the {@link Bitmap} or <code>null</code>
+     */
+    public static Bitmap getUnscaledBitmap(Resources resources, int resId) {
+        BitmapFactory.Options options = new BitmapFactory.Options();
+        options.inScaled = false;
+        return BitmapFactory.decodeResource(resources, resId, options);
+    }
+
+    /**
+     * Retrieve a dithered bitmap that can be used for comparison on any density
+     * @param resources
+     * @param config the preferred config for the returning bitmap
+     * @return the {@link Bitmap} or <code>null</code>
+     */
+    public static Bitmap getUnscaledAndDitheredBitmap(Resources resources,
+            int resId, Bitmap.Config config) {
+        BitmapFactory.Options options = new BitmapFactory.Options();
+        options.inDither = true;
+        options.inScaled = false;
+        options.inPreferredConfig = config;
+        return BitmapFactory.decodeResource(resources, resId, options);
+    }
+}
diff --git a/tests/tests/view/src/android/view/cts/WindowCtsActivity.java b/tests/tests/view/src/android/view/cts/WindowCtsActivity.java
new file mode 100644
index 0000000..8af808c
--- /dev/null
+++ b/tests/tests/view/src/android/view/cts/WindowCtsActivity.java
@@ -0,0 +1,76 @@
+/*
+ * Copyright (C) 2008 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.view.cts;
+
+import com.android.cts.view.R;
+
+import android.app.Activity;
+import android.os.Bundle;
+import android.view.KeyEvent;
+import android.view.Menu;
+import android.view.Window;
+
+public class WindowCtsActivity extends Activity {
+
+    private static boolean mIsOnCreateOptionsMenuCalled;
+    private static boolean mIsOnOptionsMenuClosedCalled;
+    private static boolean mIsOnKeyDownCalled;
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        getWindow().requestFeature(Window.FEATURE_LEFT_ICON);
+        setContentView(R.layout.windowstub_layout);
+    }
+
+    @Override
+    public boolean onCreateOptionsMenu(Menu menu) {
+        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);
+    }
+
+    @Override
+    public void onOptionsMenuClosed(Menu menu) {
+        super.onOptionsMenuClosed(menu);
+        mIsOnOptionsMenuClosedCalled = true;
+    }
+
+    @Override
+    public boolean onKeyDown(int keyCode, KeyEvent event) {
+        mIsOnKeyDownCalled = true;
+        return super.onKeyDown(keyCode, event);
+    }
+
+    public boolean isOnCreateOptionsMenuCalled() {
+        return mIsOnCreateOptionsMenuCalled;
+    }
+
+    public boolean isOnOptionsMenuClosedCalled() {
+        return mIsOnOptionsMenuClosedCalled;
+    }
+
+    public boolean isOnKeyDownCalled() {
+        return mIsOnKeyDownCalled;
+    }
+
+    public void setFlagFalse() {
+        mIsOnCreateOptionsMenuCalled = false;
+        mIsOnOptionsMenuClosedCalled = false;
+    }
+}
diff --git a/tests/tests/view/src/android/view/cts/WindowTest.java b/tests/tests/view/src/android/view/cts/WindowTest.java
index 5593795..9df13dc 100644
--- a/tests/tests/view/src/android/view/cts/WindowTest.java
+++ b/tests/tests/view/src/android/view/cts/WindowTest.java
@@ -16,7 +16,7 @@
 
 package android.view.cts;
 
-import com.android.cts.stub.R;
+import com.android.cts.view.R;
 
 import android.app.Instrumentation;
 import android.app.Presentation;
@@ -62,12 +62,12 @@
 import java.util.concurrent.Semaphore;
 import java.util.concurrent.TimeUnit;
 
-public class WindowTest extends ActivityInstrumentationTestCase2<WindowStubActivity> {
+public class WindowTest extends ActivityInstrumentationTestCase2<WindowCtsActivity> {
     static final String TAG = "WindowTest";
     private Window mWindow;
     private Context mContext;
     private Instrumentation mInstrumentation;
-    private WindowStubActivity mActivity;
+    private WindowCtsActivity mActivity;
 
     private static final int VIEWGROUP_LAYOUT_HEIGHT = 100;
     private static final int VIEWGROUP_LAYOUT_WIDTH = 200;
@@ -77,7 +77,7 @@
     private VirtualDisplay mVirtualDisplay;
 
     public WindowTest() {
-        super("com.android.cts.stub", WindowStubActivity.class);
+        super("com.android.cts.view", WindowCtsActivity.class);
     }
 
     @Override
diff --git a/tests/tests/view/src/android/view/inputmethod/cts/BaseInputConnectionTest.java b/tests/tests/view/src/android/view/inputmethod/cts/BaseInputConnectionTest.java
index 247578b..30edecb 100644
--- a/tests/tests/view/src/android/view/inputmethod/cts/BaseInputConnectionTest.java
+++ b/tests/tests/view/src/android/view/inputmethod/cts/BaseInputConnectionTest.java
@@ -16,7 +16,7 @@
 
 package android.view.inputmethod.cts;
 
-import com.android.cts.stub.R;
+import com.android.cts.view.R;
 
 
 import android.app.Instrumentation;
@@ -39,16 +39,16 @@
 import android.widget.EditText;
 
 public class BaseInputConnectionTest extends
-        ActivityInstrumentationTestCase2<InputMethodStubActivity> {
+        ActivityInstrumentationTestCase2<InputMethodCtsActivity> {
 
-    private InputMethodStubActivity mActivity;
+    private InputMethodCtsActivity mActivity;
     private Window mWindow;
     private EditText mView;
     private BaseInputConnection mConnection;
     private Instrumentation mInstrumentation;
 
     public BaseInputConnectionTest() {
-        super("com.android.cts.stub", InputMethodStubActivity.class);
+        super("com.android.cts.view", InputMethodCtsActivity.class);
     }
 
     @Override
diff --git a/tests/tests/view/src/android/view/inputmethod/cts/EditorInfoTest.java b/tests/tests/view/src/android/view/inputmethod/cts/EditorInfoTest.java
index 5bc4515..1981d6f 100644
--- a/tests/tests/view/src/android/view/inputmethod/cts/EditorInfoTest.java
+++ b/tests/tests/view/src/android/view/inputmethod/cts/EditorInfoTest.java
@@ -41,7 +41,7 @@
         info.initialSelStart = 0;
         info.inputType = EditorInfo.TYPE_MASK_CLASS;
         info.label = "label";
-        info.packageName = "com.android.cts.stub";
+        info.packageName = "com.android.cts.view";
         info.privateImeOptions = "privateIme";
         Bundle b = new Bundle();
         String key = "bundleKey";
diff --git a/tests/tests/view/src/android/view/inputmethod/cts/InputConnectionWrapperTest.java b/tests/tests/view/src/android/view/inputmethod/cts/InputConnectionWrapperTest.java
index 5a7abeb..8913d6e 100644
--- a/tests/tests/view/src/android/view/inputmethod/cts/InputConnectionWrapperTest.java
+++ b/tests/tests/view/src/android/view/inputmethod/cts/InputConnectionWrapperTest.java
@@ -221,12 +221,5 @@
             isRequestCursorUpdatesCalled = true;
             return false;
         }
-
-        /**
-         * @removed
-         */
-        public boolean requestUpdateCursorAnchorInfo(int cursorUpdateMode) {
-            return requestCursorUpdates(cursorUpdateMode);
-        }
     }
 }
diff --git a/tests/tests/view/src/android/view/inputmethod/cts/InputMethodCtsActivity.java b/tests/tests/view/src/android/view/inputmethod/cts/InputMethodCtsActivity.java
new file mode 100644
index 0000000..45e5ff2
--- /dev/null
+++ b/tests/tests/view/src/android/view/inputmethod/cts/InputMethodCtsActivity.java
@@ -0,0 +1,28 @@
+/*
+ * Copyright (C) 2008 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package android.view.inputmethod.cts;
+
+import android.app.Activity;
+import android.os.Bundle;
+import com.android.cts.view.R;
+
+public class InputMethodCtsActivity extends Activity {
+    @Override
+    protected void onCreate(Bundle icicle) {
+        super.onCreate(icicle);
+        setContentView(R.layout.inputmethod_edittext);
+    }
+}
diff --git a/tests/tests/view/src/android/view/inputmethod/cts/InputMethodManagerTest.java b/tests/tests/view/src/android/view/inputmethod/cts/InputMethodManagerTest.java
index 033deb2..b84292f 100644
--- a/tests/tests/view/src/android/view/inputmethod/cts/InputMethodManagerTest.java
+++ b/tests/tests/view/src/android/view/inputmethod/cts/InputMethodManagerTest.java
@@ -15,7 +15,7 @@
  */
 package android.view.inputmethod.cts;
 
-import com.android.cts.stub.R;
+import com.android.cts.view.R;
 
 import android.app.Instrumentation;
 import android.content.Context;
@@ -35,13 +35,13 @@
 import java.util.List;
 
 public class InputMethodManagerTest
-                  extends ActivityInstrumentationTestCase2<InputMethodStubActivity> {
+                  extends ActivityInstrumentationTestCase2<InputMethodCtsActivity> {
 
     public InputMethodManagerTest() {
-        super("com.android.cts.stub", InputMethodStubActivity.class);
+        super("com.android.cts.view", InputMethodCtsActivity.class);
     }
 
-    private InputMethodStubActivity mActivity;
+    private InputMethodCtsActivity mActivity;
     private Instrumentation mInstrumentation;
 
     @Override
diff --git a/tests/src/android/view/inputmethod/cts/InputMethodSettingsActivityStub.java b/tests/tests/view/src/android/view/inputmethod/cts/InputMethodSettingsActivityStub.java
similarity index 100%
rename from tests/src/android/view/inputmethod/cts/InputMethodSettingsActivityStub.java
rename to tests/tests/view/src/android/view/inputmethod/cts/InputMethodSettingsActivityStub.java
diff --git a/tests/tests/webkit/Android.mk b/tests/tests/webkit/Android.mk
index a307f99..1d593df 100644
--- a/tests/tests/webkit/Android.mk
+++ b/tests/tests/webkit/Android.mk
@@ -23,14 +23,12 @@
 
 LOCAL_JAVA_LIBRARIES := android.test.runner
 
-LOCAL_STATIC_JAVA_LIBRARIES := ctstestrunner
+LOCAL_STATIC_JAVA_LIBRARIES := ctsdeviceutil ctstestserver ctstestrunner
 
 LOCAL_SRC_FILES := $(call all-java-files-under, src)
 
 LOCAL_PACKAGE_NAME := CtsWebkitTestCases
 
-LOCAL_INSTRUMENTATION_FOR := CtsTestStubs
-
 # uncomment when dalvik.annotation.Test* are removed or part of SDK
 #LOCAL_SDK_VERSION := current
 
diff --git a/tests/tests/webkit/AndroidManifest.xml b/tests/tests/webkit/AndroidManifest.xml
index 776f695..a5bc2bb 100644
--- a/tests/tests/webkit/AndroidManifest.xml
+++ b/tests/tests/webkit/AndroidManifest.xml
@@ -21,15 +21,45 @@
     <uses-permission android:name="android.permission.DISABLE_KEYGUARD" />
     <uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS"/>
     <uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION"/>
-    <application>
+    <uses-permission android:name="android.permission.INTERNET" />
+    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
+    <application android:maxRecents="1">
         <provider android:name="android.webkit.cts.MockContentProvider"
                   android:exported="true"
                   android:authorities="android.webkit.cts.MockContentProvider" />
         <uses-library android:name="android.test.runner" />
+
+        <activity android:name="android.webkit.cts.CookieSyncManagerCtsActivity"
+            android:label="CookieSyncManagerCtsActivity"
+            android:screenOrientation="nosensor">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="android.intent.category.FRAMEWORK_INSTRUMENTATION_TEST" />
+            </intent-filter>
+        </activity>
+
+        <activity android:name="android.webkit.cts.WebViewCtsActivity"
+            android:label="WebViewCtsActivity"
+            android:screenOrientation="nosensor">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="android.intent.category.FRAMEWORK_INSTRUMENTATION_TEST" />
+            </intent-filter>
+        </activity>
+
+        <activity android:name="android.webkit.cts.WebViewStartupCtsActivity"
+            android:label="WebViewStartupCtsActivity"
+            android:screenOrientation="nosensor">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="android.intent.category.FRAMEWORK_INSTRUMENTATION_TEST" />
+            </intent-filter>
+        </activity>
+
     </application>
 
     <instrumentation android:name="android.support.test.runner.AndroidJUnitRunner"
-                     android:targetPackage="com.android.cts.stub"
+                     android:targetPackage="com.android.cts.webkit"
                      android:label="CTS tests of android.webkit">
         <meta-data android:name="listener"
             android:value="com.android.cts.runner.CtsTestRunListener" />
diff --git a/tests/assets/images/robot.png b/tests/tests/webkit/assets/images/robot.png
similarity index 100%
rename from tests/assets/images/robot.png
rename to tests/tests/webkit/assets/images/robot.png
Binary files differ
diff --git a/tests/tests/webkit/assets/images/tomato.png b/tests/tests/webkit/assets/images/tomato.png
new file mode 100644
index 0000000..44c590d
--- /dev/null
+++ b/tests/tests/webkit/assets/images/tomato.png
Binary files differ
diff --git a/tests/assets/webkit/blank_tag.html b/tests/tests/webkit/assets/webkit/blank_tag.html
similarity index 100%
rename from tests/assets/webkit/blank_tag.html
rename to tests/tests/webkit/assets/webkit/blank_tag.html
diff --git a/tests/assets/webkit/embedded_image.html b/tests/tests/webkit/assets/webkit/embedded_image.html
similarity index 100%
rename from tests/assets/webkit/embedded_image.html
rename to tests/tests/webkit/assets/webkit/embedded_image.html
diff --git a/tests/assets/webkit/favicon.png b/tests/tests/webkit/assets/webkit/favicon.png
similarity index 100%
rename from tests/assets/webkit/favicon.png
rename to tests/tests/webkit/assets/webkit/favicon.png
Binary files differ
diff --git a/tests/assets/webkit/fonts.html b/tests/tests/webkit/assets/webkit/fonts.html
similarity index 100%
rename from tests/assets/webkit/fonts.html
rename to tests/tests/webkit/assets/webkit/fonts.html
diff --git a/tests/assets/webkit/iframe_blank_tag.html b/tests/tests/webkit/assets/webkit/iframe_blank_tag.html
similarity index 100%
rename from tests/assets/webkit/iframe_blank_tag.html
rename to tests/tests/webkit/assets/webkit/iframe_blank_tag.html
diff --git a/tests/assets/webkit/javascript.html b/tests/tests/webkit/assets/webkit/javascript.html
similarity index 100%
rename from tests/assets/webkit/javascript.html
rename to tests/tests/webkit/assets/webkit/javascript.html
diff --git a/tests/assets/webkit/jsalert.html b/tests/tests/webkit/assets/webkit/jsalert.html
similarity index 100%
rename from tests/assets/webkit/jsalert.html
rename to tests/tests/webkit/assets/webkit/jsalert.html
diff --git a/tests/assets/webkit/jsconfirm.html b/tests/tests/webkit/assets/webkit/jsconfirm.html
similarity index 100%
rename from tests/assets/webkit/jsconfirm.html
rename to tests/tests/webkit/assets/webkit/jsconfirm.html
diff --git a/tests/assets/webkit/jsform.html b/tests/tests/webkit/assets/webkit/jsform.html
similarity index 100%
rename from tests/assets/webkit/jsform.html
rename to tests/tests/webkit/assets/webkit/jsform.html
diff --git a/tests/assets/webkit/jsprompt.html b/tests/tests/webkit/assets/webkit/jsprompt.html
similarity index 100%
rename from tests/assets/webkit/jsprompt.html
rename to tests/tests/webkit/assets/webkit/jsprompt.html
diff --git a/tests/assets/webkit/jsunload.html b/tests/tests/webkit/assets/webkit/jsunload.html
similarity index 100%
rename from tests/assets/webkit/jsunload.html
rename to tests/tests/webkit/assets/webkit/jsunload.html
diff --git a/tests/assets/webkit/jswindow.html b/tests/tests/webkit/assets/webkit/jswindow.html
similarity index 100%
rename from tests/assets/webkit/jswindow.html
rename to tests/tests/webkit/assets/webkit/jswindow.html
diff --git a/tests/assets/webkit/network_state.html b/tests/tests/webkit/assets/webkit/network_state.html
similarity index 100%
rename from tests/assets/webkit/network_state.html
rename to tests/tests/webkit/assets/webkit/network_state.html
diff --git a/tests/assets/webkit/page_with_link.html b/tests/tests/webkit/assets/webkit/page_with_link.html
similarity index 100%
rename from tests/assets/webkit/page_with_link.html
rename to tests/tests/webkit/assets/webkit/page_with_link.html
diff --git a/tests/assets/webkit/popup.html b/tests/tests/webkit/assets/webkit/popup.html
similarity index 100%
rename from tests/assets/webkit/popup.html
rename to tests/tests/webkit/assets/webkit/popup.html
diff --git a/tests/assets/webkit/popup_base.html b/tests/tests/webkit/assets/webkit/popup_base.html
similarity index 100%
rename from tests/assets/webkit/popup_base.html
rename to tests/tests/webkit/assets/webkit/popup_base.html
diff --git a/tests/assets/webkit/test_anchor.html b/tests/tests/webkit/assets/webkit/test_anchor.html
similarity index 100%
rename from tests/assets/webkit/test_anchor.html
rename to tests/tests/webkit/assets/webkit/test_anchor.html
diff --git a/tests/assets/webkit/test_blankPage.html b/tests/tests/webkit/assets/webkit/test_blankPage.html
similarity index 100%
rename from tests/assets/webkit/test_blankPage.html
rename to tests/tests/webkit/assets/webkit/test_blankPage.html
diff --git a/tests/assets/webkit/test_br_tag.html b/tests/tests/webkit/assets/webkit/test_br_tag.html
similarity index 100%
rename from tests/assets/webkit/test_br_tag.html
rename to tests/tests/webkit/assets/webkit/test_br_tag.html
diff --git a/tests/assets/webkit/test_databaseaccess.html b/tests/tests/webkit/assets/webkit/test_databaseaccess.html
similarity index 100%
rename from tests/assets/webkit/test_databaseaccess.html
rename to tests/tests/webkit/assets/webkit/test_databaseaccess.html
diff --git a/tests/assets/webkit/test_favicon.html b/tests/tests/webkit/assets/webkit/test_favicon.html
similarity index 100%
rename from tests/assets/webkit/test_favicon.html
rename to tests/tests/webkit/assets/webkit/test_favicon.html
diff --git a/tests/assets/webkit/test_firstPage.html b/tests/tests/webkit/assets/webkit/test_firstPage.html
similarity index 100%
rename from tests/assets/webkit/test_firstPage.html
rename to tests/tests/webkit/assets/webkit/test_firstPage.html
diff --git a/tests/assets/webkit/test_hello_world.html b/tests/tests/webkit/assets/webkit/test_hello_world.html
similarity index 100%
rename from tests/assets/webkit/test_hello_world.html
rename to tests/tests/webkit/assets/webkit/test_hello_world.html
diff --git a/tests/assets/webkit/test_iframeaccess.html b/tests/tests/webkit/assets/webkit/test_iframeaccess.html
similarity index 100%
rename from tests/assets/webkit/test_iframeaccess.html
rename to tests/tests/webkit/assets/webkit/test_iframeaccess.html
diff --git a/tests/assets/webkit/test_imageaccess.html b/tests/tests/webkit/assets/webkit/test_imageaccess.html
similarity index 100%
rename from tests/assets/webkit/test_imageaccess.html
rename to tests/tests/webkit/assets/webkit/test_imageaccess.html
diff --git a/tests/assets/webkit/test_jsInterface.html b/tests/tests/webkit/assets/webkit/test_jsInterface.html
similarity index 100%
rename from tests/assets/webkit/test_jsInterface.html
rename to tests/tests/webkit/assets/webkit/test_jsInterface.html
diff --git a/tests/assets/webkit/test_queryparam.html b/tests/tests/webkit/assets/webkit/test_queryparam.html
similarity index 100%
rename from tests/assets/webkit/test_queryparam.html
rename to tests/tests/webkit/assets/webkit/test_queryparam.html
diff --git a/tests/assets/webkit/test_secondPage.html b/tests/tests/webkit/assets/webkit/test_secondPage.html
similarity index 100%
rename from tests/assets/webkit/test_secondPage.html
rename to tests/tests/webkit/assets/webkit/test_secondPage.html
diff --git a/tests/assets/webkit/test_stop_loading.html b/tests/tests/webkit/assets/webkit/test_stop_loading.html
similarity index 100%
rename from tests/assets/webkit/test_stop_loading.html
rename to tests/tests/webkit/assets/webkit/test_stop_loading.html
diff --git a/tests/assets/webkit/test_thirdPage.html b/tests/tests/webkit/assets/webkit/test_thirdPage.html
similarity index 100%
rename from tests/assets/webkit/test_thirdPage.html
rename to tests/tests/webkit/assets/webkit/test_thirdPage.html
diff --git a/tests/assets/webkit/test_timer.html b/tests/tests/webkit/assets/webkit/test_timer.html
similarity index 100%
rename from tests/assets/webkit/test_timer.html
rename to tests/tests/webkit/assets/webkit/test_timer.html
diff --git a/tests/tests/webkit/res/layout/webview_layout.xml b/tests/tests/webkit/res/layout/webview_layout.xml
new file mode 100644
index 0000000..7a0ed0d
--- /dev/null
+++ b/tests/tests/webkit/res/layout/webview_layout.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ * Copyright (C) 2009 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ -->
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:orientation="vertical"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content">
+
+    <WebView android:id="@+id/web_page"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content" />
+</LinearLayout>
diff --git a/tests/tests/webkit/src/android/webkit/cts/CookieManagerTest.java b/tests/tests/webkit/src/android/webkit/cts/CookieManagerTest.java
index 6de18ed..9db7c21 100644
--- a/tests/tests/webkit/src/android/webkit/cts/CookieManagerTest.java
+++ b/tests/tests/webkit/src/android/webkit/cts/CookieManagerTest.java
@@ -32,7 +32,7 @@
 import java.util.regex.Pattern;
 
 public class CookieManagerTest extends
-        ActivityInstrumentationTestCase2<CookieSyncManagerStubActivity> {
+        ActivityInstrumentationTestCase2<CookieSyncManagerCtsActivity> {
 
     private static final int TEST_TIMEOUT = 5000;
 
@@ -41,7 +41,7 @@
     private WebViewOnUiThread mOnUiThread;
 
     public CookieManagerTest() {
-        super("com.android.cts.stub", CookieSyncManagerStubActivity.class);
+        super("com.android.cts.webkit", CookieSyncManagerCtsActivity.class);
     }
 
     @Override
diff --git a/tests/tests/webkit/src/android/webkit/cts/CookieSyncManagerCtsActivity.java b/tests/tests/webkit/src/android/webkit/cts/CookieSyncManagerCtsActivity.java
new file mode 100644
index 0000000..51eeed3
--- /dev/null
+++ b/tests/tests/webkit/src/android/webkit/cts/CookieSyncManagerCtsActivity.java
@@ -0,0 +1,64 @@
+/*
+ * Copyright (C) 2009 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.webkit.cts;
+
+import android.app.Activity;
+import android.os.Bundle;
+import android.webkit.CookieSyncManager;
+import android.webkit.WebView;
+
+public class CookieSyncManagerCtsActivity extends Activity {
+    private WebView mWebView;
+
+    @Override
+    public void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+
+        try {
+            CookieSyncManager.createInstance(this);
+
+            mWebView = new WebView(this);
+            setContentView(mWebView);
+        } catch (Exception e) {
+            NullWebViewUtils.determineIfWebViewAvailable(this, e);
+        }
+    }
+
+    @Override
+    protected void onResume() {
+        super.onResume();
+        try {
+            CookieSyncManager.getInstance().startSync();
+        } catch (Exception e) {
+            // May throw on a device with no webview, OK to ignore at this point.
+        }
+    }
+
+    @Override
+    protected void onStop() {
+        super.onStop();
+        try {
+            CookieSyncManager.getInstance().stopSync();
+        } catch (Exception e) {
+            // May throw on a device with no webview, OK to ignore at this point.
+        }
+    }
+
+    public WebView getWebView(){
+        return mWebView;
+    }
+}
diff --git a/tests/tests/webkit/src/android/webkit/cts/CookieTest.java b/tests/tests/webkit/src/android/webkit/cts/CookieTest.java
index 7f3b183..bc5e3b0 100644
--- a/tests/tests/webkit/src/android/webkit/cts/CookieTest.java
+++ b/tests/tests/webkit/src/android/webkit/cts/CookieTest.java
@@ -23,13 +23,13 @@
 /**
  * Original framework tests for CookieManager
  */
-public class CookieTest extends ActivityInstrumentationTestCase2<CookieSyncManagerStubActivity> {
+public class CookieTest extends ActivityInstrumentationTestCase2<CookieSyncManagerCtsActivity> {
 
     private CookieManager mCookieManager;
     private static final long WAIT_TIME = 50;
 
     public CookieTest() {
-        super("com.android.cts.stub", CookieSyncManagerStubActivity.class);
+        super("com.android.cts.webkit", CookieSyncManagerCtsActivity.class);
     }
 
     @Override
diff --git a/tests/tests/webkit/src/android/webkit/cts/GeolocationTest.java b/tests/tests/webkit/src/android/webkit/cts/GeolocationTest.java
index 8ab9eb6..754af37 100644
--- a/tests/tests/webkit/src/android/webkit/cts/GeolocationTest.java
+++ b/tests/tests/webkit/src/android/webkit/cts/GeolocationTest.java
@@ -52,7 +52,7 @@
 
 import junit.framework.Assert;
 
-public class GeolocationTest extends ActivityInstrumentationTestCase2<WebViewStubActivity> {
+public class GeolocationTest extends ActivityInstrumentationTestCase2<WebViewCtsActivity> {
 
     // TODO Write additional tests to cover:
     // - test that the errors are correct
@@ -108,7 +108,7 @@
     private List<String> mProviders;
 
     public GeolocationTest() throws Exception {
-        super("com.android.cts.stub", WebViewStubActivity.class);
+        super("com.android.cts.webkit", WebViewCtsActivity.class);
     }
 
     // Both this test and WebViewOnUiThread need to override some of the methods on WebViewClient,
diff --git a/tests/tests/webkit/src/android/webkit/cts/HttpAuthHandlerTest.java b/tests/tests/webkit/src/android/webkit/cts/HttpAuthHandlerTest.java
index b078c7a..fbda04b 100644
--- a/tests/tests/webkit/src/android/webkit/cts/HttpAuthHandlerTest.java
+++ b/tests/tests/webkit/src/android/webkit/cts/HttpAuthHandlerTest.java
@@ -24,7 +24,7 @@
 
 import org.apache.http.HttpStatus;
 
-public class HttpAuthHandlerTest extends ActivityInstrumentationTestCase2<WebViewStubActivity> {
+public class HttpAuthHandlerTest extends ActivityInstrumentationTestCase2<WebViewCtsActivity> {
 
     private static final long TIMEOUT = 10000;
 
@@ -37,7 +37,7 @@
     private WebViewOnUiThread mOnUiThread;
 
     public HttpAuthHandlerTest() {
-        super("com.android.cts.stub", WebViewStubActivity.class);
+        super("com.android.cts.webkit", WebViewCtsActivity.class);
     }
 
     @Override
diff --git a/tests/tests/webkit/src/android/webkit/cts/NullWebViewUtils.java b/tests/tests/webkit/src/android/webkit/cts/NullWebViewUtils.java
new file mode 100644
index 0000000..c52219f
--- /dev/null
+++ b/tests/tests/webkit/src/android/webkit/cts/NullWebViewUtils.java
@@ -0,0 +1,88 @@
+/*
+ * Copyright (C) 2010 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.webkit.cts;
+
+import android.content.Context;
+import android.content.pm.PackageManager;
+
+/**
+ * Utilities to enable the android.webkit.* CTS tests (and others that rely on a functioning
+ * android.webkit.WebView implementation) to determine whether a functioning WebView is present
+ * on the device or not.
+ *
+ * Test cases that require android.webkit.* classes should wrap their first usage of WebView in a
+ * try catch block, and pass any exception that is thrown to
+ * NullWebViewUtils.determineIfWebViewAvailable. The return value of
+ * NullWebViewUtils.isWebViewAvailable will then determine if the test should expect to be able to
+ * use a WebView.
+ */
+public class NullWebViewUtils {
+
+    private static boolean sWebViewUnavailable;
+
+    /**
+     * @param context Current Activity context, used to query the PackageManager.
+     * @param t       An exception thrown by trying to invoke android.webkit.* APIs.
+     */
+    public static void determineIfWebViewAvailable(Context context, Throwable t) {
+        sWebViewUnavailable = !hasWebViewFeature(context) && checkCauseWasUnsupportedOperation(t);
+    }
+
+    /**
+     * After calling determineIfWebViewAvailable, this returns whether a WebView is available on the
+     * device and wheter the test can rely on it.
+     * @return True iff. PackageManager determined that there is no WebView on the device and the
+     *         exception thrown from android.webkit.* was UnsupportedOperationException.
+     */
+    public static boolean isWebViewAvailable() {
+        return !sWebViewUnavailable;
+    }
+
+    private static boolean hasWebViewFeature(Context context) {
+        // Query the system property that determins if there is a functional WebView on the device.
+        PackageManager pm = context.getPackageManager();
+        return pm.hasSystemFeature(PackageManager.FEATURE_WEBVIEW);
+    }
+
+    private static boolean checkCauseWasUnsupportedOperation(Throwable t) {
+        if (t == null) return false;
+        while (t.getCause() != null) {
+            t = t.getCause();
+        }
+        return t instanceof UnsupportedOperationException;
+    }
+
+    /**
+     * Some CTS tests (by design) first use android.webkit.* from a background thread. This helper
+     * allows the test to catch the UnsupportedOperationException from that background thread, and
+     * then query the result from the test main thread.
+     */
+    public static class NullWebViewFromThreadExceptionHandler
+            implements Thread.UncaughtExceptionHandler {
+        private Throwable mPendingException;
+
+        @Override
+        public void uncaughtException(Thread t, Throwable e) {
+            mPendingException = e;
+        }
+
+        public boolean isWebViewAvailable(Context context) {
+            return hasWebViewFeature(context) ||
+                    !checkCauseWasUnsupportedOperation(mPendingException);
+        }
+    }
+}
\ No newline at end of file
diff --git a/tests/tests/webkit/src/android/webkit/cts/WebBackForwardListTest.java b/tests/tests/webkit/src/android/webkit/cts/WebBackForwardListTest.java
index 71893f4..21a5b98 100644
--- a/tests/tests/webkit/src/android/webkit/cts/WebBackForwardListTest.java
+++ b/tests/tests/webkit/src/android/webkit/cts/WebBackForwardListTest.java
@@ -23,14 +23,14 @@
 import android.webkit.WebView;
 
 
-public class WebBackForwardListTest extends ActivityInstrumentationTestCase2<WebViewStubActivity> {
+public class WebBackForwardListTest extends ActivityInstrumentationTestCase2<WebViewCtsActivity> {
 
     private static final int TEST_TIMEOUT = 10000;
 
     private WebViewOnUiThread mOnUiThread;
 
     public WebBackForwardListTest() {
-        super("com.android.cts.stub", WebViewStubActivity.class);
+        super("com.android.cts.webkit", WebViewCtsActivity.class);
     }
 
     @Override
diff --git a/tests/tests/webkit/src/android/webkit/cts/WebChromeClientTest.java b/tests/tests/webkit/src/android/webkit/cts/WebChromeClientTest.java
index fca14e2..6a94a99 100644
--- a/tests/tests/webkit/src/android/webkit/cts/WebChromeClientTest.java
+++ b/tests/tests/webkit/src/android/webkit/cts/WebChromeClientTest.java
@@ -28,7 +28,7 @@
 import android.webkit.WebView;
 import android.webkit.cts.WebViewOnUiThread.WaitForProgressClient;
 
-public class WebChromeClientTest extends ActivityInstrumentationTestCase2<WebViewStubActivity> {
+public class WebChromeClientTest extends ActivityInstrumentationTestCase2<WebViewCtsActivity> {
     private static final long TEST_TIMEOUT = 5000L;
 
     private CtsTestServer mWebServer;
@@ -38,7 +38,7 @@
     private boolean mBlockWindowCreationAsync;
 
     public WebChromeClientTest() {
-        super(WebViewStubActivity.class);
+        super(WebViewCtsActivity.class);
     }
 
     @Override
diff --git a/tests/tests/webkit/src/android/webkit/cts/WebHistoryItemTest.java b/tests/tests/webkit/src/android/webkit/cts/WebHistoryItemTest.java
index 7d276e9..d4f326b 100644
--- a/tests/tests/webkit/src/android/webkit/cts/WebHistoryItemTest.java
+++ b/tests/tests/webkit/src/android/webkit/cts/WebHistoryItemTest.java
@@ -25,7 +25,7 @@
 import android.webkit.WebIconDatabase;
 import android.webkit.WebView;
 
-public class WebHistoryItemTest extends ActivityInstrumentationTestCase2<WebViewStubActivity> {
+public class WebHistoryItemTest extends ActivityInstrumentationTestCase2<WebViewCtsActivity> {
     private final static long TEST_TIMEOUT = 10000;
     private CtsTestServer mWebServer;
     private WebViewOnUiThread mOnUiThread;
@@ -47,7 +47,7 @@
     };
 
     public WebHistoryItemTest() {
-        super("com.android.cts.stub", WebViewStubActivity.class);
+        super("com.android.cts.webkit", WebViewCtsActivity.class);
     }
 
     @Override
diff --git a/tests/tests/webkit/src/android/webkit/cts/WebSettingsTest.java b/tests/tests/webkit/src/android/webkit/cts/WebSettingsTest.java
index 1515a8a..3e7a592 100644
--- a/tests/tests/webkit/src/android/webkit/cts/WebSettingsTest.java
+++ b/tests/tests/webkit/src/android/webkit/cts/WebSettingsTest.java
@@ -40,7 +40,7 @@
 /**
  * Tests for {@link android.webkit.WebSettings}
  */
-public class WebSettingsTest extends ActivityInstrumentationTestCase2<WebViewStubActivity> {
+public class WebSettingsTest extends ActivityInstrumentationTestCase2<WebViewCtsActivity> {
 
     private static final int WEBVIEW_TIMEOUT = 5000;
     private static final String LOG_TAG = "WebSettingsTest";
@@ -63,7 +63,7 @@
     private Context mContext;
 
     public WebSettingsTest() {
-        super("com.android.cts.stub", WebViewStubActivity.class);
+        super("com.android.cts.webkit", WebViewCtsActivity.class);
     }
 
     @Override
diff --git a/tests/tests/webkit/src/android/webkit/cts/WebViewClientTest.java b/tests/tests/webkit/src/android/webkit/cts/WebViewClientTest.java
index 5907d2f..05f6f00 100644
--- a/tests/tests/webkit/src/android/webkit/cts/WebViewClientTest.java
+++ b/tests/tests/webkit/src/android/webkit/cts/WebViewClientTest.java
@@ -26,13 +26,19 @@
 import android.webkit.HttpAuthHandler;
 import android.webkit.ValueCallback;
 import android.webkit.WebChromeClient;
+import android.webkit.WebResourceRequest;
+import android.webkit.WebResourceResponse;
 import android.webkit.WebSettings;
 import android.webkit.WebView;
 import android.webkit.WebViewClient;
 import android.webkit.cts.WebViewOnUiThread.WaitForLoadedClient;
 
+import java.io.ByteArrayInputStream;
+import java.nio.charset.StandardCharsets;
+import java.util.HashMap;
+import java.util.Map;
 
-public class WebViewClientTest extends ActivityInstrumentationTestCase2<WebViewStubActivity> {
+public class WebViewClientTest extends ActivityInstrumentationTestCase2<WebViewCtsActivity> {
     private static final long TEST_TIMEOUT = 5000;
     private static final String TEST_URL = "http://foo.com/";
 
@@ -40,13 +46,13 @@
     private CtsTestServer mWebServer;
 
     public WebViewClientTest() {
-        super("com.android.cts.stub", WebViewStubActivity.class);
+        super("com.android.cts.webkit", WebViewCtsActivity.class);
     }
 
     @Override
     protected void setUp() throws Exception {
         super.setUp();
-        final WebViewStubActivity activity = getActivity();
+        final WebViewCtsActivity activity = getActivity();
         WebView webview = activity.getWebView();
         if (webview != null) {
             new PollingCheck(TEST_TIMEOUT) {
@@ -339,6 +345,152 @@
         }.run();
     }
 
+    // Test that shouldInterceptRequest is called with the correct parameters
+    public void testShouldInterceptRequestParams() throws Throwable {
+        if (!NullWebViewUtils.isWebViewAvailable()) {
+            return;
+        }
+
+        final String mainPath = "/main";
+        final String mainPage = "<head></head><body>test page</body>";
+        final String headerName = "x-test-header-name";
+        final String headerValue = "testheadervalue";
+        HashMap<String, String> headers = new HashMap<String, String>(1);
+        headers.put(headerName, headerValue);
+
+        // A client which saves the WebResourceRequest as interceptRequest
+        final class TestClient extends WaitForLoadedClient {
+            public TestClient() {
+                super(mOnUiThread);
+            }
+
+            @Override
+            public WebResourceResponse shouldInterceptRequest(WebView view,
+                    WebResourceRequest request) {
+                assertNotNull(view);
+                assertNotNull(request);
+
+                assertEquals(view, mOnUiThread.getWebView());
+
+                // Save the main page request; discard any other requests (e.g. for favicon.ico)
+                if (request.getUrl().toString().contains(mainPath)) {
+                    assertNull(interceptRequest);
+                    interceptRequest = request;
+                }
+
+                return null;
+            }
+
+            public volatile WebResourceRequest interceptRequest;
+        }
+
+        TestClient client = new TestClient();
+        mOnUiThread.setWebViewClient(client);
+
+        TestWebServer server = new TestWebServer(false);
+        try {
+            String mainUrl = server.setResponse(mainPath, mainPage, null);
+
+            mOnUiThread.loadUrlAndWaitForCompletion(mainUrl, headers);
+
+            // Inspect the fields of the saved WebResourceRequest
+            assertNotNull(client.interceptRequest);
+            assertEquals(mainUrl, client.interceptRequest.getUrl().toString());
+            assertTrue(client.interceptRequest.isForMainFrame());
+            assertEquals(server.getLastRequest(mainPath).getRequestLine().getMethod(),
+                client.interceptRequest.getMethod());
+
+            // Web request headers are case-insensitive. We provided lower-case headerName and
+            // headerValue. This will pass implementations which either do not mangle case,
+            // convert to lowercase, or convert to uppercase but return a case-insensitive map.
+            Map<String, String> interceptHeaders = client.interceptRequest.getRequestHeaders();
+            assertTrue(interceptHeaders.containsKey(headerName));
+            assertEquals(headerValue, interceptHeaders.get(headerName));
+        } finally {
+            server.shutdown();
+        }
+    }
+
+    // Test that the WebResourceResponse returned by shouldInterceptRequest is handled correctly
+    public void testShouldInterceptRequestResponse() throws Throwable {
+        if (!NullWebViewUtils.isWebViewAvailable()) {
+            return;
+        }
+
+        final String mainPath = "/main";
+        final String mainPage = "<head></head><body>test page</body>";
+        final String interceptPath = "/intercept_me";
+
+        // A client which responds to requests for interceptPath with a saved interceptResponse
+        final class TestClient extends WaitForLoadedClient {
+            public TestClient() {
+                super(mOnUiThread);
+            }
+
+            @Override
+            public WebResourceResponse shouldInterceptRequest(WebView view,
+                    WebResourceRequest request) {
+                if (request.getUrl().toString().contains(interceptPath)) {
+                    assertNotNull(interceptResponse);
+                    return interceptResponse;
+                }
+
+                return null;
+            }
+
+            volatile public WebResourceResponse interceptResponse;
+        }
+
+        mOnUiThread.getSettings().setJavaScriptEnabled(true);
+
+        TestClient client = new TestClient();
+        mOnUiThread.setWebViewClient(client);
+
+        TestWebServer server = new TestWebServer(false);
+        try {
+            String interceptUrl = server.getResponseUrl(interceptPath);
+
+            // JavaScript which makes a synchronous AJAX request and logs and returns the status
+            String js =
+                "(function() {" +
+                "  var xhr = new XMLHttpRequest();" +
+                "  xhr.open('GET', '" + interceptUrl + "', false);" +
+                "  xhr.send(null);" +
+                "  console.info('xhr.status = ' + xhr.status);" +
+                "  console.info('xhr.statusText = ' + xhr.statusText);" +
+                "  return '[' + xhr.status + '][' + xhr.statusText + ']';" +
+                "})();";
+
+            String mainUrl = server.setResponse(mainPath, mainPage, null);
+            mOnUiThread.loadUrlAndWaitForCompletion(mainUrl, null);
+
+            EvaluateJsResultPollingCheck jsResult;
+
+            // Test a nonexistent page
+            client.interceptResponse = new WebResourceResponse("text/html", "UTF-8", null);
+            jsResult = new EvaluateJsResultPollingCheck("\"[404][Not Found]\"");
+            mOnUiThread.evaluateJavascript(js, jsResult);
+            jsResult.run();
+
+            // Test an empty page
+            client.interceptResponse = new WebResourceResponse("text/html", "UTF-8",
+                new ByteArrayInputStream(new byte[0]));
+            jsResult = new EvaluateJsResultPollingCheck("\"[200][OK]\"");
+            mOnUiThread.evaluateJavascript(js, jsResult);
+            jsResult.run();
+
+            // Test a nonempty page with unusual response code/text
+            client.interceptResponse =
+                new WebResourceResponse("text/html", "UTF-8", 123, "unusual", null,
+                    new ByteArrayInputStream("nonempty page".getBytes(StandardCharsets.UTF_8)));
+            jsResult = new EvaluateJsResultPollingCheck("\"[123][unusual]\"");
+            mOnUiThread.evaluateJavascript(js, jsResult);
+            jsResult.run();
+        } finally {
+            server.shutdown();
+        }
+    }
+
     private void requireLoadedPage() throws Throwable {
         if (!NullWebViewUtils.isWebViewAvailable()) {
             return;
diff --git a/tests/tests/webkit/src/android/webkit/cts/WebViewCtsActivity.java b/tests/tests/webkit/src/android/webkit/cts/WebViewCtsActivity.java
new file mode 100644
index 0000000..d809a42
--- /dev/null
+++ b/tests/tests/webkit/src/android/webkit/cts/WebViewCtsActivity.java
@@ -0,0 +1,56 @@
+/*
+ * Copyright (C) 2009 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.webkit.cts;
+
+import com.android.cts.webkit.R;
+
+import android.app.Activity;
+import android.os.Bundle;
+import android.view.ViewGroup;
+import android.view.ViewParent;
+import android.webkit.WebView;
+
+public class WebViewCtsActivity extends Activity {
+    private WebView mWebView;
+
+    @Override
+    public void onCreate(Bundle savedInstanceState) {
+        try {
+            super.onCreate(savedInstanceState);
+            setContentView(R.layout.webview_layout);
+            mWebView = (WebView) findViewById(R.id.web_page);
+        } catch (Exception e) {
+            NullWebViewUtils.determineIfWebViewAvailable(this, e);
+        }
+    }
+
+    public WebView getWebView() {
+        return mWebView;
+    }
+
+    @Override
+    public void onDestroy() {
+        if (mWebView != null) {
+            ViewParent parent =  mWebView.getParent();
+            if (parent instanceof ViewGroup) {
+                ((ViewGroup) parent).removeView(mWebView);
+            }
+            mWebView.destroy();
+        }
+        super.onDestroy();
+    }
+}
diff --git a/tests/tests/webkit/src/android/webkit/cts/WebViewOnUiThread.java b/tests/tests/webkit/src/android/webkit/cts/WebViewOnUiThread.java
new file mode 100644
index 0000000..9b2d803
--- /dev/null
+++ b/tests/tests/webkit/src/android/webkit/cts/WebViewOnUiThread.java
@@ -0,0 +1,1008 @@
+/*
+ * Copyright (C) 2011 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.webkit.cts;
+
+import android.cts.util.PollingCheck;
+import android.graphics.Bitmap;
+import android.graphics.Picture;
+import android.graphics.Rect;
+import android.os.Bundle;
+import android.os.Looper;
+import android.os.Message;
+import android.os.SystemClock;
+import android.print.PrintDocumentAdapter;
+import android.test.InstrumentationTestCase;
+import android.util.DisplayMetrics;
+import android.view.View;
+import android.view.ViewGroup;
+import android.view.ViewParent;
+import android.webkit.DownloadListener;
+import android.webkit.CookieManager;
+import android.webkit.ValueCallback;
+import android.webkit.WebBackForwardList;
+import android.webkit.WebChromeClient;
+import android.webkit.WebSettings;
+import android.webkit.WebView.HitTestResult;
+import android.webkit.WebView.PictureListener;
+import android.webkit.WebView;
+import android.webkit.WebViewClient;
+
+import junit.framework.Assert;
+
+import java.io.File;
+import java.util.concurrent.Callable;
+import java.util.Map;
+
+/**
+ * Many tests need to run WebView code in the UI thread. This class
+ * wraps a WebView so that calls are ensured to arrive on the UI thread.
+ *
+ * All methods may be run on either the UI thread or test thread.
+ */
+public class WebViewOnUiThread {
+    /**
+     * The maximum time, in milliseconds (10 seconds) to wait for a load
+     * to be triggered.
+     */
+    private static final long LOAD_TIMEOUT = 10000;
+
+    /**
+     * Set to true after onPageFinished is called.
+     */
+    private boolean mLoaded;
+
+    /**
+     * Set to true after onNewPicture is called. Reset when onPageStarted
+     * is called.
+     */
+    private boolean mNewPicture;
+
+    /**
+     * The progress, in percentage, of the page load. Valid values are between
+     * 0 and 100.
+     */
+    private int mProgress;
+
+    /**
+     * The test that this class is being used in. Used for runTestOnUiThread.
+     */
+    private InstrumentationTestCase mTest;
+
+    /**
+     * The WebView that calls will be made on.
+     */
+    private WebView mWebView;
+
+    /**
+     * Initializes the webView with a WebViewClient, WebChromeClient,
+     * and PictureListener to prepare for loadUrlAndWaitForCompletion.
+     *
+     * A new WebViewOnUiThread should be called during setUp so as to
+     * reinitialize between calls.
+     *
+     * @param test The test in which this is being run.
+     * @param webView The webView that the methods should call.
+     * @see loadUrlAndWaitForCompletion
+     */
+    public WebViewOnUiThread(InstrumentationTestCase test, WebView webView) {
+        mTest = test;
+        mWebView = webView;
+        final WebViewClient webViewClient = new WaitForLoadedClient(this);
+        final WebChromeClient webChromeClient = new WaitForProgressClient(this);
+        runOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                mWebView.setWebViewClient(webViewClient);
+                mWebView.setWebChromeClient(webChromeClient);
+                mWebView.setPictureListener(new WaitForNewPicture());
+            }
+        });
+    }
+
+    /**
+     * Called after a test is complete and the WebView should be disengaged from
+     * the tests.
+     */
+    public void cleanUp() {
+        clearHistory();
+        clearCache(true);
+        setPictureListener(null);
+        setWebChromeClient(null);
+        setWebViewClient(null);
+    }
+
+    /**
+     * Called from WaitForNewPicture, this is used to indicate that
+     * the page has been drawn.
+     */
+    synchronized public void onNewPicture() {
+        mNewPicture = true;
+        this.notifyAll();
+    }
+
+    /**
+     * Called from WaitForLoadedClient, this is used to clear the picture
+     * draw state so that draws before the URL begins loading don't count.
+     */
+    synchronized public void onPageStarted() {
+        mNewPicture = false; // Earlier paints won't count.
+    }
+
+    /**
+     * Called from WaitForLoadedClient, this is used to indicate that
+     * the page is loaded, but not drawn yet.
+     */
+    synchronized public void onPageFinished() {
+        mLoaded = true;
+        this.notifyAll();
+    }
+
+    /**
+     * Called from the WebChrome client, this sets the current progress
+     * for a page.
+     * @param progress The progress made so far between 0 and 100.
+     */
+    synchronized public void onProgressChanged(int progress) {
+        mProgress = progress;
+        this.notifyAll();
+    }
+
+    public void setWebViewClient(final WebViewClient webViewClient) {
+        runOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                mWebView.setWebViewClient(webViewClient);
+            }
+        });
+    }
+
+    public void setWebChromeClient(final WebChromeClient webChromeClient) {
+        runOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                mWebView.setWebChromeClient(webChromeClient);
+            }
+        });
+    }
+
+    public void setPictureListener(final PictureListener pictureListener) {
+        runOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                mWebView.setPictureListener(pictureListener);
+            }
+        });
+    }
+
+    public void setNetworkAvailable(final boolean available) {
+        runOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                mWebView.setNetworkAvailable(available);
+            }
+        });
+    }
+
+    public void setDownloadListener(final DownloadListener listener) {
+        runOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                mWebView.setDownloadListener(listener);
+            }
+        });
+    }
+
+    public void setBackgroundColor(final int color) {
+        runOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                mWebView.setBackgroundColor(color);
+            }
+        });
+    }
+
+    public void clearCache(final boolean includeDiskFiles) {
+        runOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                mWebView.clearCache(includeDiskFiles);
+            }
+        });
+    }
+
+    public void clearHistory() {
+        runOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                mWebView.clearHistory();
+            }
+        });
+    }
+
+    public void requestFocus() {
+        runOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                mWebView.requestFocus();
+            }
+        });
+    }
+
+    public boolean canZoomIn() {
+        return getValue(new ValueGetter<Boolean>() {
+            @Override
+            public Boolean capture() {
+                return mWebView.canZoomIn();
+            }
+        });
+    }
+
+    public boolean canZoomOut() {
+        return getValue(new ValueGetter<Boolean>() {
+            @Override
+            public Boolean capture() {
+                return mWebView.canZoomOut();
+            }
+        });
+    }
+
+    public boolean zoomIn() {
+        return getValue(new ValueGetter<Boolean>() {
+            @Override
+            public Boolean capture() {
+                return mWebView.zoomIn();
+            }
+        });
+    }
+
+    public boolean zoomOut() {
+        return getValue(new ValueGetter<Boolean>() {
+            @Override
+            public Boolean capture() {
+                return mWebView.zoomOut();
+            }
+        });
+    }
+
+    public void zoomBy(final float zoomFactor) {
+        runOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                mWebView.zoomBy(zoomFactor);
+            }
+        });
+    }
+
+    public void setFindListener(final WebView.FindListener listener) {
+        runOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                mWebView.setFindListener(listener);
+            }
+        });
+    }
+
+    public void removeJavascriptInterface(final String interfaceName) {
+        runOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                mWebView.removeJavascriptInterface(interfaceName);
+            }
+        });
+    }
+
+    public void addJavascriptInterface(final Object object, final String name) {
+        runOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                mWebView.addJavascriptInterface(object, name);
+            }
+        });
+    }
+
+    public void flingScroll(final int vx, final int vy) {
+        runOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                mWebView.flingScroll(vx, vy);
+            }
+        });
+    }
+
+    public void requestFocusNodeHref(final Message hrefMsg) {
+        runOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                mWebView.requestFocusNodeHref(hrefMsg);
+            }
+        });
+    }
+
+    public void requestImageRef(final Message msg) {
+        runOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                mWebView.requestImageRef(msg);
+            }
+        });
+    }
+
+    public void setInitialScale(final int scaleInPercent) {
+        runOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                mWebView.setInitialScale(scaleInPercent);
+            }
+        });
+    }
+
+    public void clearSslPreferences() {
+        runOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                mWebView.clearSslPreferences();
+            }
+        });
+    }
+
+    public void clearClientCertPreferences(final Runnable onCleared) {
+        runOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                WebView.clearClientCertPreferences(onCleared);
+            }
+        });
+    }
+
+    public void resumeTimers() {
+        runOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                mWebView.resumeTimers();
+            }
+        });
+    }
+
+    public void findNext(final boolean forward) {
+        runOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                mWebView.findNext(forward);
+            }
+        });
+    }
+
+    public void clearMatches() {
+        runOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                mWebView.clearMatches();
+            }
+        });
+    }
+
+    /**
+     * Calls loadUrl on the WebView and then waits onPageFinished,
+     * onNewPicture and onProgressChange to reach 100.
+     * Test fails if the load timeout elapses.
+     * @param url The URL to load.
+     */
+    public void loadUrlAndWaitForCompletion(final String url) {
+        callAndWait(new Runnable() {
+            @Override
+            public void run() {
+                mWebView.loadUrl(url);
+            }
+        });
+    }
+
+    /**
+     * Calls loadUrl on the WebView and then waits onPageFinished,
+     * onNewPicture and onProgressChange to reach 100.
+     * Test fails if the load timeout elapses.
+     * @param url The URL to load.
+     * @param extraHeaders The additional headers to be used in the HTTP request.
+     */
+    public void loadUrlAndWaitForCompletion(final String url,
+            final Map<String, String> extraHeaders) {
+        callAndWait(new Runnable() {
+            @Override
+            public void run() {
+                mWebView.loadUrl(url, extraHeaders);
+            }
+        });
+    }
+
+    public void loadUrl(final String url) {
+        runOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                mWebView.loadUrl(url);
+            }
+        });
+    }
+
+    public void stopLoading() {
+        runOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                mWebView.stopLoading();
+            }
+        });
+    }
+
+    public void postUrlAndWaitForCompletion(final String url, final byte[] postData) {
+        callAndWait(new Runnable() {
+            @Override
+            public void run() {
+                mWebView.postUrl(url, postData);
+            }
+        });
+    }
+
+    public void loadDataAndWaitForCompletion(final String data,
+            final String mimeType, final String encoding) {
+        callAndWait(new Runnable() {
+            @Override
+            public void run() {
+                mWebView.loadData(data, mimeType, encoding);
+            }
+        });
+    }
+
+    public void loadDataWithBaseURLAndWaitForCompletion(final String baseUrl,
+            final String data, final String mimeType, final String encoding,
+            final String historyUrl) {
+        callAndWait(new Runnable() {
+            @Override
+            public void run() {
+                mWebView.loadDataWithBaseURL(baseUrl, data, mimeType, encoding,
+                        historyUrl);
+            }
+        });
+    }
+
+    /**
+     * Reloads a page and waits for it to complete reloading. Use reload
+     * if it is a form resubmission and the onFormResubmission responds
+     * by telling WebView not to resubmit it.
+     */
+    public void reloadAndWaitForCompletion() {
+        callAndWait(new Runnable() {
+            @Override
+            public void run() {
+                mWebView.reload();
+            }
+        });
+    }
+
+    /**
+     * Reload the previous URL. Use reloadAndWaitForCompletion unless
+     * it is a form resubmission and the onFormResubmission responds
+     * by telling WebView not to resubmit it.
+     */
+    public void reload() {
+        runOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                mWebView.reload();
+            }
+        });
+    }
+
+    /**
+     * Use this only when JavaScript causes a page load to wait for the
+     * page load to complete. Otherwise use loadUrlAndWaitForCompletion or
+     * similar functions.
+     */
+    public void waitForLoadCompletion() {
+        waitForCriteria(LOAD_TIMEOUT,
+                new Callable<Boolean>() {
+                    @Override
+                    public Boolean call() {
+                        return isLoaded();
+                    }
+                });
+        clearLoad();
+    }
+
+    private void waitForCriteria(long timeout, Callable<Boolean> doneCriteria) {
+        if (isUiThread()) {
+            waitOnUiThread(timeout, doneCriteria);
+        } else {
+            waitOnTestThread(timeout, doneCriteria);
+        }
+    }
+
+    public String getTitle() {
+        return getValue(new ValueGetter<String>() {
+            @Override
+            public String capture() {
+                return mWebView.getTitle();
+            }
+        });
+    }
+
+    public WebSettings getSettings() {
+        return getValue(new ValueGetter<WebSettings>() {
+            @Override
+            public WebSettings capture() {
+                return mWebView.getSettings();
+            }
+        });
+    }
+
+    public WebBackForwardList copyBackForwardList() {
+        return getValue(new ValueGetter<WebBackForwardList>() {
+            @Override
+            public WebBackForwardList capture() {
+                return mWebView.copyBackForwardList();
+            }
+        });
+    }
+
+    public Bitmap getFavicon() {
+        return getValue(new ValueGetter<Bitmap>() {
+            @Override
+            public Bitmap capture() {
+                return mWebView.getFavicon();
+            }
+        });
+    }
+
+    public String getUrl() {
+        return getValue(new ValueGetter<String>() {
+            @Override
+            public String capture() {
+                return mWebView.getUrl();
+            }
+        });
+    }
+
+    public int getProgress() {
+        return getValue(new ValueGetter<Integer>() {
+            @Override
+            public Integer capture() {
+                return mWebView.getProgress();
+            }
+        });
+    }
+
+    public int getHeight() {
+        return getValue(new ValueGetter<Integer>() {
+            @Override
+            public Integer capture() {
+                return mWebView.getHeight();
+            }
+        });
+    }
+
+    public int getContentHeight() {
+        return getValue(new ValueGetter<Integer>() {
+            @Override
+            public Integer capture() {
+                return mWebView.getContentHeight();
+            }
+        });
+    }
+
+    public boolean savePicture(final Bundle b, final File dest) {
+        return getValue(new ValueGetter<Boolean>() {
+            @Override
+            public Boolean capture() {
+                return mWebView.savePicture(b, dest);
+            }
+        });
+    }
+
+    public boolean pageUp(final boolean top) {
+        return getValue(new ValueGetter<Boolean>() {
+            @Override
+            public Boolean capture() {
+                return mWebView.pageUp(top);
+            }
+        });
+    }
+
+    public boolean pageDown(final boolean bottom) {
+        return getValue(new ValueGetter<Boolean>() {
+            @Override
+            public Boolean capture() {
+                return mWebView.pageDown(bottom);
+            }
+        });
+    }
+
+    public int[] getLocationOnScreen() {
+        final int[] location = new int[2];
+        return getValue(new ValueGetter<int[]>() {
+            @Override
+            public int[] capture() {
+                mWebView.getLocationOnScreen(location);
+                return location;
+            }
+        });
+    }
+
+    public float getScale() {
+        return getValue(new ValueGetter<Float>() {
+            @Override
+            public Float capture() {
+                return mWebView.getScale();
+            }
+        });
+    }
+
+    public boolean requestFocus(final int direction,
+            final Rect previouslyFocusedRect) {
+        return getValue(new ValueGetter<Boolean>() {
+            @Override
+            public Boolean capture() {
+                return mWebView.requestFocus(direction, previouslyFocusedRect);
+            }
+        });
+    }
+
+    public HitTestResult getHitTestResult() {
+        return getValue(new ValueGetter<HitTestResult>() {
+            @Override
+            public HitTestResult capture() {
+                return mWebView.getHitTestResult();
+            }
+        });
+    }
+
+    public int getScrollX() {
+        return getValue(new ValueGetter<Integer>() {
+            @Override
+            public Integer capture() {
+                return mWebView.getScrollX();
+            }
+        });
+    }
+
+    public int getScrollY() {
+        return getValue(new ValueGetter<Integer>() {
+            @Override
+            public Integer capture() {
+                return mWebView.getScrollY();
+            }
+        });
+    }
+
+    public final DisplayMetrics getDisplayMetrics() {
+        return getValue(new ValueGetter<DisplayMetrics>() {
+            @Override
+            public DisplayMetrics capture() {
+                return mWebView.getContext().getResources().getDisplayMetrics();
+            }
+        });
+    }
+
+    public boolean requestChildRectangleOnScreen(final View child,
+            final Rect rect,
+            final boolean immediate) {
+        return getValue(new ValueGetter<Boolean>() {
+            @Override
+            public Boolean capture() {
+                return mWebView.requestChildRectangleOnScreen(child, rect,
+                        immediate);
+            }
+        });
+    }
+
+    public int findAll(final String find) {
+        return getValue(new ValueGetter<Integer>() {
+            @Override
+            public Integer capture() {
+                return mWebView.findAll(find);
+            }
+        });
+    }
+
+    public Picture capturePicture() {
+        return getValue(new ValueGetter<Picture>() {
+            @Override
+            public Picture capture() {
+                return mWebView.capturePicture();
+            }
+        });
+    }
+
+    public void evaluateJavascript(final String script, final ValueCallback<String> result) {
+        runOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                mWebView.evaluateJavascript(script, result);
+            }
+        });
+    }
+
+    public void saveWebArchive(final String basename, final boolean autoname,
+                               final ValueCallback<String> callback) {
+        runOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                mWebView.saveWebArchive(basename, autoname, callback);
+            }
+        });
+    }
+
+    public WebView createWebView() {
+        return getValue(new ValueGetter<WebView>() {
+            @Override
+            public WebView capture() {
+                return new WebView(mWebView.getContext());
+            }
+        });
+    }
+
+    public PrintDocumentAdapter createPrintDocumentAdapter() {
+        return getValue(new ValueGetter<PrintDocumentAdapter>() {
+            @Override
+            public PrintDocumentAdapter capture() {
+                return mWebView.createPrintDocumentAdapter();
+            }
+        });
+    }
+
+    public void setLayoutHeightToMatchParent() {
+        runOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                ViewParent parent = mWebView.getParent();
+                if (parent instanceof ViewGroup) {
+                    ((ViewGroup) parent).getLayoutParams().height =
+                        ViewGroup.LayoutParams.MATCH_PARENT;
+                }
+                mWebView.getLayoutParams().height = ViewGroup.LayoutParams.MATCH_PARENT;
+                mWebView.requestLayout();
+            }
+        });
+    }
+
+    public void setAcceptThirdPartyCookies(final boolean accept) {
+        runOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                CookieManager.getInstance().setAcceptThirdPartyCookies(mWebView, accept);
+            }
+        });
+    }
+
+    public boolean acceptThirdPartyCookies() {
+        return getValue(new ValueGetter<Boolean>() {
+            @Override
+            public Boolean capture() {
+                return CookieManager.getInstance().acceptThirdPartyCookies(mWebView);
+            }
+        });
+    }
+
+    /**
+     * Helper for running code on the UI thread where an exception is
+     * a test failure. If this is already the UI thread then it runs
+     * the code immediately.
+     *
+     * @see runTestOnUiThread
+     * @param r The code to run in the UI thread
+     */
+    public void runOnUiThread(Runnable r) {
+        try {
+            if (isUiThread()) {
+                r.run();
+            } else {
+                mTest.runTestOnUiThread(r);
+            }
+        } catch (Throwable t) {
+            Assert.fail("Unexpected error while running on UI thread: "
+                    + t.getMessage());
+        }
+    }
+
+    /**
+     * Accessor for underlying WebView.
+     * @return The WebView being wrapped by this class.
+     */
+    public WebView getWebView() {
+        return mWebView;
+    }
+
+    private<T> T getValue(ValueGetter<T> getter) {
+        runOnUiThread(getter);
+        return getter.getValue();
+    }
+
+    private abstract class ValueGetter<T> implements Runnable {
+        private T mValue;
+
+        @Override
+        public void run() {
+            mValue = capture();
+        }
+
+        protected abstract T capture();
+
+        public T getValue() {
+           return mValue;
+        }
+    }
+
+    /**
+     * Returns true if the current thread is the UI thread based on the
+     * Looper.
+     */
+    private static boolean isUiThread() {
+        return (Looper.myLooper() == Looper.getMainLooper());
+    }
+
+    /**
+     * @return Whether or not the load has finished.
+     */
+    private synchronized boolean isLoaded() {
+        return mLoaded && mNewPicture && mProgress == 100;
+    }
+
+    /**
+     * Makes a WebView call, waits for completion and then resets the
+     * load state in preparation for the next load call.
+     * @param call The call to make on the UI thread prior to waiting.
+     */
+    private void callAndWait(Runnable call) {
+        Assert.assertTrue("WebViewOnUiThread.load*AndWaitForCompletion calls "
+                + "may not be mixed with load* calls directly on WebView "
+                + "without calling waitForLoadCompletion after the load",
+                !isLoaded());
+        clearLoad(); // clear any extraneous signals from a previous load.
+        runOnUiThread(call);
+        waitForLoadCompletion();
+    }
+
+    /**
+     * Called whenever a load has been completed so that a subsequent call to
+     * waitForLoadCompletion doesn't return immediately.
+     */
+    synchronized private void clearLoad() {
+        mLoaded = false;
+        mNewPicture = false;
+        mProgress = 0;
+    }
+
+    /**
+     * Uses a polling mechanism, while pumping messages to check when the
+     * criteria is met.
+     */
+    private void waitOnUiThread(long timeout, final Callable<Boolean> doneCriteria) {
+        new PollingCheck(timeout) {
+            @Override
+            protected boolean check() {
+                pumpMessages();
+                try {
+                    return doneCriteria.call();
+                } catch (Exception e) {
+                    Assert.fail("Unexpected error while checking the criteria: "
+                            + e.getMessage());
+                    return true;
+                }
+            }
+        }.run();
+    }
+
+    /**
+     * Uses a wait/notify to check when the criteria is met.
+     */
+    private synchronized void waitOnTestThread(long timeout, Callable<Boolean> doneCriteria) {
+        try {
+            long waitEnd = SystemClock.uptimeMillis() + timeout;
+            long timeRemaining = timeout;
+            while (!doneCriteria.call() && timeRemaining > 0) {
+                this.wait(timeRemaining);
+                timeRemaining = waitEnd - SystemClock.uptimeMillis();
+            }
+            Assert.assertTrue("Action failed to complete before timeout", doneCriteria.call());
+        } catch (InterruptedException e) {
+            // We'll just drop out of the loop and fail
+        } catch (Exception e) {
+            Assert.fail("Unexpected error while checking the criteria: "
+                    + e.getMessage());
+        }
+    }
+
+    /**
+     * Pumps all currently-queued messages in the UI thread and then exits.
+     * This is useful to force processing while running tests in the UI thread.
+     */
+    private void pumpMessages() {
+        class ExitLoopException extends RuntimeException {
+        }
+
+        // Force loop to exit when processing this. Loop.quit() doesn't
+        // work because this is the main Loop.
+        mWebView.getHandler().post(new Runnable() {
+            @Override
+            public void run() {
+                throw new ExitLoopException(); // exit loop!
+            }
+        });
+        try {
+            // Pump messages until our message gets through.
+            Looper.loop();
+        } catch (ExitLoopException e) {
+        }
+    }
+
+    /**
+     * A WebChromeClient used to capture the onProgressChanged for use
+     * in waitFor functions. If a test must override the WebChromeClient,
+     * it can derive from this class or call onProgressChanged
+     * directly.
+     */
+    public static class WaitForProgressClient extends WebChromeClient {
+        private WebViewOnUiThread mOnUiThread;
+
+        public WaitForProgressClient(WebViewOnUiThread onUiThread) {
+            mOnUiThread = onUiThread;
+        }
+
+        @Override
+        public void onProgressChanged(WebView view, int newProgress) {
+            super.onProgressChanged(view, newProgress);
+            mOnUiThread.onProgressChanged(newProgress);
+        }
+    }
+
+    /**
+     * A WebViewClient that captures the onPageFinished for use in
+     * waitFor functions. Using initializeWebView sets the WaitForLoadedClient
+     * into the WebView. If a test needs to set a specific WebViewClient and
+     * needs the waitForCompletion capability then it should derive from
+     * WaitForLoadedClient or call WebViewOnUiThread.onPageFinished.
+     */
+    public static class WaitForLoadedClient extends WebViewClient {
+        private WebViewOnUiThread mOnUiThread;
+
+        public WaitForLoadedClient(WebViewOnUiThread onUiThread) {
+            mOnUiThread = onUiThread;
+        }
+
+        @Override
+        public void onPageFinished(WebView view, String url) {
+            super.onPageFinished(view, url);
+            mOnUiThread.onPageFinished();
+        }
+
+        @Override
+        public void onPageStarted(WebView view, String url, Bitmap favicon) {
+            super.onPageStarted(view, url, favicon);
+            mOnUiThread.onPageStarted();
+        }
+    }
+
+    /**
+     * A PictureListener that captures the onNewPicture for use in
+     * waitForLoadCompletion. Using initializeWebView sets the PictureListener
+     * into the WebView. If a test needs to set a specific PictureListener and
+     * needs the waitForCompletion capability then it should call
+     * WebViewOnUiThread.onNewPicture.
+     */
+    private class WaitForNewPicture implements PictureListener {
+        @Override
+        public void onNewPicture(WebView view, Picture picture) {
+            WebViewOnUiThread.this.onNewPicture();
+        }
+    }
+}
diff --git a/tests/tests/webkit/src/android/webkit/cts/WebViewSslTest.java b/tests/tests/webkit/src/android/webkit/cts/WebViewSslTest.java
index 6798f89..8aa0145 100644
--- a/tests/tests/webkit/src/android/webkit/cts/WebViewSslTest.java
+++ b/tests/tests/webkit/src/android/webkit/cts/WebViewSslTest.java
@@ -46,7 +46,7 @@
 
 import javax.net.ssl.X509TrustManager;
 
-public class WebViewSslTest extends ActivityInstrumentationTestCase2<WebViewStubActivity> {
+public class WebViewSslTest extends ActivityInstrumentationTestCase2<WebViewCtsActivity> {
     private static final String LOGTAG = "WebViewSslTest";
 
     /**
@@ -428,13 +428,13 @@
     private WebViewOnUiThread mOnUiThread;
 
     public WebViewSslTest() {
-        super("com.android.cts.stub", WebViewStubActivity.class);
+        super("com.android.cts.webkit", WebViewCtsActivity.class);
     }
 
     @Override
     protected void setUp() throws Exception {
         super.setUp();
-        final WebViewStubActivity activity = getActivity();
+        final WebViewCtsActivity activity = getActivity();
         mWebView = activity.getWebView();
         if (mWebView != null) {
             new PollingCheck() {
diff --git a/tests/tests/webkit/src/android/webkit/cts/WebViewStartupCtsActivity.java b/tests/tests/webkit/src/android/webkit/cts/WebViewStartupCtsActivity.java
new file mode 100644
index 0000000..933d0ed
--- /dev/null
+++ b/tests/tests/webkit/src/android/webkit/cts/WebViewStartupCtsActivity.java
@@ -0,0 +1,55 @@
+/*
+ * Copyright (C) 2013 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.webkit.cts;
+
+import android.app.Activity;
+import android.os.Bundle;
+import android.view.ViewGroup;
+import android.webkit.WebView;
+
+public class WebViewStartupCtsActivity extends Activity {
+    private WebView mWebView;
+
+    @Override
+    public void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+    }
+
+    public WebView createAndAttachWebView() {
+        mWebView = new WebView(this);
+        setContentView(mWebView);
+        return mWebView;
+    }
+
+    public WebView getWebView() {
+        return mWebView;
+    }
+
+    public void detachAndDestroyWebView() {
+        if (mWebView != null) {
+            ViewGroup vg = (ViewGroup)mWebView.getParent();
+            vg.removeView(mWebView);
+            mWebView.destroy();
+        }
+    }
+
+    @Override
+    public void onDestroy() {
+        detachAndDestroyWebView();
+        super.onDestroy();
+    }
+}
diff --git a/tests/tests/webkit/src/android/webkit/cts/WebViewStartupTest.java b/tests/tests/webkit/src/android/webkit/cts/WebViewStartupTest.java
index 56f8f61..8f4dcc2 100644
--- a/tests/tests/webkit/src/android/webkit/cts/WebViewStartupTest.java
+++ b/tests/tests/webkit/src/android/webkit/cts/WebViewStartupTest.java
@@ -30,15 +30,15 @@
 import java.util.regex.Pattern;
 
 public class WebViewStartupTest
-        extends ActivityInstrumentationTestCase2<WebViewStartupStubActivity> {
+        extends ActivityInstrumentationTestCase2<WebViewStartupCtsActivity> {
 
     private static final int TEST_TIMEOUT = 5000;
     private static final String TAG = "WebViewStartupTest";
 
-    private WebViewStartupStubActivity mActivity;
+    private WebViewStartupCtsActivity mActivity;
 
     public WebViewStartupTest() {
-        super("com.android.cts.stub", WebViewStartupStubActivity.class);
+        super("com.android.cts.webkit", WebViewStartupCtsActivity.class);
     }
 
     @Override
diff --git a/tests/tests/webkit/src/android/webkit/cts/WebViewTest.java b/tests/tests/webkit/src/android/webkit/cts/WebViewTest.java
index c9a7de7..1d8a02a 100755
--- a/tests/tests/webkit/src/android/webkit/cts/WebViewTest.java
+++ b/tests/tests/webkit/src/android/webkit/cts/WebViewTest.java
@@ -75,8 +75,12 @@
 import java.io.ByteArrayInputStream;
 import java.io.File;
 import java.io.FileInputStream;
+import java.io.FileNotFoundException;
 import java.io.IOException;
 
+import java.nio.charset.Charset;
+import java.nio.charset.StandardCharsets;
+
 import java.util.Collections;
 import java.util.Date;
 import java.util.concurrent.atomic.AtomicBoolean;
@@ -84,6 +88,7 @@
 import java.util.concurrent.Callable;
 import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.FutureTask;
+import java.util.concurrent.Semaphore;
 import java.util.concurrent.TimeUnit;
 import java.util.HashMap;
 import java.util.Map;
@@ -95,7 +100,7 @@
 import org.apache.http.util.EncodingUtils;
 import org.apache.http.util.EntityUtils;
 
-public class WebViewTest extends ActivityInstrumentationTestCase2<WebViewStubActivity> {
+public class WebViewTest extends ActivityInstrumentationTestCase2<WebViewCtsActivity> {
     public static final long TEST_TIMEOUT = 20000L;
     private static final int INITIAL_PROGRESS = 100;
     private static final String X_REQUESTED_WITH = "X-Requested-With";
@@ -122,13 +127,13 @@
     private WebIconDatabase mIconDb;
 
     public WebViewTest() {
-        super("com.android.cts.stub", WebViewStubActivity.class);
+        super("com.android.cts.webkit", WebViewCtsActivity.class);
     }
 
     @Override
     protected void setUp() throws Exception {
         super.setUp();
-        final WebViewStubActivity activity = getActivity();
+        final WebViewCtsActivity activity = getActivity();
         mWebView = activity.getWebView();
         if (mWebView != null) {
             new PollingCheck() {
@@ -283,6 +288,20 @@
         currScale = mOnUiThread.getScale();
         assertTrue(currScale < previousScale);
 
+        mOnUiThread.zoomBy(1.25f); // zoom in
+        previousScale = currScale;
+        webViewClient.waitForScaleChanged();
+
+        currScale = mOnUiThread.getScale();
+        assertTrue(currScale > previousScale);
+
+        mOnUiThread.zoomBy(0.8f); // zoom out
+        previousScale = currScale;
+        webViewClient.waitForScaleChanged();
+
+        currScale = mOnUiThread.getScale();
+        assertTrue(currScale < previousScale);
+
         // enable zoom support
         settings.setSupportZoom(true);
         assertTrue(settings.supportZoom());
@@ -305,16 +324,17 @@
         previousScale = currScale;
         // can not zoom in further
         assertFalse(mOnUiThread.zoomIn());
+
         // We sleep to assert to the best of our ability
         // that a scale change does *not* happen.
         Thread.sleep(500);
         currScale = mOnUiThread.getScale();
         assertEquals(currScale, previousScale);
 
-        // zoom out
         assertTrue(mOnUiThread.zoomOut());
         previousScale = currScale;
         webViewClient.waitForScaleChanged();
+
         currScale = mOnUiThread.getScale();
         assertTrue(currScale < previousScale);
 
@@ -334,6 +354,54 @@
         Thread.sleep(500);
         currScale = mOnUiThread.getScale();
         assertEquals(currScale, previousScale);
+
+        mOnUiThread.zoomBy(1.25f);
+        previousScale = currScale;
+        webViewClient.waitForScaleChanged();
+
+        currScale = mOnUiThread.getScale();
+        assertTrue(currScale > previousScale);
+
+        // zoom in until it reaches maximum scale
+        while (mOnUiThread.canZoomIn()) {
+            previousScale = currScale;
+            mOnUiThread.zoomBy(1.25f);
+            webViewClient.waitForScaleChanged();
+            currScale = mOnUiThread.getScale();
+            assertTrue(currScale > previousScale);
+        }
+
+        previousScale = currScale;
+
+        // We sleep to assert to the best of our ability
+        // that a scale change does *not* happen.
+        Thread.sleep(500);
+        currScale = mOnUiThread.getScale();
+        assertEquals(currScale, previousScale);
+
+        mOnUiThread.zoomBy(0.8f);
+        previousScale = currScale;
+        webViewClient.waitForScaleChanged();
+
+        currScale = mOnUiThread.getScale();
+        assertTrue(currScale < previousScale);
+
+        // zoom out until it reaches minimum scale
+        while (mOnUiThread.canZoomOut()) {
+            previousScale = currScale;
+            mOnUiThread.zoomBy(0.8f);
+            webViewClient.waitForScaleChanged();
+            currScale = mOnUiThread.getScale();
+            assertTrue(currScale < previousScale);
+        }
+
+        previousScale = currScale;
+
+        // We sleep to assert to the best of our ability
+        // that a scale change does *not* happen.
+        Thread.sleep(500);
+        currScale = mOnUiThread.getScale();
+        assertEquals(currScale, previousScale);
     }
 
     @UiThreadTest
@@ -1227,6 +1295,94 @@
         assertEquals("about:blank", mOnUiThread.getUrl());
     }
 
+    private void deleteIfExists(File file) throws IOException {
+        if (file.exists()) {
+            file.delete();
+        }
+    }
+
+    private String readTextFile(File file, Charset encoding)
+            throws FileNotFoundException, IOException {
+        FileInputStream stream = new FileInputStream(file);
+        byte[] bytes = new byte[(int)file.length()];
+        stream.read(bytes);
+        stream.close();
+        return new String(bytes, encoding);
+    }
+
+    private void doSaveWebArchive(String baseName, boolean autoName, final String expectName)
+            throws Throwable {
+        final Semaphore saving = new Semaphore(0);
+        ValueCallback<String> callback = new ValueCallback<String>() {
+            @Override
+            public void onReceiveValue(String savedName) {
+                assertEquals(expectName, savedName);
+                saving.release();
+            }
+        };
+
+        mOnUiThread.saveWebArchive(baseName, autoName, callback);
+        assertTrue(saving.tryAcquire(TEST_TIMEOUT, TimeUnit.MILLISECONDS));
+    }
+
+    public void testSaveWebArchive() throws Throwable {
+        if (!NullWebViewUtils.isWebViewAvailable()) {
+            return;
+        }
+
+        final String testPage = "testSaveWebArchive test page";
+
+        File dir = getActivity().getFilesDir();
+        String dirStr = dir.toString();
+
+        File test = new File(dir, "test.mht");
+        deleteIfExists(test);
+        String testStr = test.getAbsolutePath();
+
+        File index = new File(dir, "index.mht");
+        deleteIfExists(index);
+        String indexStr = index.getAbsolutePath();
+
+        File index1 = new File(dir, "index-1.mht");
+        deleteIfExists(index1);
+        String index1Str = index1.getAbsolutePath();
+
+        mOnUiThread.loadDataAndWaitForCompletion(testPage, "text/html", "UTF-8");
+
+        try {
+            // Save test.mht
+            doSaveWebArchive(testStr, false, testStr);
+
+            // Check the contents of test.mht
+            String testMhtml = readTextFile(test, StandardCharsets.UTF_8);
+            assertTrue(testMhtml.contains(testPage));
+
+            // Save index.mht
+            doSaveWebArchive(dirStr + "/", true, indexStr);
+
+            // Check the contents of index.mht
+            String indexMhtml = readTextFile(index, StandardCharsets.UTF_8);
+            assertTrue(indexMhtml.contains(testPage));
+
+            // Save index-1.mht since index.mht already exists
+            doSaveWebArchive(dirStr + "/", true, index1Str);
+
+            // Check the contents of index-1.mht
+            String index1Mhtml = readTextFile(index1, StandardCharsets.UTF_8);
+            assertTrue(index1Mhtml.contains(testPage));
+
+            // Try a file in a bogus directory
+            doSaveWebArchive("/bogus/path/test.mht", false, null);
+
+            // Try a bogus directory
+            doSaveWebArchive("/bogus/path/", true, null);
+        } finally {
+            deleteIfExists(test);
+            deleteIfExists(index);
+            deleteIfExists(index1);
+        }
+    }
+
     private static class WaitForFindResultsListener extends FutureTask<Integer>
             implements WebView.FindListener {
         public WaitForFindResultsListener() {
@@ -2212,7 +2368,7 @@
                 .setResolution(new PrintAttributes.Resolution("foo", "bar", 300, 300))
                 .setMinMargins(PrintAttributes.Margins.NO_MARGINS)
                 .build();
-        final WebViewStubActivity activity = getActivity();
+        final WebViewCtsActivity activity = getActivity();
         final File file = activity.getFileStreamPath(PRINTER_TEST_FILE);
         final ParcelFileDescriptor descriptor = ParcelFileDescriptor.open(file,
                 ParcelFileDescriptor.parseMode("w"));
diff --git a/tests/tests/webkit/src/android/webkit/cts/WebView_WebViewTransportTest.java b/tests/tests/webkit/src/android/webkit/cts/WebView_WebViewTransportTest.java
index cb72ef0..0c04706 100644
--- a/tests/tests/webkit/src/android/webkit/cts/WebView_WebViewTransportTest.java
+++ b/tests/tests/webkit/src/android/webkit/cts/WebView_WebViewTransportTest.java
@@ -23,10 +23,10 @@
 
 
 public class WebView_WebViewTransportTest
-        extends ActivityInstrumentationTestCase2<WebViewStubActivity> {
+        extends ActivityInstrumentationTestCase2<WebViewCtsActivity> {
 
     public WebView_WebViewTransportTest() {
-        super("com.android.cts.stub", WebViewStubActivity.class);
+        super("com.android.cts.webkit", WebViewCtsActivity.class);
     }
 
     @UiThreadTest
diff --git a/tests/tests/widget/Android.mk b/tests/tests/widget/Android.mk
index f6be07d..505f82c 100644
--- a/tests/tests/widget/Android.mk
+++ b/tests/tests/widget/Android.mk
@@ -21,7 +21,7 @@
 # and when built explicitly put it in the data partition
 LOCAL_MODULE_PATH := $(TARGET_OUT_DATA_APPS)
 
-LOCAL_STATIC_JAVA_LIBRARIES += android-common ctstestrunner
+LOCAL_STATIC_JAVA_LIBRARIES += android-common ctsdeviceutil ctstestrunner
 
 LOCAL_JAVA_LIBRARIES := android.test.runner
 
@@ -29,6 +29,4 @@
 
 LOCAL_PACKAGE_NAME := CtsWidgetTestCases
 
-LOCAL_INSTRUMENTATION_FOR := CtsTestStubs
-
 include $(BUILD_CTS_PACKAGE)
diff --git a/tests/tests/widget/AndroidManifest.xml b/tests/tests/widget/AndroidManifest.xml
index 3c7fe5f..4b88c01 100644
--- a/tests/tests/widget/AndroidManifest.xml
+++ b/tests/tests/widget/AndroidManifest.xml
@@ -19,12 +19,335 @@
     package="com.android.cts.widget">
 
     <uses-permission android:name="android.permission.DISABLE_KEYGUARD" />
-    <application>
+    <application android:label="Android TestCase"
+            android:icon="@drawable/size_48x48"
+            android:maxRecents="1"
+            android:multiArch="true"
+            android:name="android.widget.cts.MockApplication"
+            android:supportsRtl="true">
+
         <uses-library android:name="android.test.runner" />
+
+        <activity android:name="android.widget.cts.TwoLineListItemCtsActivity"
+            android:label="TwoLineListItemCtsActivity">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="android.intent.category.FRAMEWORK_INSTRUMENTATION_TEST" />
+            </intent-filter>
+        </activity>
+
+        <activity android:name="android.widget.cts.ViewFlipperCtsActivity"
+            android:label="ViewFlipperCtsActivity">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="android.intent.category.FRAMEWORK_INSTRUMENTATION_TEST" />
+            </intent-filter>
+        </activity>
+
+        <activity android:name="android.widget.cts.HorizontalScrollViewCtsActivity"
+            android:label="HorizontalScrollViewCtsActivity">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="android.intent.category.FRAMEWORK_INSTRUMENTATION_TEST" />
+            </intent-filter>
+        </activity>
+
+        <activity android:name="android.widget.cts.SlidingDrawerCtsActivity"
+            android:label="SlidingDrawerCtsActivity">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="android.intent.category.FRAMEWORK_INSTRUMENTATION_TEST" />
+            </intent-filter>
+        </activity>
+
+        <activity android:name="android.widget.cts.DigitalClockCtsActivity"
+            android:label="DigitalClockCtsActivity">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="android.intent.category.FRAMEWORK_INSTRUMENTATION_TEST" />
+            </intent-filter>
+        </activity>
+
+        <activity android:name="android.widget.cts.ImageViewCtsActivity"
+            android:label="ImageViewCtsActivity">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="android.intent.category.FRAMEWORK_INSTRUMENTATION_TEST" />
+            </intent-filter>
+        </activity>
+
+        <activity android:name="android.widget.cts.SeekBarCtsActivity"
+            android:label="SeekBarCtsActivity">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="android.intent.category.FRAMEWORK_INSTRUMENTATION_TEST" />
+            </intent-filter>
+        </activity>
+
+        <activity android:name="android.widget.cts.ScrollViewCtsActivity"
+            android:label="ScrollViewCtsActivity">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="android.intent.category.FRAMEWORK_INSTRUMENTATION_TEST" />
+            </intent-filter>
+        </activity>
+
+        <activity android:name="android.widget.cts.FrameLayoutCtsActivity"
+            android:label="FrameLayoutCtsActivity">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="android.intent.category.FRAMEWORK_INSTRUMENTATION_TEST" />
+            </intent-filter>
+        </activity>
+
+        <activity android:name="android.widget.cts.LinearLayoutCtsActivity"
+            android:label="LinearLayoutCtsActivity">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="android.intent.category.FRAMEWORK_INSTRUMENTATION_TEST" />
+            </intent-filter>
+        </activity>
+
+        <activity android:name="android.widget.cts.GridLayoutCtsActivity"
+            android:label="GridLayoutCtsActivity">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="android.intent.category.FRAMEWORK_INSTRUMENTATION_TEST" />
+            </intent-filter>
+        </activity>
+
+        <activity android:name="android.widget.cts.LayoutDirectionCtsActivity"
+            android:label="LayoutDirectionCtsActivity">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="android.intent.category.FRAMEWORK_INSTRUMENTATION_TEST" />
+            </intent-filter>
+        </activity>
+
+        <activity android:name="android.widget.cts.ProgressBarCtsActivity"
+            android:label="ProgressBarCtsActivity">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="android.intent.category.FRAMEWORK_INSTRUMENTATION_TEST" />
+            </intent-filter>
+        </activity>
+
+        <activity android:name="android.widget.cts.ChronometerCtsActivity"
+            android:label="ChronometerCtsActivity">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN"/>
+                <category android:name="android.intent.category.FRAMEWORK_INSTRUMENTATION_TEST" />
+            </intent-filter>
+        </activity>
+
+        <activity android:name="android.widget.cts.MediaControllerCtsActivity"
+            android:label="MediaControllerCtsActivity">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="android.intent.category.FRAMEWORK_INSTRUMENTATION_TEST" />
+            </intent-filter>
+        </activity>
+
+        <activity android:name="android.widget.cts.RatingBarCtsActivity"
+            android:label="RatingBarCtsActivity">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="android.intent.category.FRAMEWORK_INSTRUMENTATION_TEST" />
+            </intent-filter>
+        </activity>
+
+        <activity android:name="android.widget.cts.RemoteViewsCtsActivity"
+            android:label="RemoteViewsCtsActivity">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="android.intent.category.FRAMEWORK_INSTRUMENTATION_TEST" />
+            </intent-filter>
+        </activity>
+
+        <activity android:name="android.widget.cts.ExpandableListSimple"
+            android:label="ExpandableListSimple">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="android.intent.category.FRAMEWORK_INSTRUMENTATION_TEST" />
+            </intent-filter>
+        </activity>
+
+        <activity android:name="android.widget.cts.CtsActivity"
+            android:label="CtsActivity">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="android.intent.category.FRAMEWORK_INSTRUMENTATION_TEST" />
+            </intent-filter>
+        </activity>
+
+        <activity android:name="android.widget.cts.ExpandableListWithHeaders"
+            android:label="ExpandableListWithHeaders">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="android.intent.category.FRAMEWORK_INSTRUMENTATION_TEST" />
+            </intent-filter>
+        </activity>
+
+        <activity android:name="android.widget.cts.GalleryCtsActivity"
+            android:label="GalleryCtsActivity">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="android.intent.category.FRAMEWORK_INSTRUMENTATION_TEST" />
+            </intent-filter>
+        </activity>
+
+        <activity android:name="android.widget.cts.MockPopupWindowCtsActivity"
+            android:label="MockPopupWindowCtsActivity">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="android.intent.category.FRAMEWORK_INSTRUMENTATION_TEST" />
+            </intent-filter>
+        </activity>
+
+        <activity android:name="android.widget.cts.ListViewCtsActivity"
+            android:label="ListViewCtsActivity">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="android.intent.category.FRAMEWORK_INSTRUMENTATION_TEST" />
+            </intent-filter>
+        </activity>
+
+        <activity android:name="android.widget.cts.TextViewCtsActivity"
+            android:label="TextViewCtsActivity">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="android.intent.category.FRAMEWORK_INSTRUMENTATION_TEST" />
+            </intent-filter>
+        </activity>
+
+        <activity android:name="android.widget.cts.DialerFilterCtsActivity"
+            android:label="DialerFilterCtsActivity">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="android.intent.category.FRAMEWORK_INSTRUMENTATION_TEST" />
+            </intent-filter>
+        </activity>
+
+        <activity android:name="android.widget.cts.MultiAutoCompleteTextViewCtsActivity"
+            android:label="MultiAutoCompleteTextView Test Activity">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="android.intent.category.FRAMEWORK_INSTRUMENTATION_TEST" />
+            </intent-filter>
+        </activity>
+
+        <activity android:name="android.widget.cts.ViewGroupCtsActivity"
+            android:label="WidgetViewGroupCtsActivity">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="android.intent.category.FRAMEWORK_INSTRUMENTATION_TEST" />
+            </intent-filter>
+        </activity>
+
+        <activity android:name="android.widget.cts.VideoViewCtsActivity"
+            android:configChanges="keyboardHidden|orientation|screenSize">
+            android:label="VideoViewCtsActivity">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="android.intent.category.FRAMEWORK_INSTRUMENTATION_TEST" />
+            </intent-filter>
+        </activity>
+
+        <activity android:name="android.widget.cts.AutoCompleteCtsActivity"
+            android:label="AutoCompleteCtsActivity">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="android.intent.category.FRAMEWORK_INSTRUMENTATION_TEST" />
+            </intent-filter>
+        </activity>
+
+        <activity android:name="android.widget.cts.ViewAnimatorCtsActivity" android:label="ViewAnimatorCtsActivity">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN"/>
+                <category android:name="android.intent.category.FRAMEWORK_INSTRUMENTATION_TEST" />
+            </intent-filter>
+        </activity>
+
+        <activity android:name="android.widget.cts.GridViewCtsActivity"
+            android:label="GridViewCtsActivity">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="android.intent.category.FRAMEWORK_INSTRUMENTATION_TEST" />
+            </intent-filter>
+        </activity>
+
+        <activity android:name="android.widget.cts.RelativeLayoutCtsActivity"
+            android:label="RelativeLayoutCtsActivity">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="android.intent.category.FRAMEWORK_INSTRUMENTATION_TEST" />
+            </intent-filter>
+        </activity>
+
+        <activity android:name="android.widget.cts.FrameLayoutCtsActivity"
+            android:label="FrameLayoutCtsActivity">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="android.intent.category.FRAMEWORK_INSTRUMENTATION_TEST" />
+            </intent-filter>
+        </activity>
+
+        <activity android:name="android.widget.cts.AdapterViewCtsActivity"
+            android:label="AdapterViewCtsActivity">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="android.intent.category.FRAMEWORK_INSTRUMENTATION_TEST" />
+            </intent-filter>
+        </activity>
+
+        <activity android:name="android.widget.cts.CheckedTextViewCtsActivity"
+            android:label="CheckedTextViewCtsActivity"/>
+
+        <activity android:name="android.widget.cts.TableCtsActivity"
+            android:label="TableCtsActivity">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="android.intent.category.FRAMEWORK_INSTRUMENTATION_TEST" />
+            </intent-filter>
+        </activity>
+
+        <activity android:name="android.widget.cts.TabHostCtsActivity"
+            android:label="TabHostCtsActivity">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="android.intent.category.FRAMEWORK_INSTRUMENTATION_TEST" />
+            </intent-filter>
+        </activity>
+
+        <activity android:name="android.widget.cts.ZoomButtonCtsActivity"
+            android:label="ZoomButtonCtsActivity">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN"/>
+                <category android:name="android.intent.category.FRAMEWORK_INSTRUMENTATION_TEST" />
+            </intent-filter>
+        </activity>
+
+        <activity android:name="android.app.ActivityGroup"
+            android:label="ActivityGroup" />
+
+        <activity android:name="android.widget.cts.MockURLSpanTestActivity"
+            android:label="MockURLSpanTestActivity"
+            android:launchMode="singleTask"
+            android:alwaysRetainTaskState="true"
+            android:configChanges="orientation|keyboardHidden">
+            <intent-filter>
+                <action android:name="android.intent.action.VIEW" />
+                <category android:name="android.intent.category.DEFAULT" />
+                <category android:name="android.intent.category.BROWSABLE" />
+                <category android:name="android.intent.category.FRAMEWORK_INSTRUMENTATION_TEST" />
+                <data android:scheme="ctstest" />
+            </intent-filter>
+        </activity>
+
     </application>
 
     <instrumentation android:name="android.support.test.runner.AndroidJUnitRunner"
-                     android:targetPackage="com.android.cts.stub"
+                     android:targetPackage="com.android.cts.widget"
                      android:label="CTS tests of android.widget">
         <meta-data android:name="listener"
             android:value="com.android.cts.runner.CtsTestRunListener" />
diff --git a/tests/tests/widget/res/anim/anim_alpha.xml b/tests/tests/widget/res/anim/anim_alpha.xml
new file mode 100644
index 0000000..b5794c3
--- /dev/null
+++ b/tests/tests/widget/res/anim/anim_alpha.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ * Copyright (C) 2008 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ -->
+
+<alpha xmlns:android="http://schemas.android.com/apk/res/android"
+       android:interpolator="@android:anim/accelerate_interpolator"
+       android:fromAlpha="0.0"
+       android:toAlpha="1.0"
+       android:duration="500" />
+
diff --git a/tests/tests/widget/res/drawable/animated.gif b/tests/tests/widget/res/drawable/animated.gif
new file mode 100644
index 0000000..51baf15
--- /dev/null
+++ b/tests/tests/widget/res/drawable/animated.gif
Binary files differ
diff --git a/tests/tests/widget/res/drawable/faces.jpg b/tests/tests/widget/res/drawable/faces.jpg
new file mode 100644
index 0000000..0672022
--- /dev/null
+++ b/tests/tests/widget/res/drawable/faces.jpg
Binary files differ
diff --git a/tests/tests/widget/res/drawable/failed.jpg b/tests/tests/widget/res/drawable/failed.jpg
new file mode 100644
index 0000000..1bb9b52
--- /dev/null
+++ b/tests/tests/widget/res/drawable/failed.jpg
Binary files differ
diff --git a/tests/tests/widget/res/drawable/icon_black.jpg b/tests/tests/widget/res/drawable/icon_black.jpg
new file mode 100644
index 0000000..4c9062a
--- /dev/null
+++ b/tests/tests/widget/res/drawable/icon_black.jpg
Binary files differ
diff --git a/tests/tests/widget/res/drawable/icon_blue.jpg b/tests/tests/widget/res/drawable/icon_blue.jpg
new file mode 100644
index 0000000..9e6c1c8
--- /dev/null
+++ b/tests/tests/widget/res/drawable/icon_blue.jpg
Binary files differ
diff --git a/tests/tests/widget/res/drawable/icon_green.jpg b/tests/tests/widget/res/drawable/icon_green.jpg
new file mode 100644
index 0000000..55a78f2
--- /dev/null
+++ b/tests/tests/widget/res/drawable/icon_green.jpg
Binary files differ
diff --git a/tests/tests/widget/res/drawable/icon_red.jpg b/tests/tests/widget/res/drawable/icon_red.jpg
new file mode 100644
index 0000000..6bc9e1f
--- /dev/null
+++ b/tests/tests/widget/res/drawable/icon_red.jpg
Binary files differ
diff --git a/tests/tests/widget/res/drawable/icon_yellow.jpg b/tests/tests/widget/res/drawable/icon_yellow.jpg
new file mode 100644
index 0000000..e748059
--- /dev/null
+++ b/tests/tests/widget/res/drawable/icon_yellow.jpg
Binary files differ
diff --git a/tests/tests/widget/res/drawable/ninepatch_0.9.png b/tests/tests/widget/res/drawable/ninepatch_0.9.png
new file mode 100644
index 0000000..24019d8
--- /dev/null
+++ b/tests/tests/widget/res/drawable/ninepatch_0.9.png
Binary files differ
diff --git a/tests/tests/widget/res/drawable/ninepatch_1.9.png b/tests/tests/widget/res/drawable/ninepatch_1.9.png
new file mode 100644
index 0000000..c56b1db
--- /dev/null
+++ b/tests/tests/widget/res/drawable/ninepatch_1.9.png
Binary files differ
diff --git a/tests/tests/widget/res/drawable/pass.jpg b/tests/tests/widget/res/drawable/pass.jpg
new file mode 100644
index 0000000..2f4b083
--- /dev/null
+++ b/tests/tests/widget/res/drawable/pass.jpg
Binary files differ
diff --git a/tests/tests/widget/res/drawable/scenery.jpg b/tests/tests/widget/res/drawable/scenery.jpg
new file mode 100644
index 0000000..7a6145b
--- /dev/null
+++ b/tests/tests/widget/res/drawable/scenery.jpg
Binary files differ
diff --git a/tests/tests/widget/res/drawable/size_48x48.jpg b/tests/tests/widget/res/drawable/size_48x48.jpg
new file mode 100644
index 0000000..5c2291e
--- /dev/null
+++ b/tests/tests/widget/res/drawable/size_48x48.jpg
Binary files differ
diff --git a/tests/tests/widget/res/drawable/start.jpg b/tests/tests/widget/res/drawable/start.jpg
new file mode 100644
index 0000000..54e05e0
--- /dev/null
+++ b/tests/tests/widget/res/drawable/start.jpg
Binary files differ
diff --git a/tests/tests/widget/res/drawable/testimage.jpg b/tests/tests/widget/res/drawable/testimage.jpg
new file mode 100644
index 0000000..754df0c
--- /dev/null
+++ b/tests/tests/widget/res/drawable/testimage.jpg
Binary files differ
diff --git a/tests/tests/widget/res/layout/abslistview_layout.xml b/tests/tests/widget/res/layout/abslistview_layout.xml
new file mode 100644
index 0000000..a090ce3
--- /dev/null
+++ b/tests/tests/widget/res/layout/abslistview_layout.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2008 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<ViewGroup_Layout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:id="@+id/abslistview_root"
+    android:layout_width="25px"
+    android:layout_height="25px" >
+
+   <GridView
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content" />
+
+   <ListView>
+        <TextView
+            android:text="@string/table_layout_first"
+            android:padding="3dip" />
+        <TextView
+            android:text="@string/table_layout_second"
+            android:padding="3dip" />
+        <TextView
+            android:text="@string/table_layout_third"
+            android:padding="3dip" />
+    </ListView>
+</ViewGroup_Layout>
+
diff --git a/tests/tests/widget/res/layout/absolute_layout.xml b/tests/tests/widget/res/layout/absolute_layout.xml
new file mode 100644
index 0000000..6cec61b
--- /dev/null
+++ b/tests/tests/widget/res/layout/absolute_layout.xml
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent">
+
+    <AbsoluteLayout
+        android:id="@+id/absolute_view"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:layout_x="1dip"
+        android:layout_y="2dip">
+
+        <TextView
+            android:id="@+id/absolute_textview"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_x="10dip"
+            android:layout_y="20dip"
+            android:background="@drawable/red"
+            android:text="@string/hello_world"/>
+
+    </AbsoluteLayout>
+
+</LinearLayout>
diff --git a/tests/tests/widget/res/layout/adapterview_layout.xml b/tests/tests/widget/res/layout/adapterview_layout.xml
new file mode 100644
index 0000000..e118500
--- /dev/null
+++ b/tests/tests/widget/res/layout/adapterview_layout.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2008 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<TextView xmlns:android="http://schemas.android.com/apk/res/android"
+        android:id="@+id/adapterview_tv"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content" />
+
diff --git a/tests/tests/widget/res/layout/analogclock.xml b/tests/tests/widget/res/layout/analogclock.xml
new file mode 100644
index 0000000..7d862c3
--- /dev/null
+++ b/tests/tests/widget/res/layout/analogclock.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2008 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<AnalogClock android:id="@+id/clock"
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="96dip"
+    android:layout_gravity="center_horizontal"
+    android:layout_height="wrap_content"/>
diff --git a/tests/tests/widget/res/layout/autocompletetextview_layout.xml b/tests/tests/widget/res/layout/autocompletetextview_layout.xml
new file mode 100644
index 0000000..7fd183c
--- /dev/null
+++ b/tests/tests/widget/res/layout/autocompletetextview_layout.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2008 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:orientation="vertical"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content">
+
+    <TextView android:id="@+id/autocompletetv_title"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:text="@string/notify" />
+
+    <AutoCompleteTextView android:id="@+id/autocompletetv_edit"
+        android:completionThreshold="1"
+        android:completionHint="@string/tabs_1"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content" />
+</LinearLayout>
diff --git a/tests/tests/widget/res/layout/checkbox_layout.xml b/tests/tests/widget/res/layout/checkbox_layout.xml
new file mode 100644
index 0000000..a1f1718
--- /dev/null
+++ b/tests/tests/widget/res/layout/checkbox_layout.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ * Copyright (C) 2008 The Android Open Source Project.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ -->
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:orientation="vertical">
+
+    <CheckBox android:id="@+id/check_box"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:text="@string/hello_world" />
+
+</LinearLayout>
diff --git a/tests/tests/widget/res/layout/checkedtextview_layout.xml b/tests/tests/widget/res/layout/checkedtextview_layout.xml
new file mode 100644
index 0000000..d5b9c1f
--- /dev/null
+++ b/tests/tests/widget/res/layout/checkedtextview_layout.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+                android:layout_width="match_parent"
+                android:layout_height="match_parent">
+
+    <ListView android:id="@+id/checkedtextview_listview"
+        android:orientation="vertical"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent">
+    </ListView>
+
+    <CheckedTextView android:id="@+id/checkedtextview_test"
+        android:orientation="vertical"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent">
+    </CheckedTextView>
+
+</LinearLayout>
diff --git a/tests/tests/widget/res/layout/chronometer_stub_layout.xml b/tests/tests/widget/res/layout/chronometer_stub_layout.xml
new file mode 100644
index 0000000..487f2f8
--- /dev/null
+++ b/tests/tests/widget/res/layout/chronometer_stub_layout.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ * Copyright (C) 2008 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ -->
+
+<ScrollView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/screen"
+    android:layout_width="match_parent" android:layout_height="match_parent"
+    android:orientation="vertical">
+    <LinearLayout
+        android:id="@+id/chronometer_view_group"
+        android:layout_width="match_parent" android:layout_height="match_parent"
+        android:orientation="vertical">
+        <Chronometer
+            android:id="@+id/test_chronometer"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:text="@string/chronometer_text"
+            />
+    </LinearLayout>
+</ScrollView>
+
diff --git a/tests/tests/widget/res/layout/cursoradapter_group0.xml b/tests/tests/widget/res/layout/cursoradapter_group0.xml
new file mode 100644
index 0000000..f640686
--- /dev/null
+++ b/tests/tests/widget/res/layout/cursoradapter_group0.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2008 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<ImageView xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="wrap_content"
+    android:layout_height="wrap_content"
+    android:id="@+id/cursorAdapter_group0">
+</ImageView>
diff --git a/tests/tests/widget/res/layout/cursoradapter_group1.xml b/tests/tests/widget/res/layout/cursoradapter_group1.xml
new file mode 100644
index 0000000..d1dfa3c
--- /dev/null
+++ b/tests/tests/widget/res/layout/cursoradapter_group1.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2008 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<ImageView xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="wrap_content"
+    android:layout_height="wrap_content"
+    android:id="@+id/cursorAdapter_group1">
+</ImageView>
diff --git a/tests/tests/widget/res/layout/cursoradapter_host.xml b/tests/tests/widget/res/layout/cursoradapter_host.xml
new file mode 100644
index 0000000..82ac72b
--- /dev/null
+++ b/tests/tests/widget/res/layout/cursoradapter_host.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2008 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:orientation="vertical"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:id="@+id/cursorAdapter_host">
+</LinearLayout>
diff --git a/tests/tests/widget/res/layout/cursoradapter_item0.xml b/tests/tests/widget/res/layout/cursoradapter_item0.xml
new file mode 100644
index 0000000..5ecd496
--- /dev/null
+++ b/tests/tests/widget/res/layout/cursoradapter_item0.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2008 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<TextView xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="wrap_content"
+    android:layout_height="wrap_content"
+    android:id="@+id/cursorAdapter_item0">
+</TextView>
diff --git a/tests/tests/widget/res/layout/cursoradapter_item1.xml b/tests/tests/widget/res/layout/cursoradapter_item1.xml
new file mode 100644
index 0000000..44037b0
--- /dev/null
+++ b/tests/tests/widget/res/layout/cursoradapter_item1.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2008 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<TextView xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="wrap_content"
+    android:layout_height="wrap_content"
+    android:id="@+id/cursorAdapter_item1">
+</TextView>
diff --git a/tests/tests/widget/res/layout/datepicker_layout.xml b/tests/tests/widget/res/layout/datepicker_layout.xml
new file mode 100644
index 0000000..925674c
--- /dev/null
+++ b/tests/tests/widget/res/layout/datepicker_layout.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2008 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<RelativeLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent">
+    <DatePicker
+        android:id="@+id/datePicker_dp"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_centerInParent="true" />
+
+</RelativeLayout>
diff --git a/tests/tests/widget/res/layout/dialerfilter_layout.xml b/tests/tests/widget/res/layout/dialerfilter_layout.xml
new file mode 100644
index 0000000..46edbd7
--- /dev/null
+++ b/tests/tests/widget/res/layout/dialerfilter_layout.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2008 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<DialerFilter android:id="@+id/dialer_filter"
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent">
+
+    <EditText android:id="@android:id/hint"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:background="@android:drawable/editbox_background"/>
+
+    <EditText android:id="@android:id/primary"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:layout_below="@android:id/hint"/>
+
+</DialerFilter>
diff --git a/tests/tests/widget/res/layout/digitalclock_layout.xml b/tests/tests/widget/res/layout/digitalclock_layout.xml
new file mode 100644
index 0000000..d405af2
--- /dev/null
+++ b/tests/tests/widget/res/layout/digitalclock_layout.xml
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2008 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<com.android.cts.widget.alarmclock.DigitalClock android:id="@+id/digitalClock"
+     xmlns:android="http://schemas.android.com/apk/res/android"
+     android:layout_width="wrap_content"
+     android:layout_height="208dip"
+     android:gravity="center">
+     <!-- Includes vertical padding so animated background doesn't
+          stretch much -->
+     <TextView android:id="@+id/timeDisplay"
+         android:layout_width="wrap_content"
+         android:layout_height="wrap_content"
+         android:textSize="64sp"
+         android:paddingRight="4dip"
+         android:paddingTop="48dip"
+         android:paddingBottom="48dip"/>
+     <LinearLayout android:id="@+id/am_pm"
+         android:layout_width="wrap_content"
+         android:layout_height="wrap_content"
+         android:orientation="vertical">
+         <TextView android:id="@+id/am"
+             android:layout_width="wrap_content"
+             android:layout_height="wrap_content"
+             android:layout_marginTop="-7dp"
+             android:text="@string/am"
+             android:textSize="28sp"/>
+         <TextView android:id="@+id/pm"
+             android:layout_width="wrap_content"
+             android:layout_height="wrap_content"
+             android:layout_marginTop="-4dp"
+             android:text="@string/pm"
+             android:textSize="28sp"/>
+     </LinearLayout>
+</com.android.cts.widget.alarmclock.DigitalClock>
diff --git a/tests/tests/widget/res/layout/digitalclock_simplelayout.xml b/tests/tests/widget/res/layout/digitalclock_simplelayout.xml
new file mode 100644
index 0000000..16f7b45
--- /dev/null
+++ b/tests/tests/widget/res/layout/digitalclock_simplelayout.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2008 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<LinearLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:id="@+id/digitalclock_root"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content">
+</LinearLayout>
diff --git a/tests/tests/widget/res/layout/edittext_layout.xml b/tests/tests/widget/res/layout/edittext_layout.xml
new file mode 100644
index 0000000..398d3be
--- /dev/null
+++ b/tests/tests/widget/res/layout/edittext_layout.xml
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2008 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent" >
+
+    <LinearLayout android:id="@+id/edit_text"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:orientation="vertical">
+
+        <EditText android:id="@+id/edittext1"
+            style="@android:style/Widget.EditText"
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"
+            android:layout_marginTop="10dip"
+            android:scrollHorizontally="true"
+            android:capitalize="sentences"
+            android:autoText="false"
+            android:maxLines="3"
+            android:textColor="#FF0000"
+            android:text="@string/edit_text"
+        />
+    </LinearLayout>
+</ScrollView>
diff --git a/tests/tests/widget/res/layout/expandablelistview_layout.xml b/tests/tests/widget/res/layout/expandablelistview_layout.xml
new file mode 100644
index 0000000..3a3ebb7
--- /dev/null
+++ b/tests/tests/widget/res/layout/expandablelistview_layout.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ * Copyright (C) 2008 The Android Open Source Project.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ -->
+<ExpandableListView xmlns:android="http://schemas.android.com/apk/res/android"
+    android:id="@+id/expandablelistview_test"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:drawSelectorOnTop="false" />
+
diff --git a/tests/tests/widget/res/layout/framelayout_layout.xml b/tests/tests/widget/res/layout/framelayout_layout.xml
new file mode 100644
index 0000000..78b7b47
--- /dev/null
+++ b/tests/tests/widget/res/layout/framelayout_layout.xml
@@ -0,0 +1,58 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ * Copyright (C) 2008 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ -->
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+                android:id="@+id/framelayout_container"
+                android:background="@drawable/red"
+                android:layout_width="match_parent"
+                android:layout_height="match_parent"
+                android:layout_gravity="bottom"
+                android:orientation="vertical">
+
+    <FrameLayout
+        android:layout_width="100dip"
+        android:layout_height="100dip"
+        android:background="@drawable/yellow"
+        android:id="@+id/framelayout">
+    </FrameLayout>
+
+    <FrameLayout
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:background="@drawable/yellow"
+        android:id="@+id/framelayout_measureall">
+
+        <TextView android:id="@+id/framelayout_textview"
+            android:background="@drawable/blue"
+            android:layout_width="60dip"
+            android:layout_height="30dip"
+            android:text="@string/hello_world"/>
+
+        <Button android:id="@+id/framelayout_button"
+            android:layout_width="50dip"
+            android:layout_height="15dip"
+            android:text="@string/go"/>
+
+    </FrameLayout>
+
+    <FrameLayout
+        android:id="@+id/foreground_tint"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:foregroundTint="@android:color/white"
+        android:foregroundTintMode="src_over" />
+
+</LinearLayout>
diff --git a/tests/tests/widget/res/layout/gallery_test.xml b/tests/tests/widget/res/layout/gallery_test.xml
new file mode 100644
index 0000000..03f0e60
--- /dev/null
+++ b/tests/tests/widget/res/layout/gallery_test.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ * Copyright (C) 2008 The Android Open Source Project.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ -->
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:orientation="vertical"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent">
+
+    <android.widget.cts.MyGallery xmlns:android="http://schemas.android.com/apk/res/android"
+        android:id="@+id/gallery_test"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent">
+    </android.widget.cts.MyGallery>
+
+</LinearLayout>
diff --git a/tests/tests/widget/res/layout/gridlayout_layout.xml b/tests/tests/widget/res/layout/gridlayout_layout.xml
new file mode 100644
index 0000000..54b3b2c
--- /dev/null
+++ b/tests/tests/widget/res/layout/gridlayout_layout.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ * Copyright (C) 2012 The Android Open Source Project.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ -->
+<GridLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content"
+    android:orientation="vertical"
+    >
+</GridLayout>
diff --git a/tests/tests/widget/res/layout/gridview_layout.xml b/tests/tests/widget/res/layout/gridview_layout.xml
new file mode 100644
index 0000000..c7774a3
--- /dev/null
+++ b/tests/tests/widget/res/layout/gridview_layout.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2008 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<GridView xmlns:android="http://schemas.android.com/apk/res/android"
+    android:id="@+id/gridview"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+/>
+
diff --git a/tests/tests/widget/res/layout/horizontal_scrollview.xml b/tests/tests/widget/res/layout/horizontal_scrollview.xml
new file mode 100644
index 0000000..0f88ab3
--- /dev/null
+++ b/tests/tests/widget/res/layout/horizontal_scrollview.xml
@@ -0,0 +1,105 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2008 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<android.widget.cts.MyHorizontalScrollView xmlns:android="http://schemas.android.com/apk/res/android"
+    android:id="@+id/horizontal_scroll_view"
+    android:layout_width="100px"
+    android:layout_height="100px">
+
+    <LinearLayout
+        android:orientation="horizontal"
+        android:layout_width="250px"
+        android:layout_height="wrap_content">
+
+        <Button
+            android:id="@+id/first_horizontal_child"
+            android:layout_width="250px"
+            android:layout_height="100px"
+            android:text="@string/vertical_text_1"/>
+
+        <Button
+            android:layout_width="250px"
+            android:layout_height="100px"
+            android:text="@string/vertical_text_2"/>
+
+        <Button
+            android:layout_width="250px"
+            android:layout_height="100px"
+            android:text="@string/vertical_text_3"/>
+
+        <Button
+            android:layout_width="250px"
+            android:layout_height="100px"
+            android:text="@string/vertical_text_1"/>
+
+        <Button
+            android:layout_width="250px"
+            android:layout_height="100px"
+            android:text="@string/vertical_text_2"/>
+
+        <Button
+            android:layout_width="250px"
+            android:layout_height="100px"
+            android:text="@string/vertical_text_3"/>
+
+        <Button
+            android:layout_width="250px"
+            android:layout_height="100px"
+            android:text="@string/vertical_text_1"/>
+
+        <Button
+            android:layout_width="250px"
+            android:layout_height="100px"
+            android:text="@string/vertical_text_2"/>
+
+        <Button
+            android:layout_width="250px"
+            android:layout_height="100px"
+            android:text="@string/vertical_text_3"/>
+
+        <Button
+            android:layout_width="250px"
+            android:layout_height="100px"
+            android:text="@string/vertical_text_1"/>
+
+        <Button
+            android:layout_width="250px"
+            android:layout_height="100px"
+            android:text="@string/vertical_text_2"/>
+
+        <Button
+            android:layout_width="250px"
+            android:layout_height="100px"
+            android:text="@string/vertical_text_3"/>
+
+        <Button
+            android:layout_width="250px"
+            android:layout_height="100px"
+            android:text="@string/vertical_text_1"/>
+
+        <Button
+            android:layout_width="250px"
+            android:layout_height="100px"
+            android:text="@string/vertical_text_2"/>
+
+        <Button
+            android:id="@+id/last_horizontal_child"
+            android:layout_width="250px"
+            android:layout_height="100px"
+            android:text="@string/vertical_text_3"/>
+    </LinearLayout>
+
+</android.widget.cts.MyHorizontalScrollView>
diff --git a/tests/tests/widget/res/layout/imagebutton_test.xml b/tests/tests/widget/res/layout/imagebutton_test.xml
new file mode 100644
index 0000000..7d4b691
--- /dev/null
+++ b/tests/tests/widget/res/layout/imagebutton_test.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ * Copyright (C) 2008 The Android Open Source Project.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ -->
+<ImageButton xmlns:android="http://schemas.android.com/apk/res/android"
+    android:id="@+id/imagebutton"
+    android:layout_width="96px"
+    android:layout_height="76px"
+    android:soundEffectsEnabled="false"
+/>
+
diff --git a/tests/tests/widget/res/layout/imageswitcher_test.xml b/tests/tests/widget/res/layout/imageswitcher_test.xml
new file mode 100644
index 0000000..496b2ba
--- /dev/null
+++ b/tests/tests/widget/res/layout/imageswitcher_test.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ * Copyright (C) 2008 The Android Open Source Project.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ -->
+
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent">
+
+    <ImageSwitcher android:id="@+id/switcher"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:layout_alignParentTop="true"
+        android:layout_alignParentLeft="true"
+    />
+</RelativeLayout>
+
diff --git a/tests/tests/widget/res/layout/imageview_layout.xml b/tests/tests/widget/res/layout/imageview_layout.xml
new file mode 100644
index 0000000..e56a9c9
--- /dev/null
+++ b/tests/tests/widget/res/layout/imageview_layout.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+ * Copyright (C) 2008 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+-->
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:orientation="vertical"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent">
+
+    <ImageView
+        android:id="@+id/imageview"
+        android:layout_width="320px"
+        android:layout_height="240px"/>
+
+    <ImageView
+        android:id="@+id/image_tint"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:tint="@android:color/white"
+        android:tintMode="src_over" />
+
+</LinearLayout>
+
diff --git a/tests/tests/widget/res/layout/layoutdirection_layout.xml b/tests/tests/widget/res/layout/layoutdirection_layout.xml
new file mode 100644
index 0000000..e506dc1
--- /dev/null
+++ b/tests/tests/widget/res/layout/layoutdirection_layout.xml
@@ -0,0 +1,130 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ * Copyright (C) 2012 The Android Open Source Project.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ -->
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+              android:layout_width="match_parent"
+              android:layout_height="wrap_content"
+              android:orientation="vertical">
+
+    <LinearLayout android:id="@+id/layout_linearlayout_ltr"
+                  android:layout_width="wrap_content"
+                  android:layout_height="wrap_content"
+                  android:layoutDirection="ltr">
+
+        <LinearLayout android:id="@+id/layout_linearlayout_ltr_child_1"
+                      android:layout_width="wrap_content"
+                      android:layout_height="wrap_content"
+                      android:layoutDirection="ltr" />
+
+        <LinearLayout android:id="@+id/layout_linearlayout_ltr_child_2"
+                      android:layout_width="wrap_content"
+                      android:layout_height="wrap_content"
+                      android:layoutDirection="rtl" />
+
+        <LinearLayout android:id="@+id/layout_linearlayout_ltr_child_3"
+                      android:layout_width="wrap_content"
+                      android:layout_height="wrap_content"
+                      android:layoutDirection="inherit" />
+
+        <LinearLayout android:id="@+id/layout_linearlayout_ltr_child_4"
+                      android:layout_width="wrap_content"
+                      android:layout_height="wrap_content"
+                      android:layoutDirection="locale" />
+
+    </LinearLayout>
+
+    <LinearLayout android:id="@+id/layout_linearlayout_rtl"
+                  android:layout_width="wrap_content"
+                  android:layout_height="wrap_content"
+                  android:layoutDirection="rtl">
+
+        <LinearLayout android:id="@+id/layout_linearlayout_rtl_child_1"
+                      android:layout_width="wrap_content"
+                      android:layout_height="wrap_content"
+                      android:layoutDirection="ltr" />
+
+        <LinearLayout android:id="@+id/layout_linearlayout_rtl_child_2"
+                      android:layout_width="wrap_content"
+                      android:layout_height="wrap_content"
+                      android:layoutDirection="rtl" />
+
+        <LinearLayout android:id="@+id/layout_linearlayout_rtl_child_3"
+                      android:layout_width="wrap_content"
+                      android:layout_height="wrap_content"
+                      android:layoutDirection="inherit" />
+
+        <LinearLayout android:id="@+id/layout_linearlayout_rtl_child_4"
+                      android:layout_width="wrap_content"
+                      android:layout_height="wrap_content"
+                      android:layoutDirection="locale" />
+
+    </LinearLayout>
+
+    <LinearLayout android:id="@+id/layout_linearlayout_locale"
+                  android:layout_width="wrap_content"
+                  android:layout_height="wrap_content"
+                  android:layoutDirection="locale">
+
+        <LinearLayout android:id="@+id/layout_linearlayout_locale_child_1"
+                      android:layout_width="wrap_content"
+                      android:layout_height="wrap_content"
+                      android:layoutDirection="ltr" />
+
+        <LinearLayout android:id="@+id/layout_linearlayout_locale_child_2"
+                      android:layout_width="wrap_content"
+                      android:layout_height="wrap_content"
+                      android:layoutDirection="rtl" />
+
+        <LinearLayout android:id="@+id/layout_linearlayout_locale_child_3"
+                      android:layout_width="wrap_content"
+                      android:layout_height="wrap_content"
+                      android:layoutDirection="inherit" />
+
+        <LinearLayout android:id="@+id/layout_linearlayout_locale_child_4"
+                      android:layout_width="wrap_content"
+                      android:layout_height="wrap_content"
+                      android:layoutDirection="locale" />
+
+    </LinearLayout>
+
+    <LinearLayout android:id="@+id/layout_linearlayout_inherit"
+                  android:layout_width="wrap_content"
+                  android:layout_height="wrap_content"
+                  android:layoutDirection="inherit">
+
+        <LinearLayout android:id="@+id/layout_linearlayout_inherit_child_1"
+                      android:layout_width="wrap_content"
+                      android:layout_height="wrap_content"
+                      android:layoutDirection="ltr" />
+
+        <LinearLayout android:id="@+id/layout_linearlayout_inherit_child_2"
+                      android:layout_width="wrap_content"
+                      android:layout_height="wrap_content"
+                      android:layoutDirection="rtl" />
+
+        <LinearLayout android:id="@+id/layout_linearlayout_inherit_child_3"
+                      android:layout_width="wrap_content"
+                      android:layout_height="wrap_content"
+                      android:layoutDirection="inherit" />
+
+        <LinearLayout android:id="@+id/layout_linearlayout_inherit_child_4"
+                      android:layout_width="wrap_content"
+                      android:layout_height="wrap_content"
+                      android:layoutDirection="locale" />
+
+    </LinearLayout>
+
+</LinearLayout>
diff --git a/tests/tests/widget/res/layout/linearlayout_layout.xml b/tests/tests/widget/res/layout/linearlayout_layout.xml
new file mode 100644
index 0000000..c70937d
--- /dev/null
+++ b/tests/tests/widget/res/layout/linearlayout_layout.xml
@@ -0,0 +1,137 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ * Copyright (C) 2008 The Android Open Source Project.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ -->
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:orientation="vertical">
+
+    <LinearLayout android:id="@+id/horizontal"
+        android:orientation="horizontal"
+        android:layout_width="wrap_content"
+        android:layout_height="100dip"
+        android:background="#FF909090">
+
+        <TextView android:id="@+id/gravity_top"
+            android:background="#FF00FF00"
+            android:layout_width="wrap_content"
+            android:layout_height="50dip"
+            android:layout_gravity="top"
+            android:text="@string/horizontal_text_1"/>
+
+        <TextView android:id="@+id/gravity_center_vertical"
+            android:background="#FF00FF00"
+            android:layout_width="wrap_content"
+            android:layout_height="50dip"
+            android:layout_gravity="center_vertical"
+            android:text="@string/horizontal_text_2"/>
+
+        <TextView android:id="@+id/gravity_bottom"
+            android:background="#FF00FF00"
+            android:layout_width="wrap_content"
+            android:layout_height="50dip"
+            android:layout_gravity="bottom"
+            android:text="@string/horizontal_text_3"/>
+    </LinearLayout>
+
+    <LinearLayout android:id="@+id/vertical"
+        android:orientation="vertical"
+        android:layout_width="100dip"
+        android:layout_height="wrap_content"
+        android:background="#FFFF0909">
+
+        <TextView android:id="@+id/gravity_left"
+            android:background="#FF00FF00"
+            android:layout_width="wrap_content"
+            android:layout_height="20dip"
+            android:layout_gravity="left"
+            android:text="@string/vertical_text_1"/>
+
+        <TextView android:id="@+id/gravity_center_horizontal"
+            android:background="#FF0000FF"
+            android:layout_width="wrap_content"
+            android:layout_height="20dip"
+            android:layout_gravity="center_horizontal"
+            android:text="@string/vertical_text_2"/>
+
+        <TextView android:id="@+id/gravity_right"
+            android:background="#FF00FF00"
+            android:layout_width="wrap_content"
+            android:layout_height="20dip"
+            android:layout_gravity="right"
+            android:text="@string/vertical_text_3"/>
+    </LinearLayout>
+
+    <LinearLayout android:id="@+id/weightsum"
+        android:orientation="horizontal"
+        android:weightSum="1.0"
+        android:baselineAligned="false"
+        android:layout_width="100dip"
+        android:layout_height="100dip"
+        android:background="#FF909090">
+
+        <TextView android:id="@+id/weight_0_2"
+            android:background="#FF0000FF"
+            android:layout_width="0dip"
+            android:layout_height="wrap_content"
+            android:layout_weight="0.2"
+            android:text="@string/horizontal_text_1"/>
+
+        <TextView android:id="@+id/weight_0_5"
+            android:background="#FFF00F0F"
+            android:layout_width="0dip"
+            android:layout_height="wrap_content"
+            android:layout_weight="0.5"
+            android:text="@string/horizontal_text_2"/>
+
+        <TextView android:id="@+id/weight_0_3"
+            android:background="#FF0000FF"
+            android:layout_width="0dip"
+            android:layout_height="wrap_content"
+            android:layout_weight="0.3"
+            android:text="@string/horizontal_text_3"/>
+    </LinearLayout>
+
+    <LinearLayout android:id="@+id/baseline_aligned_child_index"
+        android:orientation="vertical"
+        android:baselineAlignedChildIndex="1"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:background="#FFFF0909">
+
+        <TextView android:id="@+id/textview1"
+            android:background="#FF00FF00"
+            android:layout_width="wrap_content"
+            android:layout_height="20dip"
+            android:layout_gravity="left"
+            android:text="@string/vertical_text_1"/>
+
+        <TextView android:id="@+id/textview2"
+            android:background="#FF0000FF"
+            android:layout_width="wrap_content"
+            android:layout_height="20dip"
+            android:layout_gravity="center_horizontal"
+            android:text="@string/vertical_text_2"/>
+
+        <TextView android:id="@+id/textview3"
+            android:background="#FF00FF00"
+            android:layout_width="wrap_content"
+            android:layout_height="20dip"
+            android:layout_gravity="right"
+            android:text="@string/vertical_text_3"/>
+    </LinearLayout>
+
+</LinearLayout>
diff --git a/tests/tests/widget/res/layout/listview_layout.xml b/tests/tests/widget/res/layout/listview_layout.xml
new file mode 100644
index 0000000..ee8b6de
--- /dev/null
+++ b/tests/tests/widget/res/layout/listview_layout.xml
@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2008 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:orientation="vertical"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content">
+
+    <TextView android:id="@+id/headerview1"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:text="@string/header_view" />
+
+    <TextView android:id="@+id/headerview2"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:text="@string/header_view" />
+
+    <ListView android:id="@+id/listview_default"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"/>
+
+    <TextView android:id="@+id/footerview1"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:text="@string/footer_view" />
+
+    <TextView android:id="@+id/footerview2"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:text="@string/footer_view" />
+</LinearLayout>
+
diff --git a/tests/tests/widget/res/layout/mediacontroller_layout.xml b/tests/tests/widget/res/layout/mediacontroller_layout.xml
new file mode 100644
index 0000000..871adf4
--- /dev/null
+++ b/tests/tests/widget/res/layout/mediacontroller_layout.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ * Copyright (C) 2008 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ -->
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:orientation="vertical"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent">
+
+    <VideoView
+        android:id="@+id/mediacontroller_videoview"
+        android:layout_width="320px"
+        android:layout_height="240px"/>
+
+</LinearLayout>
+
diff --git a/tests/tests/widget/res/layout/multi_auto_complete_text_view_layout.xml b/tests/tests/widget/res/layout/multi_auto_complete_text_view_layout.xml
new file mode 100644
index 0000000..50109c8
--- /dev/null
+++ b/tests/tests/widget/res/layout/multi_auto_complete_text_view_layout.xml
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:orientation="vertical"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content">
+
+    <TextView
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:text="@string/text_country" />
+
+    <MultiAutoCompleteTextView android:id="@+id/country_edit"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"/>
+
+    <TextView
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:text="@string/text_name" />
+
+    <MultiAutoCompleteTextView android:id="@+id/name_edit"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"/>
+
+</LinearLayout>
+
diff --git a/tests/tests/widget/res/layout/popupwindow.xml b/tests/tests/widget/res/layout/popupwindow.xml
new file mode 100644
index 0000000..e6b0aed
--- /dev/null
+++ b/tests/tests/widget/res/layout/popupwindow.xml
@@ -0,0 +1,52 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2008 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:orientation="vertical">
+
+    <TextView android:id="@+id/anchor_upper"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:text="@string/text_view_hint"
+        android:layout_weight="1"/>
+
+    <LinearLayout android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:layout_weight="1">
+
+        <TextView android:id="@+id/anchor_middle_left"
+            android:layout_width="wrap_content"
+            android:layout_height="match_parent"
+            android:text="@string/text_view_hint"
+            android:layout_weight="1"/>
+
+        <TextView android:id="@+id/anchor_middle_right"
+            android:layout_width="wrap_content"
+            android:layout_height="match_parent"
+            android:text="@string/text_view_hint"
+            android:layout_weight="1"/>
+
+    </LinearLayout>
+
+    <TextView android:id="@+id/anchor_lower"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:text="@string/text_view_hint"
+        android:layout_weight="1"/>
+
+</LinearLayout>
diff --git a/tests/tests/widget/res/layout/progressbar_layout.xml b/tests/tests/widget/res/layout/progressbar_layout.xml
new file mode 100644
index 0000000..a1786b8
--- /dev/null
+++ b/tests/tests/widget/res/layout/progressbar_layout.xml
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2014 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent">
+
+    <ProgressBar
+        android:id="@+id/progress_tint"
+        android:progressTint="@android:color/white"
+        android:progressTintMode="src_over"
+        android:progressBackgroundTint="@android:color/white"
+        android:progressBackgroundTintMode="src_over"
+        android:secondaryProgressTint="@android:color/white"
+        android:secondaryProgressTintMode="src_over"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        style="@android:style/Widget.ProgressBar.Horizontal" />
+
+    <ProgressBar
+        android:id="@+id/indeterminate_tint"
+        android:indeterminateTint="@android:color/white"
+        android:indeterminateTintMode="src_over"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        style="@android:style/Widget.ProgressBar.Large" />
+
+</LinearLayout>
diff --git a/tests/tests/widget/res/layout/radiogroup_1.xml b/tests/tests/widget/res/layout/radiogroup_1.xml
new file mode 100644
index 0000000..1e9db83
--- /dev/null
+++ b/tests/tests/widget/res/layout/radiogroup_1.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2008 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<RadioGroup xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:orientation="vertical"
+    android:layout_weight="0.5"
+    android:layout_gravity="bottom"
+    android:layout_margin="5px">
+</RadioGroup>
+
diff --git a/tests/tests/widget/res/layout/ratingbar_layout.xml b/tests/tests/widget/res/layout/ratingbar_layout.xml
new file mode 100644
index 0000000..acc7fa8
--- /dev/null
+++ b/tests/tests/widget/res/layout/ratingbar_layout.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2008 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+                android:layout_width="match_parent"
+                android:layout_height="match_parent"
+                android:orientation="vertical">
+
+    <RatingBar android:id="@+id/ratingbar_constructor"
+        android:isIndicator="false"
+        android:numStars="50"
+        android:rating="1.2"
+        android:stepSize="0.2"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_weight="1"/>
+
+</LinearLayout>
diff --git a/tests/tests/widget/res/layout/relative_layout.xml b/tests/tests/widget/res/layout/relative_layout.xml
new file mode 100644
index 0000000..db4b2e8
--- /dev/null
+++ b/tests/tests/widget/res/layout/relative_layout.xml
@@ -0,0 +1,258 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2008 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent">
+
+    <RelativeLayout
+        android:id="@+id/relative_sublayout_attrs"
+        android:background="@drawable/blue"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent">
+
+        <!-- view1, centered within its parent. -->
+        <TextView
+            android:id="@+id/relative_view1"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_centerInParent="true"
+            android:text="@string/relative_view1"/>
+
+        <!-- view2, below view1 and has same left position with view1. -->
+        <TextView
+            android:id="@+id/relative_view2"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_below="@id/relative_view1"
+            android:layout_alignLeft="@id/relative_view1"
+            android:text="@string/relative_view2"/>
+
+        <!-- view3, has same top position with view1 and same bottom position with view2,
+             and on the right of view1. -->
+        <TextView
+            android:id="@+id/relative_view3"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_alignTop="@id/relative_view1"
+            android:layout_alignBottom="@id/relative_view2"
+            android:layout_toRightOf="@id/relative_view1"
+            android:text="@string/relative_view3"/>
+
+        <!-- view4, has same right position with view3 and above view3. -->
+        <TextView
+            android:id="@+id/relative_view4"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_alignRight="@id/relative_view3"
+            android:layout_above="@id/relative_view3"
+            android:text="@string/relative_view4"/>
+
+        <!-- view5 goes on the left-bottom -->
+        <TextView
+            android:id="@+id/relative_view5"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_alignParentBottom="true"
+            android:layout_alignParentLeft="true"
+            android:text="@string/relative_view5"/>
+
+        <!-- view6 goes on the top-right -->
+        <TextView
+            android:id="@+id/relative_view6"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_alignParentTop="true"
+            android:layout_alignParentRight="true"
+            android:text="@string/relative_view6"/>
+
+        <!-- view7, has same baseline with view6 and centered horizontally within its parent. -->
+        <TextView
+            android:id="@+id/relative_view7"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_alignBaseline="@id/relative_view6"
+            android:layout_centerHorizontal="true"
+            android:text="@string/relative_view7"/>
+
+        <!-- view8, centered vertically within its parent and on the left of view1. -->
+        <TextView
+            android:id="@+id/relative_view8"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_toLeftOf="@id/relative_view1"
+            android:layout_centerVertical="true"
+            android:text="@string/relative_view8"/>
+
+        <!-- view9, has same top and bottom position with view3 and same left position
+             with its parent. -->
+        <TextView
+            android:id="@+id/relative_view9"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_alignLeft="@id/gravity_bottom"
+            android:layout_alignTop="@id/relative_view3"
+            android:layout_alignBottom="@id/relative_view3"
+            android:layout_alignWithParentIfMissing="true"
+            android:text="@string/relative_view9"/>
+
+    </RelativeLayout>
+
+    <RelativeLayout
+        android:id="@+id/relative_sublayout_gravity"
+        android:background="@drawable/yellow"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent">
+
+        <!-- view10 -->
+        <TextView
+            android:id="@+id/relative_view10"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:text="@string/relative_view10"/>
+
+        <!-- view11 -->
+        <TextView
+            android:id="@+id/relative_view11"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_below="@id/relative_view10"
+            android:text="@string/relative_view11"/>
+    </RelativeLayout>
+
+    <RelativeLayout
+        android:id="@+id/relative_sublayout_ignore_gravity"
+        android:background="@drawable/red"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:ignoreGravity="@+id/relative_view12"
+        android:gravity="right">
+
+        <!-- view12 -->
+        <TextView
+            android:id="@id/relative_view12"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:text="@string/relative_view12"/>
+
+        <!-- view13 -->
+        <TextView
+            android:id="@+id/relative_view13"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:text="@string/relative_view13"/>
+    </RelativeLayout>
+
+    <Spinner
+        android:id="@+id/spinner1"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:prompt="@string/text_view_hello"/>
+
+    <RelativeLayout
+            android:id="@+id/relative_sublayout_attrs_2"
+            android:background="@drawable/blue"
+            android:layout_width="match_parent"
+            android:layout_height="match_parent">
+
+        <!-- view21, centered within its parent. -->
+        <TextView
+                android:id="@+id/relative_view21"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_centerInParent="true"
+                android:text="@string/relative_view1"/>
+
+        <!-- view22, below view1 and has same start position with view21. -->
+        <TextView
+                android:id="@+id/relative_view22"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_below="@id/relative_view21"
+                android:layout_alignStart="@id/relative_view21"
+                android:text="@string/relative_view2"/>
+
+        <!-- view23, has same top position with view21 and same bottom position with view22,
+             and on the end of view1. -->
+        <TextView
+                android:id="@+id/relative_view23"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_alignTop="@id/relative_view21"
+                android:layout_alignBottom="@id/relative_view22"
+                android:layout_toEndOf="@id/relative_view21"
+                android:text="@string/relative_view3"/>
+
+        <!-- view24, has same end position with view23 and above view23. -->
+        <TextView
+                android:id="@+id/relative_view24"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_alignEnd="@id/relative_view23"
+                android:layout_above="@id/relative_view23"
+                android:text="@string/relative_view4"/>
+
+        <!-- view25 goes on the start-bottom -->
+        <TextView
+                android:id="@+id/relative_view25"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_alignParentBottom="true"
+                android:layout_alignParentStart="true"
+                android:text="@string/relative_view5"/>
+
+        <!-- view26 goes on the top-end -->
+        <TextView
+                android:id="@+id/relative_view26"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_alignParentTop="true"
+                android:layout_alignParentEnd="true"
+                android:text="@string/relative_view6"/>
+
+        <!-- view27, has same baseline with view26 and centered horizontally within its parent. -->
+        <TextView
+                android:id="@+id/relative_view27"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_alignBaseline="@id/relative_view26"
+                android:layout_centerHorizontal="true"
+                android:text="@string/relative_view7"/>
+
+        <!-- view28, centered vertically within its parent and on the start of view21. -->
+        <TextView
+                android:id="@+id/relative_view28"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_toStartOf="@id/relative_view21"
+                android:layout_centerVertical="true"
+                android:text="@string/relative_view8"/>
+
+        <!-- view29, has same top and bottom position with view23 and same start position
+             with its parent. -->
+        <TextView
+                android:id="@+id/relative_view29"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_alignStart="@id/gravity_bottom"
+                android:layout_alignTop="@id/relative_view23"
+                android:layout_alignBottom="@id/relative_view23"
+                android:layout_alignWithParentIfMissing="true"
+                android:text="@string/relative_view9"/>
+
+    </RelativeLayout>
+
+</RelativeLayout>
diff --git a/tests/tests/widget/res/layout/remote_view_test_bad_1.xml b/tests/tests/widget/res/layout/remote_view_test_bad_1.xml
new file mode 100644
index 0000000..a65a5ec
--- /dev/null
+++ b/tests/tests/widget/res/layout/remote_view_test_bad_1.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+**
+** Copyright 2008, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+**     http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+-->
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:id="@+id/linear"
+    android:orientation="vertical"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent">
+
+    <EditText android:id="@+id/edit"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content" />
+
+</LinearLayout>
diff --git a/tests/tests/widget/res/layout/remote_view_test_bad_2.xml b/tests/tests/widget/res/layout/remote_view_test_bad_2.xml
new file mode 100644
index 0000000..92623d8
--- /dev/null
+++ b/tests/tests/widget/res/layout/remote_view_test_bad_2.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+**
+** Copyright 2008, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+**     http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+-->
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:id="@+id/linear"
+    android:orientation="vertical"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent">
+
+    <WebView android:id="@+id/web"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content" />
+
+</LinearLayout>
diff --git a/tests/tests/widget/res/layout/remote_view_test_good.xml b/tests/tests/widget/res/layout/remote_view_test_good.xml
new file mode 100644
index 0000000..3df9d62
--- /dev/null
+++ b/tests/tests/widget/res/layout/remote_view_test_good.xml
@@ -0,0 +1,59 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+**
+** Copyright 2008, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+**     http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+-->
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:id="@+id/linear"
+    android:orientation="vertical"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent">
+
+    <TextView android:id="@+id/text"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content" />
+
+    <ImageView android:id="@+id/image"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content" />
+
+    <FrameLayout android:id="@+id/frame"
+        android:layout_width="10dip"
+        android:layout_height="10dip" />
+
+    <RelativeLayout android:id="@+id/relative"
+        android:layout_width="10dip"
+        android:layout_height="10dip" />
+
+    <AbsoluteLayout android:id="@+id/absolute"
+        android:layout_width="10dip"
+        android:layout_height="10dip" />
+
+    <ProgressBar android:id="@+id/progress"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content" />
+
+    <ImageButton android:id="@+id/image_button"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content" />
+
+    <Button android:id="@+id/button"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content" />
+
+</LinearLayout>
diff --git a/tests/tests/widget/res/layout/remoteviews_good.xml b/tests/tests/widget/res/layout/remoteviews_good.xml
new file mode 100644
index 0000000..8fdbc64
--- /dev/null
+++ b/tests/tests/widget/res/layout/remoteviews_good.xml
@@ -0,0 +1,56 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2008 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:id="@+id/remoteViews_good"
+    android:orientation="vertical"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent">
+
+    <LinearLayout android:id="@+id/remoteView_linear"
+        android:layout_width="10dip"
+        android:layout_height="10dip" />
+
+    <TextView android:id="@+id/remoteView_text"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content" />
+
+    <ImageView android:id="@+id/remoteView_image"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content" />
+
+    <FrameLayout android:id="@+id/remoteView_frame"
+        android:layout_width="10dip"
+        android:layout_height="10dip" />
+
+    <RelativeLayout android:id="@+id/remoteView_relative"
+        android:layout_width="10dip"
+        android:layout_height="10dip" />
+
+    <AbsoluteLayout android:id="@+id/remoteView_absolute"
+        android:layout_width="10dip"
+        android:layout_height="10dip" />
+
+    <ProgressBar android:id="@+id/remoteView_progress"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        style="?android:attr/progressBarStyleHorizontal" />
+
+    <Chronometer android:id="@+id/remoteView_chronometer"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content" />
+
+</LinearLayout>
diff --git a/tests/tests/widget/res/layout/remoteviews_host.xml b/tests/tests/widget/res/layout/remoteviews_host.xml
new file mode 100644
index 0000000..ace5903
--- /dev/null
+++ b/tests/tests/widget/res/layout/remoteviews_host.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2008 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:orientation="vertical"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:id="@+id/remoteView_host">
+</LinearLayout>
diff --git a/tests/tests/widget/res/layout/scrollview_layout.xml b/tests/tests/widget/res/layout/scrollview_layout.xml
new file mode 100644
index 0000000..3c9a474
--- /dev/null
+++ b/tests/tests/widget/res/layout/scrollview_layout.xml
@@ -0,0 +1,105 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2008 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<android.widget.cts.MyScrollView xmlns:android="http://schemas.android.com/apk/res/android"
+    android:id="@+id/scroll_view"
+    android:layout_width="100dip"
+    android:layout_height="100dip">
+
+    <LinearLayout
+        android:orientation="vertical"
+        android:layout_width="250dip"
+        android:layout_height="wrap_content">
+
+        <Button
+            android:id="@+id/first_child"
+            android:layout_width="250dip"
+            android:layout_height="100dip"
+            android:text="@string/vertical_text_1"/>
+
+        <Button
+            android:layout_width="250dip"
+            android:layout_height="100dip"
+            android:text="@string/vertical_text_2"/>
+
+        <Button
+            android:layout_width="250dip"
+            android:layout_height="100dip"
+            android:text="@string/vertical_text_3"/>
+
+        <Button
+            android:layout_width="250dip"
+            android:layout_height="100dip"
+            android:text="@string/vertical_text_1"/>
+
+        <Button
+            android:layout_width="250dip"
+            android:layout_height="100dip"
+            android:text="@string/vertical_text_2"/>
+
+        <Button
+            android:layout_width="250dip"
+            android:layout_height="100dip"
+            android:text="@string/vertical_text_3"/>
+
+        <Button
+            android:layout_width="250dip"
+            android:layout_height="100dip"
+            android:text="@string/vertical_text_1"/>
+
+        <Button
+            android:layout_width="250dip"
+            android:layout_height="100dip"
+            android:text="@string/vertical_text_2"/>
+
+        <Button
+            android:layout_width="250dip"
+            android:layout_height="100dip"
+            android:text="@string/vertical_text_3"/>
+
+        <Button
+            android:layout_width="250dip"
+            android:layout_height="100dip"
+            android:text="@string/vertical_text_1"/>
+
+        <Button
+            android:layout_width="250dip"
+            android:layout_height="100dip"
+            android:text="@string/vertical_text_2"/>
+
+        <Button
+            android:layout_width="250dip"
+            android:layout_height="100dip"
+            android:text="@string/vertical_text_3"/>
+
+        <Button
+            android:layout_width="250dip"
+            android:layout_height="100dip"
+            android:text="@string/vertical_text_1"/>
+
+        <Button
+            android:layout_width="250dip"
+            android:layout_height="100dip"
+            android:text="@string/vertical_text_2"/>
+
+        <Button
+            android:id="@+id/last_child"
+            android:layout_width="250dip"
+            android:layout_height="100dip"
+            android:text="@string/vertical_text_3"/>
+    </LinearLayout>
+
+</android.widget.cts.MyScrollView>
diff --git a/tests/tests/widget/res/layout/seekbar_layout.xml b/tests/tests/widget/res/layout/seekbar_layout.xml
new file mode 100644
index 0000000..5c311fd
--- /dev/null
+++ b/tests/tests/widget/res/layout/seekbar_layout.xml
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2008 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent">
+
+     <SeekBar android:id="@+id/seekBar"
+         android:layout_width="match_parent"
+         android:layout_height="wrap_content"
+         android:max="100"
+         android:progress="50"
+         android:secondaryProgress="75" />
+
+    <SeekBar
+        android:id="@+id/thumb_tint"
+        android:thumbTint="@android:color/white"
+        android:thumbTintMode="src_over"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content" />
+
+</LinearLayout>
diff --git a/tests/tests/widget/res/layout/simple_dropdown_item_1line.xml b/tests/tests/widget/res/layout/simple_dropdown_item_1line.xml
new file mode 100644
index 0000000..9a044b1
--- /dev/null
+++ b/tests/tests/widget/res/layout/simple_dropdown_item_1line.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2008 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<TextView xmlns:android="http://schemas.android.com/apk/res/android"
+    android:id="@+id/text1"
+    style="?android:attr/dropDownItemStyle"
+    android:textAppearance="?android:attr/textAppearanceLargeInverse"
+    android:singleLine="true"
+    android:layout_width="match_parent"
+    android:layout_height="?android:attr/listPreferredItemHeight" />
diff --git a/tests/tests/widget/res/layout/simple_spinner_item.xml b/tests/tests/widget/res/layout/simple_spinner_item.xml
new file mode 100644
index 0000000..d52922a
--- /dev/null
+++ b/tests/tests/widget/res/layout/simple_spinner_item.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2008 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<TextView xmlns:android="http://schemas.android.com/apk/res/android"
+    android:id="@android:id/text1"
+    style="?android:attr/spinnerItemStyle"
+    android:singleLine="true"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content" />
diff --git a/tests/tests/widget/res/layout/sliding_drawer_layout.xml b/tests/tests/widget/res/layout/sliding_drawer_layout.xml
new file mode 100644
index 0000000..3f84d46
--- /dev/null
+++ b/tests/tests/widget/res/layout/sliding_drawer_layout.xml
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent">
+
+    <SlidingDrawer
+        android:id="@+id/drawer"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:animateOnClick="false"
+
+        android:handle="@+id/handle"
+        android:content="@+id/content">
+
+        <ImageView
+            android:id="@id/handle"
+            android:background="#FF00FF00"
+            android:layout_width="88dip"
+            android:layout_height="44dip" />
+
+        <TextView
+            android:id="@id/content"
+            android:background="#FF0000FF"
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"
+            android:text="@string/hello_world" />
+
+    </SlidingDrawer>
+
+</RelativeLayout>
diff --git a/tests/tests/widget/res/layout/tabhost_layout.xml b/tests/tests/widget/res/layout/tabhost_layout.xml
new file mode 100644
index 0000000..1bae57a
--- /dev/null
+++ b/tests/tests/widget/res/layout/tabhost_layout.xml
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2008 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<TabHost xmlns:android="http://schemas.android.com/apk/res/android"
+    android:id="@android:id/tabhost"
+    android:layout_width="wrap_content"
+    android:layout_height="wrap_content">
+
+    <TabWidget android:id="@android:id/tabs"
+        android:layout_width="match_parent"
+        android:layout_height="68dip"
+        android:paddingLeft="1dip"
+        android:paddingRight="1dip"
+        android:paddingTop="4dip"
+    />
+
+    <FrameLayout android:id="@android:id/tabcontent"
+        android:layout_width="match_parent"
+        android:layout_height="0dip"
+        android:layout_weight="1">
+
+        <TextView android:id="@+id/tabhost_textview"
+            android:password="true"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:text="@string/hello_world"/>
+
+        <ListView android:id="@+id/tabhost_listview"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"/>
+    </FrameLayout>
+</TabHost>
diff --git a/tests/tests/widget/res/layout/table_layout_1.xml b/tests/tests/widget/res/layout/table_layout_1.xml
new file mode 100644
index 0000000..0896cd2
--- /dev/null
+++ b/tests/tests/widget/res/layout/table_layout_1.xml
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2008 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:id="@+id/table1"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:collapseColumns="0"
+    android:stretchColumns="2">
+
+    <TableRow>
+        <TextView
+            android:text="@string/table_layout_first"
+            android:padding="3dip" />
+        <TextView
+            android:text="@string/table_layout_second"
+            android:padding="3dip" />
+        <TextView
+            android:text="@string/table_layout_third"
+            android:padding="3dip" />
+    </TableRow>
+</TableLayout>
+
diff --git a/tests/tests/widget/res/layout/table_layout_2.xml b/tests/tests/widget/res/layout/table_layout_2.xml
new file mode 100644
index 0000000..84750fc
--- /dev/null
+++ b/tests/tests/widget/res/layout/table_layout_2.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2008 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:id="@+id/table2"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:shrinkColumns="1">
+
+    <TableRow>
+        <TextView
+            android:layout_column="1"
+            android:text="@string/table_layout_long"
+            android:padding="3dip" />
+        <TextView
+            android:layout_span="2"
+            android:text="@string/table_layout_second"
+            android:padding="3dip" />
+        <TextView
+            android:text="@string/table_layout_third"
+            android:padding="3dip" />
+    </TableRow>
+</TableLayout>
+
diff --git a/tests/tests/widget/res/layout/textview_autolink.xml b/tests/tests/widget/res/layout/textview_autolink.xml
new file mode 100644
index 0000000..53d89f3
--- /dev/null
+++ b/tests/tests/widget/res/layout/textview_autolink.xml
@@ -0,0 +1,65 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2008 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content">
+
+    <TextView android:id="@+id/autolink_default"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"/>
+
+    <TextView android:id="@+id/autolink_web"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:autoLink="web"/>
+
+    <TextView android:id="@+id/autolink_email"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:autoLink="email"/>
+
+    <TextView android:id="@+id/autolink_phone"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:autoLink="phone"/>
+
+    <TextView android:id="@+id/autolink_all"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:autoLink="all"/>
+
+    <TextView android:id="@+id/autolink_compound1"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:autoLink="web|email"/>
+
+    <TextView android:id="@+id/autolink_compound2"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:autoLink="web|phone"/>
+
+    <TextView android:id="@+id/autolink_compound3"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:autoLink="email|phone"/>
+
+    <TextView android:id="@+id/autolink_compound4"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:autoLink="phone|all"/>
+
+</FrameLayout>
diff --git a/tests/tests/widget/res/layout/textview_ellipsize.xml b/tests/tests/widget/res/layout/textview_ellipsize.xml
new file mode 100644
index 0000000..0fc5779
--- /dev/null
+++ b/tests/tests/widget/res/layout/textview_ellipsize.xml
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2008 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content">
+
+    <TextView android:id="@+id/ellipsize_default"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"/>
+
+    <TextView android:id="@+id/ellipsize_none"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:ellipsize="none"/>
+
+    <TextView android:id="@+id/ellipsize_start"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:ellipsize="start"/>
+
+    <TextView android:id="@+id/ellipsize_middle"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:ellipsize="middle"/>
+
+    <TextView android:id="@+id/ellipsize_end"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:ellipsize="end"/>
+
+</LinearLayout>
diff --git a/tests/tests/widget/res/layout/textview_gravity.xml b/tests/tests/widget/res/layout/textview_gravity.xml
new file mode 100644
index 0000000..a4a7592
--- /dev/null
+++ b/tests/tests/widget/res/layout/textview_gravity.xml
@@ -0,0 +1,50 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2008 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content">
+
+    <TextView android:id="@+id/gravity_default"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"/>
+
+    <TextView android:id="@+id/gravity_bottom"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:gravity="bottom"/>
+
+    <TextView android:id="@+id/gravity_right"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:gravity="right"/>
+
+    <TextView android:id="@+id/gravity_fill"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:gravity="fill"/>
+
+    <TextView android:id="@+id/gravity_center"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:gravity="center"/>
+
+    <TextView android:id="@+id/gravity_center_vertical_right"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:gravity="center_vertical|right"/>
+
+</LinearLayout>
diff --git a/tests/tests/widget/res/layout/textview_hint_linksclickable_freezestext.xml b/tests/tests/widget/res/layout/textview_hint_linksclickable_freezestext.xml
new file mode 100644
index 0000000..a22e429
--- /dev/null
+++ b/tests/tests/widget/res/layout/textview_hint_linksclickable_freezestext.xml
@@ -0,0 +1,60 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2008 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content">
+
+    <TextView android:id="@+id/hint_linksClickable_freezesText_default"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"/>
+
+    <TextView android:id="@+id/hint_blank"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:hint=""/>
+
+    <TextView android:id="@+id/hint_string"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:hint="@string/text_view_simple_hint"/>
+
+    <TextView android:id="@+id/hint_resid"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:hint="@string/text_view_hint"/>
+
+    <TextView android:id="@+id/linksClickable_true"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:linksClickable="true"/>
+
+    <TextView android:id="@+id/linksClickable_false"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:linksClickable="false"/>
+
+    <TextView android:id="@+id/freezesText_true"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:freezesText="true"/>
+
+    <TextView android:id="@+id/freezesText_false"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:freezesText="false"/>
+
+</LinearLayout>
diff --git a/tests/tests/widget/res/layout/textview_layout.xml b/tests/tests/widget/res/layout/textview_layout.xml
new file mode 100644
index 0000000..c2cd159
--- /dev/null
+++ b/tests/tests/widget/res/layout/textview_layout.xml
@@ -0,0 +1,219 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2008 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:id="@+id/layout_textviewtest">
+
+    <ScrollView android:layout_width="match_parent"
+            android:layout_height="match_parent">
+
+        <LinearLayout android:orientation="vertical"
+                android:layout_width="match_parent"
+                android:layout_height="match_parent">
+
+            <TextView android:id="@+id/textview_textAttr"
+                    android:text="@string/text_view_hello"
+                    android:textColor="@drawable/black"
+                    android:textColorHighlight="@drawable/yellow"
+                    android:textColorHint="@drawable/red"
+                    android:textColorLink="@drawable/blue"
+                    android:textScaleX="1.2"
+                    android:typeface="normal"
+                    android:textSize="20px"
+                    android:textStyle="normal"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"/>
+
+            <TextView android:id="@+id/textview_password"
+                    android:password="true"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"/>
+
+            <TextView android:id="@+id/textview_singleLine"
+                    android:singleLine="true"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"/>
+
+            <TextView android:id="@+id/textview_text"
+                    android:text="@string/text_view_hello"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"/>
+
+            <TextView android:id="@+id/textview_text_two_lines"
+                    android:text="@string/text_view_hello_two_lines"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"/>
+
+            <android.widget.cts.MockTextView
+                    android:id="@+id/mock_textview_left"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:requiresFadingEdge="horizontal"
+                    android:singleLine="true"
+                    android:text="@string/long_text"
+                    android:gravity="left"
+                    />
+
+            <android.widget.cts.MockTextView
+                    android:id="@+id/mock_textview_right"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:requiresFadingEdge="horizontal"
+                    android:singleLine="true"
+                    android:text="@string/long_text"
+                    android:gravity="right"
+                    />
+
+            <android.widget.cts.MockTextView
+                    android:id="@+id/mock_textview_center"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:requiresFadingEdge="horizontal"
+                    android:singleLine="true"
+                    android:text="@string/long_text"
+                    android:gravity="center"
+                    />
+        </LinearLayout>
+
+    </ScrollView>
+
+    <TextView android:id="@+id/textview_ltr"
+              android:layout_height="wrap_content"
+              android:layout_width="wrap_content"/>
+
+    <TextView android:id="@+id/textview_rtl"
+              android:layout_height="wrap_content"
+              android:layout_width="wrap_content"/>
+
+    <TextView android:id="@+id/textview_drawable_1_1"
+              android:layout_height="wrap_content"
+              android:layout_width="wrap_content"
+              android:drawableLeft="@drawable/icon_blue"
+              android:drawableRight="@drawable/icon_red"
+              android:drawableTop="@drawable/icon_green"
+              android:drawableBottom="@drawable/icon_yellow"
+            />
+
+    <TextView android:id="@+id/textview_drawable_1_2"
+              android:layout_height="wrap_content"
+              android:layout_width="wrap_content"
+              android:drawableLeft="@drawable/icon_blue"
+              android:drawableRight="@drawable/icon_red"
+              android:drawableTop="@drawable/icon_green"
+              android:drawableBottom="@drawable/icon_yellow"
+              android:layoutDirection="rtl"
+            />
+
+    <TextView android:id="@+id/textview_drawable_2_1"
+              android:layout_height="wrap_content"
+              android:layout_width="wrap_content"
+              android:drawableStart="@drawable/icon_blue"
+              android:drawableEnd="@drawable/icon_red"
+              android:drawableTop="@drawable/icon_green"
+              android:drawableBottom="@drawable/icon_yellow"
+            />
+
+    <TextView android:id="@+id/textview_drawable_2_2"
+              android:layout_height="wrap_content"
+              android:layout_width="wrap_content"
+              android:drawableStart="@drawable/icon_blue"
+              android:drawableEnd="@drawable/icon_red"
+              android:drawableTop="@drawable/icon_green"
+              android:drawableBottom="@drawable/icon_yellow"
+              android:layoutDirection="rtl"
+            />
+
+    <TextView android:id="@+id/textview_drawable_3_1"
+              android:layout_height="wrap_content"
+              android:layout_width="wrap_content"
+              android:drawableLeft="@drawable/icon_black"
+              android:drawableRight="@drawable/icon_black"
+              android:drawableStart="@drawable/icon_blue"
+              android:drawableEnd="@drawable/icon_red"
+              android:drawableTop="@drawable/icon_green"
+              android:drawableBottom="@drawable/icon_yellow"
+            />
+
+    <TextView android:id="@+id/textview_drawable_3_2"
+              android:layout_height="wrap_content"
+              android:layout_width="wrap_content"
+              android:drawableLeft="@drawable/icon_black"
+              android:drawableRight="@drawable/icon_black"
+              android:drawableStart="@drawable/icon_blue"
+              android:drawableEnd="@drawable/icon_red"
+              android:drawableTop="@drawable/icon_green"
+              android:drawableBottom="@drawable/icon_yellow"
+              android:layoutDirection="rtl"
+            />
+
+
+    <LinearLayout android:orientation="vertical"
+                  android:layout_width="match_parent"
+                  android:layout_height="match_parent"
+                  android:layoutDirection="ltr">
+
+        <TextView android:id="@+id/textview_drawable_4_1"
+                  android:layout_height="wrap_content"
+                  android:layout_width="wrap_content"
+                  android:drawableStart="@drawable/icon_blue"
+                  android:drawableEnd="@drawable/icon_red"
+                  android:drawableTop="@drawable/icon_green"
+                  android:drawableBottom="@drawable/icon_yellow"
+                />
+
+        <TextView android:id="@+id/textview_drawable_5_1"
+                  android:layout_height="wrap_content"
+                  android:layout_width="wrap_content"
+                  android:drawableLeft="@drawable/icon_black"
+                  android:drawableRight="@drawable/icon_black"
+                  android:drawableStart="@drawable/icon_blue"
+                  android:drawableEnd="@drawable/icon_red"
+                  android:drawableTop="@drawable/icon_green"
+                  android:drawableBottom="@drawable/icon_yellow"
+                />
+
+    </LinearLayout>
+
+    <LinearLayout android:orientation="vertical"
+                  android:layout_width="match_parent"
+                  android:layout_height="match_parent"
+                  android:layoutDirection="rtl">
+
+        <TextView android:id="@+id/textview_drawable_4_2"
+                  android:layout_height="wrap_content"
+                  android:layout_width="wrap_content"
+                  android:drawableStart="@drawable/icon_blue"
+                  android:drawableEnd="@drawable/icon_red"
+                  android:drawableTop="@drawable/icon_green"
+                  android:drawableBottom="@drawable/icon_yellow"
+                />
+
+        <TextView android:id="@+id/textview_drawable_5_2"
+                  android:layout_height="wrap_content"
+                  android:layout_width="wrap_content"
+                  android:drawableLeft="@drawable/icon_black"
+                  android:drawableRight="@drawable/icon_black"
+                  android:drawableStart="@drawable/icon_blue"
+                  android:drawableEnd="@drawable/icon_red"
+                  android:drawableTop="@drawable/icon_green"
+                  android:drawableBottom="@drawable/icon_yellow"
+                />
+
+    </LinearLayout>
+
+</LinearLayout>
diff --git a/tests/tests/widget/res/layout/textview_selectallonfocus.xml b/tests/tests/widget/res/layout/textview_selectallonfocus.xml
new file mode 100644
index 0000000..b1c3682
--- /dev/null
+++ b/tests/tests/widget/res/layout/textview_selectallonfocus.xml
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2008 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content">
+
+    <TextView android:id="@+id/selectAllOnFocus_default"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:focusable="true"/>
+
+    <TextView android:id="@+id/selectAllOnFocus_true"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:selectAllOnFocus="true"
+        android:focusable="true"/>
+
+    <TextView android:id="@+id/selectAllOnFocus_false"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:selectAllOnFocus="false"
+        android:focusable="true"/>
+
+        <TextView android:id="@+id/selectAllOnFocus_dummy"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:focusable="true"/>
+
+</LinearLayout>
diff --git a/tests/tests/widget/res/layout/timepicker.xml b/tests/tests/widget/res/layout/timepicker.xml
new file mode 100644
index 0000000..352f69b
--- /dev/null
+++ b/tests/tests/widget/res/layout/timepicker.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2008 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<TimePicker xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="wrap_content"
+    android:layout_height="wrap_content"/>
diff --git a/tests/tests/widget/res/layout/togglebutton_layout.xml b/tests/tests/widget/res/layout/togglebutton_layout.xml
new file mode 100644
index 0000000..a6c08e1
--- /dev/null
+++ b/tests/tests/widget/res/layout/togglebutton_layout.xml
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ * Copyright (C) 2008 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ -->
+
+<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
+    android:orientation="vertical"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent">
+
+    <LinearLayout
+        android:orientation="vertical"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content">
+
+        <ToggleButton android:id="@+id/toggle1"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content" />
+
+        <ToggleButton android:id="@+id/toggle2"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content" />
+
+        <ToggleButton android:id="@+id/button_tint"
+            android:buttonTint="@android:color/white"
+            android:buttonTintMode="src_over"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content" />
+
+    </LinearLayout>
+
+</ScrollView>
diff --git a/tests/tests/widget/res/layout/twolinelistitem.xml b/tests/tests/widget/res/layout/twolinelistitem.xml
new file mode 100644
index 0000000..ec256c1
--- /dev/null
+++ b/tests/tests/widget/res/layout/twolinelistitem.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2008 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<TwoLineListItem xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content"
+    android:id="@+id/twoLineListItem">
+
+    <TextView android:id="@android:id/text1"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:text="@string/twolinelistitem_test_text1"/>
+
+    <TextView android:id="@android:id/text2"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:text="@string/twolinelistitem_test_text2"/>
+
+</TwoLineListItem>
diff --git a/tests/tests/widget/res/layout/urlspan_layout.xml b/tests/tests/widget/res/layout/urlspan_layout.xml
new file mode 100644
index 0000000..2ca95ac
--- /dev/null
+++ b/tests/tests/widget/res/layout/urlspan_layout.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ * Copyright (C) 2008 The Android Open Source Project.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ -->
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:orientation="vertical">
+
+    <TextView android:id="@+id/url"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:paddingLeft="4dip"
+        android:focusable="true"
+        android:focusableInTouchMode="true"
+        android:text="@string/text_view_hello"/>
+
+</LinearLayout>
diff --git a/tests/tests/widget/res/layout/videoview_layout.xml b/tests/tests/widget/res/layout/videoview_layout.xml
new file mode 100644
index 0000000..9b042cb
--- /dev/null
+++ b/tests/tests/widget/res/layout/videoview_layout.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ * Copyright (C) 2009 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ -->
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:orientation="vertical"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent">
+
+    <VideoView
+        android:id="@+id/videoview"
+        android:layout_width="160px"
+        android:layout_height="120px"/>
+</LinearLayout>
diff --git a/tests/tests/widget/res/layout/viewanimator_layout.xml b/tests/tests/widget/res/layout/viewanimator_layout.xml
new file mode 100644
index 0000000..96b2483
--- /dev/null
+++ b/tests/tests/widget/res/layout/viewanimator_layout.xml
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ * Copyright (C) 2008 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ -->
+
+<!-- Demonstrates using a relative layout to create a form -->
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content"
+    android:focusable="true"
+    android:background="@drawable/blue">
+
+    <TextView android:id="@+id/label"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:layout_alignParentTop="true"
+        android:layout_alignParentLeft="true"
+        android:text="@string/viewanimator_test"/>
+
+    <EditText android:id="@+id/entry"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:background="@android:drawable/editbox_background"
+        android:layout_below="@id/label"/>
+
+    <Button android:id="@+id/cancel"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_below="@id/entry"
+        android:layout_alignParentRight="true"
+        android:layout_marginLeft="10px"
+        android:text="@string/id_cancel" />
+
+    <Button android:id="@+id/ok"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_toLeftOf="@id/cancel"
+        android:layout_alignTop="@id/cancel"
+        android:text="@string/id_ok" />
+
+</RelativeLayout>
+
diff --git a/tests/tests/widget/res/layout/viewflipper_layout.xml b/tests/tests/widget/res/layout/viewflipper_layout.xml
new file mode 100644
index 0000000..6480379
--- /dev/null
+++ b/tests/tests/widget/res/layout/viewflipper_layout.xml
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ * Copyright (C) 2008 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ -->
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+        android:orientation="vertical"
+        android:padding="10dip"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content">
+
+    <ViewFlipper android:id="@+id/viewflipper_test"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:flipInterval="1000"
+                android:layout_marginBottom="20dip" >
+                <TextView android:id="@+id/viewflipper_textview1"
+                        android:layout_width="match_parent"
+                        android:layout_height="wrap_content"
+                        android:gravity="center_horizontal"
+                        android:textSize="26sp"
+                        android:visibility="gone"
+                        android:text="@string/hello_world"/>
+                <TextView android:id="@+id/viewflipper_textview2"
+                        android:layout_width="match_parent"
+                        android:layout_height="wrap_content"
+                        android:gravity="center_horizontal"
+                        android:textSize="26sp"
+                        android:visibility="gone"
+                        android:text="@string/hello_android"/>
+    </ViewFlipper>
+</LinearLayout>
+
diff --git a/tests/tests/widget/res/layout/viewgrouptest_stub.xml b/tests/tests/widget/res/layout/viewgrouptest_stub.xml
new file mode 100644
index 0000000..ee59126
--- /dev/null
+++ b/tests/tests/widget/res/layout/viewgrouptest_stub.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ * Copyright (C) 2008 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ -->
+
+<android.widget.cts.MockLinearLayout
+        xmlns:android="http://schemas.android.com/apk/res/android"
+    android:orientation="vertical"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:id="@+id/mocklinearlayout">
+
+    <!-- view1 goes on top -->
+    <TextView
+        android:id="@+id/viewgrouptest_stub"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+    />
+
+</android.widget.cts.MockLinearLayout>
+
diff --git a/tests/tests/widget/res/layout/viewswitcher_layout.xml b/tests/tests/widget/res/layout/viewswitcher_layout.xml
new file mode 100644
index 0000000..933dc32
--- /dev/null
+++ b/tests/tests/widget/res/layout/viewswitcher_layout.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ * Copyright (C) 2008 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ -->
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:orientation="vertical"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent">
+
+    <ViewSwitcher android:id="@+id/viewswitcher_test"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent" />
+</LinearLayout>
+
diff --git a/tests/tests/widget/res/layout/zoombutton_layout.xml b/tests/tests/widget/res/layout/zoombutton_layout.xml
new file mode 100644
index 0000000..1b1e0b2
--- /dev/null
+++ b/tests/tests/widget/res/layout/zoombutton_layout.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ * Copyright (C) 2008 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ -->
+<ZoomButton xmlns:android="http://schemas.android.com/apk/res/android"
+    android:id="@+id/zoombutton_test"
+    android:layout_width="wrap_content"
+    android:layout_height="wrap_content"
+/>
+
diff --git a/tests/tests/widget/res/raw/scenery.jpg b/tests/tests/widget/res/raw/scenery.jpg
new file mode 100644
index 0000000..7d1f5e1
--- /dev/null
+++ b/tests/tests/widget/res/raw/scenery.jpg
Binary files differ
diff --git a/tests/tests/widget/res/raw/testimage.jpg b/tests/tests/widget/res/raw/testimage.jpg
new file mode 100644
index 0000000..d3dae03
--- /dev/null
+++ b/tests/tests/widget/res/raw/testimage.jpg
Binary files differ
diff --git a/tests/tests/widget/res/raw/testvideo.3gp b/tests/tests/widget/res/raw/testvideo.3gp
new file mode 100644
index 0000000..1503272
--- /dev/null
+++ b/tests/tests/widget/res/raw/testvideo.3gp
Binary files differ
diff --git a/tests/tests/widget/res/values/arrays.xml b/tests/tests/widget/res/values/arrays.xml
new file mode 100644
index 0000000..71e0133
--- /dev/null
+++ b/tests/tests/widget/res/values/arrays.xml
@@ -0,0 +1,57 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ * Copyright (C) 2008 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ -->
+
+<resources>
+    <item type="integer" name="reference" format="integer">101</item>
+
+      <string-array name="strings">
+        <item>zero</item>
+        <item>1</item>
+        <item>@string/reference</item>
+    </string-array>
+
+    <integer-array name="integers">
+        <item>0</item>
+        <item>1</item>
+        <item>@integer/reference</item>
+    </integer-array>
+
+    <array name="difficultyLevel">
+        <item>Easy</item>
+        <item>Medium</item>
+        <item>Hard</item>
+    </array>
+
+    <string-array name="string">
+        <item>Test String 1</item>
+        <item>Test String 2</item>
+        <item>Test String 3</item>
+    </string-array>
+
+    <integer-array name="table_row_layout">
+        <item>1</item>
+        <item>2</item>
+        <item>3</item>
+        <item>4</item>
+        <item>5</item>
+        <item>6</item>
+        <item>7</item>
+        <item>8</item>
+        <item>9</item>
+        <item>10</item>
+    </integer-array>
+</resources>
diff --git a/tests/tests/widget/res/values/attrs.xml b/tests/tests/widget/res/values/attrs.xml
new file mode 100644
index 0000000..4c3d9db
--- /dev/null
+++ b/tests/tests/widget/res/values/attrs.xml
@@ -0,0 +1,145 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ * Copyright (C) 2008 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ -->
+
+<resources>
+    <declare-styleable name="Style1">
+        <attr name="Type1" format="integer">
+            <enum name="type" value="28" />
+            <enum name="data" value="0xff00ff00" />
+            <enum name="asset_cookie" value="0" />
+            <enum name="resource_id" value="0" />
+            <enum name="changing_config" value="0" />
+        </attr>
+        <attr name="Type2" format="integer">
+            <enum name="type" value="28" />
+            <enum name="data" value="0xff0000ff" />
+            <enum name="asset_cookie" value="0" />
+            <enum name="resource_id" value="0" />
+            <enum name="changing_config" value="0" />
+        </attr>
+    </declare-styleable>
+    <attr name="type1" format="boolean"/>
+    <attr name="type2" format="boolean"/>
+    <attr name="type3" format="color"/>
+    <attr name="type4" format="reference|color"/>
+    <attr name="type5" format="dimension"/>
+    <attr name="type6" format="dimension"/>
+    <attr name="type7" format="dimension"/>
+    <attr name="type8" format="reference"/>
+    <attr name="type9" format="float"/>
+    <attr name="type10" format="fraction"/>
+    <attr name="type11" format="integer"/>
+    <attr name="type12" format="integer"/>
+    <attr name="type13" format="reference|string"/>
+    <attr name="type14" format="string"/>
+    <attr name="type15" format="reference"/>
+    <attr name="type16" format="string"/>
+    <declare-styleable name="style1">
+        <attr name="type1"/>
+        <attr name="type2"/>
+        <attr name="type3"/>
+        <attr name="type4"/>
+        <attr name="type5"/>
+        <attr name="type6"/>
+        <attr name="type7"/>
+        <attr name="type8"/>
+        <attr name="type9"/>
+        <attr name="type10"/>
+        <attr name="type11"/>
+        <attr name="type12"/>
+        <attr name="type13"/>
+        <attr name="type14"/>
+        <attr name="type15"/>
+        <attr name="type16"/>
+    </declare-styleable>
+    <attr name="testEnum">
+        <enum name="val1" value="1" />
+        <enum name="val2" value="2" />
+        <enum name="val10" value="10" />
+    </attr>
+    <attr name="testFlags">
+        <flag name="bit1" value="0x1" />
+        <flag name="bit2" value="0x2" />
+        <flag name="bit31" value="0x40000000" />
+    </attr>
+    <attr name="testString" format="string" />
+    <declare-styleable name="EnumStyle">
+        <attr name="testEnum" />
+    </declare-styleable>
+    <declare-styleable name="FlagStyle">
+        <attr name="testFlags" />
+    </declare-styleable>
+    <declare-styleable name="TestConfig">
+        <attr name="testString" />
+    </declare-styleable>
+    <!-- Size of text. Recommended dimension type for text is "sp" for scaled-pixels (example: 15sp).
+         Supported values include the following:<p/>
+    <ul>
+        <li><b>px</b> Pixels</li>
+        <li><b>sp</b> Scaled pixels (scaled to relative pixel size on screen). See {@link android.util.DisplayMetrics} for more information.</li>
+        <li><b>pt</b> Points</li>
+        <li><b>dip</b> Device independent pixels. See {@link android.util.DisplayMetrics} for more information.</li>
+    </ul>
+    -->
+    <attr name="textSize" format="dimension" />
+    <attr name="typeface">
+        <enum name="normal" value="0" />
+        <enum name="sans" value="1" />
+        <enum name="serif" value="2" />
+        <enum name="monospace" value="3" />
+    </attr>
+    <!-- Default text typeface style. -->
+    <attr name="textStyle">
+        <flag name="normal" value="0" />
+        <flag name="bold" value="1" />
+        <flag name="italic" value="2" />
+    </attr>
+    <!-- Color of text (usually same as colorForeground). -->
+    <attr name="textColor" format="reference|color" />
+    <!-- Color of highlighted text. -->
+    <attr name="textColorHighlight" format="reference|color" />
+    <!-- Color of hint text (displayed when the field is empty). -->
+    <attr name="textColorHint" format="reference|color" />
+    <!-- Color of link text (URLs). -->
+    <attr name="textColorLink" format="reference|color" />
+    <declare-styleable name="TextAppearance">
+        <attr name="textColor"/>
+        <attr name="textSize"/>
+        <attr name="textStyle"/>
+        <attr name="typeface"/>
+        <attr name="textColorHighlight"/>
+        <attr name="textColorHint"/>
+        <attr name="textColorLink"/>
+    </declare-styleable>
+    <!-- Integer used to uniquely identify theme overrides. -->
+    <attr name="themeType" format="integer"/>
+    <!-- Theme reference used to override parent theme. -->
+    <attr name="themeOverrideAttr" format="reference"/>
+
+    <!-- Drawable theming attributes -->
+    <attr name="themeBoolean" />
+    <attr name="themeColor" />
+    <attr name="themeFloat" />
+    <attr name="themeInteger" />
+    <attr name="themeDimension" />
+    <attr name="themeDrawable" />
+    <attr name="themeBitmap" />
+    <attr name="themeNinePatch" />
+    <attr name="themeGravity" />
+    <attr name="themeTileMode" />
+    <attr name="themeAngle" />
+</resources>
diff --git a/tests/tests/widget/res/values/colors.xml b/tests/tests/widget/res/values/colors.xml
new file mode 100644
index 0000000..f3cc325
--- /dev/null
+++ b/tests/tests/widget/res/values/colors.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ * Copyright (C) 2008 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ -->
+
+<resources>
+    <drawable name="red">#7f00</drawable>
+    <drawable name="blue">#770000ff</drawable>
+    <drawable name="black">#77ffffff</drawable>
+    <drawable name="yellow">#77ffff00</drawable>
+    <color name="testcolor1">#ff00ff00</color>
+    <color name="testcolor2">#ffff0000</color>
+    <color name="failColor">#ff0000ff</color>
+</resources>
diff --git a/tests/tests/widget/res/values/strings.xml b/tests/tests/widget/res/values/strings.xml
new file mode 100644
index 0000000..c167278
--- /dev/null
+++ b/tests/tests/widget/res/values/strings.xml
@@ -0,0 +1,179 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2008 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="permlab_testGranted">Test Granted</string>
+    <string name="permdesc_testGranted">Used for running CTS tests, for testing operations
+        where we have the permission.</string>
+    <string name="permlab_testDynamic">Test Dynamic</string>
+    <string name="permdesc_testDynamic">Used for running CTS tests, for testing adding
+        dynamic permissions.</string>
+    <string name="permlab_testDenied">Test Denied</string>
+    <string name="permdesc_testDenied">Used for running CTS tests, for testing operations
+        where we do not have the permission.</string>
+    <string name="explain">1. click start. \n2. if above image shaked, then press pass button,
+         else press failed button.</string>
+    <string name="text_view_hello">Hello! Text view!</string>
+    <string name="text_view_hello_two_lines">Hello! \nText view!</string>
+    <string name="text_view_simple_hint">This is a hint.</string>
+    <string name="text_view_hint">This is a string for testing hint of textview.</string>
+    <string name="activity_forwarding">App/Forwarding</string>
+    <string name="forwarding">$$$</string>
+    <string name="go">Go</string>
+    <string name="back">Back</string>
+    <string name="forward_target">
+        Press back button and notice we don\'t see the previous activity.
+    </string>
+    <string name="edit_text">testing</string>
+    <string name="text">DialogTest</string>
+    <string name="text_country">Country</string>
+    <string name="text_name">Name</string>
+    <string name="hello_world">Hello, World!</string>
+    <string name="hello_android">Hello, Android!</string>
+    <string name="alert_dialog_username">Name:</string>
+    <string name="alert_dialog_password">Password:</string>
+    <string name="alert_dialog_positive">Positive</string>
+    <string name="alert_dialog_negative">Negative</string>
+    <string name="alert_dialog_neutral">Neutral</string>
+    <string name="notify">Notify </string>
+    <string name="tabs_1">testing</string>
+    <string name="table_layout_first">first</string>
+    <string name="table_layout_second">second</string>
+    <string name="table_layout_third">third</string>
+    <string name="table_layout_long">Very long to make the string out of the screen</string>
+    <string name="chronometer_text">Test Chronometer</string>
+    <string name="am">AM</string>
+    <string name="pm">PM</string>
+    <string name="viewgroup_test">ViewGroup test</string>
+    <string name="viewanimator_test">ViewAnimator test</string>
+    <string name="id_ok">OK</string>
+    <string name="id_cancel">Cancel</string>
+    <string name="context_test_string1">This is %s string.</string>
+    <string name="context_test_string2">This is test string.</string>
+    <string name="animationutils_test_instructions">Choose different animations</string>
+    <string name="animationutils_test_alpha">Alpha animation</string>
+    <string name="animationutils_test_scale">Scale animation</string>
+    <string name="animationutils_test_rotate">Rotate animation</string>
+    <string name="animationutils_test_translate">Translate animation</string>
+    <string name="animationutils_test_set">Animation set</string>
+    <string name="animationutils_test_layout">Layout animation</string>
+    <string name="animationutils_test_gridlayout">Grid layout animation</string>
+    <string name="twolinelistitem_test_text1">text1</string>
+    <string name="twolinelistitem_test_text2">text2</string>
+    <string name="metadata_text">metadata text</string>
+    <string name="horizontal_text_1">horizontal 1</string>
+    <string name="horizontal_text_2">horizontal 2</string>
+    <string name="horizontal_text_3">horizontal 3</string>
+    <string name="vertical_text_1">vertical 1</string>
+    <string name="vertical_text_2">vertical 2</string>
+    <string name="vertical_text_3">vertical 3</string>
+    <string name="reference">here</string>
+    <string name="coerceIntegerToString">100</string>
+    <string name="coerceBooleanToString">true</string>
+    <string name="coerceColorToString">#fff</string>
+    <string name="coerceFloatToString">100.0</string>
+    <string name="coerceDimensionToString">100px</string>
+    <string name="coerceFractionToString">100<xliff:g id="percent">%</xliff:g></string>
+    <string name="formattedStringNone">Format[]</string>
+    <string name="formattedStringOne">Format[<xliff:g id="format">%d</xliff:g>]</string>
+    <string name="formattedStringTwo">Format[<xliff:g id="format">%3$d,%2$s</xliff:g>]</string>
+    <string name="checkboxpref_key">checkboxpref_key</string>
+   <string name="checkboxpref_title">title of preference</string>
+   <string name="checkboxpref_summary">summary of preference</string>
+   <string name="checkboxpref_summary_on">summary on of preference</string>
+   <string name="checkboxpref_summary_off">summary off of preference</string>
+   <string name="checkboxpref_depend">checkboxpref_depend</string>
+   <string name="checkboxpref_depend_title"> depend title of preference</string>
+   <string name="checkboxpref_depend_summary"> depend summary of preference</string>
+   <string name="edittextpref_key">edittextpref_key</string>
+   <string name="edittextpref_default_value">default value of preference</string>
+   <string name="edittextpref_title">title of edit text preference</string>
+   <string name="edittextpref_summary">summary of edit text preference</string>
+   <string name="edittextpref_dialog_title">dialog title of edit text preference</string>
+   <string name="edittextpref_text">text of  edit text preference</string>
+   <string name="listpref_key">listpref_key</string>
+   <string name="listpref_title">title of list preference</string>
+   <string name="listpref_summary">summary of list preference</string>
+   <string name="listpref_dialogtitle">dialog title of list preference</string>
+   <string name="easy">Easy</string>
+   <string name="medium">Medium</string>
+   <string name="hard">Hard</string>
+   <string name="footer_view">Footer view</string>
+   <string name="header_view">Header view</string>
+   <string name="dialogpref_title">title of dialog preference </string>
+   <string name="dialogpref_dialog_title">dialog title of dialog preference </string>
+   <string name="dialogpref_key">dialogpref_key</string>
+   <string name="dialogpref_default_value">default value of dialog preference</string>
+   <string name="dialogpref_summary">summary of dialog preference</string>
+   <string name="dialogpref_message">message of dialog preference</string>
+   <string name="dialogpref_sure">Sure</string>
+   <string name="dialogpref_cancel">Cancel</string>
+   <string name="pref_key">pref_key</string>
+   <string name="pref_title">title of preference</string>
+   <string name="pref_summary">summary of preference</string>
+   <string name="pref_depend_key">pref_depend_key</string>
+   <string name="pref_depend_title"> depend title of preference</string>
+   <string name="pref_depend_summary"> depend summary of preference</string>
+   <string name="android_intent_action_preference">android.intent.action.PREFERENCE</string>
+   <string name="def_pref_key">def_pref_key</string>
+   <string name="def_pref_title">default preference</string>
+   <string name="def_pref_summary">This is default preference of cts</string>
+   <string name="relative_view1">view 1</string>
+   <string name="relative_view2">view 2</string>
+   <string name="relative_view3">view 3</string>
+   <string name="relative_view4">view 4</string>
+   <string name="relative_view5">view 5</string>
+   <string name="relative_view6">view 6</string>
+   <string name="relative_view7">view 7</string>
+   <string name="relative_view8">view 8</string>
+   <string name="relative_view9">view 9</string>
+   <string name="relative_view10">view 10</string>
+   <string name="relative_view11">view 11</string>
+   <string name="relative_view12">view 12</string>
+   <string name="relative_view13">view 13</string>
+   <string name="country">Country:</string>
+   <string name="symbol">Symbol:</string>
+   <string name="country_warning">No such country registered</string>
+   <string name="version_cur">base</string>
+   <string name="version_old">base</string>
+   <string name="version_v3">base</string>
+   <string name="authenticator_label">Android CTS</string>
+   <string name="search_label">Android CTS</string>
+   <string name="tag1">tag 1</string>
+   <string name="tag2">tag 2</string>
+
+   <string name="button">Button</string>
+   <string name="holo_test">Holo Test</string>
+   <string name="holo_generator">Holo Generator</string>
+   <string name="holo_light_test">Holo Light Test</string>
+   <string name="holo_light_generator">Holo Light Generator</string>
+   <string name="reference_image">Reference Image: </string>
+   <string name="generated_image">Generated Image: </string>
+   <string name="themes_prompt">Select a Theme:</string>
+   <string name="sample_text">Sample text goes here. I wanted something creative and whimsical
+but then I just got bored...</string>
+    <string name="long_text">This is a really long string which exceeds the width of the view.
+New devices have a much larger screen which actually enables long strings to be displayed
+with no fading. I have made this string longer to fix this case. If you are correcting this
+text, I would love to see the kind of devices you guys now use! Guys, maybe some devices need longer string!
+I think so, so how about double this string, like copy and paste!
+This is a really long string which exceeds the width of the view.
+New devices have a much larger screen which actually enables long strings to be displayed
+with no fading. I have made this string longer to fix this case. If you are correcting this
+text, I would love to see the kind of devices you guys now use! Guys, maybe some devices need longer string!
+I think so, so how about double this string, like copy and paste! </string>
+    <string name="rectangle200">"M 0,0 l 200,0 l 0, 200 l -200, 0 z"</string>
+</resources>
diff --git a/tests/tests/widget/res/values/styles.xml b/tests/tests/widget/res/values/styles.xml
new file mode 100644
index 0000000..81925cc
--- /dev/null
+++ b/tests/tests/widget/res/values/styles.xml
@@ -0,0 +1,172 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2008 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android">
+
+    <style name="Whatever">
+        <item name="type1">true</item>
+        <item name="type2">false</item>
+        <item name="type3">#ff0000ff</item>
+        <item name="type4">#ff00ff00</item>
+        <item name="type5">0.75px</item>
+        <item name="type6">10px</item>
+        <item name="type7">18px</item>
+        <item name="type8">@drawable/pass</item>
+        <item name="type9">3.14</item>
+        <item name="type10">100%</item>
+        <item name="type11">365</item>
+        <item name="type12">86400</item>
+        <item name="type13">@string/hello_android</item>
+        <item name="type14">TypedArray Test!</item>
+        <item name="type15">@array/difficultyLevel</item>
+        <item name="type16">Typed Value!</item>
+    </style>
+
+    <style name="TextViewWithoutColorAndAppearance">
+        <item name="android:textSize">18sp</item>
+    </style>
+
+    <style name="TextViewWithColorButWithOutAppearance">
+        <item name="android:textColor">#ff0000ff</item>
+    </style>
+
+    <style name="TextViewWithColorAndAppearance">
+        <item name="android:textColor">#ff0000ff</item>
+        <item name="android:textAppearance">@style/TextAppearance.WithColor</item>
+    </style>
+
+    <style name="TextViewWithoutColorButWithAppearance">
+        <item name="android:textAppearance">@style/TextAppearance.WithColor</item>
+    </style>
+
+    <style name="TextAppearance" parent="android:TextAppearance">
+    </style>
+
+    <style name="TextAppearance.WithColor">
+        <item name="android:textColor">#ffff0000</item>
+    </style>
+
+    <style name="TextAppearance.All">
+        <item name="android:textColor">@drawable/black</item>
+        <item name="android:textSize">20px</item>
+        <item name="android:textStyle">bold</item>
+        <item name="android:textColorHint">@drawable/red</item>
+        <item name="android:textColorLink">@drawable/blue</item>
+        <item name="android:textColorHighlight">@drawable/yellow</item>
+    </style>
+
+    <style name="TextAppearance.Colors">
+        <item name="android:textColor">@drawable/black</item>
+        <item name="android:textColorHint">@drawable/blue</item>
+        <item name="android:textColorLink">@drawable/yellow</item>
+        <item name="android:textColorHighlight">@drawable/red</item>
+    </style>
+
+    <style name="TextAppearance.NotColors">
+        <item name="android:textSize">17px</item>
+        <item name="android:typeface">sans</item>
+        <item name="android:textStyle">normal</item>
+    </style>
+
+    <style name="TextAppearance.Style">
+        <item name="android:textStyle">normal</item>
+    </style>
+
+    <style name="TestEnum1">
+        <item name="testEnum">val1</item>
+    </style>
+
+    <style name="TestEnum2">
+        <item name="testEnum">val2</item>
+    </style>
+
+    <style name="TestEnum10">
+        <item name="testEnum">val10</item>
+    </style>
+
+    <style name="TestFlag1">
+        <item name="testFlags">bit1</item>
+    </style>
+
+    <style name="TestFlag2">
+        <item name="testFlags">bit2</item>
+    </style>
+
+    <style name="TestFlag31">
+        <item name="testFlags">bit31</item>
+    </style>
+
+    <style name="TestFlag1And2">
+        <item name="testFlags">bit1|bit2</item>
+    </style>
+
+    <style name="TestFlag1And2And31">
+        <item name="testFlags">bit1|bit2|bit31</item>
+    </style>
+
+    <style name="TestEnum1.EmptyInherit" />
+
+    <style name="Theme_AlertDialog">
+        <item name="android:textSize">18sp</item>
+    </style>
+
+    <style name="TestProgressBar">
+        <item name="android:indeterminateOnly">false</item>
+        <item name="android:progressDrawable">?android:drawable/progress_horizontal</item>
+        <item name="android:indeterminateDrawable">?android:drawable/progress_horizontal</item>
+        <item name="android:minHeight">20dip</item>
+        <item name="android:maxHeight">20dip</item>
+        <item name="android:focusable">true</item>
+    </style>
+
+    <style name="Test_Theme">
+        <item name="android:windowNoTitle">true</item>
+        <item name="android:panelColorForeground">#ff000000</item>
+        <item name="android:panelColorBackground">#ffffffff</item>
+    </style>
+
+    <style name="Theme_OverrideOuter">
+        <item name="themeType">1</item>
+    </style>
+
+    <style name="Theme_OverrideInner">
+        <item name="themeType">2</item>
+        <item name="themeOverrideAttr">@style/Theme_OverrideAttr</item>
+    </style>
+
+    <style name="Theme_OverrideAttr">
+        <item name="themeType">3</item>
+    </style>
+
+    <style name="Theme_ThemedDrawableTest">
+        <item name="themeBoolean">true</item>
+        <item name="themeColor">@android:color/black</item>
+        <item name="themeFloat">1.0</item>
+        <item name="themeAngle">45.0</item>
+        <item name="themeInteger">1</item>
+        <item name="themeDimension">1px</item>
+        <item name="themeDrawable">@drawable/icon_black</item>
+        <item name="themeBitmap">@drawable/icon_black</item>
+        <item name="themeNinePatch">@drawable/ninepatch_0</item>
+        <item name="themeGravity">48</item>
+        <item name="themeTileMode">2</item>
+    </style>
+
+    <style name="Theme_NoSwipeDismiss">
+        <item name="android:windowSwipeToDismiss">false</item>
+    </style>
+
+</resources>
diff --git a/tests/tests/widget/res/xml/base_attributes.xml b/tests/tests/widget/res/xml/base_attributes.xml
new file mode 100644
index 0000000..adb44de
--- /dev/null
+++ b/tests/tests/widget/res/xml/base_attributes.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ * Copyright (C) 2008 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ -->
+<alias xmlns:android="http://schemas.android.com/apk/res/android">
+    <base_attr_pixel>
+        <Attributes xmlns:android="http://schemas.android.com/apk/res/android"
+            android:layout_width="400px"
+            android:layout_height="600px"/>
+    </base_attr_pixel>
+    <base_attr_fillwrap>
+        <Attributes xmlns:android="http://schemas.android.com/apk/res/android"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"/>
+    </base_attr_fillwrap>
+    <base_attr_noheight>
+        <Attributes xmlns:android="http://schemas.android.com/apk/res/android"
+            android:layout_width="600px"/>
+    </base_attr_noheight>
+</alias>
diff --git a/tests/tests/widget/res/xml/input_extras.xml b/tests/tests/widget/res/xml/input_extras.xml
new file mode 100644
index 0000000..ce5eb5e
--- /dev/null
+++ b/tests/tests/widget/res/xml/input_extras.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ * Copyright (C) 2008 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+-->
+<input-extras xmlns:android="http://schemas.android.com/apk/res/android">
+    <extra android:name="google" android:value="android"/>
+    <extra android:name="test" android:value="cts"/>
+</input-extras>
+
diff --git a/tests/tests/widget/src/android/widget/cts/AbsListViewTest.java b/tests/tests/widget/src/android/widget/cts/AbsListViewTest.java
index 7dcae28..b6a96fb 100644
--- a/tests/tests/widget/src/android/widget/cts/AbsListViewTest.java
+++ b/tests/tests/widget/src/android/widget/cts/AbsListViewTest.java
@@ -16,7 +16,7 @@
 
 package android.widget.cts;
 
-import com.android.cts.stub.R;
+import com.android.cts.widget.R;
 
 import org.xmlpull.v1.XmlPullParser;
 import org.xmlpull.v1.XmlPullParserException;
@@ -52,7 +52,7 @@
 import java.util.ArrayList;
 import java.util.List;
 
-public class AbsListViewTest extends ActivityInstrumentationTestCase2<ListViewStubActivity> {
+public class AbsListViewTest extends ActivityInstrumentationTestCase2<ListViewCtsActivity> {
     private final String[] mShortList = new String[] {
         "This", "is", "short", "!",
     };
@@ -72,7 +72,7 @@
     private static final float DELTA = 0.001f;
 
     public AbsListViewTest() {
-        super("com.android.cts.stub", ListViewStubActivity.class);
+        super("com.android.cts.widget", ListViewCtsActivity.class);
     }
 
 
diff --git a/tests/tests/widget/src/android/widget/cts/AbsListView_LayoutParamsTest.java b/tests/tests/widget/src/android/widget/cts/AbsListView_LayoutParamsTest.java
index 655b5ee..413bc2a 100644
--- a/tests/tests/widget/src/android/widget/cts/AbsListView_LayoutParamsTest.java
+++ b/tests/tests/widget/src/android/widget/cts/AbsListView_LayoutParamsTest.java
@@ -16,7 +16,7 @@
 
 package android.widget.cts;
 
-import com.android.cts.stub.R;
+import com.android.cts.widget.R;
 
 
 import org.xmlpull.v1.XmlPullParser;
diff --git a/tests/tests/widget/src/android/widget/cts/AbsSeekBarTest.java b/tests/tests/widget/src/android/widget/cts/AbsSeekBarTest.java
index 58230e5..419a1c8 100644
--- a/tests/tests/widget/src/android/widget/cts/AbsSeekBarTest.java
+++ b/tests/tests/widget/src/android/widget/cts/AbsSeekBarTest.java
@@ -21,7 +21,7 @@
 import android.graphics.PorterDuff;
 import android.test.UiThreadTest;
 
-import com.android.cts.stub.R;
+import com.android.cts.widget.R;
 
 
 import android.app.Activity;
@@ -40,9 +40,9 @@
 /**
  * Test {@link AbsSeekBar}.
  */
-public class AbsSeekBarTest extends ActivityInstrumentationTestCase2<ProgressBarStubActivity> {
+public class AbsSeekBarTest extends ActivityInstrumentationTestCase2<ProgressBarCtsActivity> {
     public AbsSeekBarTest() {
-        super("com.android.cts.stub", ProgressBarStubActivity.class);
+        super("com.android.cts.widget", ProgressBarCtsActivity.class);
     }
 
     private Activity mActivity;
diff --git a/tests/tests/widget/src/android/widget/cts/AbsSpinnerTest.java b/tests/tests/widget/src/android/widget/cts/AbsSpinnerTest.java
index fc37a64..70b37e6 100644
--- a/tests/tests/widget/src/android/widget/cts/AbsSpinnerTest.java
+++ b/tests/tests/widget/src/android/widget/cts/AbsSpinnerTest.java
@@ -16,7 +16,7 @@
 
 package android.widget.cts;
 
-import com.android.cts.stub.R;
+import com.android.cts.widget.R;
 
 
 import org.xmlpull.v1.XmlPullParser;
@@ -39,11 +39,11 @@
 import android.widget.Spinner;
 import android.widget.SpinnerAdapter;
 
-public class AbsSpinnerTest extends ActivityInstrumentationTestCase2<RelativeLayoutStubActivity> {
+public class AbsSpinnerTest extends ActivityInstrumentationTestCase2<RelativeLayoutCtsActivity> {
     private Context mContext;
 
     public AbsSpinnerTest() {
-        super("com.android.cts.stub", RelativeLayoutStubActivity.class);
+        super("com.android.cts.widget", RelativeLayoutCtsActivity.class);
     }
 
     @Override
@@ -78,7 +78,7 @@
     public void testSetSelectionIntBoolean() {
         AbsSpinner absSpinner = (AbsSpinner) getActivity().findViewById(R.id.spinner1);
         ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(mContext,
-                com.android.cts.stub.R.array.string, android.R.layout.simple_spinner_item);
+                com.android.cts.widget.R.array.string, android.R.layout.simple_spinner_item);
         adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
         absSpinner.setAdapter(adapter);
         assertEquals(0, absSpinner.getSelectedItemPosition());
@@ -101,7 +101,7 @@
     public void testSetSelectionInt() {
         AbsSpinner absSpinner = (AbsSpinner) getActivity().findViewById(R.id.spinner1);
         ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(mContext,
-                com.android.cts.stub.R.array.string, android.R.layout.simple_spinner_item);
+                com.android.cts.widget.R.array.string, android.R.layout.simple_spinner_item);
         adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
         absSpinner.setAdapter(adapter);
         assertEquals(0, absSpinner.getSelectedItemPosition());
@@ -123,7 +123,7 @@
     public void testAccessAdapter() {
         AbsSpinner absSpinner = (AbsSpinner) getActivity().findViewById(R.id.spinner1);
         ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(mContext,
-                com.android.cts.stub.R.array.string, android.R.layout.simple_spinner_item);
+                com.android.cts.widget.R.array.string, android.R.layout.simple_spinner_item);
         adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
 
         absSpinner.setAdapter(adapter);
@@ -158,7 +158,7 @@
         AbsSpinner absSpinner = (AbsSpinner) getActivity().findViewById(R.id.spinner1);
 
         ArrayAdapter<CharSequence> adapter1 = ArrayAdapter.createFromResource(mContext,
-                com.android.cts.stub.R.array.string, android.R.layout.simple_spinner_item);
+                com.android.cts.widget.R.array.string, android.R.layout.simple_spinner_item);
 
         absSpinner.setAdapter(adapter1);
         assertEquals(adapter1.getCount(), absSpinner.getCount());
@@ -233,7 +233,7 @@
     public void testOnSaveAndRestoreInstanceState() {
         AbsSpinner absSpinner = (AbsSpinner) getActivity().findViewById(R.id.spinner1);
         ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(mContext,
-                com.android.cts.stub.R.array.string, android.R.layout.simple_spinner_item);
+                com.android.cts.widget.R.array.string, android.R.layout.simple_spinner_item);
         adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
         absSpinner.setAdapter(adapter);
         assertEquals(0, absSpinner.getSelectedItemPosition());
diff --git a/tests/tests/widget/src/android/widget/cts/AbsoluteLayoutTest.java b/tests/tests/widget/src/android/widget/cts/AbsoluteLayoutTest.java
index 8d2b6cd..053f42b 100644
--- a/tests/tests/widget/src/android/widget/cts/AbsoluteLayoutTest.java
+++ b/tests/tests/widget/src/android/widget/cts/AbsoluteLayoutTest.java
@@ -16,7 +16,7 @@
 
 package android.widget.cts;
 
-import com.android.cts.stub.R;
+import com.android.cts.widget.R;
 
 
 import org.xmlpull.v1.XmlPullParser;
@@ -34,7 +34,7 @@
 import java.io.IOException;
 
 @SuppressWarnings("deprecation")
-public class AbsoluteLayoutTest extends ActivityInstrumentationTestCase2<StubActivity> {
+public class AbsoluteLayoutTest extends ActivityInstrumentationTestCase2<CtsActivity> {
     private static final int DEFAULT_X      = 5;
     private static final int DEFAULT_Y      = 10;
     private static final int DEFAULT_WIDTH  = 20;
@@ -45,7 +45,7 @@
     private LayoutParams mAbsoluteLayoutParams;
 
     public AbsoluteLayoutTest() {
-        super("com.android.cts.stub", StubActivity.class);
+        super("com.android.cts.widget", CtsActivity.class);
     }
 
     @Override
diff --git a/tests/tests/widget/src/android/widget/cts/AbsoluteLayout_LayoutParamsTest.java b/tests/tests/widget/src/android/widget/cts/AbsoluteLayout_LayoutParamsTest.java
index 63be7d4..685f2d3 100644
--- a/tests/tests/widget/src/android/widget/cts/AbsoluteLayout_LayoutParamsTest.java
+++ b/tests/tests/widget/src/android/widget/cts/AbsoluteLayout_LayoutParamsTest.java
@@ -16,7 +16,7 @@
 
 package android.widget.cts;
 
-import com.android.cts.stub.R;
+import com.android.cts.widget.R;
 
 
 import org.xmlpull.v1.XmlPullParser;
diff --git a/tests/tests/widget/src/android/widget/cts/AdapterViewCtsActivity.java b/tests/tests/widget/src/android/widget/cts/AdapterViewCtsActivity.java
new file mode 100644
index 0000000..956ff9a
--- /dev/null
+++ b/tests/tests/widget/src/android/widget/cts/AdapterViewCtsActivity.java
@@ -0,0 +1,59 @@
+/*
+ * Copyright (C) 2008 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.widget.cts;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import android.app.Activity;
+import android.os.Bundle;
+import android.view.ViewGroup.LayoutParams;
+import android.widget.ArrayAdapter;
+import android.widget.ListView;
+
+import com.android.cts.widget.R;
+
+/**
+ * A minimal application for AdapterView test.
+ */
+public class AdapterViewCtsActivity extends Activity {
+    private ListView mView;
+
+    /**
+     * Called with the activity is first created.
+     */
+    @Override
+    public void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        mView = new ListView(this);
+        mView.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT,
+                LayoutParams.WRAP_CONTENT));
+        setContentView(mView);
+    }
+
+    public ListView getListView() {
+        return mView;
+    }
+
+    public ArrayAdapter<String> getArrayAdapter() {
+        final List<String> list = new ArrayList<String>();
+        for (int i = 0; i < 4; i++) {
+            list.add("test:" + i);
+        }
+        return new ArrayAdapter<String>(this, R.layout.adapterview_layout, list);
+    }
+}
diff --git a/tests/tests/widget/src/android/widget/cts/AdapterViewTest.java b/tests/tests/widget/src/android/widget/cts/AdapterViewTest.java
index b91ca73..81a1a4b 100644
--- a/tests/tests/widget/src/android/widget/cts/AdapterViewTest.java
+++ b/tests/tests/widget/src/android/widget/cts/AdapterViewTest.java
@@ -38,10 +38,10 @@
 import android.widget.AdapterView.OnItemLongClickListener;
 import android.widget.AdapterView.OnItemSelectedListener;
 
-import com.android.cts.stub.R;
+import com.android.cts.widget.R;
 
 
-public class AdapterViewTest extends ActivityInstrumentationTestCase2<AdapterViewStubActivity> {
+public class AdapterViewTest extends ActivityInstrumentationTestCase2<AdapterViewCtsActivity> {
 
     private final static int INVALID_ID = -1;
 
@@ -54,7 +54,7 @@
     private AdapterView<ListAdapter> mAdapterView;
 
     public AdapterViewTest() {
-        super("com.android.cts.stub", AdapterViewStubActivity.class);
+        super("com.android.cts.widget", AdapterViewCtsActivity.class);
     }
 
     @Override
diff --git a/tests/tests/widget/src/android/widget/cts/AnalogClockTest.java b/tests/tests/widget/src/android/widget/cts/AnalogClockTest.java
index f3b02b0..b360fd1 100644
--- a/tests/tests/widget/src/android/widget/cts/AnalogClockTest.java
+++ b/tests/tests/widget/src/android/widget/cts/AnalogClockTest.java
@@ -16,7 +16,7 @@
 
 package android.widget.cts;
 
-import com.android.cts.stub.R;
+import com.android.cts.widget.R;
 
 
 import org.xmlpull.v1.XmlPullParser;
@@ -27,12 +27,12 @@
 import android.util.Xml;
 import android.widget.AnalogClock;
 
-public class AnalogClockTest extends ActivityInstrumentationTestCase2<FrameLayoutStubActivity> {
+public class AnalogClockTest extends ActivityInstrumentationTestCase2<FrameLayoutCtsActivity> {
     private AttributeSet mAttrSet;
     private Activity mActivity;
 
     public AnalogClockTest() {
-        super("com.android.cts.stub", FrameLayoutStubActivity.class);
+        super("com.android.cts.widget", FrameLayoutCtsActivity.class);
     }
 
     @Override
diff --git a/tests/tests/widget/src/android/widget/cts/ArrayAdapterTest.java b/tests/tests/widget/src/android/widget/cts/ArrayAdapterTest.java
index 101b271..3b00754 100644
--- a/tests/tests/widget/src/android/widget/cts/ArrayAdapterTest.java
+++ b/tests/tests/widget/src/android/widget/cts/ArrayAdapterTest.java
@@ -26,7 +26,7 @@
 import android.widget.Filter;
 import android.widget.TextView;
 
-import com.android.cts.stub.R;
+import com.android.cts.widget.R;
 
 
 public class ArrayAdapterTest extends AndroidTestCase {
diff --git a/tests/tests/widget/src/android/widget/cts/AutoCompleteCtsActivity.java b/tests/tests/widget/src/android/widget/cts/AutoCompleteCtsActivity.java
new file mode 100644
index 0000000..3d68f3e
--- /dev/null
+++ b/tests/tests/widget/src/android/widget/cts/AutoCompleteCtsActivity.java
@@ -0,0 +1,36 @@
+/*
+ * Copyright (C) 2008 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.widget.cts;
+
+import android.app.Activity;
+import android.os.Bundle;
+
+import com.android.cts.widget.R;
+
+/**
+ * A minimal application for AutoCompleteTextView test.
+ */
+public class AutoCompleteCtsActivity extends Activity {
+    /**
+     * Called with the activity is first created.
+     */
+    @Override
+    public void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.autocompletetextview_layout);
+    }
+}
diff --git a/tests/tests/widget/src/android/widget/cts/AutoCompleteTextViewTest.java b/tests/tests/widget/src/android/widget/cts/AutoCompleteTextViewTest.java
index 373c03b..f3a58bc 100644
--- a/tests/tests/widget/src/android/widget/cts/AutoCompleteTextViewTest.java
+++ b/tests/tests/widget/src/android/widget/cts/AutoCompleteTextViewTest.java
@@ -16,7 +16,7 @@
 
 package android.widget.cts;
 
-import com.android.cts.stub.R;
+import com.android.cts.widget.R;
 
 
 import org.xmlpull.v1.XmlPullParser;
@@ -45,13 +45,13 @@
 import java.io.IOException;
 
 public class AutoCompleteTextViewTest extends
-        ActivityInstrumentationTestCase2<AutoCompleteStubActivity> {
+        ActivityInstrumentationTestCase2<AutoCompleteCtsActivity> {
 
     /**
      * Instantiates a new text view test.
      */
     public AutoCompleteTextViewTest() {
-        super("com.android.cts.stub", AutoCompleteStubActivity.class);
+        super("com.android.cts.widget", AutoCompleteCtsActivity.class);
     }
 
     /** The m activity. */
diff --git a/tests/tests/widget/src/android/widget/cts/ButtonTest.java b/tests/tests/widget/src/android/widget/cts/ButtonTest.java
index 98b3318..47d7108 100644
--- a/tests/tests/widget/src/android/widget/cts/ButtonTest.java
+++ b/tests/tests/widget/src/android/widget/cts/ButtonTest.java
@@ -24,7 +24,7 @@
 import android.util.Xml;
 import android.widget.Button;
 
-import com.android.cts.stub.R;
+import com.android.cts.widget.R;
 
 
 public class ButtonTest extends AndroidTestCase {
diff --git a/tests/tests/widget/src/android/widget/cts/CheckBoxTest.java b/tests/tests/widget/src/android/widget/cts/CheckBoxTest.java
index 55960f9..21e463f 100644
--- a/tests/tests/widget/src/android/widget/cts/CheckBoxTest.java
+++ b/tests/tests/widget/src/android/widget/cts/CheckBoxTest.java
@@ -16,7 +16,7 @@
 
 package android.widget.cts;
 
-import com.android.cts.stub.R;
+import com.android.cts.widget.R;
 
 
 import org.xmlpull.v1.XmlPullParser;
diff --git a/tests/tests/widget/src/android/widget/cts/CheckedTextViewCtsActivity.java b/tests/tests/widget/src/android/widget/cts/CheckedTextViewCtsActivity.java
new file mode 100644
index 0000000..a0ed498
--- /dev/null
+++ b/tests/tests/widget/src/android/widget/cts/CheckedTextViewCtsActivity.java
@@ -0,0 +1,36 @@
+/*
+ * Copyright (C) 2009 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.widget.cts;
+
+import com.android.cts.widget.R;
+
+import android.app.Activity;
+import android.os.Bundle;
+
+/**
+ * A minimal application for CheckedTextView test.
+ */
+public class CheckedTextViewCtsActivity extends Activity {
+    /**
+     * Called with the activity is first created.
+     */
+    @Override
+    public void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.checkedtextview_layout);
+    }
+}
diff --git a/tests/tests/widget/src/android/widget/cts/CheckedTextViewTest.java b/tests/tests/widget/src/android/widget/cts/CheckedTextViewTest.java
index 6aa44c1..c5d3bd1 100644
--- a/tests/tests/widget/src/android/widget/cts/CheckedTextViewTest.java
+++ b/tests/tests/widget/src/android/widget/cts/CheckedTextViewTest.java
@@ -16,7 +16,7 @@
 
 package android.widget.cts;
 
-import com.android.cts.stub.R;
+import com.android.cts.widget.R;
 
 
 import android.app.Activity;
@@ -38,13 +38,13 @@
 import java.util.Arrays;
 
 public class CheckedTextViewTest extends
-        ActivityInstrumentationTestCase2<CheckedTextViewStubActivity> {
+        ActivityInstrumentationTestCase2<CheckedTextViewCtsActivity> {
     private Resources mResources;
     private Activity mActivity;
     private Instrumentation mInstrumentation;
 
     public CheckedTextViewTest() {
-        super("com.android.cts.stub", CheckedTextViewStubActivity.class);
+        super("com.android.cts.widget", CheckedTextViewCtsActivity.class);
     }
 
     @Override
diff --git a/tests/tests/widget/src/android/widget/cts/ChronometerCtsActivity.java b/tests/tests/widget/src/android/widget/cts/ChronometerCtsActivity.java
new file mode 100644
index 0000000..3a7833d
--- /dev/null
+++ b/tests/tests/widget/src/android/widget/cts/ChronometerCtsActivity.java
@@ -0,0 +1,45 @@
+/*
+ * Copyright (C) 2008 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.widget.cts;
+
+import com.android.cts.widget.R;
+import android.app.Activity;
+import android.os.Bundle;
+import android.view.ViewGroup;
+import android.widget.Chronometer;
+
+public class ChronometerCtsActivity extends Activity {
+
+    private Chronometer chronometer;
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.chronometer_stub_layout);
+        chronometer = (Chronometer) findViewById(R.id.test_chronometer);
+    }
+
+    public Chronometer getChronometer() {
+        return chronometer;
+    }
+
+    public ViewGroup getViewGroup() {
+        return (ViewGroup) findViewById(R.id.chronometer_view_group);
+    }
+
+}
+
diff --git a/tests/tests/widget/src/android/widget/cts/ChronometerTest.java b/tests/tests/widget/src/android/widget/cts/ChronometerTest.java
index 7fbb58a..992577c 100644
--- a/tests/tests/widget/src/android/widget/cts/ChronometerTest.java
+++ b/tests/tests/widget/src/android/widget/cts/ChronometerTest.java
@@ -25,10 +25,10 @@
 /**
  * Test {@link Chronometer}.
  */
-public class ChronometerTest extends ActivityInstrumentationTestCase2<ChronometerStubActivity> {
-    private ChronometerStubActivity mActivity;
+public class ChronometerTest extends ActivityInstrumentationTestCase2<ChronometerCtsActivity> {
+    private ChronometerCtsActivity mActivity;
     public ChronometerTest() {
-        super("com.android.cts.stub", ChronometerStubActivity.class);
+        super("com.android.cts.widget", ChronometerCtsActivity.class);
     }
 
     @Override
diff --git a/tests/tests/widget/src/android/widget/cts/CompoundButtonTest.java b/tests/tests/widget/src/android/widget/cts/CompoundButtonTest.java
index 6674ef6..bf5382a 100644
--- a/tests/tests/widget/src/android/widget/cts/CompoundButtonTest.java
+++ b/tests/tests/widget/src/android/widget/cts/CompoundButtonTest.java
@@ -22,7 +22,7 @@
 import android.graphics.PorterDuff;
 import android.view.LayoutInflater;
 import android.widget.ToggleButton;
-import com.android.cts.stub.R;
+import com.android.cts.widget.R;
 
 
 import org.xmlpull.v1.XmlPullParser;
diff --git a/tests/tests/widget/src/android/widget/cts/CtsActivity.java b/tests/tests/widget/src/android/widget/cts/CtsActivity.java
new file mode 100644
index 0000000..e099694
--- /dev/null
+++ b/tests/tests/widget/src/android/widget/cts/CtsActivity.java
@@ -0,0 +1,26 @@
+/*
+ * Copyright (C) 2009 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.widget.cts;
+
+import android.app.Activity;
+
+/**
+ * Stub activity for helping test. It's an empty activity.
+ */
+public class CtsActivity extends Activity {
+
+}
diff --git a/tests/tests/widget/src/android/widget/cts/CursorAdapterTest.java b/tests/tests/widget/src/android/widget/cts/CursorAdapterTest.java
index 963c392..6ff22b0 100644
--- a/tests/tests/widget/src/android/widget/cts/CursorAdapterTest.java
+++ b/tests/tests/widget/src/android/widget/cts/CursorAdapterTest.java
@@ -25,7 +25,6 @@
 import android.database.DataSetObserver;
 import android.database.sqlite.SQLiteDatabase;
 import android.os.Looper;
-import android.os.cts.TestThread;
 import android.test.AndroidTestCase;
 import android.view.LayoutInflater;
 import android.view.View;
@@ -35,7 +34,7 @@
 import android.widget.FilterQueryProvider;
 import android.widget.TextView;
 
-import com.android.cts.stub.R;
+import com.android.cts.widget.R;
 
 
 /**
diff --git a/tests/tests/widget/src/android/widget/cts/CursorTreeAdapterTest.java b/tests/tests/widget/src/android/widget/cts/CursorTreeAdapterTest.java
index 1d26777..011a031 100644
--- a/tests/tests/widget/src/android/widget/cts/CursorTreeAdapterTest.java
+++ b/tests/tests/widget/src/android/widget/cts/CursorTreeAdapterTest.java
@@ -31,7 +31,7 @@
 import android.widget.FilterQueryProvider;
 import android.widget.TextView;
 
-import com.android.cts.stub.R;
+import com.android.cts.widget.R;
 
 
 /**
diff --git a/tests/tests/widget/src/android/widget/cts/DatePickerTest.java b/tests/tests/widget/src/android/widget/cts/DatePickerTest.java
index ad9da7c..aa727b7 100644
--- a/tests/tests/widget/src/android/widget/cts/DatePickerTest.java
+++ b/tests/tests/widget/src/android/widget/cts/DatePickerTest.java
@@ -16,7 +16,7 @@
 
 package android.widget.cts;
 
-import com.android.cts.stub.R;
+import com.android.cts.widget.R;
 import com.android.internal.util.XmlUtils;
 
 
diff --git a/tests/tests/widget/src/android/widget/cts/DialerFilterCtsActivity.java b/tests/tests/widget/src/android/widget/cts/DialerFilterCtsActivity.java
new file mode 100644
index 0000000..572d3fb
--- /dev/null
+++ b/tests/tests/widget/src/android/widget/cts/DialerFilterCtsActivity.java
@@ -0,0 +1,35 @@
+/*
+ * Copyright (C) 2008 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.widget.cts;
+
+import android.app.Activity;
+import android.os.Bundle;
+import com.android.cts.widget.R;
+
+/**
+ * A minimal application for DialerFilter test.
+ */
+public class DialerFilterCtsActivity extends Activity {
+    /**
+     * Called with the activity is first created.
+     */
+    @Override
+    public void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.dialerfilter_layout);
+    }
+}
diff --git a/tests/tests/widget/src/android/widget/cts/DialerFilterTest.java b/tests/tests/widget/src/android/widget/cts/DialerFilterTest.java
index 1c5c7ff..9b7fb56 100644
--- a/tests/tests/widget/src/android/widget/cts/DialerFilterTest.java
+++ b/tests/tests/widget/src/android/widget/cts/DialerFilterTest.java
@@ -16,7 +16,7 @@
 
 package android.widget.cts;
 
-import com.android.cts.stub.R;
+import com.android.cts.widget.R;
 
 
 import org.xmlpull.v1.XmlPullParser;
@@ -39,13 +39,13 @@
 import android.widget.EditText;
 import android.widget.RelativeLayout;
 
-public class DialerFilterTest extends ActivityInstrumentationTestCase2<DialerFilterStubActivity> {
+public class DialerFilterTest extends ActivityInstrumentationTestCase2<DialerFilterCtsActivity> {
     private Activity mActivity;
     private Instrumentation mInstrumentation;
     private DialerFilter mDialerFilter;
 
     public DialerFilterTest() {
-        super("com.android.cts.stub", DialerFilterStubActivity.class);
+        super("com.android.cts.widget", DialerFilterCtsActivity.class);
     }
 
     @Override
diff --git a/tests/tests/widget/src/android/widget/cts/DigitalClockCtsActivity.java b/tests/tests/widget/src/android/widget/cts/DigitalClockCtsActivity.java
new file mode 100644
index 0000000..68cb3f0
--- /dev/null
+++ b/tests/tests/widget/src/android/widget/cts/DigitalClockCtsActivity.java
@@ -0,0 +1,36 @@
+/*
+ * Copyright (C) 2008 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.widget.cts;
+
+import com.android.cts.widget.R;
+
+import android.app.Activity;
+import android.os.Bundle;
+
+/**
+ * A minimal application for TextView test.
+ */
+public class DigitalClockCtsActivity extends Activity {
+    /**
+     * Called with the activity is first created.
+     */
+    @Override
+    public void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.digitalclock_simplelayout);
+    }
+}
diff --git a/tests/tests/widget/src/android/widget/cts/DigitalClockTest.java b/tests/tests/widget/src/android/widget/cts/DigitalClockTest.java
index 4184cdd..26caef0 100644
--- a/tests/tests/widget/src/android/widget/cts/DigitalClockTest.java
+++ b/tests/tests/widget/src/android/widget/cts/DigitalClockTest.java
@@ -30,19 +30,19 @@
 import android.widget.DigitalClock;
 import android.widget.LinearLayout;
 
-import com.android.cts.stub.R;
+import com.android.cts.widget.R;
 import com.android.internal.util.XmlUtils;
 
 
 /**
  * Test {@link DigitalClock}.
  */
-public class DigitalClockTest extends ActivityInstrumentationTestCase<DigitalClockStubActivity> {
+public class DigitalClockTest extends ActivityInstrumentationTestCase<DigitalClockCtsActivity> {
     private Activity mActivity;
     private Context mContext;
 
     public DigitalClockTest() {
-        super("com.android.cts.stub", DigitalClockStubActivity.class);
+        super("com.android.cts.widget", DigitalClockCtsActivity.class);
     }
 
     @Override
@@ -113,7 +113,7 @@
     private AttributeSet getAttributeSet(int resourceId) {
         XmlResourceParser parser = mActivity.getResources().getXml(resourceId);
         try {
-            XmlUtils.beginDocument(parser, "com.android.cts.stub.alarmclock.DigitalClock");
+            XmlUtils.beginDocument(parser, "com.android.cts.widget.alarmclock.DigitalClock");
         } catch (XmlPullParserException e) {
             fail("unexpected XmlPullParserException.");
         } catch (IOException e) {
diff --git a/tests/tests/widget/src/android/widget/cts/EditTextTest.java b/tests/tests/widget/src/android/widget/cts/EditTextTest.java
index ee10900..7a71a58 100644
--- a/tests/tests/widget/src/android/widget/cts/EditTextTest.java
+++ b/tests/tests/widget/src/android/widget/cts/EditTextTest.java
@@ -28,7 +28,7 @@
 import android.widget.EditText;
 import android.widget.TextView.BufferType;
 
-import com.android.cts.stub.R;
+import com.android.cts.widget.R;
 
 
 public class EditTextTest extends AndroidTestCase {
diff --git a/tests/src/android/widget/cts/ExpandableListSimple.java b/tests/tests/widget/src/android/widget/cts/ExpandableListSimple.java
similarity index 100%
rename from tests/src/android/widget/cts/ExpandableListSimple.java
rename to tests/tests/widget/src/android/widget/cts/ExpandableListSimple.java
diff --git a/tests/tests/widget/src/android/widget/cts/ExpandableListViewTest.java b/tests/tests/widget/src/android/widget/cts/ExpandableListViewTest.java
index 67dcb30..ac48ed8 100644
--- a/tests/tests/widget/src/android/widget/cts/ExpandableListViewTest.java
+++ b/tests/tests/widget/src/android/widget/cts/ExpandableListViewTest.java
@@ -16,7 +16,7 @@
 
 package android.widget.cts;
 
-import com.android.cts.stub.R;
+import com.android.cts.widget.R;
 
 
 import org.xmlpull.v1.XmlPullParser;
diff --git a/tests/src/android/widget/cts/ExpandableListWithHeaders.java b/tests/tests/widget/src/android/widget/cts/ExpandableListWithHeaders.java
similarity index 100%
rename from tests/src/android/widget/cts/ExpandableListWithHeaders.java
rename to tests/tests/widget/src/android/widget/cts/ExpandableListWithHeaders.java
diff --git a/tests/tests/widget/src/android/widget/cts/FilterTest.java b/tests/tests/widget/src/android/widget/cts/FilterTest.java
index 394f861..3441431 100644
--- a/tests/tests/widget/src/android/widget/cts/FilterTest.java
+++ b/tests/tests/widget/src/android/widget/cts/FilterTest.java
@@ -22,13 +22,13 @@
 import android.widget.Filter;
 import android.widget.Filter.FilterListener;
 
-public class FilterTest extends ActivityInstrumentationTestCase2<StubActivity> {
+public class FilterTest extends ActivityInstrumentationTestCase2<CtsActivity> {
     private static final long TIME_OUT = 10000;
     private static final String TEST_CONSTRAINT = "filter test";
     private MockFilter mMockFilter;
 
     public FilterTest() {
-        super("com.android.cts.stub", StubActivity.class);
+        super("com.android.cts.widget", CtsActivity.class);
     }
 
     public void testConstructor() {
diff --git a/tests/tests/widget/src/android/widget/cts/FrameLayoutCtsActivity.java b/tests/tests/widget/src/android/widget/cts/FrameLayoutCtsActivity.java
new file mode 100644
index 0000000..c638313
--- /dev/null
+++ b/tests/tests/widget/src/android/widget/cts/FrameLayoutCtsActivity.java
@@ -0,0 +1,36 @@
+/*
+ * Copyright (C) 2008 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.widget.cts;
+
+import android.app.Activity;
+import android.os.Bundle;
+import com.android.cts.widget.R;
+
+/**
+ * A minimal application for frame layout test.
+ */
+public class FrameLayoutCtsActivity extends Activity {
+    /**
+     * Called with the activity is first created.
+     */
+    @Override
+    public void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.framelayout_layout);
+    }
+}
+
diff --git a/tests/tests/widget/src/android/widget/cts/FrameLayoutTest.java b/tests/tests/widget/src/android/widget/cts/FrameLayoutTest.java
index b1a0d44..dcab088 100644
--- a/tests/tests/widget/src/android/widget/cts/FrameLayoutTest.java
+++ b/tests/tests/widget/src/android/widget/cts/FrameLayoutTest.java
@@ -22,7 +22,7 @@
 import android.graphics.ColorFilter;
 import android.graphics.PorterDuff;
 
-import com.android.cts.stub.R;
+import com.android.cts.widget.R;
 
 import org.xmlpull.v1.XmlPullParser;
 import org.xmlpull.v1.XmlPullParserException;
@@ -49,13 +49,13 @@
 
 import java.io.IOException;
 
-public class FrameLayoutTest extends ActivityInstrumentationTestCase2<FrameLayoutStubActivity> {
+public class FrameLayoutTest extends ActivityInstrumentationTestCase2<FrameLayoutCtsActivity> {
     private Activity mActivity;
     private Instrumentation mInstrumentation;
     private FrameLayout mFrameLayout;
 
     public FrameLayoutTest() {
-        super("com.android.cts.stub", FrameLayoutStubActivity.class);
+        super("com.android.cts.widget", FrameLayoutCtsActivity.class);
     }
 
     @Override
diff --git a/tests/tests/widget/src/android/widget/cts/FrameLayout_LayoutParamsTest.java b/tests/tests/widget/src/android/widget/cts/FrameLayout_LayoutParamsTest.java
index 89529a2..d8f1296 100644
--- a/tests/tests/widget/src/android/widget/cts/FrameLayout_LayoutParamsTest.java
+++ b/tests/tests/widget/src/android/widget/cts/FrameLayout_LayoutParamsTest.java
@@ -16,7 +16,7 @@
 
 package android.widget.cts;
 
-import com.android.cts.stub.R;
+import com.android.cts.widget.R;
 
 
 import org.xmlpull.v1.XmlPullParser;
diff --git a/tests/tests/widget/src/android/widget/cts/GalleryCtsActivity.java b/tests/tests/widget/src/android/widget/cts/GalleryCtsActivity.java
new file mode 100644
index 0000000..8d32717
--- /dev/null
+++ b/tests/tests/widget/src/android/widget/cts/GalleryCtsActivity.java
@@ -0,0 +1,86 @@
+/*
+ * Copyright (C) 2008 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.widget.cts;
+
+import com.android.cts.widget.R;
+
+import android.app.Activity;
+import android.content.Context;
+import android.os.Bundle;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.BaseAdapter;
+import android.widget.Gallery;
+import android.widget.ImageView;
+
+/**
+ * A minimal application for {@link Gallery} test.
+ */
+public class GalleryCtsActivity extends Activity {
+    @Override
+    public void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.gallery_test);
+
+        Gallery gallery = (Gallery) findViewById(R.id.gallery_test);
+        ImageAdapter adapter = new ImageAdapter(this);
+        gallery.setAdapter(adapter);
+    }
+
+    private static class ImageAdapter extends BaseAdapter {
+        public ImageAdapter(Context c) {
+            mContext = c;
+        }
+
+        public int getCount() {
+            return mImageIds.length;
+        }
+
+        public Object getItem(int position) {
+            return position;
+        }
+
+        public long getItemId(int position) {
+            return position;
+        }
+
+        public View getView(int position, View convertView, ViewGroup parent) {
+            ImageView i = new ImageView(mContext);
+
+            i.setImageResource(mImageIds[position]);
+            i.setScaleType(ImageView.ScaleType.FIT_XY);
+            // let the item's width be 136, height be 88
+            i.setLayoutParams(new Gallery.LayoutParams(136, 88));
+
+            return i;
+        }
+
+        private Context mContext;
+
+        private Integer[] mImageIds = {
+                R.drawable.faces,
+                R.drawable.scenery,
+                R.drawable.testimage,
+                R.drawable.faces,
+                R.drawable.scenery,
+                R.drawable.testimage,
+                R.drawable.faces,
+                R.drawable.scenery,
+                R.drawable.testimage,
+        };
+    }
+}
diff --git a/tests/tests/widget/src/android/widget/cts/GalleryTest.java b/tests/tests/widget/src/android/widget/cts/GalleryTest.java
index 0aacda4..d42c375 100644
--- a/tests/tests/widget/src/android/widget/cts/GalleryTest.java
+++ b/tests/tests/widget/src/android/widget/cts/GalleryTest.java
@@ -16,7 +16,7 @@
 
 package android.widget.cts;
 
-import com.android.cts.stub.R;
+import com.android.cts.widget.R;
 import com.android.internal.view.menu.ContextMenuBuilder;
 
 
@@ -53,7 +53,7 @@
 /**
  * Test {@link Gallery}.
  */
-public class GalleryTest extends ActivityInstrumentationTestCase2<GalleryStubActivity>  {
+public class GalleryTest extends ActivityInstrumentationTestCase2<GalleryCtsActivity>  {
     private Gallery mGallery;
     private Activity mActivity;
     private Instrumentation mInstrumentation;
@@ -61,7 +61,7 @@
     private final static float DELTA = 0.01f;
 
     public GalleryTest() {
-        super("com.android.cts.stub", GalleryStubActivity.class);
+        super("com.android.cts.widget", GalleryCtsActivity.class);
     }
 
     @Override
diff --git a/tests/tests/widget/src/android/widget/cts/Gallery_LayoutParamsTest.java b/tests/tests/widget/src/android/widget/cts/Gallery_LayoutParamsTest.java
index af031e4..de90ed3 100644
--- a/tests/tests/widget/src/android/widget/cts/Gallery_LayoutParamsTest.java
+++ b/tests/tests/widget/src/android/widget/cts/Gallery_LayoutParamsTest.java
@@ -16,7 +16,7 @@
 
 package android.widget.cts;
 
-import com.android.cts.stub.R;
+import com.android.cts.widget.R;
 
 
 import org.xmlpull.v1.XmlPullParserException;
diff --git a/tests/tests/widget/src/android/widget/cts/GridLayoutCtsActivity.java b/tests/tests/widget/src/android/widget/cts/GridLayoutCtsActivity.java
new file mode 100644
index 0000000..3277ee8
--- /dev/null
+++ b/tests/tests/widget/src/android/widget/cts/GridLayoutCtsActivity.java
@@ -0,0 +1,32 @@
+/*
+ * Copyright (C) 2012 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.widget.cts;
+
+import android.app.Activity;
+import android.os.Bundle;
+import com.android.cts.widget.R;
+
+/**
+ * A minimal application for {@link android.widget.GridLayout} test.
+ */
+public class GridLayoutCtsActivity extends Activity {
+    @Override
+    public void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.gridlayout_layout);
+    }
+}
diff --git a/tests/tests/widget/src/android/widget/cts/GridLayoutTest.java b/tests/tests/widget/src/android/widget/cts/GridLayoutTest.java
index 638fe96..d701623 100644
--- a/tests/tests/widget/src/android/widget/cts/GridLayoutTest.java
+++ b/tests/tests/widget/src/android/widget/cts/GridLayoutTest.java
@@ -27,7 +27,7 @@
 import android.widget.Button;
 import android.widget.GridLayout;
 import android.widget.TextView;
-import com.android.cts.stub.R;
+import com.android.cts.widget.R;
 import org.xmlpull.v1.XmlPullParser;
 
 import static android.view.ViewGroup.LAYOUT_MODE_OPTICAL_BOUNDS;
@@ -36,7 +36,7 @@
 /**
  * Test {@link android.widget.GridLayout}.
  */
-public class GridLayoutTest extends ActivityInstrumentationTestCase<GridLayoutStubActivity> {
+public class GridLayoutTest extends ActivityInstrumentationTestCase<GridLayoutCtsActivity> {
 
     // The size of the off-screen test container in which we we will testing layout.
     public static final int MAX_X = 2000;
@@ -117,7 +117,7 @@
     private Context mContext;
 
     public GridLayoutTest() {
-        super("com.android.cts.stub", GridLayoutStubActivity.class);
+        super("com.android.cts.widget", GridLayoutCtsActivity.class);
     }
 
     @Override
diff --git a/tests/tests/widget/src/android/widget/cts/GridViewCtsActivity.java b/tests/tests/widget/src/android/widget/cts/GridViewCtsActivity.java
new file mode 100644
index 0000000..7a1182d
--- /dev/null
+++ b/tests/tests/widget/src/android/widget/cts/GridViewCtsActivity.java
@@ -0,0 +1,37 @@
+/*
+ * Copyright (C) 2008 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.widget.cts;
+
+import com.android.cts.widget.R;
+
+import android.app.Activity;
+import android.os.Bundle;
+
+/**
+ * A minimal application for {@link GridView} test.
+ */
+public class GridViewCtsActivity extends Activity {
+    /**
+     * Called with the activity is first created.
+     */
+    @Override
+    public void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.gridview_layout);
+    }
+}
+
diff --git a/tests/tests/widget/src/android/widget/cts/GridViewTest.java b/tests/tests/widget/src/android/widget/cts/GridViewTest.java
index bd42e35..042986c 100644
--- a/tests/tests/widget/src/android/widget/cts/GridViewTest.java
+++ b/tests/tests/widget/src/android/widget/cts/GridViewTest.java
@@ -16,7 +16,7 @@
 
 package android.widget.cts;
 
-import com.android.cts.stub.R;
+import com.android.cts.widget.R;
 
 
 import org.xmlpull.v1.XmlPullParser;
@@ -51,13 +51,13 @@
 /**
  * Test {@link GridView}.
  */
-public class GridViewTest extends ActivityInstrumentationTestCase<GridViewStubActivity> {
+public class GridViewTest extends ActivityInstrumentationTestCase<GridViewCtsActivity> {
     private GridView mGridView;
     private Activity mActivity;
     private Instrumentation mInstrumentation;
 
     public GridViewTest() {
-        super("com.android.cts.stub", GridViewStubActivity.class);
+        super("com.android.cts.widget", GridViewCtsActivity.class);
     }
 
     private GridView findGridViewById(int id) {
diff --git a/tests/tests/widget/src/android/widget/cts/HorizontalScrollViewCtsActivity.java b/tests/tests/widget/src/android/widget/cts/HorizontalScrollViewCtsActivity.java
new file mode 100644
index 0000000..312111a
--- /dev/null
+++ b/tests/tests/widget/src/android/widget/cts/HorizontalScrollViewCtsActivity.java
@@ -0,0 +1,30 @@
+/*
+ * Copyright (C) 2009 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.widget.cts;
+
+import com.android.cts.widget.R;
+
+import android.app.Activity;
+import android.os.Bundle;
+
+public class HorizontalScrollViewCtsActivity extends Activity {
+    @Override
+    public void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.horizontal_scrollview);
+    }
+}
diff --git a/tests/tests/widget/src/android/widget/cts/HorizontalScrollViewTest.java b/tests/tests/widget/src/android/widget/cts/HorizontalScrollViewTest.java
index 5d75006..2862865 100644
--- a/tests/tests/widget/src/android/widget/cts/HorizontalScrollViewTest.java
+++ b/tests/tests/widget/src/android/widget/cts/HorizontalScrollViewTest.java
@@ -16,7 +16,7 @@
 
 package android.widget.cts;
 
-import com.android.cts.stub.R;
+import com.android.cts.widget.R;
 
 
 import org.xmlpull.v1.XmlPullParser;
@@ -42,7 +42,7 @@
  * Test {@link HorizontalScrollView}.
  */
 public class HorizontalScrollViewTest
-        extends ActivityInstrumentationTestCase2<HorizontalScrollViewStubActivity> {
+        extends ActivityInstrumentationTestCase2<HorizontalScrollViewCtsActivity> {
     private static final int ITEM_WIDTH  = 250;
     private static final int ITEM_HEIGHT = 100;
     private static final int ITEM_COUNT  = 15;
@@ -53,7 +53,7 @@
     private Activity mActivity;
 
     public HorizontalScrollViewTest() {
-        super("com.android.cts.stub", HorizontalScrollViewStubActivity.class);
+        super("com.android.cts.widget", HorizontalScrollViewCtsActivity.class);
     }
 
     @Override
diff --git a/tests/tests/widget/src/android/widget/cts/ImageButtonTest.java b/tests/tests/widget/src/android/widget/cts/ImageButtonTest.java
index a71ec9d..374c9c2 100644
--- a/tests/tests/widget/src/android/widget/cts/ImageButtonTest.java
+++ b/tests/tests/widget/src/android/widget/cts/ImageButtonTest.java
@@ -16,7 +16,7 @@
 
 package android.widget.cts;
 
-import com.android.cts.stub.R;
+import com.android.cts.widget.R;
 
 
 import org.xmlpull.v1.XmlPullParser;
diff --git a/tests/tests/widget/src/android/widget/cts/ImageSwitcherTest.java b/tests/tests/widget/src/android/widget/cts/ImageSwitcherTest.java
index 49bf3c6..c0e606c 100644
--- a/tests/tests/widget/src/android/widget/cts/ImageSwitcherTest.java
+++ b/tests/tests/widget/src/android/widget/cts/ImageSwitcherTest.java
@@ -16,7 +16,7 @@
 
 package android.widget.cts;
 
-import com.android.cts.stub.R;
+import com.android.cts.widget.R;
 
 
 import org.xmlpull.v1.XmlPullParser;
diff --git a/tests/tests/widget/src/android/widget/cts/ImageViewCtsActivity.java b/tests/tests/widget/src/android/widget/cts/ImageViewCtsActivity.java
new file mode 100644
index 0000000..295f3da
--- /dev/null
+++ b/tests/tests/widget/src/android/widget/cts/ImageViewCtsActivity.java
@@ -0,0 +1,37 @@
+/*
+ * Copyright (C) 2008 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.widget.cts;
+
+import com.android.cts.widget.R;
+
+import android.app.Activity;
+import android.os.Bundle;
+
+/**
+ * A minimal application for {@link ImageView} test.
+ */
+public class ImageViewCtsActivity extends Activity {
+    /**
+     * Called with the activity is first created.
+     */
+    @Override
+    public void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.imageview_layout);
+    }
+}
+
diff --git a/tests/tests/widget/src/android/widget/cts/ImageViewTest.java b/tests/tests/widget/src/android/widget/cts/ImageViewTest.java
index 84276f9..7b0b65a 100644
--- a/tests/tests/widget/src/android/widget/cts/ImageViewTest.java
+++ b/tests/tests/widget/src/android/widget/cts/ImageViewTest.java
@@ -47,18 +47,18 @@
 import android.widget.ImageView;
 import android.widget.ImageView.ScaleType;
 
-import com.android.cts.stub.R;
+import com.android.cts.widget.R;
 
 
 /**
  * Test {@link ImageView}.
  */
-public class ImageViewTest extends ActivityInstrumentationTestCase<ImageViewStubActivity> {
+public class ImageViewTest extends ActivityInstrumentationTestCase<ImageViewCtsActivity> {
     private ImageView mImageView;
     private Activity mActivity;
 
     public ImageViewTest() {
-        super("com.android.cts.stub", ImageViewStubActivity.class);
+        super("com.android.cts.widget", ImageViewCtsActivity.class);
     }
 
     /**
diff --git a/tests/tests/widget/src/android/widget/cts/LayoutDirectionCtsActivity.java b/tests/tests/widget/src/android/widget/cts/LayoutDirectionCtsActivity.java
new file mode 100644
index 0000000..093f554
--- /dev/null
+++ b/tests/tests/widget/src/android/widget/cts/LayoutDirectionCtsActivity.java
@@ -0,0 +1,32 @@
+/*
+ * Copyright (C) 2012 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.widget.cts;
+
+import android.app.Activity;
+import android.os.Bundle;
+import com.android.cts.widget.R;
+
+/**
+ * A minimal application for layout direction test.
+ */
+public class LayoutDirectionCtsActivity extends Activity {
+    @Override
+    public void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.layoutdirection_layout);
+    }
+}
diff --git a/tests/tests/widget/src/android/widget/cts/LayoutDirectionTest.java b/tests/tests/widget/src/android/widget/cts/LayoutDirectionTest.java
index 5c8be24..c393e95 100644
--- a/tests/tests/widget/src/android/widget/cts/LayoutDirectionTest.java
+++ b/tests/tests/widget/src/android/widget/cts/LayoutDirectionTest.java
@@ -20,17 +20,17 @@
 import android.test.UiThreadTest;
 import android.view.ViewGroup;
 import android.widget.*;
-import com.android.cts.stub.R;
+import com.android.cts.widget.R;
 
 import static android.view.View.LAYOUT_DIRECTION_LTR;
 import static android.view.View.LAYOUT_DIRECTION_RTL;
 import static android.view.View.LAYOUT_DIRECTION_INHERIT;
 import static android.view.View.LAYOUT_DIRECTION_LOCALE;
 
-public class LayoutDirectionTest extends ActivityInstrumentationTestCase2<LayoutDirectionStubActivity> {
+public class LayoutDirectionTest extends ActivityInstrumentationTestCase2<LayoutDirectionCtsActivity> {
 
     public LayoutDirectionTest() {
-        super(LayoutDirectionStubActivity.class);
+        super(LayoutDirectionCtsActivity.class);
     }
 
     private void checkDefaultDirectionForOneLayoutWithCode(ViewGroup vg) {
diff --git a/tests/tests/widget/src/android/widget/cts/LinearLayoutCtsActivity.java b/tests/tests/widget/src/android/widget/cts/LinearLayoutCtsActivity.java
new file mode 100644
index 0000000..0cb5bc0
--- /dev/null
+++ b/tests/tests/widget/src/android/widget/cts/LinearLayoutCtsActivity.java
@@ -0,0 +1,33 @@
+/*
+ * Copyright (C) 2008 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.widget.cts;
+
+import com.android.cts.widget.R;
+
+import android.app.Activity;
+import android.os.Bundle;
+
+/**
+ * A minimal application for {@link LinearLayout} test.
+ */
+public class LinearLayoutCtsActivity extends Activity {
+    @Override
+    public void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.linearlayout_layout);
+    }
+}
diff --git a/tests/tests/widget/src/android/widget/cts/LinearLayoutTest.java b/tests/tests/widget/src/android/widget/cts/LinearLayoutTest.java
index 4465533..5815f9a 100644
--- a/tests/tests/widget/src/android/widget/cts/LinearLayoutTest.java
+++ b/tests/tests/widget/src/android/widget/cts/LinearLayoutTest.java
@@ -31,17 +31,17 @@
 import android.widget.ListView;
 import android.widget.TextView;
 
-import com.android.cts.stub.R;
+import com.android.cts.widget.R;
 
 /**
  * Test {@link LinearLayout}.
  */
-public class LinearLayoutTest extends ActivityInstrumentationTestCase<LinearLayoutStubActivity> {
+public class LinearLayoutTest extends ActivityInstrumentationTestCase<LinearLayoutCtsActivity> {
     private Context mContext;
     private Activity mActivity;
 
     public LinearLayoutTest() {
-        super("com.android.cts.stub", LinearLayoutStubActivity.class);
+        super("com.android.cts.widget", LinearLayoutCtsActivity.class);
     }
 
     @Override
diff --git a/tests/tests/widget/src/android/widget/cts/LinearLayout_LayoutParamsTest.java b/tests/tests/widget/src/android/widget/cts/LinearLayout_LayoutParamsTest.java
index 72f3ff6..8ecca6f 100644
--- a/tests/tests/widget/src/android/widget/cts/LinearLayout_LayoutParamsTest.java
+++ b/tests/tests/widget/src/android/widget/cts/LinearLayout_LayoutParamsTest.java
@@ -16,7 +16,7 @@
 
 package android.widget.cts;
 
-import com.android.cts.stub.R;
+import com.android.cts.widget.R;
 import com.android.internal.util.XmlUtils;
 
 
diff --git a/tests/tests/widget/src/android/widget/cts/ListViewCtsActivity.java b/tests/tests/widget/src/android/widget/cts/ListViewCtsActivity.java
new file mode 100644
index 0000000..186e47b
--- /dev/null
+++ b/tests/tests/widget/src/android/widget/cts/ListViewCtsActivity.java
@@ -0,0 +1,30 @@
+/*
+ * Copyright (C) 2009 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.widget.cts;
+
+import com.android.cts.widget.R;
+
+import android.app.Activity;
+import android.os.Bundle;
+
+public class ListViewCtsActivity extends Activity {
+    @Override
+    public void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.listview_layout);
+    }
+}
diff --git a/tests/tests/widget/src/android/widget/cts/ListViewTest.java b/tests/tests/widget/src/android/widget/cts/ListViewTest.java
index 7af8c2e..5f0967a 100644
--- a/tests/tests/widget/src/android/widget/cts/ListViewTest.java
+++ b/tests/tests/widget/src/android/widget/cts/ListViewTest.java
@@ -16,7 +16,7 @@
 
 package android.widget.cts;
 
-import com.android.cts.stub.R;
+import com.android.cts.widget.R;
 import com.google.android.collect.Lists;
 
 import org.xmlpull.v1.XmlPullParser;
@@ -51,7 +51,7 @@
 
 import junit.framework.Assert;
 
-public class ListViewTest extends ActivityInstrumentationTestCase2<ListViewStubActivity> {
+public class ListViewTest extends ActivityInstrumentationTestCase2<ListViewCtsActivity> {
     private final String[] mCountryList = new String[] {
         "Argentina", "Australia", "China", "France", "Germany", "Italy", "Japan", "United States"
     };
@@ -69,7 +69,7 @@
     private ArrayAdapter<String> mAdapter_empty;
 
     public ListViewTest() {
-        super("com.android.cts.stub", ListViewStubActivity.class);
+        super("com.android.cts.widget", ListViewCtsActivity.class);
     }
 
     protected void setUp() throws Exception {
diff --git a/tests/tests/widget/src/android/widget/cts/MediaControllerCtsActivity.java b/tests/tests/widget/src/android/widget/cts/MediaControllerCtsActivity.java
new file mode 100644
index 0000000..5dfcc59
--- /dev/null
+++ b/tests/tests/widget/src/android/widget/cts/MediaControllerCtsActivity.java
@@ -0,0 +1,37 @@
+/*
+ * Copyright (C) 2008 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.widget.cts;
+
+import android.app.Activity;
+import android.os.Bundle;
+import android.widget.MediaController;
+
+import com.android.cts.widget.R;
+
+/**
+ * A minimal application for {@link MediaController} test.
+ */
+public class MediaControllerCtsActivity extends Activity {
+    /**
+     * Called with the activity is first created.
+     */
+    @Override
+    public void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.mediacontroller_layout);
+    }
+}
diff --git a/tests/tests/widget/src/android/widget/cts/MediaControllerTest.java b/tests/tests/widget/src/android/widget/cts/MediaControllerTest.java
index 5ae692b..a12dba6 100644
--- a/tests/tests/widget/src/android/widget/cts/MediaControllerTest.java
+++ b/tests/tests/widget/src/android/widget/cts/MediaControllerTest.java
@@ -16,7 +16,7 @@
 
 package android.widget.cts;
 
-import com.android.cts.stub.R;
+import com.android.cts.widget.R;
 
 
 import org.xmlpull.v1.XmlPullParser;
@@ -43,14 +43,14 @@
  * Test {@link MediaController}.
  */
 public class MediaControllerTest extends
-        ActivityInstrumentationTestCase2<MediaControllerStubActivity> {
+        ActivityInstrumentationTestCase2<MediaControllerCtsActivity> {
     private MediaController mMediaController;
     private Activity mActivity;
     private Instrumentation mInstrumentation;
     private static final long DEFAULT_TIMEOUT = 3000;
 
     public MediaControllerTest() {
-        super("com.android.cts.stub", MediaControllerStubActivity.class);
+        super("com.android.cts.widget", MediaControllerCtsActivity.class);
     }
 
     @Override
diff --git a/tests/tests/widget/src/android/widget/cts/MockApplication.java b/tests/tests/widget/src/android/widget/cts/MockApplication.java
new file mode 100644
index 0000000..827599d
--- /dev/null
+++ b/tests/tests/widget/src/android/widget/cts/MockApplication.java
@@ -0,0 +1,59 @@
+/*
+ * Copyright (C) 2008 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.widget.cts;
+
+import android.app.Application;
+import android.content.res.Configuration;
+
+
+public class MockApplication extends Application {
+
+    public boolean isOnCreateCalled;
+    public boolean isConstructorCalled;
+    public boolean isOnConfigurationChangedCalled;
+    public boolean isOnLowMemoryCalled;
+
+    public MockApplication() {
+        super();
+        isConstructorCalled = true;
+    }
+
+    @Override
+    public void onCreate() {
+        super.onCreate();
+        isOnCreateCalled = true;
+    }
+
+    @Override
+    public void onTerminate() {
+        super.onTerminate();
+        // The documentation states that one cannot rely on this method being called. No need to
+        // test it here.
+    }
+
+    @Override
+    public void onConfigurationChanged(Configuration newConfig) {
+        super.onConfigurationChanged(newConfig);
+        isOnConfigurationChangedCalled = true;
+    }
+
+    @Override
+    public void onLowMemory() {
+        super.onLowMemory();
+        isOnLowMemoryCalled = true;
+    }
+}
diff --git a/tests/src/android/widget/cts/MockLinearLayout.java b/tests/tests/widget/src/android/widget/cts/MockLinearLayout.java
similarity index 100%
rename from tests/src/android/widget/cts/MockLinearLayout.java
rename to tests/tests/widget/src/android/widget/cts/MockLinearLayout.java
diff --git a/tests/tests/widget/src/android/widget/cts/MockPopupWindowCtsActivity.java b/tests/tests/widget/src/android/widget/cts/MockPopupWindowCtsActivity.java
new file mode 100644
index 0000000..a68286a
--- /dev/null
+++ b/tests/tests/widget/src/android/widget/cts/MockPopupWindowCtsActivity.java
@@ -0,0 +1,35 @@
+/*
+ * Copyright (C) 2008 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.widget.cts;
+
+import com.android.cts.widget.R;
+
+import android.app.Activity;
+import android.os.Bundle;
+import android.widget.PopupWindow;
+
+/**
+ * Stub activity for testing {@link PopupWindow}
+ */
+public class MockPopupWindowCtsActivity extends Activity {
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.popupwindow);
+    }
+}
+
diff --git a/tests/src/android/widget/cts/MockTextView.java b/tests/tests/widget/src/android/widget/cts/MockTextView.java
similarity index 100%
rename from tests/src/android/widget/cts/MockTextView.java
rename to tests/tests/widget/src/android/widget/cts/MockTextView.java
diff --git a/tests/tests/widget/src/android/widget/cts/MockURLSpanTestActivity.java b/tests/tests/widget/src/android/widget/cts/MockURLSpanTestActivity.java
new file mode 100644
index 0000000..ab4940c
--- /dev/null
+++ b/tests/tests/widget/src/android/widget/cts/MockURLSpanTestActivity.java
@@ -0,0 +1,33 @@
+/*
+ * Copyright (C) 2009 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.widget.cts;
+
+import com.android.cts.widget.R;
+
+import android.app.Activity;
+import android.os.Bundle;
+
+/**
+ * A Mock application for {@link URLSpan} test.
+ */
+public class MockURLSpanTestActivity extends Activity {
+    @Override
+    public void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.urlspan_layout);
+    }
+}
diff --git a/tests/tests/widget/src/android/widget/cts/MultiAutoCompleteTextViewCtsActivity.java b/tests/tests/widget/src/android/widget/cts/MultiAutoCompleteTextViewCtsActivity.java
new file mode 100644
index 0000000..1379150
--- /dev/null
+++ b/tests/tests/widget/src/android/widget/cts/MultiAutoCompleteTextViewCtsActivity.java
@@ -0,0 +1,33 @@
+/*
+ * Copyright (C) 2009 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.widget.cts;
+
+import com.android.cts.widget.R;
+
+import android.app.Activity;
+import android.os.Bundle;
+
+/**
+ * A minimal application for MultiAutoCompleteTextView test.
+ */
+public class MultiAutoCompleteTextViewCtsActivity extends Activity {
+    @Override
+    public void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.multi_auto_complete_text_view_layout);
+    }
+}
diff --git a/tests/tests/widget/src/android/widget/cts/MultiAutoCompleteTextViewTest.java b/tests/tests/widget/src/android/widget/cts/MultiAutoCompleteTextViewTest.java
index b37b4ef..75f9242 100644
--- a/tests/tests/widget/src/android/widget/cts/MultiAutoCompleteTextViewTest.java
+++ b/tests/tests/widget/src/android/widget/cts/MultiAutoCompleteTextViewTest.java
@@ -16,7 +16,7 @@
 
 package android.widget.cts;
 
-import com.android.cts.stub.R;
+import com.android.cts.widget.R;
 
 
 import org.xmlpull.v1.XmlPullParser;
@@ -38,13 +38,13 @@
 import android.widget.MultiAutoCompleteTextView.Tokenizer;
 
 public class MultiAutoCompleteTextViewTest extends ActivityInstrumentationTestCase2
-        <MultiAutoCompleteTextViewStubActivity> {
+        <MultiAutoCompleteTextViewCtsActivity> {
     private MultiAutoCompleteTextView mMultiAutoCompleteTextView_country;
     private MultiAutoCompleteTextView mMultiAutoCompleteTextView_name;
     private Activity mActivity;
 
     public MultiAutoCompleteTextViewTest() {
-        super("com.android.cts.stub", MultiAutoCompleteTextViewStubActivity.class);
+        super("com.android.cts.widget", MultiAutoCompleteTextViewCtsActivity.class);
     }
 
     @Override
diff --git a/tests/src/android/widget/cts/MyGallery.java b/tests/tests/widget/src/android/widget/cts/MyGallery.java
similarity index 100%
rename from tests/src/android/widget/cts/MyGallery.java
rename to tests/tests/widget/src/android/widget/cts/MyGallery.java
diff --git a/tests/src/android/widget/cts/MyHorizontalScrollView.java b/tests/tests/widget/src/android/widget/cts/MyHorizontalScrollView.java
similarity index 100%
rename from tests/src/android/widget/cts/MyHorizontalScrollView.java
rename to tests/tests/widget/src/android/widget/cts/MyHorizontalScrollView.java
diff --git a/tests/src/android/widget/cts/MyScrollView.java b/tests/tests/widget/src/android/widget/cts/MyScrollView.java
similarity index 100%
rename from tests/src/android/widget/cts/MyScrollView.java
rename to tests/tests/widget/src/android/widget/cts/MyScrollView.java
diff --git a/tests/tests/widget/src/android/widget/cts/NullWebViewUtils.java b/tests/tests/widget/src/android/widget/cts/NullWebViewUtils.java
new file mode 100644
index 0000000..d7a73fa
--- /dev/null
+++ b/tests/tests/widget/src/android/widget/cts/NullWebViewUtils.java
@@ -0,0 +1,88 @@
+/*
+ * Copyright (C) 2010 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.widget.cts;
+
+import android.content.Context;
+import android.content.pm.PackageManager;
+
+/**
+ * Utilities to enable the android.webkit.* CTS tests (and others that rely on a functioning
+ * android.webkit.WebView implementation) to determine whether a functioning WebView is present
+ * on the device or not.
+ *
+ * Test cases that require android.webkit.* classes should wrap their first usage of WebView in a
+ * try catch block, and pass any exception that is thrown to
+ * NullWebViewUtils.determineIfWebViewAvailable. The return value of
+ * NullWebViewUtils.isWebViewAvailable will then determine if the test should expect to be able to
+ * use a WebView.
+ */
+public class NullWebViewUtils {
+
+    private static boolean sWebViewUnavailable;
+
+    /**
+     * @param context Current Activity context, used to query the PackageManager.
+     * @param t       An exception thrown by trying to invoke android.webkit.* APIs.
+     */
+    public static void determineIfWebViewAvailable(Context context, Throwable t) {
+        sWebViewUnavailable = !hasWebViewFeature(context) && checkCauseWasUnsupportedOperation(t);
+    }
+
+    /**
+     * After calling determineIfWebViewAvailable, this returns whether a WebView is available on the
+     * device and wheter the test can rely on it.
+     * @return True iff. PackageManager determined that there is no WebView on the device and the
+     *         exception thrown from android.webkit.* was UnsupportedOperationException.
+     */
+    public static boolean isWebViewAvailable() {
+        return !sWebViewUnavailable;
+    }
+
+    private static boolean hasWebViewFeature(Context context) {
+        // Query the system property that determins if there is a functional WebView on the device.
+        PackageManager pm = context.getPackageManager();
+        return pm.hasSystemFeature(PackageManager.FEATURE_WEBVIEW);
+    }
+
+    private static boolean checkCauseWasUnsupportedOperation(Throwable t) {
+        if (t == null) return false;
+        while (t.getCause() != null) {
+            t = t.getCause();
+        }
+        return t instanceof UnsupportedOperationException;
+    }
+
+    /**
+     * Some CTS tests (by design) first use android.webkit.* from a background thread. This helper
+     * allows the test to catch the UnsupportedOperationException from that background thread, and
+     * then query the result from the test main thread.
+     */
+    public static class NullWebViewFromThreadExceptionHandler
+            implements Thread.UncaughtExceptionHandler {
+        private Throwable mPendingException;
+
+        @Override
+        public void uncaughtException(Thread t, Throwable e) {
+            mPendingException = e;
+        }
+
+        public boolean isWebViewAvailable(Context context) {
+            return hasWebViewFeature(context) ||
+                    !checkCauseWasUnsupportedOperation(mPendingException);
+        }
+    }
+}
\ No newline at end of file
diff --git a/tests/tests/widget/src/android/widget/cts/PopupWindowTest.java b/tests/tests/widget/src/android/widget/cts/PopupWindowTest.java
index 997c2e9..9c4c3a3 100644
--- a/tests/tests/widget/src/android/widget/cts/PopupWindowTest.java
+++ b/tests/tests/widget/src/android/widget/cts/PopupWindowTest.java
@@ -16,7 +16,7 @@
 
 package android.widget.cts;
 
-import com.android.cts.stub.R;
+import com.android.cts.widget.R;
 
 
 import android.app.Activity;
@@ -41,7 +41,7 @@
 import android.widget.PopupWindow.OnDismissListener;
 
 public class PopupWindowTest extends
-        ActivityInstrumentationTestCase2<MockPopupWindowStubActivity> {
+        ActivityInstrumentationTestCase2<MockPopupWindowCtsActivity> {
     private Instrumentation mInstrumentation;
     private Activity mActivity;
     /** The popup window. */
@@ -51,7 +51,7 @@
      * Instantiates a new popup window test.
      */
     public PopupWindowTest() {
-        super("com.android.cts.stub", MockPopupWindowStubActivity.class);
+        super("com.android.cts.widget", MockPopupWindowCtsActivity.class);
     }
 
     /*
diff --git a/tests/tests/widget/src/android/widget/cts/ProgressBarCtsActivity.java b/tests/tests/widget/src/android/widget/cts/ProgressBarCtsActivity.java
new file mode 100644
index 0000000..8298d5f
--- /dev/null
+++ b/tests/tests/widget/src/android/widget/cts/ProgressBarCtsActivity.java
@@ -0,0 +1,34 @@
+/*
+ * Copyright (C) 2008 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.widget.cts;
+
+import android.app.Activity;
+import android.os.Bundle;
+
+/**
+ * An application for ProgressBar test
+ *
+ */
+public class ProgressBarCtsActivity extends Activity {
+    /**
+     * Called with the activity is first created.
+     */
+    @Override
+    public void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+    }
+}
diff --git a/tests/tests/widget/src/android/widget/cts/ProgressBarTest.java b/tests/tests/widget/src/android/widget/cts/ProgressBarTest.java
index 80681d0..e57d298 100644
--- a/tests/tests/widget/src/android/widget/cts/ProgressBarTest.java
+++ b/tests/tests/widget/src/android/widget/cts/ProgressBarTest.java
@@ -21,7 +21,7 @@
 import android.graphics.PorterDuff;
 import android.view.LayoutInflater;
 
-import com.android.cts.stub.R;
+import com.android.cts.widget.R;
 
 
 import android.content.Context;
diff --git a/tests/tests/widget/src/android/widget/cts/RadioButtonTest.java b/tests/tests/widget/src/android/widget/cts/RadioButtonTest.java
index 79a51c8..c6ee1b7 100644
--- a/tests/tests/widget/src/android/widget/cts/RadioButtonTest.java
+++ b/tests/tests/widget/src/android/widget/cts/RadioButtonTest.java
@@ -16,7 +16,7 @@
 
 package android.widget.cts;
 
-import com.android.cts.stub.R;
+import com.android.cts.widget.R;
 
 
 import android.content.Context;
diff --git a/tests/tests/widget/src/android/widget/cts/RadioGroupTest.java b/tests/tests/widget/src/android/widget/cts/RadioGroupTest.java
index f7baab7..ee912fc 100644
--- a/tests/tests/widget/src/android/widget/cts/RadioGroupTest.java
+++ b/tests/tests/widget/src/android/widget/cts/RadioGroupTest.java
@@ -16,7 +16,7 @@
 
 package android.widget.cts;
 
-import com.android.cts.stub.R;
+import com.android.cts.widget.R;
 
 
 import org.xmlpull.v1.XmlPullParser;
diff --git a/tests/tests/widget/src/android/widget/cts/RadioGroup_LayoutParamsTest.java b/tests/tests/widget/src/android/widget/cts/RadioGroup_LayoutParamsTest.java
index 23155c7..4b1aa5b 100644
--- a/tests/tests/widget/src/android/widget/cts/RadioGroup_LayoutParamsTest.java
+++ b/tests/tests/widget/src/android/widget/cts/RadioGroup_LayoutParamsTest.java
@@ -113,8 +113,8 @@
         } catch (NullPointerException e) {
         }
 
-        mLayoutParams = new LayoutParams(getContext(), 
-                getAttributeSet(com.android.cts.stub.R.layout.radiogroup_1));
+        mLayoutParams = new LayoutParams(getContext(),
+                getAttributeSet(com.android.cts.widget.R.layout.radiogroup_1));
         assertNotNull(mLayoutParams);
         assertEquals(0.5, mLayoutParams.weight, 0);
         assertEquals(Gravity.BOTTOM, mLayoutParams.gravity);
@@ -130,8 +130,8 @@
         assertEquals(RadioGroup.LayoutParams.WRAP_CONTENT, mLayoutParams.height);
 
         try {
-            new RadioGroup.LayoutParams(null, 
-                    getAttributeSet(com.android.cts.stub.R.layout.radiogroup_1));
+            new RadioGroup.LayoutParams(null,
+                    getAttributeSet(com.android.cts.widget.R.layout.radiogroup_1));
             fail("The constructor should throw NullPointerException when param Context is null.");
         } catch (NullPointerException e) {
         }
@@ -143,7 +143,7 @@
         assertEquals(LayoutParams.WRAP_CONTENT, layoutParams.width);
         assertEquals(LayoutParams.WRAP_CONTENT, layoutParams.height);
 
-        AttributeSet attrs = getAttributeSet(com.android.cts.stub.R.layout.radiogroup_1);
+        AttributeSet attrs = getAttributeSet(com.android.cts.widget.R.layout.radiogroup_1);
         TypedArray a = mContext.obtainStyledAttributes(attrs, R.styleable.ViewGroup_MarginLayout);
         layoutParams.setBaseAttributes(a,
                 R.styleable.ViewGroup_MarginLayout_layout_width,
diff --git a/tests/tests/widget/src/android/widget/cts/RatingBarCtsActivity.java b/tests/tests/widget/src/android/widget/cts/RatingBarCtsActivity.java
new file mode 100644
index 0000000..7d4e232
--- /dev/null
+++ b/tests/tests/widget/src/android/widget/cts/RatingBarCtsActivity.java
@@ -0,0 +1,37 @@
+/*
+ * Copyright (C) 2008 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.widget.cts;
+
+import android.app.Activity;
+import android.os.Bundle;
+
+import com.android.cts.widget.R;
+
+/**
+ * An application for ProgressBar test
+ *
+ */
+public class RatingBarCtsActivity extends Activity {
+    /**
+     * Called with the activity is first created.
+     */
+    @Override
+    public void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.ratingbar_layout);
+    }
+}
diff --git a/tests/tests/widget/src/android/widget/cts/RatingBarTest.java b/tests/tests/widget/src/android/widget/cts/RatingBarTest.java
index fe0e647..1bb42e8 100644
--- a/tests/tests/widget/src/android/widget/cts/RatingBarTest.java
+++ b/tests/tests/widget/src/android/widget/cts/RatingBarTest.java
@@ -16,7 +16,7 @@
 
 package android.widget.cts;
 
-import com.android.cts.stub.R;
+import com.android.cts.widget.R;
 
 
 import android.content.Context;
@@ -28,12 +28,12 @@
 /**
  * Test {@link RatingBar}.
  */
-public class RatingBarTest extends ActivityInstrumentationTestCase2<RatingBarStubActivity> {
+public class RatingBarTest extends ActivityInstrumentationTestCase2<RatingBarCtsActivity> {
     private Context mContext;
-    private RatingBarStubActivity mActivity;
+    private RatingBarCtsActivity mActivity;
 
     public RatingBarTest() {
-        super("com.android.cts.stub", RatingBarStubActivity.class);
+        super("com.android.cts.widget", RatingBarCtsActivity.class);
     }
 
     @Override
diff --git a/tests/tests/widget/src/android/widget/cts/RelativeLayoutCtsActivity.java b/tests/tests/widget/src/android/widget/cts/RelativeLayoutCtsActivity.java
new file mode 100644
index 0000000..df83f54
--- /dev/null
+++ b/tests/tests/widget/src/android/widget/cts/RelativeLayoutCtsActivity.java
@@ -0,0 +1,37 @@
+/*
+ * Copyright (C) 2008 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.widget.cts;
+
+import com.android.cts.widget.R;
+
+import android.app.Activity;
+import android.os.Bundle;
+
+/**
+ * A minimal application for RelativeLayout test.
+ */
+public class RelativeLayoutCtsActivity extends Activity {
+    /**
+     * Called with the activity is first created.
+     */
+    @Override
+    public void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.relative_layout);
+    }
+}
+
diff --git a/tests/tests/widget/src/android/widget/cts/RelativeLayoutTest.java b/tests/tests/widget/src/android/widget/cts/RelativeLayoutTest.java
index 9d15160..b5ce5c9 100644
--- a/tests/tests/widget/src/android/widget/cts/RelativeLayoutTest.java
+++ b/tests/tests/widget/src/android/widget/cts/RelativeLayoutTest.java
@@ -16,7 +16,7 @@
 
 package android.widget.cts;
 
-import com.android.cts.stub.R;
+import com.android.cts.widget.R;
 import com.android.internal.util.XmlUtils;
 
 
@@ -43,11 +43,11 @@
  * Test {@link RelativeLayout}.
  */
 public class RelativeLayoutTest extends
-        ActivityInstrumentationTestCase2<RelativeLayoutStubActivity> {
+        ActivityInstrumentationTestCase2<RelativeLayoutCtsActivity> {
     private Activity mActivity;
 
     public RelativeLayoutTest() {
-        super("com.android.cts.stub", RelativeLayoutStubActivity.class);
+        super("com.android.cts.widget", RelativeLayoutCtsActivity.class);
     }
 
     @Override
diff --git a/tests/tests/widget/src/android/widget/cts/RelativeLayout_LayoutParamsTest.java b/tests/tests/widget/src/android/widget/cts/RelativeLayout_LayoutParamsTest.java
index 04682cb..a3bd95c 100644
--- a/tests/tests/widget/src/android/widget/cts/RelativeLayout_LayoutParamsTest.java
+++ b/tests/tests/widget/src/android/widget/cts/RelativeLayout_LayoutParamsTest.java
@@ -16,7 +16,7 @@
 
 package android.widget.cts;
 
-import com.android.cts.stub.R;
+import com.android.cts.widget.R;
 
 
 import android.test.ActivityInstrumentationTestCase2;
@@ -29,10 +29,10 @@
  * Test {@link RelativeLayout.LayoutParams}.
  */
 public class RelativeLayout_LayoutParamsTest extends
-        ActivityInstrumentationTestCase2<RelativeLayoutStubActivity> {
+        ActivityInstrumentationTestCase2<RelativeLayoutCtsActivity> {
 
     public RelativeLayout_LayoutParamsTest() {
-        super("com.android.cts.stub", RelativeLayoutStubActivity.class);
+        super("com.android.cts.widget", RelativeLayoutCtsActivity.class);
     }
 
     public void testConstructor() {
@@ -53,7 +53,7 @@
 
         // Test RelativeLayout.Params which generated from the xml file.
         int rules[];
-        RelativeLayoutStubActivity activity = getActivity();
+        RelativeLayoutCtsActivity activity = getActivity();
 
         // test attributes used in RelativeLayout.
         RelativeLayout relativeLayout = (RelativeLayout) activity.findViewById(
@@ -160,7 +160,7 @@
 
         // Test RelativeLayout.Params which generated from the xml file.
         int rules[];
-        RelativeLayoutStubActivity activity = getActivity();
+        RelativeLayoutCtsActivity activity = getActivity();
 
         // test attributes used in RelativeLayout.
         RelativeLayout relativeLayout = (RelativeLayout) activity.findViewById(
diff --git a/tests/tests/widget/src/android/widget/cts/RemoteViewsActivityTest.java b/tests/tests/widget/src/android/widget/cts/RemoteViewsActivityTest.java
index b3c0915..a03edce 100644
--- a/tests/tests/widget/src/android/widget/cts/RemoteViewsActivityTest.java
+++ b/tests/tests/widget/src/android/widget/cts/RemoteViewsActivityTest.java
@@ -23,18 +23,17 @@
 import android.view.InflateException;
 import android.view.View;
 import android.view.ViewGroup;
-import android.webkit.cts.NullWebViewUtils;
 import android.widget.RemoteViews;
 
-import com.android.cts.stub.R;
+import com.android.cts.widget.R;
 
 public class RemoteViewsActivityTest
-        extends ActivityInstrumentationTestCase2<RemoteViewsStubActivity> {
-    private static final String PACKAGE_NAME = "com.android.cts.stub";
+        extends ActivityInstrumentationTestCase2<RemoteViewsCtsActivity> {
+    private static final String PACKAGE_NAME = "com.android.cts.widget";
     private Activity mActivity;
 
     public RemoteViewsActivityTest() {
-        super(PACKAGE_NAME, RemoteViewsStubActivity.class);
+        super(PACKAGE_NAME, RemoteViewsCtsActivity.class);
     }
 
     @Override
diff --git a/tests/tests/widget/src/android/widget/cts/RemoteViewsCtsActivity.java b/tests/tests/widget/src/android/widget/cts/RemoteViewsCtsActivity.java
new file mode 100644
index 0000000..6826eb3
--- /dev/null
+++ b/tests/tests/widget/src/android/widget/cts/RemoteViewsCtsActivity.java
@@ -0,0 +1,38 @@
+/*
+ * Copyright (C) 2008 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.widget.cts;
+
+import com.android.cts.widget.R;
+
+import android.app.Activity;
+import android.os.Bundle;
+import android.widget.RemoteViews;
+
+/**
+ * Stub activity for testing {@link RemoteViews}
+ */
+public class RemoteViewsCtsActivity extends Activity {
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        try {
+            super.onCreate(savedInstanceState);
+            setContentView(R.layout.remoteviews_host);
+        } catch (Exception e) {
+            NullWebViewUtils.determineIfWebViewAvailable(this, e);
+        }
+    }
+}
diff --git a/tests/tests/widget/src/android/widget/cts/RemoteViewsTest.java b/tests/tests/widget/src/android/widget/cts/RemoteViewsTest.java
index 891bdf7..c958d8c 100644
--- a/tests/tests/widget/src/android/widget/cts/RemoteViewsTest.java
+++ b/tests/tests/widget/src/android/widget/cts/RemoteViewsTest.java
@@ -16,7 +16,7 @@
 
 package android.widget.cts;
 
-import com.android.cts.stub.R;
+import com.android.cts.widget.R;
 
 
 import android.app.Activity;
@@ -31,7 +31,6 @@
 import android.net.Uri;
 import android.os.Parcel;
 import android.test.ActivityInstrumentationTestCase2;
-import android.text.style.cts.MockURLSpanTestActivity;
 import android.view.View;
 import android.widget.AbsoluteLayout;
 import android.widget.Chronometer;
@@ -56,8 +55,8 @@
 /**
  * Test {@link RemoteViews}.
  */
-public class RemoteViewsTest extends ActivityInstrumentationTestCase2<RemoteViewsStubActivity> {
-    private static final String PACKAGE_NAME = "com.android.cts.stub";
+public class RemoteViewsTest extends ActivityInstrumentationTestCase2<RemoteViewsCtsActivity> {
+    private static final String PACKAGE_NAME = "com.android.cts.widget";
 
     private static final int INVALD_ID = -1;
 
@@ -70,7 +69,7 @@
     private Activity mActivity;
 
     public RemoteViewsTest() {
-        super(PACKAGE_NAME, RemoteViewsStubActivity.class);
+        super(PACKAGE_NAME, RemoteViewsCtsActivity.class);
     }
 
     @Override
diff --git a/tests/tests/widget/src/android/widget/cts/ResourceCursorAdapterTest.java b/tests/tests/widget/src/android/widget/cts/ResourceCursorAdapterTest.java
index d91094c..ed9d09c 100644
--- a/tests/tests/widget/src/android/widget/cts/ResourceCursorAdapterTest.java
+++ b/tests/tests/widget/src/android/widget/cts/ResourceCursorAdapterTest.java
@@ -16,7 +16,7 @@
 
 package android.widget.cts;
 
-import com.android.cts.stub.R;
+import com.android.cts.widget.R;
 
 
 import android.content.Context;
diff --git a/tests/tests/widget/src/android/widget/cts/ResourceCursorTreeAdapterTest.java b/tests/tests/widget/src/android/widget/cts/ResourceCursorTreeAdapterTest.java
index 4a5a9c9..4f137a0 100644
--- a/tests/tests/widget/src/android/widget/cts/ResourceCursorTreeAdapterTest.java
+++ b/tests/tests/widget/src/android/widget/cts/ResourceCursorTreeAdapterTest.java
@@ -16,7 +16,7 @@
 
 package android.widget.cts;
 
-import com.android.cts.stub.R;
+import com.android.cts.widget.R;
 
 
 import android.content.Context;
diff --git a/tests/tests/widget/src/android/widget/cts/ScrollViewCtsActivity.java b/tests/tests/widget/src/android/widget/cts/ScrollViewCtsActivity.java
new file mode 100644
index 0000000..8965610
--- /dev/null
+++ b/tests/tests/widget/src/android/widget/cts/ScrollViewCtsActivity.java
@@ -0,0 +1,30 @@
+/*
+ * Copyright (C) 2009 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.widget.cts;
+
+import com.android.cts.widget.R;
+
+import android.app.Activity;
+import android.os.Bundle;
+
+public class ScrollViewCtsActivity extends Activity {
+    @Override
+    public void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.scrollview_layout);
+    }
+}
diff --git a/tests/tests/widget/src/android/widget/cts/ScrollViewTest.java b/tests/tests/widget/src/android/widget/cts/ScrollViewTest.java
index e297744..a8fb224 100644
--- a/tests/tests/widget/src/android/widget/cts/ScrollViewTest.java
+++ b/tests/tests/widget/src/android/widget/cts/ScrollViewTest.java
@@ -16,7 +16,7 @@
 
 package android.widget.cts;
 
-import com.android.cts.stub.R;
+import com.android.cts.widget.R;
 
 
 import org.xmlpull.v1.XmlPullParser;
@@ -41,7 +41,7 @@
 /**
  * Test {@link ScrollView}.
  */
-public class ScrollViewTest extends ActivityInstrumentationTestCase2<ScrollViewStubActivity> {
+public class ScrollViewTest extends ActivityInstrumentationTestCase2<ScrollViewCtsActivity> {
     // view dpi constants. Must match those defined in scroll_view layout
     private static final int ITEM_WIDTH_DPI  = 250;
     private static final int ITEM_HEIGHT_DPI = 100;
@@ -61,7 +61,7 @@
     private Activity mActivity;
 
     public ScrollViewTest() {
-        super("com.android.cts.stub", ScrollViewStubActivity.class);
+        super("com.android.cts.widget", ScrollViewCtsActivity.class);
     }
 
     @Override
diff --git a/tests/tests/widget/src/android/widget/cts/SeekBarCtsActivity.java b/tests/tests/widget/src/android/widget/cts/SeekBarCtsActivity.java
new file mode 100644
index 0000000..e7842c2
--- /dev/null
+++ b/tests/tests/widget/src/android/widget/cts/SeekBarCtsActivity.java
@@ -0,0 +1,44 @@
+/*
+ * Copyright (C) 2008 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.widget.cts;
+
+import com.android.cts.widget.R;
+
+import android.app.Activity;
+import android.os.Bundle;
+import android.view.View;
+import android.widget.SeekBar;
+
+/**
+ * Stub activity for testing {@link SeekBar}
+ */
+public class SeekBarCtsActivity extends Activity {
+    /**
+     * Called with the activity is first created.
+     */
+    @Override
+    public void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.seekbar_layout);
+
+        View v = findViewById(R.id.seekBar);
+        v.setEnabled(true);
+        v.setFocusable(true);
+        v.setFocusableInTouchMode(true);
+        v.requestFocus();
+    }
+}
diff --git a/tests/tests/widget/src/android/widget/cts/SeekBarTest.java b/tests/tests/widget/src/android/widget/cts/SeekBarTest.java
index 266583f..54bbedf 100644
--- a/tests/tests/widget/src/android/widget/cts/SeekBarTest.java
+++ b/tests/tests/widget/src/android/widget/cts/SeekBarTest.java
@@ -16,7 +16,7 @@
 
 package android.widget.cts;
 
-import com.android.cts.stub.R;
+import com.android.cts.widget.R;
 
 
 import android.app.Activity;
@@ -30,7 +30,7 @@
 /**
  * Test {@link SeekBar}.
  */
-public class SeekBarTest extends ActivityInstrumentationTestCase2<SeekBarStubActivity> {
+public class SeekBarTest extends ActivityInstrumentationTestCase2<SeekBarCtsActivity> {
     private SeekBar mSeekBar;
 
     private Activity mActivity;
@@ -38,7 +38,7 @@
     private Instrumentation mInstrumentation;
 
     public SeekBarTest() {
-        super("com.android.cts.stub", SeekBarStubActivity.class);
+        super("com.android.cts.widget", SeekBarCtsActivity.class);
     }
 
     @Override
diff --git a/tests/tests/widget/src/android/widget/cts/SimpleAdapterTest.java b/tests/tests/widget/src/android/widget/cts/SimpleAdapterTest.java
index 8b35a2f..86a4bca 100644
--- a/tests/tests/widget/src/android/widget/cts/SimpleAdapterTest.java
+++ b/tests/tests/widget/src/android/widget/cts/SimpleAdapterTest.java
@@ -89,7 +89,7 @@
         mContext = getInstrumentation().getTargetContext();
         mInflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
         mAdapterHost = (LinearLayout) mInflater.inflate(
-                com.android.cts.stub.R.layout.cursoradapter_host, null);
+                com.android.cts.widget.R.layout.cursoradapter_host, null);
 
         // new the SimpleAdapter instance
         mSimpleAdapter = new SimpleAdapter(mContext,
@@ -280,9 +280,9 @@
         // String represents resId
         ImageView view = new ImageView(mContext);
         assertNull(view.getDrawable());
-        mSimpleAdapter.setViewImage(view, String.valueOf(com.android.cts.stub.R.drawable.scenery));
+        mSimpleAdapter.setViewImage(view, String.valueOf(com.android.cts.widget.R.drawable.scenery));
         BitmapDrawable d = (BitmapDrawable) mContext.getResources().getDrawable(
-                com.android.cts.stub.R.drawable.scenery);
+                com.android.cts.widget.R.drawable.scenery);
         WidgetTestUtils.assertEquals(d.getBitmap(),
                 ((BitmapDrawable) view.getDrawable()).getBitmap());
 
@@ -305,9 +305,9 @@
         // resId
         view = new ImageView(mContext);
         assertNull(view.getDrawable());
-        mSimpleAdapter.setViewImage(view, com.android.cts.stub.R.drawable.scenery);
+        mSimpleAdapter.setViewImage(view, com.android.cts.widget.R.drawable.scenery);
         d = (BitmapDrawable) mContext.getResources()
-                .getDrawable(com.android.cts.stub.R.drawable.scenery);
+                .getDrawable(com.android.cts.widget.R.drawable.scenery);
         WidgetTestUtils.assertEquals(d.getBitmap(),
                 ((BitmapDrawable) view.getDrawable()).getBitmap());
 
@@ -322,11 +322,11 @@
         assertNull(view.getDrawable());
         try {
             mSimpleAdapter.setViewImage(view, SimpleCursorAdapterTest.createTestImage(mContext,
-                    "testimage", com.android.cts.stub.R.raw.testimage));
+                    "testimage", com.android.cts.widget.R.raw.testimage));
             assertNotNull(view.getDrawable());
             Bitmap actualBitmap = ((BitmapDrawable) view.getDrawable()).getBitmap();
             Bitmap testBitmap = WidgetTestUtils.getUnscaledAndDitheredBitmap(mContext.getResources(),
-                    com.android.cts.stub.R.raw.testimage, actualBitmap.getConfig());
+                    com.android.cts.widget.R.raw.testimage, actualBitmap.getConfig());
             WidgetTestUtils.assertEquals(testBitmap, actualBitmap);
         } finally {
             SimpleCursorAdapterTest.destroyTestImage(mContext,"testimage");
diff --git a/tests/tests/widget/src/android/widget/cts/SimpleCursorAdapterTest.java b/tests/tests/widget/src/android/widget/cts/SimpleCursorAdapterTest.java
index 59660e0..2d73a03 100644
--- a/tests/tests/widget/src/android/widget/cts/SimpleCursorAdapterTest.java
+++ b/tests/tests/widget/src/android/widget/cts/SimpleCursorAdapterTest.java
@@ -16,7 +16,7 @@
 
 package android.widget.cts;
 
-import com.android.cts.stub.R;
+import com.android.cts.widget.R;
 
 
 import android.content.Context;
@@ -175,7 +175,7 @@
 
     public void testSetViewImage() {
         // resId
-        int sceneryImgResId = com.android.cts.stub.R.drawable.scenery;
+        int sceneryImgResId = com.android.cts.widget.R.drawable.scenery;
         ImageView view = new ImageView(mContext);
         assertNull(view.getDrawable());
         mSimpleCursorAdapter.setViewImage(view, String.valueOf(sceneryImgResId));
@@ -206,7 +206,7 @@
         view = new ImageView(mContext);
         assertNull(view.getDrawable());
         try {
-            int testimgRawId = com.android.cts.stub.R.raw.testimage;
+            int testimgRawId = com.android.cts.widget.R.raw.testimage;
             mSimpleCursorAdapter.setViewImage(view,
                     createTestImage(mContext, SAMPLE_IMAGE_NAME, testimgRawId));
             assertNotNull(view.getDrawable());
@@ -307,7 +307,7 @@
         LayoutInflater layoutInflater = (LayoutInflater) mContext.getSystemService(
                 Context.LAYOUT_INFLATER_SERVICE);
         ViewGroup viewGroup = (ViewGroup) layoutInflater.inflate(
-                com.android.cts.stub.R.layout.cursoradapter_host, null);
+                com.android.cts.widget.R.layout.cursoradapter_host, null);
         View result = mSimpleCursorAdapter.newView(mContext, null, viewGroup);
         assertNotNull(result);
         assertEquals(R.id.cursorAdapter_item0, result.getId());
@@ -321,7 +321,7 @@
         LayoutInflater layoutInflater = (LayoutInflater) mContext.getSystemService(
                 Context.LAYOUT_INFLATER_SERVICE);
         ViewGroup viewGroup = (ViewGroup) layoutInflater.inflate(
-                com.android.cts.stub.R.layout.cursoradapter_host, null);
+                com.android.cts.widget.R.layout.cursoradapter_host, null);
         View result = mSimpleCursorAdapter.newDropDownView(null, null, viewGroup);
         assertNotNull(result);
         assertEquals(R.id.cursorAdapter_item0, result.getId());
diff --git a/tests/tests/widget/src/android/widget/cts/SimpleCursorTreeAdapterTest.java b/tests/tests/widget/src/android/widget/cts/SimpleCursorTreeAdapterTest.java
index bf9e358..9085b55 100644
--- a/tests/tests/widget/src/android/widget/cts/SimpleCursorTreeAdapterTest.java
+++ b/tests/tests/widget/src/android/widget/cts/SimpleCursorTreeAdapterTest.java
@@ -16,7 +16,7 @@
 
 package android.widget.cts;
 
-import com.android.cts.stub.R;
+import com.android.cts.widget.R;
 
 
 import android.content.Context;
@@ -130,9 +130,9 @@
         ImageView view = new ImageView(mContext);
         assertNull(view.getDrawable());
         mSimpleCursorTreeAdapter.setViewImage(view,
-                String.valueOf(com.android.cts.stub.R.drawable.scenery));
+                String.valueOf(com.android.cts.widget.R.drawable.scenery));
         BitmapDrawable d = (BitmapDrawable) mContext.getResources().getDrawable(
-                com.android.cts.stub.R.drawable.scenery);
+                com.android.cts.widget.R.drawable.scenery);
         WidgetTestUtils.assertEquals(d.getBitmap(),
                 ((BitmapDrawable) view.getDrawable()).getBitmap());
 
@@ -158,10 +158,10 @@
         try {
             mSimpleCursorTreeAdapter.setViewImage(view,
                     SimpleCursorAdapterTest.createTestImage(mContext, SAMPLE_IMAGE_NAME,
-                            com.android.cts.stub.R.raw.testimage));
+                            com.android.cts.widget.R.raw.testimage));
             Bitmap actualBitmap = ((BitmapDrawable) view.getDrawable()).getBitmap();
             Bitmap test = WidgetTestUtils.getUnscaledAndDitheredBitmap(mContext.getResources(),
-                    com.android.cts.stub.R.raw.testimage, actualBitmap.getConfig());
+                    com.android.cts.widget.R.raw.testimage, actualBitmap.getConfig());
             WidgetTestUtils.assertEquals(test, actualBitmap);
         } finally {
             SimpleCursorAdapterTest.destroyTestImage(mContext, SAMPLE_IMAGE_NAME);
diff --git a/tests/tests/widget/src/android/widget/cts/SimpleExpandableListAdapterTest.java b/tests/tests/widget/src/android/widget/cts/SimpleExpandableListAdapterTest.java
index 7c4fe23..a7bfc31 100644
--- a/tests/tests/widget/src/android/widget/cts/SimpleExpandableListAdapterTest.java
+++ b/tests/tests/widget/src/android/widget/cts/SimpleExpandableListAdapterTest.java
@@ -98,7 +98,7 @@
 
         mAdapterHost = (LinearLayout) ((LayoutInflater) mContext
                 .getSystemService(Context.LAYOUT_INFLATER_SERVICE)).inflate(
-                com.android.cts.stub.R.layout.cursoradapter_host, null);
+                com.android.cts.widget.R.layout.cursoradapter_host, null);
     }
 
     public void testConstructor() {
diff --git a/tests/tests/widget/src/android/widget/cts/SlidingDrawerCtsActivity.java b/tests/tests/widget/src/android/widget/cts/SlidingDrawerCtsActivity.java
new file mode 100644
index 0000000..8b55e63
--- /dev/null
+++ b/tests/tests/widget/src/android/widget/cts/SlidingDrawerCtsActivity.java
@@ -0,0 +1,30 @@
+/*
+ * Copyright (C) 2009 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.widget.cts;
+
+import com.android.cts.widget.R;
+
+import android.app.Activity;
+import android.os.Bundle;
+
+public class SlidingDrawerCtsActivity extends Activity {
+    @Override
+    public void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.sliding_drawer_layout);
+    }
+}
diff --git a/tests/tests/widget/src/android/widget/cts/SlidingDrawerTest.java b/tests/tests/widget/src/android/widget/cts/SlidingDrawerTest.java
index 60666ae..c4aaca1 100644
--- a/tests/tests/widget/src/android/widget/cts/SlidingDrawerTest.java
+++ b/tests/tests/widget/src/android/widget/cts/SlidingDrawerTest.java
@@ -16,7 +16,7 @@
 
 package android.widget.cts;
 
-import com.android.cts.stub.R;
+import com.android.cts.widget.R;
 
 
 import org.xmlpull.v1.XmlPullParser;
@@ -44,14 +44,14 @@
  * Test {@link SlidingDrawer}.
  */
 public class SlidingDrawerTest
-        extends ActivityInstrumentationTestCase2<SlidingDrawerStubActivity> {
+        extends ActivityInstrumentationTestCase2<SlidingDrawerCtsActivity> {
 
     private static final long TEST_TIMEOUT = 5000L;
     private Activity mActivity;
     private Object mLock;
 
     public SlidingDrawerTest() {
-        super("com.android.cts.stub", SlidingDrawerStubActivity.class);
+        super("com.android.cts.widget", SlidingDrawerCtsActivity.class);
     }
 
     @Override
diff --git a/tests/tests/widget/src/android/widget/cts/SpinnerTest.java b/tests/tests/widget/src/android/widget/cts/SpinnerTest.java
index 8ffd90b..7a2de0c 100644
--- a/tests/tests/widget/src/android/widget/cts/SpinnerTest.java
+++ b/tests/tests/widget/src/android/widget/cts/SpinnerTest.java
@@ -16,7 +16,7 @@
 
 package android.widget.cts;
 
-import com.android.cts.stub.R;
+import com.android.cts.widget.R;
 
 
 import android.app.AlertDialog;
@@ -31,11 +31,11 @@
 /**
  * Test {@link Spinner}.
  */
-public class SpinnerTest extends ActivityInstrumentationTestCase2<RelativeLayoutStubActivity> {
+public class SpinnerTest extends ActivityInstrumentationTestCase2<RelativeLayoutCtsActivity> {
     private Context mTargetContext;
 
     public SpinnerTest() {
-        super("com.android.cts.stub", RelativeLayoutStubActivity.class);
+        super("com.android.cts.widget", RelativeLayoutCtsActivity.class);
     }
 
     @Override
@@ -63,7 +63,7 @@
 
         spinner = (Spinner) getActivity().findViewById(R.id.spinner1);
         ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(mTargetContext,
-                com.android.cts.stub.R.array.string, android.R.layout.simple_spinner_item);
+                com.android.cts.widget.R.array.string, android.R.layout.simple_spinner_item);
         adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
         spinner.setAdapter(adapter);
         assertTrue(spinner.getBaseline() > 0);
diff --git a/tests/tests/widget/src/android/widget/cts/TabHostCtsActivity.java b/tests/tests/widget/src/android/widget/cts/TabHostCtsActivity.java
new file mode 100644
index 0000000..9703dd7
--- /dev/null
+++ b/tests/tests/widget/src/android/widget/cts/TabHostCtsActivity.java
@@ -0,0 +1,56 @@
+/*
+ * Copyright (C) 2009 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.widget.cts;
+
+import android.app.TabActivity;
+import android.os.Bundle;
+import android.view.View;
+import android.widget.TabHost;
+import android.widget.TextView;
+
+import com.android.cts.widget.R;
+
+/**
+ * A minimal application for TabHost test.
+ * It contains an initial tab whose tag is INITIAL_TAB_TAG and label is INITIAL_TAB_LABEL.
+ */
+public class TabHostCtsActivity extends TabActivity {
+    public static final String INITIAL_TAB_TAG = "initial tag";
+    public static final String INITIAL_TAB_LABEL = "initial label";
+    public static final String INITIAL_VIEW_TEXT = "initial view text";
+
+    @Override
+    public void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.tabhost_layout);
+
+        TabHost tabHost = getTabHost();
+
+        // at least one tab
+        tabHost.addTab(tabHost.newTabSpec(INITIAL_TAB_TAG)
+                .setIndicator(INITIAL_TAB_LABEL)
+                .setContent(new MyTabContentFactory()));
+    }
+
+    private class MyTabContentFactory implements TabHost.TabContentFactory {
+        public View createTabContent(String tag) {
+            final TextView tv = new TextView(getApplicationContext());
+            tv.setText(INITIAL_VIEW_TEXT);
+            return tv;
+        }
+    }
+}
diff --git a/tests/tests/widget/src/android/widget/cts/TabHostTest.java b/tests/tests/widget/src/android/widget/cts/TabHostTest.java
index 07334ad..3af8d9c 100644
--- a/tests/tests/widget/src/android/widget/cts/TabHostTest.java
+++ b/tests/tests/widget/src/android/widget/cts/TabHostTest.java
@@ -16,7 +16,7 @@
 
 package android.widget.cts;
 
-import com.android.cts.stub.R;
+import com.android.cts.widget.R;
 
 
 import android.app.Activity;
@@ -34,15 +34,15 @@
 /**
  * Test {@link TabHost}.
  */
-public class TabHostTest extends ActivityInstrumentationTestCase2<TabHostStubActivity> {
+public class TabHostTest extends ActivityInstrumentationTestCase2<TabHostCtsActivity> {
     private static final String TAG_TAB1 = "tab 1";
     private static final String TAG_TAB2 = "tab 2";
     private static final int TAB_HOST_ID = android.R.id.tabhost;
 
-    private TabHostStubActivity mActivity;
+    private TabHostCtsActivity mActivity;
 
     public TabHostTest() {
-        super("com.android.cts.stub", TabHostStubActivity.class);
+        super("com.android.cts.widget", TabHostCtsActivity.class);
     }
 
     @Override
@@ -71,7 +71,7 @@
      * 2. no exception occurs when doing normal operation after setup().
      */
     public void testSetup1() throws Throwable {
-        final Activity activity = launchActivity("com.android.cts.stub", StubActivity.class, null);
+        final Activity activity = launchActivity("com.android.cts.widget", CtsActivity.class, null);
 
         runTestOnUiThread(new Runnable() {
             public void run() {
@@ -102,7 +102,7 @@
      * 2. no exception occurs when uses TabSpec.setContent(android.content.Intent) after setup().
      */
     public void testSetup2() throws Throwable {
-        final ActivityGroup activity = launchActivity("com.android.cts.stub",
+        final ActivityGroup activity = launchActivity("com.android.cts.widget",
                 ActivityGroup.class, null);
 
 
@@ -120,7 +120,7 @@
                 TabSpec tabSpec = tabHost.newTabSpec(TAG_TAB1);
                 tabSpec.setIndicator(TAG_TAB1);
                 Intent intent = new Intent(Intent.ACTION_VIEW, null,
-                        mActivity, StubActivity.class);
+                        mActivity, CtsActivity.class);
                 tabSpec.setContent(intent);
                 tabHost.addTab(tabSpec);
                 tabHost.setCurrentTab(0);
@@ -249,7 +249,7 @@
     public void testGetCurrentView() {
         TabHost tabHost = mActivity.getTabHost();
         TextView textView = (TextView) tabHost.getCurrentView();
-        assertEquals(TabHostStubActivity.INITIAL_VIEW_TEXT, textView.getText().toString());
+        assertEquals(TabHostCtsActivity.INITIAL_VIEW_TEXT, textView.getText().toString());
 
         TabSpec tabSpec = tabHost.newTabSpec(TAG_TAB2);
         tabSpec.setIndicator(TAG_TAB2);
@@ -272,7 +272,7 @@
         tabHost.setCurrentTabByTag(TAG_TAB2);
         assertEquals(1, tabHost.getCurrentTab());
 
-        tabHost.setCurrentTabByTag(TabHostStubActivity.INITIAL_TAB_TAG);
+        tabHost.setCurrentTabByTag(TabHostCtsActivity.INITIAL_TAB_TAG);
         assertEquals(0, tabHost.getCurrentTab());
 
         // exceptional value
@@ -294,7 +294,7 @@
         assertTrue(tabHost.getTabContentView().getChildAt(1) instanceof ListView);
         TextView child2 = (TextView) tabHost.getTabContentView().getChildAt(2);
         tabHost.setCurrentTab(0);
-        assertEquals(TabHostStubActivity.INITIAL_VIEW_TEXT, child2.getText().toString());
+        assertEquals(TabHostCtsActivity.INITIAL_VIEW_TEXT, child2.getText().toString());
 
         TabSpec tabSpec = tabHost.newTabSpec(TAG_TAB2);
         tabSpec.setIndicator(TAG_TAB2);
@@ -310,7 +310,7 @@
         assertTrue(tabHost.getTabContentView().getChildAt(1) instanceof ListView);
         child2 = (TextView) tabHost.getTabContentView().getChildAt(2);
         tabHost.setCurrentTab(0);
-        assertEquals(TabHostStubActivity.INITIAL_VIEW_TEXT, child2.getText().toString());
+        assertEquals(TabHostCtsActivity.INITIAL_VIEW_TEXT, child2.getText().toString());
     }
 
     @UiThreadTest
@@ -357,7 +357,7 @@
     @UiThreadTest
     public void testGetCurrentTabTag() {
         TabHost tabHost = mActivity.getTabHost();
-        assertEquals(TabHostStubActivity.INITIAL_TAB_TAG, tabHost.getCurrentTabTag());
+        assertEquals(TabHostCtsActivity.INITIAL_TAB_TAG, tabHost.getCurrentTabTag());
 
         TabSpec tabSpec = tabHost.newTabSpec(TAG_TAB2);
         tabSpec.setIndicator(TAG_TAB2);
diff --git a/tests/tests/widget/src/android/widget/cts/TabHost_TabSpecTest.java b/tests/tests/widget/src/android/widget/cts/TabHost_TabSpecTest.java
index 470a666..1363491 100644
--- a/tests/tests/widget/src/android/widget/cts/TabHost_TabSpecTest.java
+++ b/tests/tests/widget/src/android/widget/cts/TabHost_TabSpecTest.java
@@ -16,7 +16,7 @@
 
 package android.widget.cts;
 
-import com.android.cts.stub.R;
+import com.android.cts.widget.R;
 
 
 import android.app.Activity;
@@ -29,7 +29,6 @@
 import android.net.Uri;
 import android.test.ActivityInstrumentationTestCase2;
 import android.test.UiThreadTest;
-import android.text.style.cts.MockURLSpanTestActivity;
 import android.view.View;
 import android.widget.ImageView;
 import android.widget.ListView;
@@ -40,14 +39,14 @@
 /**
  * Test {@link TabSpec}.
  */
-public class TabHost_TabSpecTest extends ActivityInstrumentationTestCase2<TabHostStubActivity> {
+public class TabHost_TabSpecTest extends ActivityInstrumentationTestCase2<TabHostCtsActivity> {
     private static final String TAG_TAB2 = "tab 2";
 
     private TabHost mTabHost;
-    private TabHostStubActivity mActivity;
+    private TabHostCtsActivity mActivity;
 
     public TabHost_TabSpecTest() {
-        super("com.android.cts.stub", TabHostStubActivity.class);
+        super("com.android.cts.widget", TabHostCtsActivity.class);
     }
 
     @Override
@@ -138,7 +137,7 @@
         TabSpec tabSpec2 = mTabHost.newTabSpec("tab spec 2");
         tabSpec2.setIndicator("tab 2");
         // TabContentFactory to create a TextView as the content of the tab.
-        tabSpec2.setContent(com.android.cts.stub.R.id.tabhost_textview);
+        tabSpec2.setContent(com.android.cts.widget.R.id.tabhost_textview);
         mTabHost.addTab(tabSpec2);
         mTabHost.setCurrentTab(1);
         TextView currentView = (TextView) mTabHost.getCurrentView();
@@ -148,7 +147,7 @@
         TabSpec tabSpec3 = mTabHost.newTabSpec("tab spec 3");
         tabSpec3.setIndicator("tab 3");
         // TabContentFactory to create a ListView as the content of the tab.
-        tabSpec3.setContent(com.android.cts.stub.R.id.tabhost_listview);
+        tabSpec3.setContent(com.android.cts.widget.R.id.tabhost_listview);
         mTabHost.addTab(tabSpec3);
         mTabHost.setCurrentTab(2);
         assertTrue(mTabHost.getCurrentView() instanceof ListView);
diff --git a/tests/tests/widget/src/android/widget/cts/TabWidgetTest.java b/tests/tests/widget/src/android/widget/cts/TabWidgetTest.java
index b5c46c5..1f2e66c 100644
--- a/tests/tests/widget/src/android/widget/cts/TabWidgetTest.java
+++ b/tests/tests/widget/src/android/widget/cts/TabWidgetTest.java
@@ -32,11 +32,11 @@
 /**
  * Test {@link TabWidget}.
  */
-public class TabWidgetTest extends ActivityInstrumentationTestCase2<TabHostStubActivity> {
+public class TabWidgetTest extends ActivityInstrumentationTestCase2<TabHostCtsActivity> {
     private Activity mActivity;
 
     public TabWidgetTest() {
-        super("com.android.cts.stub", TabHostStubActivity.class);
+        super("com.android.cts.widget", TabHostCtsActivity.class);
     }
 
     @Override
@@ -79,7 +79,7 @@
 
     @UiThreadTest
     public void testSetCurrentTab() {
-        TabHostStubActivity activity = getActivity();
+        TabHostCtsActivity activity = getActivity();
         TabWidget tabWidget = activity.getTabWidget();
         tabWidget.addView(new TextView(mActivity));
 
@@ -97,7 +97,7 @@
 
     @UiThreadTest
     public void testFocusCurrentTab() {
-        TabHostStubActivity activity = getActivity();
+        TabHostCtsActivity activity = getActivity();
         TabWidget tabWidget = activity.getTabWidget();
         tabWidget.addView(new TextView(mActivity));
 
diff --git a/tests/tests/widget/src/android/widget/cts/TableCtsActivity.java b/tests/tests/widget/src/android/widget/cts/TableCtsActivity.java
new file mode 100644
index 0000000..f76caed
--- /dev/null
+++ b/tests/tests/widget/src/android/widget/cts/TableCtsActivity.java
@@ -0,0 +1,36 @@
+/*
+ * Copyright (C) 2008 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.widget.cts;
+
+import com.android.cts.widget.R;
+
+import android.app.Activity;
+import android.os.Bundle;
+
+/**
+ * A minimal application for TableLayout test.
+ */
+public class TableCtsActivity extends Activity {
+    /**
+     * Called with the activity is first created.
+     */
+    @Override
+    public void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.table_layout_1);
+    }
+}
diff --git a/tests/tests/widget/src/android/widget/cts/TableLayoutTest.java b/tests/tests/widget/src/android/widget/cts/TableLayoutTest.java
index ea84071..c8211f6 100644
--- a/tests/tests/widget/src/android/widget/cts/TableLayoutTest.java
+++ b/tests/tests/widget/src/android/widget/cts/TableLayoutTest.java
@@ -16,7 +16,7 @@
 
 package android.widget.cts;
 
-import com.android.cts.stub.R;
+import com.android.cts.widget.R;
 
 
 import android.content.Context;
@@ -39,11 +39,11 @@
 /**
  * Test {@link TableLayout}.
  */
-public class TableLayoutTest extends ActivityInstrumentationTestCase2<TableStubActivity> {
+public class TableLayoutTest extends ActivityInstrumentationTestCase2<TableCtsActivity> {
     private Context mContext;
 
     public TableLayoutTest() {
-        super("com.android.cts.stub", TableStubActivity.class);
+        super("com.android.cts.widget", TableCtsActivity.class);
     }
 
     @Override
@@ -58,15 +58,15 @@
 
         new TableLayout(mContext, null);
 
-        TableStubActivity activity = getActivity();
-        activity.setContentView(com.android.cts.stub.R.layout.table_layout_1);
+        TableCtsActivity activity = getActivity();
+        activity.setContentView(com.android.cts.widget.R.layout.table_layout_1);
         TableLayout tableLayout = (TableLayout) activity
-                .findViewById(com.android.cts.stub.R.id.table1);
+                .findViewById(com.android.cts.widget.R.id.table1);
         assertTrue(tableLayout.isColumnCollapsed(0));
         assertTrue(tableLayout.isColumnStretchable(2));
 
-        activity.setContentView(com.android.cts.stub.R.layout.table_layout_2);
-        tableLayout = (TableLayout) activity.findViewById(com.android.cts.stub.R.id.table2);
+        activity.setContentView(com.android.cts.widget.R.layout.table_layout_2);
+        tableLayout = (TableLayout) activity.findViewById(com.android.cts.widget.R.id.table2);
         assertTrue(tableLayout.isColumnShrinkable(1));
     }
 
@@ -203,15 +203,15 @@
     }
 
     public void testColumnStretchableEffect() {
-        final TableStubActivity activity = getActivity();
+        final TableCtsActivity activity = getActivity();
         getInstrumentation().runOnMainSync(new Runnable() {
             public void run() {
-                activity.setContentView(com.android.cts.stub.R.layout.table_layout_1);
+                activity.setContentView(com.android.cts.widget.R.layout.table_layout_1);
             }
         });
         getInstrumentation().waitForIdleSync();
         final TableLayout tableLayout =
-                (TableLayout) activity.findViewById(com.android.cts.stub.R.id.table1);
+                (TableLayout) activity.findViewById(com.android.cts.widget.R.id.table1);
 
         // Preparation: remove Collapsed mark for column 0.
         getInstrumentation().runOnMainSync(new Runnable() {
@@ -554,7 +554,7 @@
     public void testGenerateLayoutParams1() {
         TableLayout tableLayout = new TableLayout(mContext);
 
-        TableStubActivity activity = getActivity();
+        TableCtsActivity activity = getActivity();
         XmlResourceParser parser = activity.getResources().getLayout(R.layout.table_layout_1);
         AttributeSet attr = Xml.asAttributeSet(parser);
 
diff --git a/tests/tests/widget/src/android/widget/cts/TableLayout_LayoutParamsTest.java b/tests/tests/widget/src/android/widget/cts/TableLayout_LayoutParamsTest.java
index d63979a..20a9937 100644
--- a/tests/tests/widget/src/android/widget/cts/TableLayout_LayoutParamsTest.java
+++ b/tests/tests/widget/src/android/widget/cts/TableLayout_LayoutParamsTest.java
@@ -139,7 +139,7 @@
         AttributeSet attrs = null;
         try {
             parser = mTargetContext.getResources()
-                    .getXml(com.android.cts.stub.R.xml.base_attributes);
+                    .getXml(com.android.cts.widget.R.xml.base_attributes);
 
             int type;
             while ((type = parser.next()) != XmlPullParser.END_DOCUMENT
diff --git a/tests/tests/widget/src/android/widget/cts/TableRowTest.java b/tests/tests/widget/src/android/widget/cts/TableRowTest.java
index 9ab4d13..6012f59 100644
--- a/tests/tests/widget/src/android/widget/cts/TableRowTest.java
+++ b/tests/tests/widget/src/android/widget/cts/TableRowTest.java
@@ -33,18 +33,18 @@
 import android.widget.TableRow;
 import android.widget.TextView;
 
-import com.android.cts.stub.R;
+import com.android.cts.widget.R;
 
 
 /**
  * Test {@link TableRow}.
  */
-public class TableRowTest extends ActivityInstrumentationTestCase2<TableStubActivity> {
+public class TableRowTest extends ActivityInstrumentationTestCase2<TableCtsActivity> {
     Context mContext;
     Context mTargetContext;
 
     public TableRowTest() {
-        super("com.android.cts.stub", TableStubActivity.class);
+        super("com.android.cts.widget", TableCtsActivity.class);
     }
 
     @Override
@@ -82,10 +82,10 @@
 
     @UiThreadTest
     public void testGetVirtualChildAt() {
-        TableStubActivity activity = getActivity();
-        activity.setContentView(com.android.cts.stub.R.layout.table_layout_1);
+        TableCtsActivity activity = getActivity();
+        activity.setContentView(com.android.cts.widget.R.layout.table_layout_1);
         TableLayout tableLayout = (TableLayout) activity
-                .findViewById(com.android.cts.stub.R.id.table1);
+                .findViewById(com.android.cts.widget.R.id.table1);
 
         TableRow tableRow = (TableRow) tableLayout.getChildAt(0);
         Resources resources = activity.getResources();
@@ -96,8 +96,8 @@
         assertEquals(resources.getString(R.string.table_layout_third),
                 ((TextView) tableRow.getVirtualChildAt(2)).getText().toString());
 
-        activity.setContentView(com.android.cts.stub.R.layout.table_layout_2);
-        tableLayout = (TableLayout) activity.findViewById(com.android.cts.stub.R.id.table2);
+        activity.setContentView(com.android.cts.widget.R.layout.table_layout_2);
+        tableLayout = (TableLayout) activity.findViewById(com.android.cts.widget.R.id.table2);
 
         tableRow = (TableRow) tableLayout.getChildAt(0);
         assertNull(tableRow.getVirtualChildAt(0));
@@ -113,16 +113,16 @@
 
     @UiThreadTest
     public void testGetVirtualChildCount() {
-        TableStubActivity activity = getActivity();
-        activity.setContentView(com.android.cts.stub.R.layout.table_layout_1);
+        TableCtsActivity activity = getActivity();
+        activity.setContentView(com.android.cts.widget.R.layout.table_layout_1);
         TableLayout tableLayout = (TableLayout) activity
-                .findViewById(com.android.cts.stub.R.id.table1);
+                .findViewById(com.android.cts.widget.R.id.table1);
 
         TableRow tableRow = (TableRow) tableLayout.getChildAt(0);
         assertEquals(3, tableRow.getVirtualChildCount());
 
-        activity.setContentView(com.android.cts.stub.R.layout.table_layout_2);
-        tableLayout = (TableLayout) activity.findViewById(com.android.cts.stub.R.id.table2);
+        activity.setContentView(com.android.cts.widget.R.layout.table_layout_2);
+        tableLayout = (TableLayout) activity.findViewById(com.android.cts.widget.R.id.table2);
 
         tableRow = (TableRow) tableLayout.getChildAt(0);
         assertEquals(5, tableRow.getVirtualChildCount());
diff --git a/tests/tests/widget/src/android/widget/cts/TableRow_LayoutParamsTest.java b/tests/tests/widget/src/android/widget/cts/TableRow_LayoutParamsTest.java
index 1d6793f..cf2603f 100644
--- a/tests/tests/widget/src/android/widget/cts/TableRow_LayoutParamsTest.java
+++ b/tests/tests/widget/src/android/widget/cts/TableRow_LayoutParamsTest.java
@@ -39,11 +39,11 @@
  * Test {@link TableRow.LayoutParams}.
  */
 public class TableRow_LayoutParamsTest
-        extends ActivityInstrumentationTestCase2<TableStubActivity> {
+        extends ActivityInstrumentationTestCase2<TableCtsActivity> {
     Context mTargetContext;
 
     public TableRow_LayoutParamsTest() {
-        super("com.android.cts.stub", TableStubActivity.class);
+        super("com.android.cts.widget", TableCtsActivity.class);
     }
 
     @Override
@@ -91,9 +91,9 @@
         assertEquals(0, layoutParams.column);
         assertEquals(0, layoutParams.span);
 
-        TableStubActivity activity = getActivity();
-        activity.setContentView(com.android.cts.stub.R.layout.table_layout_2);
-        int idTable = com.android.cts.stub.R.id.table2;
+        TableCtsActivity activity = getActivity();
+        activity.setContentView(com.android.cts.widget.R.layout.table_layout_2);
+        int idTable = com.android.cts.widget.R.id.table2;
         TableLayout tableLayout = (TableLayout) activity.findViewById(idTable);
         View vVitural1 = ((TableRow) tableLayout.getChildAt(0)).getVirtualChildAt(1);
         layoutParams = (TableRow.LayoutParams) vVitural1.getLayoutParams();
@@ -186,7 +186,7 @@
         AttributeSet attrs = null;
         try {
             parser = mTargetContext.getResources()
-                    .getXml(com.android.cts.stub.R.xml.base_attributes);
+                    .getXml(com.android.cts.widget.R.xml.base_attributes);
 
             int type;
             while ((type = parser.next()) != XmlPullParser.END_DOCUMENT
diff --git a/tests/tests/widget/src/android/widget/cts/TestThread.java b/tests/tests/widget/src/android/widget/cts/TestThread.java
new file mode 100644
index 0000000..78295b9
--- /dev/null
+++ b/tests/tests/widget/src/android/widget/cts/TestThread.java
@@ -0,0 +1,93 @@
+/*
+ * Copyright (C) 2009 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package android.widget.cts;
+
+/**
+ * Thread class for executing a Runnable containing assertions in a separate thread.
+ * Uncaught exceptions in the Runnable are rethrown in the context of the the thread
+ * calling the <code>runTest()</code> method.
+ */
+public final class TestThread extends Thread {
+    private Throwable mThrowable;
+    private Runnable mTarget;
+
+    public TestThread(Runnable target) {
+        mTarget = target;
+    }
+
+    @Override
+    public final void run() {
+        try {
+            mTarget.run();
+        } catch (Throwable t) {
+            mThrowable = t;
+        }
+    }
+
+    /**
+     * Run the target Runnable object and wait until the test finish or throw
+     * out Exception if test fail.
+     *
+     * @param runTime
+     * @throws Throwable
+     */
+    public void runTest(long runTime) throws Throwable {
+        start();
+        joinAndCheck(runTime);
+    }
+
+    /**
+     * Get the Throwable object which is thrown when test running
+     * @return  The Throwable object
+     */
+    public Throwable getThrowable() {
+        return mThrowable;
+    }
+
+    /**
+     * Set the Throwable object which is thrown when test running
+     * @param t The Throwable object
+     */
+    public void setThrowable(Throwable t) {
+        mThrowable = t;
+    }
+
+    /**
+     * Wait for the test thread to complete and throw the stored exception if there is one.
+     *
+     * @param runTime The time to wait for the test thread to complete.
+     * @throws Throwable
+     */
+    public void joinAndCheck(long runTime) throws Throwable {
+        this.join(runTime);
+        if (this.isAlive()) {
+            this.interrupt();
+            this.join(runTime);
+            throw new Exception("Thread did not finish within allotted time.");
+        }
+        checkException();
+    }
+
+    /**
+     * Check whether there is an exception when running Runnable object.
+     * @throws Throwable
+     */
+    public void checkException() throws Throwable {
+        if (mThrowable != null) {
+            throw mThrowable;
+        }
+    }
+}
diff --git a/tests/tests/widget/src/android/widget/cts/TextViewCtsActivity.java b/tests/tests/widget/src/android/widget/cts/TextViewCtsActivity.java
new file mode 100644
index 0000000..888f215
--- /dev/null
+++ b/tests/tests/widget/src/android/widget/cts/TextViewCtsActivity.java
@@ -0,0 +1,37 @@
+/*
+ * Copyright (C) 2008 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.widget.cts;
+
+import com.android.cts.widget.R;
+
+import android.app.Activity;
+import android.os.Bundle;
+
+/**
+ * A minimal application for TextView test.
+ */
+public class TextViewCtsActivity extends Activity {
+    /**
+     * Called with the activity is first created.
+     */
+    @Override
+    public void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.textview_layout);
+    }
+}
+
diff --git a/tests/tests/widget/src/android/widget/cts/TextViewTest.java b/tests/tests/widget/src/android/widget/cts/TextViewTest.java
index c66184f..c5d9985 100644
--- a/tests/tests/widget/src/android/widget/cts/TextViewTest.java
+++ b/tests/tests/widget/src/android/widget/cts/TextViewTest.java
@@ -16,7 +16,7 @@
 
 package android.widget.cts;
 
-import com.android.cts.stub.R;
+import com.android.cts.widget.R;
 import com.android.internal.util.FastMath;
 
 import org.xmlpull.v1.XmlPullParserException;
@@ -69,7 +69,6 @@
 import android.text.method.TimeKeyListener;
 import android.text.method.TransformationMethod;
 import android.text.style.URLSpan;
-import android.text.style.cts.MockURLSpanTestActivity;
 import android.text.util.Linkify;
 import android.util.DisplayMetrics;
 import android.util.TypedValue;
@@ -98,7 +97,7 @@
 /**
  * Test {@link TextView}.
  */
-public class TextViewTest extends ActivityInstrumentationTestCase2<TextViewStubActivity> {
+public class TextViewTest extends ActivityInstrumentationTestCase2<TextViewCtsActivity> {
 
     private TextView mTextView;
     private Activity mActivity;
@@ -112,7 +111,7 @@
     private CharSequence mTransformedText;
 
     public TextViewTest() {
-        super("com.android.cts.stub", TextViewStubActivity.class);
+        super("com.android.cts.widget", TextViewCtsActivity.class);
     }
 
     @Override
@@ -1810,7 +1809,8 @@
 
         // getTypeface
         // getTypeface will be null if android:typeface is set to normal,
-        // and android:style is not set or is set to normal
+        // and android:style is not set or is set to normal, and
+        // android:fontFamily is not set
         assertNull(mTextView.getTypeface());
 
         mTextView.setTypeface(Typeface.DEFAULT);
@@ -3293,7 +3293,7 @@
 
     @UiThreadTest
     public void testResetTextAlignment() {
-        TextViewStubActivity activity = getActivity();
+        TextViewCtsActivity activity = getActivity();
 
         LinearLayout ll = (LinearLayout) activity.findViewById(R.id.layout_textviewtest);
         TextView tv = (TextView) activity.findViewById(R.id.textview_rtl);
@@ -3319,7 +3319,7 @@
         final int RIGHT = 2;
         final int BOTTOM = 3;
 
-        TextViewStubActivity activity = getActivity();
+        TextViewCtsActivity activity = getActivity();
 
         // Case 1.1: left / right drawable defined in default LTR mode
         TextView tv = (TextView) activity.findViewById(R.id.textview_drawable_1_1);
@@ -3463,7 +3463,7 @@
         final int RIGHT = 2;
         final int BOTTOM = 3;
 
-        TextViewStubActivity activity = getActivity();
+        TextViewCtsActivity activity = getActivity();
 
         // Case 1.1: left / right drawable defined in default LTR mode
         TextView tv = (TextView) activity.findViewById(R.id.textview_drawable_1_1);
diff --git a/tests/tests/widget/src/android/widget/cts/TimePickerTest.java b/tests/tests/widget/src/android/widget/cts/TimePickerTest.java
index 2ab01a3..fcf787a 100644
--- a/tests/tests/widget/src/android/widget/cts/TimePickerTest.java
+++ b/tests/tests/widget/src/android/widget/cts/TimePickerTest.java
@@ -29,7 +29,7 @@
 /**
  * Test {@link TimePicker}.
  */
-public class TimePickerTest extends ActivityInstrumentationTestCase2<StubActivity> {
+public class TimePickerTest extends ActivityInstrumentationTestCase2<CtsActivity> {
     private TimePicker mTimePicker;
 
     private Activity mActivity;
@@ -39,7 +39,7 @@
     private Instrumentation mInstrumentation;
 
     public TimePickerTest() {
-        super("com.android.cts.stub", StubActivity.class);
+        super("com.android.cts.widget", CtsActivity.class);
     }
 
     @Override
@@ -52,7 +52,7 @@
 
     public void testConstructors() {
         AttributeSet attrs =
-            mContext.getResources().getLayout(com.android.cts.stub.R.layout.timepicker);
+            mContext.getResources().getLayout(com.android.cts.widget.R.layout.timepicker);
         assertNotNull(attrs);
 
         new TimePicker(mContext);
diff --git a/tests/tests/widget/src/android/widget/cts/ToastTest.java b/tests/tests/widget/src/android/widget/cts/ToastTest.java
index 9c7846b..055b874 100644
--- a/tests/tests/widget/src/android/widget/cts/ToastTest.java
+++ b/tests/tests/widget/src/android/widget/cts/ToastTest.java
@@ -16,7 +16,7 @@
 
 package android.widget.cts;
 
-import com.android.cts.stub.R;
+import com.android.cts.widget.R;
 
 
 import android.app.Activity;
@@ -33,7 +33,7 @@
 import android.widget.ImageView;
 import android.widget.Toast;
 
-public class ToastTest extends ActivityInstrumentationTestCase2<StubActivity> {
+public class ToastTest extends ActivityInstrumentationTestCase2<CtsActivity> {
     private static final String TEST_TOAST_TEXT = "test toast";
     private static final long TIME_FOR_UI_OPERATION  = 1000L;
     private static final long TIME_OUT = 5000L;
@@ -44,7 +44,7 @@
     private ViewTreeObserver.OnGlobalLayoutListener mLayoutListener;
 
     public ToastTest() {
-        super("com.android.cts.stub", StubActivity.class);
+        super("com.android.cts.widget", CtsActivity.class);
     }
 
     @Override
diff --git a/tests/tests/widget/src/android/widget/cts/ToggleButtonTest.java b/tests/tests/widget/src/android/widget/cts/ToggleButtonTest.java
index ca1c94f..d5b74c3 100644
--- a/tests/tests/widget/src/android/widget/cts/ToggleButtonTest.java
+++ b/tests/tests/widget/src/android/widget/cts/ToggleButtonTest.java
@@ -26,7 +26,7 @@
 import android.util.Xml;
 import android.widget.ToggleButton;
 
-import com.android.cts.stub.R;
+import com.android.cts.widget.R;
 
 
 /**
diff --git a/tests/tests/widget/src/android/widget/cts/TwoLineListItemCtsActivity.java b/tests/tests/widget/src/android/widget/cts/TwoLineListItemCtsActivity.java
new file mode 100644
index 0000000..bd2c36d
--- /dev/null
+++ b/tests/tests/widget/src/android/widget/cts/TwoLineListItemCtsActivity.java
@@ -0,0 +1,37 @@
+/*
+ * Copyright (C) 2008 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.widget.cts;
+
+import com.android.cts.widget.R;
+
+import android.app.Activity;
+import android.os.Bundle;
+import android.widget.TwoLineListItem;
+
+/**
+ * Stub activity for testing {@link TwoLineListItem}
+ */
+public class TwoLineListItemCtsActivity extends Activity {
+    /**
+     * Called with the activity is first created.
+     */
+    @Override
+    public void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.twolinelistitem);
+    }
+}
diff --git a/tests/tests/widget/src/android/widget/cts/TwoLineListItemTest.java b/tests/tests/widget/src/android/widget/cts/TwoLineListItemTest.java
index 5ef5961..0d5807f 100644
--- a/tests/tests/widget/src/android/widget/cts/TwoLineListItemTest.java
+++ b/tests/tests/widget/src/android/widget/cts/TwoLineListItemTest.java
@@ -16,7 +16,7 @@
 
 package android.widget.cts;
 
-import com.android.cts.stub.R;
+import com.android.cts.widget.R;
 
 
 import android.app.Activity;
@@ -32,11 +32,11 @@
  * Test {@link TwoLineListItem}.
  */
 public class TwoLineListItemTest extends
-        ActivityInstrumentationTestCase<TwoLineListItemStubActivity> {
+        ActivityInstrumentationTestCase<TwoLineListItemCtsActivity> {
     private Activity mActivity;
 
     public TwoLineListItemTest() {
-        super("com.android.cts.stub", TwoLineListItemStubActivity.class);
+        super("com.android.cts.widget", TwoLineListItemCtsActivity.class);
     }
 
     @Override
diff --git a/tests/tests/widget/src/android/widget/cts/VideoViewCtsActivity.java b/tests/tests/widget/src/android/widget/cts/VideoViewCtsActivity.java
new file mode 100644
index 0000000..ad0d6eb
--- /dev/null
+++ b/tests/tests/widget/src/android/widget/cts/VideoViewCtsActivity.java
@@ -0,0 +1,37 @@
+/*
+ * Copyright (C) 2009 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.widget.cts;
+
+import com.android.cts.widget.R;
+
+import android.app.Activity;
+import android.os.Bundle;
+import android.widget.VideoView;
+
+/**
+ * A minimal application for {@link VideoView} test.
+ */
+public class VideoViewCtsActivity extends Activity {
+    /**
+     * Called with the activity is first created.
+     */
+    @Override
+    public void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.videoview_layout);
+    }
+}
diff --git a/tests/tests/widget/src/android/widget/cts/VideoViewTest.java b/tests/tests/widget/src/android/widget/cts/VideoViewTest.java
index c8d9fc7..79b10df 100644
--- a/tests/tests/widget/src/android/widget/cts/VideoViewTest.java
+++ b/tests/tests/widget/src/android/widget/cts/VideoViewTest.java
@@ -16,7 +16,7 @@
 
 package android.widget.cts;
 
-import com.android.cts.stub.R;
+import com.android.cts.widget.R;
 
 import android.app.Activity;
 import android.app.Instrumentation;
@@ -41,7 +41,7 @@
 /**
  * Test {@link VideoView}.
  */
-public class VideoViewTest extends ActivityInstrumentationTestCase2<VideoViewStubActivity> {
+public class VideoViewTest extends ActivityInstrumentationTestCase2<VideoViewCtsActivity> {
     /** Debug TAG. **/
     private static final String TAG = "VideoViewTest";
     /** The maximum time to wait for an operation. */
@@ -127,7 +127,7 @@
      * Instantiates a new video view test.
      */
     public VideoViewTest() {
-        super("com.android.cts.stub", VideoViewStubActivity.class);
+        super("com.android.cts.widget", VideoViewCtsActivity.class);
     }
 
     /**
diff --git a/tests/tests/widget/src/android/widget/cts/ViewAnimatorCtsActivity.java b/tests/tests/widget/src/android/widget/cts/ViewAnimatorCtsActivity.java
new file mode 100644
index 0000000..21deef7
--- /dev/null
+++ b/tests/tests/widget/src/android/widget/cts/ViewAnimatorCtsActivity.java
@@ -0,0 +1,36 @@
+/*
+ * Copyright (C) 2008 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.widget.cts;
+
+import android.app.Activity;
+import android.os.Bundle;
+import com.android.cts.widget.R;
+
+/**
+ * A minimal application for ViewAnimator test.
+ */
+public class ViewAnimatorCtsActivity extends Activity {
+    /**
+     * Called with the activity is first created.
+     */
+    @Override
+    public void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.viewanimator_layout);
+    }
+}
+
diff --git a/tests/tests/widget/src/android/widget/cts/ViewAnimatorTest.java b/tests/tests/widget/src/android/widget/cts/ViewAnimatorTest.java
index 72f5559..024e3ee 100644
--- a/tests/tests/widget/src/android/widget/cts/ViewAnimatorTest.java
+++ b/tests/tests/widget/src/android/widget/cts/ViewAnimatorTest.java
@@ -16,7 +16,7 @@
 
 package android.widget.cts;
 
-import com.android.cts.stub.R;
+import com.android.cts.widget.R;
 
 
 import org.xmlpull.v1.XmlPullParser;
@@ -36,14 +36,14 @@
 import android.widget.ViewAnimator;
 
 public class ViewAnimatorTest extends
-        ActivityInstrumentationTestCase2<ViewAnimatorStubActivity> {
+        ActivityInstrumentationTestCase2<ViewAnimatorCtsActivity> {
     private ViewAnimator mViewAnimator;
     private Activity mActivity;
     private Instrumentation mInstrumentation;
     private AttributeSet mAttributeSet;
 
     public ViewAnimatorTest() {
-        super("com.android.cts.stub", ViewAnimatorStubActivity.class);
+        super("com.android.cts.widget", ViewAnimatorCtsActivity.class);
     }
 
     @Override
diff --git a/tests/tests/widget/src/android/widget/cts/ViewFlipperCtsActivity.java b/tests/tests/widget/src/android/widget/cts/ViewFlipperCtsActivity.java
new file mode 100644
index 0000000..7f13f6c
--- /dev/null
+++ b/tests/tests/widget/src/android/widget/cts/ViewFlipperCtsActivity.java
@@ -0,0 +1,32 @@
+/*
+ * Copyright (C) 2008 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.widget.cts;
+
+import com.android.cts.widget.R;
+
+import android.app.Activity;
+import android.os.Bundle;
+
+public class ViewFlipperCtsActivity extends Activity {
+    @Override
+    public void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+
+        setContentView(R.layout.viewflipper_layout);
+    }
+}
+
diff --git a/tests/tests/widget/src/android/widget/cts/ViewFlipperTest.java b/tests/tests/widget/src/android/widget/cts/ViewFlipperTest.java
index f223466..ac06def 100644
--- a/tests/tests/widget/src/android/widget/cts/ViewFlipperTest.java
+++ b/tests/tests/widget/src/android/widget/cts/ViewFlipperTest.java
@@ -16,7 +16,7 @@
 
 package android.widget.cts;
 
-import com.android.cts.stub.R;
+import com.android.cts.widget.R;
 
 
 import org.xmlpull.v1.XmlPullParser;
@@ -32,11 +32,11 @@
 /**
  * Test {@link ViewFlipper}.
  */
-public class ViewFlipperTest extends ActivityInstrumentationTestCase<ViewFlipperStubActivity> {
+public class ViewFlipperTest extends ActivityInstrumentationTestCase<ViewFlipperCtsActivity> {
     private Activity mActivity;
 
     public ViewFlipperTest() {
-        super("com.android.cts.stub", ViewFlipperStubActivity.class);
+        super("com.android.cts.widget", ViewFlipperCtsActivity.class);
     }
 
     protected void setUp() throws Exception {
diff --git a/tests/tests/widget/src/android/widget/cts/ViewGroupCtsActivity.java b/tests/tests/widget/src/android/widget/cts/ViewGroupCtsActivity.java
new file mode 100644
index 0000000..378395e
--- /dev/null
+++ b/tests/tests/widget/src/android/widget/cts/ViewGroupCtsActivity.java
@@ -0,0 +1,70 @@
+/*
+ * Copyright (C) 2008 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.widget.cts;
+
+import android.app.Activity;
+import android.app.cts.CTSResult;
+import android.os.Bundle;
+import android.os.Handler;
+import android.widget.TextView;
+
+public class ViewGroupCtsActivity extends Activity {
+
+    public static final String ACTION_INVALIDATE_CHILD = "invalidateChild";
+
+    private final Handler mHandler = new Handler();
+    private static CTSResult sResult;
+    public static void setResult(CTSResult result) {
+        sResult = result;
+    }
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(com.android.cts.widget.R.layout.viewgrouptest_stub);
+        TextView textView = (TextView)findViewById(com.android.cts.widget.R.id.viewgrouptest_stub);
+        textView.setText("test");
+    }
+
+    @Override
+    protected void onResume() {
+        super.onResume();
+
+        String action = getIntent().getAction();
+        if (action.equals(ACTION_INVALIDATE_CHILD)) {
+            mHandler.postDelayed(new Runnable() {
+                public void run() {
+                    MockLinearLayout mll =
+                        (MockLinearLayout) findViewById(com.android.cts.widget.R.id.
+                                                                        mocklinearlayout);
+                    if (!mll.mIsInvalidateChildInParentCalled) {
+                        fail();
+                        return;
+                    }
+                    sResult.setResult(CTSResult.RESULT_OK);
+                    finish();
+                }
+            }, 2000);
+        }
+    }
+
+    private void fail() {
+        sResult.setResult(CTSResult.RESULT_FAIL);
+        finish();
+    }
+}
+
diff --git a/tests/tests/widget/src/android/widget/cts/ViewSwitcherTest.java b/tests/tests/widget/src/android/widget/cts/ViewSwitcherTest.java
index b7bac6c..ce18267 100644
--- a/tests/tests/widget/src/android/widget/cts/ViewSwitcherTest.java
+++ b/tests/tests/widget/src/android/widget/cts/ViewSwitcherTest.java
@@ -28,7 +28,7 @@
 import android.widget.ViewSwitcher;
 import android.widget.ViewSwitcher.ViewFactory;
 
-import com.android.cts.stub.R;
+import com.android.cts.widget.R;
 
 
 /**
diff --git a/tests/src/android/widget/cts/WidgetTestUtils.java b/tests/tests/widget/src/android/widget/cts/WidgetTestUtils.java
similarity index 100%
rename from tests/src/android/widget/cts/WidgetTestUtils.java
rename to tests/tests/widget/src/android/widget/cts/WidgetTestUtils.java
diff --git a/tests/tests/widget/src/android/widget/cts/ZoomButtonCtsActivity.java b/tests/tests/widget/src/android/widget/cts/ZoomButtonCtsActivity.java
new file mode 100644
index 0000000..e371b3f
--- /dev/null
+++ b/tests/tests/widget/src/android/widget/cts/ZoomButtonCtsActivity.java
@@ -0,0 +1,36 @@
+/*
+ * Copyright (C) 2009 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.widget.cts;
+
+import com.android.cts.widget.R;
+
+import android.app.Activity;
+import android.os.Bundle;
+
+/**
+ * A minimal application for {@link ZoomButton} test.
+ */
+public class ZoomButtonCtsActivity extends Activity {
+    /**
+     * Called with the activity is first created.
+     */
+    @Override
+    public void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.zoombutton_layout);
+    }
+}
diff --git a/tests/tests/widget/src/android/widget/cts/ZoomButtonTest.java b/tests/tests/widget/src/android/widget/cts/ZoomButtonTest.java
index 94c2669..47bcfed 100644
--- a/tests/tests/widget/src/android/widget/cts/ZoomButtonTest.java
+++ b/tests/tests/widget/src/android/widget/cts/ZoomButtonTest.java
@@ -16,7 +16,7 @@
 
 package android.widget.cts;
 
-import com.android.cts.stub.R;
+import com.android.cts.widget.R;
 
 
 import org.xmlpull.v1.XmlPullParser;
@@ -32,12 +32,12 @@
 import android.widget.ListView;
 import android.widget.ZoomButton;
 
-public class ZoomButtonTest extends ActivityInstrumentationTestCase2<ZoomButtonStubActivity> {
+public class ZoomButtonTest extends ActivityInstrumentationTestCase2<ZoomButtonCtsActivity> {
     private ZoomButton mZoomButton;
     private Activity mActivity;
 
     public ZoomButtonTest() {
-        super("com.android.cts.stub", ZoomButtonStubActivity.class);
+        super("com.android.cts.widget", ZoomButtonCtsActivity.class);
     }
 
     @Override
diff --git a/tests/src/android/widget/cts/util/ExpandableListScenario.java b/tests/tests/widget/src/android/widget/cts/util/ExpandableListScenario.java
similarity index 100%
rename from tests/src/android/widget/cts/util/ExpandableListScenario.java
rename to tests/tests/widget/src/android/widget/cts/util/ExpandableListScenario.java
diff --git a/tests/src/android/widget/cts/util/ListItemFactory.java b/tests/tests/widget/src/android/widget/cts/util/ListItemFactory.java
similarity index 100%
rename from tests/src/android/widget/cts/util/ListItemFactory.java
rename to tests/tests/widget/src/android/widget/cts/util/ListItemFactory.java
diff --git a/tests/src/android/widget/cts/util/ListScenario.java b/tests/tests/widget/src/android/widget/cts/util/ListScenario.java
similarity index 100%
rename from tests/src/android/widget/cts/util/ListScenario.java
rename to tests/tests/widget/src/android/widget/cts/util/ListScenario.java
diff --git a/tests/src/android/widget/cts/util/ListUtil.java b/tests/tests/widget/src/android/widget/cts/util/ListUtil.java
similarity index 100%
rename from tests/src/android/widget/cts/util/ListUtil.java
rename to tests/tests/widget/src/android/widget/cts/util/ListUtil.java
diff --git a/tests/webgl/AndroidManifest.xml b/tests/webgl/AndroidManifest.xml
index e30fc86..d648032 100755
--- a/tests/webgl/AndroidManifest.xml
+++ b/tests/webgl/AndroidManifest.xml
@@ -21,7 +21,7 @@
     <uses-permission android:name="android.permission.DISABLE_KEYGUARD" />
     <uses-permission android:name="android.permission.INTERNET" />
 
-    <application>
+    <application android:maxRecents="1">
         <uses-library android:name="android.test.runner" />
         <activity android:name="android.webgl.WebGLActivity" >
             <intent-filter>
diff --git a/tests/webgl/src/android/webgl/WebGLActivity.java b/tests/webgl/src/android/webgl/WebGLActivity.java
index bb02938..ebba905 100644
--- a/tests/webgl/src/android/webgl/WebGLActivity.java
+++ b/tests/webgl/src/android/webgl/WebGLActivity.java
@@ -24,6 +24,7 @@
 import android.webgl.cts.R;
 import android.webkit.WebView;
 import android.webkit.JavascriptInterface;
+import android.webkit.WebViewClient;
 import android.widget.Toast;
 import java.lang.Override;
 import java.io.InputStream;
@@ -36,6 +37,7 @@
 public class WebGLActivity extends Activity {
 
     Semaphore mFinished = new Semaphore(0, false);
+    Semaphore mDestroyed = new Semaphore(0, false);
     String mWebGlHarnessUrl;
     WebView mWebView;
 
@@ -53,6 +55,12 @@
         mWebView.getSettings().setJavaScriptEnabled(true);
         mWebView.getSettings().setAllowFileAccessFromFileURLs(true);
         mWebView.getSettings().setMediaPlaybackRequiresUserGesture(false);
+        mWebView.setWebViewClient(new WebViewClient() {
+            @Override
+            public boolean shouldOverrideUrlLoading(WebView webView, String url) {
+                return false;
+            }
+        });
 
         mWebView.addJavascriptInterface(new Object() {
             @JavascriptInterface
@@ -101,6 +109,17 @@
         synchronized(WebGLActivity.this) {
             message = mMessage.toString();
         }
+
+        // Destroy the webview and wait for it.
+        runOnUiThread(new Runnable() {
+            public void run() {
+                mWebView.destroy();
+                finish();
+                mDestroyed.release();
+            }
+        });
+        mDestroyed.acquire();
+
         if (!finished)
             throw new Exception("\n" + url + "\n Test timed-out after 60 seconds: " + message);
         if(!mPassed)
diff --git a/tools/tradefed-host/res/report/cts_result.xsl b/tools/tradefed-host/res/report/cts_result.xsl
index fe49308..3c914dc 100644
--- a/tools/tradefed-host/res/report/cts_result.xsl
+++ b/tools/tradefed-host/res/report/cts_result.xsl
@@ -466,7 +466,9 @@
                         <TR>
                             <TD class="package" colspan="3">
                                 <xsl:variable name="href"><xsl:value-of select="@appPackageName"/></xsl:variable>
-                                <a name="{$href}">Compatibility Test Package: <xsl:value-of select="@appPackageName"/></a>
+                                <a name="{$href}">Compatibility Test Package: <xsl:value-of select="@appPackageName"/>
+                                abi: <xsl:value-of select="@abi"/>
+                                </a>
                             </TD>
                         </TR>
 
diff --git a/tools/tradefed-host/src/com/android/cts/tradefed/testtype/DeqpTest.java b/tools/tradefed-host/src/com/android/cts/tradefed/testtype/DeqpTest.java
index ddb24c2..5149695 100644
--- a/tools/tradefed-host/src/com/android/cts/tradefed/testtype/DeqpTest.java
+++ b/tools/tradefed-host/src/com/android/cts/tradefed/testtype/DeqpTest.java
@@ -9,6 +9,7 @@
 import com.android.tradefed.config.Option;
 import com.android.tradefed.device.DeviceNotAvailableException;
 import com.android.tradefed.device.ITestDevice;
+import com.android.tradefed.log.LogUtil.CLog;
 import com.android.tradefed.result.ByteArrayInputStreamSource;
 import com.android.tradefed.result.ITestInvocationListener;
 import com.android.tradefed.result.LogDataType;
@@ -42,6 +43,7 @@
     private ITestDevice mDevice;
 
     private final String mUri;
+    private final String mName;
     private Collection<TestIdentifier> mTests;
 
     private TestIdentifier mCurrentTestId;
@@ -50,8 +52,9 @@
 
     private ITestInvocationListener mListener;
 
-    public DeqpTest(String uri, Collection<TestIdentifier> tests) {
+    public DeqpTest(String uri, String name, Collection<TestIdentifier> tests) {
         mUri = uri;
+        mName = name;
         mTests = tests;
         mLogData = false;
     }
@@ -398,39 +401,73 @@
     }
 
     /**
+     * Check if device supports OpenGL ES version.
+     */
+    static boolean isSupportedGles(ITestDevice device, int requiredMajorVersion, int requiredMinorVersion) throws DeviceNotAvailableException {
+        String roOpenglesVersion = device.getProperty("ro.opengles.version");
+
+        if (roOpenglesVersion == null)
+            return false;
+
+        int intValue = Integer.parseInt(roOpenglesVersion);
+
+        int majorVersion = ((intValue & 0xffff0000) >> 16);
+        int minorVersion = (intValue & 0xffff);
+
+        return (majorVersion > requiredMajorVersion)
+                || (majorVersion == requiredMajorVersion && minorVersion >= requiredMinorVersion);
+    }
+
+    /**
      * {@inheritDoc}
      */
     @Override
     public void run(ITestInvocationListener listener) throws DeviceNotAvailableException {
         mListener = listener;
 
-        while (!mTests.isEmpty()) {
-            executeTests(listener);
+        if ((mName.equals( "dEQP-GLES3") && isSupportedGles(mDevice, 3, 0))
+            || (mName.equals("dEQP-GLES31") && isSupportedGles(mDevice, 3, 1))) {
 
-            // Set test to failed if it didn't receive test result
-            if (mCurrentTestId != null) {
-                Map <String, String> emptyMap = Collections.emptyMap();
+            while (!mTests.isEmpty()) {
+                executeTests(listener);
 
-                if (mLogData && mCurrentTestLog != null && mCurrentTestLog.length() > 0) {
-                    ByteArrayInputStreamSource source
-                            = new ByteArrayInputStreamSource(mCurrentTestLog.getBytes());
+                // Set test to failed if it didn't receive test result
+                if (mCurrentTestId != null) {
+                    Map <String, String> emptyMap = Collections.emptyMap();
 
-                    mListener.testLog(mCurrentTestId.getClassName() + "."
-                            + mCurrentTestId.getTestName(), LogDataType.XML, source);
+                    if (mLogData && mCurrentTestLog != null && mCurrentTestLog.length() > 0) {
+                        ByteArrayInputStreamSource source
+                                = new ByteArrayInputStreamSource(mCurrentTestLog.getBytes());
 
-                    source.cancel();
+                        mListener.testLog(mCurrentTestId.getClassName() + "."
+                                + mCurrentTestId.getTestName(), LogDataType.XML, source);
+
+                        source.cancel();
+                    }
+
+
+                    if (!mGotTestResult) {
+                        mListener.testFailed(ITestRunListener.TestFailure.ERROR, mCurrentTestId,
+                            "Log doesn't contain test result");
+                    }
+
+                    mListener.testEnded(mCurrentTestId, emptyMap);
+                    mCurrentTestId = null;
+                    mListener.testRunEnded(0, emptyMap);
                 }
-
-
-                if (!mGotTestResult) {
-                    mListener.testFailed(ITestRunListener.TestFailure.ERROR, mCurrentTestId,
-                        "Log doesn't contain test result");
-                }
-
-                mListener.testEnded(mCurrentTestId, emptyMap);
-                mCurrentTestId = null;
-                mListener.testRunEnded(0, emptyMap);
             }
+        } else {
+            /* Pass all tests if OpenGL ES version is not supported */
+            Map <String, String> emptyMap = Collections.emptyMap();
+            mListener.testRunStarted(mUri, mTests.size());
+
+            for (TestIdentifier test : mTests) {
+                CLog.d("Skipping test '%s', Opengl ES version not supported", test.toString());
+                mListener.testStarted(test);
+                mListener.testEnded(test, emptyMap);
+            }
+
+            mListener.testRunEnded(0, emptyMap);
         }
     }
 
diff --git a/tools/tradefed-host/src/com/android/cts/tradefed/testtype/TestPackageDef.java b/tools/tradefed-host/src/com/android/cts/tradefed/testtype/TestPackageDef.java
index 4fa3b2b..7a9756c 100644
--- a/tools/tradefed-host/src/com/android/cts/tradefed/testtype/TestPackageDef.java
+++ b/tools/tradefed-host/src/com/android/cts/tradefed/testtype/TestPackageDef.java
@@ -235,7 +235,7 @@
             mDigest = generateDigest(testCaseDir, mJarPath);
             return vmHostTest;
         } else if (DEQP_TEST.equals(mTestType)) {
-            return new DeqpTest(mUri, mTests);
+            return new DeqpTest(mUri, mName, mTests);
         } else if (NATIVE_TEST.equals(mTestType)) {
             return new GeeTest(mUri, mName);
         } else if (WRAPPED_NATIVE_TEST.equals(mTestType)) {
diff --git a/tools/tradefed-host/tests/src/com/android/cts/tradefed/testtype/DeqpTestTest.java b/tools/tradefed-host/tests/src/com/android/cts/tradefed/testtype/DeqpTestTest.java
index 0be2b80..0e7c26e 100644
--- a/tools/tradefed-host/tests/src/com/android/cts/tradefed/testtype/DeqpTestTest.java
+++ b/tools/tradefed-host/tests/src/com/android/cts/tradefed/testtype/DeqpTestTest.java
@@ -39,7 +39,7 @@
     private static final String CASE_LIST_FILE_NAME = "/sdcard/dEQP-TestCaseList.txt";
     private static final String LOG_FILE_NAME = "/sdcard/TestLog.qpa";
     private static final String INSTRUMENTATION_NAME =
-                "com.drawelements.deqp/com.drawelements.deqp.testercore.DeqpInstrumentation";
+            "com.drawelements.deqp/com.drawelements.deqp.testercore.DeqpInstrumentation";
 
     /**
      * {@inheritDoc}
@@ -50,6 +50,124 @@
     }
 
     /**
+     * Test version of OpenGL ES.
+     */
+    private void testGlesVersion(int requiredMajorVersion, int requiredMinorVersion, int majorVersion, int minorVersion) throws Exception {
+        final TestIdentifier testId = new TestIdentifier("dEQP-GLES"
+                + Integer.toString(requiredMajorVersion) + Integer.toString(requiredMinorVersion)
+                + ".info", "version");
+
+        final String testPath = "dEQP-GLES"
+                + Integer.toString(requiredMajorVersion) + Integer.toString(requiredMinorVersion)
+                +".info.version";
+
+        final String testTrie = "{dEQP-GLES"
+                + Integer.toString(requiredMajorVersion) + Integer.toString(requiredMinorVersion)
+                + "{info{version}}}";
+
+        final String resultCode = "Pass";
+
+        /* MultiLineReceiver expects "\r\n" line ending. */
+        final String output = "INSTRUMENTATION_STATUS: dEQP-SessionInfo-Name=releaseName\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-EventType=SessionInfo\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-SessionInfo-Value=2014.x\r\n"
+                + "INSTRUMENTATION_STATUS_CODE: 0\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-SessionInfo-Name=releaseId\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-EventType=SessionInfo\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-SessionInfo-Value=0xcafebabe\r\n"
+                + "INSTRUMENTATION_STATUS_CODE: 0\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-SessionInfo-Name=targetName\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-EventType=SessionInfo\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-SessionInfo-Value=android\r\n"
+                + "INSTRUMENTATION_STATUS_CODE: 0\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-EventType=BeginSession\r\n"
+                + "INSTRUMENTATION_STATUS_CODE: 0\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-EventType=BeginTestCase\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-BeginTestCase-TestCasePath=" + testPath + "\r\n"
+                + "INSTRUMENTATION_STATUS_CODE: 0\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-TestCaseResult-Code=" + resultCode + "\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-TestCaseResult-Details=Detail" + resultCode + "\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-EventType=TestCaseResult\r\n"
+                + "INSTRUMENTATION_STATUS_CODE: 0\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-EventType=EndTestCase\r\n"
+                + "INSTRUMENTATION_STATUS_CODE: 0\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-EventType=EndSession\r\n"
+                + "INSTRUMENTATION_STATUS_CODE: 0\r\n"
+                + "INSTRUMENTATION_CODE: 0\r\n";
+
+        ITestDevice mockDevice = EasyMock.createMock(ITestDevice.class);
+        ITestInvocationListener mockListener
+                = EasyMock.createStrictMock(ITestInvocationListener.class);
+        Collection<TestIdentifier> tests = new ArrayList<TestIdentifier>();
+
+        tests.add(testId);
+
+        DeqpTest deqpTest = new DeqpTest(URI,
+                "dEQP-GLES" + Integer.toString(requiredMajorVersion)
+                + (requiredMinorVersion > 0 ? Integer.toString(requiredMinorVersion) : ""),
+                tests);
+
+        int version = (majorVersion << 16) | minorVersion;
+        EasyMock.expect(mockDevice.getProperty("ro.opengles.version"))
+            .andReturn(Integer.toString(version)).atLeastOnce();
+
+        if (majorVersion > requiredMajorVersion
+                || (majorVersion == requiredMajorVersion && minorVersion >= requiredMinorVersion)) {
+
+            EasyMock.expect(mockDevice.executeShellCommand(
+                    EasyMock.eq("rm " + CASE_LIST_FILE_NAME))).andReturn("").once();
+
+            EasyMock.expect(mockDevice.executeShellCommand(EasyMock.eq("rm " + LOG_FILE_NAME)))
+                    .andReturn("").once();
+
+            EasyMock.expect(mockDevice.pushString(testTrie + "\n", CASE_LIST_FILE_NAME))
+                    .andReturn(true).once();
+
+            String command = "am instrument -w -e deqpLogFileName \"" + LOG_FILE_NAME
+                    + "\" -e deqpCmdLine \"--deqp-caselist-file=" + CASE_LIST_FILE_NAME + " "
+                    + "--deqp-gl-config-name=rgba8888d24s8\" "
+                    + INSTRUMENTATION_NAME;
+
+            mockDevice.executeShellCommand(EasyMock.eq(command),
+                    EasyMock.<IShellOutputReceiver>notNull());
+
+            EasyMock.expectLastCall().andAnswer(new IAnswer<Object>() {
+                @Override
+                public Object answer() {
+                    IShellOutputReceiver receiver
+                            = (IShellOutputReceiver)EasyMock.getCurrentArguments()[1];
+
+                    receiver.addOutput(output.getBytes(), 0, output.length());
+                    receiver.flush();
+
+                    return null;
+                }
+            });
+        }
+
+        mockListener.testRunStarted(URI, 1);
+        EasyMock.expectLastCall().once();
+
+        mockListener.testStarted(EasyMock.eq(testId));
+        EasyMock.expectLastCall().once();
+
+        mockListener.testEnded(EasyMock.eq(testId), EasyMock.<Map<String, String>>notNull());
+        EasyMock.expectLastCall().once();
+
+        mockListener.testRunEnded(EasyMock.anyLong(), EasyMock.<Map<String, String>>notNull());
+        EasyMock.expectLastCall().once();
+
+        EasyMock.replay(mockDevice);
+        EasyMock.replay(mockListener);
+
+        deqpTest.setDevice(mockDevice);
+        deqpTest.run(mockListener);
+
+        EasyMock.verify(mockListener);
+        EasyMock.verify(mockDevice);
+    }
+
+    /**
      * Test that result code produces correctly pass or fail.
      */
     private void testResultCode(final String resultCode, boolean pass) throws Exception {
@@ -92,7 +210,11 @@
 
         tests.add(testId);
 
-        DeqpTest deqpTest = new DeqpTest(URI, tests);
+        DeqpTest deqpTest = new DeqpTest(URI, "dEQP-GLES3", tests);
+
+        int version = 3 << 16;
+        EasyMock.expect(mockDevice.getProperty("ro.opengles.version"))
+            .andReturn(Integer.toString(version)).atLeastOnce();
 
         EasyMock.expect(mockDevice.executeShellCommand(EasyMock.eq("rm " + CASE_LIST_FILE_NAME)))
                 .andReturn("").once();
@@ -252,14 +374,19 @@
                 = "{dEQP-GLES3{info{vendor,renderer,version,shading_language_version,extensions,render_target}}}";
 
         ITestDevice mockDevice = EasyMock.createMock(ITestDevice.class);
-        ITestInvocationListener mockListener = EasyMock.createStrictMock(ITestInvocationListener.class);
+        ITestInvocationListener mockListener
+                = EasyMock.createStrictMock(ITestInvocationListener.class);
         Collection<TestIdentifier> tests = new ArrayList<TestIdentifier>();
 
         for (TestIdentifier id : testIds) {
             tests.add(id);
         }
 
-        DeqpTest deqpTest = new DeqpTest(URI, tests);
+        DeqpTest deqpTest = new DeqpTest(URI, "dEQP-GLES3", tests);
+
+        int version = 3 << 16;
+        EasyMock.expect(mockDevice.getProperty("ro.opengles.version"))
+            .andReturn(Integer.toString(version)).atLeastOnce();
 
         EasyMock.expect(mockDevice.executeShellCommand(EasyMock.eq("rm " + CASE_LIST_FILE_NAME)))
                 .andReturn("").once();
@@ -275,7 +402,6 @@
                 + "--deqp-gl-config-name=rgba8888d24s8\" "
                 + INSTRUMENTATION_NAME;
 
-
         mockDevice.executeShellCommand(EasyMock.eq(command),
                 EasyMock.<IShellOutputReceiver>notNull());
 
@@ -319,6 +445,48 @@
     }
 
     /**
+     * Test OpeGL ES3 tests on device with OpenGL ES2.
+     */
+    public void testRun_require30DeviceVersion20() throws Exception {
+        testGlesVersion(3, 0, 2, 0);
+    }
+
+    /**
+     * Test OpeGL ES3.1 tests on device with OpenGL ES2.
+     */
+    public void testRun_require31DeviceVersion20() throws Exception {
+        testGlesVersion(3, 1, 2, 0);
+    }
+
+    /**
+     * Test OpeGL ES3 tests on device with OpenGL ES3.
+     */
+    public void testRun_require30DeviceVersion30() throws Exception {
+        testGlesVersion(3, 0, 3, 0);
+    }
+
+    /**
+     * Test OpeGL ES3.1 tests on device with OpenGL ES3.
+     */
+    public void testRun_require31DeviceVersion30() throws Exception {
+        testGlesVersion(3, 1, 3, 0);
+    }
+
+    /**
+     * Test OpeGL ES3 tests on device with OpenGL ES3.1.
+     */
+    public void testRun_require30DeviceVersion31() throws Exception {
+        testGlesVersion(3, 0, 3, 1);
+    }
+
+    /**
+     * Test OpeGL ES3.1 tests on device with OpenGL ES3.1.
+     */
+    public void testRun_require31DeviceVersion31() throws Exception {
+        testGlesVersion(3, 1, 3, 1);
+    }
+
+    /**
      * Test dEQP Pass result code.
      */
     public void testRun_resultPass() throws Exception {
diff --git a/tools/utils/buildCts.py b/tools/utils/buildCts.py
index aa5bbf1..f9228d7 100755
--- a/tools/utils/buildCts.py
+++ b/tools/utils/buildCts.py
@@ -169,15 +169,153 @@
       plan.ExcludeTests(package, test_list)
     self.__WritePlan(plan, 'CTS-stable')
 
-    # CTS Flaky plan - inversion of CTS Stable
+    # CTS Flaky plan - list of tests known to be flaky in lab environment
     plan = tools.TestPlan(packages)
     plan.Exclude('.*')
     plan.Include(r'com\.android\.cts\.browserbench')
     for package, test_list in flaky_tests.iteritems():
-      plan.Include(package)
+      plan.Include(package+'$')
       plan.IncludeTests(package, test_list)
     self.__WritePlan(plan, 'CTS-flaky')
 
+    small_tests = BuildAospSmallSizeTestList()
+    medium_tests = BuildAospMediumSizeTestList()
+
+    # CTS - sub plan for public, small size tests
+    plan = tools.TestPlan(packages)
+    plan.Exclude('.*')
+    for package, test_list in small_tests.iteritems():
+      plan.Include(package+'$')
+    for package, test_list in flaky_tests.iteritems():
+      plan.ExcludeTests(package, test_list)
+    self.__WritePlan(plan, 'CTS-kitkat-small')
+
+    # CTS - sub plan for public, medium size tests
+    plan = tools.TestPlan(packages)
+    plan.Exclude('.*')
+    for package, test_list in medium_tests.iteritems():
+      plan.Include(package+'$')
+    for package, test_list in flaky_tests.iteritems():
+      plan.ExcludeTests(package, test_list)
+    self.__WritePlan(plan, 'CTS-kitkat-medium')
+
+    # CTS - sub plan for hardware tests which is public, large
+    plan = tools.TestPlan(packages)
+    plan.Exclude('.*')
+    plan.Include(r'android\.hardware$')
+    for package, test_list in flaky_tests.iteritems():
+      plan.ExcludeTests(package, test_list)
+    self.__WritePlan(plan, 'CTS-hardware')
+
+    # CTS - sub plan for media tests which is public, large
+    plan = tools.TestPlan(packages)
+    plan.Exclude('.*')
+    plan.Include(r'android\.media$')
+    for package, test_list in flaky_tests.iteritems():
+      plan.ExcludeTests(package, test_list)
+    self.__WritePlan(plan, 'CTS-media')
+
+    # CTS - sub plan for mediastress tests which is public, large
+    plan = tools.TestPlan(packages)
+    plan.Exclude('.*')
+    plan.Include(r'android\.mediastress$')
+    for package, test_list in flaky_tests.iteritems():
+      plan.ExcludeTests(package, test_list)
+    self.__WritePlan(plan, 'CTS-mediastress')
+
+    #CTS - sub plan for new test packages added for staging
+    plan = tools.TestPlan(packages)
+    for package, test_list in small_tests.iteritems():
+      plan.Exclude(package+'$')
+    for package, test_list in medium_tests.iteritems():
+      plan.Exclude(package+'$')
+    plan.Exclude(r'android\.hardware$')
+    plan.Exclude(r'android\.media$')
+    plan.Exclude(r'android\.mediastress$')
+    for package, test_list in flaky_tests.iteritems():
+      plan.ExcludeTests(package, test_list)
+    self.__WritePlan(plan, 'CTS-staging')
+
+def BuildAospMediumSizeTestList():
+  """ Construct a defaultdic that lists package names of medium tests
+      already published to aosp. """
+  return {
+      'android.app' : [],
+      'android.core.tests.libcore.package.libcore' : [],
+      'android.core.tests.libcore.package.org' : [],
+      'android.core.vm-tests-tf' : [],
+      'android.dpi' : [],
+      'android.host.security' : [],
+      'android.net' : [],
+      'android.os' : [],
+      'android.security' : [],
+      'android.telephony' : [],
+      'android.webkit' : [],
+      'android.widget' : [],
+      'com.android.cts.browserbench' : []}
+
+def BuildAospSmallSizeTestList():
+  """ Construct a defaultdict that lists packages names of small tests
+      already published to aosp. """
+  return {
+      'android.aadb' : [],
+      'android.acceleration' : [],
+      'android.accessibility' : [],
+      'android.accessibilityservice' : [],
+      'android.accounts' : [],
+      'android.admin' : [],
+      'android.animation' : [],
+      'android.bionic' : [],
+      'android.bluetooth' : [],
+      'android.calendarcommon' : [],
+      'android.content' : [],
+      'android.core.tests.libcore.package.com' : [],
+      'android.core.tests.libcore.package.conscrypt' : [],
+      'android.core.tests.libcore.package.dalvik' : [],
+      'android.core.tests.libcore.package.sun' : [],
+      'android.core.tests.libcore.package.tests' : [],
+      'android.database' : [],
+      'android.dreams' : [],
+      'android.drm' : [],
+      'android.effect' : [],
+      'android.gesture' : [],
+      'android.graphics' : [],
+      'android.graphics2' : [],
+      'android.jni' : [],
+      'android.keystore' : [],
+      'android.location' : [],
+      'android.nativemedia.sl' : [],
+      'android.nativemedia.xa' : [],
+      'android.nativeopengl' : [],
+      'android.ndef' : [],
+      'android.opengl' : [],
+      'android.openglperf' : [],
+      'android.permission' : [],
+      'android.permission2' : [],
+      'android.preference' : [],
+      'android.preference2' : [],
+      'android.provider' : [],
+      'android.renderscript' : [],
+      'android.rscpp' : [],
+      'android.rsg' : [],
+      'android.sax' : [],
+      'android.speech' : [],
+      'android.tests.appsecurity' : [],
+      'android.text' : [],
+      'android.textureview' : [],
+      'android.theme' : [],
+      'android.usb' : [],
+      'android.util' : [],
+      'android.view' : [],
+      'com.android.cts.dram' : [],
+      'com.android.cts.filesystemperf' : [],
+      'com.android.cts.jank' : [],
+      'com.android.cts.opengl' : [],
+      'com.android.cts.simplecpu' : [],
+      'com.android.cts.ui' : [],
+      'com.android.cts.uihost' : [],
+      'com.android.cts.videoperf' : [],
+      'zzz.android.monkey' : []}
 
 def BuildCtsFlakyTestList():
   """ Construct a defaultdict that maps package name to a list of tests