Merge "Fix Sensor CTS tests to reflect the new API changes." into klp-dev
diff --git a/apps/CtsVerifier/AndroidManifest.xml b/apps/CtsVerifier/AndroidManifest.xml
index 354775d..d0758f3 100644
--- a/apps/CtsVerifier/AndroidManifest.xml
+++ b/apps/CtsVerifier/AndroidManifest.xml
@@ -412,7 +412,23 @@
         </service>
         
         <service  android:name="nls.NotificationListenerVerifierActivity$DismissService"/>
-        
+        <activity android:name=".security.CAInstallNotificationVerifierActivity"
+                android:label="@string/cacert_test">
+            <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_notifications" />
+        </activity>
+        <activity android:name=".security.CANotifyOnBootActivity"
+                android:label="@string/caboot_test">
+            <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_notifications" />
+        </activity>
+
         <activity android:name=".p2p.GoNegRequesterTestListActivity"
                 android:label="@string/p2p_go_neg_requester"
                 android:configChanges="keyboardHidden|orientation|screenSize" />
diff --git a/apps/CtsVerifier/assets/myCA.cer b/apps/CtsVerifier/assets/myCA.cer
new file mode 100644
index 0000000..3b98d3e
--- /dev/null
+++ b/apps/CtsVerifier/assets/myCA.cer
Binary files differ
diff --git a/apps/CtsVerifier/res/layout/ca_boot_notify.xml b/apps/CtsVerifier/res/layout/ca_boot_notify.xml
new file mode 100644
index 0000000..29fa549
--- /dev/null
+++ b/apps/CtsVerifier/res/layout/ca_boot_notify.xml
@@ -0,0 +1,65 @@
+<?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">
+
+
+  <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:orientation="vertical"
+    android:layout_width="fill_parent"
+    android:layout_height="wrap_content">
+
+    <TextView
+        android:id="@+id/check_cert_desc"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:text="@string/caboot_check_cert_installed"/>
+
+    <Button android:id="@+id/check_creds"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:text="@string/caboot_check_creds" />
+
+     <TextView
+        android:id="@+id/need_to_install_cert"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:text="@string/caboot_if_not_installed"/>
+
+    <Button android:id="@+id/install"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:text="@string/caboot_install_cert" />
+
+     <TextView
+        android:id="@+id/reboot"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:text="@string/caboot_reboot_desc"/>
+
+    <TextView
+        android:id="@+id/after_reboot"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:text="@string/caboot_after_boot"/>
+  </LinearLayout>
+
+  <include layout="@layout/pass_fail_buttons" />
+
+</LinearLayout>
diff --git a/apps/CtsVerifier/res/layout/cainstallnotify_item.xml b/apps/CtsVerifier/res/layout/cainstallnotify_item.xml
new file mode 100644
index 0000000..1359cb4
--- /dev/null
+++ b/apps/CtsVerifier/res/layout/cainstallnotify_item.xml
@@ -0,0 +1,52 @@
+<?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.
+-->
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content" >
+
+    <ImageView
+        android:id="@+id/ca_notify_status"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_alignParentLeft="true"
+        android:layout_alignParentTop="true"
+        android:layout_marginTop="10dip"
+        android:contentDescription="@string/pass_button_text"
+        android:padding="10dip"
+        android:src="@drawable/fs_indeterminate" />
+
+    <TextView
+        android:id="@+id/ca_notify_instructions"
+        style="@style/InstructionsSmallFont"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:layout_alignParentRight="true"
+        android:layout_alignParentTop="true"
+        android:layout_toRightOf="@id/ca_notify_status" />
+
+    <Button
+        android:id="@+id/ca_notify_do_something"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:layout_alignParentRight="true"
+        android:layout_below="@id/ca_notify_instructions"
+        android:layout_marginLeft="20dip"
+        android:layout_marginRight="20dip"
+        android:layout_toRightOf="@id/ca_notify_status"
+        android:text="@string/cacert_do_something" />
+
+</RelativeLayout>
\ No newline at end of file
diff --git a/apps/CtsVerifier/res/layout/cainstallnotify_main.xml b/apps/CtsVerifier/res/layout/cainstallnotify_main.xml
new file mode 100644
index 0000000..16882bd
--- /dev/null
+++ b/apps/CtsVerifier/res/layout/cainstallnotify_main.xml
@@ -0,0 +1,45 @@
+<?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="match_parent"
+    android:orientation="vertical"
+    android:padding="10dip" >
+
+    <ScrollView
+        android:id="@+id/ca_notify_test_scroller"
+        android:layout_width="match_parent"
+        android:layout_height="0dp"
+        android:layout_weight="1"
+        android:orientation="vertical"
+        android:padding="10dip" >
+
+        <LinearLayout
+            android:id="@+id/ca_notify_test_items"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:orientation="vertical" >
+        </LinearLayout>
+    </ScrollView>
+
+    <include
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:layout_weight="0"
+        layout="@layout/pass_fail_buttons" />
+
+</LinearLayout>
\ No newline at end of file
diff --git a/apps/CtsVerifier/res/values/strings.xml b/apps/CtsVerifier/res/values/strings.xml
index 0f164ef..6df4b42 100644
--- a/apps/CtsVerifier/res/values/strings.xml
+++ b/apps/CtsVerifier/res/values/strings.xml
@@ -607,6 +607,24 @@
     <string name="nls_service_stopped">Service should stop once disabled.</string>
     <string name="nls_note_missed">Check that notification was not received.</string>
     
+    <string name="cacert_test">CA Cert Notification Test</string>
+    <string name="cacert_info">This test checks that when a CA Certificate is installed, the user is notified.</string>
+    <string name="cacert_do_something">Do it</string>
+    <string name="cacert_done">Done</string>
+    <string name="cacert_install_cert">Use the CertInstaller to install the certificate. When it opens, just tap "Okay". If this button does nothing, pass the test and move on.</string>
+    <string name="cacert_check_cert_in_settings">Visit the user-installed trusted credentials page and confirm that the "Internet Widgits Pty Ltd" cert appears in the list.</string>
+    <string name="cacert_check_notification">Please look at the new notification and confirm: It say the network may be monitored. Tapping it brings up a more detailed explanation and a button to check trusted credentials. Tapping that button brings up the Trusted Credentials page you just visited.</string>
+    <string name="cacert_dismiss_notification">Dismiss the notification. If it cannot be dismissed, fail the test.</string>
+
+    <string name="caboot_test">CA Cert Notification on Boot test</string>
+    <string name="caboot_info">This test is to confirm that when the user has installed a trusted credential, the system notifies the user when it boots.</string>
+    <string name="caboot_check_cert_installed">Please check here to see whether a certificate is already installed. (If this button does nothing, pass the test and move on.)</string>
+    <string name="caboot_check_creds">Check Credentials</string>
+    <string name="caboot_if_not_installed">Only if there is no credential currently installed, install one. (If this button does nothing, pass the test and move on.)</string>
+    <string name="caboot_install_cert">Install credential</string>
+    <string name="caboot_reboot_desc">Please reboot the device and return to this test.</string>
+    <string name="caboot_after_boot">AFTER REBOOTING: Check that there is a notification that the network may be monitored. Opening that notification should show a dialog box giving more information, with a button to check trusted credentials. This should open up the same view of trusted credentials that you get via the "Check credentials" button.</string>
+
     <!-- Strings for Widget -->
     <string name="widget_framework_test">Widget Framework Test</string>
     <string name="widget_framework_test_info">This test checks some basic features of the widget
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/nls/MockListener.java b/apps/CtsVerifier/src/com/android/cts/verifier/nls/MockListener.java
index 8549214..0b74fa3 100644
--- a/apps/CtsVerifier/src/com/android/cts/verifier/nls/MockListener.java
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/nls/MockListener.java
@@ -49,12 +49,12 @@
     static final int RESULT_TIMEOUT = Activity.RESULT_FIRST_USER;
     static final int RESULT_NO_SERVER = Activity.RESULT_FIRST_USER + 1;
 
