Merge "Removing EGLCleanupTest#TestNoReleaseCurrent from test."
diff --git a/apps/CtsVerifier/AndroidManifest.xml b/apps/CtsVerifier/AndroidManifest.xml
index f026eb1..603f03f 100644
--- a/apps/CtsVerifier/AndroidManifest.xml
+++ b/apps/CtsVerifier/AndroidManifest.xml
@@ -20,8 +20,8 @@
       android:versionCode="1"
       android:versionName="1337">
 
-    <!-- Using 10 for more complete NFC support... -->
-    <uses-sdk android:minSdkVersion="11"></uses-sdk>
+    <!-- Using 10+ for more complete NFC support... -->
+    <uses-sdk android:minSdkVersion="12"></uses-sdk>
 
     <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
     <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
@@ -41,6 +41,8 @@
     <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" />
+    <uses-permission android:name="com.android.alarm.permission.SET_ALARM" />
+
     <uses-feature android:name="android.hardware.usb.accessory" />
 
     <!-- Needed by the Audio Quality Verifier to store the sound samples that will be mailed. -->
@@ -52,7 +54,6 @@
             android:debuggable="true"
             android:largeHeap="true">
 
-        <uses-library android:name="com.android.future.usb.accessory" />
         <meta-data android:name="com.google.android.backup.api_key"
                 android:value="AEdPqrEAAAAIbK6ldcOzoeRtQ1u1dFVJ1A7KetRhit-a1Xa82Q" />
 
@@ -470,7 +471,7 @@
             </intent-filter>
             <meta-data android:name="test_category" android:value="@string/test_category_camera" />
             <meta-data android:name="test_required_features" android:value="android.hardware.sensor.gyroscope" />
-            <meta-data android:name="test_required_features" android:value="android.hardware.camera.any"/>
+            <meta-data android:name="test_required_features" android:value="android.hardware.camera"/>
         </activity>
         <activity
             android:name=".camera.fov.DetermineFovActivity"
@@ -578,6 +579,18 @@
             <meta-data android:name="test_category" android:value="@string/test_category_other" />
         </activity>
 
+        <activity android:name=".deskclock.DeskClockTestsActivity"
+                  android:label="@string/deskclock_tests">
+            <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_deskclock" />
+        </activity>
+
+        <activity android:name=".deskclock.ShowAlarmsTestActivity"
+                  android:label="@string/dc_show_alarms_test"/>
+
         <receiver android:name=".widget.WidgetCtsProvider">
             <intent-filter>
                 <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
diff --git a/apps/CtsVerifier/res/layout/dc_show_alarms.xml b/apps/CtsVerifier/res/layout/dc_show_alarms.xml
new file mode 100644
index 0000000..06a2bb1
--- /dev/null
+++ b/apps/CtsVerifier/res/layout/dc_show_alarms.xml
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+              android:layout_width="match_parent"
+              android:layout_height="match_parent"
+    >
+
+    <LinearLayout android:orientation="vertical"
+                  android:layout_width="match_parent"
+                  android:layout_height="wrap_content"
+                  android:layout_alignParentTop="true"
+                  android:padding="5dp"
+        >
+
+        <TextView android:layout_width="wrap_content"
+                  android:textSize="18sp"
+                  android:layout_height="wrap_content"
+                  android:text="@string/dc_show_alarms_test_info"
+            />
+
+        <Button android:id="@+id/dc_show_alarms"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:text="@string/dc_show_alarms_button"
+            />
+    </LinearLayout>
+
+    <LinearLayout
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:layout_alignParentBottom="true"
+        >
+        <include layout="@layout/pass_fail_buttons" />
+    </LinearLayout>
+</RelativeLayout>
diff --git a/apps/CtsVerifier/res/values/strings.xml b/apps/CtsVerifier/res/values/strings.xml
index f787fda..ff5e78a 100644
--- a/apps/CtsVerifier/res/values/strings.xml
+++ b/apps/CtsVerifier/res/values/strings.xml
@@ -32,6 +32,7 @@
     <string name="test_category_security">Security</string>
     <string name="test_category_streaming">Streaming</string>
     <string name="test_category_features">Features</string>
+    <string name="test_category_deskclock">Desk Clock</string>
     <string name="test_category_other">Other</string>
     <string name="clear">Clear</string>
     <string name="test_results_cleared">Test results cleared.</string>
@@ -662,4 +663,22 @@
     <string name="widget_name">Widget Framework Test</string>
     <string name="widget_pass">Pass</string>
     <string name="widget_fail">Fail</string>
