Camera2: Add shading mode capture result verification

Also fixed the shading map verify bug: the result listener need to be created
for each iteration of verification when mode is changed, otherwise, stale
results from last run could spill into the next run and cause false alarm.

Change-Id: I5c737b9cbb3afdea9b9bebc7391e3d619ee6c9e4
diff --git a/tests/tests/hardware/src/android/hardware/camera2/cts/CaptureRequestTest.java b/tests/tests/hardware/src/android/hardware/camera2/cts/CaptureRequestTest.java
index fb7eef4..7665ad7 100644
--- a/tests/tests/hardware/src/android/hardware/camera2/cts/CaptureRequestTest.java
+++ b/tests/tests/hardware/src/android/hardware/camera2/cts/CaptureRequestTest.java
@@ -173,26 +173,29 @@
                 Size previewSz =
                         getMaxPreviewSize(mCamera.getId(), mCameraManager, PREVIEW_SIZE_BOUND);
 
+                listener = new SimpleCaptureListener();
                 startPreview(requestBuilder, previewSz, listener);
 
-                verifyShadingMap(listener, NUM_FRAMES_VERIFIED, mapSz, /*mapModeOn*/false);
+                verifyShadingMap(listener, NUM_FRAMES_VERIFIED, mapSz, SHADING_MODE_OFF);
 
                 // Shading map mode FAST, lensShadingMapMode ON, camera device
                 // should output valid maps.
                 requestBuilder.set(CaptureRequest.SHADING_MODE, SHADING_MODE_FAST);
 
+                listener = new SimpleCaptureListener();
                 startPreview(requestBuilder, previewSz, listener);
 
                 // Allow at most one lock OFF state as the exposure is changed once.
-                verifyShadingMap(listener, NUM_FRAMES_VERIFIED, mapSz, /*mapModeOn*/true);
+                verifyShadingMap(listener, NUM_FRAMES_VERIFIED, mapSz, SHADING_MODE_FAST);
 
                 // Shading map mode HIGH_QUALITY, lensShadingMapMode ON, camera device
                 // should output valid maps.
                 requestBuilder.set(CaptureRequest.SHADING_MODE, SHADING_MODE_HIGH_QUALITY);
 
+                listener = new SimpleCaptureListener();
                 startPreview(requestBuilder, previewSz, listener);
 
-                verifyShadingMap(listener, NUM_FRAMES_VERIFIED, mapSz, /*mapModeOn*/true);
+                verifyShadingMap(listener, NUM_FRAMES_VERIFIED, mapSz, SHADING_MODE_HIGH_QUALITY);
 
                 stopPreview();
             } finally {
@@ -762,13 +765,15 @@
      * Verify shading map for different shading modes.
      */
     private void verifyShadingMap(SimpleCaptureListener listener, int numFramesVerified,
-            Size mapSize, boolean mapModeOn) throws Exception {
+            Size mapSize, int shadingMode) throws Exception {
         int numElementsInMap = mapSize.getWidth() * mapSize.getHeight() * RGGB_COLOR_CHANNEL_COUNT;
         float[] unityMap = new float[numElementsInMap];
         Arrays.fill(unityMap, 1.0f);
 
         for (int i = 0; i < numFramesVerified; i++) {
             CaptureResult result = listener.getCaptureResult(WAIT_FOR_RESULT_TIMEOUT_MS);
+            mCollector.expectEquals("Shading mode result doesn't match request",
+                    shadingMode, result.get(CaptureResult.SHADING_MODE));
             float[] map = result.get(CaptureResult.STATISTICS_LENS_SHADING_MAP);
             assertNotNull("Map must not be null", map);
             assertTrue("Map size " + map.length + " must be " + numElementsInMap,
@@ -779,8 +784,10 @@
             assertFalse(String.format("Map size %d should be no less than %d", numElementsInMap,
                     MIN_SHADING_MAP_SIZE), numElementsInMap < MIN_SHADING_MAP_SIZE);
 
-            if (mapModeOn) {
-                // Map mode is ON, expect to receive a map with all element >= 1.0f
+            if (shadingMode == CaptureRequest.SHADING_MODE_FAST ||
+                    shadingMode == CaptureRequest.SHADING_MODE_HIGH_QUALITY) {
+                // shading mode is FAST or HIGH_QUALITY, expect to receive a map with all
+                // elements >= 1.0f
 
                 int badValueCnt = 0;
                 // Detect the bad values of the map data.
@@ -791,8 +798,8 @@
                 }
                 assertEquals("Number of value in the map is " + badValueCnt + " out of "
                         + numElementsInMap, /*expected*/0, /*actual*/badValueCnt);
-            } else {
-                // Map mode is OFF, expect to receive a unity map.
+            } else if (shadingMode == CaptureRequest.SHADING_MODE_OFF) {
+                // shading mode is OFF, expect to receive a unity map.
                 assertTrue("Result map " + Arrays.toString(map) + " must be an unity map",
                         Arrays.equals(unityMap, map));
             }