-    static final String JSON_FLAGS = "flag";
-    static final String JSON_ICON = "icon";
-    static final String JSON_ID = "id";
-    static final String JSON_PACKAGE = "pkg";
-    static final String JSON_WHEN = "when";
-    static final String JSON_TAG = "tag";
+    public static final String JSON_FLAGS = "flag";
+    public static final String JSON_ICON = "icon";
+    public static final String JSON_ID = "id";
+    public static final String JSON_PACKAGE = "pkg";
+    public static final String JSON_WHEN = "when";
+    public static final String JSON_TAG = "tag";
 
     private ArrayList<String> mPosted = new ArrayList<String>();
     private ArrayList<String> mPayloads = new ArrayList<String>();
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/security/CAInstallNotificationVerifierActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/security/CAInstallNotificationVerifierActivity.java
new file mode 100644
index 0000000..3e8110e
--- /dev/null
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/security/CAInstallNotificationVerifierActivity.java
@@ -0,0 +1,301 @@
+/*
+ * 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 com.android.cts.verifier.security;
+
+import android.app.Service;
+import android.content.ActivityNotFoundException;
+import android.content.Intent;
+import android.os.Bundle;
+import android.os.IBinder;
+import android.util.Log;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.View.OnClickListener;
+import android.view.ViewGroup;
+import android.widget.Button;
+import android.widget.ImageView;
+import android.widget.TextView;
+
+import com.android.cts.verifier.PassFailButtons;
+import com.android.cts.verifier.R;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.concurrent.LinkedBlockingQueue;
+
+public class CAInstallNotificationVerifierActivity extends PassFailButtons.Activity
+implements Runnable {
+    static final String TAG = CAInstallNotificationVerifierActivity.class.getSimpleName();
+    private static final String STATE = "state";
+    private static final int PASS = 1;
+    private static final int FAIL = 2;
+    private static final int WAIT_FOR_USER = 3;
+    private static LinkedBlockingQueue<String> sDeletedQueue = new LinkedBlockingQueue<String>();
+
+    private int mState;
+    private int[] mStatus;
+    private LayoutInflater mInflater;
+    private ViewGroup mItemList;
+    private Runnable mRunner;
+    private View mHandler;
+
+    private static final String CERT_ASSET_NAME = "myCA.cer";
+    private File certStagingFile = new File("/sdcard/", CERT_ASSET_NAME);
+
+    protected boolean doneInstallingCert = false;
+    protected boolean doneCheckingInSettings = false;
+    protected boolean doneCheckingNotification = false;
+    protected boolean doneDismissingNotification = false;
+
+
+    public static class DismissService extends Service {
+        @Override
+        public IBinder onBind(Intent intent) {
+            return null;
+        }
+
+        @Override
+        public void onStart(Intent intent, int startId) {
+            sDeletedQueue.offer(intent.getAction());
+        }
+    }
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+
+        if (savedInstanceState != null) {
+            mState = savedInstanceState.getInt(STATE, 0);
+        }
+        mRunner = this;
+        mInflater = getLayoutInflater();
+        View view = mInflater.inflate(R.layout.cainstallnotify_main, null);
+        mItemList = (ViewGroup) view.findViewById(R.id.ca_notify_test_items);
+        mHandler = mItemList;
+        createTestItems();
+        mStatus = new int[mItemList.getChildCount()];
+        setContentView(view);
+
+        setPassFailButtonClickListeners();
+        setInfoResources(R.string.cacert_test, R.string.cacert_info, -1);
+    }
+
+    @Override
+    protected void onSaveInstanceState (Bundle outState) {
+        outState.putInt(STATE, mState);
+    }
+
+    @Override
+    protected void onResume() {
+        super.onResume();
+        next();
+    }
+
+    // Interface Utilities
+
+    private void createTestItems() {
+        createUserItem(R.string.cacert_install_cert, new InstallCert());
+        createUserItem(R.string.cacert_check_cert_in_settings, new OpenTrustedCredentials());
+        createUserItem(R.string.cacert_check_notification,
+                new DoneCheckingNotification(), R.string.cacert_done);
+        createUserItem(R.string.cacert_dismiss_notification,
+                new DoneCheckingDismissed(), R.string.cacert_done);
+    }
+
+    private void setItemState(int index, boolean passed) {
+        ViewGroup item = (ViewGroup) mItemList.getChildAt(index);
+        ImageView status = (ImageView) item.findViewById(R.id.ca_notify_status);
+        status.setImageResource(passed ? R.drawable.fs_good : R.drawable.fs_error);
+        View button = item.findViewById(R.id.ca_notify_do_something);
+        button.setClickable(false);
+        button.setEnabled(false);
+        status.invalidate();
+    }
+
+    private void markItemWaiting(int index) {
+        ViewGroup item = (ViewGroup) mItemList.getChildAt(index);
+        ImageView status = (ImageView) item.findViewById(R.id.ca_notify_status);
+        status.setImageResource(R.drawable.fs_warning);
+        status.invalidate();
+    }
+
+    private View createUserItem(int stringId, OnClickListener listener) {
+        return createUserItem(stringId, listener, 0);
+    }
+
+    private View createUserItem(int stringId, OnClickListener listener, int buttonLabel) {
+        View item = mInflater.inflate(R.layout.cainstallnotify_item, mItemList, false);
+        TextView instructions = (TextView) item.findViewById(R.id.ca_notify_instructions);
+        instructions.setText(stringId);
+        Button button = (Button) item.findViewById(R.id.ca_notify_do_something);
+        if (buttonLabel != 0) {
+            button.setText(buttonLabel);
+        }
+        button.setOnClickListener(listener);
+        mItemList.addView(item);
+        return item;
+    }
+
+    // Test management
+
+    public void run() {
+        while (mState < mStatus.length && mStatus[mState] != WAIT_FOR_USER) {
+            if (mStatus[mState] == PASS) {
+                setItemState(mState, true);
+                mState++;
+            } else if (mStatus[mState] == FAIL) {
+                setItemState(mState, false);
+                return;
+            } else {
+                break;
+            }
+        }
+
+        if (mState < mStatus.length && mStatus[mState] == WAIT_FOR_USER) {
+            markItemWaiting(mState);
+        }
+
+        switch (mState) {
+            case 0:
+                testInstalledCert(0);
+                break;
+            case 1:
+                testCheckedSettings(1);
+                break;
+            case 2:
+                testCheckedNotification(2);
+                break;
+            case 3:
+                testNotificationDismissed(3);
+                break;
+        }
+    }
+
+    /**
+     * Return to the state machine to progress through the tests.
+     */
+    private void next() {
+        mHandler.post(mRunner);
+    }
+
+    /**
+     * Wait for things to settle before returning to the state machine.
+     */
+    private void delay() {
+        mHandler.postDelayed(mRunner, 2000);
+    }
+
+    // Listeners
+
+    class InstallCert implements OnClickListener {
+        @Override
+        public void onClick(View v) {
+            InputStream is = null;
+            FileOutputStream os = null;
+            try {
+                try {
+                    is = getAssets().open(CERT_ASSET_NAME);
+                    os = new FileOutputStream(certStagingFile);
+                    byte[] buffer = new byte[1024];
+                    int length;
+                    while ((length = is.read(buffer)) > 0) {
+                        os.write(buffer, 0, length);
+                    }
+                } finally {
+                    if (is != null) is.close();
+                    if (os != null) os.close();
+                    certStagingFile.setReadable(true, false);
+                }
+            } catch (IOException ioe) {
+                Log.w(TAG, "Problem moving cert file to /sdcard/", ioe);
+                return;
+            }
+            try {
+                startActivity(new Intent("android.credentials.INSTALL"));
+            } catch (ActivityNotFoundException e) {
+                // do nothing
+            }
+            doneInstallingCert = true;
+        }
+    }
+
+    class OpenTrustedCredentials implements OnClickListener {
+        @Override
+        public void onClick(View v) {
+            try {
+                startActivity(new Intent("com.android.settings.TRUSTED_CREDENTIALS_USER"));
+            } catch (ActivityNotFoundException e) {
+                // do nothing
+            }
+            doneCheckingInSettings = true;
+        }
+    }
+
+    class DoneCheckingNotification implements OnClickListener {
+        @Override
+        public void onClick(View v) {
+            doneCheckingNotification = true;
+        }
+    }
+
+    class DoneCheckingDismissed implements OnClickListener {
+        @Override
+        public void onClick(View v) {
+            doneDismissingNotification = true;
+        }
+    }
+
+    // Tests
+
+    private void testInstalledCert(final int i) {
+        if (doneInstallingCert) {
+            mStatus[i] = PASS;
+            next();
+        } else {
+            delay();
+        }
+    }
+
+    private void testCheckedSettings(final int i) {
+        if (doneCheckingInSettings) {
+            mStatus[i] = PASS;
+            next();
+        } else {
+            delay();
+        }
+    }
+
+    private void testCheckedNotification(final int i) {
+        if (doneCheckingNotification) {
+            mStatus[i] = PASS;
+            next();
+        } else {
+            delay();
+        }
+    }
+
+    private void testNotificationDismissed(final int i) {
+        if (doneDismissingNotification) {
+            mStatus[i] = PASS;
+            next();
+        } else {
+            delay();
+        }
+    }
+}
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/security/CANotifyOnBootActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/security/CANotifyOnBootActivity.java
new file mode 100644
index 0000000..5537b15
--- /dev/null
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/security/CANotifyOnBootActivity.java
@@ -0,0 +1,88 @@
+package com.android.cts.verifier.security;
+
+import android.content.ActivityNotFoundException;
+import android.content.Intent;
+import android.os.Bundle;
+import android.util.Log;
+import android.view.View;
+import android.view.View.OnClickListener;
+import android.widget.Button;
+import android.widget.Toast;
+
+import com.android.cts.verifier.PassFailButtons;
+import com.android.cts.verifier.R;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+
+public class CANotifyOnBootActivity extends PassFailButtons.Activity {
+
+    private static final String TAG = CANotifyOnBootActivity.class.getSimpleName();
+    private static final String CERT_ASSET_NAME = "myCA.cer";
+    private File certStagingFile = new File("/sdcard/", CERT_ASSET_NAME);
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+
+        View view = getLayoutInflater().inflate(R.layout.ca_boot_notify, null);
+        Button checkCredsButton = (Button) view.findViewById(R.id.check_creds);
+        Button installButton = (Button) view.findViewById(R.id.install);
+        checkCredsButton.setOnClickListener(new OpenTrustedCredentials());
+        installButton.setOnClickListener(new InstallCert());
+
+        setContentView(view);
+
+        setPassFailButtonClickListeners();
+        setInfoResources(R.string.caboot_test, R.string.caboot_info, -1);
+
+        getPassButton().setEnabled(true);
+    }
+
+    class OpenTrustedCredentials implements OnClickListener {
+        @Override
+        public void onClick(View v) {
+            try {
+                startActivity(new Intent("com.android.settings.TRUSTED_CREDENTIALS_USER"));
+            } catch (ActivityNotFoundException e) {
+                // do nothing
+            }
+        }
+    }
+
+    class InstallCert implements OnClickListener {
+        @Override
+        public void onClick(View v) {
+            InputStream is = null;
+            FileOutputStream os = null;
+            try {
+                try {
+                    is = getAssets().open(CERT_ASSET_NAME);
+                    os = new FileOutputStream(certStagingFile);
+                    byte[] buffer = new byte[1024];
+                    int length;
+                    while ((length = is.read(buffer)) > 0) {
+                        os.write(buffer, 0, length);
+                    }
+                } finally {
+                    if (is != null) is.close();
+                    if (os != null) os.close();
+                    certStagingFile.setReadable(true, false);
+                }
+            } catch (IOException ioe) {
+                Log.w(TAG, "Problem moving cert file to /sdcard/", ioe);
+                return;
+            }
+
+            try {
+                startActivity(new Intent("android.credentials.INSTALL"));
+            } catch (ActivityNotFoundException e) {
+                // do nothing
+            }
+        }
+    }
+
+
+}
diff --git a/hostsidetests/appsecurity/test-apps/ExternalStorageApp/src/com/android/cts/externalstorageapp/CommonExternalStorageTest.java b/hostsidetests/appsecurity/test-apps/ExternalStorageApp/src/com/android/cts/externalstorageapp/CommonExternalStorageTest.java
index 5f534c4..5d3bdb6 100644
--- a/hostsidetests/appsecurity/test-apps/ExternalStorageApp/src/com/android/cts/externalstorageapp/CommonExternalStorageTest.java
+++ b/hostsidetests/appsecurity/test-apps/ExternalStorageApp/src/com/android/cts/externalstorageapp/CommonExternalStorageTest.java
@@ -86,9 +86,10 @@
     public void testAllPackageDirsWritable() throws Exception {
         final List<File> paths = getAllPackageSpecificPaths(getContext());
         for (File path : paths) {
-            if (path == null) continue;
+            assertNotNull("Valid media must be inserted during CTS", path);
+            assertEquals("Valid media must be inserted during CTS", Environment.MEDIA_MOUNTED,
+                    Environment.getStorageState(path));
 
-            assertEquals(Environment.MEDIA_MOUNTED, Environment.getStorageState(path));
             assertDirReadWriteAccess(path);
 
             final File directChild = new File(path, "directChild");
diff --git a/hostsidetests/appsecurity/test-apps/ReadExternalStorageApp/src/com/android/cts/readexternalstorageapp/ReadExternalStorageTest.java b/hostsidetests/appsecurity/test-apps/ReadExternalStorageApp/src/com/android/cts/readexternalstorageapp/ReadExternalStorageTest.java
index 6e85c73..bbd1e7a 100644
--- a/hostsidetests/appsecurity/test-apps/ReadExternalStorageApp/src/com/android/cts/readexternalstorageapp/ReadExternalStorageTest.java
+++ b/hostsidetests/appsecurity/test-apps/ReadExternalStorageApp/src/com/android/cts/readexternalstorageapp/ReadExternalStorageTest.java
@@ -52,7 +52,9 @@
         final String packageName = getContext().getPackageName();
 
         for (File path : paths) {
-            if (path == null) continue;
+            assertNotNull("Valid media must be inserted during CTS", path);
+            assertEquals("Valid media must be inserted during CTS", Environment.MEDIA_MOUNTED,
+                    Environment.getStorageState(path));
 
             assertTrue(path.getAbsolutePath().contains(packageName));
 
diff --git a/hostsidetests/appsecurity/test-apps/WriteExternalStorageApp/src/com/android/cts/writeexternalstorageapp/WriteExternalStorageTest.java b/hostsidetests/appsecurity/test-apps/WriteExternalStorageApp/src/com/android/cts/writeexternalstorageapp/WriteExternalStorageTest.java
index cef2639..6857236 100644
--- a/hostsidetests/appsecurity/test-apps/WriteExternalStorageApp/src/com/android/cts/writeexternalstorageapp/WriteExternalStorageTest.java
+++ b/hostsidetests/appsecurity/test-apps/WriteExternalStorageApp/src/com/android/cts/writeexternalstorageapp/WriteExternalStorageTest.java
@@ -20,7 +20,6 @@
 import static com.android.cts.externalstorageapp.CommonExternalStorageTest.PACKAGE_READ;
 import static com.android.cts.externalstorageapp.CommonExternalStorageTest.PACKAGE_WRITE;
 import static com.android.cts.externalstorageapp.CommonExternalStorageTest.TAG;
-import static com.android.cts.externalstorageapp.CommonExternalStorageTest.assertDirNoAccess;
 import static com.android.cts.externalstorageapp.CommonExternalStorageTest.assertDirNoWriteAccess;
 import static com.android.cts.externalstorageapp.CommonExternalStorageTest.assertDirReadOnlyAccess;
 import static com.android.cts.externalstorageapp.CommonExternalStorageTest.assertDirReadWriteAccess;
@@ -130,7 +129,10 @@
         final String packageName = getContext().getPackageName();
 
         for (File path : paths) {
-            assertNotNull(path);
+            assertNotNull("Valid media must be inserted during CTS", path);
+            assertEquals("Valid media must be inserted during CTS", Environment.MEDIA_MOUNTED,
+                    Environment.getStorageState(path));
+
             assertTrue(path.getAbsolutePath().contains(packageName));
 
             // Walk until we leave device, writing the whole way
@@ -205,7 +207,9 @@
         final String packageName = getContext().getPackageName();
 
         for (File path : paths) {
-            if (path == null) continue;
+            assertNotNull("Valid media must be inserted during CTS", path);
+            assertEquals("Valid media must be inserted during CTS", Environment.MEDIA_MOUNTED,
+                    Environment.getStorageState(path));
 
             assertTrue(path.getAbsolutePath().contains(packageName));
 
@@ -233,7 +237,9 @@
 
         // Require that .nomedia was created somewhere above each dir
         for (File path : paths) {
-            if (path == null) continue;
+            assertNotNull("Valid media must be inserted during CTS", path);
+            assertEquals("Valid media must be inserted during CTS", Environment.MEDIA_MOUNTED,
+                    Environment.getStorageState(path));
 
             final File start = path;
 
diff --git a/tests/expectations/knownfailures.txt b/tests/expectations/knownfailures.txt
index d7ef39f..6b0f214 100644
--- a/tests/expectations/knownfailures.txt
+++ b/tests/expectations/knownfailures.txt
@@ -6,5 +6,13 @@
 {
   name: "android.holo.cts.HoloTest",
   bug: 8148617
+},
+{
+  name: "android.hardware.camera2.cts.ImageReaderTest",
+  name: "android.hardware.camera2.cts.CameraCharacteristicsTest",
+  name: "android.hardware.camera2.cts.CameraCaptureResultTest",
+  name: "android.hardware.camera2.cts.CameraDeviceTest",
+  name: "android.hardware.camera2.cts.CameraManagerTest",
+  bug: 11141002
 }
 ]
diff --git a/tests/plans/CTS-flaky.xml b/tests/plans/CTS-flaky.xml
index 1c2c30d..33c5472 100644
--- a/tests/plans/CTS-flaky.xml
+++ b/tests/plans/CTS-flaky.xml
@@ -1,8 +1,7 @@
 <?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"/>
+  <Entry uri="android.app" exclude="android.app.cts.SystemFeaturesTest#testTelephonyFeatures;android.app.cts.InstrumentationTest#testCallActivityOnResume;android.app.cts.ActivityManagerRecentTaskInfoTest#testWriteToParcel;android.app.cts.InstrumentationTest#testMisc;android.app.cts.DialogTest#testSetContentView;android.app.cts.ServiceTest#testLocalBindAutoClassPermissionGranted;android.app.cts.ActivityManager_RunningAppProcessInfoTest#testAndroidTestCaseSetupProperly;android.app.cts.AlertDialog_BuilderTest#testSetSingleChoiceItemsWithParamInt;android.app.cts.LocalActivityManagerTest#testConstructor;android.app.cts.ActivityManager_RunningServiceInfoTest#testDescribeContents;android.app.cts.DialogTest#testTakeKeyEvents;android.app.cts.LifecycleTest#testBasic;android.app.cts.NotificationTest#testConstructor;android.app.cts.ActivityManagerMemoryInfoTest#testWriteToParcel;android.app.cts.DialogTest#testConstructor_protectedCancellable;android.app.cts.ProgressDialogTest#testIncrementProgressBy;android.app.cts.ApplicationTest#testApplication;android.app.cts.InstrumentationTest#testSendKeySync;android.app.cts.LocalActivityManagerTest#testDispatchCreate;android.app.cts.AlertDialogTest#testAlertDialogDeprecatedAPI;android.app.cts.AlertDialog_BuilderTest#testSetSingleChoiceItemsWithParamCursor;android.app.cts.InstrumentationTest#testCallActivityOnRestart;android.app.backup.cts.BackupAgentTest#testBackupAgent;android.app.cts.AlertDialog_BuilderTest#testSetSingleChoiceItemsWithParamCharSequence;android.app.cts.ActivityManager_RunningServiceInfoTest#testAndroidTestCaseSetupProperly;android.app.cts.ServiceTest#testLocalBindAutoAction;android.app.cts.DialogTest#testSetFeatureDrawableUri;android.app.cts.KeyguardManagerKeyguardLockTest#testDisableKeyguard;android.app.cts.LaunchTest#testClearTopWhilResumed;android.app.cts.WallpaperManagerTest#testSuggestDesiredDimensions;android.app.cts.SystemFeaturesTest#testLiveWallpaperFeature;android.app.cts.InstrumentationTest#testCallActivityOnUserLeaving;android.app.cts.AlertDialog_BuilderTest#testSetCancelable;android.app.cts.AlertDialogTest#testAlertDialogTheme;android.app.cts.PendingIntentTest#testGetBroadcast;android.app.cts.ActivityManager_RunningServiceInfoTest#testWriteToParcel;android.app.cts.InstrumentationTest#testGetComponentName;android.app.backup.cts.FileBackupHelperTest#testAndroidTestCaseSetupProperly;android.app.cts.DownloadManagerTest#testAndroidTestCaseSetupProperly;android.app.cts.SystemFeaturesTest#testTouchScreenFeatures;android.app.cts.AlarmManagerTest#testAlarmTriggersImmediatelyIfSetTimeIsNegative;android.app.cts.ActivityManagerMemoryInfoTest#testReadFromParcel;android.app.cts.NotificationTest#testAndroidTestCaseSetupProperly;android.app.cts.AlertDialog_BuilderTest#testSetOnCancelListener;android.app.cts.ServiceTest#testLocalBindClass;android.app.cts.ServiceTest#testLocalStartClass;android.app.cts.LauncherActivity_ListItemTest#testConstructor;android.app.cts.InstrumentationTest#testCallActivityOnCreate;android.app.cts.PendingIntentTest#testSendWithParamContextIntIntent;android.app.cts.InstrumentationTest#testSendPointerSync;android.app.cts.DialogTest#testRequestWindowFeature;android.app.cts.LocalActivityManagerTest#testDispatchPauseFalse;android.app.cts.Instrumentation_ActivityResultTest#testActivityResultOp;android.app.cts.ProgressDialogTest#testOnStartCreateStop;android.app.cts.AlertDialog_BuilderTest#testSetNegativeButtonWithParamInt;android.app.cts.KeyguardManagerKeyguardLockTest#testReenableKeyguard;android.app.cts.DialogTest#testShow;android.app.cts.ActivityManagerMemoryInfoTest#testDescribeContents;android.app.cts.SystemFeaturesTest#testFeatureNamespaces;android.app.cts.PendingIntent_CanceledExceptionTest#testConstructor;android.app.cts.AlertDialog_BuilderTest#testSetPositiveButtonWithParamInt;android.app.cts.PendingIntentTest#testSendWithParamInt;android.app.cts.PendingIntentTest#testGetActivity;android.app.cts.AlertDialog_BuilderTest#testSetCursor;android.app.cts.ActivityManagerProcessErrorStateInfoTest#testWriteToParcel;android.app.cts.AlertDialog_BuilderTest#testConstructor;android.app.cts.LocalActivityManagerTest#testDispatchDestroy;android.app.cts.DownloadManagerTest#testDownloadManager;android.app.cts.ServiceTest#testLocalBindAction;android.app.cts.LocalActivityManagerTest#testSaveInstanceState;android.app.cts.LifecycleTest#testTabDialog;android.app.cts.LaunchTest#testLocalActivity;android.app.cts.AlertDialog_BuilderTest#testSetInverseBackgroundForced;android.app.cts.SystemFeaturesTest#testLocationFeatures;android.app.cts.DialogTest#testOnStartCreateStop;android.app.cts.ActivityManagerRecentTaskInfoTest#testReadFromParcel;android.app.cts.ServiceTest#testLocalStartClassPermissions;android.app.cts.ServiceTest#testLocalUnbindTwice;android.app.cts.ActivityManagerProcessErrorStateInfoTest#testConstructor;android.app.cts.DialogTest#testSetFeatureDrawableResource;android.app.cts.ProgressDialogTest#testAccessProgress;android.app.cts.DialogTest#testTrackballEvent;android.app.cts.AlertDialog_BuilderTest#testSetSingleChoiceItems;android.app.cts.LaunchTest#testColdActivity;android.app.cts.ActivityManagerTest#testGetMemoryInfo;android.app.cts.PendingIntentTest#testAndroidTestCaseSetupProperly;android.app.cts.DialogTest#testOnContentChanged;android.app.cts.SearchManagerTest#testSetOnDismissListener;android.app.cts.InstrumentationTest#testContext;android.app.cts.LauncherActivity_IconResizerTest#testIconResizer;android.app.cts.DialogTest#testCancel_listener;android.app.cts.ActivityManagerTest#testIsUserAMonkey;android.app.cts.NotificationManagerTest#testCancelAll;android.app.cts.ActivityGroupTest#testAndroidTestCaseSetupProperly;android.app.cts.AlertDialog_BuilderTest#testCreate;android.app.cts.SystemFeaturesTest#testUsbAccessory;android.app.cts.ActivityManagerRecentTaskInfoTest#testDescribeContents;android.app.cts.ActivityManagerRunningTaskInfoTest#testDescribeContents;android.app.cts.AlertDialog_BuilderTest#testDisableCancelable;android.app.cts.InstrumentationTest#testSendKeyDownUpSync;android.app.cts.ActivityManagerRunningTaskInfoTest#testConstructor;android.app.cts.TimePickerDialogTest#testUpdateTime;android.app.cts.ActivityManagerRunningTaskInfoTest#testReadFromParcel;android.app.cts.ProgressDialogTest#testSetProgressStyle;android.app.cts.InstrumentationTest#testMonitor;android.app.cts.AliasActivityTest#testAliasActivity;android.app.cts.InstrumentationTest#testSendTrackballEventSync;android.app.cts.LifecycleTest#testScreen;android.app.cts.AlarmManagerTest#testCancel;android.app.cts.ActivityGroupTest#testTabDialog;android.app.cts.PendingIntentTest#testDescribeContents;android.app.cts.DialogTest#testOnSearchRequested;android.app.cts.SearchManagerTest#testSetOnCancelListener;android.app.cts.ProgressDialogTest#testAccessMax;android.app.cts.PendingIntentTest#testGetTargetPackage;android.app.cts.SystemFeaturesTest#testWifiFeature;android.app.cts.ActivityManagerRecentTaskInfoTest#testAndroidTestCaseSetupProperly;android.app.cts.DialogTest#testSetFeatureDrawableAlpha;android.app.cts.DialogTest#testSetTitle;android.app.cts.FragmentTest#testInstantiateNonFragment;android.app.cts.DialogTest#testSetDismissMessage;android.app.cts.PendingIntentTest#testWriteToParcel;android.app.cts.ActivityManagerMemoryInfoTest#testAndroidTestCaseSetupProperly;android.app.cts.AlertDialog_BuilderTest#testSetNeutralButtonWithParamCharSequence;android.app.cts.NotificationTest#testToString;android.app.cts.LaunchTest#testColdScreen;android.app.cts.AlertDialogTest#testAlertDialog;android.app.cts.SystemFeaturesTest#testSensorFeatures;android.app.cts.ProgressDialogTest#testShow1;android.app.cts.AlertDialog_BuilderTest#testSetNeutralButtonWithParamInt;android.app.cts.ActivityManagerRunningTaskInfoTest#testWriteToParcel;android.app.cts.ProgressDialogTest#testShow2;android.app.cts.ProgressDialogTest#testShow3;android.app.cts.ProgressDialogTest#testShow4;android.app.cts.InstrumentationTest#testCallActivityOnStart;android.app.cts.PendingIntentTest#testCancel;android.app.cts.InstrumentationTest#testConstructor;android.app.cts.ProgressDialogTest#testSetIndeterminate;android.app.cts.AlertDialog_BuilderTest#testShow;android.app.cts.AlertDialog_BuilderTest#testSetIconWithParamDrawable;android.app.cts.AlarmManagerTest#testSetTypes;android.app.cts.AlarmManagerTest#testSetInexactRepeating;android.app.cts.PendingIntentTest#testSendWithParamIntOnFinishedHandler;android.app.backup.cts.FileBackupHelperTest#testConstructor;android.app.cts.Instrumentation_ActivityResultTest#testAndroidTestCaseSetupProperly;android.app.cts.DownloadManagerTest#testDownloadManagerDestinationExtension;android.app.cts.LaunchTest#testClearTopInCreate;android.app.cts.InstrumentationTest#testRunOnMainSync;android.app.cts.DialogTest#testOnKeyDownKeyUp;android.app.cts.ServiceTest#testLocalStartActionPermissions;android.app.cts.KeyguardManagerTest#testInKeyguardRestrictedInputMode;android.app.cts.DialogTest#testConstructor;android.app.cts.AlertDialogTest#testCallback;android.app.cts.ActivityManagerTest#testGetRunningTasks;android.app.cts.ProgressDialogTest#testIncrementSecondaryProgressBy;android.app.cts.DialogTest#testAccessOwnerActivity;android.app.cts.LifecycleTest#testTabScreen;android.app.cts.TimePickerDialogTest#testOnRestoreInstanceState;android.app.cts.ActivityGroupTest#testTabBasic;android.app.cts.ServiceTest#testAndroidTestCaseSetupProperly;android.app.cts.PendingIntentTest#testSendWithParamContextIntIntentOnFinishedHandler;android.app.backup.cts.BackupManagerTest#testBackupManager;android.app.cts.ActivityManagerRecentTaskInfoTest#testConstructor;android.app.cts.DialogTest#testOnWindowFocusChanged;android.app.cts.DialogTest#testGetCurrentFocus;android.app.cts.TabActivityTest#testChildTitleCallback;android.app.cts.DialogTest#testSetOnDismissListener_listener;android.app.cts.ServiceTest#testLocalStartAction;android.app.cts.AlertDialog_BuilderTest#testSetMultiChoiceItemsWithParamInt;android.app.cts.DialogTest#testGetLayoutInflater;android.app.cts.InstrumentationTest#testInvokeContextMenuAction;android.app.cts.InstrumentationTest#testProfiling;android.app.cts.IntentServiceTest#testIntentServiceLifeCycle;android.app.cts.ProgressDialogTest#testAccessSecondaryProgress;android.app.cts.NotificationManagerTest#testAndroidTestCaseSetupProperly;android.app.backup.cts.BackupAgentTest#testAndroidTestCaseSetupProperly;android.app.cts.ActivityManagerTest#testGetProcessInErrorState;android.app.cts.SearchManagerTest#testStopSearch;android.app.cts.NotificationTest#testSetLatestEventInfo;android.app.cts.DialogTest#testSetCancellable_false;android.app.cts.PendingIntentTest#testSend;android.app.cts.LocalActivityManagerTest#testDispatchResume;android.app.cts.AlertDialog_BuilderTest#testSetViewCustom;android.app.cts.InstrumentationTest#testInvokeMenuActionSync;android.app.cts.DialogTest#testOnSaveInstanceState;android.app.cts.DialogTest#testOnKeyMultiple;android.app.cts.ActivityGroupTest#testTabScreen;android.app.cts.InstrumentationTest#testCallActivityOnSaveInstanceState;android.app.cts.ActivityManagerTest#testGetDeviceConfigurationInfo;android.app.cts.NotificationTest#testWriteToParcel;android.app.cts.InstrumentationTest#testWaitForIdle;android.app.cts.InstrumentationTest#testCallActivityOnStop;android.app.cts.InstrumentationTest#testSendCharacterSync;android.app.cts.TimePickerDialogTest#testOnTimeChanged;android.app.cts.PendingIntentTest#testEquals;android.app.cts.AlertDialog_BuilderTest#testSetIconWithParamInt;android.app.cts.DialogTest#testContextMenu;android.app.cts.SystemFeaturesTest#testBluetoothFeature;android.app.cts.ExpandableListActivityTest#testView;android.app.cts.AlarmManagerTest#testSetRepeating;android.app.cts.ActivityManager_RunningServiceInfoTest#testReadFromParcel;android.app.cts.ServiceTest#testLocalBindActionPermissions;android.app.cts.LocalActivityManagerTest#testDispatchStop;android.app.cts.LauncherActivity_ListItemTest#testAndroidTestCaseSetupProperly;android.app.cts.InstrumentationTest#testNewApplication;android.app.cts.LaunchTest#testForwardResult;android.app.cts.ProgressDialogTest#testSetMessage;android.app.cts.ActivityManagerTest#testGetRunningServices;android.app.cts.AlertDialogTest#testCustomAlertDialogView;android.app.backup.cts.SharedPreferencesBackupHelperTest#testConstructor;android.app.cts.LifecycleTest#testTabBasic;android.app.cts.FragmentTest#testInstantiateFragment;android.app.cts.ActivityManager_RunningAppProcessInfoTest#testRunningAppProcessInfo;android.app.cts.AlertDialogTest#testAlertDialogNotCancelable;android.app.cts.AlertDialog_BuilderTest#testSetItemsWithParamCharSequence;android.app.cts.ActivityManagerProcessErrorStateInfoTest#testDescribeContents;android.app.cts.DialogTest#testConstructor_protectedNotCancellable;android.app.cts.ExpandableListActivityTest#testSelect;android.app.cts.SystemFeaturesTest#testScreenFeatures;android.app.cts.LauncherActivityTest#testLaunchActivity;android.app.cts.LaunchTest#testAndroidTestCaseSetupProperly;android.app.cts.LifecycleTest#testAndroidTestCaseSetupProperly;android.app.cts.NotificationTest#testDescribeContents;android.app.cts.DialogTest#testOnWindowAttributesChanged;android.app.cts.ServiceTest#testLocalBindAutoActionPermissionGranted;android.app.cts.InstrumentationTest#testCallActivityOnPostCreate;android.app.cts.AlertDialogTest#testAlertDialogDeprecatedAPIWithMessage;android.app.cts.AlertDialog_BuilderTest#testSetPositiveButtonWithParamCharSequence;android.app.cts.AlarmManagerTest#testAndroidTestCaseSetupProperly;android.app.cts.AlertDialog_BuilderTest#testSetView;android.app.cts.ActivityManager_RunningServiceInfoTest#testConstructor;android.app.cts.InstrumentationTest#testPerformanceSnapshot;android.app.cts.InstrumentationTest#testCallApplicationOnCreate;android.app.cts.DialogTest#testSetFeatureDrawable;android.app.cts.AliasActivityTest#testAndroidTestCaseSetupProperly;android.app.cts.PendingIntentTest#testGetService;android.app.cts.IntentServiceTest#testIntents;android.app.cts.AlertDialog_BuilderTest#testSetOnItemSelectedListener;android.app.cts.LifecycleTest#testDialog;android.app.cts.DownloadManagerTest#testDownloadManagerDestination;android.app.cts.WallpaperManagerTest#testAndroidTestCaseSetupProperly;android.app.cts.ExpandableListActivityTest#testAndroidTestCaseSetupProperly;android.app.cts.InstrumentationTest#testNewActivity;android.app.cts.ProgressDialogTest#testSetProgressDrawable;android.app.backup.cts.BackupManagerTest#testAndroidTestCaseSetupProperly;android.app.cts.InstrumentationTest#testAllocCounting;android.app.cts.LocalActivityManagerTest#testRemoveAllActivities;android.app.cts.ServiceTest#testLocalBindAutoClass;android.app.backup.cts.BackupAgentHelperTest#testBackupAgentHelper;android.app.cts.ActivityManagerProcessErrorStateInfoTest#testReadFromParcel;android.app.cts.PendingIntent_CanceledExceptionTest#testAndroidTestCaseSetupProperly;android.app.cts.TimePickerDialogTest#testOnClick;android.app.cts.AlertDialog_BuilderTest#testSetOnKeyListener;android.app.cts.DialogTest#testTouchEvent;android.app.cts.ProgressDialogTest#testProgressDialog1;android.app.cts.InstrumentationTest#testCallActivityOnRestoreInstanceState;android.app.cts.ProgressDialogTest#testProgressDialog2;android.app.cts.InstrumentationTest#testCallActivityOnPause;android.app.cts.AlertDialog_BuilderTest#testSetMultiChoiceItemsWithParamCharSequence;android.app.cts.SystemFeaturesTest#testCameraFeatures;android.app.cts.ServiceTest#testLocalBindClassPermissions;android.app.cts.ActivityManagerTest#testGetRecentTasks;android.app.cts.SystemFeaturesTest#testNfcFeatures;android.app.cts.AlertDialogTest#testCustomAlertDialog;android.app.cts.SystemFeaturesTest#testSipFeatures;android.app.cts.InstrumentationTest#testSendStringSync;android.app.cts.ActivityManagerRunningTaskInfoTest#testAndroidTestCaseSetupProperly;android.app.cts.TabActivityTest#testTabActivity;android.app.cts.KeyguardManagerTest#testNewKeyguardLock;android.app.cts.NotificationManagerTest#testCancel;android.app.cts.AlertDialog_BuilderTest#testSetMultiChoiceItemsWithParamCursor;android.app.cts.ActivityManagerMemoryClassTest#testGetMemoryClass;android.app.cts.ActivityManagerTest#testGetRunningAppProcesses;android.app.cts.AlertDialog_BuilderTest#testSetAdapter;android.app.cts.AlertDialog_BuilderTest#testSetItemsWithParamInt;android.app.cts.DialogTest#testCancel_noListener;android.app.cts.DialogTest#testDispatchKeyEvent;android.app.cts.LaunchTest#testLocalScreen;android.app.cts.ActivityManagerTest#testRestartPackage;android.app.cts.FragmentTest#testAndroidTestCaseSetupProperly;android.app.cts.InstrumentationTest#testCallActivityOnNewIntent;android.app.cts.NotificationManagerTest#testNotify;android.app.cts.LocalActivityManagerTest#testDispatchPauseTrue;android.app.cts.ActivityManagerProcessErrorStateInfoTest#testAndroidTestCaseSetupProperly;android.app.backup.cts.BackupAgentHelperTest#testAndroidTestCaseSetupProperly;android.app.cts.ProgressDialogTest#testSetIndeterminateDrawable;android.app.backup.cts.SharedPreferencesBackupHelperTest#testAndroidTestCaseSetupProperly;android.app.cts.DownloadManagerTest#testMinimumDownload;android.app.cts.PendingIntentTest#testReadAndWritePendingIntentOrNullToParcel;android.app.cts.DialogTest#testSetOnDismissListener_noListener;android.app.cts.KeyguardManagerTest#testExitKeyguardSecurely;android.app.cts.AlertDialog_BuilderTest#testSetNegativeButtonWithParamCharSequence;android.app.cts.DialogTest#testSetCancelable_true;android.app.cts.Instrumentation_ActivityMonitorTest#testActivityMonitor;android.app.cts.LocalActivityManagerTest#testStartActivity;android.app.cts.IntentServiceTest#testAndroidTestCaseSetupProperly;android.app.cts.ActionBarTest#testAddTab;android.app.cts.DialogTest#testSetCancelMessage;android.app.cts.TimePickerDialogTest#testSaveInstanceState" />
+  <Entry uri="android.hardware" exclude="android.hardware.consumerir.cts.ConsumerIrTest#test_hasIrEmitter;android.hardware.consumerir.cts.ConsumerIrTest#test_getCarrierFrequencies;android.hardware.consumerir.cts.ConsumerIrTest#test_transmit;android.hardware.camera2.cts.CameraDeviceTest#testCameraDeviceCaptureBurst;android.hardware.camera2.cts.CameraDeviceTest#testCameraDeviceRepeatingBurst;android.hardware.cts.CameraGLTest#testSetPreviewTextureTextureCallback;android.hardware.cts.CameraTest#test3ALockInteraction;android.hardware.cts.CameraTest#testAutoExposureLock;android.hardware.cts.CameraTest#testAutoWhiteBalanceLock;android.hardware.cts.CameraTest#testCancelAutofocus;android.hardware.cts.CameraTest#testDisplayOrientation;android.hardware.cts.CameraTest#testEnableShutterSound;android.hardware.cts.CameraTest#testFaceDetection;android.hardware.cts.CameraTest#testFocusAreas;android.hardware.cts.CameraTest#testFocusDistances;android.hardware.cts.CameraTest#testGetParameterDuringFocus;android.hardware.cts.CameraTest#testInvalidParameters;android.hardware.cts.CameraTest#testJpegCallbackStartPreview;android.hardware.cts.CameraTest#testJpegExif;android.hardware.cts.CameraTest#testJpegThumbnailSize;android.hardware.cts.CameraTest#testLockUnlock;android.hardware.cts.CameraTest#testMeteringAreas;android.hardware.cts.CameraTest#testMultiCameraRelease;android.hardware.cts.CameraTest#testMultipleCameras;android.hardware.cts.CameraTest#testParameters;android.hardware.cts.CameraTest#testPreviewCallbackWithBuffer;android.hardware.cts.CameraTest#testPreviewCallbackWithPicture;android.hardware.cts.CameraTest#testPreviewFormats;android.hardware.cts.CameraTest#testPreviewFpsRange;android.hardware.cts.CameraTest#testPreviewPictureSizesCombination;android.hardware.cts.CameraTest#testRecordingHint;android.hardware.cts.CameraTest#testSceneMode;android.hardware.cts.CameraTest#testSetOneShotPreviewCallback;android.hardware.cts.CameraTest#testSetPreviewDisplay;android.hardware.cts.CameraTest#testTakePicture;android.hardware.camera2.cts.ImageReaderTest#testImageReaderInvalidAccessTest;android.hardware.cts.SensorAccelerometerTest#testEventJittering;android.hardware.cts.SensorGyroscopeTest#testEventsArriveInOrder;android.hardware.camera2.cts.CameraCharacteristicsTest#testCameraCharacteristicsAndroidScalerAvailableJpegSizes;android.hardware.cts.SensorAccelerometerTest#testCanReceiveBatchEvents;android.hardware.camera2.cts.CameraCharacteristicsTest#testCameraCharacteristicsAndroidSensorOrientation;android.hardware.camera2.cts.CameraCharacteristicsTest#testAndroidTestCaseSetupProperly;android.hardware.cts.SensorMagneticFieldTest#testUpdateRate;android.hardware.cts.SensorAccelerometerTest#testNotTriggerSensor;android.hardware.cts.SensorAccelerometerTest#testAndroidTestCaseSetupProperly;android.hardware.cts.SensorAccelerometerTest#testCanReceiveEvents;android.hardware.cts.SensorMagneticFieldTest#testVarianceWhileStatic;android.hardware.camera2.cts.CameraCharacteristicsTest#testCameraCharacteristicsAndroidLensInfoHyperfocalDistance;android.hardware.camera2.cts.CameraManagerTest#testCameraManagerOpenCamerasSerially;android.hardware.camera2.cts.CameraDeviceTest#testCameraDeviceCreateCaptureBuilder;android.hardware.camera2.cts.CameraCharacteristicsTest#testCameraCharacteristicsAndroidScalerAvailableProcessedMinDurations;android.hardware.camera2.cts.CameraCharacteristicsTest#testCameraCharacteristicsAndroidFlashInfoAvailable;android.hardware.camera2.cts.CameraCharacteristicsTest#testCameraCharacteristicsAndroidLensInfoShadingMapSize;android.hardware.cts.LowRamDeviceTest#testAndroidTestCaseSetupProperly;android.hardware.cts.SensorTest#testSensorOperations;android.hardware.camera2.cts.CameraCharacteristicsTest#testCameraCharacteristicsAndroidControlAwbAvailableModes;android.hardware.camera2.cts.CameraCharacteristicsTest#testCameraCharacteristicsAndroidSensorBaseGainFactor;android.hardware.camera2.cts.CameraCharacteristicsTest#testCameraCharacteristicsAndroidSensorInfoPhysicalSize;android.hardware.camera2.cts.CameraCharacteristicsTest#testCameraCharacteristicsAndroidInfoSupportedHardwareLevel;android.hardware.camera2.cts.CameraCharacteristicsTest#testCameraCharacteristicsAndroidJpegAvailableThumbnailSizes;android.hardware.cts.SensorGyroscopeTest#testNotTriggerSensor;android.hardware.camera2.cts.CameraCharacteristicsTest#testCameraCharacteristicsAndroidLensFacing;android.hardware.cts.Camera_ParametersTest#testAccessMethods;android.hardware.cts.SensorMagneticFieldTest#testCanRegisterListener;android.hardware.camera2.cts.CameraCharacteristicsTest#testCameraCharacteristicsAndroidScalerAvailableFormats;android.hardware.cts.SensorTest#testBatchAndFlush;android.hardware.cts.SensorGyroscopeTest#testAndroidTestCaseSetupProperly;android.hardware.cts.SensorMagneticFieldTest#testCanReceiveEvents;android.hardware.camera2.cts.CameraCharacteristicsTest#testCameraCharacteristicsAndroidControlAvailableEffects;android.hardware.camera2.cts.CameraManagerTest#testAndroidTestCaseSetupProperly;android.hardware.cts.SensorGyroscopeTest#testSeveralClientsBatching;android.hardware.camera2.cts.CameraCharacteristicsTest#testCameraCharacteristicsAndroidControlAeAvailableAntibandingModes;android.hardware.cts.GeomagneticFieldTest#testAndroidTestCaseSetupProperly;android.hardware.cts.SensorAccelerometerTest#testStartStopRepeatedly;android.hardware.camera2.cts.CameraCharacteristicsTest#testCameraCharacteristicsAndroidControlAfAvailableModes;android.hardware.camera2.cts.CameraCharacteristicsTest#testCameraCharacteristicsAndroidSensorMaxAnalogSensitivity;android.hardware.cts.SensorTest#testRequestTriggerWithNonTriggerSensor;android.hardware.cts.SensorMagneticFieldTest#testBatchEventsArriveInOrder;android.hardware.camera2.cts.CameraCharacteristicsTest#testCameraCharacteristicsAndroidLensInfoMinimumFocusDistance;android.hardware.cts.SensorTest#testValuesForAllSensors;android.hardware.cts.SensorMagneticFieldTest#testCanReceiveBatchEvents;android.hardware.cts.SensorAccelerometerTest#testUpdateRate;android.hardware.cts.SensorMagneticFieldTest#testStartStopRepeatedly;android.hardware.camera2.cts.CameraCharacteristicsTest#testCameraCharacteristicsAndroidControlMaxRegions;android.hardware.cts.SensorMagneticFieldTest#testAndroidTestCaseSetupProperly;android.hardware.camera2.cts.CameraCharacteristicsTest#testCameraCharacteristicsAndroidControlAeCompensationRange;android.hardware.camera2.cts.CameraCharacteristicsTest#testCameraCharacteristicsAndroidRequestMaxNumOutputStreams;android.hardware.camera2.cts.CameraCharacteristicsTest#testCameraCharacteristicsAndroidSensorInfoSensitivityRange;android.hardware.cts.SensorMagneticFieldTest#testNotTriggerSensor;android.hardware.cts.SensorGyroscopeTest#testBatchEventsArriveInOrder;android.hardware.camera2.cts.CameraManagerTest#testCameraManagerInvalidDevice;android.hardware.cts.LowRamDeviceTest#testLowRamProductProperty;android.hardware.cts.SensorTest#testCancelTriggerWithNonTriggerSensor;android.hardware.cts.SensorMagneticFieldTest#testEventsArriveInOrder;android.hardware.cts.SensorMagneticFieldTest#testMaxFrequency;android.hardware.cts.SensorAccelerometerTest#testSeveralClientsBatching;android.hardware.cts.SensorMagneticFieldTest#testEventJittering;android.hardware.cts.SensorGyroscopeTest#testEventValidity;android.hardware.camera2.cts.ImageReaderTest#testImageReaderFromCameraRaw;android.hardware.camera2.cts.CameraCharacteristicsTest#testCameraCharacteristicsAndroidControlAeCompensationStep;android.hardware.cts.SensorMagneticFieldTest#testSeveralClientsBatching;android.hardware.camera2.cts.CameraManagerTest#testCameraManagerGetCameraCharacteristics;android.hardware.cts.SensorAccelerometerTest#testCanRegisterListener;android.hardware.camera2.cts.ImageReaderTest#testImageReaderFromCameraFlexibleYuv;android.hardware.camera2.cts.CameraCharacteristicsTest#testCameraCharacteristicsAndroidControlAvailableVideoStabilizationModes;android.hardware.cts.SensorGyroscopeTest#testStartStopRepeatedly;android.hardware.cts.SensorAccelerometerTest#testEventsArriveInOrder;android.hardware.cts.SensorMagneticFieldTest#testRegisterForBatchingZeroReport;android.hardware.cts.SensorGyroscopeTest#testCanRegisterListener;android.hardware.cts.SensorGyroscopeTest#testMaxFrequency;android.hardware.camera2.cts.CameraCharacteristicsTest#testCameraCharacteristicsAndroidScalerAvailableProcessedSizes;android.hardware.camera2.cts.CameraCharacteristicsTest#testCameraCharacteristicsAndroidControlAeAvailableTargetFpsRanges;android.hardware.camera2.cts.CameraCharacteristicsTest#testCameraCharacteristicsAndroidTonemapMaxCurvePoints;android.hardware.cts.SensorGyroscopeTest#testCanReceiveEvents;android.hardware.cts.SensorTest#testRegisterTwiceWithSameSensor;android.hardware.camera2.cts.CameraCharacteristicsTest#testCameraCharacteristicsAndroidLensInfoAvailableOpticalStabilization;android.hardware.camera2.cts.ImageReaderTest#testAndroidTestCaseSetupProperly;android.hardware.cts.SensorMagneticFieldTest#testSeveralClients;android.hardware.camera2.cts.CameraManagerTest#testCameraManagerOpenCameraTwice;android.hardware.cts.SensorMagneticFieldTest#testStartStopBatchingRepeatedly;android.hardware.camera2.cts.CameraCharacteristicsTest#testCameraCharacteristicsAndroidScalerAvailableMaxDigitalZoom;android.hardware.cts.SensorAccelerometerTest#testBatchEventsArriveInOrder;android.hardware.camera2.cts.CameraDeviceTest#testAndroidTestCaseSetupProperly;android.hardware.cts.SensorAccelerometerTest#testRegisterForBatchingZeroReport;android.hardware.camera2.cts.CameraCharacteristicsTest#testCameraCharacteristicsAndroidStatisticsInfoMaxFaceCount;android.hardware.camera2.cts.CameraCharacteristicsTest#testCameraCharacteristicsAndroidControlAvailableSceneModes;android.hardware.camera2.cts.CameraCharacteristicsTest#testCameraCharacteristicsAndroidSensorInfoActiveArraySize;android.hardware.camera2.cts.CameraCharacteristicsTest#testCameraCharacteristicsAndroidSensorInfoMaxFrameDuration;android.hardware.cts.SensorAccelerometerTest#testStartStopBatchingRepeatedly;android.hardware.cts.SensorGyroscopeTest#testEventJittering;android.hardware.camera2.cts.CameraDeviceTest#testCameraDeviceCapture;android.hardware.camera2.cts.CameraCharacteristicsTest#testCameraCharacteristicsAndroidSensorInfoExposureTimeRange;android.hardware.camera2.cts.CameraCharacteristicsTest#testCameraCharacteristicsAndroidLensInfoAvailableFocalLengths;android.hardware.cts.SensorGyroscopeTest#testCanReceiveBatchEvents;android.hardware.cts.SensorTest#testLegacySensorOperations;android.hardware.camera2.cts.CameraManagerTest#testCameraManagerListener;android.hardware.cts.GeomagneticFieldTest#testGeomagneticField;android.hardware.cts.SensorGyroscopeTest#testSeveralClients;android.hardware.cts.SensorGyroscopeTest#testStartStopBatchingRepeatedly;android.hardware.camera2.cts.CameraCharacteristicsTest#testCameraCharacteristicsAndroidLensInfoAvailableFilterDensities;android.hardware.camera2.cts.CameraDeviceTest#testCameraDeviceSetErrorListener;android.hardware.cts.SensorGyroscopeTest#testRegisterForBatchingZeroReport;android.hardware.camera2.cts.CameraManagerTest#testCameraManagerGetDeviceIdList;android.hardware.cts.SensorAccelerometerTest#testMaxFrequency;android.hardware.camera2.cts.CameraManagerTest#testCameraManagerOpenAllCameras;android.hardware.cts.SensorAccelerometerTest#testSeveralClients;android.hardware.cts.SensorGyroscopeTest#testVarianceWhileStatic;android.hardware.camera2.cts.CameraCharacteristicsTest#testCameraCharacteristicsAndroidScalerAvailableJpegMinDurations;android.hardware.cts.SensorTest#testAndroidTestCaseSetupProperly;android.hardware.camera2.cts.CameraCharacteristicsTest#testCameraCharacteristicsAndroidStatisticsInfoAvailableFaceDetectModes;android.hardware.camera2.cts.CameraCharacteristicsTest#testCameraCharacteristicsAndroidLensInfoAvailableApertures;android.hardware.cts.SensorAccelerometerTest#testEventValidity;android.hardware.cts.SensorAccelerometerTest#testUpdateBatchRate;android.hardware.cts.SensorAccelerometerTest#testVarianceWhileStatic;android.hardware.cts.SensorGyroscopeTest#testUpdateBatchRate;android.hardware.cts.SensorGyroscopeTest#testUpdateRate;android.hardware.cts.SensorMagneticFieldTest#testEventValidity;android.hardware.cts.SensorMagneticFieldTest#testUpdateBatchRate;android.hardware.cts.SensorTest#testRegisterWithTriggerSensor;android.hardware.cts.Camera_SizeTest#testConstructor" />
+  <Entry uri="android.net" exclude="android.net.cts.ConnectivityManagerTest#testStartUsingNetworkFeature_enableHipri;android.net.wifi.cts.ScanResultTest#testScanResultProperties;android.net.wifi.cts.WifiManagerTest#testWifiManagerActions;android.net.cts.UriTest#testStringUri;android.net.cts.UrlQuerySanitizer_IllegalCharacterValueSanitizerTest#testAndroidTestCaseSetupProperly;android.net.rtp.cts.AudioGroupTest#testAdd;android.net.rtp.cts.AudioGroupTest#testAndroidTestCaseSetupProperly;android.net.rtp.cts.AudioGroupTest#testRemove;android.net.cts.LocalSocketTest#testAccessors;android.net.http.cts.SslErrorTest#testConstructorIgnoresInvalidValues;android.net.cts.UriTest#testCompareTo;android.net.http.cts.SslErrorTest#testAddErrorIgnoresInvalidValues;android.net.cts.VpnServiceTest#testProtect_DatagramSocket;android.net.wifi.cts.WifiConfigurationTest#testAndroidTestCaseSetupProperly;android.net.rtp.cts.AudioCodecTest#testGetCodecs;android.net.http.cts.ApacheHttpClientTest#testExecute_withWifi;android.net.cts.DnsTest#testAndroidTestCaseSetupProperly;android.net.cts.VpnServiceTest#testAndroidTestCaseSetupProperly;android.net.wifi.cts.SupplicantStateTest#testAndroidTestCaseSetupProperly;android.net.cts.NetworkInfo_StateTest#testValues;android.net.cts.UriTest#testAndroidTestCaseSetupProperly;android.net.cts.LocalSocketTest#testLocalConnections;android.net.wifi.cts.WifiManager_WifiLockTest#testAndroidTestCaseSetupProperly;android.net.wifi.cts.WifiManagerTest#testWifiManagerNetWork;android.net.cts.ConnectivityManagerTest#testGetAllNetworkInfo;android.net.rtp.cts.AudioGroupTest#testTraffic;android.net.cts.Uri_BuilderTest#testBuilderOperations;android.net.cts.UriTest#testBuildUpon;android.net.cts.TrafficStatsTest#testAndroidTestCaseSetupProperly;android.net.wifi.cts.ScanResultTest#testAndroidTestCaseSetupProperly;android.net.cts.ProxyTest#testConstructor;android.net.rtp.cts.AudioCodecTest#testGetCodec;android.net.wifi.cts.NsdManagerTest#testAndroidTestCaseSetupProperly;android.net.cts.DhcpInfoTest#testConstructor;android.net.cts.LocalSocketAddress_NamespaceTest#testValues;android.net.cts.ConnectivityManagerTest#testRequestRouteToHost;android.net.cts.ConnectivityManagerTest#testSetNetworkPreference;android.net.http.cts.SslCertificateTest#testState;android.net.cts.NetworkInfo_DetailedStateTest#testAndroidTestCaseSetupProperly;android.net.rtp.cts.AudioCodecTest#testConstants;android.net.http.cts.SslCertificateTest#testSslCertificate;android.net.cts.ProxyTest#testAccessProperties;android.net.cts.CredentialsTest#testCredentials;android.net.rtp.cts.AudioStreamTest#testDoubleRelease;android.net.cts.TrafficStatsTest#testValidMobileStats;android.net.http.cts.SslErrorTest#testGetUrlWithDeprecatedConstructor;android.net.cts.VpnServiceTest#testProtect_int;android.net.cts.ConnectivityManagerTest#testGetNetworkInfo;android.net.cts.MailToTest#testAndroidTestCaseSetupProperly;android.net.cts.LocalSocketTest#testAndroidTestCaseSetupProperly;android.net.cts.LocalSocketAddress_NamespaceTest#testAndroidTestCaseSetupProperly;android.net.cts.NetworkInfo_DetailedStateTest#testValueOf;android.net.cts.DhcpInfoTest#testAndroidTestCaseSetupProperly;android.net.cts.UriTest#testPathOperations;android.net.rtp.cts.AudioStreamTest#testAndroidTestCaseSetupProperly;android.net.http.cts.SslCertificate_DNameTest#testDName;android.net.wifi.cts.WifiManagerTest#testSignal;android.net.cts.UrlQuerySanitizerTest#testUrlQuerySanitizer;android.net.wifi.cts.WifiManager_WifiLockTest#testWifiLock;android.net.rtp.cts.AudioStreamTest#testSetCodec;android.net.cts.MailToTest#testParseMailToURI;android.net.cts.UriTest#testParcelling;android.net.cts.UrlQuerySanitizerTest#testAndroidTestCaseSetupProperly;android.net.wifi.cts.WifiConfigurationTest#testWifiConfiguration;android.net.cts.NetworkInfoTest#testAccessNetworkInfoProperties;android.net.cts.ConnectivityManagerTest#testTest;android.net.http.cts.SslErrorTest#testGetPrimaryError;android.net.cts.NetworkInfo_StateTest#testValueOf;android.net.cts.UriTest#testFromFile;android.net.cts.VpnServiceTest#testTunDevice;android.net.rtp.cts.AudioStreamTest#testSetDtmfType;android.net.cts.SSLCertificateSocketFactoryTest#testAndroidTestCaseSetupProperly;android.net.http.cts.SslCertificateTest#testConstructor;android.net.http.cts.SslErrorTest#testAddError;android.net.cts.UriTest#testNormalizeScheme;android.net.wifi.cts.WifiInfoTest#testAndroidTestCaseSetupProperly;android.net.cts.ConnectivityManagerTest#testStartUsingNetworkFeature;android.net.cts.UriTest#testHierarchicalUris;android.net.cts.DhcpInfoTest#testToString;android.net.rtp.cts.AudioStreamTest#testV6Stream;android.net.cts.LocalSocketAddressTest#testAndroidTestCaseSetupProperly;android.net.cts.UrlQuerySanitizer_IllegalCharacterValueSanitizerTest#testSanitize;android.net.rtp.cts.AudioStreamTest#testV4Stream;android.net.wifi.cts.ConcurrencyTest#testConcurrency;android.net.cts.LocalSocketAddress_NamespaceTest#testValueOf;android.net.wifi.cts.WifiManagerTest#testWifiWatchdog;android.net.cts.UriTest#testEqualsAndHashCode;android.net.cts.VpnServiceTest#testPrepare;android.net.cts.UriTest#testOpaqueUri;android.net.cts.UriTest#testQueryParameters;android.net.cts.TrafficStatsTest#testThreadStatsTag;android.net.wifi.cts.SupplicantStateTest#testIsValidState;android.net.http.cts.SslErrorTest#testHasError;android.net.cts.SSLCertificateSocketFactoryTest#testAccessProperties;android.net.cts.VpnServiceTest#testEstablish;android.net.ipv6.cts.PingTest#testAndroidTestCaseSetupProperly;android.net.cts.NetworkInfoTest#testAndroidTestCaseSetupProperly;android.net.cts.ConnectivityManagerTest#testAndroidTestCaseSetupProperly;android.net.cts.UriTest#testEncodeAndDecode;android.net.rtp.cts.AudioGroupTest#testClear;android.net.cts.NetworkInfo_StateTest#testAndroidTestCaseSetupProperly;android.net.cts.UrlQuerySanitizer_ParameterValuePairTest#testAndroidTestCaseSetupProperly;android.net.cts.ProxyTest#testAndroidTestCaseSetupProperly;android.net.cts.LocalServerSocketTest#testLocalServerSocket;android.net.cts.CredentialsTest#testAndroidTestCaseSetupProperly;android.net.rtp.cts.AudioCodecTest#testAndroidTestCaseSetupProperly;android.net.cts.UrlQuerySanitizer_ParameterValuePairTest#testConstructor;android.net.cts.NetworkInfo_DetailedStateTest#testValues;android.net.http.cts.SslErrorTest#testGetPrimaryErrorWithEmptySet;android.net.rtp.cts.AudioGroupTest#testSetMode;android.net.wifi.cts.WifiInfoTest#testWifiInfoProperties;android.net.wifi.cts.ConcurrencyTest#testAndroidTestCaseSetupProperly;android.net.http.cts.ApacheHttpClientTest#testAndroidTestCaseSetupProperly;android.net.wifi.cts.WifiManagerTest#testWifiManagerProperties;android.net.rtp.cts.AudioGroupTest#testDoubleClear;android.net.wifi.cts.WifiManagerTest#testAndroidTestCaseSetupProperly;android.net.cts.ConnectivityManagerTest#testGetActiveNetworkInfo;android.net.cts.LocalSocketAddressTest#testNewLocalSocketAddressWithDefaultNamespace;android.net.http.cts.SslErrorTest#testGetUrl;android.net.ipv6.cts.PingTest#testLoopbackPing;android.net.cts.TrafficStatsTest#testValidTotalStats;android.net.wifi.cts.WifiEnterpriseConfigTest#testAddEapNetwork;android.net.cts.VpnServiceTest#testProtect_Socket;android.net.wifi.cts.WifiEnterpriseConfigTest#testAndroidTestCaseSetupProperly;android.net.cts.ConnectivityManagerTest#testIsNetworkTypeValid;android.net.cts.ConnectivityManagerTest#testIsNetworkSupported;android.net.cts.LocalServerSocketTest#testAndroidTestCaseSetupProperly;android.net.wifi.cts.WifiEnterpriseConfigTest#testSettersAndGetters;android.net.http.cts.ApacheHttpClientTest#testExecute_withMobile" />
+  <Entry uri="android.webkit" exclude="android.webkit.cts.WebViewTest#testDocumentHasImages;android.webkit.cts.WebViewTest#testScrollBarOverlay;android.webkit.cts.WebViewTest#testGoBackAndForward;android.webkit.cts.WebViewTest#testGetContentHeight;android.webkit.cts.WebChromeClientTest#testOnJsConfirm;android.webkit.cts.WebChromeClientTest#testOnProgressChanged;android.webkit.cts.WebViewTest#testAddJavascriptInterfaceNullObject;android.webkit.cts.WebViewTest#testConstructor;android.webkit.cts.WebViewTest#testInvokeZoomPicker;android.webkit.cts.WebSettingsTest#testAccessMinimumLogicalFontSize;android.webkit.cts.WebViewStartupTest#testCookieManagerBlockingUiThread;android.webkit.cts.WebViewTest#testInternals;android.webkit.cts.WebViewClientTest#testShouldOverrideUrlLoading;android.webkit.cts.GeolocationTest#testSimpleGeolocationRequestAcceptOnce;android.webkit.cts.WebSettingsTest#testDatabaseDisabled;android.webkit.cts.WebView_WebViewTransportTest#testAccessWebView;android.webkit.cts.WebSettingsTest#testAccessJavaScriptCanOpenWindowsAutomatically;android.webkit.cts.WebSettingsTest#testAppCacheEnabled;android.webkit.cts.WebSettingsTest#testAccessUserAgentString;android.webkit.cts.WebViewTest#testClearHistory;android.webkit.cts.UrlInterceptRegistryTest#testRegisterHandler;android.webkit.cts.WebSettingsTest#testAccessSerifFontFamily;android.webkit.cts.WebSettingsTest#testAccessLayoutAlgorithm;android.webkit.cts.WebSettingsTest#testAccessFantasyFontFamily;android.webkit.cts.WebViewTest#testAddJavascriptInterface;android.webkit.cts.WebSettingsTest#testAccessCacheMode;android.webkit.cts.WebViewTest#testDebugDump;android.webkit.cts.WebViewTest#testSslErrorProceedResponseNotReusedForDifferentHost;android.webkit.cts.WebSettingsTest#testLocalImageLoads;android.webkit.cts.WebViewTest#testSslErrorProceedResponseReusedForSameHost;android.webkit.cts.HttpAuthHandlerTest#testUseHttpAuthUsernamePassword;android.webkit.cts.WebViewTest#testSetLayoutParams;android.webkit.cts.WebViewTest#testAppInjectedXRequestedWithHeaderIsNotOverwritten;android.webkit.cts.WebSettingsTest#testAccessUseDoubleTree;android.webkit.cts.WebViewTest#testOnReceivedSslErrorCancel;android.webkit.cts.URLUtilTest#testIsHttpUrl;android.webkit.cts.DateSorterTest#testConstants;android.webkit.cts.WebSettingsTest#testAccessFixedFontFamily;android.webkit.cts.WebSettingsTest#testSetRenderPriority;android.webkit.cts.WebViewTest#testRemoveJavascriptInterface;android.webkit.cts.WebViewTest#testAndroidAssetAnchor;android.webkit.cts.WebViewTest#testOnReceivedSslError;android.webkit.cts.CookieTest#testEmptyValue;android.webkit.cts.WebViewTest#testPauseResumeTimers;android.webkit.cts.URLUtilTest#testIsContentUrl;android.webkit.cts.WebChromeClientTest#testBlockWindowsAsync;android.webkit.cts.WebViewTest#testGetVisibleTitleHeight;android.webkit.cts.WebBackForwardListTest#testClone;android.webkit.cts.WebSettingsTest#testAccessDefaultTextEncodingName;android.webkit.cts.URLUtilTest#testGuessUrl;android.webkit.cts.MimeTypeMapTest#testAndroidTestCaseSetupProperly;android.webkit.cts.WebChromeClientTest#testOnReceivedIcon;android.webkit.cts.CookieTest#testAndroidTestCaseSetupProperly;android.webkit.cts.CookieManagerTest#testRemoveCookies;android.webkit.cts.WebSettingsTest#testAccessPluginsPath;android.webkit.cts.WebSettingsTest#testAccessAllowFileAccess;android.webkit.cts.WebSettingsTest#testAccessSupportMultipleWindows;android.webkit.cts.WebViewTest#testAppCanInjectHeadersViaImmutableMap;android.webkit.cts.WebViewTest#testSecureSiteSetsCertificate;android.webkit.cts.WebViewTest#testSetWebViewClient;android.webkit.cts.WebViewTest#testSetScrollBarStyle;android.webkit.cts.CookieTest#testDomain;android.webkit.cts.WebViewTest#testZoom;android.webkit.cts.URLUtilTest#testIsDataUrl;android.webkit.cts.CookieManagerTest#testAcceptCookie;android.webkit.cts.WebChromeClientTest#testOnReceivedTitle;android.webkit.cts.URLUtilTest#testIsFileUrl;android.webkit.cts.WebSettingsTest#testAccessJavaScriptEnabled;android.webkit.cts.URLUtilTest#testIsNetworkUrl;android.webkit.cts.WebViewTest#testFindAddress;android.webkit.cts.WebViewTest#testSetNetworkAvailable;android.webkit.cts.WebViewTest#testClearSslPreferences;android.webkit.cts.URLUtilTest#testIsHttpsUrl;android.webkit.cts.MimeTypeMapTest#testGetFileExtensionFromUrl;android.webkit.cts.WebViewTest#testGetOriginalUrl;android.webkit.cts.WebChromeClientTest#testBlockWindowsSync;android.webkit.cts.WebViewTest#testLoadData;android.webkit.cts.WebViewTest#testInsecureSiteClearsCertificate;android.webkit.cts.WebBackForwardListTest#testGetCurrentItem;android.webkit.cts.URLUtilTest#testStripAnchor;android.webkit.cts.URLUtilTest#testGuessFileName;android.webkit.cts.URLUtilTest#testAndroidTestCaseSetupProperly;android.webkit.cts.WebViewTest#testEvaluateJavascript;android.webkit.cts.DateSorterTest#testConstructor;android.webkit.cts.WebViewTest#testPageScroll;android.webkit.cts.WebSettingsTest#testIframesWhenAccessFromFileURLsEnabled;android.webkit.cts.WebViewTest#testFlingScroll;android.webkit.cts.WebSettingsTest#testXHRWhenAccessFromFileURLsEnabled;android.webkit.cts.WebChromeClientTest#testOnJsPrompt;android.webkit.cts.WebSettingsTest#testAccessSupportZoom;android.webkit.cts.WebSettingsTest#testLoadsImagesAutomatically;android.webkit.cts.URLUtilTest#testIsValidUrl;android.webkit.cts.WebViewTest#testRequestFocusNodeHref;android.webkit.cts.WebViewTest#testLoadDataWithBaseUrl;android.webkit.cts.WebChromeClientTest#testOnJsAlert;android.webkit.cts.WebSettingsTest#testAccessSansSerifFontFamily;android.webkit.cts.CookieManagerTest#testCookieManager;android.webkit.cts.WebViewTest#testSetMapTrackballToArrowKeys;android.webkit.cts.WebViewTest#testCreatingWebViewCreatesCookieSyncManager;android.webkit.cts.DateSorterTest#testGetIndex;android.webkit.cts.GeolocationTest#testGeolocationPermissions;android.webkit.cts.WebChromeClientTest#testOnJsBeforeUnload;android.webkit.cts.CookieManagerTest#testClone;android.webkit.cts.CookieManagerTest#testGetInstance;android.webkit.cts.WebViewTest#testGetZoomControls;android.webkit.cts.CookieTest#testSubDomain;android.webkit.cts.WebSettingsTest#testUserAgentString_default;android.webkit.cts.UrlInterceptRegistryTest#testGetSurrogate;android.webkit.cts.MimeTypeMapTest#testGetMimeTypeFromExtension;android.webkit.cts.WebSettingsTest#testBlockNetworkImage;android.webkit.cts.WebViewTest#testPlatformNotifications;android.webkit.cts.URLUtilTest#testIsAboutUrl;android.webkit.cts.WebViewTest#testSetPictureListener;android.webkit.cts.MimeTypeMapTest#testHasMimeType;android.webkit.cts.WebViewTest#testOnReceivedSslErrorProceed;android.webkit.cts.DateSorterTest#testGetLabel;android.webkit.cts.GeolocationTest#testSimpleGeolocationRequestAcceptAlways;android.webkit.cts.URLUtilTest#testDecode;android.webkit.cts.HttpAuthHandlerTest#testProceed;android.webkit.cts.WebSettingsTest#testSetNeedInitialFocus;android.webkit.cts.WebSettingsTest#testIframesWhenAccessFromFileURLsDisabled;android.webkit.cts.WebSettingsTest#testAccessCursiveFontFamily;android.webkit.cts.WebViewTest#testFindAll;android.webkit.cts.WebViewTest#testStopLoading;android.webkit.cts.DateSorterTest#testAndroidTestCaseSetupProperly;android.webkit.cts.WebSettingsTest#testAccessDefaultFixedFontSize;android.webkit.cts.CookieManagerTest#testb3167208;android.webkit.cts.WebSettingsTest#testAccessMinimumFontSize;android.webkit.cts.WebSettingsTest#testAccessUseWideViewPort;android.webkit.cts.WebSettingsTest#testAccessSaveFormData;android.webkit.cts.WebViewTest#testRequestChildRectangleOnScreen;android.webkit.cts.URLUtilTest#testIsJavaScriptUrl;android.webkit.cts.WebViewTest#testFindNext;android.webkit.cts.MimeTypeMapTest#testHasExtension;android.webkit.cts.WebViewTest#testSetDownloadListener;android.webkit.cts.WebSettingsTest#testXHRWhenAccessFromFileURLsDisabled;android.webkit.cts.WebViewTest#testDestroy;android.webkit.cts.MimeTypeMapTest#testGetSingleton;android.webkit.cts.WebViewTest#testAndroidAssetQueryParam;android.webkit.cts.WebViewTest#testAccessPluginList;android.webkit.cts.CookieTest#testPath;android.webkit.cts.WebViewTest#testAccessHttpAuthUsernamePassword;android.webkit.cts.WebViewTest#testUseRemovedJavascriptInterface;android.webkit.cts.WebSettingsTest#testAccessTextSize;android.webkit.cts.URLUtilTest#testIsAssetUrl;android.webkit.cts.CookieTest#testInvalidDomain;android.webkit.cts.CookieSyncManagerTest#testCookieSyncManager;android.webkit.cts.URLUtilTest#testComposeSearchUrl;android.webkit.cts.WebChromeClientTest#testWindows;android.webkit.cts.WebViewTest#testRequestImageRef;android.webkit.cts.UrlInterceptRegistryTest#testAndroidTestCaseSetupProperly;android.webkit.cts.WebSettingsTest#testAccessDefaultFontSize;android.webkit.cts.WebViewClientTest#testShouldOverrideKeyEvent;android.webkit.cts.WebHistoryItemTest#testWebHistoryItem;android.webkit.cts.WebSettingsTest#testAccessBuiltInZoomControls;android.webkit.cts.WebSettingsTest#testAppCacheDisabled;android.webkit.cts.WebViewTest#testSetWebChromeClient;android.webkit.cts.WebViewTest#testGetHitTestResult;android.webkit.cts.WebSettingsTest#testAccessStandardFontFamily;android.webkit.cts.GeolocationTest#testSimpleGeolocationRequestReject;android.webkit.cts.WebSettingsTest#testBlockNetworkLoads;android.webkit.cts.DateSorterTest#testGetBoundary;android.webkit.cts.WebViewTest#testCapturePicture;android.webkit.cts.WebSettingsTest#testAccessPluginsEnabled;android.webkit.cts.WebViewTest#testSaveAndRestoreState;android.webkit.cts.WebViewTest#testLoadUrl;android.webkit.cts.HttpAuthHandlerTest#testCancel;android.webkit.cts.URLUtilTest#testIsCookielessProxyUrl;android.webkit.cts.WebViewTest#testGetFavicon;android.webkit.cts.MimeTypeMapTest#testGetExtensionFromMimeType" />
 </TestPlan>
diff --git a/tests/plans/CTS-stable.xml b/tests/plans/CTS-stable.xml
index 984d709..968f71d 100644
--- a/tests/plans/CTS-stable.xml
+++ b/tests/plans/CTS-stable.xml
@@ -7,11 +7,13 @@
   <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.app" exclude="android.app.cts.ActivityManagerTest#testIsRunningInTestHarness;android.app.cts.AlertDialogTest#testAlertDialogCancelable;android.app.cts.ExpandableListActivityTest#testCallback" />
+  <Entry uri="android.bionic"/>
   <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.conscrypt"/>
   <Entry uri="android.core.tests.libcore.package.dalvik"/>
   <Entry uri="android.core.tests.libcore.package.libcore"/>
   <Entry uri="android.core.tests.libcore.package.org"/>
@@ -29,18 +31,18 @@
   <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.hardware" exclude="android.hardware.camera2.cts.CameraDeviceTest#testCameraDeviceRepeatingRequest;android.hardware.camera2.cts.ImageReaderTest#testImageReaderFromCameraJpeg;android.hardware.cts.CameraGLTest#testCameraToSurfaceTextureMetadata;android.hardware.cts.CameraTest#testImmediateZoom;android.hardware.cts.CameraTest#testPreviewCallback;android.hardware.cts.CameraTest#testSmoothZoom;android.hardware.cts.CameraTest#testVideoSnapshot;android.hardware.cts.CameraGLTest#testSetPreviewTextureBothCallbacks;android.hardware.cts.CameraGLTest#testSetPreviewTexturePreviewCallback" />
   <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.media"/>
   <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.net" exclude="android.net.wifi.cts.ScanResultTest#testScanResultTimeStamp;android.net.cts.DnsTest#testDnsWorks;android.net.cts.TrafficStatsTest#testTrafficStatsForLocalhost;android.net.cts.SSLCertificateSocketFactoryTest#testCreateSocket;android.net.cts.SSLCertificateSocketFactoryTest#test_createSocket_bind;android.net.cts.SSLCertificateSocketFactoryTest#test_createSocket_simple;android.net.cts.SSLCertificateSocketFactoryTest#test_createSocket_wrapping" />
   <Entry uri="android.opengl"/>
   <Entry uri="android.openglperf"/>
   <Entry uri="android.os"/>
@@ -48,8 +50,10 @@
   <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.provider"/>

   <Entry uri="android.renderscript"/>
+  <Entry uri="android.rscpp"/>
+  <Entry uri="android.rsg"/>
   <Entry uri="android.sax"/>
   <Entry uri="android.security"/>
   <Entry uri="android.speech"/>
@@ -60,9 +64,20 @@
   <Entry uri="android.textureview"/>
   <Entry uri="android.theme"/>
   <Entry uri="android.uiautomator"/>
+  <Entry uri="android.usb"/>
   <Entry uri="android.util"/>
   <Entry uri="android.view"/>
-  <Entry uri="android.webkit"/>
+  <Entry uri="android.webkit" exclude="android.webkit.cts.WebViewClientTest#testDoUpdateVisitedHistory;android.webkit.cts.WebViewClientTest#testLoadPage;android.webkit.cts.WebViewClientTest#testOnFormResubmission;android.webkit.cts.WebViewClientTest#testOnReceivedError;android.webkit.cts.WebViewClientTest#testOnReceivedHttpAuthRequest;android.webkit.cts.WebViewClientTest#testOnScaleChanged;android.webkit.cts.WebViewClientTest#testOnUnhandledKeyEvent;android.webkit.cts.WebViewTest#testSetInitialScale" />
   <Entry uri="android.widget"/>
+  <Entry uri="com.android.pts.bootup"/>
+  <Entry uri="com.android.pts.browserbench"/>
+  <Entry uri="com.android.pts.dram"/>
+  <Entry uri="com.android.pts.filesystemperf"/>
+  <Entry uri="com.android.pts.jank.opengl"/>
+  <Entry uri="com.android.pts.opengl"/>
+  <Entry uri="com.android.pts.simplecpu"/>
+  <Entry uri="com.android.pts.ui"/>
+  <Entry uri="com.android.pts.uihost"/>
+  <Entry uri="com.android.pts.videoperf"/>
   <Entry uri="zzz.android.monkey"/>
 </TestPlan>
diff --git a/tests/tests/hardware/src/android/hardware/camera2/cts/CameraCaptureResultTest.java b/tests/tests/hardware/src/android/hardware/camera2/cts/CameraCaptureResultTest.java
new file mode 100644
index 0000000..6a708e3
--- /dev/null
+++ b/tests/tests/hardware/src/android/hardware/camera2/cts/CameraCaptureResultTest.java
@@ -0,0 +1,336 @@
+/*
+ * Copyright 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.hardware.camera2.cts;
+
+import android.content.Context;
+import android.graphics.ImageFormat;
+import android.hardware.camera2.CameraCharacteristics;
+import android.hardware.camera2.CameraDevice;
+import android.hardware.camera2.CameraManager;
+import android.hardware.camera2.CameraMetadata;
+import android.hardware.camera2.CaptureFailure;
+import android.hardware.camera2.CaptureRequest;
+import android.hardware.camera2.CaptureResult;
+import android.hardware.camera2.Size;
+import static android.hardware.camera2.cts.CameraTestUtils.*;
+import android.media.ImageReader;
+import android.os.Handler;
+import android.os.HandlerThread;
+import android.test.AndroidTestCase;
+import android.util.Log;
+import android.view.Surface;
+
+import com.android.ex.camera2.blocking.BlockingStateListener;
+import static com.android.ex.camera2.blocking.BlockingStateListener.*;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.LinkedBlockingQueue;
+import java.util.concurrent.TimeUnit;
+
+public class CameraCaptureResultTest extends AndroidTestCase {
+    private static final String TAG = "CameraCaptureResultTest";
+    private static final boolean VERBOSE = Log.isLoggable(TAG, Log.VERBOSE);
+
+    private CameraManager mCameraManager;
+    private HandlerThread mHandlerThread;
+    private Handler mHandler;
+    private ImageReader mImageReader;
+    private Surface mSurface;
+    private BlockingStateListener mCameraListener;
+
+    private static final int MAX_NUM_IMAGES = 5;
+    private static final int NUM_FRAMES_VERIFIED = 300;
+    private static final long WAIT_FOR_RESULT_TIMEOUT_MS = 3000;
+
+    // List that includes all public keys from CaptureResult
+    List<CameraMetadata.Key<?>> mAllKeys;
+
+    // List tracking the failed test keys.
+    List<CameraMetadata.Key<?>> mFailedKeys = new ArrayList<CameraMetadata.Key<?>>();
+
+    @Override
+    public void setContext(Context context) {
+        mAllKeys = getAllCaptureResultKeys();
+        super.setContext(context);
+    }
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+        mCameraManager = (CameraManager) mContext.getSystemService(Context.CAMERA_SERVICE);
+        assertNotNull("Can't connect to camera manager", mCameraManager);
+        mHandlerThread = new HandlerThread(TAG);
+        mHandlerThread.start();
+        mHandler = new Handler(mHandlerThread.getLooper());
+        mCameraListener = new BlockingStateListener();
+        mFailedKeys.clear();
+    }
+
+    @Override
+    protected void tearDown() throws Exception {
+        mHandlerThread.quitSafely();
+        super.tearDown();
+    }
+
+    public void testCameraCaptureResultAllKeys() throws Exception {
+        /**
+         * Hardcode a key waiver list for the keys we want to skip the sanity check.
+         * FIXME: We need get ride of this list, see bug 11116270.
+         */
+        List<CameraMetadata.Key<?>> waiverkeys = new ArrayList<CameraMetadata.Key<?>>();
+        waiverkeys.add(CaptureResult.EDGE_MODE);
+        waiverkeys.add(CaptureResult.JPEG_GPS_COORDINATES);
+        waiverkeys.add(CaptureResult.JPEG_GPS_PROCESSING_METHOD);
+        waiverkeys.add(CaptureResult.JPEG_GPS_TIMESTAMP);
+        waiverkeys.add(CaptureResult.JPEG_ORIENTATION);
+        waiverkeys.add(CaptureResult.JPEG_QUALITY);
+        waiverkeys.add(CaptureResult.JPEG_THUMBNAIL_QUALITY);
+        waiverkeys.add(CaptureResult.JPEG_THUMBNAIL_SIZE);
+        waiverkeys.add(CaptureResult.SENSOR_TEMPERATURE);
+        waiverkeys.add(CaptureResult.TONEMAP_CURVE_BLUE);
+        waiverkeys.add(CaptureResult.TONEMAP_CURVE_GREEN);
+        waiverkeys.add(CaptureResult.TONEMAP_CURVE_RED);
+        waiverkeys.add(CaptureResult.TONEMAP_MODE);
+        waiverkeys.add(CaptureResult.STATISTICS_PREDICTED_COLOR_GAINS);
+        waiverkeys.add(CaptureResult.STATISTICS_PREDICTED_COLOR_TRANSFORM);
+        waiverkeys.add(CaptureResult.STATISTICS_SCENE_FLICKER);
+
+        String[] ids = mCameraManager.getCameraIdList();
+        for (int i = 0; i < ids.length; i++) {
+            CameraCharacteristics props = mCameraManager.getCameraCharacteristics(ids[i]);
+            assertNotNull("CameraCharacteristics shouldn't be null", props);
+            Integer hwLevel = props.get(CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL);
+            if (hwLevel != CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL_FULL) {
+                continue;
+            }
+            // TODO: check for LIMITED keys
+
+            CameraDevice camera = null;
+            try {
+                Size[] sizes = CameraTestUtils.getSupportedSizeForFormat(
+                        ImageFormat.YUV_420_888, ids[i], mCameraManager);
+                CameraTestUtils.assertArrayNotEmpty(sizes, "Available sizes shouldn't be empty");
+                createDefaultSurface(sizes[0]);
+
+                if (VERBOSE) {
+                    Log.v(TAG, "Testing camera " + ids[i] + "for size " + sizes[0].toString());
+                }
+
+                camera = CameraTestUtils.openCamera(
+                        mCameraManager, ids[i], mCameraListener, mHandler);
+                assertNotNull(
+                        String.format("Failed to open camera device %s", ids[i]), camera);
+                mCameraListener.waitForState(STATE_UNCONFIGURED, CAMERA_OPEN_TIMEOUT_MS);
+
+                List<Surface> outputSurfaces = new ArrayList<Surface>(1);
+                outputSurfaces.add(mSurface);
+                camera.configureOutputs(outputSurfaces);
+                mCameraListener.waitForState(STATE_BUSY, CAMERA_BUSY_TIMEOUT_MS);
+                mCameraListener.waitForState(STATE_IDLE, CAMERA_IDLE_TIMEOUT_MS);
+
+                CaptureRequest.Builder requestBuilder =
+                        camera.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
+                assertNotNull("Failed to create capture request", requestBuilder);
+                requestBuilder.addTarget(mSurface);
+
+                // Enable face detection if supported
+                byte[] faceModes = props.get(
+                        CameraCharacteristics.STATISTICS_INFO_AVAILABLE_FACE_DETECT_MODES);
+                assertNotNull("Available face detection modes shouldn't be null", faceModes);
+                for (int m = 0; m < faceModes.length; m++) {
+                    if (faceModes[m] == CameraMetadata.STATISTICS_FACE_DETECT_MODE_FULL) {
+                        if (VERBOSE) {
+                            Log.v(TAG, "testCameraCaptureResultAllKeys - " +
+                                    "setting facedetection mode to full");
+                        }
+                        requestBuilder.set(CaptureRequest.STATISTICS_FACE_DETECT_MODE,
+                                (int)faceModes[m]);
+                    }
+                }
+
+                // Enable lensShading mode, it should be supported by full mode device.
+                requestBuilder.set(CaptureRequest.STATISTICS_LENS_SHADING_MAP_MODE,
+                        CameraMetadata.STATISTICS_LENS_SHADING_MAP_MODE_ON);
+
+                SimpleCaptureListener captureListener = new SimpleCaptureListener();
+                camera.setRepeatingRequest(requestBuilder.build(), captureListener, mHandler);
+
+                for (int m = 0; m < NUM_FRAMES_VERIFIED; m++) {
+                    if(VERBOSE) {
+                        Log.v(TAG, "Testing frame " + m);
+                    }
+                    validateCaptureResult(
+                            captureListener.getCaptureResult(WAIT_FOR_RESULT_TIMEOUT_MS),
+                            waiverkeys);
+                }
+
+                // Stop repeat, wait for captures to complete, and disconnect from surfaces
+                camera.configureOutputs(/*outputs*/ null);
+                mCameraListener.waitForState(STATE_BUSY, CAMERA_BUSY_TIMEOUT_MS);
+                mCameraListener.waitForState(STATE_UNCONFIGURED, CAMERA_IDLE_TIMEOUT_MS);
+                // Camera has disconnected, clear out the reader
+                mSurface.release();
+                mImageReader.close();
+            } finally {
+                if (camera != null) {
+                    camera.close();
+                }
+            }
+
+        }
+    }
+
+    private void validateCaptureResult(CaptureResult result,
+            List<CameraMetadata.Key<?>> skippedKeys) throws Exception {
+        for (CameraMetadata.Key<?> key : mAllKeys) {
+            if (!skippedKeys.contains(key) && result.get(key) == null) {
+                mFailedKeys.add(key);
+            }
+        }
+
+        StringBuffer failedKeyNames = new StringBuffer("Below Keys have null values:\n");
+        for (CameraMetadata.Key<?> key : mFailedKeys) {
+            failedKeyNames.append(key.getName() + "\n");
+        }
+
+        assertTrue("Some keys have null values, " + failedKeyNames.toString(),
+                mFailedKeys.isEmpty());
+    }
+
+    private static class SimpleCaptureListener extends CameraDevice.CaptureListener {
+        LinkedBlockingQueue<CaptureResult> mQueue = new LinkedBlockingQueue<CaptureResult>();
+
+        @Override
+        public void onCaptureStarted(CameraDevice camera, CaptureRequest request, long timestamp)
+        {
+        }
+
+        @Override
+        public void onCaptureCompleted(CameraDevice camera, CaptureRequest request,
+                CaptureResult result) {
+            try {
+                mQueue.put(result);
+            } catch (InterruptedException e) {
+                throw new UnsupportedOperationException(
+                        "Can't handle InterruptedException in onCaptureCompleted");
+            }
+        }
+
+        @Override
+        public void onCaptureFailed(CameraDevice camera, CaptureRequest request,
+                CaptureFailure failure) {
+        }
+
+        @Override
+        public void onCaptureSequenceCompleted(CameraDevice camera, int sequenceId,
+                int frameNumber) {
+        }
+
+        public CaptureResult getCaptureResult(long timeout) throws InterruptedException {
+            CaptureResult result = mQueue.poll(timeout, TimeUnit.MILLISECONDS);
+            assertNotNull("Wait for a capture result timed out in " + timeout + "ms", result);
+            return result;
+        }
+    }
+
+    private void createDefaultSurface(Size sz) {
+        mImageReader =
+                ImageReader.newInstance(sz.getWidth(),
+                        sz.getHeight(),
+                        ImageFormat.YUV_420_888,
+                        MAX_NUM_IMAGES);
+        mImageReader.setOnImageAvailableListener(new ImageDropperListener(), mHandler);
+        mSurface = mImageReader.getSurface();
+    }
+
+    /**
+     * TODO: Use CameraCharacteristics.getAvailableCaptureResultKeys() once we can filter out
+     * @hide keys.
+     *
+     */
+
+    /*@O~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~
+     * The key entries below this point are generated from metadata
+     * definitions in /system/media/camera/docs. Do not modify by hand or
+     * modify the comment blocks at the start or end.
+     *~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~*/
+
+    private static List<CameraMetadata.Key<?>> getAllCaptureResultKeys() {
+        ArrayList<CameraMetadata.Key<?>> resultKeys = new ArrayList<CameraMetadata.Key<?>>();
+        resultKeys.add(CaptureResult.COLOR_CORRECTION_TRANSFORM);
+        resultKeys.add(CaptureResult.COLOR_CORRECTION_GAINS);
+        resultKeys.add(CaptureResult.CONTROL_AE_REGIONS);
+        resultKeys.add(CaptureResult.CONTROL_AF_MODE);
+        resultKeys.add(CaptureResult.CONTROL_AF_REGIONS);
+        resultKeys.add(CaptureResult.CONTROL_AWB_MODE);
+        resultKeys.add(CaptureResult.CONTROL_AWB_REGIONS);
+        resultKeys.add(CaptureResult.CONTROL_MODE);
+        resultKeys.add(CaptureResult.CONTROL_AE_STATE);
+        resultKeys.add(CaptureResult.CONTROL_AF_STATE);
+        resultKeys.add(CaptureResult.CONTROL_AWB_STATE);
+        resultKeys.add(CaptureResult.EDGE_MODE);
+        resultKeys.add(CaptureResult.FLASH_MODE);
+        resultKeys.add(CaptureResult.FLASH_STATE);
+        resultKeys.add(CaptureResult.JPEG_GPS_COORDINATES);
+        resultKeys.add(CaptureResult.JPEG_GPS_PROCESSING_METHOD);
+        resultKeys.add(CaptureResult.JPEG_GPS_TIMESTAMP);
+        resultKeys.add(CaptureResult.JPEG_ORIENTATION);
+        resultKeys.add(CaptureResult.JPEG_QUALITY);
+        resultKeys.add(CaptureResult.JPEG_THUMBNAIL_QUALITY);
+        resultKeys.add(CaptureResult.JPEG_THUMBNAIL_SIZE);
+        resultKeys.add(CaptureResult.LENS_APERTURE);
+        resultKeys.add(CaptureResult.LENS_FILTER_DENSITY);
+        resultKeys.add(CaptureResult.LENS_FOCAL_LENGTH);
+        resultKeys.add(CaptureResult.LENS_FOCUS_DISTANCE);
+        resultKeys.add(CaptureResult.LENS_OPTICAL_STABILIZATION_MODE);
+        resultKeys.add(CaptureResult.LENS_FOCUS_RANGE);
+        resultKeys.add(CaptureResult.LENS_STATE);
+        resultKeys.add(CaptureResult.NOISE_REDUCTION_MODE);
+        resultKeys.add(CaptureResult.REQUEST_FRAME_COUNT);
+        resultKeys.add(CaptureResult.SCALER_CROP_REGION);
+        resultKeys.add(CaptureResult.SENSOR_EXPOSURE_TIME);
+        resultKeys.add(CaptureResult.SENSOR_FRAME_DURATION);
+        resultKeys.add(CaptureResult.SENSOR_SENSITIVITY);
+        resultKeys.add(CaptureResult.SENSOR_TIMESTAMP);
+        resultKeys.add(CaptureResult.SENSOR_TEMPERATURE);
+        resultKeys.add(CaptureResult.STATISTICS_FACE_DETECT_MODE);
+        resultKeys.add(CaptureResult.STATISTICS_FACE_IDS);
+        resultKeys.add(CaptureResult.STATISTICS_FACE_LANDMARKS);
+        resultKeys.add(CaptureResult.STATISTICS_FACE_RECTANGLES);
+        resultKeys.add(CaptureResult.STATISTICS_FACE_SCORES);
+        resultKeys.add(CaptureResult.STATISTICS_LENS_SHADING_MAP);
+        resultKeys.add(CaptureResult.STATISTICS_PREDICTED_COLOR_GAINS);
+        resultKeys.add(CaptureResult.STATISTICS_PREDICTED_COLOR_TRANSFORM);
+        resultKeys.add(CaptureResult.STATISTICS_SCENE_FLICKER);
+        resultKeys.add(CaptureResult.TONEMAP_CURVE_BLUE);
+        resultKeys.add(CaptureResult.TONEMAP_CURVE_GREEN);
+        resultKeys.add(CaptureResult.TONEMAP_CURVE_RED);
+        resultKeys.add(CaptureResult.TONEMAP_MODE);
+        resultKeys.add(CaptureResult.BLACK_LEVEL_LOCK);
+
+        // Add STATISTICS_FACES key separately here because it is not
+        // defined in metadata xml file.
+        resultKeys.add(CaptureResult.STATISTICS_FACES);
+
+        return resultKeys;
+    }
+
+    /*~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~
+     * End generated code
+     *~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~O@*/
+}
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 1a07a39..1b892ba 100644
--- a/tests/tests/hardware/src/android/hardware/camera2/cts/CameraCharacteristicsTest.java
+++ b/tests/tests/hardware/src/android/hardware/camera2/cts/CameraCharacteristicsTest.java
@@ -63,14 +63,20 @@
             CameraCharacteristics props = mCameraManager.getCameraCharacteristics(ids[i]);
             assertNotNull(String.format("Can't get camera characteristics from: ID %s", ids[i]),
                                         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));
+            {
+
+                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));
+
+            }
+
         }
     }
 
