Snap for 6564423 from 1a463d744403d2cef36eeaf072aabeff46602d48 to rvc-release

Change-Id: I383394eeda122405012e2cbe401378ccd8b2f9b9
diff --git a/src/com/android/camera/one/v2/SimpleOneCameraFactory.java b/src/com/android/camera/one/v2/SimpleOneCameraFactory.java
index 59d94cf..38bd5ee 100644
--- a/src/com/android/camera/one/v2/SimpleOneCameraFactory.java
+++ b/src/com/android/camera/one/v2/SimpleOneCameraFactory.java
@@ -214,7 +214,8 @@
                     pictureTaker = PictureTakerFactory.create(Loggers.tagFactory(), mainExecutor,
                             cameraCommandExecutor, imageSaverBuilder,
                             frameServerComponent.provideFrameServer(),
-                            meteredZoomedRequestBuilder, managedImageReader, flashSetting)
+                            meteredZoomedRequestBuilder, managedImageReader, flashSetting,
+                            characteristics.isContinuousPictureAutoFocusSupported())
                             .providePictureTaker();
                 }
 
diff --git a/src/com/android/camera/one/v2/photo/ConvergedImageCaptureCommand.java b/src/com/android/camera/one/v2/photo/ConvergedImageCaptureCommand.java
index 38a1303..a9cf420 100644
--- a/src/com/android/camera/one/v2/photo/ConvergedImageCaptureCommand.java
+++ b/src/com/android/camera/one/v2/photo/ConvergedImageCaptureCommand.java
@@ -64,16 +64,21 @@
     private final boolean mWaitForAEConvergence;
     private final boolean mWaitForAFConvergence;
 
+    private final boolean mCAFSupport;
+
     /**
      * Transforms a request template by resetting focus and exposure modes.
      */