+
+    <!-- Strings for DeskClock -->
+    <string name="deskclock_tests">Desk Clock Tests</string>
+    <string name="deskclock_tests_info">
+        The Desk Clock tests verify that the Desk Clock app implements the Clock API\'s properly.
+    </string>
+    <string name="deskclock_group_alarms">Alarms</string>
+    <string name="deskclock_group_timers">Timers</string>
+
+    <string name="dc_show_alarms_test">Show Alarms Test</string>
+    <string name="dc_show_alarms_test_info">
+        This test verifies that the SHOW_ALARMS API works.\n
+        1. Press the "Show Alarms" button.\n
+        2. Verify that the Desk Clock app is launched and displays the Alarms section\n
+    </string>
+    <string name="dc_show_alarms_button">Show Alarms</string>
+
+
 </resources>
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/deskclock/DeskClockTestsActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/deskclock/DeskClockTestsActivity.java
new file mode 100644
index 0000000..91b9b98
--- /dev/null
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/deskclock/DeskClockTestsActivity.java
@@ -0,0 +1,52 @@
+// Copyright 2013 Google Inc. All Rights Reserved.
+
+package com.android.cts.verifier.deskclock;
+
+import android.content.Intent;
+import android.database.DataSetObserver;
+import android.os.Bundle;
+
+import com.android.cts.verifier.ArrayTestListAdapter;
+import com.android.cts.verifier.PassFailButtons;
+import com.android.cts.verifier.R;
+import com.android.cts.verifier.TestListAdapter.TestListItem;
+
+/**
+ * Activity that lists all the DeskClock tests.
+ */
+public class DeskClockTestsActivity extends PassFailButtons.TestListActivity {
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.pass_fail_list);
+        setInfoResources(R.string.deskclock_tests, R.string.deskclock_tests_info, 0);
+        setPassFailButtonClickListeners();
+
+        getPassButton().setEnabled(false);
+
+        final ArrayTestListAdapter adapter = new ArrayTestListAdapter(this);
+
+        adapter.add(TestListItem.newCategory(this, R.string.deskclock_group_alarms));
+        adapter.add(TestListItem.newTest(this,
+                R.string.dc_show_alarms_test,
+                ShowAlarmsTestActivity.class.getName(),
+                new Intent(this, ShowAlarmsTestActivity.class), null));
+
+        adapter.registerDataSetObserver(new DataSetObserver() {
+            @Override
+            public void onChanged() {
+                updatePassButton();
+            }
+        });
+
+        setTestListAdapter(adapter);
+    }
+
+    /**
+     * Enable Pass Button when the all tests passed.
+     */
+    private void updatePassButton() {
+        getPassButton().setEnabled(mAdapter.allTestsPassed());
+    }
+}
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/deskclock/ShowAlarmsTestActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/deskclock/ShowAlarmsTestActivity.java
new file mode 100644
index 0000000..0ce8f51
--- /dev/null
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/deskclock/ShowAlarmsTestActivity.java
@@ -0,0 +1,37 @@
+// Copyright 2013 Google Inc. All Rights Reserved.
+
+package com.android.cts.verifier.deskclock;
+
+import android.content.Intent;
+import android.os.Bundle;
+import android.provider.AlarmClock;
+import android.view.View;
+import android.view.View.OnClickListener;
+
+import com.android.cts.verifier.PassFailButtons;
+import com.android.cts.verifier.R;
+
+public class ShowAlarmsTestActivity extends PassFailButtons.Activity implements OnClickListener {
+
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.dc_show_alarms);
+        setPassFailButtonClickListeners();
+
+        final View button = findViewById(R.id.dc_show_alarms);
+        button.setOnClickListener(this);
+    }
+
+    @Override
+    protected void onResume() {
+        super.onResume();
+        setResult(RESULT_CANCELED);
+    }
+
+    @Override
+    public void onClick(View v) {
+        startActivity(new Intent(AlarmClock.ACTION_SHOW_ALARMS));
+    }
+}
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/features/FeatureSummaryActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/features/FeatureSummaryActivity.java
index 46963a0..1a68b48 100644
--- a/apps/CtsVerifier/src/com/android/cts/verifier/features/FeatureSummaryActivity.java
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/features/FeatureSummaryActivity.java
@@ -154,7 +154,7 @@
 
     public static final Feature[] ALL_HONEYCOMB_MR1_FEATURES = {
             new Feature("android.hardware.usb.host", false),
-            new Feature("android.hardware.usb.accessory", true),
+            new Feature("android.hardware.usb.accessory", false),
     };
 
     public static final Feature[] ALL_HONEYCOMB_MR2_FEATURES = {
diff --git a/tests/plans/CTS-flaky.xml b/tests/plans/CTS-flaky.xml
new file mode 100644
index 0000000..1c2c30d
--- /dev/null
+++ b/tests/plans/CTS-flaky.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<TestPlan version="1.0">
+  <Entry uri="android.app" exclude="android.app.backup.cts.BackupAgentHelperTest#testAndroidtestCaseSetupProperly;android.app.backup.cts.BackupAgentHelperTest#testBackupAGentHelper;android.app.backup.cts.BackupAgentTest#testAndroidTestCaseSetupProperly;android.app.backup.cts.BackupAgentTest#testBackupAgent;android.app.backup.cts.BackupManagerTest#testAndroidTestCaseSetupProperly;android.app.backup.cts.BackupManagerTest#testBackupManager;android.app.backup"/>
+  <Entry uri="android.hardware"/>
+  <Entry uri="android.media"/>
+  <Entry uri="android.net"/>
+  <Entry uri="android.provider"/>
+</TestPlan>
diff --git a/tests/plans/CTS-stable.xml b/tests/plans/CTS-stable.xml
new file mode 100644
index 0000000..984d709
--- /dev/null
+++ b/tests/plans/CTS-stable.xml
@@ -0,0 +1,68 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<TestPlan version="1.0">
+  <Entry uri="android.aadb"/>
+  <Entry uri="android.acceleration"/>
+  <Entry uri="android.accessibility"/>
+  <Entry uri="android.accessibilityservice"/>
+  <Entry uri="android.accounts"/>
+  <Entry uri="android.admin"/>
+  <Entry uri="android.animation"/>
+  <Entry uri="android.app" exclude="android.app.cts.AlertDialogTest#testAlertDialogCancelable;android.app.cts.AlertDialogTest#testCallback"/>
+  <Entry uri="android.bluetooth"/>
+  <Entry uri="android.calendarcommon"/>
+  <Entry uri="android.content"/>
+  <Entry uri="android.core.tests.libcore.package.com"/>
+  <Entry uri="android.core.tests.libcore.package.dalvik"/>
+  <Entry uri="android.core.tests.libcore.package.libcore"/>
+  <Entry uri="android.core.tests.libcore.package.org"/>
+  <Entry uri="android.core.tests.libcore.package.sun"/>
+  <Entry uri="android.core.tests.libcore.package.tests"/>
+  <Entry uri="android.core.vm-tests-tf"/>
+  <Entry uri="android.database"/>
+  <Entry uri="android.display"/>
+  <Entry uri="android.dpi"/>
+  <Entry uri="android.dpi2"/>
+  <Entry uri="android.dreams"/>
+  <Entry uri="android.drm"/>
+  <Entry uri="android.effect"/>
+  <Entry uri="android.example"/>
+  <Entry uri="android.gesture"/>
+  <Entry uri="android.graphics"/>
+  <Entry uri="android.graphics2"/>
+  <Entry uri="android.hardware" exclude="android.hardware.cts.CameraTest#testCancelAutofocus"/>
+  <Entry uri="android.holo"/>
+  <Entry uri="android.jni"/>
+  <Entry uri="android.keystore"/>
+  <Entry uri="android.location"/>
+  <Entry uri="android.media" exclude="android.media.cts.DecodeEditEncodeTest#testVideoEditQCIF"/>
+  <Entry uri="android.mediastress"/>
+  <Entry uri="android.nativemedia.sl"/>
+  <Entry uri="android.nativemedia.xa"/>
+  <Entry uri="android.nativeopengl"/>
+  <Entry uri="android.ndef"/>
+  <Entry uri="android.net" exclude="android.net.cts.SSLCertificateSocketFactoryTest#testCreateSocket;android.net.cts.trafficStatsTest#testTrafficStatsForLocalhost;android.net.wifi.cts.ScanResultTest#testScanResultTimeStamp"/>
+  <Entry uri="android.opengl"/>
+  <Entry uri="android.openglperf"/>
+  <Entry uri="android.os"/>
+  <Entry uri="android.permission"/>
+  <Entry uri="android.permission2"/>
+  <Entry uri="android.preference"/>
+  <Entry uri="android.preference2"/>
+  <Entry uri="android.provider" exclude="android.provider.cts.MediaStore_Images_MediaTest#testInsertImageWithBitmap;android.provider.cts.MediaStore_Images_MediaTes#testInsertImageWithImagePath;android.provider.cts.MediaStore_Images_ThumbnailsTest#testQueryExternalMiniThumbnails"/>
+  <Entry uri="android.renderscript"/>
+  <Entry uri="android.sax"/>
+  <Entry uri="android.security"/>
+  <Entry uri="android.speech"/>
+  <Entry uri="android.telephony"/>
+  <Entry uri="android.tests.appsecurity"/>
+  <Entry uri="android.tests.sigtest"/>
+  <Entry uri="android.text"/>
+  <Entry uri="android.textureview"/>
+  <Entry uri="android.theme"/>
+  <Entry uri="android.uiautomator"/>
+  <Entry uri="android.util"/>
+  <Entry uri="android.view"/>
+  <Entry uri="android.webkit"/>
+  <Entry uri="android.widget"/>
+  <Entry uri="zzz.android.monkey"/>
+</TestPlan>
diff --git a/tests/tests/content/src/android/content/cts/AvailableIntentsTest.java b/tests/tests/content/src/android/content/cts/AvailableIntentsTest.java
index a06b603..87d9039 100644
--- a/tests/tests/content/src/android/content/cts/AvailableIntentsTest.java
+++ b/tests/tests/content/src/android/content/cts/AvailableIntentsTest.java
@@ -16,11 +16,13 @@
 
 package android.content.cts;
 
+import android.app.DownloadManager;
 import android.app.SearchManager;
 import android.content.ContentUris;
 import android.content.Intent;
 import android.content.pm.PackageManager;
 import android.content.pm.ResolveInfo;
+import android.media.RingtoneManager;
 import android.net.Uri;
 import android.provider.AlarmClock;
 import android.provider.MediaStore;
@@ -197,4 +199,33 @@
         intent.putExtra(AlarmClock.EXTRA_MINUTES, 0);
         assertCanBeHandled(intent);
     }