@@ -80,14 +86,20 @@
             CameraCharacteristics props = mCameraManager.getCameraCharacteristics(ids[i]);
             assertNotNull(String.format("Can't get camera characteristics from: ID %s", ids[i]),
                                         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));
+            {
+
+                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));
+
+            }
+
         }
     }
 
@@ -97,14 +109,20 @@
             CameraCharacteristics props = mCameraManager.getCameraCharacteristics(ids[i]);
             assertNotNull(String.format("Can't get camera characteristics from: ID %s", ids[i]),
                                         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));
+            {
+
+                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));
+
+            }
+
         }
     }
 
@@ -114,14 +132,20 @@
             CameraCharacteristics props = mCameraManager.getCameraCharacteristics(ids[i]);
             assertNotNull(String.format("Can't get camera characteristics from: ID %s", ids[i]),
                                         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));
+            {
+
+                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));
+
+            }
+
         }
     }
 
@@ -131,14 +155,20 @@
             CameraCharacteristics props = mCameraManager.getCameraCharacteristics(ids[i]);
             assertNotNull(String.format("Can't get camera characteristics from: ID %s", ids[i]),
                                         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));
+            {
+
+                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));
+
+            }
+
         }
     }
 
@@ -148,14 +178,20 @@
             CameraCharacteristics props = mCameraManager.getCameraCharacteristics(ids[i]);
             assertNotNull(String.format("Can't get camera characteristics from: ID %s", ids[i]),
                                         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));
