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