package io.fotoapparat.hardware.v2.parameters; import android.hardware.camera2.CameraAccessException; import android.hardware.camera2.CameraDevice; import android.hardware.camera2.CaptureRequest; import android.os.Build; import android.support.annotation.RequiresApi; import android.view.Surface; import io.fotoapparat.hardware.v2.connection.CameraConnection; import io.fotoapparat.hardware.v2.readers.StillSurfaceReader; import io.fotoapparat.hardware.v2.surface.TextureManager; import io.fotoapparat.parameter.Flash; import io.fotoapparat.parameter.FocusMode; /** * Creates {@link CaptureRequest}s for a {@link android.hardware.camera2.CameraCaptureSession}. */ @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP) public class CaptureRequestFactory { private final StillSurfaceReader surfaceReader; private final TextureManager textureManager; private final ParametersProvider parametersProvider; private final CameraConnection cameraConnection; public CaptureRequestFactory(CameraConnection cameraConnection, StillSurfaceReader surfaceReader, TextureManager textureManager, ParametersProvider parametersProvider) { this.cameraConnection = cameraConnection; this.surfaceReader = surfaceReader; this.textureManager = textureManager; this.parametersProvider = parametersProvider; } /** * Creates a request for a window preview. * * @return The camera request. * @throws CameraAccessException If the camera device has been disconnected. */ public CaptureRequest createPreviewRequest() throws CameraAccessException { CameraDevice camera = cameraConnection.getCamera(); Surface viewSurface = textureManager.getSurface(); Flash flash = parametersProvider.getFlash(); return CaptureRequestBuilder .create(camera, CameraDevice.TEMPLATE_PREVIEW) .into(viewSurface) .flash(flash) .build(); } /** * Creates a request responsible to trigger an auto focus request. * * @return The camera request. * @throws CameraAccessException If the camera device has been disconnected. */ public CaptureRequest createLockRequest() throws CameraAccessException { CameraDevice camera = cameraConnection.getCamera(); Surface surface = textureManager.getSurface(); Flash flash = parametersProvider.getFlash(); boolean triggerAutoExposure = !cameraConnection.getCharacteristics().isLegacyDevice(); return CaptureRequestBuilder .create(camera, CameraDevice.TEMPLATE_STILL_CAPTURE) .into(surface) .flash(flash) .triggerAutoFocus(true) .triggerPrecaptureExposure(triggerAutoExposure) .build(); } /** * Creates a request responsible to trigger a precapturing (auto-exposure) request. * * @return The camera request. * @throws CameraAccessException If the camera device has been disconnected. */ public CaptureRequest createExposureGatheringRequest() throws CameraAccessException { CameraDevice camera = cameraConnection.getCamera(); Surface surface = textureManager.getSurface(); Flash flash = parametersProvider.getFlash(); FocusMode focus = parametersProvider.getFocus(); boolean triggerPrecaptureExposure = !cameraConnection.getCharacteristics().isLegacyDevice(); return CaptureRequestBuilder .create(camera, CameraDevice.TEMPLATE_STILL_CAPTURE) .into(surface) .triggerPrecaptureExposure(triggerPrecaptureExposure) .flash(flash) .focus(focus) .setExposureMode(true) .build(); } /** * @return a request to take a photo. * @throws CameraAccessException if the camera device has been disconnected. */ public CaptureRequest createCaptureRequest() throws CameraAccessException { CameraDevice camera = cameraConnection.getCamera(); Surface surface = surfaceReader.getSurface(); Flash flash = parametersProvider.getFlash(); FocusMode focus = parametersProvider.getFocus(); return CaptureRequestBuilder .create(camera, CameraDevice.TEMPLATE_STILL_CAPTURE) .into(surface) .cancelPrecaptureExposure(true) .flash(flash) .focus(focus) .setExposureMode(true) .build(); } }