CTS: Add preview warmup for YUV resolution test.

- This is required for several of the legacy devices
  to pass (not enough time for 3A convergence otherwise).

Bug: 18486140
Change-Id: Id95f8a11094c90253dae0a20212410c1dff39210
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 c69d982..dd17779 100644
--- a/tests/tests/hardware/src/android/hardware/camera2/cts/CameraTestUtils.java
+++ b/tests/tests/hardware/src/android/hardware/camera2/cts/CameraTestUtils.java
@@ -812,6 +812,7 @@
                 validateJpegData(data, width, height, filePath);
                 break;
             case ImageFormat.YUV_420_888:
+            case ImageFormat.YV12:
                 validateYuvData(data, width, height, format, image.getTimestamp(), filePath);
                 break;
             case ImageFormat.RAW_SENSOR:
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 3f03f46..9089a8c 100644
--- a/tests/tests/hardware/src/android/hardware/camera2/cts/ImageReaderTest.java
+++ b/tests/tests/hardware/src/android/hardware/camera2/cts/ImageReaderTest.java
@@ -222,6 +222,10 @@
                 Log.v(TAG, "Testing all YUV image resolutions for camera " + id);
                 openDevice(id);
 
+                // Skip warmup on FULL mode devices.
+                int warmupCaptureNumber = (mStaticInfo.isHardwareLevelLegacy()) ?
+                        MAX_NUM_IMAGES - 1 : 0;
+
                 // NV21 isn't supported by ImageReader.
                 final int[] YUVFormats = new int[] {ImageFormat.YUV_420_888, ImageFormat.YV12};
 
@@ -270,15 +274,37 @@
                                     ImageFormat.JPEG, MAX_NUM_IMAGES, jpegListener);
                             Surface jpegSurface = jpegReader.getSurface();
 
-                            // Capture images.
+                            // Setup session
                             List<Surface> outputSurfaces = new ArrayList<Surface>();
                             outputSurfaces.add(yuvSurface);
                             outputSurfaces.add(jpegSurface);
-                            CaptureRequest.Builder request =
-                                    prepareCaptureRequestForSurfaces(outputSurfaces);
+                            createSession(outputSurfaces);
+
+                            // Warm up camera preview (mainly to give legacy devices time to do 3A).
+                            CaptureRequest.Builder warmupRequest =
+                                    mCamera.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
+                            warmupRequest.addTarget(yuvSurface);
+                            assertNotNull("Fail to get CaptureRequest.Builder", warmupRequest);
                             SimpleCaptureCallback resultListener = new SimpleCaptureCallback();
 
-                            startCapture(request.build(), /*repeating*/false, resultListener,
+                            for (int i = 0; i < warmupCaptureNumber; i++) {
+                                startCapture(warmupRequest.build(), /*repeating*/false,
+                                        resultListener, mHandler);
+                            }
+                            for (int i = 0; i < warmupCaptureNumber; i++) {
+                                resultListener.getCaptureResult(CAPTURE_WAIT_TIMEOUT_MS);
+                                Image image = yuvListener.getImage(CAPTURE_WAIT_TIMEOUT_MS);
+                                image.close();
+                            }
+
+                            // Capture image.
+                            CaptureRequest.Builder mainRequest =
+                                    mCamera.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
+                            for (Surface s : outputSurfaces) {
+                                mainRequest.addTarget(s);
+                            }
+
+                            startCapture(mainRequest.build(), /*repeating*/false, resultListener,
                                     mHandler);
 
                             // Verify capture result and images
@@ -437,8 +463,11 @@
         assertTrue("Invalid argument to convertPixelYuvToRgba",
                 w > 0 && h > 0 && wOffset >= 0 && hOffset >= 0);
         assertNotNull(yuvImage);
-        assertTrue("YUV image must have format YUV_420_888",
-                yuvImage.getFormat() == ImageFormat.YUV_420_888);
+
+        int imageFormat = yuvImage.getFormat();
+        assertTrue("YUV image must have YUV-type format",
+                imageFormat == ImageFormat.YUV_420_888 || imageFormat == ImageFormat.YV12 ||
+                        imageFormat == ImageFormat.NV21);
 
         int height = yuvImage.getHeight();
         int width = yuvImage.getWidth();