VideoUI.java revision ec0f890e3283acd81cd1e3d2c55c7bf7b2b406d6
1ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu/* 2ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu * Copyright (C) 2013 The Android Open Source Project 3ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu * 4ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu * Licensed under the Apache License, Version 2.0 (the "License"); 5ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu * you may not use this file except in compliance with the License. 6ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu * You may obtain a copy of the License at 7ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu * 8ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu * http://www.apache.org/licenses/LICENSE-2.0 9ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu * 10ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu * Unless required by applicable law or agreed to in writing, software 11ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu * distributed under the License is distributed on an "AS IS" BASIS, 12ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu * See the License for the specific language governing permissions and 14ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu * limitations under the License. 15ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu */ 16ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu 17ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liupackage com.android.camera; 18ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu 19ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liuimport android.graphics.Bitmap; 20ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liuimport android.hardware.Camera.Parameters; 21ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liuimport android.util.Log; 22ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liuimport android.view.Gravity; 23ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liuimport android.view.MotionEvent; 24ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liuimport android.view.SurfaceHolder; 25ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liuimport android.view.View; 26ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liuimport android.view.View.OnClickListener; 27ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liuimport android.view.ViewGroup; 28ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liuimport android.widget.FrameLayout; 29ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liuimport android.widget.FrameLayout.LayoutParams; 30ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liuimport android.widget.ImageView; 31ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liuimport android.widget.LinearLayout; 32ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liuimport android.widget.TextView; 33ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu 34ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liuimport com.android.camera.CameraPreference.OnPreferenceChangedListener; 35ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liuimport com.android.camera.ui.AbstractSettingPopup; 36ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liuimport com.android.camera.ui.PieRenderer; 37ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liuimport com.android.camera.ui.PreviewSurfaceView; 38ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liuimport com.android.camera.ui.RenderOverlay; 39ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liuimport com.android.camera.ui.RotateLayout; 40ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liuimport com.android.camera.ui.ZoomRenderer; 41ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liuimport com.android.gallery3d.R; 42ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liuimport com.android.gallery3d.common.ApiHelper; 43ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu 44ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liuimport java.util.List; 45ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu 46ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liupublic class VideoUI implements SurfaceHolder.Callback, PieRenderer.PieListener, 47f79ef61a719d8edc9e76ddc00a6f667db2c363e4Michael Kolb PreviewGestures.SingleTapListener, 48f79ef61a719d8edc9e76ddc00a6f667db2c363e4Michael Kolb PreviewGestures.SwipeListener { 49ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu private final static String TAG = "CAM_VideoUI"; 50ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu // module fields 51ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu private CameraActivity mActivity; 52ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu private View mRootView; 53ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu private PreviewFrameLayout mPreviewFrameLayout; 54ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu private boolean mSurfaceViewReady; 55ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu private PreviewSurfaceView mPreviewSurfaceView; 56ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu // An review image having same size as preview. It is displayed when 57ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu // recording is stopped in capture intent. 58ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu private ImageView mReviewImage; 59ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu private View mReviewCancelButton; 60ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu private View mReviewDoneButton; 61ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu private View mReviewPlayButton; 62ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu private ShutterButton mShutterButton; 63ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu private TextView mRecordingTimeView; 64ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu private LinearLayout mLabelsLinearLayout; 65ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu private View mTimeLapseLabel; 66ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu private RenderOverlay mRenderOverlay; 67ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu private PieRenderer mPieRenderer; 68ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu private VideoMenu mVideoMenu; 69ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu private AbstractSettingPopup mPopup; 70ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu private ZoomRenderer mZoomRenderer; 71ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu private PreviewGestures mGestures; 72ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu private View mMenu; 73ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu private View mBlocker; 74ae52b3e3f0f356e1b91e883729d0d82cb40d7a42Sascha Haeberling private OnScreenIndicators mOnScreenIndicators; 75ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu private RotateLayout mRecordingTimeRect; 76ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu private VideoController mController; 77ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu private int mZoomMax; 78ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu private List<Integer> mZoomRatios; 79ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu 80ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu public VideoUI(CameraActivity activity, VideoController controller, View parent) { 81ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu mActivity = activity; 82ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu mController = controller; 83ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu mRootView = parent; 84ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu mActivity.getLayoutInflater().inflate(R.layout.video_module, (ViewGroup) mRootView, true); 85ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu mPreviewSurfaceView = (PreviewSurfaceView) mRootView 86ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu .findViewById(R.id.preview_surface_view); 87ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu initializeMiscControls(); 88ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu initializeControlByIntent(); 89ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu initializeOverlay(); 90ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu } 91ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu 92ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu private void initializeControlByIntent() { 93ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu mBlocker = mActivity.findViewById(R.id.blocker); 94ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu mMenu = mActivity.findViewById(R.id.menu); 95ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu mMenu.setOnClickListener(new OnClickListener() { 96ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu @Override 97ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu public void onClick(View v) { 98ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu if (mPieRenderer != null) { 99ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu mPieRenderer.showInCenter(); 100ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu } 101ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu } 102ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu }); 103ec0f890e3283acd81cd1e3d2c55c7bf7b2b406d6Michael Kolb mOnScreenIndicators = new OnScreenIndicators(mActivity, 104ae52b3e3f0f356e1b91e883729d0d82cb40d7a42Sascha Haeberling mActivity.findViewById(R.id.on_screen_indicators)); 105ae52b3e3f0f356e1b91e883729d0d82cb40d7a42Sascha Haeberling mOnScreenIndicators.resetToDefault(); 106ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu if (mController.isVideoCaptureIntent()) { 107ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu mActivity.hideSwitcher(); 108ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu ViewGroup cameraControls = (ViewGroup) mActivity.findViewById(R.id.camera_controls); 109ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu mActivity.getLayoutInflater().inflate(R.layout.review_module_control, cameraControls); 110ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu // Cannot use RotateImageView for "done" and "cancel" button because 111ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu // the tablet layout uses RotateLayout, which cannot be cast to 112ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu // RotateImageView. 113ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu mReviewDoneButton = mActivity.findViewById(R.id.btn_done); 114ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu mReviewCancelButton = mActivity.findViewById(R.id.btn_cancel); 115ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu mReviewPlayButton = mActivity.findViewById(R.id.btn_play); 116ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu mReviewCancelButton.setVisibility(View.VISIBLE); 117ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu mReviewDoneButton.setOnClickListener(new OnClickListener() { 118ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu @Override 119ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu public void onClick(View v) { 120ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu mController.onReviewDoneClicked(v); 121ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu } 122ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu }); 123ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu mReviewCancelButton.setOnClickListener(new OnClickListener() { 124ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu @Override 125ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu public void onClick(View v) { 126ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu mController.onReviewCancelClicked(v); 127ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu } 128ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu }); 129ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu mReviewPlayButton.setOnClickListener(new OnClickListener() { 130ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu @Override 131ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu public void onClick(View v) { 132ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu mController.onReviewPlayClicked(v); 133ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu } 134ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu }); 135ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu } 136ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu } 137ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu 138ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu public boolean collapseCameraControls() { 139ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu boolean ret = false; 140ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu if (mPopup != null) { 141ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu dismissPopup(false); 142ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu ret = true; 143ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu } 144ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu return ret; 145ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu } 146ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu 147ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu public boolean removeTopLevelPopup() { 148ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu if (mPopup != null) { 149ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu dismissPopup(true); 150ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu return true; 151ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu } 152ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu return false; 153ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu } 154ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu 155ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu public void enableCameraControls(boolean enable) { 156ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu if (mGestures != null) { 157ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu mGestures.setZoomOnly(!enable); 158ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu } 159ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu if (mPieRenderer != null && mPieRenderer.showsItems()) { 160ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu mPieRenderer.hide(); 161ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu } 162ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu } 163ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu 164ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu public void overrideSettings(final String... keyvalues) { 165ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu mVideoMenu.overrideSettings(keyvalues); 166ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu } 167ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu 168ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu public View getPreview() { 169ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu return mPreviewFrameLayout; 170ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu } 171ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu 172ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu public void setOrientationIndicator(int orientation, boolean animation) { 173ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu if (mGestures != null) { 174ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu mGestures.setOrientation(orientation); 175ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu } 176ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu // We change the orientation of the linearlayout only for phone UI 177ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu // because when in portrait the width is not enough. 178ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu if (mLabelsLinearLayout != null) { 179ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu if (((orientation / 90) & 1) == 0) { 180ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu mLabelsLinearLayout.setOrientation(LinearLayout.VERTICAL); 181ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu } else { 182ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu mLabelsLinearLayout.setOrientation(LinearLayout.HORIZONTAL); 183ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu } 184ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu } 185ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu mRecordingTimeRect.setOrientation(0, animation); 186ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu } 187ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu 188ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu public SurfaceHolder getSurfaceHolder() { 189ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu return mPreviewSurfaceView.getHolder(); 190ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu } 191ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu 192ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu public void hideSurfaceView() { 193ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu mPreviewSurfaceView.setVisibility(View.GONE); 194ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu } 195ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu 196ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu public void showSurfaceView() { 197ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu mPreviewSurfaceView.setVisibility(View.VISIBLE); 198ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu } 199ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu 200ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu private void initializeOverlay() { 201ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu mRenderOverlay = (RenderOverlay) mRootView.findViewById(R.id.render_overlay); 202ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu if (mPieRenderer == null) { 203ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu mPieRenderer = new PieRenderer(mActivity); 204ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu mVideoMenu = new VideoMenu(mActivity, this, mPieRenderer); 205ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu mPieRenderer.setPieListener(this); 206ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu } 207ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu mRenderOverlay.addRenderer(mPieRenderer); 208ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu if (mZoomRenderer == null) { 209ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu mZoomRenderer = new ZoomRenderer(mActivity); 210ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu } 211ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu mRenderOverlay.addRenderer(mZoomRenderer); 212ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu if (mGestures == null) { 213f79ef61a719d8edc9e76ddc00a6f667db2c363e4Michael Kolb mGestures = new PreviewGestures(mActivity, this, mZoomRenderer, mPieRenderer, this); 214ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu } 215ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu mGestures.setRenderOverlay(mRenderOverlay); 216cf18f7e34ea9c175e0cf10150a339e5ff016a57cDoris Liu mGestures.reset(); 217ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu mGestures.addTouchReceiver(mMenu); 218cf18f7e34ea9c175e0cf10150a339e5ff016a57cDoris Liu mGestures.addUnclickableArea(mBlocker); 219ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu if (mController.isVideoCaptureIntent()) { 220ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu if (mReviewCancelButton != null) { 221ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu mGestures.addTouchReceiver(mReviewCancelButton); 222ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu } 223ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu if (mReviewDoneButton != null) { 224ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu mGestures.addTouchReceiver(mReviewDoneButton); 225ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu } 226ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu if (mReviewPlayButton != null) { 227ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu mGestures.addTouchReceiver(mReviewPlayButton); 228ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu } 229ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu } 230ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu } 231ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu 232ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu public void setPrefChangedListener(OnPreferenceChangedListener listener) { 233ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu mVideoMenu.setListener(listener); 234ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu } 235ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu 236ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu private void initializeMiscControls() { 237ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu mPreviewFrameLayout = (PreviewFrameLayout) mRootView.findViewById(R.id.frame); 238ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu mPreviewFrameLayout.setOnLayoutChangeListener(mActivity); 239ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu mReviewImage = (ImageView) mRootView.findViewById(R.id.review_image); 240ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu mShutterButton = mActivity.getShutterButton(); 241ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu mShutterButton.setImageResource(R.drawable.btn_new_shutter_video); 242ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu mShutterButton.setOnShutterButtonListener(mController); 243ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu mShutterButton.setVisibility(View.VISIBLE); 244ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu mShutterButton.requestFocus(); 245ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu mShutterButton.enableTouch(true); 246ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu mRecordingTimeView = (TextView) mRootView.findViewById(R.id.recording_time); 247ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu mRecordingTimeRect = (RotateLayout) mRootView.findViewById(R.id.recording_time_rect); 248ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu mTimeLapseLabel = mRootView.findViewById(R.id.time_lapse_label); 249ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu // The R.id.labels can only be found in phone layout. 250ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu // That is, mLabelsLinearLayout should be null in tablet layout. 251ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu mLabelsLinearLayout = (LinearLayout) mRootView.findViewById(R.id.labels); 252ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu } 253ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu 254ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu public void updateOnScreenIndicators(Parameters param) { 255ae52b3e3f0f356e1b91e883729d0d82cb40d7a42Sascha Haeberling mOnScreenIndicators.updateFlashOnScreenIndicator(param.getFlashMode()); 256ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu } 257ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu 258ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu public void setAspectRatio(double ratio) { 259ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu mPreviewFrameLayout.setAspectRatio(ratio); 260ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu } 261ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu 262ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu public void showTimeLapseUI(boolean enable) { 263ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu if (mTimeLapseLabel != null) { 264ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu mTimeLapseLabel.setVisibility(enable ? View.VISIBLE : View.GONE); 265ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu } 266ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu } 267ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu 268f79ef61a719d8edc9e76ddc00a6f667db2c363e4Michael Kolb private void openMenu() { 269f79ef61a719d8edc9e76ddc00a6f667db2c363e4Michael Kolb if (mPieRenderer != null) { 270f79ef61a719d8edc9e76ddc00a6f667db2c363e4Michael Kolb mPieRenderer.showInCenter(); 271f79ef61a719d8edc9e76ddc00a6f667db2c363e4Michael Kolb } 272f79ef61a719d8edc9e76ddc00a6f667db2c363e4Michael Kolb } 273f79ef61a719d8edc9e76ddc00a6f667db2c363e4Michael Kolb 274ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu public void showPopup(AbstractSettingPopup popup) { 275ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu mActivity.hideUI(); 276ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu mBlocker.setVisibility(View.INVISIBLE); 277ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu setShowMenu(false); 278ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu mPopup = popup; 279ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu mPopup.setVisibility(View.VISIBLE); 280ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu FrameLayout.LayoutParams lp = new FrameLayout.LayoutParams(LayoutParams.WRAP_CONTENT, 281ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu LayoutParams.WRAP_CONTENT); 282ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu lp.gravity = Gravity.CENTER; 283ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu ((FrameLayout) mRootView).addView(mPopup, lp); 284f9adf16cc73ad803dee8e973e9e9205f583e1481Doris Liu mGestures.addTouchReceiver(mPopup); 285ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu } 286ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu 287ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu public void dismissPopup(boolean topLevelOnly) { 288ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu dismissPopup(topLevelOnly, true); 289ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu } 290ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu 291ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu public void dismissPopup(boolean topLevelPopupOnly, boolean fullScreen) { 292ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu if (fullScreen) { 293ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu mActivity.showUI(); 294ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu mBlocker.setVisibility(View.VISIBLE); 295ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu } 296ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu setShowMenu(fullScreen); 297ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu if (mPopup != null) { 298f9adf16cc73ad803dee8e973e9e9205f583e1481Doris Liu mGestures.removeTouchReceiver(mPopup); 299ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu ((FrameLayout) mRootView).removeView(mPopup); 300ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu mPopup = null; 301ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu } 302ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu mVideoMenu.popupDismissed(topLevelPopupOnly); 303ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu } 304ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu 305ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu public void onShowSwitcherPopup() { 306ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu hidePieRenderer(); 307ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu } 308ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu 309ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu public boolean hidePieRenderer() { 310ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu if (mPieRenderer != null && mPieRenderer.showsItems()) { 311ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu mPieRenderer.hide(); 312ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu return true; 313ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu } 314ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu return false; 315ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu } 316ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu 31729002527ec98a38326f602661abda4d8968baeecDoris Liu // disable preview gestures after shutter is pressed 31829002527ec98a38326f602661abda4d8968baeecDoris Liu public void setShutterPressed(boolean pressed) { 31929002527ec98a38326f602661abda4d8968baeecDoris Liu if (mGestures == null) return; 32029002527ec98a38326f602661abda4d8968baeecDoris Liu mGestures.setEnabled(!pressed); 32129002527ec98a38326f602661abda4d8968baeecDoris Liu } 32229002527ec98a38326f602661abda4d8968baeecDoris Liu 323ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu public void enableShutter(boolean enable) { 324ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu if (mShutterButton != null) { 325ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu mShutterButton.setEnabled(enable); 326ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu } 327ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu } 328ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu 329ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu // PieListener 330ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu @Override 331ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu public void onPieOpened(int centerX, int centerY) { 332ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu mActivity.cancelActivityTouchHandling(); 333ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu mActivity.setSwipingEnabled(false); 334ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu } 335ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu 336ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu @Override 337ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu public void onPieClosed() { 338ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu mActivity.setSwipingEnabled(true); 339ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu } 340ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu 341ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu public void showPreviewBorder(boolean enable) { 342ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu mPreviewFrameLayout.showBorder(enable); 343ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu } 344ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu 345ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu // SingleTapListener 346ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu // Preview area is touched. Take a picture. 347ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu @Override 348ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu public void onSingleTapUp(View view, int x, int y) { 349ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu mController.onSingleTapUp(view, x, y); 350ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu } 351ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu 352ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu // SurfaceView callback 353ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu @Override 354ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { 355ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu Log.v(TAG, "Surface changed. width=" + width + ". height=" + height); 356ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu } 357ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu 358ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu @Override 359ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu public void surfaceCreated(SurfaceHolder holder) { 360ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu Log.v(TAG, "Surface created"); 361ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu mSurfaceViewReady = true; 362ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu } 363ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu 364ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu @Override 365ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu public void surfaceDestroyed(SurfaceHolder holder) { 366ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu Log.v(TAG, "Surface destroyed"); 367ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu mSurfaceViewReady = false; 368ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu mController.stopPreview(); 369ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu } 370ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu 371ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu public boolean isSurfaceViewReady() { 372ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu return mSurfaceViewReady; 373ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu } 374ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu 375ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu public void showRecordingUI(boolean recording, boolean zoomSupported) { 376ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu mMenu.setVisibility(recording ? View.GONE : View.VISIBLE); 377ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu mOnScreenIndicators.setVisibility(recording ? View.GONE : View.VISIBLE); 378ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu if (recording) { 379ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu mShutterButton.setImageResource(R.drawable.btn_shutter_video_recording); 380ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu mActivity.hideSwitcher(); 381ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu mRecordingTimeView.setText(""); 382ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu mRecordingTimeView.setVisibility(View.VISIBLE); 383ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu // The camera is not allowed to be accessed in older api levels during 384ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu // recording. It is therefore necessary to hide the zoom UI on older 385ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu // platforms. 386ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu // See the documentation of android.media.MediaRecorder.start() for 387ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu // further explanation. 388ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu if (!ApiHelper.HAS_ZOOM_WHEN_RECORDING && zoomSupported) { 389ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu // TODO: disable zoom UI here. 390ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu } 391ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu } else { 392ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu mShutterButton.setImageResource(R.drawable.btn_new_shutter_video); 393ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu mActivity.showSwitcher(); 394ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu mRecordingTimeView.setVisibility(View.GONE); 395ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu if (!ApiHelper.HAS_ZOOM_WHEN_RECORDING && zoomSupported) { 396ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu // TODO: enable zoom UI here. 397ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu } 398ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu } 399ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu } 400ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu 401ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu public void showReviewImage(Bitmap bitmap) { 402ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu mReviewImage.setImageBitmap(bitmap); 403ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu mReviewImage.setVisibility(View.VISIBLE); 404ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu } 405ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu 406ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu public void showReviewControls() { 407ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu Util.fadeOut(mShutterButton); 408ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu Util.fadeIn(mReviewDoneButton); 409ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu Util.fadeIn(mReviewPlayButton); 410ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu mReviewImage.setVisibility(View.VISIBLE); 411ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu mMenu.setVisibility(View.GONE); 412ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu mOnScreenIndicators.setVisibility(View.GONE); 413ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu } 414ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu 415ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu public void hideReviewUI() { 416ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu mReviewImage.setVisibility(View.GONE); 417ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu mShutterButton.setEnabled(true); 418ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu mMenu.setVisibility(View.VISIBLE); 419ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu mOnScreenIndicators.setVisibility(View.VISIBLE); 420ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu Util.fadeOut(mReviewDoneButton); 421ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu Util.fadeOut(mReviewPlayButton); 422ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu Util.fadeIn(mShutterButton); 423ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu } 424ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu 425ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu private void setShowMenu(boolean show) { 426ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu if (mOnScreenIndicators != null) { 427ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu mOnScreenIndicators.setVisibility(show ? View.VISIBLE : View.GONE); 428ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu } 429ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu if (mMenu != null) { 430ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu mMenu.setVisibility(show ? View.VISIBLE : View.GONE); 431ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu } 432ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu } 433ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu 434ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu public void onFullScreenChanged(boolean full) { 435ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu if (mGestures != null) { 436ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu mGestures.setEnabled(full); 437ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu } 438ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu if (mPopup != null) { 439ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu dismissPopup(false, full); 440ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu } 441ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu if (mRenderOverlay != null) { 442ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu // this can not happen in capture mode 443ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu mRenderOverlay.setVisibility(full ? View.VISIBLE : View.GONE); 444ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu } 445ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu setShowMenu(full); 446ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu if (mBlocker != null) { 447ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu // this can not happen in capture mode 448ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu mBlocker.setVisibility(full ? View.VISIBLE : View.GONE); 449ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu } 450ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu } 451ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu 452ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu public void initializePopup(PreferenceGroup pref) { 453ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu mVideoMenu.initialize(pref); 454ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu } 455ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu 456ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu public void initializeZoom(Parameters param) { 457ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu if (param == null || !param.isZoomSupported()) return; 458ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu mZoomMax = param.getMaxZoom(); 459ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu mZoomRatios = param.getZoomRatios(); 460ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu // Currently we use immediate zoom for fast zooming to get better UX and 461ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu // there is no plan to take advantage of the smooth zoom. 462ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu mZoomRenderer.setZoomMax(mZoomMax); 463ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu mZoomRenderer.setZoom(param.getZoom()); 464ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu mZoomRenderer.setZoomValue(mZoomRatios.get(param.getZoom())); 465ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu mZoomRenderer.setOnZoomChangeListener(new ZoomChangeListener()); 466ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu } 467ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu 468ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu public void clickShutter() { 469ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu mShutterButton.performClick(); 470ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu } 471ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu 472ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu public void pressShutter(boolean pressed) { 473ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu mShutterButton.setPressed(pressed); 474ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu } 475ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu 476ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu public boolean dispatchTouchEvent(MotionEvent m) { 477f9adf16cc73ad803dee8e973e9e9205f583e1481Doris Liu if (mGestures != null && mRenderOverlay != null) { 478ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu return mGestures.dispatchTouch(m); 479ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu } 480ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu return false; 481ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu } 482ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu 483ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu public void setRecordingTime(String text) { 484ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu mRecordingTimeView.setText(text); 485ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu } 486ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu 487ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu public void setRecordingTimeTextColor(int color) { 488ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu mRecordingTimeView.setTextColor(color); 489ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu } 490ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu 491ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu private class ZoomChangeListener implements ZoomRenderer.OnZoomChangedListener { 492ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu @Override 493ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu public void onZoomValueChanged(int index) { 494ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu int newZoom = mController.onZoomChanged(index); 495ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu if (mZoomRenderer != null) { 496ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu mZoomRenderer.setZoomValue(mZoomRatios.get(newZoom)); 497ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu } 498ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu } 499ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu 500ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu @Override 501ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu public void onZoomStart() { 502ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu } 503ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu 504ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu @Override 505ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu public void onZoomEnd() { 506ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu } 507ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu } 508f79ef61a719d8edc9e76ddc00a6f667db2c363e4Michael Kolb 509f79ef61a719d8edc9e76ddc00a6f667db2c363e4Michael Kolb @Override 510f79ef61a719d8edc9e76ddc00a6f667db2c363e4Michael Kolb public void onSwipe(int direction) { 511f79ef61a719d8edc9e76ddc00a6f667db2c363e4Michael Kolb if (direction == PreviewGestures.DIR_UP) { 512f79ef61a719d8edc9e76ddc00a6f667db2c363e4Michael Kolb openMenu(); 513f79ef61a719d8edc9e76ddc00a6f667db2c363e4Michael Kolb } 514f79ef61a719d8edc9e76ddc00a6f667db2c363e4Michael Kolb } 515f79ef61a719d8edc9e76ddc00a6f667db2c363e4Michael Kolb 516ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu} 517