+            {
+
+                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));
+
+            }
+
         }
     }
 
@@ -165,14 +201,20 @@
             CameraCharacteristics props = mCameraManager.getCameraCharacteristics(ids[i]);
             assertNotNull(String.format("Can't get camera characteristics from: ID %s", ids[i]),
                                         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));
+            {
+
+                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));
+
+            }
+
         }
     }
 
@@ -182,14 +224,20 @@
             CameraCharacteristics props = mCameraManager.getCameraCharacteristics(ids[i]);
             assertNotNull(String.format("Can't get camera characteristics from: ID %s", ids[i]),
                                         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));
+            {
+
+                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));
+
+            }
+
         }
     }
 
@@ -199,14 +247,20 @@
             CameraCharacteristics props = mCameraManager.getCameraCharacteristics(ids[i]);
             assertNotNull(String.format("Can't get camera characteristics from: ID %s", ids[i]),
                                         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));
+            {
+
+                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));
+
+            }
+
         }
     }
 
@@ -216,14 +270,20 @@
             CameraCharacteristics props = mCameraManager.getCameraCharacteristics(ids[i]);
             assertNotNull(String.format("Can't get camera characteristics from: ID %s", ids[i]),
                                         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));
+            {
+
+                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));
+
+            }
+
         }
     }
 