+
+    public void testOpenDocumentAny() {
+        Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
+        intent.addCategory(Intent.CATEGORY_OPENABLE);
+        intent.setType("*/*");
+        assertCanBeHandled(intent);
+    }
+
+    public void testOpenDocumentImage() {
+        Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
+        intent.addCategory(Intent.CATEGORY_OPENABLE);
+        intent.setType("image/*");
+        assertCanBeHandled(intent);
+    }
+
+    public void testCreateDocument() {
+        Intent intent = new Intent(Intent.ACTION_CREATE_DOCUMENT);
+        intent.addCategory(Intent.CATEGORY_OPENABLE);
+        intent.setType("text/plain");
+        assertCanBeHandled(intent);
+    }
+
+    public void testRingtonePicker() {
+        assertCanBeHandled(new Intent(RingtoneManager.ACTION_RINGTONE_PICKER));
+    }
+
+    public void testViewDownloads() {
+        assertCanBeHandled(new Intent(DownloadManager.ACTION_VIEW_DOWNLOADS));
+    }
 }
diff --git a/tests/tests/hardware/src/android/hardware/camera2/cts/CameraCharacteristicsTest.java b/tests/tests/hardware/src/android/hardware/camera2/cts/CameraCharacteristicsTest.java
index 4745100..1a07a39 100644
--- a/tests/tests/hardware/src/android/hardware/camera2/cts/CameraCharacteristicsTest.java
+++ b/tests/tests/hardware/src/android/hardware/camera2/cts/CameraCharacteristicsTest.java
@@ -27,13 +27,18 @@
 import android.content.Context;
 import android.hardware.camera2.CameraCharacteristics;
 import android.hardware.camera2.CameraManager;
+import android.hardware.camera2.CameraMetadata.Key;
 import android.test.AndroidTestCase;
+import android.util.Log;
+
+import java.util.List;
 
 /**
  * Auto-generated CTS test for CameraCharacteristics fields.
  */
 public class CameraCharacteristicsTest extends AndroidTestCase {
     private CameraManager mCameraManager;
+    private static final String TAG = "CameraCharacteristicsTest";
 
     @Override
     public void setContext(Context context) {
@@ -60,6 +65,12 @@
                                         props);
             assertNotNull("Invalid property: android.control.aeAvailableAntibandingModes",
                     props.get(CameraCharacteristics.CONTROL_AE_AVAILABLE_ANTIBANDING_MODES));
+
+            List<Key<?>> allKeys = props.getKeys();
+            assertNotNull(String.format("Can't get camera characteristics keys from: ID %s", ids[i],
+                                        props));
+            assertTrue("Key not in keys list: android.control.aeAvailableAntibandingModes",
+                    allKeys.contains(CameraCharacteristics.CONTROL_AE_AVAILABLE_ANTIBANDING_MODES));
         }
     }
 
@@ -71,6 +82,12 @@
                                         props);
             assertNotNull("Invalid property: android.control.aeAvailableTargetFpsRanges",
                     props.get(CameraCharacteristics.CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES));
+
+            List<Key<?>> allKeys = props.getKeys();
+            assertNotNull(String.format("Can't get camera characteristics keys from: ID %s", ids[i],
+                                        props));
+            assertTrue("Key not in keys list: android.control.aeAvailableTargetFpsRanges",
+                    allKeys.contains(CameraCharacteristics.CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES));
         }
     }
 
@@ -82,6 +99,12 @@
                                         props);
             assertNotNull("Invalid property: android.control.aeCompensationRange",
                     props.get(CameraCharacteristics.CONTROL_AE_COMPENSATION_RANGE));
+
+            List<Key<?>> allKeys = props.getKeys();
+            assertNotNull(String.format("Can't get camera characteristics keys from: ID %s", ids[i],
+                                        props));
+            assertTrue("Key not in keys list: android.control.aeCompensationRange",
+                    allKeys.contains(CameraCharacteristics.CONTROL_AE_COMPENSATION_RANGE));
         }
     }
 
@@ -93,6 +116,12 @@
                                         props);
             assertNotNull("Invalid property: android.control.aeCompensationStep",
                     props.get(CameraCharacteristics.CONTROL_AE_COMPENSATION_STEP));
+
+            List<Key<?>> allKeys = props.getKeys();
+            assertNotNull(String.format("Can't get camera characteristics keys from: ID %s", ids[i],
+                                        props));
+            assertTrue("Key not in keys list: android.control.aeCompensationStep",
+                    allKeys.contains(CameraCharacteristics.CONTROL_AE_COMPENSATION_STEP));
         }
     }
 
@@ -104,6 +133,12 @@
                                         props);
             assertNotNull("Invalid property: android.control.afAvailableModes",
                     props.get(CameraCharacteristics.CONTROL_AF_AVAILABLE_MODES));
+
+            List<Key<?>> allKeys = props.getKeys();
+            assertNotNull(String.format("Can't get camera characteristics keys from: ID %s", ids[i],
+                                        props));
+            assertTrue("Key not in keys list: android.control.afAvailableModes",
+                    allKeys.contains(CameraCharacteristics.CONTROL_AF_AVAILABLE_MODES));
         }
     }
 
@@ -115,6 +150,12 @@
                                         props);
             assertNotNull("Invalid property: android.control.availableEffects",
                     props.get(CameraCharacteristics.CONTROL_AVAILABLE_EFFECTS));
+
+            List<Key<?>> allKeys = props.getKeys();
+            assertNotNull(String.format("Can't get camera characteristics keys from: ID %s", ids[i],
+                                        props));
+            assertTrue("Key not in keys list: android.control.availableEffects",
+                    allKeys.contains(CameraCharacteristics.CONTROL_AVAILABLE_EFFECTS));
         }
     }
 
@@ -126,6 +167,12 @@
                                         props);
             assertNotNull("Invalid property: android.control.availableSceneModes",
                     props.get(CameraCharacteristics.CONTROL_AVAILABLE_SCENE_MODES));
+
+            List<Key<?>> allKeys = props.getKeys();
+            assertNotNull(String.format("Can't get camera characteristics keys from: ID %s", ids[i],
+                                        props));
+            assertTrue("Key not in keys list: android.control.availableSceneModes",
+                    allKeys.contains(CameraCharacteristics.CONTROL_AVAILABLE_SCENE_MODES));
         }
     }
 
@@ -137,6 +184,12 @@
                                         props);
             assertNotNull("Invalid property: android.control.availableVideoStabilizationModes",
                     props.get(CameraCharacteristics.CONTROL_AVAILABLE_VIDEO_STABILIZATION_MODES));
+
+            List<Key<?>> allKeys = props.getKeys();
+            assertNotNull(String.format("Can't get camera characteristics keys from: ID %s", ids[i],
+                                        props));
+            assertTrue("Key not in keys list: android.control.availableVideoStabilizationModes",
+                    allKeys.contains(CameraCharacteristics.CONTROL_AVAILABLE_VIDEO_STABILIZATION_MODES));
         }
     }
 
@@ -148,6 +201,12 @@
                                         props);
             assertNotNull("Invalid property: android.control.awbAvailableModes",
                     props.get(CameraCharacteristics.CONTROL_AWB_AVAILABLE_MODES));
+
+            List<Key<?>> allKeys = props.getKeys();
+            assertNotNull(String.format("Can't get camera characteristics keys from: ID %s", ids[i],
+                                        props));
+            assertTrue("Key not in keys list: android.control.awbAvailableModes",
+                    allKeys.contains(CameraCharacteristics.CONTROL_AWB_AVAILABLE_MODES));
         }
     }
 
@@ -159,6 +218,12 @@
                                         props);
             assertNotNull("Invalid property: android.control.maxRegions",
                     props.get(CameraCharacteristics.CONTROL_MAX_REGIONS));
+
+            List<Key<?>> allKeys = props.getKeys();
+            assertNotNull(String.format("Can't get camera characteristics keys from: ID %s", ids[i],
+                                        props));
+            assertTrue("Key not in keys list: android.control.maxRegions",
+                    allKeys.contains(CameraCharacteristics.CONTROL_MAX_REGIONS));
         }
     }
 