-    private static RequestBuilder.Factory resetFocusExposureModes(RequestBuilder.Factory template) {
+    private static RequestBuilder.Factory resetFocusExposureModes(RequestBuilder.Factory template,
+            boolean cafSupport) {
         RequestTemplate result = new RequestTemplate(template);
         result.setParam(CaptureRequest.CONTROL_MODE, CaptureRequest.CONTROL_MODE_AUTO);
-        result.setParam(CaptureRequest.CONTROL_AF_MODE,
-                CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTURE);
-        result.setParam(CaptureRequest.CONTROL_AF_TRIGGER,
-                CaptureRequest.CONTROL_AF_TRIGGER_IDLE);
+        if (cafSupport) {
+            result.setParam(CaptureRequest.CONTROL_AF_MODE,
+                    CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTURE);
+            result.setParam(CaptureRequest.CONTROL_AF_TRIGGER,
+                    CaptureRequest.CONTROL_AF_TRIGGER_IDLE);
+        }
         result.setParam(CaptureRequest.CONTROL_AE_PRECAPTURE_TRIGGER,
                 CaptureRequest.CONTROL_AE_PRECAPTURE_TRIGGER_IDLE);
         return result;
@@ -90,6 +95,35 @@
      *            requests.
      * @param burst Creates request builders to use for each image captured from
      * @param waitForAEConvergence
+     */
+    public ConvergedImageCaptureCommand(ManagedImageReader imageReader, FrameServer frameServer,
+            RequestBuilder.Factory repeatingRequestBuilder,
+            int repeatingRequestTemplate, int stillCaptureRequestTemplate,
+            List<RequestBuilder.Factory> burst, boolean waitForAEConvergence) {
+        mImageReader = imageReader;
+        mFrameServer = frameServer;
+        mRepeatingRequestBuilder = repeatingRequestBuilder;
+        mRepeatingRequestTemplate = repeatingRequestTemplate;
+        mStillCaptureRequestTemplate = stillCaptureRequestTemplate;
+        mBurst = burst;
+        mWaitForAEConvergence = waitForAEConvergence;
+        mWaitForAFConvergence = false;
+        mCAFSupport = false;
+
+        mScanRequestTemplate = resetFocusExposureModes(repeatingRequestBuilder, mCAFSupport);
+    }
+
+    /**
+     * @param imageReader Creates the {@link ImageStream} used for capturing
+     *            images to be saved.
+     * @param frameServer Used for interacting with the camera device.
+     * @param repeatingRequestBuilder Creates request builders to use for
+     *            repeating requests sent during the scanning phase and after
+     *            capture is complete.
+     * @param repeatingRequestTemplate The template type to use for repeating
+     *            requests.
+     * @param burst Creates request builders to use for each image captured from
+     * @param waitForAEConvergence
      * @param waitForAFConvergence
      */
     public ConvergedImageCaptureCommand(ManagedImageReader imageReader, FrameServer frameServer,
@@ -105,10 +139,10 @@
         mBurst = burst;
         mWaitForAEConvergence = waitForAEConvergence;
         mWaitForAFConvergence = waitForAFConvergence;
+        mCAFSupport = true;
 
-        mScanRequestTemplate = resetFocusExposureModes(repeatingRequestBuilder);
+        mScanRequestTemplate = resetFocusExposureModes(repeatingRequestBuilder, mCAFSupport);
     }
-
     /**
      * Sends a request to take a picture and blocks until it completes.
      */
@@ -193,8 +227,10 @@
         for (RequestBuilder.Factory builderTemplate : mBurst) {
             RequestBuilder builder = builderTemplate.create(mStillCaptureRequestTemplate);
 
-            builder.setParam(CaptureRequest.CONTROL_AF_MODE, CaptureRequest
-                    .CONTROL_AF_MODE_CONTINUOUS_PICTURE);
+            if (mCAFSupport) {
+                builder.setParam(CaptureRequest.CONTROL_AF_MODE, CaptureRequest
+                        .CONTROL_AF_MODE_CONTINUOUS_PICTURE);
+            }
             builder.setParam(CaptureRequest.CONTROL_CAPTURE_INTENT,
                     CaptureRequest.CONTROL_CAPTURE_INTENT_STILL_CAPTURE);
 
diff --git a/src/com/android/camera/one/v2/photo/PictureTakerFactory.java b/src/com/android/camera/one/v2/photo/PictureTakerFactory.java
index 97dd604..8126d3e 100644
--- a/src/com/android/camera/one/v2/photo/PictureTakerFactory.java
+++ b/src/com/android/camera/one/v2/photo/PictureTakerFactory.java
@@ -43,31 +43,46 @@
             FrameServer frameServer,
             RequestBuilder.Factory rootRequestBuilder,
             ManagedImageReader sharedImageReader,
-            Supplier<OneCamera.PhotoCaptureParameters.Flash> flashMode) {
+            Supplier<OneCamera.PhotoCaptureParameters.Flash> flashMode, boolean cafSupport) {
         // When flash is ON, always use the ConvergedImageCaptureCommand which
-        // performs the AF & AE precapture sequence.
-        ImageCaptureCommand flashOnCommand = new ConvergedImageCaptureCommand(
+        // performs the AE precapture sequence and AF precapture if supported.
+        ImageCaptureCommand flashOnCommand = cafSupport ? new ConvergedImageCaptureCommand(
                 sharedImageReader, frameServer, rootRequestBuilder,
                 CameraDevice.TEMPLATE_PREVIEW /* repeatingRequestTemplate */,
                 CameraDevice.TEMPLATE_STILL_CAPTURE /* stillCaptureRequestTemplate */,
-                Arrays.asList(rootRequestBuilder), true /* ae */, true /* af */);
+                Arrays.asList(rootRequestBuilder), true /* ae */, true /* af */) :
+            new ConvergedImageCaptureCommand(
+                    sharedImageReader, frameServer, rootRequestBuilder,
+                    CameraDevice.TEMPLATE_PREVIEW /* repeatingRequestTemplate */,
+                    CameraDevice.TEMPLATE_STILL_CAPTURE /* stillCaptureRequestTemplate */,
+                    Arrays.asList(rootRequestBuilder), true /* ae */);
 
-        // When flash is OFF, wait for AF convergence, but not AE convergence
+        // When flash is OFF, wait for AF convergence if AF is supported, but not AE convergence
         // (which can be very slow).
-        ImageCaptureCommand flashOffCommand = new ConvergedImageCaptureCommand(
+        ImageCaptureCommand flashOffCommand = cafSupport ? new ConvergedImageCaptureCommand(
                 sharedImageReader, frameServer, rootRequestBuilder,
                 CameraDevice.TEMPLATE_PREVIEW /* repeatingRequestTemplate */,
                 CameraDevice.TEMPLATE_STILL_CAPTURE /* stillCaptureRequestTemplate */,
-                Arrays.asList(rootRequestBuilder), false /* ae */, true /* af */);
+                Arrays.asList(rootRequestBuilder), false /* ae */, true /* af */) :
+            new ConvergedImageCaptureCommand(
+                    sharedImageReader, frameServer, rootRequestBuilder,
+                    CameraDevice.TEMPLATE_PREVIEW /* repeatingRequestTemplate */,
+                    CameraDevice.TEMPLATE_STILL_CAPTURE /* stillCaptureRequestTemplate */,
+                    Arrays.asList(rootRequestBuilder), false /* ae */);
 
-        // When flash is AUTO, wait for AF & AE.
+        // When flash is AUTO, wait for AE and AF if supported.
         // TODO OPTIMIZE If the last converged-AE state indicates that flash is
         // not necessary, then this could skip waiting for AE convergence.
-        ImageCaptureCommand flashAutoCommand = new ConvergedImageCaptureCommand(
+        ImageCaptureCommand flashAutoCommand = cafSupport ? new ConvergedImageCaptureCommand(
                 sharedImageReader, frameServer, rootRequestBuilder,
                 CameraDevice.TEMPLATE_PREVIEW /* repeatingRequestTemplate */,
                 CameraDevice.TEMPLATE_STILL_CAPTURE /* stillCaptureRequestTemplate */,
-                Arrays.asList(rootRequestBuilder), true /* ae */, true /* af */);
+                Arrays.asList(rootRequestBuilder), true /* ae */, true /* af */) :
+            new ConvergedImageCaptureCommand(
+                    sharedImageReader, frameServer, rootRequestBuilder,
+                    CameraDevice.TEMPLATE_PREVIEW /* repeatingRequestTemplate */,
+                    CameraDevice.TEMPLATE_STILL_CAPTURE /* stillCaptureRequestTemplate */,
+                    Arrays.asList(rootRequestBuilder), true /* ae */);
 
         ImageCaptureCommand flashBasedCommand = new FlashBasedPhotoCommand(logFactory, flashMode,
                 flashOnCommand, flashAutoCommand, flashOffCommand);