2 * Copyright (C) 2015 The Android Open Source Project
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
17 package com.android.camera.captureintent.state;
19 import com.google.common.base.Optional;
21 import com.android.camera.CaptureModuleUtil;
22 import com.android.camera.async.RefCountBase;
23 import com.android.camera.captureintent.event.EventOnStartPreviewFailed;
24 import com.android.camera.captureintent.event.EventOnStartPreviewSucceeded;
25 import com.android.camera.debug.Log;
26 import com.android.camera.exif.Rational;
27 import com.android.camera.one.OneCamera;
28 import com.android.camera.one.OneCameraAccessException;
29 import com.android.camera.one.OneCameraCharacteristics;
30 import com.android.camera.util.Size;
32 import java.util.List;
35 * Represents a state that the module is waiting for the preview video stream
38 public final class StateStartingPreview extends State {
39 private static final Log.Tag TAG = new Log.Tag("StateStartingPreview");
41 private final RefCountBase<ResourceConstructed> mResourceConstructed;
42 private final RefCountBase<ResourceSurfaceTexture> mResourceSurfaceTexture;
43 private final RefCountBase<ResourceOpenedCamera> mResourceOpenedCamera;
45 public static StateStartingPreview from(
46 StateOpeningCamera openingCamera,
47 RefCountBase<ResourceConstructed> resourceConstructed,
48 RefCountBase<ResourceSurfaceTexture> resourceSurfaceTexture,
50 OneCamera.Facing cameraFacing,
51 OneCameraCharacteristics cameraCharacteristics,
53 return new StateStartingPreview(
56 resourceSurfaceTexture,
59 cameraCharacteristics,
63 private StateStartingPreview(
65 RefCountBase<ResourceConstructed> resourceConstructed,
66 RefCountBase<ResourceSurfaceTexture> resourceSurfaceTexture,
68 OneCamera.Facing cameraFacing,
69 OneCameraCharacteristics cameraCharacteristics,
71 super(ID.StartingPreview, previousState);
72 mResourceConstructed = resourceConstructed;
73 mResourceConstructed.addRef(); // Will be balanced in onLeave().
74 mResourceSurfaceTexture = resourceSurfaceTexture;
75 mResourceSurfaceTexture.addRef(); // Will be balanced in onLeave().
76 mResourceOpenedCamera = ResourceOpenedCamera.create(
77 camera, cameraFacing, cameraCharacteristics, pictureSize);
81 public Optional<State> onEnter() {
82 final Size previewSize;
84 // Pick a preview size with the right aspect ratio.
85 final List<Size> supportedPreviewSizes = mResourceOpenedCamera.get()
86 .getCameraCharacteristics().getSupportedPreviewSizes();
87 final Rational pictureAspectRatio =
88 mResourceConstructed.get().getResolutionSetting().getPictureAspectRatio(
89 mResourceOpenedCamera.get().getCameraFacing());
90 previewSize = CaptureModuleUtil.getOptimalPreviewSize(
91 supportedPreviewSizes.toArray(new Size[(supportedPreviewSizes.size())]),
92 pictureAspectRatio.toDouble(),
94 if (previewSize == null) {
95 return Optional.of((State) StateFatal.from(this, mResourceConstructed));
97 } catch (OneCameraAccessException ex) {
98 return Optional.of((State) StateFatal.from(this, mResourceConstructed));
100 mResourceConstructed.get().getMainThread().execute(new Runnable() {
103 mResourceSurfaceTexture.get().setPreviewSize(previewSize);
106 // Start preview right away. Don't dispatch it on other threads or it
107 // will cause race condition. b/19522251.
108 mResourceOpenedCamera.get().startPreview(
109 mResourceSurfaceTexture.get().createPreviewSurface(),
110 mCaptureReadyCallback);
111 return Optional.absent();
115 public void onLeave() {
116 mResourceConstructed.close();
117 mResourceSurfaceTexture.close();
118 mResourceOpenedCamera.close();
122 public Optional<State> processPause() {
123 return Optional.of((State) StateBackground.from(this, mResourceConstructed));
127 public final Optional<State> processOnTextureViewLayoutChanged(Size layoutSize) {
128 mResourceSurfaceTexture.get().setPreviewLayoutSize(layoutSize);
133 public Optional<State> processOnPreviewSetupSucceeded() {
134 mResourceConstructed.get().getMainThread().execute(new Runnable() {
137 mResourceConstructed.get().getModuleUI().onPreviewStarted();
140 return Optional.of((State) StateReadyForCapture.from(
141 this, mResourceConstructed, mResourceSurfaceTexture, mResourceOpenedCamera));
145 public Optional<State> processOnPreviewSetupFailed() {
146 Log.e(TAG, "processOnPreviewSetupFailed");
147 return Optional.of((State) StateFatal.from(this, mResourceConstructed));
150 private OneCamera.CaptureReadyCallback mCaptureReadyCallback =
151 new OneCamera.CaptureReadyCallback() {
153 public void onSetupFailed() {
154 getStateMachine().processEvent(new EventOnStartPreviewFailed());
158 public void onReadyForCapture() {
159 getStateMachine().processEvent(new EventOnStartPreviewSucceeded());