PhotoUI.java revision d31cdfeb1035df8ba939e877031769f0df247aa6
1d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb/*
2d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb * Copyright (C) 2013 The Android Open Source Project
3d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb *
4d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb * Licensed under the Apache License, Version 2.0 (the "License");
5d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb * you may not use this file except in compliance with the License.
6d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb * You may obtain a copy of the License at
7d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb *
8d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb *      http://www.apache.org/licenses/LICENSE-2.0
9d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb *
10d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb * Unless required by applicable law or agreed to in writing, software
11d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb * distributed under the License is distributed on an "AS IS" BASIS,
12d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb * See the License for the specific language governing permissions and
14d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb * limitations under the License.
15d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb */
16d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb
17d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb
18d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolbpackage com.android.camera;
19d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb
20d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolbimport android.hardware.Camera;
21d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolbimport android.hardware.Camera.Face;
22d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolbimport android.hardware.Camera.FaceDetectionListener;
23d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolbimport android.util.Log;
24d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolbimport android.view.Gravity;
25d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolbimport android.view.MotionEvent;
26d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolbimport android.view.SurfaceHolder;
27d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolbimport android.view.View;
28d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolbimport android.view.View.OnClickListener;
29d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolbimport android.view.View.OnLayoutChangeListener;
30d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolbimport android.view.ViewGroup;
31d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolbimport android.view.ViewStub;
32d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolbimport android.widget.FrameLayout;
33d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolbimport android.widget.FrameLayout.LayoutParams;
34d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolbimport android.widget.Toast;
35d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb
36d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolbimport com.android.camera.CameraPreference.OnPreferenceChangedListener;
37d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolbimport com.android.camera.FocusOverlayManager.FocusUI;
38d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolbimport com.android.camera.ui.AbstractSettingPopup;
39d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolbimport com.android.camera.ui.CountDownView;
40d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolbimport com.android.camera.ui.CountDownView.OnCountDownFinishedListener;
41d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolbimport com.android.camera.ui.FaceView;
42d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolbimport com.android.camera.ui.FocusIndicator;
43d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolbimport com.android.camera.ui.PieRenderer;
44d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolbimport com.android.camera.ui.PieRenderer.PieListener;
45d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolbimport com.android.camera.ui.RenderOverlay;
46d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolbimport com.android.camera.ui.ZoomRenderer;
47d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolbimport com.android.gallery3d.R;
48d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolbimport com.android.gallery3d.common.ApiHelper;
49d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb
50d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolbimport java.util.List;
51d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb
52d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolbpublic class PhotoUI implements PieListener,
53d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb    SurfaceHolder.Callback,
54d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb    PreviewGestures.SingleTapListener,
55d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb    FocusUI,
56d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb    LocationManager.Listener,
573bc96b2d1106fc5ebec6fda6aad3bca4d62e81c0Michael Kolb    FaceDetectionListener,
583bc96b2d1106fc5ebec6fda6aad3bca4d62e81c0Michael Kolb    PreviewGestures.SwipeListener {
59d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb
60d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb    private static final String TAG = "CAM_UI";
61d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb
62d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb    private CameraActivity mActivity;
63d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb    private PhotoController mController;
64d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb    private PreviewGestures mGestures;
65d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb
66d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb    private View mRootView;
67d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb    private Object mSurfaceTexture;
68d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb    private volatile SurfaceHolder mSurfaceHolder;
69d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb
70d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb    private AbstractSettingPopup mPopup;
71d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb    private ShutterButton mShutterButton;
72d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb    private CountDownView mCountDownView;
73d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb
74d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb    private FaceView mFaceView;
75d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb    private RenderOverlay mRenderOverlay;
76d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb    private View mReviewCancelButton;
77d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb    private View mReviewDoneButton;
78d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb    private View mReviewRetakeButton;
79d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb
80d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb    private View mMenuButton;
81d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb    private View mBlocker;
82d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb    private PhotoMenu mMenu;
83d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb
84c7965e2bc8f69006de09b4be6fad61c4d2313e07Sascha Haeberling    private OnScreenIndicators mOnScreenIndicators;
85d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb
86d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb    private PieRenderer mPieRenderer;
87d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb    private ZoomRenderer mZoomRenderer;
88d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb    private Toast mNotSelectableToast;
89d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb
90d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb    private int mZoomMax;
91d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb    private List<Integer> mZoomRatios;
92d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb
93d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb    private int mPreviewWidth = 0;
94d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb    private int mPreviewHeight = 0;
9578a5b224eca3c702f4ecf8abd072779e32e26641Michael Kolb    private View mPreviewThumb;
96d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb
97d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb    private OnLayoutChangeListener mLayoutListener = new OnLayoutChangeListener() {
98d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb        @Override
99d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb        public void onLayoutChange(View v, int left, int top, int right,
100d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb                int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) {
101d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb            int width = right - left;
102d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb            int height = bottom - top;
103d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb            // Full-screen screennail
104d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb            int w = width;
105d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb            int h = height;
106d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb            if (Util.getDisplayRotation(mActivity) % 180 != 0) {
107d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb                w = height;
108d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb                h = width;
109d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb            }
110d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb            if (mPreviewWidth != w || mPreviewHeight != h) {
111bbee3bfe85ab29acda2e13c422459d3cb96b1917Doris Liu                mPreviewWidth = w;
112bbee3bfe85ab29acda2e13c422459d3cb96b1917Doris Liu                mPreviewHeight = h;
113d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb                mController.onScreenSizeChanged(width, height, w, h);
114d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb            }
115d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb        }
116d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb    };
117d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb
118d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb    public PhotoUI(CameraActivity activity, PhotoController controller, View parent) {
119d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb        mActivity = activity;
120d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb        mController = controller;
121d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb        mRootView = parent;
122d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb
123d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb        mActivity.getLayoutInflater().inflate(R.layout.photo_module,
124d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb                (ViewGroup) mRootView, true);
125d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb        mRenderOverlay = (RenderOverlay) mRootView.findViewById(R.id.render_overlay);
126d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb
127d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb        initIndicators();
128d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb        mCountDownView = (CountDownView) (mRootView.findViewById(R.id.count_down_to_capture));
129d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb        mCountDownView.setCountDownFinishedListener((OnCountDownFinishedListener) mController);
130d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb
131d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb        if (ApiHelper.HAS_FACE_DETECTION) {
132d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb            ViewStub faceViewStub = (ViewStub) mRootView
133d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb                    .findViewById(R.id.face_view_stub);
134d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb            if (faceViewStub != null) {
135d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb                faceViewStub.inflate();
136d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb                mFaceView = (FaceView) mRootView.findViewById(R.id.face_view);
137d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb            }
138d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb        }
139d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb
140d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb    }
141d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb
142d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb    public View getRootView() {
143d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb        return mRootView;
144d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb    }
145d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb
146d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb    private void initIndicators() {
147eb8adc1754fc668435ee57d1be2235b80fc8c009Michael Kolb        mOnScreenIndicators = new OnScreenIndicators(mActivity,
148c7965e2bc8f69006de09b4be6fad61c4d2313e07Sascha Haeberling                mActivity.findViewById(R.id.on_screen_indicators));
149d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb    }
150d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb
151d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb    public void onCameraOpened(PreferenceGroup prefGroup, ComboPreferences prefs,
152d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb            Camera.Parameters params, OnPreferenceChangedListener listener) {
153d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb        if (mPieRenderer == null) {
154d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb            mPieRenderer = new PieRenderer(mActivity);
155d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb            mPieRenderer.setPieListener(this);
156e3974bb4614d027e88ad915f70c4c05fb5ff76b1Michael Kolb            mRenderOverlay.addRenderer(mPieRenderer);
157d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb        }
158d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb        if (mMenu == null) {
159d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb            mMenu = new PhotoMenu(mActivity, this, mPieRenderer);
160d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb            mMenu.setListener(listener);
161d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb        }
162d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb        mMenu.initialize(prefGroup);
163d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb
164d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb        if (mZoomRenderer == null) {
165d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb            mZoomRenderer = new ZoomRenderer(mActivity);
166e3974bb4614d027e88ad915f70c4c05fb5ff76b1Michael Kolb            mRenderOverlay.addRenderer(mZoomRenderer);
167d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb        }
168d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb        if (mGestures == null) {
169d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb            // this will handle gesture disambiguation and dispatching
1703bc96b2d1106fc5ebec6fda6aad3bca4d62e81c0Michael Kolb            mGestures = new PreviewGestures(mActivity, this, mZoomRenderer, mPieRenderer,
1713bc96b2d1106fc5ebec6fda6aad3bca4d62e81c0Michael Kolb                    this);
172d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb        }
1739cdfe00cf57f05f81e6d02ca050e6afd8cc4a25fDoris Liu        mGestures.reset();
174d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb        mGestures.setRenderOverlay(mRenderOverlay);
175d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb        mGestures.addTouchReceiver(mMenuButton);
1769cdfe00cf57f05f81e6d02ca050e6afd8cc4a25fDoris Liu        mGestures.addUnclickableArea(mBlocker);
17778a5b224eca3c702f4ecf8abd072779e32e26641Michael Kolb        enablePreviewThumb(false);
178d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb        // make sure to add touch targets for image capture
179d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb        if (mController.isImageCaptureIntent()) {
180d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb            if (mReviewCancelButton != null) {
181d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb                mGestures.addTouchReceiver(mReviewCancelButton);
182d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb            }
183d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb            if (mReviewDoneButton != null) {
184d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb                mGestures.addTouchReceiver(mReviewDoneButton);
185d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb            }
186d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb        }
187d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb        mRenderOverlay.requestLayout();
188d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb
189d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb        initializeZoom(params);
190eb8adc1754fc668435ee57d1be2235b80fc8c009Michael Kolb        updateOnScreenIndicators(params, prefGroup, prefs);
191d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb    }
192d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb
1933bc96b2d1106fc5ebec6fda6aad3bca4d62e81c0Michael Kolb    private void openMenu() {
1943bc96b2d1106fc5ebec6fda6aad3bca4d62e81c0Michael Kolb        if (mPieRenderer != null) {
1953bc96b2d1106fc5ebec6fda6aad3bca4d62e81c0Michael Kolb            // If autofocus is not finished, cancel autofocus so that the
1963bc96b2d1106fc5ebec6fda6aad3bca4d62e81c0Michael Kolb            // subsequent touch can be handled by PreviewGestures
1973bc96b2d1106fc5ebec6fda6aad3bca4d62e81c0Michael Kolb            if (mController.getCameraState() == PhotoController.FOCUSING) {
1983bc96b2d1106fc5ebec6fda6aad3bca4d62e81c0Michael Kolb                    mController.cancelAutoFocus();
1993bc96b2d1106fc5ebec6fda6aad3bca4d62e81c0Michael Kolb            }
2003bc96b2d1106fc5ebec6fda6aad3bca4d62e81c0Michael Kolb            mPieRenderer.showInCenter();
2013bc96b2d1106fc5ebec6fda6aad3bca4d62e81c0Michael Kolb        }
2023bc96b2d1106fc5ebec6fda6aad3bca4d62e81c0Michael Kolb    }
2033bc96b2d1106fc5ebec6fda6aad3bca4d62e81c0Michael Kolb
204d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb    public void initializeControlByIntent() {
205d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb        mBlocker = mActivity.findViewById(R.id.blocker);
20678a5b224eca3c702f4ecf8abd072779e32e26641Michael Kolb        mPreviewThumb = mActivity.findViewById(R.id.preview_thumb);
20778a5b224eca3c702f4ecf8abd072779e32e26641Michael Kolb        mPreviewThumb.setOnClickListener(new OnClickListener() {
20878a5b224eca3c702f4ecf8abd072779e32e26641Michael Kolb            @Override
20978a5b224eca3c702f4ecf8abd072779e32e26641Michael Kolb            public void onClick(View v) {
21078a5b224eca3c702f4ecf8abd072779e32e26641Michael Kolb                mActivity.gotoGallery();
21178a5b224eca3c702f4ecf8abd072779e32e26641Michael Kolb            }
21278a5b224eca3c702f4ecf8abd072779e32e26641Michael Kolb        });
213d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb        mMenuButton = mActivity.findViewById(R.id.menu);
214d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb        mMenuButton.setOnClickListener(new OnClickListener() {
215d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb            @Override
216d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb            public void onClick(View v) {
2173bc96b2d1106fc5ebec6fda6aad3bca4d62e81c0Michael Kolb                openMenu();
218d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb            }
219d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb        });
220d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb        if (mController.isImageCaptureIntent()) {
221d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb            mActivity.hideSwitcher();
222d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb            ViewGroup cameraControls = (ViewGroup) mActivity.findViewById(R.id.camera_controls);
223d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb            mActivity.getLayoutInflater().inflate(R.layout.review_module_control, cameraControls);
224d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb
225d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb            mReviewDoneButton = mActivity.findViewById(R.id.btn_done);
226d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb            mReviewCancelButton = mActivity.findViewById(R.id.btn_cancel);
227d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb            mReviewRetakeButton = mActivity.findViewById(R.id.btn_retake);
228d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb            mReviewCancelButton.setVisibility(View.VISIBLE);
229d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb
230d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb            mReviewDoneButton.setOnClickListener(new OnClickListener() {
231d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb                @Override
232d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb                public void onClick(View v) {
233d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb                    mController.onCaptureDone();
234d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb                }
235d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb            });
236d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb            mReviewCancelButton.setOnClickListener(new OnClickListener() {
237d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb                @Override
238d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb                public void onClick(View v) {
239d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb                    mController.onCaptureCancelled();
240d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb                }
241d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb            });
242d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb
243d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb            mReviewRetakeButton.setOnClickListener(new OnClickListener() {
244d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb                @Override
245d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb                public void onClick(View v) {
246d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb                    mController.onCaptureRetake();
247d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb                }
248d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb            });
249d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb        }
250d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb    }
251d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb
252d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb    // called from onResume but only the first time
253d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb    public  void initializeFirstTime() {
254d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb        // Initialize shutter button.
255d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb        mShutterButton = mActivity.getShutterButton();
256d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb        mShutterButton.setImageResource(R.drawable.btn_new_shutter);
257d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb        mShutterButton.setOnShutterButtonListener(mController);
258d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb        mShutterButton.setVisibility(View.VISIBLE);
25928dc7f348b70ee6735d208b48ca12a94e9cd222fDoris Liu        mRootView.addOnLayoutChangeListener(mLayoutListener);
260d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb    }
261d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb
262d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb    // called from onResume every other time
263d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb    public void initializeSecondTime(Camera.Parameters params) {
264d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb        initializeZoom(params);
265d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb        if (mController.isImageCaptureIntent()) {
266d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb            hidePostCaptureAlert();
267d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb        }
268d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb        if (mMenu != null) {
269d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb            mMenu.reloadPreferences();
270d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb        }
27128dc7f348b70ee6735d208b48ca12a94e9cd222fDoris Liu        mRootView.addOnLayoutChangeListener(mLayoutListener);
272d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb    }
273d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb
274d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb    public void initializeZoom(Camera.Parameters params) {
275d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb        if ((params == null) || !params.isZoomSupported()
276d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb                || (mZoomRenderer == null)) return;
277d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb        mZoomMax = params.getMaxZoom();
278d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb        mZoomRatios = params.getZoomRatios();
279d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb        // Currently we use immediate zoom for fast zooming to get better UX and
280d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb        // there is no plan to take advantage of the smooth zoom.
281d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb        if (mZoomRenderer != null) {
282d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb            mZoomRenderer.setZoomMax(mZoomMax);
283d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb            mZoomRenderer.setZoom(params.getZoom());
284d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb            mZoomRenderer.setZoomValue(mZoomRatios.get(params.getZoom()));
285d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb            mZoomRenderer.setOnZoomChangeListener(new ZoomChangeListener());
286d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb        }
287d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb    }
288d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb
289d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb    public void enableGestures(boolean enable) {
290d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb        if (mGestures != null) {
291d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb            mGestures.setEnabled(enable);
292d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb        }
293d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb    }
294d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb
295c7965e2bc8f69006de09b4be6fad61c4d2313e07Sascha Haeberling    @Override
296d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb    public void showGpsOnScreenIndicator(boolean hasSignal) { }
297d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb
298c7965e2bc8f69006de09b4be6fad61c4d2313e07Sascha Haeberling    @Override
299d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb    public void hideGpsOnScreenIndicator() { }
300d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb
301d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb    public void overrideSettings(final String ... keyvalues) {
302d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb        mMenu.overrideSettings(keyvalues);
303d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb    }
304d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb
305d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb    public void updateOnScreenIndicators(Camera.Parameters params,
306eb8adc1754fc668435ee57d1be2235b80fc8c009Michael Kolb            PreferenceGroup group, ComboPreferences prefs) {
307d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb        if (params == null) return;
308c7965e2bc8f69006de09b4be6fad61c4d2313e07Sascha Haeberling        mOnScreenIndicators.updateSceneOnScreenIndicator(params.getSceneMode());
309c7965e2bc8f69006de09b4be6fad61c4d2313e07Sascha Haeberling        mOnScreenIndicators.updateExposureOnScreenIndicator(params,
310d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb                CameraSettings.readExposure(prefs));
311c7965e2bc8f69006de09b4be6fad61c4d2313e07Sascha Haeberling        mOnScreenIndicators.updateFlashOnScreenIndicator(params.getFlashMode());
312eb8adc1754fc668435ee57d1be2235b80fc8c009Michael Kolb        int wbIndex = 2;
313eb8adc1754fc668435ee57d1be2235b80fc8c009Michael Kolb        ListPreference pref = group.findPreference(CameraSettings.KEY_WHITE_BALANCE);
314eb8adc1754fc668435ee57d1be2235b80fc8c009Michael Kolb        if (pref != null) {
315eb8adc1754fc668435ee57d1be2235b80fc8c009Michael Kolb            wbIndex = pref.getCurrentIndex();
316eb8adc1754fc668435ee57d1be2235b80fc8c009Michael Kolb        }
317eb8adc1754fc668435ee57d1be2235b80fc8c009Michael Kolb        mOnScreenIndicators.updateWBIndicator(wbIndex);
3188788079a51a90255dce330e56afcb6674deccbf7Michael Kolb        boolean location = RecordLocationPreference.get(
3198788079a51a90255dce330e56afcb6674deccbf7Michael Kolb                prefs, mActivity.getContentResolver());
320eb8adc1754fc668435ee57d1be2235b80fc8c009Michael Kolb        mOnScreenIndicators.updateLocationIndicator(location);
321d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb    }
322d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb
323d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb    public void setCameraState(int state) {
324d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb    }
325d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb
326d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb    public boolean dispatchTouchEvent(MotionEvent m) {
327fd2e619a2fb263315816b3579a9c6751c398132dDoris Liu        if (mGestures != null && mRenderOverlay != null) {
328d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb            return mGestures.dispatchTouch(m);
329d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb        }
330d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb        return false;
331d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb    }
332d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb
333d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb    public boolean onBackPressed() {
334d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb        if (mPieRenderer != null && mPieRenderer.showsItems()) {
335d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb            mPieRenderer.hide();
336d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb            return true;
337d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb        }
338d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb        // In image capture mode, back button should:
339d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb        // 1) if there is any popup, dismiss them, 2) otherwise, get out of
340d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb        // image capture
341d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb        if (mController.isImageCaptureIntent()) {
342d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb            if (!removeTopLevelPopup()) {
343d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb                // no popup to dismiss, cancel image capture
344d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb                mController.onCaptureCancelled();
345d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb            }
346d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb            return true;
347d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb        } else if (!mController.isCameraIdle()) {
348d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb            // ignore backs while we're taking a picture
349d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb            return true;
350d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb        } else {
351d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb            return removeTopLevelPopup();
352d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb        }
353d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb    }
354d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb
355d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb    public void onFullScreenChanged(boolean full) {
356d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb        if (mFaceView != null) {
357d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb            mFaceView.setBlockDraw(!full);
358d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb        }
359d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb        if (mPopup != null) {
3607048972374474dfca142856583833d8168d3b1b6Michael Kolb            dismissPopup(full);
361d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb        }
362d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb        if (mGestures != null) {
363d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb            mGestures.setEnabled(full);
364d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb        }
365d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb        if (mRenderOverlay != null) {
366d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb            // this can not happen in capture mode
367d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb            mRenderOverlay.setVisibility(full ? View.VISIBLE : View.GONE);
368d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb        }
369d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb        if (mPieRenderer != null) {
370d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb            mPieRenderer.setBlockFocus(!full);
371d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb        }
372d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb        setShowMenu(full);
373d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb        if (mBlocker != null) {
374d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb            mBlocker.setVisibility(full ? View.VISIBLE : View.GONE);
375d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb        }
376d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb        if (!full && mCountDownView != null) mCountDownView.cancelCountDown();
377d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb    }
378d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb
37978a5b224eca3c702f4ecf8abd072779e32e26641Michael Kolb    public void enablePreviewThumb(boolean enabled) {
38078a5b224eca3c702f4ecf8abd072779e32e26641Michael Kolb        if (enabled) {
38178a5b224eca3c702f4ecf8abd072779e32e26641Michael Kolb            mGestures.addTouchReceiver(mPreviewThumb);
38278a5b224eca3c702f4ecf8abd072779e32e26641Michael Kolb            mPreviewThumb.setVisibility(View.VISIBLE);
38378a5b224eca3c702f4ecf8abd072779e32e26641Michael Kolb        } else {
38478a5b224eca3c702f4ecf8abd072779e32e26641Michael Kolb            mGestures.removeTouchReceiver(mPreviewThumb);
38578a5b224eca3c702f4ecf8abd072779e32e26641Michael Kolb            mPreviewThumb.setVisibility(View.GONE);
38678a5b224eca3c702f4ecf8abd072779e32e26641Michael Kolb        }
38778a5b224eca3c702f4ecf8abd072779e32e26641Michael Kolb    }
38878a5b224eca3c702f4ecf8abd072779e32e26641Michael Kolb
389d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb    public boolean removeTopLevelPopup() {
390d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb        // Remove the top level popup or dialog box and return true if there's any
391d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb        if (mPopup != null) {
3927048972374474dfca142856583833d8168d3b1b6Michael Kolb            dismissPopup();
393d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb            return true;
394d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb        }
395d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb        return false;
396d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb    }
397d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb
398d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb    public void showPopup(AbstractSettingPopup popup) {
399d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb        mActivity.hideUI();
400d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb        mBlocker.setVisibility(View.INVISIBLE);
401d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb        setShowMenu(false);
402d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb        mPopup = popup;
403d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb        mPopup.setVisibility(View.VISIBLE);
404d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb        FrameLayout.LayoutParams lp = new FrameLayout.LayoutParams(LayoutParams.WRAP_CONTENT,
405d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb                LayoutParams.WRAP_CONTENT);
406d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb        lp.gravity = Gravity.CENTER;
407d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb        ((FrameLayout) mRootView).addView(mPopup, lp);
408fd2e619a2fb263315816b3579a9c6751c398132dDoris Liu        mGestures.addTouchReceiver(mPopup);
409d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb    }
410d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb
4117048972374474dfca142856583833d8168d3b1b6Michael Kolb    public void dismissPopup() {
4127048972374474dfca142856583833d8168d3b1b6Michael Kolb        dismissPopup(true);
413d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb    }
414d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb
4157048972374474dfca142856583833d8168d3b1b6Michael Kolb    private void dismissPopup(boolean fullScreen) {
416d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb        if (fullScreen) {
417d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb            mActivity.showUI();
418d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb            mBlocker.setVisibility(View.VISIBLE);
419d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb        }
420d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb        setShowMenu(fullScreen);
421d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb        if (mPopup != null) {
422fd2e619a2fb263315816b3579a9c6751c398132dDoris Liu            mGestures.removeTouchReceiver(mPopup);
423d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb            ((FrameLayout) mRootView).removeView(mPopup);
424d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb            mPopup = null;
425d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb        }
4267048972374474dfca142856583833d8168d3b1b6Michael Kolb        mMenu.popupDismissed();
427d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb    }
428d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb
429d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb    public void onShowSwitcherPopup() {
430d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb        if (mPieRenderer != null && mPieRenderer.showsItems()) {
431d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb            mPieRenderer.hide();
432d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb        }
433d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb    }
434d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb
435d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb    private void setShowMenu(boolean show) {
436d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb        if (mOnScreenIndicators != null) {
437d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb            mOnScreenIndicators.setVisibility(show ? View.VISIBLE : View.GONE);
438d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb        }
439d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb        if (mMenuButton != null) {
440d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb            mMenuButton.setVisibility(show ? View.VISIBLE : View.GONE);
441d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb        }
442d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb    }
443d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb
444d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb    public boolean collapseCameraControls() {
445d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb        // Remove all the popups/dialog boxes
446d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb        boolean ret = false;
447d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb        if (mPopup != null) {
4487048972374474dfca142856583833d8168d3b1b6Michael Kolb            dismissPopup();
449d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb            ret = true;
450d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb        }
451b16bae90dbb99892c6b3209c13c53c44cb69deb4Michael Kolb        onShowSwitcherPopup();
452d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb        return ret;
453d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb    }
454d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb
455d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb    protected void showPostCaptureAlert() {
456d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb        mOnScreenIndicators.setVisibility(View.GONE);
457d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb        mMenuButton.setVisibility(View.GONE);
458d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb        Util.fadeIn(mReviewDoneButton);
459d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb        mShutterButton.setVisibility(View.INVISIBLE);
460d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb        Util.fadeIn(mReviewRetakeButton);
461d31cdfeb1035df8ba939e877031769f0df247aa6Doris Liu        pauseFaceDetection();
462d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb    }
463d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb
464d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb    protected void hidePostCaptureAlert() {
465d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb        mOnScreenIndicators.setVisibility(View.VISIBLE);
466d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb        mMenuButton.setVisibility(View.VISIBLE);
467d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb        Util.fadeOut(mReviewDoneButton);
468d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb        mShutterButton.setVisibility(View.VISIBLE);
469d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb        Util.fadeOut(mReviewRetakeButton);
470d31cdfeb1035df8ba939e877031769f0df247aa6Doris Liu        resumeFaceDetection();
471d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb    }
472d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb
473d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb    public void setDisplayOrientation(int orientation) {
474d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb        if (mFaceView != null) {
475d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb            mFaceView.setDisplayOrientation(orientation);
476d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb        }
477d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb    }
478d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb
479d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb    // shutter button handling
480d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb
481d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb    public boolean isShutterPressed() {
482d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb        return mShutterButton.isPressed();
483d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb    }
484d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb
485d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb    // focus handling
486d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb
487d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb
488d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb    private class ZoomChangeListener implements ZoomRenderer.OnZoomChangedListener {
489d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb        @Override
490d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb        public void onZoomValueChanged(int index) {
491d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb            int newZoom = mController.onZoomChanged(index);
492d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb            if (mZoomRenderer != null) {
493d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb                mZoomRenderer.setZoomValue(mZoomRatios.get(newZoom));
494d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb            }
495d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb        }
496d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb
497d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb        @Override
498d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb        public void onZoomStart() {
499d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb            if (mPieRenderer != null) {
500d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb                mPieRenderer.setBlockFocus(true);
501d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb            }
502d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb        }
503d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb
504d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb        @Override
505d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb        public void onZoomEnd() {
506d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb            if (mPieRenderer != null) {
507d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb                mPieRenderer.setBlockFocus(false);
508d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb            }
509d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb        }
510d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb    }
511d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb
512d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb    @Override
513d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb    public void onPieOpened(int centerX, int centerY) {
5147048972374474dfca142856583833d8168d3b1b6Michael Kolb        dismissPopup();
515d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb        mActivity.cancelActivityTouchHandling();
516d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb        mActivity.setSwipingEnabled(false);
517d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb        if (mFaceView != null) {
518d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb            mFaceView.setBlockDraw(true);
519d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb        }
520d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb    }
521d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb
522d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb    @Override
523d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb    public void onPieClosed() {
524d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb        mActivity.setSwipingEnabled(true);
525d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb        if (mFaceView != null) {
526d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb            mFaceView.setBlockDraw(false);
527d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb        }
528d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb    }
529d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb
530d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb    // Surface Listener
531d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb
532d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb    @Override
533d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
534d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb        Log.v(TAG, "surfaceChanged:" + holder + " width=" + width + ". height="
535d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb                + height);
536d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb    }
537d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb
538d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb    @Override
539d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb    public void surfaceCreated(SurfaceHolder holder) {
540d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb        Log.v(TAG, "surfaceCreated: " + holder);
541d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb        mSurfaceHolder = holder;
542d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb        mController.onSurfaceCreated(holder);
543d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb    }
544d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb
545d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb    @Override
546d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb    public void surfaceDestroyed(SurfaceHolder holder) {
547d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb        Log.v(TAG, "surfaceDestroyed: " + holder);
548d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb        mSurfaceHolder = null;
549d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb        mController.stopPreview();
550d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb    }
551d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb
552d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb    public Object getSurfaceTexture() {
553d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb        return mSurfaceTexture;
554d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb    }
555d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb
556d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb    public void setSurfaceTexture(Object st) {
557d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb        mSurfaceTexture = st;
558d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb    }
559d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb
560d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb    public SurfaceHolder getSurfaceHolder() {
561d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb        return mSurfaceHolder;
562d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb    }
563d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb
564d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb    public boolean isCountingDown() {
565d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb        return mCountDownView.isCountingDown();
566d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb    }
567d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb
568d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb    public void cancelCountDown() {
569d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb        mCountDownView.cancelCountDown();
570d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb    }
571d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb
572d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb    public void startCountDown(int sec, boolean playSound) {
573d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb        mCountDownView.startCountDown(sec, playSound);
574d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb    }
575d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb
576d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb    public void showPreferencesToast() {
577d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb        if (mNotSelectableToast == null) {
578d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb            String str = mActivity.getResources().getString(R.string.not_selectable_in_scene_mode);
579d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb            mNotSelectableToast = Toast.makeText(mActivity, str, Toast.LENGTH_SHORT);
580d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb        }
581d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb        mNotSelectableToast.show();
582d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb    }
583d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb
584d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb    public void onPause() {
585d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb        mCountDownView.cancelCountDown();
586d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb        // Close the camera now because other activities may need to use it.
587d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb        mSurfaceTexture = null;
588d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb
589d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb        // Clear UI.
590d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb        collapseCameraControls();
591d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb        if (mFaceView != null) mFaceView.clear();
592d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb
593d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb
594d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb        mRootView.removeOnLayoutChangeListener(mLayoutListener);
595d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb        mPreviewWidth = 0;
596d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb        mPreviewHeight = 0;
597d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb    }
598d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb
599d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb    public void enableShutter(boolean enabled) {
600d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb        if (mShutterButton != null) {
601d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb            mShutterButton.setEnabled(enabled);
602d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb        }
603d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb    }
604d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb
605d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb    public void pressShutterButton() {
606d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb        if (mShutterButton.isInTouchMode()) {
607d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb            mShutterButton.requestFocusFromTouch();
608d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb        } else {
609d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb            mShutterButton.requestFocus();
610d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb        }
611d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb        mShutterButton.setPressed(true);
612d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb    }
613d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb
614d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb    // forward from preview gestures to controller
615d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb    @Override
616d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb    public void onSingleTapUp(View view, int x, int y) {
617d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb        mController.onSingleTapUp(view, x, y);
618d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb    }
619d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb
620d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb    // focus UI implementation
621d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb
622d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb    private FocusIndicator getFocusIndicator() {
623d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb        return (mFaceView != null && mFaceView.faceExists()) ? mFaceView : mPieRenderer;
624d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb    }
625d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb
626d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb    @Override
627d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb    public boolean hasFaces() {
628d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb        return (mFaceView != null && mFaceView.faceExists());
629d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb    }
630d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb
631d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb    public void clearFaces() {
632d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb        if (mFaceView != null) mFaceView.clear();
633d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb    }
634d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb
635d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb    @Override
636d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb    public void clearFocus() {
6372441ada50f4bfa3a6c59472ebd3b6339778b8b6bMichael Kolb        FocusIndicator indicator = getFocusIndicator();
6382441ada50f4bfa3a6c59472ebd3b6339778b8b6bMichael Kolb        if (indicator != null) indicator.clear();
639d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb    }
640d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb
641d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb    @Override
642d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb    public void setFocusPosition(int x, int y) {
643d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb        mPieRenderer.setFocus(x, y);
644d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb    }
645d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb
646d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb    @Override
647d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb    public void onFocusStarted() {
648d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb        getFocusIndicator().showStart();
649d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb    }
650d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb
651d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb    @Override
652d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb    public void onFocusSucceeded(boolean timeout) {
653d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb        getFocusIndicator().showSuccess(timeout);
654d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb    }
655d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb
656d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb    @Override
657d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb    public void onFocusFailed(boolean timeout) {
658d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb        getFocusIndicator().showFail(timeout);
659d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb    }
660d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb
661d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb    @Override
662d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb    public void pauseFaceDetection() {
663d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb        if (mFaceView != null) mFaceView.pause();
664d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb    }
665d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb
666d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb    @Override
667d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb    public void resumeFaceDetection() {
668d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb        if (mFaceView != null) mFaceView.resume();
669d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb    }
670d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb
671d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb    public void onStartFaceDetection(int orientation, boolean mirror) {
672d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb        mFaceView.clear();
673d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb        mFaceView.setVisibility(View.VISIBLE);
674d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb        mFaceView.setDisplayOrientation(orientation);
675d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb        mFaceView.setMirror(mirror);
676d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb        mFaceView.resume();
677d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb    }
678d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb
679d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb    @Override
680d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb    public void onFaceDetection(Face[] faces, android.hardware.Camera camera) {
681d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb        mFaceView.setFaces(faces);
682d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb    }
683d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb
6843bc96b2d1106fc5ebec6fda6aad3bca4d62e81c0Michael Kolb    @Override
6853bc96b2d1106fc5ebec6fda6aad3bca4d62e81c0Michael Kolb    public void onSwipe(int direction) {
6863bc96b2d1106fc5ebec6fda6aad3bca4d62e81c0Michael Kolb        if (direction == PreviewGestures.DIR_UP) {
6873bc96b2d1106fc5ebec6fda6aad3bca4d62e81c0Michael Kolb            openMenu();
6883bc96b2d1106fc5ebec6fda6aad3bca4d62e81c0Michael Kolb        }
6893bc96b2d1106fc5ebec6fda6aad3bca4d62e81c0Michael Kolb    }
6903bc96b2d1106fc5ebec6fda6aad3bca4d62e81c0Michael Kolb
691d6954f337e20365fc24ecffdd6f30e17c6b31effMichael Kolb}
692