blob: 1789a964253be6d6ff50c028210eed25ac7ddae8 [file] [log] [blame]
// Copyright 2013 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
package io.flutter.plugins.camera.features.autofocus;
import android.hardware.camera2.CameraCharacteristics;
import android.hardware.camera2.CaptureRequest;
import io.flutter.plugins.camera.CameraProperties;
import io.flutter.plugins.camera.features.CameraFeature;
/** Controls the auto focus configuration on the {@see anddroid.hardware.camera2} API. */
public class AutoFocusFeature extends CameraFeature<FocusMode> {
private FocusMode currentSetting = FocusMode.auto;
// When switching recording modes this feature is re-created with the appropriate setting here.
private final boolean recordingVideo;
/**
* Creates a new instance of the {@see AutoFocusFeature}.
*
* @param cameraProperties Collection of the characteristics for the current camera device.
* @param recordingVideo Indicates whether the camera is currently recording video.
*/
public AutoFocusFeature(CameraProperties cameraProperties, boolean recordingVideo) {
super(cameraProperties);
this.recordingVideo = recordingVideo;
}
@Override
public String getDebugName() {
return "AutoFocusFeature";
}
@Override
public FocusMode getValue() {
return currentSetting;
}
@Override
public void setValue(FocusMode value) {
this.currentSetting = value;
}
@Override
public boolean checkIsSupported() {
int[] modes = cameraProperties.getControlAutoFocusAvailableModes();
final Float minFocus = cameraProperties.getLensInfoMinimumFocusDistance();
// Check if the focal length of the lens is fixed. If the minimum focus distance == 0, then the
// focal length is fixed. The minimum focus distance can be null on some devices: https://developer.android.com/reference/android/hardware/camera2/CameraCharacteristics#LENS_INFO_MINIMUM_FOCUS_DISTANCE
boolean isFixedLength = minFocus == null || minFocus == 0;
return !isFixedLength
&& !(modes.length == 0
|| (modes.length == 1 && modes[0] == CameraCharacteristics.CONTROL_AF_MODE_OFF));
}
@Override
public void updateBuilder(CaptureRequest.Builder requestBuilder) {
if (!checkIsSupported()) {
return;
}
switch (currentSetting) {
case locked:
// When locking the auto-focus the camera device should do a one-time focus and afterwards
// set the auto-focus to idle. This is accomplished by setting the CONTROL_AF_MODE to
// CONTROL_AF_MODE_AUTO.
requestBuilder.set(CaptureRequest.CONTROL_AF_MODE, CaptureRequest.CONTROL_AF_MODE_AUTO);
break;
case auto:
requestBuilder.set(
CaptureRequest.CONTROL_AF_MODE,
recordingVideo
? CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_VIDEO
: CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTURE);
default:
break;
}
}
}