@@ -170,6 +235,12 @@
                                         props);
             assertNotNull("Invalid property: android.flash.info.available",
                     props.get(CameraCharacteristics.FLASH_INFO_AVAILABLE));
+
+            List<Key<?>> allKeys = props.getKeys();
+            assertNotNull(String.format("Can't get camera characteristics keys from: ID %s", ids[i],
+                                        props));
+            assertTrue("Key not in keys list: android.flash.info.available",
+                    allKeys.contains(CameraCharacteristics.FLASH_INFO_AVAILABLE));
         }
     }
 
@@ -181,6 +252,12 @@
                                         props);
             assertNotNull("Invalid property: android.jpeg.availableThumbnailSizes",
                     props.get(CameraCharacteristics.JPEG_AVAILABLE_THUMBNAIL_SIZES));
+
+            List<Key<?>> allKeys = props.getKeys();
+            assertNotNull(String.format("Can't get camera characteristics keys from: ID %s", ids[i],
+                                        props));
+            assertTrue("Key not in keys list: android.jpeg.availableThumbnailSizes",
+                    allKeys.contains(CameraCharacteristics.JPEG_AVAILABLE_THUMBNAIL_SIZES));
         }
     }
 
@@ -192,6 +269,12 @@
                                         props);
             assertNotNull("Invalid property: android.lens.facing",
                     props.get(CameraCharacteristics.LENS_FACING));
+
+            List<Key<?>> allKeys = props.getKeys();
+            assertNotNull(String.format("Can't get camera characteristics keys from: ID %s", ids[i],
+                                        props));
+            assertTrue("Key not in keys list: android.lens.facing",
+                    allKeys.contains(CameraCharacteristics.LENS_FACING));
         }
     }
 
@@ -203,6 +286,12 @@
                                         props);
             assertNotNull("Invalid property: android.lens.info.availableApertures",
                     props.get(CameraCharacteristics.LENS_INFO_AVAILABLE_APERTURES));
+
+            List<Key<?>> allKeys = props.getKeys();
+            assertNotNull(String.format("Can't get camera characteristics keys from: ID %s", ids[i],
+                                        props));
+            assertTrue("Key not in keys list: android.lens.info.availableApertures",
+                    allKeys.contains(CameraCharacteristics.LENS_INFO_AVAILABLE_APERTURES));
         }
     }
 
@@ -214,6 +303,12 @@
                                         props);
             assertNotNull("Invalid property: android.lens.info.availableFilterDensities",
                     props.get(CameraCharacteristics.LENS_INFO_AVAILABLE_FILTER_DENSITIES));
+
+            List<Key<?>> allKeys = props.getKeys();
+            assertNotNull(String.format("Can't get camera characteristics keys from: ID %s", ids[i],
+                                        props));
+            assertTrue("Key not in keys list: android.lens.info.availableFilterDensities",
+                    allKeys.contains(CameraCharacteristics.LENS_INFO_AVAILABLE_FILTER_DENSITIES));
         }
     }
 
@@ -225,6 +320,12 @@
                                         props);
             assertNotNull("Invalid property: android.lens.info.availableFocalLengths",
                     props.get(CameraCharacteristics.LENS_INFO_AVAILABLE_FOCAL_LENGTHS));
+
+            List<Key<?>> allKeys = props.getKeys();
+            assertNotNull(String.format("Can't get camera characteristics keys from: ID %s", ids[i],
+                                        props));
+            assertTrue("Key not in keys list: android.lens.info.availableFocalLengths",
+                    allKeys.contains(CameraCharacteristics.LENS_INFO_AVAILABLE_FOCAL_LENGTHS));
         }
     }
 
@@ -236,6 +337,12 @@
                                         props);
             assertNotNull("Invalid property: android.lens.info.availableOpticalStabilization",
                     props.get(CameraCharacteristics.LENS_INFO_AVAILABLE_OPTICAL_STABILIZATION));
+
+            List<Key<?>> allKeys = props.getKeys();
+            assertNotNull(String.format("Can't get camera characteristics keys from: ID %s", ids[i],
+                                        props));
+            assertTrue("Key not in keys list: android.lens.info.availableOpticalStabilization",
+                    allKeys.contains(CameraCharacteristics.LENS_INFO_AVAILABLE_OPTICAL_STABILIZATION));
         }
     }
 
@@ -247,6 +354,12 @@
                                         props);
             assertNotNull("Invalid property: android.lens.info.hyperfocalDistance",
                     props.get(CameraCharacteristics.LENS_INFO_HYPERFOCAL_DISTANCE));
+
+            List<Key<?>> allKeys = props.getKeys();
+            assertNotNull(String.format("Can't get camera characteristics keys from: ID %s", ids[i],
+                                        props));
+            assertTrue("Key not in keys list: android.lens.info.hyperfocalDistance",
+                    allKeys.contains(CameraCharacteristics.LENS_INFO_HYPERFOCAL_DISTANCE));
         }
     }
 
@@ -258,6 +371,12 @@
                                         props);
             assertNotNull("Invalid property: android.lens.info.minimumFocusDistance",
                     props.get(CameraCharacteristics.LENS_INFO_MINIMUM_FOCUS_DISTANCE));
+
+            List<Key<?>> allKeys = props.getKeys();
+            assertNotNull(String.format("Can't get camera characteristics keys from: ID %s", ids[i],
+                                        props));
+            assertTrue("Key not in keys list: android.lens.info.minimumFocusDistance",
+                    allKeys.contains(CameraCharacteristics.LENS_INFO_MINIMUM_FOCUS_DISTANCE));
         }
     }
 
@@ -269,6 +388,12 @@
                                         props);
             assertNotNull("Invalid property: android.lens.info.shadingMapSize",
                     props.get(CameraCharacteristics.LENS_INFO_SHADING_MAP_SIZE));
+
+            List<Key<?>> allKeys = props.getKeys();
+            assertNotNull(String.format("Can't get camera characteristics keys from: ID %s", ids[i],
+                                        props));
+            assertTrue("Key not in keys list: android.lens.info.shadingMapSize",
+                    allKeys.contains(CameraCharacteristics.LENS_INFO_SHADING_MAP_SIZE));
         }
     }
 
@@ -280,6 +405,12 @@
                                         props);
             assertNotNull("Invalid property: android.request.maxNumOutputStreams",
                     props.get(CameraCharacteristics.REQUEST_MAX_NUM_OUTPUT_STREAMS));
+
+            List<Key<?>> allKeys = props.getKeys();
+            assertNotNull(String.format("Can't get camera characteristics keys from: ID %s", ids[i],
+                                        props));
+            assertTrue("Key not in keys list: android.request.maxNumOutputStreams",
+                    allKeys.contains(CameraCharacteristics.REQUEST_MAX_NUM_OUTPUT_STREAMS));
         }
     }
 
@@ -291,6 +422,12 @@
                                         props);
             assertNotNull("Invalid property: android.scaler.availableFormats",
                     props.get(CameraCharacteristics.SCALER_AVAILABLE_FORMATS));
+
+            List<Key<?>> allKeys = props.getKeys();
+            assertNotNull(String.format("Can't get camera characteristics keys from: ID %s", ids[i],
+                                        props));
+            assertTrue("Key not in keys list: android.scaler.availableFormats",
+                    allKeys.contains(CameraCharacteristics.SCALER_AVAILABLE_FORMATS));
         }
     }
 
@@ -302,6 +439,12 @@
                                         props);
             assertNotNull("Invalid property: android.scaler.availableJpegMinDurations",
                     props.get(CameraCharacteristics.SCALER_AVAILABLE_JPEG_MIN_DURATIONS));
