StateStartingPreview.java revision 80aed3c513dc6a6670e25ef6e11bc71ab6a2d9fd
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
1924be7cc6d138129b4087ef28f114701de54aba3cSenpo Huimport com.google.common.base.Optional;
2024be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu
2124be7cc6d138129b4087ef28f114701de54aba3cSenpo Huimport com.android.camera.SoundPlayer;
2224be7cc6d138129b4087ef28f114701de54aba3cSenpo Huimport com.android.camera.app.LocationManager;
2324be7cc6d138129b4087ef28f114701de54aba3cSenpo Huimport com.android.camera.async.RefCountBase;
2424be7cc6d138129b4087ef28f114701de54aba3cSenpo Huimport com.android.camera.captureintent.CaptureIntentModuleUI;
2524be7cc6d138129b4087ef28f114701de54aba3cSenpo Huimport com.android.camera.debug.Log;
2624be7cc6d138129b4087ef28f114701de54aba3cSenpo Huimport com.android.camera.hardware.HeadingSensor;
2724be7cc6d138129b4087ef28f114701de54aba3cSenpo Huimport com.android.camera.one.OneCamera;
2824be7cc6d138129b4087ef28f114701de54aba3cSenpo Huimport com.android.camera.one.OneCameraCharacteristics;
2924be7cc6d138129b4087ef28f114701de54aba3cSenpo Huimport com.android.camera.session.CaptureSessionManager;
3024be7cc6d138129b4087ef28f114701de54aba3cSenpo Huimport com.android.camera.util.Size;
3124be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu
3224be7cc6d138129b4087ef28f114701de54aba3cSenpo Hupublic final class StateStartingPreview extends State {
3324be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu    private static final Log.Tag TAG = new Log.Tag("StateStartingPreview");
3424be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu
3524be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu    private final RefCountBase<ResourceConstructed> mResourceConstructed;
3624be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu    private final RefCountBase<ResourceSurfaceTexture> mResourceSurfaceTexture;
3724be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu    private final RefCountBase<ResourceOpenedCamera> mResourceOpenedCamera;
3824be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu
3924be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu    public static StateStartingPreview from(
4024be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu            StateOpeningCamera openingCamera,
4124be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu            RefCountBase<ResourceConstructed> resourceConstructed,
4224be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu            RefCountBase<ResourceSurfaceTexture> resourceSurfaceTexture,
4324be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu            OneCamera camera,
4424be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu            OneCamera.Facing cameraFacing,
4524be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu            OneCameraCharacteristics cameraCharacteristics,
4624be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu            Size pictureSize,
4724be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu            OneCamera.CaptureReadyCallback captureReadyCallback) {
4880aed3c513dc6a6670e25ef6e11bc71ab6a2d9fdSenpo Hu        return new StateStartingPreview(
4980aed3c513dc6a6670e25ef6e11bc71ab6a2d9fdSenpo Hu                openingCamera,
5080aed3c513dc6a6670e25ef6e11bc71ab6a2d9fdSenpo Hu                resourceConstructed,
5180aed3c513dc6a6670e25ef6e11bc71ab6a2d9fdSenpo Hu                resourceSurfaceTexture,
5280aed3c513dc6a6670e25ef6e11bc71ab6a2d9fdSenpo Hu                camera,
5380aed3c513dc6a6670e25ef6e11bc71ab6a2d9fdSenpo Hu                cameraFacing,
5480aed3c513dc6a6670e25ef6e11bc71ab6a2d9fdSenpo Hu                cameraCharacteristics,
5580aed3c513dc6a6670e25ef6e11bc71ab6a2d9fdSenpo Hu                pictureSize,
5680aed3c513dc6a6670e25ef6e11bc71ab6a2d9fdSenpo Hu                captureReadyCallback);
5724be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu    }
5824be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu
5924be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu    private StateStartingPreview(
6024be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu            State previousState,
6124be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu            RefCountBase<ResourceConstructed> resourceConstructed,
6224be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu            RefCountBase<ResourceSurfaceTexture> resourceSurfaceTexture,
6380aed3c513dc6a6670e25ef6e11bc71ab6a2d9fdSenpo Hu            OneCamera camera,
6480aed3c513dc6a6670e25ef6e11bc71ab6a2d9fdSenpo Hu            OneCamera.Facing cameraFacing,
6580aed3c513dc6a6670e25ef6e11bc71ab6a2d9fdSenpo Hu            OneCameraCharacteristics cameraCharacteristics,
6680aed3c513dc6a6670e25ef6e11bc71ab6a2d9fdSenpo Hu            Size pictureSize,
6780aed3c513dc6a6670e25ef6e11bc71ab6a2d9fdSenpo Hu            OneCamera.CaptureReadyCallback captureReadyCallback) {
6824be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu        super(ID.StartingPreview, previousState);
6924be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu        mResourceConstructed = resourceConstructed;
7080aed3c513dc6a6670e25ef6e11bc71ab6a2d9fdSenpo Hu        mResourceConstructed.addRef();     // Will be balanced in onLeave().
7124be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu        mResourceSurfaceTexture = resourceSurfaceTexture;
7280aed3c513dc6a6670e25ef6e11bc71ab6a2d9fdSenpo Hu        mResourceSurfaceTexture.addRef();  // Will be balanced in onLeave().
7380aed3c513dc6a6670e25ef6e11bc71ab6a2d9fdSenpo Hu        mResourceOpenedCamera = ResourceOpenedCamera.create(
7480aed3c513dc6a6670e25ef6e11bc71ab6a2d9fdSenpo Hu                camera, cameraFacing, cameraCharacteristics, pictureSize, captureReadyCallback);
7524be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu    }
7624be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu
7724be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu    @Override
7824be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu    public Optional<State> onEnter() {
7924be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu        mResourceSurfaceTexture.get().updateSurfaceTextureDefaultBufferSize();
8024be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu        mResourceOpenedCamera.get().getCamera().startPreview(
8124be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu                mResourceSurfaceTexture.get().createPreviewSurface(),
8224be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu                mResourceOpenedCamera.get().getCaptureReadyCallback());
8324be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu        return Optional.absent();
8424be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu    }
8524be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu
8624be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu    @Override
8724be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu    public void onLeave() {
8824be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu        mResourceConstructed.close();
8924be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu        mResourceSurfaceTexture.close();
9024be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu        mResourceOpenedCamera.close();
9124be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu    }
9224be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu
9324be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu    @Override
9424be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu    public Optional<State> processPause() {
9524be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu        return Optional.of((State) StateBackground.from(this, mResourceConstructed));
9624be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu    }
9724be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu
9824be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu    @Override
9924be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu    public Optional<State> processOnPreviewSetupSucceeded(
10024be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu            CaptureSessionManager captureSessionManager,
10124be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu            LocationManager locationManager,
10224be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu            HeadingSensor headingSensor,
10324be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu            SoundPlayer soundPlayer,
10424be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu            OneCamera.ReadyStateChangedListener readyStateChangedListener,
10524be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu            OneCamera.PictureCallback pictureCallback,
10624be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu            OneCamera.PictureSaverCallback pictureSaverCallback,
10724be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu            OneCamera.FocusStateListener focusStateListener) {
10824be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu        final OneCamera camera = mResourceOpenedCamera.get().getCamera();
10924be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu        camera.setFocusStateListener(focusStateListener);
11024be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu        camera.setReadyStateChangedListener(readyStateChangedListener);
11124be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu        mResourceConstructed.get().getMainThread().execute(new Runnable() {
11224be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu            @Override
11324be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu            public void run() {
11424be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu                mResourceSurfaceTexture.get().updatePreviewTransform();
11524be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu                final CaptureIntentModuleUI moduleUI = mResourceConstructed.get().getModuleUI();
11624be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu                moduleUI.onPreviewStarted();
11724be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu                moduleUI.initializeZoom(camera.getMaxZoom());
11824be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu            }
11924be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu        });
12024be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu        return Optional.of((State) StateReadyForCapture.from(
12124be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu                this, mResourceConstructed, mResourceSurfaceTexture, mResourceOpenedCamera,
12224be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu                captureSessionManager, locationManager, headingSensor, soundPlayer, pictureCallback,
12324be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu                pictureSaverCallback));
12424be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu    }
12524be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu
12624be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu    @Override
12724be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu    public Optional<State> processOnPreviewSetupFailed() {
12824be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu        Log.e(TAG, "processOnPreviewSetupFailed");
12924be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu        return Optional.of((State) StateFatal.from(this, mResourceConstructed));
13024be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu    }
13124be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu}
132