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