+
+            List<Key<?>> allKeys = props.getKeys();
+            assertNotNull(String.format("Can't get camera characteristics keys from: ID %s", ids[i],
+                                        props));
+            assertTrue("Key not in keys list: android.scaler.availableJpegMinDurations",
+                    allKeys.contains(CameraCharacteristics.SCALER_AVAILABLE_JPEG_MIN_DURATIONS));
         }
     }
 
@@ -313,6 +456,12 @@
                                         props);
             assertNotNull("Invalid property: android.scaler.availableJpegSizes",
                     props.get(CameraCharacteristics.SCALER_AVAILABLE_JPEG_SIZES));
+
+            List<Key<?>> allKeys = props.getKeys();
+            assertNotNull(String.format("Can't get camera characteristics keys from: ID %s", ids[i],
+                                        props));
+            assertTrue("Key not in keys list: android.scaler.availableJpegSizes",
+                    allKeys.contains(CameraCharacteristics.SCALER_AVAILABLE_JPEG_SIZES));
         }
     }
 
@@ -324,6 +473,12 @@
                                         props);
             assertNotNull("Invalid property: android.scaler.availableMaxDigitalZoom",
                     props.get(CameraCharacteristics.SCALER_AVAILABLE_MAX_DIGITAL_ZOOM));
+
+            List<Key<?>> allKeys = props.getKeys();
+            assertNotNull(String.format("Can't get camera characteristics keys from: ID %s", ids[i],
+                                        props));
+            assertTrue("Key not in keys list: android.scaler.availableMaxDigitalZoom",
+                    allKeys.contains(CameraCharacteristics.SCALER_AVAILABLE_MAX_DIGITAL_ZOOM));
         }
     }
 
@@ -335,6 +490,12 @@
                                         props);
             assertNotNull("Invalid property: android.scaler.availableProcessedMinDurations",
                     props.get(CameraCharacteristics.SCALER_AVAILABLE_PROCESSED_MIN_DURATIONS));
+
+            List<Key<?>> allKeys = props.getKeys();
+            assertNotNull(String.format("Can't get camera characteristics keys from: ID %s", ids[i],
+                                        props));
+            assertTrue("Key not in keys list: android.scaler.availableProcessedMinDurations",
+                    allKeys.contains(CameraCharacteristics.SCALER_AVAILABLE_PROCESSED_MIN_DURATIONS));
         }
     }
 
@@ -346,6 +507,12 @@
                                         props);
             assertNotNull("Invalid property: android.scaler.availableProcessedSizes",
                     props.get(CameraCharacteristics.SCALER_AVAILABLE_PROCESSED_SIZES));
+
+            List<Key<?>> allKeys = props.getKeys();
+            assertNotNull(String.format("Can't get camera characteristics keys from: ID %s", ids[i],
+                                        props));
+            assertTrue("Key not in keys list: android.scaler.availableProcessedSizes",
+                    allKeys.contains(CameraCharacteristics.SCALER_AVAILABLE_PROCESSED_SIZES));
         }
     }
 
@@ -357,6 +524,12 @@
                                         props);
             assertNotNull("Invalid property: android.sensor.baseGainFactor",
                     props.get(CameraCharacteristics.SENSOR_BASE_GAIN_FACTOR));
+
+            List<Key<?>> allKeys = props.getKeys();
+            assertNotNull(String.format("Can't get camera characteristics keys from: ID %s", ids[i],
+                                        props));
+            assertTrue("Key not in keys list: android.sensor.baseGainFactor",
+                    allKeys.contains(CameraCharacteristics.SENSOR_BASE_GAIN_FACTOR));
         }
     }
 
@@ -368,6 +541,12 @@
                                         props);
             assertNotNull("Invalid property: android.sensor.maxAnalogSensitivity",
                     props.get(CameraCharacteristics.SENSOR_MAX_ANALOG_SENSITIVITY));
+
+            List<Key<?>> allKeys = props.getKeys();
+            assertNotNull(String.format("Can't get camera characteristics keys from: ID %s", ids[i],
+                                        props));
+            assertTrue("Key not in keys list: android.sensor.maxAnalogSensitivity",
+                    allKeys.contains(CameraCharacteristics.SENSOR_MAX_ANALOG_SENSITIVITY));
         }
     }
 
@@ -379,6 +558,12 @@
                                         props);
             assertNotNull("Invalid property: android.sensor.orientation",
                     props.get(CameraCharacteristics.SENSOR_ORIENTATION));
+
+            List<Key<?>> allKeys = props.getKeys();
+            assertNotNull(String.format("Can't get camera characteristics keys from: ID %s", ids[i],
+                                        props));
+            assertTrue("Key not in keys list: android.sensor.orientation",
+                    allKeys.contains(CameraCharacteristics.SENSOR_ORIENTATION));
         }
     }
 
@@ -390,6 +575,12 @@
                                         props);
             assertNotNull("Invalid property: android.sensor.info.activeArraySize",
                     props.get(CameraCharacteristics.SENSOR_INFO_ACTIVE_ARRAY_SIZE));
+
+            List<Key<?>> allKeys = props.getKeys();
+            assertNotNull(String.format("Can't get camera characteristics keys from: ID %s", ids[i],
+                                        props));
+            assertTrue("Key not in keys list: android.sensor.info.activeArraySize",
+                    allKeys.contains(CameraCharacteristics.SENSOR_INFO_ACTIVE_ARRAY_SIZE));
         }
     }
 
@@ -401,6 +592,12 @@
                                         props);
             assertNotNull("Invalid property: android.sensor.info.sensitivityRange",
                     props.get(CameraCharacteristics.SENSOR_INFO_SENSITIVITY_RANGE));
+
+            List<Key<?>> allKeys = props.getKeys();
+            assertNotNull(String.format("Can't get camera characteristics keys from: ID %s", ids[i],
+                                        props));
+            assertTrue("Key not in keys list: android.sensor.info.sensitivityRange",
+                    allKeys.contains(CameraCharacteristics.SENSOR_INFO_SENSITIVITY_RANGE));
         }
     }
 
@@ -412,6 +609,12 @@
                                         props);
             assertNotNull("Invalid property: android.sensor.info.exposureTimeRange",
                     props.get(CameraCharacteristics.SENSOR_INFO_EXPOSURE_TIME_RANGE));
+
+            List<Key<?>> allKeys = props.getKeys();
+            assertNotNull(String.format("Can't get camera characteristics keys from: ID %s", ids[i],
+                                        props));
+            assertTrue("Key not in keys list: android.sensor.info.exposureTimeRange",
+                    allKeys.contains(CameraCharacteristics.SENSOR_INFO_EXPOSURE_TIME_RANGE));
         }
     }
 
@@ -423,6 +626,12 @@
                                         props);
             assertNotNull("Invalid property: android.sensor.info.maxFrameDuration",
                     props.get(CameraCharacteristics.SENSOR_INFO_MAX_FRAME_DURATION));
+
+            List<Key<?>> allKeys = props.getKeys();
+            assertNotNull(String.format("Can't get camera characteristics keys from: ID %s", ids[i],
+                                        props));
+            assertTrue("Key not in keys list: android.sensor.info.maxFrameDuration",
+                    allKeys.contains(CameraCharacteristics.SENSOR_INFO_MAX_FRAME_DURATION));
         }
     }
 
@@ -434,6 +643,12 @@
                                         props);
             assertNotNull("Invalid property: android.sensor.info.physicalSize",
                     props.get(CameraCharacteristics.SENSOR_INFO_PHYSICAL_SIZE));
+
+            List<Key<?>> allKeys = props.getKeys();
+            assertNotNull(String.format("Can't get camera characteristics keys from: ID %s", ids[i],
+                                        props));
+            assertTrue("Key not in keys list: android.sensor.info.physicalSize",
+                    allKeys.contains(CameraCharacteristics.SENSOR_INFO_PHYSICAL_SIZE));
         }
     }
 
