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