124be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu/*
224be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu * Copyright (C) 2015 The Android Open Source Project
324be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu *
424be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu * Licensed under the Apache License, Version 2.0 (the "License");
524be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu * you may not use this file except in compliance with the License.
624be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu * You may obtain a copy of the License at
724be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu *
824be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu *      http://www.apache.org/licenses/LICENSE-2.0
924be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu *
1024be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu * Unless required by applicable law or agreed to in writing, software
1124be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu * distributed under the License is distributed on an "AS IS" BASIS,
1224be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1324be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu * See the License for the specific language governing permissions and
1424be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu * limitations under the License.
1524be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu */
1624be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu
1724be7cc6d138129b4087ef28f114701de54aba3cSenpo Hupackage com.android.camera.captureintent.state;
1824be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu
191d84d7107686aa428ee2eeb1a8caf0ea3e43b1dfPaul Rohdeimport android.view.View;
2024be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu
218c50948fce260d0614daed71fc53ca5bf0e98060Senpo Huimport com.android.camera.ButtonManager;
228c50948fce260d0614daed71fc53ca5bf0e98060Senpo Huimport com.android.camera.app.CameraAppUI;
2324be7cc6d138129b4087ef28f114701de54aba3cSenpo Huimport com.android.camera.async.RefCountBase;
241d84d7107686aa428ee2eeb1a8caf0ea3e43b1dfPaul Rohdeimport com.android.camera.captureintent.event.EventOnOpenCameraFailed;
251d84d7107686aa428ee2eeb1a8caf0ea3e43b1dfPaul Rohdeimport com.android.camera.captureintent.event.EventOnOpenCameraSucceeded;
261d84d7107686aa428ee2eeb1a8caf0ea3e43b1dfPaul Rohdeimport com.android.camera.captureintent.event.EventPause;
278c50948fce260d0614daed71fc53ca5bf0e98060Senpo Huimport com.android.camera.captureintent.event.EventTapOnCancelIntentButton;
288c50948fce260d0614daed71fc53ca5bf0e98060Senpo Huimport com.android.camera.captureintent.event.EventTapOnConfirmPhotoButton;
298c50948fce260d0614daed71fc53ca5bf0e98060Senpo Huimport com.android.camera.captureintent.event.EventTapOnRetakePhotoButton;
308c50948fce260d0614daed71fc53ca5bf0e98060Senpo Huimport com.android.camera.captureintent.event.EventTapOnSwitchCameraButton;
31d2d86155337a7dd9fd285a25c93e27dc05200ed1Senpo Huimport com.android.camera.captureintent.resource.ResourceConstructed;
32d2d86155337a7dd9fd285a25c93e27dc05200ed1Senpo Huimport com.android.camera.captureintent.resource.ResourceSurfaceTexture;
33d2d86155337a7dd9fd285a25c93e27dc05200ed1Senpo Huimport com.android.camera.captureintent.stateful.EventHandler;
34d2d86155337a7dd9fd285a25c93e27dc05200ed1Senpo Huimport com.android.camera.captureintent.stateful.State;
35d2d86155337a7dd9fd285a25c93e27dc05200ed1Senpo Huimport com.android.camera.captureintent.stateful.StateImpl;
3624be7cc6d138129b4087ef28f114701de54aba3cSenpo Huimport com.android.camera.debug.Log;
371d84d7107686aa428ee2eeb1a8caf0ea3e43b1dfPaul Rohdeimport com.android.camera.device.CameraId;
388c50948fce260d0614daed71fc53ca5bf0e98060Senpo Huimport com.android.camera.hardware.HardwareSpec;
3924be7cc6d138129b4087ef28f114701de54aba3cSenpo Huimport com.android.camera.one.OneCamera;
4024be7cc6d138129b4087ef28f114701de54aba3cSenpo Huimport com.android.camera.one.OneCameraAccessException;
41a166b882d74c9c8d638479b79517c99448865e99Senpo Huimport com.android.camera.one.OneCameraCaptureSetting;
4224be7cc6d138129b4087ef28f114701de54aba3cSenpo Huimport com.android.camera.one.OneCameraCharacteristics;
4324be7cc6d138129b4087ef28f114701de54aba3cSenpo Huimport com.android.camera.one.v2.photo.ImageRotationCalculator;
4424be7cc6d138129b4087ef28f114701de54aba3cSenpo Huimport com.android.camera.one.v2.photo.ImageRotationCalculatorImpl;
45cdc63303895d39e6f8b8dc60ba72e73d101ab401zafirimport com.android.camera.settings.Keys;
4670dbb60a3c7100e3fe412e0834e6a32c6ad884deSenpo Huimport com.android.camera.settings.SettingsManager;
4724be7cc6d138129b4087ef28f114701de54aba3cSenpo Huimport com.android.camera.util.Size;
481d84d7107686aa428ee2eeb1a8caf0ea3e43b1dfPaul Rohdeimport com.google.common.annotations.VisibleForTesting;
491d84d7107686aa428ee2eeb1a8caf0ea3e43b1dfPaul Rohdeimport com.google.common.base.Optional;
508c50948fce260d0614daed71fc53ca5bf0e98060Senpo Hu
512914f845c1d53f4a3b9aac68998b521290a7192cPaul Rohdeimport javax.annotation.Nonnull;
522914f845c1d53f4a3b9aac68998b521290a7192cPaul Rohde
531d518e63212290741d66aaf34356bd3897bb609eSenpo Hu/**
541d518e63212290741d66aaf34356bd3897bb609eSenpo Hu * Represents a state that the module is waiting for a camera to be opened.
551d518e63212290741d66aaf34356bd3897bb609eSenpo Hu */
56d2d86155337a7dd9fd285a25c93e27dc05200ed1Senpo Hupublic final class StateOpeningCamera extends StateImpl {
5724be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu    private static final Log.Tag TAG = new Log.Tag("StateOpeningCamera");
5824be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu
5924be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu    private final RefCountBase<ResourceConstructed> mResourceConstructed;
6024be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu    private final RefCountBase<ResourceSurfaceTexture> mResourceSurfaceTexture;
6124be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu    private final OneCamera.Facing mCameraFacing;
621d84d7107686aa428ee2eeb1a8caf0ea3e43b1dfPaul Rohde    private final CameraId mCameraId;
6324be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu    private final OneCameraCharacteristics mCameraCharacteristics;
64cdc63303895d39e6f8b8dc60ba72e73d101ab401zafir    private final String mCameraSettingsScope;
6524be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu
6624be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu    /** The desired picture size. */
6724be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu    private Size mPictureSize;
6824be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu
6924be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu    /** Whether is paused in the middle of opening camera. */
7024be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu    private boolean mIsPaused;
7124be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu
728aefbc59ce6176f27efd47f4a568117bd4d9ea77Senpo Hu    private OneCameraCaptureSetting mOneCameraCaptureSetting;
738aefbc59ce6176f27efd47f4a568117bd4d9ea77Senpo Hu
741b98e83085e2b0a3066a4bf3cbde2d664b8422eeSenpo Hu    private OneCamera.OpenCallback mCameraOpenCallback = new OneCamera.OpenCallback() {
751b98e83085e2b0a3066a4bf3cbde2d664b8422eeSenpo Hu        @Override
761b98e83085e2b0a3066a4bf3cbde2d664b8422eeSenpo Hu        public void onFailure() {
771b98e83085e2b0a3066a4bf3cbde2d664b8422eeSenpo Hu            getStateMachine().processEvent(new EventOnOpenCameraFailed());
781b98e83085e2b0a3066a4bf3cbde2d664b8422eeSenpo Hu        }
791b98e83085e2b0a3066a4bf3cbde2d664b8422eeSenpo Hu
801b98e83085e2b0a3066a4bf3cbde2d664b8422eeSenpo Hu        @Override
811b98e83085e2b0a3066a4bf3cbde2d664b8422eeSenpo Hu        public void onCameraClosed() {
821b98e83085e2b0a3066a4bf3cbde2d664b8422eeSenpo Hu            // Not used anymore.
831b98e83085e2b0a3066a4bf3cbde2d664b8422eeSenpo Hu        }
841b98e83085e2b0a3066a4bf3cbde2d664b8422eeSenpo Hu
851b98e83085e2b0a3066a4bf3cbde2d664b8422eeSenpo Hu        @Override
862914f845c1d53f4a3b9aac68998b521290a7192cPaul Rohde        public void onCameraOpened(@Nonnull final OneCamera camera) {
871b98e83085e2b0a3066a4bf3cbde2d664b8422eeSenpo Hu            getStateMachine().processEvent(new EventOnOpenCameraSucceeded(camera));
881b98e83085e2b0a3066a4bf3cbde2d664b8422eeSenpo Hu        }
891b98e83085e2b0a3066a4bf3cbde2d664b8422eeSenpo Hu    };
901b98e83085e2b0a3066a4bf3cbde2d664b8422eeSenpo Hu
9124be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu    public static StateOpeningCamera from(
92cc6139467c1c9545de1f098d938409e182c9b7adSenpo Hu            State previousState,
9324be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu            RefCountBase<ResourceConstructed> resourceConstructed,
9424be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu            RefCountBase<ResourceSurfaceTexture> resourceSurfaceTexture,
9524be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu            OneCamera.Facing cameraFacing,
961d84d7107686aa428ee2eeb1a8caf0ea3e43b1dfPaul Rohde            CameraId cameraId,
9724be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu            OneCameraCharacteristics cameraCharacteristics) {
98cc6139467c1c9545de1f098d938409e182c9b7adSenpo Hu        return new StateOpeningCamera(previousState, resourceConstructed,
991d84d7107686aa428ee2eeb1a8caf0ea3e43b1dfPaul Rohde                resourceSurfaceTexture, cameraFacing, cameraId, cameraCharacteristics);
10024be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu    }
10124be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu
10224be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu    private StateOpeningCamera(State previousState,
10324be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu            RefCountBase<ResourceConstructed> resourceConstructed,
10424be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu            RefCountBase<ResourceSurfaceTexture> resourceSurfaceTexture,
10524be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu            OneCamera.Facing cameraFacing,
1061d84d7107686aa428ee2eeb1a8caf0ea3e43b1dfPaul Rohde            CameraId cameraId,
10724be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu            OneCameraCharacteristics cameraCharacteristics) {
108d2d86155337a7dd9fd285a25c93e27dc05200ed1Senpo Hu        super(previousState);
10924be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu        mResourceConstructed = resourceConstructed;
11080aed3c513dc6a6670e25ef6e11bc71ab6a2d9fdSenpo Hu        mResourceConstructed.addRef();     // Will be balanced in onLeave().
11124be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu        mResourceSurfaceTexture = resourceSurfaceTexture;
11280aed3c513dc6a6670e25ef6e11bc71ab6a2d9fdSenpo Hu        mResourceSurfaceTexture.addRef();  // Will be balanced in onLeave().
11324be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu        mCameraFacing = cameraFacing;
1141d84d7107686aa428ee2eeb1a8caf0ea3e43b1dfPaul Rohde        mCameraId = cameraId;
11524be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu        mCameraCharacteristics = cameraCharacteristics;
11624be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu        mIsPaused = false;
117cdc63303895d39e6f8b8dc60ba72e73d101ab401zafir        mCameraSettingsScope = SettingsManager.getCameraSettingScope(mCameraId.getValue());
118d2d86155337a7dd9fd285a25c93e27dc05200ed1Senpo Hu        registerEventHandlers();
119d2d86155337a7dd9fd285a25c93e27dc05200ed1Senpo Hu    }
120d2d86155337a7dd9fd285a25c93e27dc05200ed1Senpo Hu
121d2d86155337a7dd9fd285a25c93e27dc05200ed1Senpo Hu    private void registerEventHandlers() {
122d2d86155337a7dd9fd285a25c93e27dc05200ed1Senpo Hu        /** Handles EventPause. */
123d2d86155337a7dd9fd285a25c93e27dc05200ed1Senpo Hu        EventHandler<EventPause> pauseHandler = new EventHandler<EventPause>() {
124d2d86155337a7dd9fd285a25c93e27dc05200ed1Senpo Hu            @Override
125d2d86155337a7dd9fd285a25c93e27dc05200ed1Senpo Hu            public Optional<State> processEvent(EventPause event) {
126d2d86155337a7dd9fd285a25c93e27dc05200ed1Senpo Hu                mIsPaused = true;
127d2d86155337a7dd9fd285a25c93e27dc05200ed1Senpo Hu                return NO_CHANGE;
128d2d86155337a7dd9fd285a25c93e27dc05200ed1Senpo Hu            }
129d2d86155337a7dd9fd285a25c93e27dc05200ed1Senpo Hu        };
130d2d86155337a7dd9fd285a25c93e27dc05200ed1Senpo Hu        setEventHandler(EventPause.class, pauseHandler);
131d2d86155337a7dd9fd285a25c93e27dc05200ed1Senpo Hu
132d2d86155337a7dd9fd285a25c93e27dc05200ed1Senpo Hu        /** Handles EventOnOpenCameraSucceeded. */
133d2d86155337a7dd9fd285a25c93e27dc05200ed1Senpo Hu        EventHandler<EventOnOpenCameraSucceeded> onOpenCameraSucceededHandler =
134d2d86155337a7dd9fd285a25c93e27dc05200ed1Senpo Hu                new EventHandler<EventOnOpenCameraSucceeded>() {
135d2d86155337a7dd9fd285a25c93e27dc05200ed1Senpo Hu                    @Override
136d2d86155337a7dd9fd285a25c93e27dc05200ed1Senpo Hu                    public Optional<State> processEvent(EventOnOpenCameraSucceeded event) {
137d2d86155337a7dd9fd285a25c93e27dc05200ed1Senpo Hu                        final OneCamera camera = event.getCamera();
138d2d86155337a7dd9fd285a25c93e27dc05200ed1Senpo Hu                        if (mIsPaused) {
139d2d86155337a7dd9fd285a25c93e27dc05200ed1Senpo Hu                            // Just close the camera and finish.
140d2d86155337a7dd9fd285a25c93e27dc05200ed1Senpo Hu                            camera.close();
141d2d86155337a7dd9fd285a25c93e27dc05200ed1Senpo Hu                            return Optional.of((State) StateBackgroundWithSurfaceTexture.from(
142d2d86155337a7dd9fd285a25c93e27dc05200ed1Senpo Hu                                    StateOpeningCamera.this,
143d2d86155337a7dd9fd285a25c93e27dc05200ed1Senpo Hu                                    mResourceConstructed,
144d2d86155337a7dd9fd285a25c93e27dc05200ed1Senpo Hu                                    mResourceSurfaceTexture));
145d2d86155337a7dd9fd285a25c93e27dc05200ed1Senpo Hu                        }
1468c50948fce260d0614daed71fc53ca5bf0e98060Senpo Hu
1478c50948fce260d0614daed71fc53ca5bf0e98060Senpo Hu                        mResourceConstructed.get().getMainThread().execute(new Runnable() {
1488c50948fce260d0614daed71fc53ca5bf0e98060Senpo Hu                            @Override
1498c50948fce260d0614daed71fc53ca5bf0e98060Senpo Hu                            public void run() {
1508c50948fce260d0614daed71fc53ca5bf0e98060Senpo Hu                                mResourceConstructed.get().getModuleUI().applyModuleSpecs(
1518c50948fce260d0614daed71fc53ca5bf0e98060Senpo Hu                                        getHardwareSpec(), getBottomBarSpec());
1528c50948fce260d0614daed71fc53ca5bf0e98060Senpo Hu                            }
1538c50948fce260d0614daed71fc53ca5bf0e98060Senpo Hu                        });
1548c50948fce260d0614daed71fc53ca5bf0e98060Senpo Hu
155d2d86155337a7dd9fd285a25c93e27dc05200ed1Senpo Hu                        return Optional.of((State) StateStartingPreview.from(
156d2d86155337a7dd9fd285a25c93e27dc05200ed1Senpo Hu                                StateOpeningCamera.this,
157d2d86155337a7dd9fd285a25c93e27dc05200ed1Senpo Hu                                mResourceConstructed,
158d2d86155337a7dd9fd285a25c93e27dc05200ed1Senpo Hu                                mResourceSurfaceTexture,
159d2d86155337a7dd9fd285a25c93e27dc05200ed1Senpo Hu                                camera,
1601d84d7107686aa428ee2eeb1a8caf0ea3e43b1dfPaul Rohde                                mCameraId,
161d2d86155337a7dd9fd285a25c93e27dc05200ed1Senpo Hu                                mCameraFacing,
162d2d86155337a7dd9fd285a25c93e27dc05200ed1Senpo Hu                                mCameraCharacteristics,
1638aefbc59ce6176f27efd47f4a568117bd4d9ea77Senpo Hu                                mPictureSize,
1648aefbc59ce6176f27efd47f4a568117bd4d9ea77Senpo Hu                                mOneCameraCaptureSetting));
165d2d86155337a7dd9fd285a25c93e27dc05200ed1Senpo Hu                    }
166d2d86155337a7dd9fd285a25c93e27dc05200ed1Senpo Hu                };
167d2d86155337a7dd9fd285a25c93e27dc05200ed1Senpo Hu        setEventHandler(EventOnOpenCameraSucceeded.class, onOpenCameraSucceededHandler);
168d2d86155337a7dd9fd285a25c93e27dc05200ed1Senpo Hu
169d2d86155337a7dd9fd285a25c93e27dc05200ed1Senpo Hu        /** Handles EventOnOpenCameraFailed. */
170d2d86155337a7dd9fd285a25c93e27dc05200ed1Senpo Hu        EventHandler<EventOnOpenCameraFailed> onOpenCameraFailedHandler =
171d2d86155337a7dd9fd285a25c93e27dc05200ed1Senpo Hu                new EventHandler<EventOnOpenCameraFailed>() {
172d2d86155337a7dd9fd285a25c93e27dc05200ed1Senpo Hu                    @Override
173d2d86155337a7dd9fd285a25c93e27dc05200ed1Senpo Hu                    public Optional<State> processEvent(EventOnOpenCameraFailed event) {
174d2d86155337a7dd9fd285a25c93e27dc05200ed1Senpo Hu                        Log.e(TAG, "processOnCameraOpenFailure");
175d2d86155337a7dd9fd285a25c93e27dc05200ed1Senpo Hu                        return Optional.of((State) StateFatal.from(
176d2d86155337a7dd9fd285a25c93e27dc05200ed1Senpo Hu                                StateOpeningCamera.this, mResourceConstructed));
177d2d86155337a7dd9fd285a25c93e27dc05200ed1Senpo Hu                    }
178d2d86155337a7dd9fd285a25c93e27dc05200ed1Senpo Hu                };
179d2d86155337a7dd9fd285a25c93e27dc05200ed1Senpo Hu        setEventHandler(EventOnOpenCameraFailed.class, onOpenCameraFailedHandler);
18024be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu    }
18124be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu
18224be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu    @Override
18324be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu    public Optional<State> onEnter() {
18424be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu        if (mCameraCharacteristics == null) {
18524be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu            Log.e(TAG, "mCameraCharacteristics is null");
18624be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu            return Optional.of((State) StateFatal.from(this, mResourceConstructed));
18724be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu        }
18824be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu        try {
189d6780314422f6cfa6e905f52e2744d7e45bd3b66Alan Newberger            mPictureSize = mResourceConstructed.get().getResolutionSetting().getPictureSize(
190d6780314422f6cfa6e905f52e2744d7e45bd3b66Alan Newberger                    mCameraId, mCameraFacing);
1918aefbc59ce6176f27efd47f4a568117bd4d9ea77Senpo Hu            mOneCameraCaptureSetting = OneCameraCaptureSetting.create(
192d6780314422f6cfa6e905f52e2744d7e45bd3b66Alan Newberger                    mPictureSize,
193a166b882d74c9c8d638479b79517c99448865e99Senpo Hu                    mResourceConstructed.get().getAppController().getSettingsManager(),
194d6780314422f6cfa6e905f52e2744d7e45bd3b66Alan Newberger                    getHardwareSpec(),
195cdc63303895d39e6f8b8dc60ba72e73d101ab401zafir                    mCameraSettingsScope,
196a166b882d74c9c8d638479b79517c99448865e99Senpo Hu                    false);
19724be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu        } catch (OneCameraAccessException ex) {
19824be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu            Log.e(TAG, "Failed while open camera", ex);
19924be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu            return Optional.of((State) StateFatal.from(this, mResourceConstructed));
20024be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu        }
20124be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu
20224be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu        final ImageRotationCalculator imageRotationCalculator = ImageRotationCalculatorImpl.from(
20324be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu                mResourceConstructed.get().getOrientationManager(), mCameraCharacteristics);
204a166b882d74c9c8d638479b79517c99448865e99Senpo Hu
2051d84d7107686aa428ee2eeb1a8caf0ea3e43b1dfPaul Rohde        mResourceConstructed.get().getOneCameraOpener().open(
2061d84d7107686aa428ee2eeb1a8caf0ea3e43b1dfPaul Rohde                mCameraId,
2078aefbc59ce6176f27efd47f4a568117bd4d9ea77Senpo Hu                mOneCameraCaptureSetting,
20824be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu                mResourceConstructed.get().getCameraHandler(),
20924be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu                mResourceConstructed.get().getMainThread(),
21024be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu                imageRotationCalculator,
211cc6139467c1c9545de1f098d938409e182c9b7adSenpo Hu                mResourceConstructed.get().getBurstFacade(),
212cc6139467c1c9545de1f098d938409e182c9b7adSenpo Hu                mResourceConstructed.get().getSoundPlayer(),
21366b942a3d20aac65454961ef2bc219ca560b9fbaPuneet Lall                mCameraOpenCallback,
21466b942a3d20aac65454961ef2bc219ca560b9fbaPuneet Lall                mResourceConstructed.get().getFatalErrorHandler());
21524be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu        return Optional.absent();
21624be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu    }
21724be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu
21824be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu    @Override
21924be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu    public void onLeave() {
22024be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu        mResourceConstructed.close();
22124be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu        mResourceSurfaceTexture.close();
22224be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu    }
223cc6139467c1c9545de1f098d938409e182c9b7adSenpo Hu
224cc6139467c1c9545de1f098d938409e182c9b7adSenpo Hu    @VisibleForTesting
225cc6139467c1c9545de1f098d938409e182c9b7adSenpo Hu    public boolean isPaused() {
226cc6139467c1c9545de1f098d938409e182c9b7adSenpo Hu        return mIsPaused;
227cc6139467c1c9545de1f098d938409e182c9b7adSenpo Hu    }
2288c50948fce260d0614daed71fc53ca5bf0e98060Senpo Hu
2298c50948fce260d0614daed71fc53ca5bf0e98060Senpo Hu    private HardwareSpec getHardwareSpec() {
2308c50948fce260d0614daed71fc53ca5bf0e98060Senpo Hu        return new HardwareSpec() {
2318c50948fce260d0614daed71fc53ca5bf0e98060Senpo Hu            @Override
2328c50948fce260d0614daed71fc53ca5bf0e98060Senpo Hu            public boolean isFrontCameraSupported() {
2331d84d7107686aa428ee2eeb1a8caf0ea3e43b1dfPaul Rohde                return mResourceConstructed.get()
2341d84d7107686aa428ee2eeb1a8caf0ea3e43b1dfPaul Rohde                      .getOneCameraManager().hasCameraFacing(OneCamera.Facing.FRONT);
2358c50948fce260d0614daed71fc53ca5bf0e98060Senpo Hu            }
2368c50948fce260d0614daed71fc53ca5bf0e98060Senpo Hu
2378c50948fce260d0614daed71fc53ca5bf0e98060Senpo Hu            @Override
2388c50948fce260d0614daed71fc53ca5bf0e98060Senpo Hu            public boolean isHdrSupported() {
2398c50948fce260d0614daed71fc53ca5bf0e98060Senpo Hu                return false;
2408c50948fce260d0614daed71fc53ca5bf0e98060Senpo Hu            }
2418c50948fce260d0614daed71fc53ca5bf0e98060Senpo Hu
2428c50948fce260d0614daed71fc53ca5bf0e98060Senpo Hu            @Override
2438c50948fce260d0614daed71fc53ca5bf0e98060Senpo Hu            public boolean isHdrPlusSupported() {
2448c50948fce260d0614daed71fc53ca5bf0e98060Senpo Hu                return false;
2458c50948fce260d0614daed71fc53ca5bf0e98060Senpo Hu            }
2468c50948fce260d0614daed71fc53ca5bf0e98060Senpo Hu
2478c50948fce260d0614daed71fc53ca5bf0e98060Senpo Hu            @Override
2488c50948fce260d0614daed71fc53ca5bf0e98060Senpo Hu            public boolean isFlashSupported() {
2498c50948fce260d0614daed71fc53ca5bf0e98060Senpo Hu                return mCameraCharacteristics.isFlashSupported();
2508c50948fce260d0614daed71fc53ca5bf0e98060Senpo Hu            }
2518c50948fce260d0614daed71fc53ca5bf0e98060Senpo Hu        };
2528c50948fce260d0614daed71fc53ca5bf0e98060Senpo Hu    }
2538c50948fce260d0614daed71fc53ca5bf0e98060Senpo Hu
2548c50948fce260d0614daed71fc53ca5bf0e98060Senpo Hu    private CameraAppUI.BottomBarUISpec getBottomBarSpec() {
2558c50948fce260d0614daed71fc53ca5bf0e98060Senpo Hu        CameraAppUI.BottomBarUISpec bottomBarSpec = new CameraAppUI.BottomBarUISpec();
2568c50948fce260d0614daed71fc53ca5bf0e98060Senpo Hu        /** Camera switch button UI spec. */
2578c50948fce260d0614daed71fc53ca5bf0e98060Senpo Hu        bottomBarSpec.enableCamera = true;
2588c50948fce260d0614daed71fc53ca5bf0e98060Senpo Hu        bottomBarSpec.cameraCallback = new ButtonManager.ButtonCallback() {
2598c50948fce260d0614daed71fc53ca5bf0e98060Senpo Hu            @Override
2608c50948fce260d0614daed71fc53ca5bf0e98060Senpo Hu            public void onStateChanged(int cameraId) {
2618c50948fce260d0614daed71fc53ca5bf0e98060Senpo Hu                getStateMachine().processEvent(new EventTapOnSwitchCameraButton());
2628c50948fce260d0614daed71fc53ca5bf0e98060Senpo Hu            }
2638c50948fce260d0614daed71fc53ca5bf0e98060Senpo Hu        };
2648c50948fce260d0614daed71fc53ca5bf0e98060Senpo Hu        /** Grid lines button UI spec. */
2658c50948fce260d0614daed71fc53ca5bf0e98060Senpo Hu        bottomBarSpec.enableGridLines = true;
2668c50948fce260d0614daed71fc53ca5bf0e98060Senpo Hu        /** HDR button UI spec. */
2678c50948fce260d0614daed71fc53ca5bf0e98060Senpo Hu        bottomBarSpec.enableHdr = false;
2688c50948fce260d0614daed71fc53ca5bf0e98060Senpo Hu        bottomBarSpec.hideHdr = true;
2698c50948fce260d0614daed71fc53ca5bf0e98060Senpo Hu        bottomBarSpec.hdrCallback = null;
2708c50948fce260d0614daed71fc53ca5bf0e98060Senpo Hu        /** Timer button UI spec. */
2718c50948fce260d0614daed71fc53ca5bf0e98060Senpo Hu        bottomBarSpec.enableSelfTimer = true;
2728c50948fce260d0614daed71fc53ca5bf0e98060Senpo Hu        bottomBarSpec.showSelfTimer = true;
2738c50948fce260d0614daed71fc53ca5bf0e98060Senpo Hu        /** Flash button UI spec. */
2748c50948fce260d0614daed71fc53ca5bf0e98060Senpo Hu        bottomBarSpec.enableFlash = mCameraCharacteristics.isFlashSupported();
2758c50948fce260d0614daed71fc53ca5bf0e98060Senpo Hu
276cdc63303895d39e6f8b8dc60ba72e73d101ab401zafir        /** Setup exposure compensation */
277cdc63303895d39e6f8b8dc60ba72e73d101ab401zafir        bottomBarSpec.isExposureCompensationSupported = mCameraCharacteristics
278cdc63303895d39e6f8b8dc60ba72e73d101ab401zafir                .isExposureCompensationSupported();
279cdc63303895d39e6f8b8dc60ba72e73d101ab401zafir        bottomBarSpec.enableExposureCompensation = bottomBarSpec.isExposureCompensationSupported;
280cdc63303895d39e6f8b8dc60ba72e73d101ab401zafir        bottomBarSpec.minExposureCompensation =
281cdc63303895d39e6f8b8dc60ba72e73d101ab401zafir                mCameraCharacteristics.getMinExposureCompensation();
282cdc63303895d39e6f8b8dc60ba72e73d101ab401zafir        bottomBarSpec.maxExposureCompensation =
283cdc63303895d39e6f8b8dc60ba72e73d101ab401zafir                mCameraCharacteristics.getMaxExposureCompensation();
284cdc63303895d39e6f8b8dc60ba72e73d101ab401zafir        bottomBarSpec.exposureCompensationStep =
285cdc63303895d39e6f8b8dc60ba72e73d101ab401zafir                mCameraCharacteristics.getExposureCompensationStep();
286cdc63303895d39e6f8b8dc60ba72e73d101ab401zafir        bottomBarSpec.exposureCompensationSetCallback =
287cdc63303895d39e6f8b8dc60ba72e73d101ab401zafir                new CameraAppUI.BottomBarUISpec.ExposureCompensationSetCallback() {
288cdc63303895d39e6f8b8dc60ba72e73d101ab401zafir                    @Override
289cdc63303895d39e6f8b8dc60ba72e73d101ab401zafir                    public void setExposure(int value) {
290cdc63303895d39e6f8b8dc60ba72e73d101ab401zafir                        mResourceConstructed.get().getSettingsManager().set(
291cdc63303895d39e6f8b8dc60ba72e73d101ab401zafir                                mCameraSettingsScope, Keys.KEY_EXPOSURE, value);
292cdc63303895d39e6f8b8dc60ba72e73d101ab401zafir                    }
293cdc63303895d39e6f8b8dc60ba72e73d101ab401zafir                };
294cdc63303895d39e6f8b8dc60ba72e73d101ab401zafir
2958c50948fce260d0614daed71fc53ca5bf0e98060Senpo Hu        /** Intent image review UI spec. */
2968c50948fce260d0614daed71fc53ca5bf0e98060Senpo Hu        bottomBarSpec.showCancel = true;
2978c50948fce260d0614daed71fc53ca5bf0e98060Senpo Hu        bottomBarSpec.cancelCallback = new View.OnClickListener() {
2988c50948fce260d0614daed71fc53ca5bf0e98060Senpo Hu            @Override
2998c50948fce260d0614daed71fc53ca5bf0e98060Senpo Hu            public void onClick(View v) {
3008c50948fce260d0614daed71fc53ca5bf0e98060Senpo Hu                getStateMachine().processEvent(new EventTapOnCancelIntentButton());
3018c50948fce260d0614daed71fc53ca5bf0e98060Senpo Hu            }
3028c50948fce260d0614daed71fc53ca5bf0e98060Senpo Hu        };
3038c50948fce260d0614daed71fc53ca5bf0e98060Senpo Hu        bottomBarSpec.showDone = true;
3048c50948fce260d0614daed71fc53ca5bf0e98060Senpo Hu        bottomBarSpec.doneCallback = new View.OnClickListener() {
3058c50948fce260d0614daed71fc53ca5bf0e98060Senpo Hu            @Override
3068c50948fce260d0614daed71fc53ca5bf0e98060Senpo Hu            public void onClick(View v) {
3078c50948fce260d0614daed71fc53ca5bf0e98060Senpo Hu                getStateMachine().processEvent(new EventTapOnConfirmPhotoButton());
3088c50948fce260d0614daed71fc53ca5bf0e98060Senpo Hu            }
3098c50948fce260d0614daed71fc53ca5bf0e98060Senpo Hu        };
3108c50948fce260d0614daed71fc53ca5bf0e98060Senpo Hu        bottomBarSpec.showRetake = true;
3118c50948fce260d0614daed71fc53ca5bf0e98060Senpo Hu        bottomBarSpec.retakeCallback = new View.OnClickListener() {
3128c50948fce260d0614daed71fc53ca5bf0e98060Senpo Hu            @Override
3138c50948fce260d0614daed71fc53ca5bf0e98060Senpo Hu            public void onClick(View v) {
3148c50948fce260d0614daed71fc53ca5bf0e98060Senpo Hu                getStateMachine().processEvent(new EventTapOnRetakePhotoButton());
3158c50948fce260d0614daed71fc53ca5bf0e98060Senpo Hu            }
3168c50948fce260d0614daed71fc53ca5bf0e98060Senpo Hu        };
3178c50948fce260d0614daed71fc53ca5bf0e98060Senpo Hu        return bottomBarSpec;
3188c50948fce260d0614daed71fc53ca5bf0e98060Senpo Hu    }
319dd565aafbdfba7310289ff2a371d46ef157c1b4dSenpo Hu}
320