@@ -445,6 +660,12 @@
                                         props);
             assertNotNull("Invalid property: android.statistics.info.availableFaceDetectModes",
                     props.get(CameraCharacteristics.STATISTICS_INFO_AVAILABLE_FACE_DETECT_MODES));
+
+            List<Key<?>> allKeys = props.getKeys();
+            assertNotNull(String.format("Can't get camera characteristics keys from: ID %s", ids[i],
+                                        props));
+            assertTrue("Key not in keys list: android.statistics.info.availableFaceDetectModes",
+                    allKeys.contains(CameraCharacteristics.STATISTICS_INFO_AVAILABLE_FACE_DETECT_MODES));
         }
     }
 
@@ -456,6 +677,12 @@
                                         props);
             assertNotNull("Invalid property: android.statistics.info.maxFaceCount",
                     props.get(CameraCharacteristics.STATISTICS_INFO_MAX_FACE_COUNT));
+
+            List<Key<?>> allKeys = props.getKeys();
+            assertNotNull(String.format("Can't get camera characteristics keys from: ID %s", ids[i],
+                                        props));
+            assertTrue("Key not in keys list: android.statistics.info.maxFaceCount",
+                    allKeys.contains(CameraCharacteristics.STATISTICS_INFO_MAX_FACE_COUNT));
         }
     }
 
@@ -467,6 +694,12 @@
                                         props);
             assertNotNull("Invalid property: android.tonemap.maxCurvePoints",
                     props.get(CameraCharacteristics.TONEMAP_MAX_CURVE_POINTS));
+
+            List<Key<?>> allKeys = props.getKeys();
+            assertNotNull(String.format("Can't get camera characteristics keys from: ID %s", ids[i],
+                                        props));
+            assertTrue("Key not in keys list: android.tonemap.maxCurvePoints",
+                    allKeys.contains(CameraCharacteristics.TONEMAP_MAX_CURVE_POINTS));
         }
     }
 
@@ -478,6 +711,12 @@
                                         props);
             assertNotNull("Invalid property: android.info.supportedHardwareLevel",
                     props.get(CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL));
+
+            List<Key<?>> allKeys = props.getKeys();
+            assertNotNull(String.format("Can't get camera characteristics keys from: ID %s", ids[i],
+                                        props));
+            assertTrue("Key not in keys list: android.info.supportedHardwareLevel",
+                    allKeys.contains(CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL));
         }
     }
 }
diff --git a/tests/tests/hardware/src/android/hardware/camera2/cts/CameraManagerTest.java b/tests/tests/hardware/src/android/hardware/camera2/cts/CameraManagerTest.java
index 2968a47f..7091cac 100644
--- a/tests/tests/hardware/src/android/hardware/camera2/cts/CameraManagerTest.java
+++ b/tests/tests/hardware/src/android/hardware/camera2/cts/CameraManagerTest.java
@@ -75,19 +75,33 @@
         String[] ids = mCameraManager.getCameraIdList();
         if (VERBOSE) Log.v(TAG, "CameraManager ids: " + Arrays.toString(ids));
 
-        // Test: that if the device has a camera, there must be at least one reported id.
-        assertTrue("At least one camera must be detected",
-               ! mPackageManager.hasSystemFeature(PackageManager.FEATURE_CAMERA_ANY)
-            || ids.length >= 1);
+        /**
+         * Test: that if there is at least one reported id, then the system must have
+         * the FEATURE_CAMERA_ANY feature.
+         */
+        assertTrue("System camera feature and camera id list don't match",
+                ids.length == 0 ||
+                mPackageManager.hasSystemFeature(PackageManager.FEATURE_CAMERA_ANY));
 
         /**
-         * Test: that if the device has both front and rear facing cameras, then there
-         * must be at lest two reported ids.
+         * Test: that if the device has front or rear facing cameras, then there
+         * must be matched system features.
          */
-        assertTrue("At least two cameras must be detected",
-               ! mPackageManager.hasSystemFeature(PackageManager.FEATURE_CAMERA)
-            || ! mPackageManager.hasSystemFeature(PackageManager.FEATURE_CAMERA_FRONT)
-            || ids.length >= 2);
+        for (int i = 0; i < ids.length; i++) {
+            CameraCharacteristics props = mCameraManager.getCameraCharacteristics(ids[i]);
+            assertNotNull("Can't get camera characteristics for camera " + ids[i], props);
+            Integer lensFacing = props.get(CameraCharacteristics.LENS_FACING);
+            assertNotNull("Can't get lens facing info", lensFacing);
+            if (lensFacing == CameraCharacteristics.LENS_FACING_FRONT) {
+                assertTrue("System doesn't have front camera feature",
+                        mPackageManager.hasSystemFeature(PackageManager.FEATURE_CAMERA_FRONT));
+            } else if (lensFacing == CameraCharacteristics.LENS_FACING_BACK) {
+                assertTrue("System doesn't have back camera feature",
+                        mPackageManager.hasSystemFeature(PackageManager.FEATURE_CAMERA));
+            } else {
+                fail("Unknown camera lens facing " + lensFacing.toString());
+            }
+        }
 
         /**
          * Test: that if there is one camera device, then the system must have some
diff --git a/tests/tests/media/src/android/media/cts/PresentationSyncTest.java b/tests/tests/media/src/android/media/cts/PresentationSyncTest.java
index dad5c1b..0f48ac0 100644
--- a/tests/tests/media/src/android/media/cts/PresentationSyncTest.java
+++ b/tests/tests/media/src/android/media/cts/PresentationSyncTest.java
@@ -189,8 +189,7 @@
      * <p>
      * @throws Exception
      */
