Add camera tests for setPreviewDisplay (do not merge).

Our camera app calls startPreview before setPreviewDisplay.
We need to make sure camera drivers all support this.

Cherry-pick from fef2b490c25e26a332eb6e67848a22f912a12b48.
diff --git a/tests/tests/hardware/src/android/hardware/cts/CameraTest.java b/tests/tests/hardware/src/android/hardware/cts/CameraTest.java
index 3b4c5ed..593ffdb 100644
--- a/tests/tests/hardware/src/android/hardware/cts/CameraTest.java
+++ b/tests/tests/hardware/src/android/hardware/cts/CameraTest.java
@@ -221,14 +221,7 @@
         Thread.sleep(WAIT_LONG);
     }
 
-    private void checkPreviewCallback() throws Exception {
-        SurfaceHolder mSurfaceHolder;
-
-        mSurfaceHolder = CameraStubActivity.mSurfaceView.getHolder();
-        mCamera.setPreviewDisplay(mSurfaceHolder);
-        if (LOGV)
-            Log.v(TAG, "check preview callback");
-        mCamera.startPreview();
+    private void waitForPreviewDone() {
         synchronized (mPreviewDone) {
             try {
                 mPreviewDone.wait(WAIT_FOR_COMMAND_TO_COMPLETE);
@@ -239,6 +232,16 @@
                     Log.v(TAG, "wait was interrupted.");
             }
         }
+    }
+
+    private void checkPreviewCallback() throws Exception {
+        SurfaceHolder mSurfaceHolder;
+
+        mSurfaceHolder = CameraStubActivity.mSurfaceView.getHolder();
+        mCamera.setPreviewDisplay(mSurfaceHolder);
+        if (LOGV) Log.v(TAG, "check preview callback");
+        mCamera.startPreview();
+        waitForPreviewDone();
         mCamera.setPreviewCallback(null);
     }
 
@@ -372,6 +375,48 @@
         assertFalse(mRawPreviewCallbackResult);
     }
 
+    @TestTargetNew(
+        level = TestLevel.COMPLETE,
+        method = "setPreviewDisplay",
+        args = {SurfaceHolder.class}
+    )
+    public void testSetPreviewDisplay() throws Exception {
+        SurfaceHolder mSurfaceHolder;
+        mSurfaceHolder = CameraStubActivity.mSurfaceView.getHolder();
+        initializeMessageLooper();
+        syncLock();
+
+        // Check the order: startPreview->setPreviewDisplay.
+        mCamera.setOneShotPreviewCallback(mRawPreviewCallback);
+        mCamera.startPreview();
+        mCamera.setPreviewDisplay(mSurfaceHolder);
+        waitForPreviewDone();
+        terminateMessageLooper();
+        assertTrue(mRawPreviewCallbackResult);
+
+        // Check the order: setPreviewDisplay->startPreview.
+        initializeMessageLooper();
+        syncLock();
+        mRawPreviewCallbackResult = false;
+        mCamera.setOneShotPreviewCallback(mRawPreviewCallback);
+        mCamera.setPreviewDisplay(mSurfaceHolder);
+        mCamera.startPreview();
+        waitForPreviewDone();
+        mCamera.stopPreview();
+        assertTrue(mRawPreviewCallbackResult);
+
+        // Check the order: setting preview display to null->startPreview->
+        // setPreviewDisplay.
+        mRawPreviewCallbackResult = false;
+        mCamera.setOneShotPreviewCallback(mRawPreviewCallback);
+        mCamera.setPreviewDisplay(null);
+        mCamera.startPreview();
+        mCamera.setPreviewDisplay(mSurfaceHolder);
+        waitForPreviewDone();
+        terminateMessageLooper();
+        assertTrue(mRawPreviewCallbackResult);
+    }
+
     @TestTargets({
         @TestTargetNew(
             level = TestLevel.COMPLETE,