@@ -233,14 +293,20 @@
             CameraCharacteristics props = mCameraManager.getCameraCharacteristics(ids[i]);
             assertNotNull(String.format("Can't get camera characteristics from: ID %s", ids[i]),
                                         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));
+            {
+
+                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));
+
+            }
+
         }
     }
 
@@ -250,14 +316,20 @@
             CameraCharacteristics props = mCameraManager.getCameraCharacteristics(ids[i]);
             assertNotNull(String.format("Can't get camera characteristics from: ID %s", ids[i]),
                                         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));
+            {
+
+                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));
+
+            }
+
         }
     }
 
@@ -267,14 +339,20 @@
             CameraCharacteristics props = mCameraManager.getCameraCharacteristics(ids[i]);
             assertNotNull(String.format("Can't get camera characteristics from: ID %s", ids[i]),
                                         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));
+            {
+
+                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));
+
+            }
+
         }
     }
 
@@ -284,14 +362,20 @@
             CameraCharacteristics props = mCameraManager.getCameraCharacteristics(ids[i]);
             assertNotNull(String.format("Can't get camera characteristics from: ID %s", ids[i]),
                                         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));
+            {
+
+                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));
+
+            }
+
         }
     }
 
@@ -301,14 +385,20 @@
             CameraCharacteristics props = mCameraManager.getCameraCharacteristics(ids[i]);
             assertNotNull(String.format("Can't get camera characteristics from: ID %s", ids[i]),
                                         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));
