FocusOverlayManager.java revision 0718d480a144ba0a44c07c48f90e85cf4ec669c6
18872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb/* 28872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb * Copyright (C) 2012 The Android Open Source Project 38872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb * 48872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb * Licensed under the Apache License, Version 2.0 (the "License"); 58872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb * you may not use this file except in compliance with the License. 68872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb * You may obtain a copy of the License at 78872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb * 88872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb * http://www.apache.org/licenses/LICENSE-2.0 98872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb * 108872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb * Unless required by applicable law or agreed to in writing, software 118872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb * distributed under the License is distributed on an "AS IS" BASIS, 128872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 138872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb * See the License for the specific language governing permissions and 148872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb * limitations under the License. 158872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb */ 168872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 178872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolbpackage com.android.camera; 188872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 198872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolbimport android.annotation.TargetApi; 208872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolbimport android.graphics.Matrix; 218872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolbimport android.graphics.Rect; 228872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolbimport android.graphics.RectF; 238872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolbimport android.hardware.Camera.Area; 248872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolbimport android.hardware.Camera.Parameters; 258872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolbimport android.os.Handler; 268872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolbimport android.os.Looper; 278872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolbimport android.os.Message; 288872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolbimport android.util.Log; 298872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 308872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolbimport com.android.camera.ui.FaceView; 318872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolbimport com.android.camera.ui.FocusIndicator; 328872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolbimport com.android.camera.ui.PieRenderer; 338872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolbimport com.android.gallery3d.common.ApiHelper; 348872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 358872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolbimport java.util.ArrayList; 368872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolbimport java.util.List; 378872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 388872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb/* A class that handles everything about focus in still picture mode. 398872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb * This also handles the metering area because it is the same as focus area. 408872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb * 418872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb * The test cases: 428872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb * (1) The camera has continuous autofocus. Move the camera. Take a picture when 438872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb * CAF is not in progress. 448872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb * (2) The camera has continuous autofocus. Move the camera. Take a picture when 458872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb * CAF is in progress. 468872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb * (3) The camera has face detection. Point the camera at some faces. Hold the 478872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb * shutter. Release to take a picture. 488872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb * (4) The camera has face detection. Point the camera at some faces. Single tap 498872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb * the shutter to take a picture. 508872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb * (5) The camera has autofocus. Single tap the shutter to take a picture. 518872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb * (6) The camera has autofocus. Hold the shutter. Release to take a picture. 528872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb * (7) The camera has no autofocus. Single tap the shutter and take a picture. 538872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb * (8) The camera has autofocus and supports focus area. Touch the screen to 548872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb * trigger autofocus. Take a picture. 558872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb * (9) The camera has autofocus and supports focus area. Touch the screen to 568872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb * trigger autofocus. Wait until it times out. 578872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb * (10) The camera has no autofocus and supports metering area. Touch the screen 588872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb * to change metering area. 598872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb */ 608872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolbpublic class FocusOverlayManager { 618872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb private static final String TAG = "CAM_FocusManager"; 628872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 638872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb private static final int RESET_TOUCH_FOCUS = 0; 648872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb private static final int RESET_TOUCH_FOCUS_DELAY = 3000; 658872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 668872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb private int mState = STATE_IDLE; 678872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb private static final int STATE_IDLE = 0; // Focus is not active. 688872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb private static final int STATE_FOCUSING = 1; // Focus is in progress. 698872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb // Focus is in progress and the camera should take a picture after focus finishes. 708872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb private static final int STATE_FOCUSING_SNAP_ON_FINISH = 2; 718872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb private static final int STATE_SUCCESS = 3; // Focus finishes and succeeds. 728872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb private static final int STATE_FAIL = 4; // Focus finishes and fails. 738872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 748872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb private boolean mInitialized; 758872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb private boolean mFocusAreaSupported; 768872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb private boolean mMeteringAreaSupported; 778872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb private boolean mLockAeAwbNeeded; 788872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb private boolean mAeAwbLock; 798872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb private Matrix mMatrix; 808872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 818872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb private PieRenderer mPieRenderer; 828872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 838872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb private int mPreviewWidth; // The width of the preview frame layout. 848872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb private int mPreviewHeight; // The height of the preview frame layout. 858872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb private boolean mMirror; // true if the camera is front-facing. 868872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb private int mDisplayOrientation; 878872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb private FaceView mFaceView; 888872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb private List<Object> mFocusArea; // focus area in driver format 898872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb private List<Object> mMeteringArea; // metering area in driver format 908872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb private String mFocusMode; 918872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb private String[] mDefaultFocusModes; 928872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb private String mOverrideFocusMode; 938872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb private Parameters mParameters; 948872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb private ComboPreferences mPreferences; 958872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb private Handler mHandler; 968872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb Listener mListener; 97e3de7223ee3fe56e097d68f50c5a59ae61370d65Michael Kolb private boolean mPreviousMoving; 980718d480a144ba0a44c07c48f90e85cf4ec669c6Michael Kolb private boolean mFocusDefault; 998872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 1008872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb public interface Listener { 1018872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb public void autoFocus(); 1028872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb public void cancelAutoFocus(); 1038872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb public boolean capture(); 1048872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb public void startFaceDetection(); 1058872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb public void stopFaceDetection(); 1068872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb public void setFocusParameters(); 1078872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 1088872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 1098872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb private class MainHandler extends Handler { 1108872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb public MainHandler(Looper looper) { 1118872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb super(looper); 1128872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 1138872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 1148872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb @Override 1158872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb public void handleMessage(Message msg) { 1168872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb switch (msg.what) { 1178872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb case RESET_TOUCH_FOCUS: { 1188872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb cancelAutoFocus(); 1198872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb mListener.startFaceDetection(); 1208872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb break; 1218872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 1228872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 1238872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 1248872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 1258872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 1268872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb public FocusOverlayManager(ComboPreferences preferences, String[] defaultFocusModes, 1278872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb Parameters parameters, Listener listener, 1288872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb boolean mirror, Looper looper) { 1298872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb mHandler = new MainHandler(looper); 1308872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb mMatrix = new Matrix(); 1318872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb mPreferences = preferences; 1328872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb mDefaultFocusModes = defaultFocusModes; 1338872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb setParameters(parameters); 1348872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb mListener = listener; 1358872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb setMirror(mirror); 1360718d480a144ba0a44c07c48f90e85cf4ec669c6Michael Kolb mFocusDefault = true; 1378872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 1388872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 1398872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb public void setFocusRenderer(PieRenderer renderer) { 1408872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb mPieRenderer = renderer; 1418872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb mInitialized = (mMatrix != null); 1428872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 1438872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 1448872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb public void setParameters(Parameters parameters) { 1458872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb // parameters can only be null when onConfigurationChanged is called 1468872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb // before camera is open. We will just return in this case, because 1478872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb // parameters will be set again later with the right parameters after 1488872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb // camera is open. 1498872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb if (parameters == null) return; 1508872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb mParameters = parameters; 1518872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb mFocusAreaSupported = Util.isFocusAreaSupported(parameters); 1528872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb mMeteringAreaSupported = Util.isMeteringAreaSupported(parameters); 1538872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb mLockAeAwbNeeded = (Util.isAutoExposureLockSupported(mParameters) || 1548872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb Util.isAutoWhiteBalanceLockSupported(mParameters)); 1558872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 1568872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 1578872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb public void setPreviewSize(int previewWidth, int previewHeight) { 1588872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb if (mPreviewWidth != previewWidth || mPreviewHeight != previewHeight) { 1598872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb mPreviewWidth = previewWidth; 1608872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb mPreviewHeight = previewHeight; 1618872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb setMatrix(); 1628872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 1638872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 1648872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 1658872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb public void setMirror(boolean mirror) { 1668872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb mMirror = mirror; 1678872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb setMatrix(); 1688872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 1698872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 1708872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb public void setDisplayOrientation(int displayOrientation) { 1718872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb mDisplayOrientation = displayOrientation; 1728872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb setMatrix(); 1738872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 1748872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 1758872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb public void setFaceView(FaceView faceView) { 1768872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb mFaceView = faceView; 1778872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 1788872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 1798872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb private void setMatrix() { 1808872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb if (mPreviewWidth != 0 && mPreviewHeight != 0) { 1818872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb Matrix matrix = new Matrix(); 1828872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb Util.prepareMatrix(matrix, mMirror, mDisplayOrientation, 1838872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb mPreviewWidth, mPreviewHeight); 1848872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb // In face detection, the matrix converts the driver coordinates to UI 1858872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb // coordinates. In tap focus, the inverted matrix converts the UI 1868872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb // coordinates to driver coordinates. 1878872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb matrix.invert(mMatrix); 1888872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb mInitialized = (mPieRenderer != null); 1898872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 1908872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 1918872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 1928872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb private void lockAeAwbIfNeeded() { 1938872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb if (mLockAeAwbNeeded && !mAeAwbLock) { 1948872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb mAeAwbLock = true; 1958872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb mListener.setFocusParameters(); 1968872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 1978872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 1988872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 1998872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb private void unlockAeAwbIfNeeded() { 2008872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb if (mLockAeAwbNeeded && mAeAwbLock && (mState != STATE_FOCUSING_SNAP_ON_FINISH)) { 2018872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb mAeAwbLock = false; 2028872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb mListener.setFocusParameters(); 2038872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 2048872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 2058872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 2068872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb public void onShutterDown() { 2078872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb if (!mInitialized) return; 2088872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 2098872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb boolean autoFocusCalled = false; 2108872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb if (needAutoFocusCall()) { 2118872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb // Do not focus if touch focus has been triggered. 2128872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb if (mState != STATE_SUCCESS && mState != STATE_FAIL) { 2138872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb autoFocus(); 2148872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb autoFocusCalled = true; 2158872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 2168872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 2178872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 2188872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb if (!autoFocusCalled) lockAeAwbIfNeeded(); 2198872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 2208872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 2218872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb public void onShutterUp() { 2228872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb if (!mInitialized) return; 2238872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 2248872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb if (needAutoFocusCall()) { 2258872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb // User releases half-pressed focus key. 2268872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb if (mState == STATE_FOCUSING || mState == STATE_SUCCESS 2278872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb || mState == STATE_FAIL) { 2288872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb cancelAutoFocus(); 2298872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 2308872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 2318872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 2328872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb // Unlock AE and AWB after cancelAutoFocus. Camera API does not 2338872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb // guarantee setParameters can be called during autofocus. 2348872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb unlockAeAwbIfNeeded(); 2358872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 2368872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 2378872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb public void doSnap() { 2388872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb if (!mInitialized) return; 2398872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 2408872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb // If the user has half-pressed the shutter and focus is completed, we 2418872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb // can take the photo right away. If the focus mode is infinity, we can 2428872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb // also take the photo. 2438872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb if (!needAutoFocusCall() || (mState == STATE_SUCCESS || mState == STATE_FAIL)) { 2448872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb capture(); 2458872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } else if (mState == STATE_FOCUSING) { 2468872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb // Half pressing the shutter (i.e. the focus button event) will 2478872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb // already have requested AF for us, so just request capture on 2488872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb // focus here. 2498872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb mState = STATE_FOCUSING_SNAP_ON_FINISH; 2508872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } else if (mState == STATE_IDLE) { 2518872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb // We didn't do focus. This can happen if the user press focus key 2528872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb // while the snapshot is still in progress. The user probably wants 2538872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb // the next snapshot as soon as possible, so we just do a snapshot 2548872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb // without focusing again. 2558872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb capture(); 2568872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 2578872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 2588872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 2598872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb public void onAutoFocus(boolean focused, boolean shutterButtonPressed) { 2608872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb if (mState == STATE_FOCUSING_SNAP_ON_FINISH) { 2618872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb // Take the picture no matter focus succeeds or fails. No need 2628872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb // to play the AF sound if we're about to play the shutter 2638872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb // sound. 2648872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb if (focused) { 2658872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb mState = STATE_SUCCESS; 2668872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } else { 2678872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb mState = STATE_FAIL; 2688872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 2698872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb updateFocusUI(); 2708872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb capture(); 2718872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } else if (mState == STATE_FOCUSING) { 2728872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb // This happens when (1) user is half-pressing the focus key or 2738872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb // (2) touch focus is triggered. Play the focus tone. Do not 2748872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb // take the picture now. 2758872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb if (focused) { 2768872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb mState = STATE_SUCCESS; 2778872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } else { 2788872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb mState = STATE_FAIL; 2798872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 2808872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb updateFocusUI(); 2818872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb // If this is triggered by touch focus, cancel focus after a 2828872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb // while. 2830718d480a144ba0a44c07c48f90e85cf4ec669c6Michael Kolb if (!mFocusDefault) { 2848872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb mHandler.sendEmptyMessageDelayed(RESET_TOUCH_FOCUS, RESET_TOUCH_FOCUS_DELAY); 2858872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 2868872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb if (shutterButtonPressed) { 2878872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb // Lock AE & AWB so users can half-press shutter and recompose. 2888872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb lockAeAwbIfNeeded(); 2898872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 2908872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } else if (mState == STATE_IDLE) { 2918872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb // User has released the focus key before focus completes. 2928872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb // Do nothing. 2938872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 2948872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 2958872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 2968872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb public void onAutoFocusMoving(boolean moving) { 2978872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb if (!mInitialized) return; 2988872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb // Ignore if the camera has detected some faces. 2998872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb if (mFaceView != null && mFaceView.faceExists()) { 3008872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb mPieRenderer.clear(); 3018872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb return; 3028872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 3038872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 3048872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb // Ignore if we have requested autofocus. This method only handles 3058872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb // continuous autofocus. 3068872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb if (mState != STATE_IDLE) return; 3078872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 308e3de7223ee3fe56e097d68f50c5a59ae61370d65Michael Kolb // animate on false->true trasition only b/8219520 309e3de7223ee3fe56e097d68f50c5a59ae61370d65Michael Kolb if (moving && !mPreviousMoving) { 3108872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb mPieRenderer.showStart(); 311e3de7223ee3fe56e097d68f50c5a59ae61370d65Michael Kolb } else if (!moving) { 3128872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb mPieRenderer.showSuccess(true); 3138872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 314e3de7223ee3fe56e097d68f50c5a59ae61370d65Michael Kolb mPreviousMoving = moving; 3158872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 3168872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 3178872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb @TargetApi(ApiHelper.VERSION_CODES.ICE_CREAM_SANDWICH) 3180718d480a144ba0a44c07c48f90e85cf4ec669c6Michael Kolb private void initializeFocusAreas(int x, int y) { 3198872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb if (mFocusArea == null) { 3208872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb mFocusArea = new ArrayList<Object>(); 3218872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb mFocusArea.add(new Area(new Rect(), 1)); 3228872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 3238872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 3248872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb // Convert the coordinates to driver format. 3250718d480a144ba0a44c07c48f90e85cf4ec669c6Michael Kolb calculateTapArea(x, y, 1f, ((Area) mFocusArea.get(0)).rect); 3268872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 3278872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 3288872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb @TargetApi(ApiHelper.VERSION_CODES.ICE_CREAM_SANDWICH) 3290718d480a144ba0a44c07c48f90e85cf4ec669c6Michael Kolb private void initializeMeteringAreas(int x, int y) { 3308872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb if (mMeteringArea == null) { 3318872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb mMeteringArea = new ArrayList<Object>(); 3328872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb mMeteringArea.add(new Area(new Rect(), 1)); 3338872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 3348872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 3358872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb // Convert the coordinates to driver format. 3368872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb // AE area is bigger because exposure is sensitive and 3378872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb // easy to over- or underexposure if area is too small. 3380718d480a144ba0a44c07c48f90e85cf4ec669c6Michael Kolb calculateTapArea(x, y, 1.5f, ((Area) mMeteringArea.get(0)).rect); 3398872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 3408872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 3418872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb public void onSingleTapUp(int x, int y) { 3428872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb if (!mInitialized || mState == STATE_FOCUSING_SNAP_ON_FINISH) return; 3438872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 3448872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb // Let users be able to cancel previous touch focus. 3450718d480a144ba0a44c07c48f90e85cf4ec669c6Michael Kolb if ((!mFocusDefault) && (mState == STATE_FOCUSING || 3468872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb mState == STATE_SUCCESS || mState == STATE_FAIL)) { 3478872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb cancelAutoFocus(); 3488872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 3490718d480a144ba0a44c07c48f90e85cf4ec669c6Michael Kolb if (mPreviewWidth == 0 || mPreviewHeight == 0) return; 3500718d480a144ba0a44c07c48f90e85cf4ec669c6Michael Kolb mFocusDefault = false; 3518872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb // Initialize mFocusArea. 3528872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb if (mFocusAreaSupported) { 3530718d480a144ba0a44c07c48f90e85cf4ec669c6Michael Kolb initializeFocusAreas(x, y); 3548872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 3558872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb // Initialize mMeteringArea. 3568872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb if (mMeteringAreaSupported) { 3570718d480a144ba0a44c07c48f90e85cf4ec669c6Michael Kolb initializeMeteringAreas(x, y); 3588872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 3598872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 3608872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb // Use margin to set the focus indicator to the touched area. 3618872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb mPieRenderer.setFocus(x, y); 3628872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 3638872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb // Stop face detection because we want to specify focus and metering area. 3648872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb mListener.stopFaceDetection(); 3658872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 3668872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb // Set the focus area and metering area. 3678872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb mListener.setFocusParameters(); 3688872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb if (mFocusAreaSupported) { 3698872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb autoFocus(); 3708872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } else { // Just show the indicator in all other cases. 3718872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb updateFocusUI(); 3728872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb // Reset the metering area in 3 seconds. 3738872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb mHandler.removeMessages(RESET_TOUCH_FOCUS); 3748872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb mHandler.sendEmptyMessageDelayed(RESET_TOUCH_FOCUS, RESET_TOUCH_FOCUS_DELAY); 3758872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 3768872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 3778872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 3788872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb public void onPreviewStarted() { 3798872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb mState = STATE_IDLE; 3808872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 3818872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 3828872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb public void onPreviewStopped() { 3838872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb // If auto focus was in progress, it would have been stopped. 3848872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb mState = STATE_IDLE; 3858872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb resetTouchFocus(); 3868872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb updateFocusUI(); 3878872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 3888872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 3898872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb public void onCameraReleased() { 3908872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb onPreviewStopped(); 3918872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 3928872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 3938872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb private void autoFocus() { 3948872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb Log.v(TAG, "Start autofocus."); 3958872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb mListener.autoFocus(); 3968872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb mState = STATE_FOCUSING; 3978872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb // Pause the face view because the driver will keep sending face 3988872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb // callbacks after the focus completes. 3998872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb if (mFaceView != null) mFaceView.pause(); 4008872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb updateFocusUI(); 4018872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb mHandler.removeMessages(RESET_TOUCH_FOCUS); 4028872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 4038872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 4048872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb private void cancelAutoFocus() { 4058872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb Log.v(TAG, "Cancel autofocus."); 4068872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 4078872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb // Reset the tap area before calling mListener.cancelAutofocus. 4088872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb // Otherwise, focus mode stays at auto and the tap area passed to the 4098872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb // driver is not reset. 4108872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb resetTouchFocus(); 4118872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb mListener.cancelAutoFocus(); 4128872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb if (mFaceView != null) mFaceView.resume(); 4138872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb mState = STATE_IDLE; 4148872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb updateFocusUI(); 4158872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb mHandler.removeMessages(RESET_TOUCH_FOCUS); 4168872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 4178872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 4188872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb private void capture() { 4198872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb if (mListener.capture()) { 4208872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb mState = STATE_IDLE; 4218872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb mHandler.removeMessages(RESET_TOUCH_FOCUS); 4228872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 4238872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 4248872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 4258872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb public String getFocusMode() { 4268872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb if (mOverrideFocusMode != null) return mOverrideFocusMode; 4274a40e126df5a77eaf44a52c73011cbfa91879b54Michael Kolb if (mParameters == null) return Parameters.FOCUS_MODE_AUTO; 4288872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb List<String> supportedFocusModes = mParameters.getSupportedFocusModes(); 4298872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 4300718d480a144ba0a44c07c48f90e85cf4ec669c6Michael Kolb if (mFocusAreaSupported && !mFocusDefault) { 4318872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb // Always use autofocus in tap-to-focus. 4328872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb mFocusMode = Parameters.FOCUS_MODE_AUTO; 4338872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } else { 4348872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb // The default is continuous autofocus. 4358872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb mFocusMode = mPreferences.getString( 4368872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb CameraSettings.KEY_FOCUS_MODE, null); 4378872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 4388872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb // Try to find a supported focus mode from the default list. 4398872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb if (mFocusMode == null) { 4408872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb for (int i = 0; i < mDefaultFocusModes.length; i++) { 4418872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb String mode = mDefaultFocusModes[i]; 4428872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb if (Util.isSupported(mode, supportedFocusModes)) { 4438872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb mFocusMode = mode; 4448872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb break; 4458872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 4468872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 4478872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 4488872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 4498872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb if (!Util.isSupported(mFocusMode, supportedFocusModes)) { 4508872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb // For some reasons, the driver does not support the current 4518872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb // focus mode. Fall back to auto. 4528872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb if (Util.isSupported(Parameters.FOCUS_MODE_AUTO, 4538872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb mParameters.getSupportedFocusModes())) { 4548872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb mFocusMode = Parameters.FOCUS_MODE_AUTO; 4558872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } else { 4568872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb mFocusMode = mParameters.getFocusMode(); 4578872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 4588872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 4598872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb return mFocusMode; 4608872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 4618872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 4628872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb public List getFocusAreas() { 4638872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb return mFocusArea; 4648872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 4658872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 4668872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb public List getMeteringAreas() { 4678872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb return mMeteringArea; 4688872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 4698872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 4708872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb public void updateFocusUI() { 4718872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb if (!mInitialized) return; 4728872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb // Show only focus indicator or face indicator. 4738872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb boolean faceExists = (mFaceView != null && mFaceView.faceExists()); 4748872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb FocusIndicator focusIndicator = (faceExists) ? mFaceView : mPieRenderer; 4758872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 4768872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb if (mState == STATE_IDLE) { 4770718d480a144ba0a44c07c48f90e85cf4ec669c6Michael Kolb if (mFocusDefault) { 4788872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb focusIndicator.clear(); 4798872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } else { 4808872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb // Users touch on the preview and the indicator represents the 4818872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb // metering area. Either focus area is not supported or 4828872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb // autoFocus call is not required. 4838872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb focusIndicator.showStart(); 4848872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 4858872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } else if (mState == STATE_FOCUSING || mState == STATE_FOCUSING_SNAP_ON_FINISH) { 4868872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb focusIndicator.showStart(); 4878872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } else { 4888872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb if (Util.FOCUS_MODE_CONTINUOUS_PICTURE.equals(mFocusMode)) { 4898872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb // TODO: check HAL behavior and decide if this can be removed. 4908872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb focusIndicator.showSuccess(false); 4918872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } else if (mState == STATE_SUCCESS) { 4928872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb focusIndicator.showSuccess(false); 4938872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } else if (mState == STATE_FAIL) { 4948872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb focusIndicator.showFail(false); 4958872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 4968872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 4978872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 4988872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 4998872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb public void resetTouchFocus() { 5008872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb if (!mInitialized) return; 5018872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 5028872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb // Put focus indicator to the center. clear reset position 5038872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb mPieRenderer.clear(); 5040718d480a144ba0a44c07c48f90e85cf4ec669c6Michael Kolb // Initialize mFocusArea. 5050718d480a144ba0a44c07c48f90e85cf4ec669c6Michael Kolb if (mFocusAreaSupported) { 5060718d480a144ba0a44c07c48f90e85cf4ec669c6Michael Kolb initializeFocusAreas(mPreviewWidth / 2, mPreviewHeight / 2); 5070718d480a144ba0a44c07c48f90e85cf4ec669c6Michael Kolb } 5080718d480a144ba0a44c07c48f90e85cf4ec669c6Michael Kolb // Initialize mMeteringArea. 5090718d480a144ba0a44c07c48f90e85cf4ec669c6Michael Kolb if (mMeteringAreaSupported) { 5100718d480a144ba0a44c07c48f90e85cf4ec669c6Michael Kolb initializeMeteringAreas(mPreviewWidth / 2, mPreviewHeight / 2); 5110718d480a144ba0a44c07c48f90e85cf4ec669c6Michael Kolb } 5120718d480a144ba0a44c07c48f90e85cf4ec669c6Michael Kolb mFocusDefault = true; 5138872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 5148872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 5150718d480a144ba0a44c07c48f90e85cf4ec669c6Michael Kolb private void calculateTapArea(int x, int y, float areaMultiple, Rect rect) { 5160718d480a144ba0a44c07c48f90e85cf4ec669c6Michael Kolb int areaSize = (int) (Math.min(mPreviewWidth, mPreviewHeight) * areaMultiple / 20); 5170718d480a144ba0a44c07c48f90e85cf4ec669c6Michael Kolb int left = Util.clamp(x - areaSize, 0, mPreviewWidth - 2 * areaSize); 5180718d480a144ba0a44c07c48f90e85cf4ec669c6Michael Kolb int top = Util.clamp(y - areaSize, 0, mPreviewHeight - 2 * areaSize); 5198872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 5200718d480a144ba0a44c07c48f90e85cf4ec669c6Michael Kolb RectF rectF = new RectF(left, top, left + 2 * areaSize, top + 2 * areaSize); 5218872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb mMatrix.mapRect(rectF); 5228872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb Util.rectFToRect(rectF, rect); 5238872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 5248872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 5258872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb /* package */ int getFocusState() { 5268872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb return mState; 5278872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 5288872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 5298872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb public boolean isFocusCompleted() { 5308872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb return mState == STATE_SUCCESS || mState == STATE_FAIL; 5318872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 5328872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 5338872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb public boolean isFocusingSnapOnFinish() { 5348872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb return mState == STATE_FOCUSING_SNAP_ON_FINISH; 5358872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 5368872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 5378872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb public void removeMessages() { 5388872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb mHandler.removeMessages(RESET_TOUCH_FOCUS); 5398872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 5408872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 5418872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb public void overrideFocusMode(String focusMode) { 5428872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb mOverrideFocusMode = focusMode; 5438872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 5448872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 5458872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb public void setAeAwbLock(boolean lock) { 5468872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb mAeAwbLock = lock; 5478872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 5488872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 5498872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb public boolean getAeAwbLock() { 5508872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb return mAeAwbLock; 5518872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 5528872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 5538872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb private boolean needAutoFocusCall() { 5548872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb String focusMode = getFocusMode(); 5558872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb return !(focusMode.equals(Parameters.FOCUS_MODE_INFINITY) 5568872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb || focusMode.equals(Parameters.FOCUS_MODE_FIXED) 5578872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb || focusMode.equals(Parameters.FOCUS_MODE_EDOF)); 5588872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 5598872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb} 560