Merge "Camera2: Remove some full hardware level check" into lmp-dev
diff --git a/tests/tests/hardware/src/android/hardware/camera2/cts/AllocationTest.java b/tests/tests/hardware/src/android/hardware/camera2/cts/AllocationTest.java
index 3535d5f..fb23a5f 100644
--- a/tests/tests/hardware/src/android/hardware/camera2/cts/AllocationTest.java
+++ b/tests/tests/hardware/src/android/hardware/camera2/cts/AllocationTest.java
@@ -525,14 +525,21 @@
         /** high iso + high exposure (second shot) */
         final float THRESHOLD_HIGH = 0.975f;
 
-        mCameraIterable.forEachCamera(/*fullHwLevel*/true, new CameraBlock() {
+        mCameraIterable.forEachCamera(/*fullHwLevel*/false, new CameraBlock() {
             @Override
             public void run(CameraDevice camera) throws CameraAccessException {
+                final StaticMetadata staticInfo =
+                        new StaticMetadata(mCameraManager.getCameraCharacteristics(camera.getId()));
+
+                // This test requires PFC and manual sensor control
+                if (!staticInfo.isCapabilitySupported(
+                        CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES_MANUAL_SENSOR) ||
+                        !staticInfo.isPerFrameControlSupported()) {
+                    return;
+                }
 
                 final Size maxSize = getMaxSize(
                         getSupportedSizeForFormat(YUV_420_888, camera.getId(), mCameraManager));
-                final StaticMetadata staticInfo =
-                        new StaticMetadata(mCameraManager.getCameraCharacteristics(camera.getId()));
 
                 ScriptGraph scriptGraph = createGraphForYuvCroppedMeans(maxSize);
 
@@ -578,16 +585,23 @@
         final long EXPOSURE_TIME_NS = 2000000; // 2 seconds
         final int RGB_CHANNELS = 3;
 
-        mCameraIterable.forEachCamera(/*fullHwLevel*/true, new CameraBlock() {
+        mCameraIterable.forEachCamera(/*fullHwLevel*/false, new CameraBlock() {
 
 
             @Override
             public void run(CameraDevice camera) throws CameraAccessException {
+                final StaticMetadata staticInfo =
+                        new StaticMetadata(mCameraManager.getCameraCharacteristics(camera.getId()));
+                // This test requires PFC and manual sensor control
+                if (!staticInfo.isCapabilitySupported(
+                        CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES_MANUAL_SENSOR) ||
+                        !staticInfo.isPerFrameControlSupported()) {
+                    return;
+                }
+
                 final List<float[]> rgbMeans = new ArrayList<float[]>();
                 final Size maxSize = getMaxSize(
                         getSupportedSizeForFormat(YUV_420_888, camera.getId(), mCameraManager));
-                final StaticMetadata staticInfo =
-                        new StaticMetadata(mCameraManager.getCameraCharacteristics(camera.getId()));
 
                 final int sensitivityMin = staticInfo.getSensitivityMinimumOrDefault();
                 final int sensitivityMax = staticInfo.getSensitivityMaximumOrDefault();
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 0c054b1..d275197 100644
--- a/tests/tests/hardware/src/android/hardware/camera2/cts/CaptureRequestTest.java
+++ b/tests/tests/hardware/src/android/hardware/camera2/cts/CaptureRequestTest.java
@@ -65,7 +65,7 @@
     private static final int RGGB_COLOR_CHANNEL_COUNT = 4;
     private static final int MAX_SHADING_MAP_SIZE = 64 * 64 * RGGB_COLOR_CHANNEL_COUNT;
     private static final int MIN_SHADING_MAP_SIZE = 1 * 1 * RGGB_COLOR_CHANNEL_COUNT;
-    private static final long IGORE_REQUESTED_EXPOSURE_TIME_CHECK = -1L;
+    private static final long IGNORE_REQUESTED_EXPOSURE_TIME_CHECK = -1L;
     private static final long EXPOSURE_TIME_BOUNDARY_50HZ_NS = 10000000L; // 10ms
     private static final long EXPOSURE_TIME_BOUNDARY_60HZ_NS = 8333333L; // 8.3ms, Approximation.
     private static final long EXPOSURE_TIME_ERROR_MARGIN_NS = 100000L; // 100us, Approximation.
@@ -133,7 +133,8 @@
             try {
                 openDevice(mCameraIds[i]);
 
-                if (!mStaticInfo.isHardwareLevelFull()) {
+                if (!mStaticInfo.isCapabilitySupported(
+                        CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES_MANUAL_SENSOR)) {
                     continue;
                 }
 
@@ -147,15 +148,17 @@
 
                 Size previewSz =
                         getMaxPreviewSize(mCamera.getId(), mCameraManager, PREVIEW_SIZE_BOUND);
-                startPreview(requestBuilder, previewSz, listener);
 
+                startPreview(requestBuilder, previewSz, listener);
+                waitForSettingsApplied(listener, NUM_FRAMES_WAITED_FOR_UNKNOWN_LATENCY);
                 // No lock OFF state is allowed as the exposure is not changed.
                 verifyBlackLevelLockResults(listener, NUM_FRAMES_VERIFIED, /*maxLockOffCnt*/0);
 
                 // Double the exposure time and gain, with black level still being locked.
                 changeExposure(requestBuilder, DEFAULT_EXP_TIME_NS * 2, DEFAULT_SENSITIVITY * 2);
+                listener = new SimpleCaptureListener();
                 startPreview(requestBuilder, previewSz, listener);
-
+                waitForSettingsApplied(listener, NUM_FRAMES_WAITED_FOR_UNKNOWN_LATENCY);
                 // Allow at most one lock OFF state as the exposure is changed once.
                 verifyBlackLevelLockResults(listener, NUM_FRAMES_VERIFIED, /*maxLockOffCnt*/1);
 
@@ -184,7 +187,7 @@
             try {
                 openDevice(mCameraIds[i]);
 
-                if (!mStaticInfo.isHardwareLevelFull()) {
+                if (!mStaticInfo.isManualLensShadingMapSupported()) {
                     continue;
                 }
 
@@ -203,7 +206,7 @@
 
                 listener = new SimpleCaptureListener();
                 startPreview(requestBuilder, previewSz, listener);
-
+                waitForSettingsApplied(listener, NUM_FRAMES_WAITED_FOR_UNKNOWN_LATENCY);
                 verifyShadingMap(listener, NUM_FRAMES_VERIFIED, SHADING_MODE_OFF);
 
                 // Shading map mode FAST, lensShadingMapMode ON, camera device
@@ -212,7 +215,7 @@
 
                 listener = new SimpleCaptureListener();
                 startPreview(requestBuilder, previewSz, listener);
-
+                waitForSettingsApplied(listener, NUM_FRAMES_WAITED_FOR_UNKNOWN_LATENCY);
                 // Allow at most one lock OFF state as the exposure is changed once.
                 verifyShadingMap(listener, NUM_FRAMES_VERIFIED, SHADING_MODE_FAST);
 
@@ -222,7 +225,7 @@
 
                 listener = new SimpleCaptureListener();
                 startPreview(requestBuilder, previewSz, listener);
-
+                waitForSettingsApplied(listener, NUM_FRAMES_WAITED_FOR_UNKNOWN_LATENCY);
                 verifyShadingMap(listener, NUM_FRAMES_VERIFIED, SHADING_MODE_HIGH_QUALITY);
 
                 stopPreview();
@@ -244,8 +247,10 @@
             try {
                 openDevice(mCameraIds[i]);
 
-                if (!mStaticInfo.isHardwareLevelFull()) {
-                    continue;
+                // Without manual sensor control, exposure time cannot be verified
+                if (!mStaticInfo.isCapabilitySupported(
+                        CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES_MANUAL_SENSOR)) {
+                    return;
                 }
 
                 int[] modes = mStaticInfo.getAeAvailableAntiBandingModesChecked();
@@ -814,7 +819,6 @@
      * @param aeMode The AE mode for flash to test with
      */
     private void flashTestByAeMode(SimpleCaptureListener listener, int aeMode) throws Exception {
-        CaptureRequest request;
         CaptureResult result;
         final int NUM_FLASH_REQUESTS_TESTED = 10;
         CaptureRequest.Builder requestBuilder = createRequestForPreview();
@@ -851,7 +855,8 @@
         requestBuilder.set(CaptureRequest.FLASH_MODE, CaptureRequest.FLASH_MODE_SINGLE);
         CaptureRequest flashSinglerequest = requestBuilder.build();
 
-        int flashModeSingleRequests = captureRequestsSynchronized(flashSinglerequest, listener, mHandler);
+        int flashModeSingleRequests = captureRequestsSynchronized(
+                flashSinglerequest, listener, mHandler);
         waitForNumResults(listener, flashModeSingleRequests - 1);
         result = listener.getCaptureResultForRequest(flashSinglerequest, NUM_RESULTS_WAIT_TIMEOUT);
         // Result mode must be SINGLE, state must be FIRED.
@@ -960,8 +965,9 @@
         // Test auto AE mode anti-banding behavior
         SimpleCaptureListener resultListener = new SimpleCaptureListener();
         startPreview(requestBuilder, size, resultListener);
+        waitForSettingsApplied(resultListener, NUM_FRAMES_WAITED_FOR_UNKNOWN_LATENCY);
         verifyAntiBandingMode(resultListener, NUM_FRAMES_VERIFIED, mode, /*isAeManual*/false,
-                IGORE_REQUESTED_EXPOSURE_TIME_CHECK);
+                IGNORE_REQUESTED_EXPOSURE_TIME_CHECK);
 
         // Test manual AE mode anti-banding behavior
         // 65ms, must be supported by full capability devices.
@@ -970,6 +976,7 @@
         changeExposure(requestBuilder, manualExpTime);
         resultListener = new SimpleCaptureListener();
         startPreview(requestBuilder, size, resultListener);
+        waitForSettingsApplied(resultListener, NUM_FRAMES_WAITED_FOR_UNKNOWN_LATENCY);
         verifyAntiBandingMode(resultListener, NUM_FRAMES_VERIFIED, mode, /*isAeManual*/true,
                 manualExpTime);
 
@@ -1179,7 +1186,8 @@
             CaptureResult result = listener.getCaptureResult(WAIT_FOR_RESULT_TIMEOUT_MS);
             mCollector.expectEquals("Shading mode result doesn't match request",
                     shadingMode, result.get(CaptureResult.SHADING_MODE));
-            LensShadingMap mapObj = result.get(CaptureResult.STATISTICS_LENS_SHADING_CORRECTION_MAP);
+            LensShadingMap mapObj = result.get(
+                    CaptureResult.STATISTICS_LENS_SHADING_CORRECTION_MAP);
             assertNotNull("Map object must not be null", mapObj);
             int numElementsInMap = mapObj.getGainFactorCount();
             float[] map = new float[numElementsInMap];
@@ -1331,9 +1339,7 @@
      * Test tone map mode and result by camera
      */
     private void toneMapTestByCamera() throws Exception {
-        // Can only test full capability because test relies on per frame control
-        // and synchronization.
-        if (!mStaticInfo.isHardwareLevelFull()) {
+        if (!mStaticInfo.isManualToneMapSupported()) {
             return;
         }
 
@@ -1358,6 +1364,7 @@
                 // into another run.
                 listener = new SimpleCaptureListener();
                 startPreview(requestBuilder, maxPreviewSz, listener);
+                waitForSettingsApplied(listener, NUM_FRAMES_WAITED_FOR_UNKNOWN_LATENCY);
                 verifyToneMapModeResults(listener, NUM_FRAMES_VERIFIED, mode,
                         TONEMAP_CURVE_LINEAR);
 
@@ -1368,6 +1375,7 @@
                 // into another run.
                 listener = new SimpleCaptureListener();
                 startPreview(requestBuilder, maxPreviewSz, listener);
+                waitForSettingsApplied(listener, NUM_FRAMES_WAITED_FOR_UNKNOWN_LATENCY);
                 verifyToneMapModeResults(listener, NUM_FRAMES_VERIFIED, mode,
                         TONEMAP_CURVE_SRGB);
             } else {
@@ -1375,6 +1383,7 @@
                 // into another run.
                 listener = new SimpleCaptureListener();
                 startPreview(requestBuilder, maxPreviewSz, listener);
+                waitForSettingsApplied(listener, NUM_FRAMES_WAITED_FOR_UNKNOWN_LATENCY);
                 verifyToneMapModeResults(listener, NUM_FRAMES_VERIFIED, mode,
                         /*inputToneCurve*/null);
             }
diff --git a/tests/tests/hardware/src/android/hardware/camera2/cts/helpers/StaticMetadata.java b/tests/tests/hardware/src/android/hardware/camera2/cts/helpers/StaticMetadata.java
index 0b437ce..a79d3f3 100644
--- a/tests/tests/hardware/src/android/hardware/camera2/cts/helpers/StaticMetadata.java
+++ b/tests/tests/hardware/src/android/hardware/camera2/cts/helpers/StaticMetadata.java
@@ -745,19 +745,18 @@
      * @return maxAnalogSensitivity, 0 if it is not available.
      */
     public int getMaxAnalogSensitivityChecked() {
-        if (!isHardwareLevelFull()) {
-            return 0;
-        }
 
         Key<Integer> key = CameraCharacteristics.SENSOR_MAX_ANALOG_SENSITIVITY;
-        Integer maxAnalogsensitivity = getValueFromKeyNonNull(key);
-        int minSensitivity = getSensitivityMinimumOrDefault();
-        int maxSensitivity = getSensitivityMaximumOrDefault();
-
+        Integer maxAnalogsensitivity = mCharacteristics.get(key);
         if (maxAnalogsensitivity == null) {
+            if (isHardwareLevelFull()) {
+                Assert.fail("Full device should report max analog sensitivity");
+            }
             return 0;
         }
 
+        int minSensitivity = getSensitivityMinimumOrDefault();
+        int maxSensitivity = getSensitivityMaximumOrDefault();
         checkTrueForKey(key, " Max analog sensitivity " + maxAnalogsensitivity
                 + " should be no larger than max sensitivity " + maxSensitivity,
                 maxAnalogsensitivity <= maxSensitivity);