+            {
+
+                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));
+
+            }
+
         }
     }
 
@@ -318,14 +408,20 @@
             CameraCharacteristics props = mCameraManager.getCameraCharacteristics(ids[i]);
             assertNotNull(String.format("Can't get camera characteristics from: ID %s", ids[i]),
                                         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));
+            {
+
+                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));
+
+            }
+
         }
     }
 
@@ -335,14 +431,20 @@
             CameraCharacteristics props = mCameraManager.getCameraCharacteristics(ids[i]);
             assertNotNull(String.format("Can't get camera characteristics from: ID %s", ids[i]),
                                         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));
+            {
+
+                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));
+
+            }
+
         }
     }
 
@@ -352,14 +454,20 @@
             CameraCharacteristics props = mCameraManager.getCameraCharacteristics(ids[i]);
             assertNotNull(String.format("Can't get camera characteristics from: ID %s", ids[i]),
                                         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));
+            {
+
+                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));
+
+            }
+
         }
     }
 
@@ -369,14 +477,20 @@
             CameraCharacteristics props = mCameraManager.getCameraCharacteristics(ids[i]);
             assertNotNull(String.format("Can't get camera characteristics from: ID %s", ids[i]),
                                         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));
+            {
+
+                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));
+
+            }
+
         }
     }
 
