CaptureIntentModule.java revision 8aefbc59ce6176f27efd47f4a568117bd4d9ea77
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;
1824be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu
1964d22d9caf0824739cb250575d69a56fe7f3fa3cSascha Haeberlingimport android.content.Intent;
2064d22d9caf0824739cb250575d69a56fe7f3fa3cSascha Haeberlingimport android.graphics.Point;
2164d22d9caf0824739cb250575d69a56fe7f3fa3cSascha Haeberlingimport android.graphics.SurfaceTexture;
2264d22d9caf0824739cb250575d69a56fe7f3fa3cSascha Haeberlingimport android.view.GestureDetector;
2364d22d9caf0824739cb250575d69a56fe7f3fa3cSascha Haeberlingimport android.view.KeyEvent;
2464d22d9caf0824739cb250575d69a56fe7f3fa3cSascha Haeberlingimport android.view.MotionEvent;
2564d22d9caf0824739cb250575d69a56fe7f3fa3cSascha Haeberlingimport android.view.View;
2664d22d9caf0824739cb250575d69a56fe7f3fa3cSascha Haeberling
2724be7cc6d138129b4087ef28f114701de54aba3cSenpo Huimport com.android.camera.CameraActivity;
2824be7cc6d138129b4087ef28f114701de54aba3cSenpo Huimport com.android.camera.CameraModule;
2924be7cc6d138129b4087ef28f114701de54aba3cSenpo Huimport com.android.camera.app.AppController;
3024be7cc6d138129b4087ef28f114701de54aba3cSenpo Huimport com.android.camera.app.CameraAppUI;
3124be7cc6d138129b4087ef28f114701de54aba3cSenpo Huimport com.android.camera.async.MainThread;
32cc6139467c1c9545de1f098d938409e182c9b7adSenpo Huimport com.android.camera.async.RefCountBase;
33cc6139467c1c9545de1f098d938409e182c9b7adSenpo Huimport com.android.camera.burst.BurstFacadeFactory;
341d84d7107686aa428ee2eeb1a8caf0ea3e43b1dfPaul Rohdeimport com.android.camera.captureintent.event.EventOnSurfaceTextureAvailable;
351d84d7107686aa428ee2eeb1a8caf0ea3e43b1dfPaul Rohdeimport com.android.camera.captureintent.event.EventOnSurfaceTextureDestroyed;
361d84d7107686aa428ee2eeb1a8caf0ea3e43b1dfPaul Rohdeimport com.android.camera.captureintent.event.EventOnSurfaceTextureUpdated;
371d84d7107686aa428ee2eeb1a8caf0ea3e43b1dfPaul Rohdeimport com.android.camera.captureintent.event.EventOnTextureViewLayoutChanged;
381d84d7107686aa428ee2eeb1a8caf0ea3e43b1dfPaul Rohdeimport com.android.camera.captureintent.event.EventPause;
391d84d7107686aa428ee2eeb1a8caf0ea3e43b1dfPaul Rohdeimport com.android.camera.captureintent.event.EventResume;
401d84d7107686aa428ee2eeb1a8caf0ea3e43b1dfPaul Rohdeimport com.android.camera.captureintent.event.EventTapOnCancelShutterButton;
411d84d7107686aa428ee2eeb1a8caf0ea3e43b1dfPaul Rohdeimport com.android.camera.captureintent.event.EventTapOnPreview;
421d84d7107686aa428ee2eeb1a8caf0ea3e43b1dfPaul Rohdeimport com.android.camera.captureintent.event.EventTapOnShutterButton;
431d84d7107686aa428ee2eeb1a8caf0ea3e43b1dfPaul Rohdeimport com.android.camera.captureintent.event.EventZoomRatioChanged;
44cc6139467c1c9545de1f098d938409e182c9b7adSenpo Huimport com.android.camera.captureintent.resource.ResourceConstructed;
45cc6139467c1c9545de1f098d938409e182c9b7adSenpo Huimport com.android.camera.captureintent.resource.ResourceConstructedImpl;
4624be7cc6d138129b4087ef28f114701de54aba3cSenpo Huimport com.android.camera.captureintent.state.StateBackground;
471d84d7107686aa428ee2eeb1a8caf0ea3e43b1dfPaul Rohdeimport com.android.camera.captureintent.stateful.State;
48d2d86155337a7dd9fd285a25c93e27dc05200ed1Senpo Huimport com.android.camera.captureintent.stateful.StateMachine;
49d2d86155337a7dd9fd285a25c93e27dc05200ed1Senpo Huimport com.android.camera.captureintent.stateful.StateMachineImpl;
5024be7cc6d138129b4087ef28f114701de54aba3cSenpo Huimport com.android.camera.debug.Log;
5124be7cc6d138129b4087ef28f114701de54aba3cSenpo Huimport com.android.camera.hardware.HardwareSpec;
521d84d7107686aa428ee2eeb1a8caf0ea3e43b1dfPaul Rohdeimport com.android.camera.one.OneCameraException;
531d84d7107686aa428ee2eeb1a8caf0ea3e43b1dfPaul Rohdeimport com.android.camera.one.OneCameraModule;
5424be7cc6d138129b4087ef28f114701de54aba3cSenpo Huimport com.android.camera.settings.SettingsManager;
5524be7cc6d138129b4087ef28f114701de54aba3cSenpo Huimport com.android.camera.ui.PreviewStatusListener;
5624be7cc6d138129b4087ef28f114701de54aba3cSenpo Huimport com.android.camera.ui.TouchCoordinate;
5724be7cc6d138129b4087ef28f114701de54aba3cSenpo Huimport com.android.camera.util.Size;
5824be7cc6d138129b4087ef28f114701de54aba3cSenpo Huimport com.android.camera2.R;
5924be7cc6d138129b4087ef28f114701de54aba3cSenpo Huimport com.android.ex.camera2.portability.CameraAgent;
6024be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu
6124be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu/**
6224be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu * The camera module that handles image capture intent.
6324be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu */
6424be7cc6d138129b4087ef28f114701de54aba3cSenpo Hupublic class CaptureIntentModule extends CameraModule {
65f8d390731abd88cc86354b377e1cb8beab0561afSenpo Hu    private static final Log.Tag TAG = new Log.Tag("CapIntModule");
6624be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu
6724be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu    /** The module UI. */
6824be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu    private final CaptureIntentModuleUI mModuleUI;
6924be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu
70cc6139467c1c9545de1f098d938409e182c9b7adSenpo Hu    /** The available resources after construction. */
71cc6139467c1c9545de1f098d938409e182c9b7adSenpo Hu    private final RefCountBase<ResourceConstructed> mResourceConstructed;
7224be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu
7324be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu    /** The module state machine. */
7424be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu    private final StateMachine mStateMachine;
7524be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu
768aefbc59ce6176f27efd47f4a568117bd4d9ea77Senpo Hu    private TouchCoordinate mTouchPointInsideShutterButton;
778aefbc59ce6176f27efd47f4a568117bd4d9ea77Senpo Hu
78f2399a5148ec6f101e9e0b3f137d33b443b79b8cAlan Newberger    public CaptureIntentModule(AppController appController, Intent intent,
791d84d7107686aa428ee2eeb1a8caf0ea3e43b1dfPaul Rohde            String settingScopeNamespace) throws OneCameraException {
8024be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu        super(appController);
8124be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu        mModuleUI = new CaptureIntentModuleUI(
8224be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu                appController.getCameraAppUI(),
8324be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu                appController.getModuleLayoutRoot(),
8424be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu                mUIListener);
85d2d86155337a7dd9fd285a25c93e27dc05200ed1Senpo Hu        mStateMachine = new StateMachineImpl();
86cc6139467c1c9545de1f098d938409e182c9b7adSenpo Hu        mResourceConstructed = ResourceConstructedImpl.create(
87cc6139467c1c9545de1f098d938409e182c9b7adSenpo Hu                intent,
88cc6139467c1c9545de1f098d938409e182c9b7adSenpo Hu                mModuleUI,
89cc6139467c1c9545de1f098d938409e182c9b7adSenpo Hu                settingScopeNamespace,
90cc6139467c1c9545de1f098d938409e182c9b7adSenpo Hu                MainThread.create(),
91cc6139467c1c9545de1f098d938409e182c9b7adSenpo Hu                appController.getAndroidContext(),
921d84d7107686aa428ee2eeb1a8caf0ea3e43b1dfPaul Rohde                appController.getCameraOpener(),
931d84d7107686aa428ee2eeb1a8caf0ea3e43b1dfPaul Rohde                OneCameraModule.provideOneCameraManager(),
94cc6139467c1c9545de1f098d938409e182c9b7adSenpo Hu                appController.getLocationManager(),
95cc6139467c1c9545de1f098d938409e182c9b7adSenpo Hu                appController.getOrientationManager(),
96cc6139467c1c9545de1f098d938409e182c9b7adSenpo Hu                appController.getSettingsManager(),
97cc6139467c1c9545de1f098d938409e182c9b7adSenpo Hu                new BurstFacadeFactory.BurstFacadeStub(),
98cc6139467c1c9545de1f098d938409e182c9b7adSenpo Hu                appController,
99cc6139467c1c9545de1f098d938409e182c9b7adSenpo Hu                appController.getFatalErrorHandler());
100cc6139467c1c9545de1f098d938409e182c9b7adSenpo Hu        final State initialState = StateBackground.create(mStateMachine, mResourceConstructed);
10124be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu        // Set the initial state.
102d2d86155337a7dd9fd285a25c93e27dc05200ed1Senpo Hu        mStateMachine.setInitialState(initialState);
10324be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu    }
10424be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu
10524be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu    @Override
10624be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu    public void onCameraAvailable(CameraAgent.CameraProxy cameraProxy) {
10724be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu        // Do nothing for capture intent.
10824be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu    }
10924be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu
11024be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu    @Override
11124be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu    public void onShutterButtonFocus(boolean pressed) {
11224be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu        // Do nothing for capture intent.
11324be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu    }
11424be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu
11524be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu    @Override
1168aefbc59ce6176f27efd47f4a568117bd4d9ea77Senpo Hu    public void onShutterCoordinate(TouchCoordinate touchCoordinate) {
1178aefbc59ce6176f27efd47f4a568117bd4d9ea77Senpo Hu        mTouchPointInsideShutterButton = touchCoordinate;
11824be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu    }
11924be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu
12024be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu    @Override
12124be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu    public void onShutterButtonClick() {
1228aefbc59ce6176f27efd47f4a568117bd4d9ea77Senpo Hu        mStateMachine.processEvent(new EventTapOnShutterButton(mTouchPointInsideShutterButton));
12324be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu    }
12424be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu
12524be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu    @Override
12624be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu    public void onShutterButtonLongPressed() {
12724be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu        // Do nothing for capture intent.
12824be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu    }
12924be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu
13024be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu    @Override
13124be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu    public void init(
13224be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu            final CameraActivity activity, boolean isSecureCamera, boolean isCaptureIntent) {
133cc6139467c1c9545de1f098d938409e182c9b7adSenpo Hu        mResourceConstructed.get().getAppController()
134cc6139467c1c9545de1f098d938409e182c9b7adSenpo Hu                .setPreviewStatusListener(mPreviewStatusListener);
13564d22d9caf0824739cb250575d69a56fe7f3fa3cSascha Haeberling
13664d22d9caf0824739cb250575d69a56fe7f3fa3cSascha Haeberling        // Issue cancel countdown event when the button is pressed.
13764d22d9caf0824739cb250575d69a56fe7f3fa3cSascha Haeberling        // TODO: Make this part of the official API the way shutter button events are.
138cc6139467c1c9545de1f098d938409e182c9b7adSenpo Hu        mResourceConstructed.get().getAppController().getCameraAppUI()
139cc6139467c1c9545de1f098d938409e182c9b7adSenpo Hu                .setCancelShutterButtonListener(new View.OnClickListener() {
140cc6139467c1c9545de1f098d938409e182c9b7adSenpo Hu                    @Override
141cc6139467c1c9545de1f098d938409e182c9b7adSenpo Hu                    public void onClick(View v) {
142cc6139467c1c9545de1f098d938409e182c9b7adSenpo Hu                        mStateMachine.processEvent(new EventTapOnCancelShutterButton());
143cc6139467c1c9545de1f098d938409e182c9b7adSenpo Hu                    }
144cc6139467c1c9545de1f098d938409e182c9b7adSenpo Hu                });
14564d22d9caf0824739cb250575d69a56fe7f3fa3cSascha Haeberling
14624be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu    }
14724be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu
14824be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu    @Override
14924be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu    public void resume() {
15083d86d3aad276b0c15bfc2767d27c9f0354a104dSenpo Hu        mModuleUI.onModuleResumed();
1511b98e83085e2b0a3066a4bf3cbde2d664b8422eeSenpo Hu        mStateMachine.processEvent(new EventResume());
15224be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu    }
15324be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu
15424be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu    @Override
15524be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu    public void pause() {
15624be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu        mModuleUI.setCountdownFinishedListener(null);
15783d86d3aad276b0c15bfc2767d27c9f0354a104dSenpo Hu        mModuleUI.onModulePaused();
1581b98e83085e2b0a3066a4bf3cbde2d664b8422eeSenpo Hu        mStateMachine.processEvent(new EventPause());
15924be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu    }
16024be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu
16124be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu    @Override
16224be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu    public void destroy() {
16324be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu        // Never called. Do nothing here.
16424be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu    }
16524be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu
16624be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu    @Override
16724be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu    public void onPreviewVisibilityChanged(int visibility) {
16824be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu        // Do nothing.
16924be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu    }
17024be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu
17124be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu    @Override
17224be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu    public void onLayoutOrientationChanged(boolean isLandscape) {
17324be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu        // Do nothing.
17424be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu    }
17524be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu
17624be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu    @Override
17724be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu    public void hardResetSettings(SettingsManager settingsManager) {
17824be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu        // Do nothing.
17924be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu    }
18024be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu
18124be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu    @Override
18224be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu    public HardwareSpec getHardwareSpec() {
1838c50948fce260d0614daed71fc53ca5bf0e98060Senpo Hu        /**
1848c50948fce260d0614daed71fc53ca5bf0e98060Senpo Hu         * Instead of passively providing CameraAppUI the hardware spec here,
1858c50948fce260d0614daed71fc53ca5bf0e98060Senpo Hu         * {@link com.android.camera.captureintent.state.StateOpeningCamera}
1868c50948fce260d0614daed71fc53ca5bf0e98060Senpo Hu         * will actively specify hardware spec.
1878c50948fce260d0614daed71fc53ca5bf0e98060Senpo Hu         */
1888c50948fce260d0614daed71fc53ca5bf0e98060Senpo Hu        return null;
18924be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu    }
19024be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu
19124be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu    @Override
19224be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu    public CameraAppUI.BottomBarUISpec getBottomBarSpec() {
1938c50948fce260d0614daed71fc53ca5bf0e98060Senpo Hu        /**
1948c50948fce260d0614daed71fc53ca5bf0e98060Senpo Hu         * Instead of passively providing CameraAppUI the bottom bar spec here,
1958c50948fce260d0614daed71fc53ca5bf0e98060Senpo Hu         * {@link com.android.camera.captureintent.state.StateOpeningCamera}
1968c50948fce260d0614daed71fc53ca5bf0e98060Senpo Hu         * will actively specify bottom bar spec.
1978c50948fce260d0614daed71fc53ca5bf0e98060Senpo Hu         */
1988c50948fce260d0614daed71fc53ca5bf0e98060Senpo Hu        return null;
19924be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu    }
20024be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu
20124be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu    @Override
20224be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu    public boolean isUsingBottomBar() {
20324be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu        return true;
20424be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu    }
20524be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu
20624be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu    @Override
20724be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu    public String getPeekAccessibilityString() {
208cc6139467c1c9545de1f098d938409e182c9b7adSenpo Hu        return mResourceConstructed.get().getContext().getResources()
209cc6139467c1c9545de1f098d938409e182c9b7adSenpo Hu                .getString(R.string.photo_accessibility_peek);
21024be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu    }
21124be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu
21224be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu    @Override
21324be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu    public boolean onKeyDown(int keyCode, KeyEvent event) {
21424be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu        return false;
21524be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu    }
21624be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu
21724be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu    @Override
21824be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu    public boolean onKeyUp(int keyCode, KeyEvent event) {
21924be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu        return false;
22024be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu    }
22124be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu
22224be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu    /** The listener to listen events from the UI. */
22324be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu    private final CaptureIntentModuleUI.Listener mUIListener =
22424be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu            new CaptureIntentModuleUI.Listener() {
22524be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu                @Override
22624be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu                public void onZoomRatioChanged(final float zoomRatio) {
2271b98e83085e2b0a3066a4bf3cbde2d664b8422eeSenpo Hu                    mStateMachine.processEvent(new EventZoomRatioChanged(zoomRatio));
22824be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu                }
22924be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu            };
23024be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu
23124be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu    /** The listener to listen events from the preview. */
23224be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu    private final PreviewStatusListener mPreviewStatusListener = new PreviewStatusListener() {
23324be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu        @Override
23424be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu        public void onPreviewLayoutChanged(View v, int left, int top, int right,
23524be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu                int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) {
23624be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu            final Size previewLayoutSize = new Size(right - left, bottom - top);
2371b98e83085e2b0a3066a4bf3cbde2d664b8422eeSenpo Hu            mStateMachine.processEvent(new EventOnTextureViewLayoutChanged(previewLayoutSize));
23824be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu        }
23924be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu
24024be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu        @Override
24124be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu        public boolean shouldAutoAdjustTransformMatrixOnLayout() {
242cc6139467c1c9545de1f098d938409e182c9b7adSenpo Hu            return CaptureIntentConfig.WORKAROUND_PREVIEW_STRETCH_BUG_NEXUS4;
24324be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu        }
24424be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu
24524be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu        @Override
24624be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu        public void onPreviewFlipped() {
24724be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu            // Do nothing because when preview is flipped, TextureView will lay
24824be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu            // itself out again, which will then trigger a transform matrix
24924be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu            // update.
25024be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu        }
25124be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu
25224be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu        @Override
25324be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu        public GestureDetector.OnGestureListener getGestureListener() {
25424be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu            return new GestureDetector.SimpleOnGestureListener() {
25524be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu                @Override
25624be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu                public boolean onSingleTapUp(MotionEvent ev) {
25724be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu                    final Point tapPoint = new Point((int) ev.getX(), (int) ev.getY());
2581b98e83085e2b0a3066a4bf3cbde2d664b8422eeSenpo Hu                    mStateMachine.processEvent(new EventTapOnPreview(tapPoint));
25924be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu                    return true;
26024be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu                }
26124be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu            };
26224be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu        }
26324be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu
26424be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu        @Override
26524be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu        public View.OnTouchListener getTouchListener() {
26624be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu            return null;
26724be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu        }
26824be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu
26924be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu        @Override
27024be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu        public void onSurfaceTextureAvailable(
27124be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu                final SurfaceTexture surfaceTexture, int width, int height) {
2721b98e83085e2b0a3066a4bf3cbde2d664b8422eeSenpo Hu            mStateMachine.processEvent(new EventOnSurfaceTextureAvailable(surfaceTexture));
27324be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu        }
27424be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu
27524be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu        @Override
27624be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu        public boolean onSurfaceTextureDestroyed(SurfaceTexture surface) {
277de4e5225ea92d681f9f4c005e6285f739635d271Senpo Hu            mStateMachine.processEvent(new EventOnSurfaceTextureDestroyed());
27824be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu            return true;
27924be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu        }
28024be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu
28124be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu        @Override
28224be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu        public void onSurfaceTextureSizeChanged(
28324be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu                SurfaceTexture surfaceTexture, int width, int height) {
28424be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu        }
28524be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu
28624be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu        @Override
28724be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu        public void onSurfaceTextureUpdated(SurfaceTexture surface) {
288de4e5225ea92d681f9f4c005e6285f739635d271Senpo Hu            mStateMachine.processEvent(new EventOnSurfaceTextureUpdated());
28924be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu        }
29024be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu    };
29124be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu}
292