-    @Suppress
-    public void testChoreographed() throws Throwable {
+    public void suppressed_testChoreographed() throws Throwable {
         // Get the Surface from the SurfaceView.
         // TODO: is it safe to assume that it's ready?
         SurfaceHolder holder = getActivity().getSurfaceHolder();
diff --git a/tests/tests/media/src/android/media/cts/Vp8EncoderTest.java b/tests/tests/media/src/android/media/cts/Vp8EncoderTest.java
index c2f0c32..326c959 100644
--- a/tests/tests/media/src/android/media/cts/Vp8EncoderTest.java
+++ b/tests/tests/media/src/android/media/cts/Vp8EncoderTest.java
@@ -21,6 +21,7 @@
 import android.media.MediaCodec;
 import android.media.MediaCodecInfo.CodecCapabilities;
 import android.media.MediaFormat;
+import android.os.Bundle;
 import android.test.AndroidTestCase;
 import android.util.Log;
 
@@ -71,6 +72,18 @@
         decode(BASIC_IVF);
     }
 
+    /**
+     * Check if MediaCodec.PARAMETER_KEY_REQUEST_SYNC_FRAME is honored.
+     *
+     * At frame 15, request a sync frame. If one does not occur by EOF the
+     * encoder fails. The test does not verify the output stream.
+     */
+    public void testSyncFrame() throws Exception {
+        encodeSyncFrame(R.raw.video_176x144_yv12,
+                        176, // width
+                        144, // height
+                        30); // framerate
+    }
 
     /**
      * A basic check if an encoded stream is decodable.
@@ -221,7 +234,8 @@
             ivf = new IvfWriter(outputFilename, frameWidth, frameHeight);
             // encode loop
             long presentationTimeUs = 0;
-            int frameIndex = 0;
+            int inputFrameIndex = 0;
+            int outputFrameIndex = 0;
             boolean sawInputEOS = false;
             boolean sawOutputEOS = false;
 
@@ -241,8 +255,8 @@
                         mInputBuffers[inputBufIndex].put(frame);
                         mInputBuffers[inputBufIndex].rewind();
 
-                        presentationTimeUs = (frameIndex * 1000000) / frameRate;
-                        Log.d(TAG, "Encoding frame at index " + frameIndex);
+                        presentationTimeUs = (inputFrameIndex * 1000000) / frameRate;
+                        Log.d(TAG, "Encoding frame at index " + inputFrameIndex);
                         encoder.queueInputBuffer(
                                 inputBufIndex,
                                 0,  // offset
@@ -250,7 +264,7 @@
                                 presentationTimeUs,
                                 sawInputEOS ? MediaCodec.BUFFER_FLAG_END_OF_STREAM : 0);
 
-                        frameIndex++;
+                        inputFrameIndex++;
                     }
                 }
 
@@ -261,6 +275,12 @@
                     mOutputBuffers[outputBufIndex].rewind();
                     mOutputBuffers[outputBufIndex].get(buffer, 0, mBufferInfo.size);
 
+                    if ((outputFrameIndex == 0)
+                        && ((mBufferInfo.flags & MediaCodec.BUFFER_FLAG_SYNC_FRAME) == 0)) {
+                      throw new RuntimeException("First frame is not a sync frame.");
+
+                    }
+
                     if ((mBufferInfo.flags & MediaCodec.BUFFER_FLAG_END_OF_STREAM) != 0) {
                         sawOutputEOS = true;
                     } else {
@@ -268,6 +288,8 @@
                     }
                     encoder.releaseOutputBuffer(outputBufIndex,
                                                 false);  // render
+
+                    outputFrameIndex++;
                 } else if (result == MediaCodec.INFO_OUTPUT_BUFFERS_CHANGED) {
                     mOutputBuffers = encoder.getOutputBuffers();
                 }
@@ -285,4 +307,128 @@
             }
         }
     }
+
+
+    /**
+     * Request Sync Frames
+     *
+     * MediaCodec will raise an IllegalStateException
+     * whenever vp8 encoder fails to encode a frame.
+     *
+     * This presumes a file with 28 frames. Under normal circumstances there
+     * would only be one sync frame: the first one. This test will request an
+     * additional sync frame at 15 and ensure that it occurs by EOF.
+     *
+     * Color format of input file should be YUV420, and frameWidth,
+     * frameHeight should be supplied correctly as raw input file doesn't
+     * include any header data.
+     *
+     * @param rawInputFd      File descriptor for the raw input file (YUV420)
+     * @param frameWidth      Frame width of input file
+     * @param frameHeight     Frame height of input file
+     * @param frameRate       Frame rate of input file in frames per second
+     */
+    private void encodeSyncFrame(int rawInputFd, int frameWidth,
+                                 int frameHeight, int frameRate) throws Exception {
+        int frameSize = frameWidth * frameHeight * 3 / 2;
+
+
+        // Create a media format signifying desired output
+        MediaFormat format = MediaFormat.createVideoFormat(VP8_MIME, frameWidth, frameHeight);
+        format.setInteger(MediaFormat.KEY_BIT_RATE, 100000);
+        format.setInteger(MediaFormat.KEY_COLOR_FORMAT,
+                          CodecCapabilities.COLOR_FormatYUV420Planar);
+        format.setInteger(MediaFormat.KEY_FRAME_RATE, 30);
+
+        Log.d(TAG, "Creating encoder");
+        MediaCodec encoder;
+        encoder = MediaCodec.createByCodecName(VPX_ENCODER_NAME);
+        encoder.configure(format,
+                          null,  // surface
+                          null,  // crypto
+                          MediaCodec.CONFIGURE_FLAG_ENCODE);
+        encoder.start();
+
+        mInputBuffers = encoder.getInputBuffers();
+        mOutputBuffers = encoder.getOutputBuffers();
+
+        InputStream rawStream = null;
+
+        try {
+            rawStream = mResources.openRawResource(rawInputFd);
+            // encode loop
+            long presentationTimeUs = 0;
+            int inputFrameIndex = 0;
+            boolean sawInputEOS = false;
+            boolean sawOutputEOS = false;
+            boolean syncFrameRequested = false;
+            boolean matchedSyncFrame = false;
+
+            while (!sawOutputEOS) {
+                if (!sawInputEOS) {
+                    int inputBufIndex = encoder.dequeueInputBuffer(DEFAULT_TIMEOUT_US);
+                    if (inputBufIndex >= 0) {
+                        byte[] frame = new byte[frameSize];
+                        int bytesRead = rawStream.read(frame);
+
+                        if (bytesRead == -1) {
+                            sawInputEOS = true;
+                            bytesRead = 0;
+                        }
+
+                        mInputBuffers[inputBufIndex].clear();
+                        mInputBuffers[inputBufIndex].put(frame);
+                        mInputBuffers[inputBufIndex].rewind();
+
+                        if (inputFrameIndex == 15) {
+                            Log.d(TAG, "Requesting sync frame at index " + inputFrameIndex);
+                            Bundle syncFrame = new Bundle();
+                            syncFrame.putInt(MediaCodec.PARAMETER_KEY_REQUEST_SYNC_FRAME, 0);
+                            encoder.setParameters(syncFrame);
+                            syncFrameRequested = true;
+                        }
+
+                        presentationTimeUs = (inputFrameIndex * 1000000) / frameRate;
+                        encoder.queueInputBuffer(
+                                inputBufIndex,
+                                0,  // offset
+                                bytesRead,  // size
+                                presentationTimeUs,
+                                sawInputEOS ? MediaCodec.BUFFER_FLAG_END_OF_STREAM : 0);
+
+                        inputFrameIndex++;
+                    }
+                }
+
+                int result = encoder.dequeueOutputBuffer(mBufferInfo, DEFAULT_TIMEOUT_US);
+                if (result >= 0) {
+                    if (syncFrameRequested && ((mBufferInfo.flags & MediaCodec.BUFFER_FLAG_SYNC_FRAME) != 0)) {
+                        Log.d(TAG, "Found sync frame");
+                        matchedSyncFrame = true;
+                    }
+
+                    if ((mBufferInfo.flags & MediaCodec.BUFFER_FLAG_END_OF_STREAM) != 0) {
+                        sawOutputEOS = true;
+                    }
+
+                    encoder.releaseOutputBuffer(result,
+                                                false);  // render
+
+                } else if (result == MediaCodec.INFO_OUTPUT_BUFFERS_CHANGED) {
+                    mOutputBuffers = encoder.getOutputBuffers();
+                }
+            }
+
+            if (!matchedSyncFrame) {
+                throw new RuntimeException("Requested sync frame did not occur");
+            }
+
+            encoder.stop();
+            encoder.release();
+        } finally {
+            if (rawStream != null) {
+                rawStream.close();
+            }
+        }
+    }
 }