@@ -386,14 +500,20 @@
             CameraCharacteristics props = mCameraManager.getCameraCharacteristics(ids[i]);
             assertNotNull(String.format("Can't get camera characteristics from: ID %s", ids[i]),
                                         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));
+            {
+
+                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));
+
+            }
+
         }
     }
 
@@ -403,14 +523,20 @@
             CameraCharacteristics props = mCameraManager.getCameraCharacteristics(ids[i]);
             assertNotNull(String.format("Can't get camera characteristics from: ID %s", ids[i]),
                                         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));
+            {
+
+                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));
+
+            }
+
         }
     }
 
@@ -420,14 +546,20 @@
             CameraCharacteristics props = mCameraManager.getCameraCharacteristics(ids[i]);
             assertNotNull(String.format("Can't get camera characteristics from: ID %s", ids[i]),
                                         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));
+            {
+
+                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));
+
+            }
+
         }
     }
 
@@ -437,14 +569,20 @@
             CameraCharacteristics props = mCameraManager.getCameraCharacteristics(ids[i]);
             assertNotNull(String.format("Can't get camera characteristics from: ID %s", ids[i]),
                                         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));
+            {
+
+                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));
+
+            }
+
         }
     }
 
@@ -454,14 +592,20 @@
             CameraCharacteristics props = mCameraManager.getCameraCharacteristics(ids[i]);
             assertNotNull(String.format("Can't get camera characteristics from: ID %s", ids[i]),
                                         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));
+            {
+
+                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));
+
+            }
+
         }
     }
 
@@ -471,14 +615,20 @@
             CameraCharacteristics props = mCameraManager.getCameraCharacteristics(ids[i]);
             assertNotNull(String.format("Can't get camera characteristics from: ID %s", ids[i]),
                                         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));
+            {
+
+                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));
+
+            }
+
         }
     }
 
@@ -488,14 +638,20 @@
             CameraCharacteristics props = mCameraManager.getCameraCharacteristics(ids[i]);
             assertNotNull(String.format("Can't get camera characteristics from: ID %s", ids[i]),
                                         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));
+            {
+
+                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));
+
+            }
+
         }
     }
 
@@ -505,14 +661,20 @@
             CameraCharacteristics props = mCameraManager.getCameraCharacteristics(ids[i]);
             assertNotNull(String.format("Can't get camera characteristics from: ID %s", ids[i]),
                                         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));
+            {
+
+                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));
+
+            }
+
         }
     }
 
@@ -522,14 +684,24 @@
             CameraCharacteristics props = mCameraManager.getCameraCharacteristics(ids[i]);
             assertNotNull(String.format("Can't get camera characteristics from: ID %s", ids[i]),
                                         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));
+            Integer hwLevel = props.get(CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL);
+            assertNotNull("No hardware level reported! android.info.supportedHardwareLevel",
+                    hwLevel);
+            if (hwLevel == CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL_FULL)
+            {
+
+                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));
+
+            }
+
         }
     }
 
@@ -539,14 +711,24 @@
             CameraCharacteristics props = mCameraManager.getCameraCharacteristics(ids[i]);
             assertNotNull(String.format("Can't get camera characteristics from: ID %s", ids[i]),
                                         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));
+            Integer hwLevel = props.get(CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL);
+            assertNotNull("No hardware level reported! android.info.supportedHardwareLevel",
+                    hwLevel);
+            if (hwLevel == CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL_FULL)
+            {
+
+                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));
+
+            }
+
         }
     }
 
@@ -556,14 +738,20 @@
             CameraCharacteristics props = mCameraManager.getCameraCharacteristics(ids[i]);
             assertNotNull(String.format("Can't get camera characteristics from: ID %s", ids[i]),
                                         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));
+            {
+
+                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));
+
+            }
+
         }
     }
 
@@ -573,14 +761,20 @@
             CameraCharacteristics props = mCameraManager.getCameraCharacteristics(ids[i]);
             assertNotNull(String.format("Can't get camera characteristics from: ID %s", ids[i]),
                                         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));
+            {
+
+                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));
+
+            }
+
         }
     }
 
@@ -590,14 +784,20 @@
             CameraCharacteristics props = mCameraManager.getCameraCharacteristics(ids[i]);
             assertNotNull(String.format("Can't get camera characteristics from: ID %s", ids[i]),
                                         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));
+            {
+
+                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));
+
+            }
+
         }
     }
 
@@ -607,14 +807,20 @@
             CameraCharacteristics props = mCameraManager.getCameraCharacteristics(ids[i]);
             assertNotNull(String.format("Can't get camera characteristics from: ID %s", ids[i]),
                                         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));
+            {
+
+                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));
+
+            }
+
         }
     }
 
@@ -624,14 +830,20 @@
             CameraCharacteristics props = mCameraManager.getCameraCharacteristics(ids[i]);
             assertNotNull(String.format("Can't get camera characteristics from: ID %s", ids[i]),
                                         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));
+            {
+
+                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));
+
+            }
+
         }
     }
 
@@ -641,14 +853,20 @@
             CameraCharacteristics props = mCameraManager.getCameraCharacteristics(ids[i]);
             assertNotNull(String.format("Can't get camera characteristics from: ID %s", ids[i]),
                                         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));
+            {
+
+                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));
+
+            }
+
         }
     }
 
@@ -658,14 +876,20 @@
             CameraCharacteristics props = mCameraManager.getCameraCharacteristics(ids[i]);
             assertNotNull(String.format("Can't get camera characteristics from: ID %s", ids[i]),
                                         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));
+            {
+
+                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));
+
+            }
+
         }
     }
 
@@ -675,14 +899,20 @@
             CameraCharacteristics props = mCameraManager.getCameraCharacteristics(ids[i]);
             assertNotNull(String.format("Can't get camera characteristics from: ID %s", ids[i]),
                                         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));
+            {
+
+                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));
+
+            }
+
         }
     }
 
@@ -692,14 +922,20 @@
             CameraCharacteristics props = mCameraManager.getCameraCharacteristics(ids[i]);
             assertNotNull(String.format("Can't get camera characteristics from: ID %s", ids[i]),
                                         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));
+            {
+
+                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));
+
+            }
+
         }
     }
 
@@ -709,14 +945,20 @@
             CameraCharacteristics props = mCameraManager.getCameraCharacteristics(ids[i]);
             assertNotNull(String.format("Can't get camera characteristics from: ID %s", ids[i]),
                                         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));
+            {
+
+                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/CameraDeviceTest.java b/tests/tests/hardware/src/android/hardware/camera2/cts/CameraDeviceTest.java
index 851ebf1..f68b10a 100644
--- a/tests/tests/hardware/src/android/hardware/camera2/cts/CameraDeviceTest.java
+++ b/tests/tests/hardware/src/android/hardware/camera2/cts/CameraDeviceTest.java
@@ -16,6 +16,10 @@
 
 package android.hardware.camera2.cts;
 
+import static android.hardware.camera2.cts.CameraTestUtils.*;
+import static com.android.ex.camera2.blocking.BlockingStateListener.*;
+import static org.mockito.Mockito.*;
+
 import android.content.Context;
 import android.graphics.ImageFormat;
 import android.hardware.camera2.CameraCharacteristics;
@@ -33,8 +37,8 @@
 import android.util.Log;
 import android.view.Surface;
 
+import com.android.ex.camera2.blocking.BlockingStateListener;
 import org.mockito.ArgumentMatcher;
-import static org.mockito.Mockito.*;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -47,9 +51,10 @@
     private static final boolean VERBOSE = Log.isLoggable(TAG, Log.VERBOSE);
 
     private CameraManager mCameraManager;
-    private CameraDevice.StateListener mMockDeviceListener;
+    private BlockingStateListener mCameraListener;
     private CameraTestThread mLooperThread;
     private Handler mCallbackHandler;
+    private int mLatestState = STATE_UNINITIALIZED;
 
     /**
      * The error triggered flag starts out as false, and it will flip to true if any errors
@@ -62,7 +67,8 @@
     private CameraTestThread mDummyThread;
     private Surface mSurface;
 
-    private static final int CAPTURE_WAIT_TIMEOUT_MS = 1000;
+    private static final int CAMERA_CONFIGURE_TIMEOUT_MS = 2000;
+    private static final int CAPTURE_WAIT_TIMEOUT_MS = 2000;
     private static final int ERROR_LISTENER_WAIT_TIMEOUT_MS = 1000;
     private static final int REPEATING_CAPTURE_EXPECTED_RESULT_COUNT = 5;
     // VGA size capture is required by CDD.
@@ -92,7 +98,7 @@
          * Use spy object here since we want to use the SimpleDeviceListener callback
          * implementation (spy doesn't stub the functions unless we ask it to do so).
          */
-        mMockDeviceListener = spy(new SimpleDeviceListener());
+        mCameraListener = spy(new BlockingStateListener());
     }
 
     @Override
@@ -104,7 +110,14 @@
          * fail the rest of the tests. This is especially needed when error
          * callback is fired too late.
          */
-        assertFalse("Camera Device runs into error state", mErrorTriggered);
+        verify(mCameraListener, never())
+                .onError(
+                    any(CameraDevice.class),
+                    anyInt());
+        verify(mCameraListener, never())
+                .onDisconnected(
+                    any(CameraDevice.class));
+
         mCameraManager = (CameraManager)mContext.getSystemService(Context.CAMERA_SERVICE);
         assertNotNull("Can't connect to camera manager", mCameraManager);
         createDefaultSurface();
@@ -119,75 +132,6 @@
         super.tearDown();
     }
 
-    /**
-     * This class need to be public because spy need access it.
-     *
-     * <p><b>Warning</b>: {@link #onOpened} does nothing, so only use this with the
-     * {@link CameraTestUtils#openCamera}
-     * If using this with {@link CameraManager#openDevice} directly,
-     * remember to implement openCamera!</p>
-     */
-    public class SimpleDeviceListener extends CameraDevice.StateListener {
-        private final Object mIdleLock = new Object();
-        private boolean mIdle = false;
-
-        public SimpleDeviceListener() {
-        }
-
-        // Wait for idle to occur, with a timeout in milliseconds.
-        // A timeout of 0 means indefinite wait
-        public void waitForIdle(long timeout) {
-            synchronized(mIdleLock) {
-                if (!mIdle) {
-                    try {
-                        if (timeout > 0) {
-                            mIdleLock.wait(timeout);
-                        } else {
-                            mIdleLock.wait();
-                        }
-                    } catch (InterruptedException e) {
-                        // Probably fail the idle assert, but needs no other
-                        // action
-                    }
-                    assertTrue("Timeout waiting for camera device idle", mIdle);
-                }
-                mIdle = false;
-            }
-        }
-
-        // Clear idle flag
-        public void clearIdleFlag() {
-            synchronized(mIdleLock) {
-                mIdle = false;
-            }
-        }
-
-        @Override
-        public void onIdle(CameraDevice camera) {
-            synchronized(mIdleLock) {
-                mIdle = true;
-                mIdleLock.notifyAll();
-            }
-        }
-
-        @Override
-        public void onDisconnected(CameraDevice camera) {
-            // Not expecting disconnections
-            mErrorTriggered = true;
-        }
-
-        @Override
-        public void onError(CameraDevice camera, int error) {
-            mErrorTriggered = true;
-        }
-
-        @Override
-        public void onOpened(CameraDevice camera) {
-            // Do nothing. Handled by CameraTestUtils#openCamera
-            // TODO: If using this listener with CameraManager#openCamera, IMPLEMENT THIS.
-        }
-    }
-
     public void testCameraDeviceCreateCaptureBuilder() throws Exception {
         String[] ids = mCameraManager.getCameraIdList();
         for (int i = 0; i < ids.length; i++) {
@@ -226,7 +170,7 @@
             CameraDevice camera = null;
             try {
                 camera = CameraTestUtils.openCamera(mCameraManager, ids[i],
-                        mMockDeviceListener, mCallbackHandler);
+                        mCameraListener, mCallbackHandler);
                 assertNotNull(
                         String.format("Failed to open camera device %s", ids[i]), camera);
 
@@ -235,7 +179,7 @@
                  * Also, wait some time to check if device doesn't run into error.
                  */
                 SystemClock.sleep(ERROR_LISTENER_WAIT_TIMEOUT_MS);
-                verify(mMockDeviceListener, never())
+                verify(mCameraListener, never())
                         .onError(
                                 any(CameraDevice.class),
                                 anyInt());
@@ -287,9 +231,10 @@
             CameraDevice camera = null;
             try {
                 camera = CameraTestUtils.openCamera(mCameraManager, ids[i],
-                        mMockDeviceListener, mCallbackHandler);
+                        mCameraListener, mCallbackHandler);
                 assertNotNull(
                         String.format("Failed to open camera device %s", ids[i]), camera);
+                waitForState(STATE_UNCONFIGURED, CAMERA_OPEN_TIMEOUT_MS);
 
                 prepareCapture(camera);
 
@@ -320,7 +265,7 @@
                     // Test: burst of 5 shots of different template types
                     captureBurstShot(camera, ids[i], mTemplates, mTemplates.length, repeating);
                 }
-                verify(mMockDeviceListener, never())
+                verify(mCameraListener, never())
                         .onError(
                                 any(CameraDevice.class),
                                 anyInt());
@@ -339,6 +284,9 @@
             int template,
             boolean repeating) throws Exception {
 
+        assertEquals("Bad initial state for preparing to capture",
+                mLatestState, STATE_IDLE);
+
         CaptureRequest.Builder requestBuilder = camera.createCaptureRequest(template);
         assertNotNull("Failed to create capture request", requestBuilder);
         requestBuilder.addTarget(mSurface);
@@ -356,14 +304,15 @@
             camera.setRepeatingRequest(requestBuilder.build(), mockCaptureListener,
                     mCallbackHandler);
         }
+        waitForState(STATE_ACTIVE, CAMERA_CONFIGURE_TIMEOUT_MS);
 
         int expectedCaptureResultCount = repeating ? REPEATING_CAPTURE_EXPECTED_RESULT_COUNT : 1;
         verifyCaptureResults(camera, mockCaptureListener, expectedCaptureResultCount);
 
         if (repeating) {
             camera.stopRepeating();
-            camera.waitUntilIdle();
         }
