/** * Copyright (c) 2015 CommonsWare, LLC * <p/> * Licensed under the Apache License, Version 2.0 (the "License"); you may * not use this file except in compliance with the License. You may obtain * a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 * <p/> * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.commonsware.cwac.cam2.plugin; import android.annotation.TargetApi; import android.content.Context; import android.hardware.Camera; import android.hardware.camera2.CameraCharacteristics; import android.hardware.camera2.CameraMetadata; import android.hardware.camera2.CaptureRequest; import android.os.Build; import android.util.Log; import android.view.OrientationEventListener; import com.commonsware.cwac.cam2.CameraConfigurator; import com.commonsware.cwac.cam2.CameraConstraints; import com.commonsware.cwac.cam2.CameraPlugin; import com.commonsware.cwac.cam2.CameraSession; import com.commonsware.cwac.cam2.ClassicCameraConfigurator; import com.commonsware.cwac.cam2.FocusMode; import com.commonsware.cwac.cam2.SimpleCameraTwoConfigurator; import com.commonsware.cwac.cam2.SimpleClassicCameraConfigurator; /** * Plugin for managing focus modes */ public class FocusModePlugin implements CameraPlugin { private final Context ctxt; private final boolean isVideo; private final FocusMode focusMode; private OrientationEventListener orientationEventListener; private int lastOrientation=OrientationEventListener.ORIENTATION_UNKNOWN; public FocusModePlugin(Context ctxt, FocusMode focusMode, boolean isVideo) { this.ctxt=ctxt.getApplicationContext(); this.focusMode=focusMode; this.isVideo=isVideo; orientationEventListener=new OrientationEventListener(ctxt) { @Override public void onOrientationChanged(int orientation) { lastOrientation=orientation; } }; if (orientationEventListener.canDetectOrientation()) { orientationEventListener.enable(); } else { orientationEventListener.disable(); orientationEventListener=null; } } /** * {@inheritDoc} */ @Override public <T extends CameraConfigurator> T buildConfigurator(Class<T> type) { if (type == ClassicCameraConfigurator.class) { return (type.cast(new Classic())); } return(type.cast(new Two())); } /** * {@inheritDoc} */ @Override public void validate(CameraSession session) { // no validation required } /** * {@inheritDoc} */ @Override public void destroy() { if (orientationEventListener!=null) { orientationEventListener.disable(); orientationEventListener=null; } } class Classic extends SimpleClassicCameraConfigurator { /** * {@inheritDoc} */ @Override public Camera.Parameters configureStillCamera( CameraSession session, Camera.CameraInfo info, Camera camera, Camera.Parameters params) { if (params!=null) { String desiredMode=null; if (focusMode==FocusMode.OFF) { desiredMode=Camera.Parameters.FOCUS_MODE_FIXED; } else if (focusMode== FocusMode.EDOF) { desiredMode=Camera.Parameters.FOCUS_MODE_EDOF; } else if (focusMode== FocusMode.MACRO) { desiredMode=Camera.Parameters.FOCUS_MODE_MACRO; } else if (isVideo) { desiredMode= Camera.Parameters.FOCUS_MODE_CONTINUOUS_VIDEO; } else { desiredMode= Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE; } if (params.getSupportedFocusModes().contains(desiredMode)) { params.setFocusMode(desiredMode); } else { Log.e("CWAC-Cam2", "no support for requested focus mode"); } } return(params); } } @TargetApi(Build.VERSION_CODES.LOLLIPOP) class Two extends SimpleCameraTwoConfigurator { /** * {@inheritDoc} */ @Override public void addToPreviewRequest(CameraSession session, CameraCharacteristics cc, CaptureRequest.Builder captureBuilder) { int desiredMode=getDesiredFocusMode(cc); if (desiredMode!=-1) { captureBuilder.set(CaptureRequest.CONTROL_AF_MODE, desiredMode); } else { Log.e("CWAC-Cam2", "no support for requested focus mode"); } } @Override public void addToCaptureRequest(CameraSession session, CameraCharacteristics cc, boolean facingFront, CaptureRequest.Builder captureBuilder) { int desiredMode=getDesiredFocusMode(cc); if (desiredMode!=-1) { captureBuilder.set(CaptureRequest.CONTROL_AF_MODE, desiredMode); } else { Log.e("CWAC-Cam2", "no support for requested focus mode"); } } private int getDesiredFocusMode(CameraCharacteristics cc) { int[] availModes=cc.get(CameraCharacteristics.CONTROL_AF_AVAILABLE_MODES); int desiredMode; if (focusMode==FocusMode.OFF) { desiredMode=CameraMetadata.CONTROL_AF_MODE_OFF; } else if (focusMode==FocusMode.EDOF) { desiredMode=CameraMetadata.CONTROL_AF_MODE_EDOF; } else if (focusMode==FocusMode.MACRO) { desiredMode=CameraMetadata.CONTROL_AF_MODE_MACRO; } else if (isVideo) { desiredMode=CameraMetadata.CONTROL_AF_MODE_CONTINUOUS_VIDEO; } else { desiredMode=CameraMetadata.CONTROL_AF_MODE_CONTINUOUS_PICTURE; } CameraConstraints constraints=CameraConstraints.get(); if (constraints!=null && constraints.getDisableFocusMode()) { desiredMode=CameraMetadata.CONTROL_AF_MODE_OFF; } for (int availMode : availModes) { if (availMode==desiredMode) { return(desiredMode); } } return(-1); } } }