diff --git a/tests/tests/permission/src/android/permission/cts/ContactsProviderTest.java b/tests/tests/permission/src/android/permission/cts/ContactsProviderTest.java
index cd14094..51e54df 100644
--- a/tests/tests/permission/src/android/permission/cts/ContactsProviderTest.java
+++ b/tests/tests/permission/src/android/permission/cts/ContactsProviderTest.java
@@ -30,17 +30,6 @@
  * Verify permissions are enforced.
  */
 public class ContactsProviderTest extends AndroidTestCase {
-    @SmallTest
-    public void testAcquireContentProviderClient() throws Exception {
-        try {
-            final ContentProviderClient provider = getContext().getContentResolver().
-                    acquireContentProviderClient(Contacts.AUTHORITY);
-            fail("acquireContentProviderClient(Contacts.AUTHORITY) did not throw"
-                    + " SecurityException as expected");
-        } catch (SecurityException se) {
-            // Expected Exception
-        }
-    }
 
     /**
      * Verifies that query(ContactsContract.Contacts.CONTENT_URI) requires
diff --git a/tests/tests/provider/src/android/provider/cts/MediaStoreIntentsTest.java b/tests/tests/provider/src/android/provider/cts/MediaStoreIntentsTest.java
new file mode 100644
index 0000000..4cad6e4
--- /dev/null
+++ b/tests/tests/provider/src/android/provider/cts/MediaStoreIntentsTest.java
@@ -0,0 +1,117 @@
+/*
+ * 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.provider.cts;
+
+import android.content.Intent;
+import android.content.pm.ResolveInfo;
+import android.net.Uri;
+import android.provider.MediaStore;
+import android.test.AndroidTestCase;
+
+import java.util.List;
+
+/**
+ * Tests to verify that common actions on {@link MediaStore} content are
+ * available.
+ */
+public class MediaStoreIntentsTest extends AndroidTestCase {
+    public void assertCanBeHandled(Intent intent) {
+        List<ResolveInfo> resolveInfoList = getContext()
+                .getPackageManager().queryIntentActivities(intent, 0);
+        assertNotNull("Missing ResolveInfo", resolveInfoList);
+        assertTrue("No ResolveInfo found for " + intent.toInsecureString(),
+                resolveInfoList.size() > 0);
+    }
+
+    public void testPickImage() {
+        Intent intent = new Intent(Intent.ACTION_PICK);
+        intent.setData(MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
+        assertCanBeHandled(intent);
+    }
+
+    public void testPickVideo() {
+        Intent intent = new Intent(Intent.ACTION_PICK);
+        intent.setData(MediaStore.Video.Media.EXTERNAL_CONTENT_URI);
+        assertCanBeHandled(intent);
+    }
+
+    public void testPickAudio() {
+        Intent intent = new Intent(Intent.ACTION_PICK);
+        intent.setData(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI);
+        assertCanBeHandled(intent);
+    }
+
+    public void testViewImage() {
+        final String[] schemes = new String[] {
+                "file", "http", "https", "content" };
+        final String[] mimes = new String[] {
+                "image/bmp", "image/jpeg", "image/png", "image/gif", "image/webp" };
+
+        for (String scheme : schemes) {
+            for (String mime : mimes) {
+                Intent intent = new Intent(Intent.ACTION_VIEW);
+                final Uri uri = new Uri.Builder().scheme(scheme)
+                        .authority("example.com").path("image").build();
+                intent.setDataAndType(uri, mime);
+                assertCanBeHandled(intent);
+            }
+        }
+    }
+
+    public void testViewVideo() {
+        final String[] schemes = new String[] {
+                "file", "http", "https", "content" };
+        final String[] mimes = new String[] {
+                "video/mpeg4", "video/mp4", "video/3gp", "video/3gpp", "video/3gpp2",
+                "video/webm" };
+
+        for (String scheme : schemes) {
+            for (String mime : mimes) {
+                Intent intent = new Intent(Intent.ACTION_VIEW);
+                final Uri uri = new Uri.Builder().scheme(scheme)
+                        .authority("example.com").path("video").build();
+                intent.setDataAndType(uri, mime);
+                assertCanBeHandled(intent);
+            }
+        }
+    }
+
+    public void testViewAudio() {
+        final String[] schemes = new String[] {
+                "file", "http", "content" };
+        final String[] mimes = new String[] {
+                "audio/mpeg", "audio/mp4", "audio/ogg", "audio/webm", "application/ogg",
+                "application/x-ogg" };
+
+        for (String scheme : schemes) {
+            for (String mime : mimes) {
+                Intent intent = new Intent(Intent.ACTION_VIEW);
+                final Uri uri = new Uri.Builder().scheme(scheme)
+                        .authority("example.com").path("audio").build();
+                intent.setDataAndType(uri, mime);
+                assertCanBeHandled(intent);
+            }
+        }
+    }
+
+    public void testSearchActions() {
+        assertCanBeHandled(new Intent(MediaStore.INTENT_ACTION_MEDIA_SEARCH));
+        assertCanBeHandled(new Intent(MediaStore.INTENT_ACTION_MEDIA_PLAY_FROM_SEARCH));
+        assertCanBeHandled(new Intent(MediaStore.INTENT_ACTION_TEXT_OPEN_FROM_SEARCH));
+        assertCanBeHandled(new Intent(MediaStore.INTENT_ACTION_VIDEO_PLAY_FROM_SEARCH));
+    }
+}
diff --git a/tests/tests/security/src/android/security/cts/ServicePermissionsTest.java b/tests/tests/security/src/android/security/cts/ServicePermissionsTest.java
index 45f3d51..8c02d6b 100644
--- a/tests/tests/security/src/android/security/cts/ServicePermissionsTest.java
+++ b/tests/tests/security/src/android/security/cts/ServicePermissionsTest.java
@@ -131,7 +131,9 @@
             }
 
             if (lines.size() == 1) {
-                if (!lines.get(0).contains("Permission Denial")) {
+                String message = lines.get(0);
+                if (!message.contains("Permission Denial") &&
+                        !message.contains("android.permission.DUMP")) {
                     fail("dump() for " + service + " produced a single line which didn't "
                             + "reference a permission; it may be leaking sensitive data.");
                 }
diff --git a/tests/tests/text/src/android/text/cts/EmojiTest.java b/tests/tests/text/src/android/text/cts/EmojiTest.java
index a8d8d2d..f5f191f 100644
--- a/tests/tests/text/src/android/text/cts/EmojiTest.java
+++ b/tests/tests/text/src/android/text/cts/EmojiTest.java
@@ -222,6 +222,14 @@
 
             webViewOnUiThread.loadDataAndWaitForCompletion("<html><body>" + String.valueOf(c) + "</body></html>",
                     "text/html; charset=utf-8", "utf-8");
+            // The Chromium-powered WebView renders asynchronously and there's nothing reliable
+            // we can easily wait for to be sure that capturePicture will return a fresh frame.
+            // So, just sleep for a sufficient time.
+            try {
+                Thread.sleep(250);
+            } catch (InterruptedException e) {
+                return null;
+            }
 
             Picture picture = webViewOnUiThread.capturePicture();
             if (picture == null || picture.getHeight() <= 0 || picture.getWidth() <= 0) {
diff --git a/tools/utils/buildCts.py b/tools/utils/buildCts.py
index 5d846df..4721234 100755
--- a/tools/utils/buildCts.py
+++ b/tools/utils/buildCts.py
@@ -19,6 +19,7 @@
 import glob
 import os
 import re
+import shutil
 import subprocess
 import sys
 import xml.dom.minidom as dom
@@ -71,6 +72,9 @@
 
     self.test_repository = os.path.join(self.out_dir, 'repository/testcases')
     self.plan_repository = os.path.join(self.out_dir, 'repository/plans')
+    
+    #dirty hack to copy over prepopulated CTS test plans, stable vs flaky, for autoCTS
+    self.definedplans_repository = os.path.join(self.android_root, 'cts/tests/plans')
 
   def GenerateTestDescriptions(self):
     """Generate test descriptions for all packages."""
@@ -160,6 +164,12 @@
     plan.Exclude('com\.android\.pts\.bootup')
     self.__WritePlan(plan, 'PDK')
 
+    #dirty hack to copy over pre-populated CTS plans - flaky vs stable - to streamline autoCTS
+    shutil.copyfile(os.path.join(self.definedplans_repository, 'CTS-flaky.xml'),
+        os.path.join(self.plan_repository, 'CTS-flaky.xml'))
+    shutil.copyfile(os.path.join(self.definedplans_repository, 'CTS-stable.xml'),
+        os.path.join(self.plan_repository, 'CTS-stable.xml'))
+
 def LogGenerateDescription(name):
   print 'Generating test description for package %s' % name