+        waitForState(STATE_IDLE, CAMERA_CONFIGURE_TIMEOUT_MS);
     }
 
     private void captureBurstShot(
@@ -373,6 +322,9 @@
             int len,
             boolean repeating) throws Exception {
 
+        assertEquals("Bad initial state for preparing to capture",
+                mLatestState, STATE_IDLE);
+
         assertTrue("Invalid args to capture function", len <= templates.length);
         List<CaptureRequest> requests = new ArrayList<CaptureRequest>();
         for (int i = 0; i < len; i++) {
@@ -394,6 +346,8 @@
         else {
             camera.setRepeatingBurst(requests, mockCaptureListener, mCallbackHandler);
         }
+        waitForState(STATE_ACTIVE, CAMERA_CONFIGURE_TIMEOUT_MS);
+
         int expectedResultCount = len;
         if (repeating) {
             expectedResultCount *= REPEATING_CAPTURE_EXPECTED_RESULT_COUNT;
@@ -403,14 +357,20 @@
 
         if (repeating) {
             camera.stopRepeating();
-            camera.waitUntilIdle();
         }
+        waitForState(STATE_IDLE, CAMERA_CONFIGURE_TIMEOUT_MS);
     }
 
+    // Precondition: Device must be in known IDLE/UNCONFIGURED state (has been waited for)
     private void prepareCapture(CameraDevice camera) throws Exception {
+        assertTrue("Bad initial state for preparing to capture",
+                mLatestState == STATE_IDLE || mLatestState == STATE_UNCONFIGURED);
+
         List<Surface> outputSurfaces = new ArrayList<Surface>(1);
         outputSurfaces.add(mSurface);
         camera.configureOutputs(outputSurfaces);
+        waitForState(STATE_BUSY, CAMERA_BUSY_TIMEOUT_MS);
+        waitForState(STATE_IDLE, CAMERA_IDLE_TIMEOUT_MS);
     }
 
     /**
@@ -445,6 +405,11 @@
         mReader.setOnImageAvailableListener(listener, mDummyThread.start());
     }
 
+    private void waitForState(int state, long timeout) {
+        mCameraListener.waitForState(state, timeout);
+        mLatestState = state;
+    }
+
     private void verifyCaptureResults(
             CameraDevice camera,
             CameraDevice.CaptureListener mockListener,
@@ -462,5 +427,14 @@
                                 eq(camera),
                                 argThat(new IsCameraMetadataNotEmpty<CaptureRequest>()),
                                 isA(CaptureFailure.class));
+        // Should receive expected number of capture shutter calls
+        verify(mockListener,
+                atLeast(expectResultCount))
+                        .onCaptureStarted(
+                               eq(camera),
+                               isA(CaptureRequest.class),
+                               anyLong());
+
     }
+
 }
diff --git a/tests/tests/hardware/src/android/hardware/camera2/cts/CameraTestUtils.java b/tests/tests/hardware/src/android/hardware/camera2/cts/CameraTestUtils.java
index f3a4fa7..7f10cb8 100644
--- a/tests/tests/hardware/src/android/hardware/camera2/cts/CameraTestUtils.java
+++ b/tests/tests/hardware/src/android/hardware/camera2/cts/CameraTestUtils.java
@@ -24,6 +24,7 @@
 import android.hardware.camera2.CameraCharacteristics;
 import android.hardware.camera2.Size;
 import android.media.Image;
+import android.media.ImageReader;
 import android.media.Image.Plane;
 import android.os.Handler;
 import android.util.Log;
@@ -46,26 +47,23 @@
     private static final String TAG = "CameraTestUtils";
     private static final boolean VERBOSE = Log.isLoggable(TAG, Log.VERBOSE);
 
-    /**
-     * Provide a default implementation of CameraDevice.StateListener that does nothing.
-     */
-    public abstract static class DeviceStateListener extends CameraDevice.StateListener {
-        public DeviceStateListener() {
-        }
+    // Default timeouts for reaching various states
+    public static final int CAMERA_OPEN_TIMEOUT_MS = 500;
+    public static final int CAMERA_IDLE_TIMEOUT_MS = 2000;
+    public static final int CAMERA_ACTIVE_TIMEOUT_MS = 500;
+    public static final int CAMERA_BUSY_TIMEOUT_MS = 500;
 
+    public static class ImageDropperListener implements ImageReader.OnImageAvailableListener {
         @Override
-        public void onOpened(CameraDevice camera) {
-            // Do nothing. It should be handled by #openCamera
-        }
-
-        @Override
-        public void onDisconnected(CameraDevice camera) {
-            // Do nothing
-        }
-
-        @Override
-        public void onError(CameraDevice camera, int error) {
-            // Do nothing
+        public void onImageAvailable(ImageReader reader) {
+            Image image = null;
+            try {
+                image = reader.acquireNextImage();
+            } finally {
+                if (image != null) {
+                    image.close();
+                }
+            }
         }
     }
 
@@ -231,21 +229,21 @@
         int format = image.getFormat();
         Plane[] planes = image.getPlanes();
         switch (format) {
-          case ImageFormat.YUV_420_888:
-          case ImageFormat.NV21:
-          case ImageFormat.YV12:
-              assertEquals("YUV420 format Images should have 3 planes", 3, planes.length);
-              break;
-          case ImageFormat.Y8:
-          case ImageFormat.Y16:
-              assertEquals("Y8/Y16 Image should have 1 plane", 1, planes.length);
-              break;
-          case ImageFormat.JPEG:
-              assertEquals("Jpeg Image should have one plane", 1, planes.length);
-              break;
-          default:
-              fail("Unsupported Image Format: " + format);
-      }
+            case ImageFormat.YUV_420_888:
+            case ImageFormat.NV21:
+            case ImageFormat.YV12:
+                assertEquals("YUV420 format Images should have 3 planes", 3, planes.length);
+                break;
+            case ImageFormat.Y8:
+            case ImageFormat.Y16:
+                assertEquals("Y8/Y16 Image should have 1 plane", 1, planes.length);
+                break;
+            case ImageFormat.JPEG:
+                assertEquals("Jpeg Image should have one plane", 1, planes.length);
+                break;
+            default:
+                fail("Unsupported Image Format: " + format);
+        }
     }
 
     public static void dumpFile(String fileName, byte[] data) {
diff --git a/tests/tests/hardware/src/android/hardware/camera2/cts/ImageReaderTest.java b/tests/tests/hardware/src/android/hardware/camera2/cts/ImageReaderTest.java
index 1dccb7b..28cb13e 100644
--- a/tests/tests/hardware/src/android/hardware/camera2/cts/ImageReaderTest.java
+++ b/tests/tests/hardware/src/android/hardware/camera2/cts/ImageReaderTest.java
@@ -17,6 +17,7 @@
 package android.hardware.camera2.cts;
 
 import static android.hardware.camera2.cts.CameraTestUtils.*;
+import static com.android.ex.camera2.blocking.BlockingStateListener.*;
 
 import android.content.Context;
 import android.graphics.BitmapFactory;
@@ -36,6 +37,7 @@
 import android.view.Surface;
 
 import com.android.ex.camera2.blocking.BlockingCameraManager.BlockingOpenException;
+import com.android.ex.camera2.blocking.BlockingStateListener;
 
 import java.util.ArrayList;
 import java.util.Arrays;
@@ -65,6 +67,7 @@
 
     private CameraManager mCameraManager;
     private CameraDevice mCamera;
+    private BlockingStateListener mCameraListener;
     private String[] mCameraIds;
     private ImageReader mReader = null;
     private Handler mHandler = null;
@@ -84,6 +87,7 @@
         mCameraIds = mCameraManager.getCameraIdList();
         mLooperThread = new CameraTestThread();
         mHandler = mLooperThread.start();
+        mCameraListener = new BlockingStateListener();
     }
 
     @Override
@@ -139,8 +143,6 @@
          * to int[]. It'll also be nice to put this into a helper function and
          * move to util class.
          */
-        // Comment out below check to work around b/10406212.
-        /*
         int[] availableFormats = properties.get(CameraCharacteristics.SCALER_AVAILABLE_FORMATS);
         assertArrayNotEmpty(availableFormats,
                 "availableFormats should not be empty");
@@ -148,7 +150,6 @@
         assertTrue("Can't find the format " + format + " in supported formats " +
                 Arrays.toString(availableFormats),
                 Arrays.binarySearch(availableFormats, format) >= 0);
-        */
 
         Size[] availableSizes = getSupportedSizeForFormat(format, mCamera.getId(), mCameraManager);
         assertArrayNotEmpty(availableSizes, "availableSizes should not be empty");
@@ -221,6 +222,8 @@
         assertNotNull("Fail to get surface from ImageReader", surface);
         outputSurfaces.add(surface);
         mCamera.configureOutputs(outputSurfaces);
+        mCameraListener.waitForState(STATE_BUSY, CAMERA_BUSY_TIMEOUT_MS);
+        mCameraListener.waitForState(STATE_IDLE, CAMERA_IDLE_TIMEOUT_MS);
 
         CaptureRequest.Builder captureBuilder =
                 mCamera.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
@@ -235,6 +238,7 @@
         // TODO: Add more format here, and wrap each one as a function.
         Image img;
         int captureCount = NUM_FRAME_VERIFIED;
+
         // Only verify single image for still capture
         if (format == ImageFormat.JPEG) {
             captureCount = 1;
@@ -263,8 +267,12 @@
     }
 
     private void stopCapture() throws CameraAccessException {
-        mCamera.stopRepeating();
-        mCamera.waitUntilIdle();
+        if (VERBOSE) Log.v(TAG, "Stopping capture and waiting for idle");
+        // Stop repeat, wait for captures to complete, and disconnect from surfaces
+        mCamera.configureOutputs(/*outputs*/ null);
+        mCameraListener.waitForState(STATE_BUSY, CAMERA_BUSY_TIMEOUT_MS);
+        mCameraListener.waitForState(STATE_UNCONFIGURED, CAMERA_IDLE_TIMEOUT_MS);
+        // Camera has disconnected, clear out the reader
         mReader.close();
         mReader = null;
         mListener = null;
@@ -275,7 +283,8 @@
             throw new IllegalStateException("Already have open camera device");
         }
         try {
-            mCamera = openCamera(mCameraManager, cameraId, mHandler);
+            mCamera = CameraTestUtils.openCamera(
+                mCameraManager, cameraId, mCameraListener, mHandler);
         } catch (CameraAccessException e) {
             mCamera = null;
             fail("Fail to open camera, " + Log.getStackTraceString(e));
@@ -283,6 +292,7 @@
             mCamera = null;
             fail("Fail to open camera, " + Log.getStackTraceString(e));
         }
+        mCameraListener.waitForState(STATE_UNCONFIGURED, CAMERA_OPEN_TIMEOUT_MS);
     }
 
     private void closeDevice(String cameraId) {
diff --git a/tests/tests/hardware/src/android/hardware/consumerir/cts/ConsumerIrTest.java b/tests/tests/hardware/src/android/hardware/consumerir/cts/ConsumerIrTest.java
new file mode 100644
index 0000000..cff1fc6
--- /dev/null
+++ b/tests/tests/hardware/src/android/hardware/consumerir/cts/ConsumerIrTest.java
@@ -0,0 +1,89 @@
+/*
+ * 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.hardware.consumerir.cts;
+
+import android.content.Context;
+import android.hardware.ConsumerIrManager;
+import android.util.Log;
+import android.content.pm.PackageManager;
+import android.test.AndroidTestCase;
+import java.io.IOException;
+
+/**
+ * Very basic test, just of the static methods of {@link
+ * android.hardware.ConsumerIrManager}.
+ */
+public class ConsumerIrTest extends AndroidTestCase {
+    private boolean mHasConsumerIr;
+    private ConsumerIrManager mCIR;
+
+    @Override
+    public void setUp() throws Exception {
+        super.setUp();
+
+        mHasConsumerIr = getContext().getPackageManager().hasSystemFeature(
+                PackageManager.FEATURE_CONSUMER_IR);
+        if (mHasConsumerIr) {
+            mCIR = (ConsumerIrManager)getContext().getSystemService(
+                    Context.CONSUMER_IR_SERVICE);
+        }
+    }
+
+    public void test_hasIrEmitter() {
+        if (!mHasConsumerIr) {
+            // Skip the test if consumer IR is not present.
+            return;
+        }
+        assertTrue(mCIR.hasIrEmitter());
+    }
+
+    public void test_getCarrierFrequencies() {
+        if (!mHasConsumerIr) {
+            // Skip the test if consumer IR is not present.
+            return;
+        }
+
+        ConsumerIrManager.CarrierFrequencyRange[] freqs = mCIR.getCarrierFrequencies();
+
+        assertTrue(freqs.length > 0);
+        for (ConsumerIrManager.CarrierFrequencyRange range : freqs) {
+            // Each range must be valid
+            assertTrue(range.getMinFrequency() > 0);
+            assertTrue(range.getMaxFrequency() > 0);
+            assertTrue(range.getMinFrequency() <= range.getMaxFrequency());
+        }
+    }
+
+
+    public void test_transmit() {
+        if (!mHasConsumerIr) {
+            // Skip the test if consumer IR is not present.
+            return;
+        }
+
+        ConsumerIrManager.CarrierFrequencyRange[] freqs = mCIR.getCarrierFrequencies();
+
+        int[] pattern = {1901, 4453, 625, 1614, 625, 1588, 625, 1614, 625, 442, 625, 442, 625,
+            468, 625, 442, 625, 494, 572, 1614, 625, 1588, 625, 1614, 625, 494, 572, 442, 651,
+            442, 625, 442, 625, 442, 625, 1614, 625, 1588, 651, 1588, 625, 442, 625, 494, 598,
+            442, 625, 442, 625, 520, 572, 442, 625, 442, 625, 442, 651, 1588, 625, 1614, 625,
+            1588, 625, 1614, 625, 1588, 625, 48958};
+
+        // just use the first frequency in the range
+        mCIR.transmit(freqs[0].getMinFrequency(), pattern);
+    }
+}
diff --git a/tests/tests/hardware/src/android/hardware/cts/CameraGLTest.java b/tests/tests/hardware/src/android/hardware/cts/CameraGLTest.java
index 9d7dacb..788cb60 100644
--- a/tests/tests/hardware/src/android/hardware/cts/CameraGLTest.java
+++ b/tests/tests/hardware/src/android/hardware/cts/CameraGLTest.java
@@ -70,8 +70,8 @@
 
     private boolean mSurfaceTextureCallbackResult = false;
 
-    private static final int WAIT_FOR_COMMAND_TO_COMPLETE = 1500;  // Milliseconds.
-    private static final int WAIT_FOR_FOCUS_TO_COMPLETE = 3000;
+    private static final int WAIT_FOR_COMMAND_TO_COMPLETE = 5000;  // Milliseconds.
+    private static final int WAIT_FOR_FOCUS_TO_COMPLETE = 5000;
     private static final int WAIT_FOR_SNAPSHOT_TO_COMPLETE = 5000;
 
     private SurfaceTextureCallback mSurfaceTextureCallback = new SurfaceTextureCallback();
diff --git a/tests/tests/hardware/src/android/hardware/cts/CameraTest.java b/tests/tests/hardware/src/android/hardware/cts/CameraTest.java
index 979e27b..f877d8b 100644
--- a/tests/tests/hardware/src/android/hardware/cts/CameraTest.java
+++ b/tests/tests/hardware/src/android/hardware/cts/CameraTest.java
@@ -809,21 +809,6 @@
         assertTrue(mJpegPictureCallbackResult);
         exif = new ExifInterface(JPEG_PATH);
         assertFalse(exif.hasThumbnail());
-        // Primary image should still be valid for no thumbnail capture.
-        BitmapFactory.decodeFile(JPEG_PATH, bmpOptions);
-        if (!recording) {
-            assertTrue("Jpeg primary image size should match requested size",
-                    bmpOptions.outWidth == pictureSize.width &&
-                    bmpOptions.outHeight == pictureSize.height);
-        } else {
-            assertTrue(bmpOptions.outWidth >= recordingWidth ||
-                    bmpOptions.outWidth == size.width);
-            assertTrue(bmpOptions.outHeight >= recordingHeight ||
-                    bmpOptions.outHeight == size.height);
-        }
-
-        assertNotNull("Jpeg primary image data should be decodable",
-                BitmapFactory.decodeFile(JPEG_PATH));
     }
 
     @UiThreadTest
diff --git a/tests/tests/telephony/src/android/telephony/cts/SmsUsageMonitorShortCodeTest.java b/tests/tests/telephony/src/android/telephony/cts/SmsUsageMonitorShortCodeTest.java
index de3755c..fbe65b1 100644
--- a/tests/tests/telephony/src/android/telephony/cts/SmsUsageMonitorShortCodeTest.java
+++ b/tests/tests/telephony/src/android/telephony/cts/SmsUsageMonitorShortCodeTest.java
@@ -16,6 +16,8 @@
 
 package android.telephony.cts;
 
+import android.content.Context;
+import android.content.pm.PackageManager;
 import android.test.AndroidTestCase;
 import android.test.suitebuilder.annotation.SmallTest;
 
@@ -26,6 +28,8 @@
  */
 public class SmsUsageMonitorShortCodeTest extends AndroidTestCase {
 
+    private PackageManager mPackageManager;
+
     /** Return value from {@link SmsUsageMonitor#checkDestination} for regular phone numbers. */
     static final int CATEGORY_NOT_SHORT_CODE = 0;
 
@@ -475,8 +479,19 @@
             new ShortCodeTest(null, "112", CATEGORY_NOT_SHORT_CODE),
     };
 
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+        mPackageManager = getContext().getPackageManager();
+    }
+
     @SmallTest
     public void testSmsUsageMonitor() {
+        if (!mPackageManager.hasSystemFeature(PackageManager.FEATURE_TELEPHONY)) {
+            // do not test if device does not support telephony (voice or sms)
+            return;
+        }
+
         SmsUsageMonitor monitor = new SmsUsageMonitor(getContext());
         for (ShortCodeTest test : sShortCodeTests) {
             assertEquals("country: " + test.countryIso + " number: " + test.address,
diff --git a/tests/tests/webkit/src/android/webkit/cts/WebViewTest.java b/tests/tests/webkit/src/android/webkit/cts/WebViewTest.java
index 0b8af7a..21fee65 100644
--- a/tests/tests/webkit/src/android/webkit/cts/WebViewTest.java
+++ b/tests/tests/webkit/src/android/webkit/cts/WebViewTest.java
@@ -1080,7 +1080,8 @@
         new PollingCheck() {
             @Override
             protected boolean check() {
-                return mOnUiThread.getScale() != 0 && mOnUiThread.getContentHeight() != 0;
+                return mOnUiThread.getScale() != 0 && mOnUiThread.getContentHeight() != 0
+                    && mOnUiThread.getHeight() != 0;
             }
         }.run();
         assertEquals(mOnUiThread.getHeight(),