Merge "Camera2: Update focus distance related tags"
diff --git a/api/current.txt b/api/current.txt
index c9d1b5f..c08118e4 100644
--- a/api/current.txt
+++ b/api/current.txt
@@ -11272,6 +11272,7 @@
     field public static final android.hardware.camera2.CameraMetadata.Key LENS_INFO_AVAILABLE_FILTER_DENSITIES;
     field public static final android.hardware.camera2.CameraMetadata.Key LENS_INFO_AVAILABLE_FOCAL_LENGTHS;
     field public static final android.hardware.camera2.CameraMetadata.Key LENS_INFO_AVAILABLE_OPTICAL_STABILIZATION;
+    field public static final android.hardware.camera2.CameraMetadata.Key LENS_INFO_FOCUS_DISTANCE_CALIBRATION;
     field public static final android.hardware.camera2.CameraMetadata.Key LENS_INFO_HYPERFOCAL_DISTANCE;
     field public static final android.hardware.camera2.CameraMetadata.Key LENS_INFO_MINIMUM_FOCUS_DISTANCE;
     field public static final android.hardware.camera2.CameraMetadata.Key LENS_INFO_SHADING_MAP_SIZE;
@@ -11458,6 +11459,9 @@
     field public static final int INFO_SUPPORTED_HARDWARE_LEVEL_LIMITED = 0; // 0x0
     field public static final int LENS_FACING_BACK = 1; // 0x1
     field public static final int LENS_FACING_FRONT = 0; // 0x0
+    field public static final int LENS_INFO_FOCUS_DISTANCE_CALIBRATION_APPROXIMATE = 1; // 0x1
+    field public static final int LENS_INFO_FOCUS_DISTANCE_CALIBRATION_CALIBRATED = 2; // 0x2
+    field public static final int LENS_INFO_FOCUS_DISTANCE_CALIBRATION_UNCALIBRATED = 0; // 0x0
     field public static final int LENS_OPTICAL_STABILIZATION_MODE_OFF = 0; // 0x0
     field public static final int LENS_OPTICAL_STABILIZATION_MODE_ON = 1; // 0x1
     field public static final int LENS_STATE_MOVING = 1; // 0x1
diff --git a/core/java/android/hardware/camera2/CameraCharacteristics.java b/core/java/android/hardware/camera2/CameraCharacteristics.java
index 83314ea..9cd4aae 100644
--- a/core/java/android/hardware/camera2/CameraCharacteristics.java
+++ b/core/java/android/hardware/camera2/CameraCharacteristics.java
@@ -348,19 +348,22 @@
             new Key<byte[]>("android.lens.info.availableOpticalStabilization", byte[].class);
 
     /**
-     * <p>Hyperfocal distance for this lens; set to
-     * 0 if fixed focus</p>
-     * <p>The hyperfocal distance is used for the old
-     * API's 'fixed' setting</p>
+     * <p>Optional. Hyperfocal distance for this lens.</p>
+     * <p>If the lens is fixed focus, the camera device will report 0.</p>
+     * <p>If the lens is not fixed focus, the camera device will report this
+     * field when {@link CameraCharacteristics#LENS_INFO_FOCUS_DISTANCE_CALIBRATION android.lens.info.focusDistanceCalibration} is APPROXIMATE or CALIBRATED.</p>
+     * <p><b>Optional</b> - This value may be {@code null} on some devices.</p>
+     *
+     * @see CameraCharacteristics#LENS_INFO_FOCUS_DISTANCE_CALIBRATION
      */
     public static final Key<Float> LENS_INFO_HYPERFOCAL_DISTANCE =
             new Key<Float>("android.lens.info.hyperfocalDistance", float.class);
 
     /**
      * <p>Shortest distance from frontmost surface
-     * of the lens that can be focused correctly</p>
+     * of the lens that can be focused correctly.</p>
      * <p>If the lens is fixed-focus, this should be
-     * 0</p>
+     * 0.</p>
      */
     public static final Key<Float> LENS_INFO_MINIMUM_FOCUS_DISTANCE =
             new Key<Float>("android.lens.info.minimumFocusDistance", float.class);
