FocusOverlayManager.java revision 638e6f06c877d90b907f66ea9c22b3c6b73c7384
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; 25638e6f06c877d90b907f66ea9c22b3c6b73c7384Sascha Haeberlingimport android.os.Build; 268872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolbimport android.os.Handler; 278872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolbimport android.os.Looper; 288872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolbimport android.os.Message; 298872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolbimport android.util.Log; 308872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 31b50b5cbfbc0a67db6fc43373363b10381c9c61a3Angus Kongimport com.android.camera.util.CameraUtil; 328872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 33638e6f06c877d90b907f66ea9c22b3c6b73c7384Sascha Haeberlingimport java.util.ArrayList; 34638e6f06c877d90b907f66ea9c22b3c6b73c7384Sascha Haeberlingimport java.util.List; 35638e6f06c877d90b907f66ea9c22b3c6b73c7384Sascha Haeberling 368872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb/* A class that handles everything about focus in still picture mode. 378872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb * This also handles the metering area because it is the same as focus area. 388872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb * 398872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb * The test cases: 408872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb * (1) The camera has continuous autofocus. Move the camera. Take a picture when 418872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb * CAF is not in progress. 428872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb * (2) The camera has continuous autofocus. Move the camera. Take a picture when 438872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb * CAF is in progress. 448872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb * (3) The camera has face detection. Point the camera at some faces. Hold the 458872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb * shutter. Release to take a picture. 468872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb * (4) The camera has face detection. Point the camera at some faces. Single tap 478872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb * the shutter to take a picture. 488872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb * (5) The camera has autofocus. Single tap the shutter to take a picture. 498872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb * (6) The camera has autofocus. Hold the shutter. Release to take a picture. 508872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb * (7) The camera has no autofocus. Single tap the shutter and take a picture. 518872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb * (8) The camera has autofocus and supports focus area. Touch the screen to 528872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb * trigger autofocus. Take a picture. 538872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb * (9) The camera has autofocus and supports focus area. Touch the screen to 548872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb * trigger autofocus. Wait until it times out. 558872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb * (10) The camera has no autofocus and supports metering area. Touch the screen 568872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb * to change metering area. 578872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb */ 588872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolbpublic class FocusOverlayManager { 598872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb private static final String TAG = "CAM_FocusManager"; 608872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 618872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb private static final int RESET_TOUCH_FOCUS = 0; 628872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb private static final int RESET_TOUCH_FOCUS_DELAY = 3000; 638872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 648872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb private int mState = STATE_IDLE; 658872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb private static final int STATE_IDLE = 0; // Focus is not active. 668872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb private static final int STATE_FOCUSING = 1; // Focus is in progress. 678872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb // Focus is in progress and the camera should take a picture after focus finishes. 688872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb private static final int STATE_FOCUSING_SNAP_ON_FINISH = 2; 698872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb private static final int STATE_SUCCESS = 3; // Focus finishes and succeeds. 708872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb private static final int STATE_FAIL = 4; // Focus finishes and fails. 718872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 728872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb private boolean mInitialized; 738872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb private boolean mFocusAreaSupported; 748872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb private boolean mMeteringAreaSupported; 758872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb private boolean mLockAeAwbNeeded; 768872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb private boolean mAeAwbLock; 778872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb private Matrix mMatrix; 788872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 798872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb private int mPreviewWidth; // The width of the preview frame layout. 808872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb private int mPreviewHeight; // The height of the preview frame layout. 818872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb private boolean mMirror; // true if the camera is front-facing. 828872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb private int mDisplayOrientation; 838872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb private List<Object> mFocusArea; // focus area in driver format 848872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb private List<Object> mMeteringArea; // metering area in driver format 858872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb private String mFocusMode; 868872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb private String[] mDefaultFocusModes; 878872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb private String mOverrideFocusMode; 888872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb private Parameters mParameters; 898872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb private ComboPreferences mPreferences; 908872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb private Handler mHandler; 918872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb Listener mListener; 92e3de7223ee3fe56e097d68f50c5a59ae61370d65Michael Kolb private boolean mPreviousMoving; 930718d480a144ba0a44c07c48f90e85cf4ec669c6Michael Kolb private boolean mFocusDefault; 948872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 95d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb private FocusUI mUI; 96d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb 97d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb public interface FocusUI { 98d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb public boolean hasFaces(); 99d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb public void clearFocus(); 100d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb public void setFocusPosition(int x, int y); 101d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb public void onFocusStarted(); 102d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb public void onFocusSucceeded(boolean timeOut); 103d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb public void onFocusFailed(boolean timeOut); 104d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb public void pauseFaceDetection(); 105d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb public void resumeFaceDetection(); 106d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb } 107d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb 1088872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb public interface Listener { 1098872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb public void autoFocus(); 1108872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb public void cancelAutoFocus(); 1118872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb public boolean capture(); 1128872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb public void startFaceDetection(); 1138872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb public void stopFaceDetection(); 1148872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb public void setFocusParameters(); 1158872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 1168872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 1178872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb private class MainHandler extends Handler { 1188872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb public MainHandler(Looper looper) { 1198872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb super(looper); 1208872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 1218872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 1228872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb @Override 1238872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb public void handleMessage(Message msg) { 1248872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb switch (msg.what) { 1258872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb case RESET_TOUCH_FOCUS: { 1268872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb cancelAutoFocus(); 1278872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb mListener.startFaceDetection(); 1288872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb break; 1298872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 1308872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 1318872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 1328872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 1338872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 1348872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb public FocusOverlayManager(ComboPreferences preferences, String[] defaultFocusModes, 1358872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb Parameters parameters, Listener listener, 136d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb boolean mirror, Looper looper, FocusUI ui) { 1378872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb mHandler = new MainHandler(looper); 1388872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb mMatrix = new Matrix(); 1398872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb mPreferences = preferences; 1408872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb mDefaultFocusModes = defaultFocusModes; 1418872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb setParameters(parameters); 1428872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb mListener = listener; 1438872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb setMirror(mirror); 1440718d480a144ba0a44c07c48f90e85cf4ec669c6Michael Kolb mFocusDefault = true; 145d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb mUI = ui; 1468872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 1478872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 1488872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb public void setParameters(Parameters parameters) { 1498872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb // parameters can only be null when onConfigurationChanged is called 1508872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb // before camera is open. We will just return in this case, because 1518872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb // parameters will be set again later with the right parameters after 1528872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb // camera is open. 1538872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb if (parameters == null) return; 1548872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb mParameters = parameters; 155b50b5cbfbc0a67db6fc43373363b10381c9c61a3Angus Kong mFocusAreaSupported = CameraUtil.isFocusAreaSupported(parameters); 156b50b5cbfbc0a67db6fc43373363b10381c9c61a3Angus Kong mMeteringAreaSupported = CameraUtil.isMeteringAreaSupported(parameters); 157b50b5cbfbc0a67db6fc43373363b10381c9c61a3Angus Kong mLockAeAwbNeeded = (CameraUtil.isAutoExposureLockSupported(mParameters) || 158b50b5cbfbc0a67db6fc43373363b10381c9c61a3Angus Kong CameraUtil.isAutoWhiteBalanceLockSupported(mParameters)); 1598872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 1608872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 1618872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb public void setPreviewSize(int previewWidth, int previewHeight) { 1628872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb if (mPreviewWidth != previewWidth || mPreviewHeight != previewHeight) { 1638872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb mPreviewWidth = previewWidth; 1648872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb mPreviewHeight = previewHeight; 1658872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb setMatrix(); 1668872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 1678872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 1688872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 1698872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb public void setMirror(boolean mirror) { 1708872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb mMirror = mirror; 1718872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb setMatrix(); 1728872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 1738872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 1748872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb public void setDisplayOrientation(int displayOrientation) { 1758872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb mDisplayOrientation = displayOrientation; 1768872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb setMatrix(); 1778872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 1788872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 1798872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb private void setMatrix() { 1808872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb if (mPreviewWidth != 0 && mPreviewHeight != 0) { 1818872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb Matrix matrix = new Matrix(); 182b50b5cbfbc0a67db6fc43373363b10381c9c61a3Angus Kong CameraUtil.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); 188d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb mInitialized = true; 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; 298d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb 299d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb 3008872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb // Ignore if the camera has detected some faces. 301d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb if (mUI.hasFaces()) { 302d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb mUI.clearFocus(); 3038872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb return; 3048872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 3058872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 3068872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb // Ignore if we have requested autofocus. This method only handles 3078872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb // continuous autofocus. 3088872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb if (mState != STATE_IDLE) return; 3098872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 310e3de7223ee3fe56e097d68f50c5a59ae61370d65Michael Kolb // animate on false->true trasition only b/8219520 311e3de7223ee3fe56e097d68f50c5a59ae61370d65Michael Kolb if (moving && !mPreviousMoving) { 312d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb mUI.onFocusStarted(); 313e3de7223ee3fe56e097d68f50c5a59ae61370d65Michael Kolb } else if (!moving) { 314d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb mUI.onFocusSucceeded(true); 3158872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 316e3de7223ee3fe56e097d68f50c5a59ae61370d65Michael Kolb mPreviousMoving = moving; 3178872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 3188872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 319638e6f06c877d90b907f66ea9c22b3c6b73c7384Sascha Haeberling @TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH) 3200718d480a144ba0a44c07c48f90e85cf4ec669c6Michael Kolb private void initializeFocusAreas(int x, int y) { 3218872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb if (mFocusArea == null) { 3228872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb mFocusArea = new ArrayList<Object>(); 3238872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb mFocusArea.add(new Area(new Rect(), 1)); 3248872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 3258872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 3268872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb // Convert the coordinates to driver format. 3270718d480a144ba0a44c07c48f90e85cf4ec669c6Michael Kolb calculateTapArea(x, y, 1f, ((Area) mFocusArea.get(0)).rect); 3288872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 3298872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 330638e6f06c877d90b907f66ea9c22b3c6b73c7384Sascha Haeberling @TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH) 3310718d480a144ba0a44c07c48f90e85cf4ec669c6Michael Kolb private void initializeMeteringAreas(int x, int y) { 3328872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb if (mMeteringArea == null) { 3338872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb mMeteringArea = new ArrayList<Object>(); 3348872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb mMeteringArea.add(new Area(new Rect(), 1)); 3358872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 3368872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 3378872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb // Convert the coordinates to driver format. 3388872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb // AE area is bigger because exposure is sensitive and 3398872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb // easy to over- or underexposure if area is too small. 3400718d480a144ba0a44c07c48f90e85cf4ec669c6Michael Kolb calculateTapArea(x, y, 1.5f, ((Area) mMeteringArea.get(0)).rect); 3418872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 3428872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 3438872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb public void onSingleTapUp(int x, int y) { 3448872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb if (!mInitialized || mState == STATE_FOCUSING_SNAP_ON_FINISH) return; 3458872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 3468872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb // Let users be able to cancel previous touch focus. 3470718d480a144ba0a44c07c48f90e85cf4ec669c6Michael Kolb if ((!mFocusDefault) && (mState == STATE_FOCUSING || 3488872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb mState == STATE_SUCCESS || mState == STATE_FAIL)) { 3498872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb cancelAutoFocus(); 3508872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 3510718d480a144ba0a44c07c48f90e85cf4ec669c6Michael Kolb if (mPreviewWidth == 0 || mPreviewHeight == 0) return; 3520718d480a144ba0a44c07c48f90e85cf4ec669c6Michael Kolb mFocusDefault = false; 3538872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb // Initialize mFocusArea. 3548872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb if (mFocusAreaSupported) { 3550718d480a144ba0a44c07c48f90e85cf4ec669c6Michael Kolb initializeFocusAreas(x, y); 3568872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 3578872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb // Initialize mMeteringArea. 3588872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb if (mMeteringAreaSupported) { 3590718d480a144ba0a44c07c48f90e85cf4ec669c6Michael Kolb initializeMeteringAreas(x, y); 3608872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 3618872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 3628872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb // Use margin to set the focus indicator to the touched area. 363d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb mUI.setFocusPosition(x, y); 3648872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 3658872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb // Stop face detection because we want to specify focus and metering area. 3668872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb mListener.stopFaceDetection(); 3678872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 3688872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb // Set the focus area and metering area. 3698872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb mListener.setFocusParameters(); 3708872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb if (mFocusAreaSupported) { 3718872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb autoFocus(); 3728872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } else { // Just show the indicator in all other cases. 3738872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb updateFocusUI(); 3748872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb // Reset the metering area in 3 seconds. 3758872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb mHandler.removeMessages(RESET_TOUCH_FOCUS); 3768872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb mHandler.sendEmptyMessageDelayed(RESET_TOUCH_FOCUS, RESET_TOUCH_FOCUS_DELAY); 3778872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 3788872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 3798872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 3808872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb public void onPreviewStarted() { 3818872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb mState = STATE_IDLE; 3828872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 3838872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 3848872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb public void onPreviewStopped() { 3858872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb // If auto focus was in progress, it would have been stopped. 3868872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb mState = STATE_IDLE; 3878872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb resetTouchFocus(); 3888872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb updateFocusUI(); 3898872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 3908872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 3918872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb public void onCameraReleased() { 3928872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb onPreviewStopped(); 3938872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 3948872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 3958872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb private void autoFocus() { 3968872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb Log.v(TAG, "Start autofocus."); 3978872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb mListener.autoFocus(); 3988872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb mState = STATE_FOCUSING; 3998872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb // Pause the face view because the driver will keep sending face 4008872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb // callbacks after the focus completes. 401d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb mUI.pauseFaceDetection(); 4028872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb updateFocusUI(); 4038872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb mHandler.removeMessages(RESET_TOUCH_FOCUS); 4048872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 4058872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 4068872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb private void cancelAutoFocus() { 4078872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb Log.v(TAG, "Cancel autofocus."); 4088872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 4098872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb // Reset the tap area before calling mListener.cancelAutofocus. 4108872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb // Otherwise, focus mode stays at auto and the tap area passed to the 4118872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb // driver is not reset. 4128872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb resetTouchFocus(); 4138872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb mListener.cancelAutoFocus(); 414d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb mUI.resumeFaceDetection(); 4158872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb mState = STATE_IDLE; 4168872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb updateFocusUI(); 4178872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb mHandler.removeMessages(RESET_TOUCH_FOCUS); 4188872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 4198872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 4208872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb private void capture() { 4218872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb if (mListener.capture()) { 4228872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb mState = STATE_IDLE; 4238872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb mHandler.removeMessages(RESET_TOUCH_FOCUS); 4248872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 4258872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 4268872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 4278872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb public String getFocusMode() { 4288872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb if (mOverrideFocusMode != null) return mOverrideFocusMode; 4294a40e126df5a77eaf44a52c73011cbfa91879b54Michael Kolb if (mParameters == null) return Parameters.FOCUS_MODE_AUTO; 4308872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb List<String> supportedFocusModes = mParameters.getSupportedFocusModes(); 4318872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 4320718d480a144ba0a44c07c48f90e85cf4ec669c6Michael Kolb if (mFocusAreaSupported && !mFocusDefault) { 4338872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb // Always use autofocus in tap-to-focus. 4348872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb mFocusMode = Parameters.FOCUS_MODE_AUTO; 4358872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } else { 4368872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb // The default is continuous autofocus. 4378872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb mFocusMode = mPreferences.getString( 4388872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb CameraSettings.KEY_FOCUS_MODE, null); 4398872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 4408872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb // Try to find a supported focus mode from the default list. 4418872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb if (mFocusMode == null) { 4428872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb for (int i = 0; i < mDefaultFocusModes.length; i++) { 4438872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb String mode = mDefaultFocusModes[i]; 444b50b5cbfbc0a67db6fc43373363b10381c9c61a3Angus Kong if (CameraUtil.isSupported(mode, supportedFocusModes)) { 4458872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb mFocusMode = mode; 4468872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb break; 4478872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 4488872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 4498872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 4508872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 451b50b5cbfbc0a67db6fc43373363b10381c9c61a3Angus Kong if (!CameraUtil.isSupported(mFocusMode, supportedFocusModes)) { 4528872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb // For some reasons, the driver does not support the current 4538872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb // focus mode. Fall back to auto. 454b50b5cbfbc0a67db6fc43373363b10381c9c61a3Angus Kong if (CameraUtil.isSupported(Parameters.FOCUS_MODE_AUTO, 4558872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb mParameters.getSupportedFocusModes())) { 4568872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb mFocusMode = Parameters.FOCUS_MODE_AUTO; 4578872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } else { 4588872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb mFocusMode = mParameters.getFocusMode(); 4598872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 4608872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 4618872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb return mFocusMode; 4628872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 4638872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 4648872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb public List getFocusAreas() { 4658872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb return mFocusArea; 4668872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 4678872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 4688872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb public List getMeteringAreas() { 4698872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb return mMeteringArea; 4708872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 4718872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 4728872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb public void updateFocusUI() { 4738872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb if (!mInitialized) return; 4748872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb // Show only focus indicator or face indicator. 4758872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 4768872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb if (mState == STATE_IDLE) { 4770718d480a144ba0a44c07c48f90e85cf4ec669c6Michael Kolb if (mFocusDefault) { 478d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb mUI.clearFocus(); 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. 483d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb mUI.onFocusStarted(); 4848872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 4858872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } else if (mState == STATE_FOCUSING || mState == STATE_FOCUSING_SNAP_ON_FINISH) { 486d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb mUI.onFocusStarted(); 4878872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } else { 488b50b5cbfbc0a67db6fc43373363b10381c9c61a3Angus Kong if (CameraUtil.FOCUS_MODE_CONTINUOUS_PICTURE.equals(mFocusMode)) { 4898872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb // TODO: check HAL behavior and decide if this can be removed. 490d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb mUI.onFocusSucceeded(false); 4918872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } else if (mState == STATE_SUCCESS) { 492d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb mUI.onFocusSucceeded(false); 4938872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } else if (mState == STATE_FAIL) { 494d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb mUI.onFocusFailed(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 503d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb mUI.clearFocus(); 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); 517b50b5cbfbc0a67db6fc43373363b10381c9c61a3Angus Kong int left = CameraUtil.clamp(x - areaSize, 0, mPreviewWidth - 2 * areaSize); 518b50b5cbfbc0a67db6fc43373363b10381c9c61a3Angus Kong int top = CameraUtil.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); 522b50b5cbfbc0a67db6fc43373363b10381c9c61a3Angus Kong CameraUtil.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