183d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin/*
283d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin * Copyright (C) 2014 The Android Open Source Project
383d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin *
483d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin * Licensed under the Apache License, Version 2.0 (the "License");
583d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin * you may not use this file except in compliance with the License.
683d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin * You may obtain a copy of the License at
783d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin *
883d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin *      http://www.apache.org/licenses/LICENSE-2.0
983d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin *
1083d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin * Unless required by applicable law or agreed to in writing, software
1183d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin * distributed under the License is distributed on an "AS IS" BASIS,
1283d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1383d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin * See the License for the specific language governing permissions and
1483d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin * limitations under the License.
1583d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin */
1683d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin
1783d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkinpackage android.hardware.camera2.legacy;
1883d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin
1983d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkinimport android.hardware.Camera;
2083d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkinimport android.hardware.Camera.Parameters;
2183d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkinimport android.hardware.camera2.impl.CameraMetadataNative;
2283d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkinimport android.hardware.camera2.CaptureRequest;
2383d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkinimport android.hardware.camera2.CaptureResult;
2483d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkinimport android.hardware.camera2.utils.ParamsUtils;
2583d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkinimport android.util.Log;
2683d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin
2783d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkinimport java.util.Objects;
2883d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin
2983d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkinimport static android.hardware.camera2.CaptureRequest.*;
3083d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkinimport static com.android.internal.util.Preconditions.*;
3183d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin
3283d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin/**
3383d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin * Map capture request data into legacy focus state transitions.
3483d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin *
3583d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin * <p>This object will asynchronously process auto-focus changes, so no interaction
3683d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin * with it is necessary beyond reading the current state and updating with the latest trigger.</p>
3783d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin */
3883d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin@SuppressWarnings("deprecation")
3983d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkinpublic class LegacyFocusStateMapper {
4083d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin    private static String TAG = "LegacyFocusStateMapper";
4183d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin    private static final boolean VERBOSE = Log.isLoggable(TAG, Log.VERBOSE);
4283d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin
4383d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin    private final Camera mCamera;
4483d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin
4583d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin    private int mAfStatePrevious = CONTROL_AF_STATE_INACTIVE;
4683d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin    private String mAfModePrevious = null;
4783d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin
4883d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin    /** Guard mAfRun and mAfState */
4983d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin    private final Object mLock = new Object();
5083d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin    /** Guard access with mLock */
5183d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin    private int mAfRun = 0;
5283d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin    /** Guard access with mLock */
5383d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin    private int mAfState = CONTROL_AF_STATE_INACTIVE;
5483d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin
5583d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin    /**
5683d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin     * Instantiate a new focus state mapper.
5783d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin     *
5883d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin     * @param camera a non-{@code null} camera1 device
5983d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin     *
6083d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin     * @throws NullPointerException if any of the args were {@code null}
6183d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin     */
6283d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin    public LegacyFocusStateMapper(Camera camera) {
6383d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin        mCamera = checkNotNull(camera, "camera must not be null");
6483d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin    }
6583d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin
6683d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin    /**
6783d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin     * Process the AF triggers from the request as a camera1 autofocus routine.
6883d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin     *
6983d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin     * <p>This method should be called after the parameters are {@link LegacyRequestMapper mapped}
7083d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin     * with the request.</p>
7183d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin     *
7283d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin     * <p>Callbacks are processed in the background, and the next call to {@link #mapResultTriggers}
7383d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin     * will have the latest AF state as reflected by the camera1 callbacks.</p>
7483d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin     *
7583d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin     * <p>None of the arguments will be mutated.</p>
7683d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin     *
7783d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin     * @param captureRequest a non-{@code null} request
7883d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin     * @param parameters a non-{@code null} parameters corresponding to this request (read-only)
7983d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin     */
8083d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin    public void processRequestTriggers(CaptureRequest captureRequest,
8183d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin            Camera.Parameters parameters) {
8283d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin        checkNotNull(captureRequest, "captureRequest must not be null");
8383d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin
8483d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin        /*
8583d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin         * control.afTrigger
8683d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin         */
8783d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin        int afTrigger = ParamsUtils.getOrDefault(captureRequest, CONTROL_AF_TRIGGER,
8883d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin                CONTROL_AF_TRIGGER_IDLE);
8983d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin
9083d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin        final String afMode = parameters.getFocusMode();
9183d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin
9283d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin        if (!Objects.equals(mAfModePrevious, afMode)) {
9383d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin            if (VERBOSE) {
9483d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin                Log.v(TAG, "processRequestTriggers - AF mode switched from " + mAfModePrevious +
9583d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin                        " to " + afMode);
9683d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin            }
9783d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin
9883d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin            // Switching modes always goes back to INACTIVE; ignore callbacks from previous modes
9983d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin
10083d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin            synchronized (mLock) {
10183d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin                ++mAfRun;
10283d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin                mAfState = CONTROL_AF_STATE_INACTIVE;
10383d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin            }
1043a3eb157417fb5618518b29d889c23e8831b081cIgor Murashkin            mCamera.cancelAutoFocus();
10583d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin        }
10683d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin
10783d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin        mAfModePrevious = afMode;
10883d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin
10983d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin        // Passive AF Scanning
11083d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin        {
11183d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin            final int currentAfRun;
11283d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin
11383d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin            synchronized (mLock) {
11483d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin                currentAfRun = mAfRun;
11583d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin            }
11683d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin
1173968a3109962c8bb7bde0820af661cefd34bdb42Ruben Brunk            Camera.AutoFocusMoveCallback afMoveCallback = new Camera.AutoFocusMoveCallback() {
11883d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin                @Override
11983d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin                public void onAutoFocusMoving(boolean start, Camera camera) {
12083d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin                    synchronized (mLock) {
12183d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin                        int latestAfRun = mAfRun;
12283d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin
12383d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin                        if (VERBOSE) {
1243968a3109962c8bb7bde0820af661cefd34bdb42Ruben Brunk                            Log.v(TAG,
1253968a3109962c8bb7bde0820af661cefd34bdb42Ruben Brunk                                    "onAutoFocusMoving - start " + start + " latest AF run " +
1263968a3109962c8bb7bde0820af661cefd34bdb42Ruben Brunk                                            latestAfRun + ", last AF run " + currentAfRun
1273968a3109962c8bb7bde0820af661cefd34bdb42Ruben Brunk                            );
12883d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin                        }
12983d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin
13083d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin                        if (currentAfRun != latestAfRun) {
13183d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin                            Log.d(TAG,
13283d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin                                    "onAutoFocusMoving - ignoring move callbacks from old af run"
1333968a3109962c8bb7bde0820af661cefd34bdb42Ruben Brunk                                            + currentAfRun
1343968a3109962c8bb7bde0820af661cefd34bdb42Ruben Brunk                            );
13583d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin                            return;
13683d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin                        }
13783d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin
13883d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin                        int newAfState = start ?
13983d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin                                CONTROL_AF_STATE_PASSIVE_SCAN :
14083d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin                                CONTROL_AF_STATE_PASSIVE_FOCUSED;
14183d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin                        // We never send CONTROL_AF_STATE_PASSIVE_UNFOCUSED
14283d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin
14383d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin                        switch (afMode) {
14483d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin                            case Parameters.FOCUS_MODE_CONTINUOUS_PICTURE:
14583d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin                            case Parameters.FOCUS_MODE_CONTINUOUS_VIDEO:
14683d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin                                break;
14783d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin                            // This callback should never be sent in any other AF mode
14883d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin                            default:
14983d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin                                Log.w(TAG, "onAutoFocus - got unexpected onAutoFocus in mode "
15083d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin                                        + afMode);
15183d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin
15283d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin                        }
15383d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin
15483d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin                        mAfState = newAfState;
15583d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin                    }
15683d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin                }
1573968a3109962c8bb7bde0820af661cefd34bdb42Ruben Brunk            };
1583968a3109962c8bb7bde0820af661cefd34bdb42Ruben Brunk
1593968a3109962c8bb7bde0820af661cefd34bdb42Ruben Brunk            // Only set move callback if we can call autofocus.
1603968a3109962c8bb7bde0820af661cefd34bdb42Ruben Brunk            switch (afMode) {
1613968a3109962c8bb7bde0820af661cefd34bdb42Ruben Brunk                case Parameters.FOCUS_MODE_AUTO:
1623968a3109962c8bb7bde0820af661cefd34bdb42Ruben Brunk                case Parameters.FOCUS_MODE_MACRO:
1633968a3109962c8bb7bde0820af661cefd34bdb42Ruben Brunk                case Parameters.FOCUS_MODE_CONTINUOUS_PICTURE:
1643968a3109962c8bb7bde0820af661cefd34bdb42Ruben Brunk                case Parameters.FOCUS_MODE_CONTINUOUS_VIDEO:
1653968a3109962c8bb7bde0820af661cefd34bdb42Ruben Brunk                    mCamera.setAutoFocusMoveCallback(afMoveCallback);
1663968a3109962c8bb7bde0820af661cefd34bdb42Ruben Brunk            }
16783d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin        }
16883d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin
1693968a3109962c8bb7bde0820af661cefd34bdb42Ruben Brunk
17083d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin        // AF Locking
17183d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin        switch (afTrigger) {
17283d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin            case CONTROL_AF_TRIGGER_START:
1733a3eb157417fb5618518b29d889c23e8831b081cIgor Murashkin
1743a3eb157417fb5618518b29d889c23e8831b081cIgor Murashkin                int afStateAfterStart;
1753a3eb157417fb5618518b29d889c23e8831b081cIgor Murashkin                switch (afMode) {
1763a3eb157417fb5618518b29d889c23e8831b081cIgor Murashkin                    case Parameters.FOCUS_MODE_AUTO:
1773a3eb157417fb5618518b29d889c23e8831b081cIgor Murashkin                    case Parameters.FOCUS_MODE_MACRO:
1783a3eb157417fb5618518b29d889c23e8831b081cIgor Murashkin                        afStateAfterStart = CONTROL_AF_STATE_ACTIVE_SCAN;
1793a3eb157417fb5618518b29d889c23e8831b081cIgor Murashkin                        break;
1803a3eb157417fb5618518b29d889c23e8831b081cIgor Murashkin                    case Parameters.FOCUS_MODE_CONTINUOUS_PICTURE:
1813a3eb157417fb5618518b29d889c23e8831b081cIgor Murashkin                    case Parameters.FOCUS_MODE_CONTINUOUS_VIDEO:
1823a3eb157417fb5618518b29d889c23e8831b081cIgor Murashkin                        afStateAfterStart = CONTROL_AF_STATE_PASSIVE_SCAN;
1833968a3109962c8bb7bde0820af661cefd34bdb42Ruben Brunk                        break;
1843a3eb157417fb5618518b29d889c23e8831b081cIgor Murashkin                    default:
1853a3eb157417fb5618518b29d889c23e8831b081cIgor Murashkin                        // EDOF, INFINITY
1863a3eb157417fb5618518b29d889c23e8831b081cIgor Murashkin                        afStateAfterStart = CONTROL_AF_STATE_INACTIVE;
1873a3eb157417fb5618518b29d889c23e8831b081cIgor Murashkin                }
1883a3eb157417fb5618518b29d889c23e8831b081cIgor Murashkin
18983d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin                final int currentAfRun;
19083d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin                synchronized (mLock) {
19183d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin                    currentAfRun = ++mAfRun;
1923a3eb157417fb5618518b29d889c23e8831b081cIgor Murashkin                    mAfState = afStateAfterStart;
19383d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin                }
19483d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin
19583d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin                if (VERBOSE) {
19683d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin                    Log.v(TAG, "processRequestTriggers - got AF_TRIGGER_START, " +
19783d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin                            "new AF run is " + currentAfRun);
19883d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin                }
19983d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin
2003968a3109962c8bb7bde0820af661cefd34bdb42Ruben Brunk                // Avoid calling autofocus unless we are in a state that supports calling this.
2013968a3109962c8bb7bde0820af661cefd34bdb42Ruben Brunk                if (afStateAfterStart == CONTROL_AF_STATE_INACTIVE) {
2023968a3109962c8bb7bde0820af661cefd34bdb42Ruben Brunk                    break;
2033968a3109962c8bb7bde0820af661cefd34bdb42Ruben Brunk                }
2043968a3109962c8bb7bde0820af661cefd34bdb42Ruben Brunk
20583d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin                mCamera.autoFocus(new Camera.AutoFocusCallback() {
20683d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin                    @Override
20783d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin                    public void onAutoFocus(boolean success, Camera camera) {
20883d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin                        synchronized (mLock) {
20983d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin                            int latestAfRun = mAfRun;
21083d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin
21183d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin                            if (VERBOSE) {
21283d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin                                Log.v(TAG, "onAutoFocus - success " + success + " latest AF run " +
21383d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin                                        latestAfRun + ", last AF run " + currentAfRun);
21483d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin                            }
21583d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin
21683d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin                            // Ignore old auto-focus results, since another trigger was requested
21783d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin                            if (latestAfRun != currentAfRun) {
21883d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin                                Log.d(TAG, String.format("onAutoFocus - ignoring AF callback " +
21983d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin                                        "(old run %d, new run %d)", currentAfRun, latestAfRun));
22083d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin
22183d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin                                return;
22283d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin                            }
22383d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin
22483d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin                            int newAfState = success ?
22583d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin                                    CONTROL_AF_STATE_FOCUSED_LOCKED :
22683d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin                                    CONTROL_AF_STATE_NOT_FOCUSED_LOCKED;
22783d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin
22883d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin                            switch (afMode) {
22983d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin                                case Parameters.FOCUS_MODE_AUTO:
23083d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin                                case Parameters.FOCUS_MODE_CONTINUOUS_PICTURE:
23183d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin                                case Parameters.FOCUS_MODE_CONTINUOUS_VIDEO:
23283d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin                                case Parameters.FOCUS_MODE_MACRO:
23383d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin                                    break;
23483d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin                                // This callback should never be sent in any other AF mode
23583d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin                                default:
23683d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin                                    Log.w(TAG, "onAutoFocus - got unexpected onAutoFocus in mode "
23783d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin                                            + afMode);
23883d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin
23983d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin                            }
24083d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin
24183d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin                            mAfState = newAfState;
24283d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin                        }
24383d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin                    }
24483d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin                });
24583d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin
24683d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin                break;
24783d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin            case CONTROL_AF_TRIGGER_CANCEL:
24883d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin                synchronized (mLock) {
2493a3eb157417fb5618518b29d889c23e8831b081cIgor Murashkin                    int updatedAfRun;
25083d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin
2513a3eb157417fb5618518b29d889c23e8831b081cIgor Murashkin                    synchronized (mLock) {
2523a3eb157417fb5618518b29d889c23e8831b081cIgor Murashkin                        updatedAfRun = ++mAfRun;
2533a3eb157417fb5618518b29d889c23e8831b081cIgor Murashkin                        mAfState = CONTROL_AF_STATE_INACTIVE;
2543a3eb157417fb5618518b29d889c23e8831b081cIgor Murashkin                    }
2553a3eb157417fb5618518b29d889c23e8831b081cIgor Murashkin
2563a3eb157417fb5618518b29d889c23e8831b081cIgor Murashkin                    mCamera.cancelAutoFocus();
25783d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin
25883d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin                    if (VERBOSE) {
25983d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin                        Log.v(TAG, "processRequestTriggers - got AF_TRIGGER_CANCEL, " +
26083d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin                                "new AF run is " + updatedAfRun);
26183d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin                    }
26283d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin                }
26383d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin
26483d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin                break;
26583d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin            case CONTROL_AF_TRIGGER_IDLE:
26683d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin                // No action necessary. The callbacks will handle transitions.
26783d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin                break;
26883d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin            default:
2690a1ef4dbf39aa3dfae1a91daf972ae3457ce27feIgor Murashkin                Log.w(TAG, "processRequestTriggers - ignoring unknown control.afTrigger = "
2700a1ef4dbf39aa3dfae1a91daf972ae3457ce27feIgor Murashkin                        + afTrigger);
27183d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin        }
27283d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin    }
27383d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin
27483d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin    /**
27583d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin     * Update the {@code result} camera metadata map with the new value for the
27683d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin     * {@code control.afState}.
27783d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin     *
27883d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin     * <p>AF callbacks are processed in the background, and each call to {@link #mapResultTriggers}
27983d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin     * will have the latest AF state as reflected by the camera1 callbacks.</p>
28083d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin     *
28183d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin     * @param result a non-{@code null} result
28283d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin     */
28383d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin    public void mapResultTriggers(CameraMetadataNative result) {
28483d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin        checkNotNull(result, "result must not be null");
28583d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin
28683d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin        int newAfState;
28783d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin        synchronized (mLock) {
28883d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin            newAfState = mAfState;
28983d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin        }
29083d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin
29183d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin        if (VERBOSE && newAfState != mAfStatePrevious) {
29283d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin            Log.v(TAG, String.format("mapResultTriggers - afState changed from %s to %s",
29383d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin                    afStateToString(mAfStatePrevious), afStateToString(newAfState)));
29483d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin        }
29583d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin
29683d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin        result.set(CaptureResult.CONTROL_AF_STATE, newAfState);
29783d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin
29883d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin        mAfStatePrevious = newAfState;
29983d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin    }
30083d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin
30183d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin    private static String afStateToString(int afState) {
30283d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin        switch (afState) {
30383d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin            case CONTROL_AF_STATE_ACTIVE_SCAN:
30483d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin                return "ACTIVE_SCAN";
30583d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin            case CONTROL_AF_STATE_FOCUSED_LOCKED:
30683d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin                return "FOCUSED_LOCKED";
30783d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin            case CONTROL_AF_STATE_INACTIVE:
30883d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin                return "INACTIVE";
30983d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin            case CONTROL_AF_STATE_NOT_FOCUSED_LOCKED:
31083d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin                return "NOT_FOCUSED_LOCKED";
31183d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin            case CONTROL_AF_STATE_PASSIVE_FOCUSED:
31283d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin                return "PASSIVE_FOCUSED";
31383d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin            case CONTROL_AF_STATE_PASSIVE_SCAN:
31483d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin                return "PASSIVE_SCAN";
31583d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin            case CONTROL_AF_STATE_PASSIVE_UNFOCUSED:
31683d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin                return "PASSIVE_UNFOCUSED";
31783d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin            default :
31883d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin                return "UNKNOWN(" + afState + ")";
31983d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin        }
32083d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin    }
32183d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin}
322