@@ -374,6 +377,24 @@
             new Key<android.hardware.camera2.Size>("android.lens.info.shadingMapSize", android.hardware.camera2.Size.class);
 
     /**
+     * <p>The lens focus distance calibration quality.</p>
+     * <p>The lens focus distance calibration quality determines the reliability of
+     * focus related metadata entries, i.e. {@link CaptureRequest#LENS_FOCUS_DISTANCE android.lens.focusDistance},
+     * {@link CaptureResult#LENS_FOCUS_RANGE android.lens.focusRange}, {@link CameraCharacteristics#LENS_INFO_HYPERFOCAL_DISTANCE android.lens.info.hyperfocalDistance}, and
+     * {@link CameraCharacteristics#LENS_INFO_MINIMUM_FOCUS_DISTANCE android.lens.info.minimumFocusDistance}.</p>
+     *
+     * @see CaptureRequest#LENS_FOCUS_DISTANCE
+     * @see CaptureResult#LENS_FOCUS_RANGE
+     * @see CameraCharacteristics#LENS_INFO_HYPERFOCAL_DISTANCE
+     * @see CameraCharacteristics#LENS_INFO_MINIMUM_FOCUS_DISTANCE
+     * @see #LENS_INFO_FOCUS_DISTANCE_CALIBRATION_UNCALIBRATED
+     * @see #LENS_INFO_FOCUS_DISTANCE_CALIBRATION_APPROXIMATE
+     * @see #LENS_INFO_FOCUS_DISTANCE_CALIBRATION_CALIBRATED
+     */
+    public static final Key<Integer> LENS_INFO_FOCUS_DISTANCE_CALIBRATION =
+            new Key<Integer>("android.lens.info.focusDistanceCalibration", int.class);
+
+    /**
      * <p>Direction the camera faces relative to
      * device screen</p>
      * @see #LENS_FACING_FRONT
diff --git a/core/java/android/hardware/camera2/CameraMetadata.java b/core/java/android/hardware/camera2/CameraMetadata.java
index a1f432d..3a0056b 100644
--- a/core/java/android/hardware/camera2/CameraMetadata.java
+++ b/core/java/android/hardware/camera2/CameraMetadata.java
@@ -206,6 +206,45 @@
      *~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~*/
 
     //
+    // Enumeration values for CameraCharacteristics#LENS_INFO_FOCUS_DISTANCE_CALIBRATION
+    //
+
+    /**
+     * <p>The lens focus distance is not accurate, and the units used for
+     * {@link CaptureRequest#LENS_FOCUS_DISTANCE android.lens.focusDistance} do not correspond to any physical units.
+     * Setting the lens to the same focus distance on separate occasions may
+     * result in a different real focus distance, depending on factors such
+     * as the orientation of the device, the age of the focusing mechanism,
+     * and the device temperature. The focus distance value will still be
+     * in the range of <code>[0, {@link CameraCharacteristics#LENS_INFO_MINIMUM_FOCUS_DISTANCE android.lens.info.minimumFocusDistance}]</code>, where 0
+     * represents the farthest focus.</p>
+     *
+     * @see CaptureRequest#LENS_FOCUS_DISTANCE
+     * @see CameraCharacteristics#LENS_INFO_MINIMUM_FOCUS_DISTANCE
+     * @see CameraCharacteristics#LENS_INFO_FOCUS_DISTANCE_CALIBRATION
+     */
+    public static final int LENS_INFO_FOCUS_DISTANCE_CALIBRATION_UNCALIBRATED = 0;
+
+    /**
+     * <p>The lens focus distance is measured in diopters. However, setting the lens
+     * to the same focus distance on separate occasions may result in a
+     * different real focus distance, depending on factors such as the
+     * orientation of the device, the age of the focusing mechanism, and
+     * the device temperature.</p>
+     * @see CameraCharacteristics#LENS_INFO_FOCUS_DISTANCE_CALIBRATION
+     */
+    public static final int LENS_INFO_FOCUS_DISTANCE_CALIBRATION_APPROXIMATE = 1;
+
+    /**
+     * <p>The lens focus distance is measured in diopters. The lens mechanism is
+     * calibrated so that setting the same focus distance is repeatable on
+     * multiple occasions with good accuracy, and the focus distance corresponds
+     * to the real physical distance to the plane of best focus.</p>
+     * @see CameraCharacteristics#LENS_INFO_FOCUS_DISTANCE_CALIBRATION
+     */
+    public static final int LENS_INFO_FOCUS_DISTANCE_CALIBRATION_CALIBRATED = 2;
+
+    //
     // Enumeration values for CameraCharacteristics#LENS_FACING
     //