Merge "Use support level ZSL and Flash only when platform supports" am: 8690a7317d am: 92ab0d63c2
am: 0529fdaedf

Change-Id: Id18345701037b6306f2fec8dc233cd2fb1760833
diff --git a/src/com/android/camera/one/OneCameraCaptureSetting.java b/src/com/android/camera/one/OneCameraCaptureSetting.java
index 76f2042..bff9d64 100644
--- a/src/com/android/camera/one/OneCameraCaptureSetting.java
+++ b/src/com/android/camera/one/OneCameraCaptureSetting.java
@@ -45,8 +45,13 @@
             final HardwareSpec hardwareSpec,
             String cameraSettingScope,
             boolean isHdrPlusEnabled) {
-        Observable<OneCamera.PhotoCaptureParameters.Flash> flashSetting = new FlashSetting(
-                SettingObserver.ofString(settingsManager, cameraSettingScope, Keys.KEY_FLASH_MODE));
+        Observable<OneCamera.PhotoCaptureParameters.Flash> flashSetting;
+        if (hardwareSpec.isFlashSupported()) {
+            flashSetting = new FlashSetting(SettingObserver.ofString(
+                        settingsManager, cameraSettingScope, Keys.KEY_FLASH_MODE));
+        } else {
+            flashSetting = new FlashSetting(Observables.of("off"));
+        }
         Observable<Integer> exposureSetting = SettingObserver.ofInteger(
                 settingsManager, cameraSettingScope, Keys.KEY_EXPOSURE);
         Observable<Boolean> hdrSceneSetting;
diff --git a/src/com/android/camera/one/config/OneCameraFeatureConfigCreator.java b/src/com/android/camera/one/config/OneCameraFeatureConfigCreator.java
index 0cedb18..3e0fb9d 100644
--- a/src/com/android/camera/one/config/OneCameraFeatureConfigCreator.java
+++ b/src/com/android/camera/one/config/OneCameraFeatureConfigCreator.java
@@ -105,9 +105,15 @@
                     }
                 }
 
-                // On FULL devices starting with L-MR1 we can run ZSL.
-                if (supportedLevel == CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL_FULL) {
-                    return CaptureSupportLevel.ZSL;
+                // On FULL devices starting with L-MR1 we can run ZSL if private reprocessing
+                // or YUV reprocessing is supported.
+                if (supportedLevel == CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL_FULL ||
+                        supportedLevel == CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL_3) {
+                    if (supportsReprocessing(characteristics)) {
+                        return CaptureSupportLevel.ZSL;
+                    } else {
+                        return CaptureSupportLevel.LIMITED_YUV;
+                    }
                 }
 
                 // On LIMITED devices starting with L-MR1 we run a simple YUV
@@ -124,6 +130,24 @@
         };
     }
 
+    private static boolean supportsReprocessing(CameraCharacteristics characteristics) {
+        int maxNumInputStreams = characteristics.get(
+                CameraCharacteristics.REQUEST_MAX_NUM_INPUT_STREAMS);
+        if (maxNumInputStreams == 0) {
+            return false;
+        }
+
+        int[] capabilities = characteristics.get(
+                CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES);
+        for (int cap : capabilities) {
+            if (cap == CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES_PRIVATE_REPROCESSING ||
+                    cap == CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES_YUV_REPROCESSING) {
+                return true;
+            }
+        }
+        return false;
+    }
+
     /**
      * @return If an override exits, this returns the capture support hardware
      *         level that should be used on this device.
diff --git a/src/com/android/camera/one/v2/photo/PictureTakerFactory.java b/src/com/android/camera/one/v2/photo/PictureTakerFactory.java
index cf585f3..68ca5a7 100644
--- a/src/com/android/camera/one/v2/photo/PictureTakerFactory.java
+++ b/src/com/android/camera/one/v2/photo/PictureTakerFactory.java
@@ -48,14 +48,14 @@
         // performs the AF & AE precapture sequence.
         ImageCaptureCommand flashOnCommand = new ConvergedImageCaptureCommand(
                 sharedImageReader, frameServer, rootRequestBuilder,
-                CameraDevice.TEMPLATE_ZERO_SHUTTER_LAG, CameraDevice.TEMPLATE_ZERO_SHUTTER_LAG,
+                CameraDevice.TEMPLATE_STILL_CAPTURE, CameraDevice.TEMPLATE_STILL_CAPTURE,
                 Arrays.asList(rootRequestBuilder), true /* ae */, true /* af */);
 
         // When flash is OFF, wait for AF convergence, but not AE convergence
         // (which can be very slow).
         ImageCaptureCommand flashOffCommand = new ConvergedImageCaptureCommand(
                 sharedImageReader, frameServer, rootRequestBuilder,
-                CameraDevice.TEMPLATE_ZERO_SHUTTER_LAG, CameraDevice.TEMPLATE_ZERO_SHUTTER_LAG,
+                CameraDevice.TEMPLATE_STILL_CAPTURE, CameraDevice.TEMPLATE_STILL_CAPTURE,
                 Arrays.asList(rootRequestBuilder), false /* ae */, true /* af */);
 
         // When flash is AUTO, wait for AF & AE.
@@ -63,7 +63,7 @@
         // not necessary, then this could skip waiting for AE convergence.
         ImageCaptureCommand flashAutoCommand = new ConvergedImageCaptureCommand(
                 sharedImageReader, frameServer, rootRequestBuilder,
-                CameraDevice.TEMPLATE_ZERO_SHUTTER_LAG, CameraDevice.TEMPLATE_ZERO_SHUTTER_LAG,
+                CameraDevice.TEMPLATE_STILL_CAPTURE, CameraDevice.TEMPLATE_STILL_CAPTURE,
                 Arrays.asList(rootRequestBuilder), true /* ae */, true /* af */);
 
         ImageCaptureCommand flashBasedCommand = new FlashBasedPhotoCommand(logFactory, flashMode,