1 /* 2 * Copyright (C) 2014 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package com.android.camera.one.v2.autofocus; 18 19 import android.graphics.Rect; 20 import android.hardware.camera2.CaptureRequest; 21 import android.hardware.camera2.params.MeteringRectangle; 22 23 import com.android.camera.async.ConcurrentState; 24 import com.android.camera.async.Lifetime; 25 import com.android.camera.async.ResettingDelayedExecutor; 26 import com.android.camera.one.Settings3A; 27 import com.android.camera.one.v2.commands.CameraCommand; 28 import com.android.camera.one.v2.commands.CameraCommandExecutor; 29 import com.android.camera.one.v2.commands.ResettingRunnableCameraCommand; 30 import com.android.camera.one.v2.core.FrameServer; 31 import com.android.camera.one.v2.core.RequestBuilder; 32 import com.android.camera.one.v2.core.RequestTemplate; 33 import com.google.common.base.Supplier; 34 35 import java.util.concurrent.ScheduledExecutorService; 36 import java.util.concurrent.TimeUnit; 37 38 /** 39 * Wires together "tap-to-focus" functionality, providing a 40 * {@link ManualAutoFocus} instance to trigger auto-focus and metering. It also 41 * provides a way of polling for the most up-to-date metering regions. 42 */ 43 public class ManualAutoFocusFactory { 44 private final ManualAutoFocus mManualAutoFocus; 45 private final Supplier<MeteringRectangle[]> mAEMeteringRegion; 46 private final Supplier<MeteringRectangle[]> mAFMeteringRegion; 47 ManualAutoFocusFactory(ManualAutoFocus manualAutoFocus, Supplier<MeteringRectangle[]> aeMeteringRegion, Supplier<MeteringRectangle[]> afMeteringRegion)48 private ManualAutoFocusFactory(ManualAutoFocus manualAutoFocus, 49 Supplier<MeteringRectangle[]> aeMeteringRegion, 50 Supplier<MeteringRectangle[]> afMeteringRegion) { 51 mManualAutoFocus = manualAutoFocus; 52 mAEMeteringRegion = aeMeteringRegion; 53 mAFMeteringRegion = afMeteringRegion; 54 } 55 56 /** 57 * @param lifetime The Lifetime for all created objects. 58 * @param frameServer The FrameServer on which to perform manual AF scans. 59 * @param commandExecutor The command executor on which to interact with the 60 * camera. 61 * @param cropRegion The latest crop region. 62 * @param sensorOrientation The sensor orientation. 63 * @param previewRunner A runnable to restart the preview. 64 * @param rootBuilder The root request builder to use for all requests sent 65 * @param threadPool The executor on which to schedule delayed tasks. 66 * @param afHoldSeconds The number of seconds to hold AF after a manual AF 67 * sweep is triggered. 68 */ create(Lifetime lifetime, FrameServer frameServer, CameraCommandExecutor commandExecutor, Supplier<Rect> cropRegion, int sensorOrientation, Runnable previewRunner, RequestBuilder.Factory rootBuilder, int templateType, Settings3A settings3A, ScheduledExecutorService threadPool, int afHoldSeconds)69 public static ManualAutoFocusFactory create(Lifetime lifetime, FrameServer frameServer, 70 CameraCommandExecutor commandExecutor, Supplier<Rect> cropRegion, 71 int sensorOrientation, 72 Runnable previewRunner, RequestBuilder.Factory rootBuilder, 73 int templateType, Settings3A settings3A, 74 ScheduledExecutorService threadPool, 75 int afHoldSeconds) { 76 ConcurrentState<MeteringParameters> currentMeteringParameters = new ConcurrentState<>( 77 GlobalMeteringParameters.create()); 78 AEMeteringRegion aeMeteringRegion = new AEMeteringRegion(currentMeteringParameters, 79 cropRegion); 80 AFMeteringRegion afMeteringRegion = new AFMeteringRegion(currentMeteringParameters, 81 cropRegion); 82 83 RequestTemplate afScanRequestBuilder = new RequestTemplate(rootBuilder); 84 afScanRequestBuilder.setParam(CaptureRequest.CONTROL_AE_REGIONS, aeMeteringRegion); 85 afScanRequestBuilder.setParam(CaptureRequest.CONTROL_AF_REGIONS, afMeteringRegion); 86 87 CameraCommand afScanCommand = new FullAFScanCommand(frameServer, afScanRequestBuilder, 88 templateType); 89 90 ResettingDelayedExecutor afHoldDelayedExecutor = new ResettingDelayedExecutor( 91 threadPool, afHoldSeconds, TimeUnit.SECONDS); 92 lifetime.add(afHoldDelayedExecutor); 93 94 CameraCommand afScanHoldResetCommand = new AFScanHoldResetCommand(afScanCommand, 95 afHoldDelayedExecutor, previewRunner, currentMeteringParameters); 96 97 Runnable afRunner = new ResettingRunnableCameraCommand(commandExecutor, 98 afScanHoldResetCommand); 99 100 ManualAutoFocusImpl manualAutoFocus = new ManualAutoFocusImpl(currentMeteringParameters, 101 afRunner, sensorOrientation, settings3A); 102 103 return new ManualAutoFocusFactory(manualAutoFocus, aeMeteringRegion, afMeteringRegion); 104 } 105 provideManualAutoFocus()106 public ManualAutoFocus provideManualAutoFocus() { 107 return mManualAutoFocus; 108 } 109 provideAEMeteringRegion()110 public Supplier<MeteringRectangle[]> provideAEMeteringRegion() { 111 return mAEMeteringRegion; 112 } 113 provideAFMeteringRegion()114 public Supplier<MeteringRectangle[]> provideAFMeteringRegion() { 115 return mAFMeteringRegion; 116 } 117 } 118