Test calling startPreview in jpeg callback.

Some camera drivers incorrectly think the capture is
still in progress after jpeg callback is sent to apps.

bug:3362253

Change-Id: I223593a59836808db26db9a46e5ff4fb50adf2dd
diff --git a/tests/tests/hardware/src/android/hardware/cts/CameraTest.java b/tests/tests/hardware/src/android/hardware/cts/CameraTest.java
index 22f47c3..89b9c63 100644
--- a/tests/tests/hardware/src/android/hardware/cts/CameraTest.java
+++ b/tests/tests/hardware/src/android/hardware/cts/CameraTest.java
@@ -2312,4 +2312,34 @@
             assertEquals(originalAreas, parameters.getMeteringAreas());
         }
     }
+
+    // Apps should be able to call startPreview in jpeg callback.
+    @UiThreadTest
+    public void testJpegCallbackStartPreview() throws Exception {
+        int nCameras = Camera.getNumberOfCameras();
+        for (int id = 0; id < nCameras; id++) {
+            Log.v(TAG, "Camera id=" + id);
+            testJpegCallbackStartPreviewByCamera(id);
+        }
+    }
+
+    private void testJpegCallbackStartPreviewByCamera(int cameraId) throws Exception {
+        initializeMessageLooper(cameraId);
+        mCamera.startPreview();
+        mCamera.takePicture(mShutterCallback, mRawPictureCallback, new JpegStartPreviewCallback());
+        waitForSnapshotDone();
+        terminateMessageLooper();
+        assertTrue(mJpegPictureCallbackResult);
+    }
+
+    private final class JpegStartPreviewCallback implements PictureCallback {
+        public void onPictureTaken(byte[] rawData, Camera camera) {
+            try {
+                camera.startPreview();
+                mJpegPictureCallbackResult = true;
+            } catch (Exception e) {
+            }
+            mSnapshotDone.open();
+        }
+    }
 }