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; 7980a3d636fa38bb78dbc9f224b4944a21a6e3271dSascha Haeberling private View mPreviewThumb; 80ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu 81ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu public VideoUI(CameraActivity activity, VideoController controller, View parent) { 82ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu mActivity = activity; 83ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu mController = controller; 84ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu mRootView = parent; 85ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu mActivity.getLayoutInflater().inflate(R.layout.video_module, (ViewGroup) mRootView, true); 86ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu mPreviewSurfaceView = (PreviewSurfaceView) mRootView 87ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu .findViewById(R.id.preview_surface_view); 88ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu initializeMiscControls(); 89ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu initializeControlByIntent(); 90ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu initializeOverlay(); 91ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu } 92ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu 93ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu private void initializeControlByIntent() { 94ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu mBlocker = mActivity.findViewById(R.id.blocker); 95ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu mMenu = mActivity.findViewById(R.id.menu); 96ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu mMenu.setOnClickListener(new OnClickListener() { 97ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu @Override 98ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu public void onClick(View v) { 99ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu if (mPieRenderer != null) { 100ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu mPieRenderer.showInCenter(); 101ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu } 102ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu } 103ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu }); 104ec0f890e3283acd81cd1e3d2c55c7bf7b2b406d6Michael Kolb mOnScreenIndicators = new OnScreenIndicators(mActivity, 105ae52b3e3f0f356e1b91e883729d0d82cb40d7a42Sascha Haeberling mActivity.findViewById(R.id.on_screen_indicators)); 106ae52b3e3f0f356e1b91e883729d0d82cb40d7a42Sascha Haeberling mOnScreenIndicators.resetToDefault(); 107ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu if (mController.isVideoCaptureIntent()) { 108ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu mActivity.hideSwitcher(); 109ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu ViewGroup cameraControls = (ViewGroup) mActivity.findViewById(R.id.camera_controls); 110ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu mActivity.getLayoutInflater().inflate(R.layout.review_module_control, cameraControls); 111ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu // Cannot use RotateImageView for "done" and "cancel" button because 112ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu // the tablet layout uses RotateLayout, which cannot be cast to 113ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu // RotateImageView. 114ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu mReviewDoneButton = mActivity.findViewById(R.id.btn_done); 115ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu mReviewCancelButton = mActivity.findViewById(R.id.btn_cancel); 116ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu mReviewPlayButton = mActivity.findViewById(R.id.btn_play); 117ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu mReviewCancelButton.setVisibility(View.VISIBLE); 118ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu mReviewDoneButton.setOnClickListener(new OnClickListener() { 119ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu @Override 120ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu public void onClick(View v) { 121ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu mController.onReviewDoneClicked(v); 122ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu } 123ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu }); 124ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu mReviewCancelButton.setOnClickListener(new OnClickListener() { 125ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu @Override 126ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu public void onClick(View v) { 127ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu mController.onReviewCancelClicked(v); 128ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu } 129ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu }); 130ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu mReviewPlayButton.setOnClickListener(new OnClickListener() { 131ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu @Override 132ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu public void onClick(View v) { 133ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu mController.onReviewPlayClicked(v); 134ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu } 135ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu }); 136ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu } 137ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu } 138ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu 139ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu public boolean collapseCameraControls() { 140ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu boolean ret = false; 141ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu if (mPopup != null) { 142ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu dismissPopup(false); 143ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu ret = true; 144ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu } 145ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu return ret; 146ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu } 147ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu 148ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu public boolean removeTopLevelPopup() { 149ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu if (mPopup != null) { 150ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu dismissPopup(true); 151ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu return true; 152ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu } 153ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu return false; 154ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu } 155ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu 156ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu public void enableCameraControls(boolean enable) { 157ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu if (mGestures != null) { 158ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu mGestures.setZoomOnly(!enable); 159ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu } 160ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu if (mPieRenderer != null && mPieRenderer.showsItems()) { 161ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu mPieRenderer.hide(); 162ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu } 163ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu } 164ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu 165ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu public void overrideSettings(final String... keyvalues) { 166ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu mVideoMenu.overrideSettings(keyvalues); 167ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu } 168ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu 169ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu public View getPreview() { 170ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu return mPreviewFrameLayout; 171ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu } 172ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu 173ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu public void setOrientationIndicator(int orientation, boolean animation) { 174ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu if (mGestures != null) { 175ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu mGestures.setOrientation(orientation); 176ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu } 177ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu // We change the orientation of the linearlayout only for phone UI 178ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu // because when in portrait the width is not enough. 179ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu if (mLabelsLinearLayout != null) { 180ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu if (((orientation / 90) & 1) == 0) { 181ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu mLabelsLinearLayout.setOrientation(LinearLayout.VERTICAL); 182ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu } else { 183ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu mLabelsLinearLayout.setOrientation(LinearLayout.HORIZONTAL); 184ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu } 185ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu } 186ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu mRecordingTimeRect.setOrientation(0, animation); 187ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu } 188ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu 189ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu public SurfaceHolder getSurfaceHolder() { 190ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu return mPreviewSurfaceView.getHolder(); 191ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu } 192ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu 193ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu public void hideSurfaceView() { 194ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu mPreviewSurfaceView.setVisibility(View.GONE); 195ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu } 196ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu 197ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu public void showSurfaceView() { 198ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu mPreviewSurfaceView.setVisibility(View.VISIBLE); 199ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu } 200ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu 201ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu private void initializeOverlay() { 202ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu mRenderOverlay = (RenderOverlay) mRootView.findViewById(R.id.render_overlay); 203ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu if (mPieRenderer == null) { 204ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu mPieRenderer = new PieRenderer(mActivity); 205ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu mVideoMenu = new VideoMenu(mActivity, this, mPieRenderer); 206ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu mPieRenderer.setPieListener(this); 207ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu } 208ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu mRenderOverlay.addRenderer(mPieRenderer); 209ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu if (mZoomRenderer == null) { 210ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu mZoomRenderer = new ZoomRenderer(mActivity); 211ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu } 212ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu mRenderOverlay.addRenderer(mZoomRenderer); 213ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu if (mGestures == null) { 214f79ef61a719d8edc9e76ddc00a6f667db2c363e4Michael Kolb mGestures = new PreviewGestures(mActivity, this, mZoomRenderer, mPieRenderer, this); 215ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu } 216ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu mGestures.setRenderOverlay(mRenderOverlay); 217cf18f7e34ea9c175e0cf10150a339e5ff016a57cDoris Liu mGestures.reset(); 218ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu mGestures.addTouchReceiver(mMenu); 219cf18f7e34ea9c175e0cf10150a339e5ff016a57cDoris Liu mGestures.addUnclickableArea(mBlocker); 220ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu if (mController.isVideoCaptureIntent()) { 221ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu if (mReviewCancelButton != null) { 222ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu mGestures.addTouchReceiver(mReviewCancelButton); 223ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu } 224ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu if (mReviewDoneButton != null) { 225ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu mGestures.addTouchReceiver(mReviewDoneButton); 226ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu } 227ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu if (mReviewPlayButton != null) { 228ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu mGestures.addTouchReceiver(mReviewPlayButton); 229ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu } 230ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu } 23180a3d636fa38bb78dbc9f224b4944a21a6e3271dSascha Haeberling 23280a3d636fa38bb78dbc9f224b4944a21a6e3271dSascha Haeberling mPreviewThumb = mActivity.findViewById(R.id.preview_thumb); 23380a3d636fa38bb78dbc9f224b4944a21a6e3271dSascha Haeberling mPreviewThumb.setOnClickListener(new OnClickListener() { 23480a3d636fa38bb78dbc9f224b4944a21a6e3271dSascha Haeberling @Override 23580a3d636fa38bb78dbc9f224b4944a21a6e3271dSascha Haeberling public void onClick(View v) { 23680a3d636fa38bb78dbc9f224b4944a21a6e3271dSascha Haeberling mActivity.gotoGallery(); 23780a3d636fa38bb78dbc9f224b4944a21a6e3271dSascha Haeberling } 23880a3d636fa38bb78dbc9f224b4944a21a6e3271dSascha Haeberling }); 239ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu } 240ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu 241ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu public void setPrefChangedListener(OnPreferenceChangedListener listener) { 242ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu mVideoMenu.setListener(listener); 243ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu } 244ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu 245ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu private void initializeMiscControls() { 246ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu mPreviewFrameLayout = (PreviewFrameLayout) mRootView.findViewById(R.id.frame); 247ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu mPreviewFrameLayout.setOnLayoutChangeListener(mActivity); 248ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu mReviewImage = (ImageView) mRootView.findViewById(R.id.review_image); 249ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu mShutterButton = mActivity.getShutterButton(); 250ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu mShutterButton.setImageResource(R.drawable.btn_new_shutter_video); 251ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu mShutterButton.setOnShutterButtonListener(mController); 252ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu mShutterButton.setVisibility(View.VISIBLE); 253ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu mShutterButton.requestFocus(); 254ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu mShutterButton.enableTouch(true); 255ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu mRecordingTimeView = (TextView) mRootView.findViewById(R.id.recording_time); 256ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu mRecordingTimeRect = (RotateLayout) mRootView.findViewById(R.id.recording_time_rect); 257ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu mTimeLapseLabel = mRootView.findViewById(R.id.time_lapse_label); 258ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu // The R.id.labels can only be found in phone layout. 259ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu // That is, mLabelsLinearLayout should be null in tablet layout. 260ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu mLabelsLinearLayout = (LinearLayout) mRootView.findViewById(R.id.labels); 261ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu } 262ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu 2639ea4147f6220e3a9fb6f9ae3fef46036919641b4Michael Kolb public void updateOnScreenIndicators(Parameters param, ComboPreferences prefs) { 264ae52b3e3f0f356e1b91e883729d0d82cb40d7a42Sascha Haeberling mOnScreenIndicators.updateFlashOnScreenIndicator(param.getFlashMode()); 2659ea4147f6220e3a9fb6f9ae3fef46036919641b4Michael Kolb boolean location = RecordLocationPreference.get( 2669ea4147f6220e3a9fb6f9ae3fef46036919641b4Michael Kolb prefs, mActivity.getContentResolver()); 2679ea4147f6220e3a9fb6f9ae3fef46036919641b4Michael Kolb mOnScreenIndicators.updateLocationIndicator(location); 2689ea4147f6220e3a9fb6f9ae3fef46036919641b4Michael Kolb 269ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu } 270ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu 271ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu public void setAspectRatio(double ratio) { 272ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu mPreviewFrameLayout.setAspectRatio(ratio); 273ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu } 274ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu 275ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu public void showTimeLapseUI(boolean enable) { 276ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu if (mTimeLapseLabel != null) { 277ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu mTimeLapseLabel.setVisibility(enable ? View.VISIBLE : View.GONE); 278ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu } 279ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu } 280ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu 281f79ef61a719d8edc9e76ddc00a6f667db2c363e4Michael Kolb private void openMenu() { 282f79ef61a719d8edc9e76ddc00a6f667db2c363e4Michael Kolb if (mPieRenderer != null) { 283f79ef61a719d8edc9e76ddc00a6f667db2c363e4Michael Kolb mPieRenderer.showInCenter(); 284f79ef61a719d8edc9e76ddc00a6f667db2c363e4Michael Kolb } 285f79ef61a719d8edc9e76ddc00a6f667db2c363e4Michael Kolb } 286f79ef61a719d8edc9e76ddc00a6f667db2c363e4Michael Kolb 287ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu public void showPopup(AbstractSettingPopup popup) { 288ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu mActivity.hideUI(); 289ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu mBlocker.setVisibility(View.INVISIBLE); 290ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu setShowMenu(false); 291ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu mPopup = popup; 292ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu mPopup.setVisibility(View.VISIBLE); 293ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu FrameLayout.LayoutParams lp = new FrameLayout.LayoutParams(LayoutParams.WRAP_CONTENT, 294ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu LayoutParams.WRAP_CONTENT); 295ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu lp.gravity = Gravity.CENTER; 296ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu ((FrameLayout) mRootView).addView(mPopup, lp); 297f9adf16cc73ad803dee8e973e9e9205f583e1481Doris Liu mGestures.addTouchReceiver(mPopup); 298ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu } 299ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu 300ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu public void dismissPopup(boolean topLevelOnly) { 301ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu dismissPopup(topLevelOnly, true); 302ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu } 303ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu 304ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu public void dismissPopup(boolean topLevelPopupOnly, boolean fullScreen) { 305563e1555cdda8665e25c3afb0c68405df54d1afaDoris Liu // In review mode, we do not want to bring up the camera UI 306563e1555cdda8665e25c3afb0c68405df54d1afaDoris Liu if (mController.isInReviewMode()) return; 307563e1555cdda8665e25c3afb0c68405df54d1afaDoris Liu 308ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu if (fullScreen) { 309ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu mActivity.showUI(); 310ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu mBlocker.setVisibility(View.VISIBLE); 311ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu } 312ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu setShowMenu(fullScreen); 313ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu if (mPopup != null) { 314f9adf16cc73ad803dee8e973e9e9205f583e1481Doris Liu mGestures.removeTouchReceiver(mPopup); 315ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu ((FrameLayout) mRootView).removeView(mPopup); 316ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu mPopup = null; 317ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu } 318ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu mVideoMenu.popupDismissed(topLevelPopupOnly); 319ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu } 320ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu 321ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu public void onShowSwitcherPopup() { 322ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu hidePieRenderer(); 323ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu } 324ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu 325ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu public boolean hidePieRenderer() { 326ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu if (mPieRenderer != null && mPieRenderer.showsItems()) { 327ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu mPieRenderer.hide(); 328ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu return true; 329ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu } 330ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu return false; 331ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu } 332ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu 33329002527ec98a38326f602661abda4d8968baeecDoris Liu // disable preview gestures after shutter is pressed 33429002527ec98a38326f602661abda4d8968baeecDoris Liu public void setShutterPressed(boolean pressed) { 33529002527ec98a38326f602661abda4d8968baeecDoris Liu if (mGestures == null) return; 33629002527ec98a38326f602661abda4d8968baeecDoris Liu mGestures.setEnabled(!pressed); 33729002527ec98a38326f602661abda4d8968baeecDoris Liu } 33829002527ec98a38326f602661abda4d8968baeecDoris Liu 339ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu public void enableShutter(boolean enable) { 340ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu if (mShutterButton != null) { 341ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu mShutterButton.setEnabled(enable); 342ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu } 343ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu } 344ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu 345ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu // PieListener 346ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu @Override 347ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu public void onPieOpened(int centerX, int centerY) { 348a1db26536913f1259ad74c5e6e952521c05bf2f0Angus Kong dismissPopup(false, true); 349ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu mActivity.cancelActivityTouchHandling(); 350ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu mActivity.setSwipingEnabled(false); 351ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu } 352ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu 353ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu @Override 354ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu public void onPieClosed() { 355ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu mActivity.setSwipingEnabled(true); 356ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu } 357ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu 358ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu public void showPreviewBorder(boolean enable) { 359ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu mPreviewFrameLayout.showBorder(enable); 360ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu } 361ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu 362ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu // SingleTapListener 363ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu // Preview area is touched. Take a picture. 364ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu @Override 365ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu public void onSingleTapUp(View view, int x, int y) { 366ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu mController.onSingleTapUp(view, x, y); 367ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu } 368ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu 369ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu // SurfaceView callback 370ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu @Override 371ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { 372ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu Log.v(TAG, "Surface changed. width=" + width + ". height=" + height); 373ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu } 374ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu 375ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu @Override 376ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu public void surfaceCreated(SurfaceHolder holder) { 377ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu Log.v(TAG, "Surface created"); 378ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu mSurfaceViewReady = true; 379ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu } 380ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu 381ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu @Override 382ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu public void surfaceDestroyed(SurfaceHolder holder) { 383ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu Log.v(TAG, "Surface destroyed"); 384ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu mSurfaceViewReady = false; 385ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu mController.stopPreview(); 386ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu } 387ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu 388ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu public boolean isSurfaceViewReady() { 389ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu return mSurfaceViewReady; 390ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu } 391ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu 392ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu public void showRecordingUI(boolean recording, boolean zoomSupported) { 393ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu mMenu.setVisibility(recording ? View.GONE : View.VISIBLE); 394ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu mOnScreenIndicators.setVisibility(recording ? View.GONE : View.VISIBLE); 395ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu if (recording) { 396ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu mShutterButton.setImageResource(R.drawable.btn_shutter_video_recording); 397ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu mActivity.hideSwitcher(); 398ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu mRecordingTimeView.setText(""); 399ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu mRecordingTimeView.setVisibility(View.VISIBLE); 400ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu // The camera is not allowed to be accessed in older api levels during 401ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu // recording. It is therefore necessary to hide the zoom UI on older 402ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu // platforms. 403ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu // See the documentation of android.media.MediaRecorder.start() for 404ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu // further explanation. 405ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu if (!ApiHelper.HAS_ZOOM_WHEN_RECORDING && zoomSupported) { 406ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu // TODO: disable zoom UI here. 407ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu } 408ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu } else { 409ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu mShutterButton.setImageResource(R.drawable.btn_new_shutter_video); 410ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu mActivity.showSwitcher(); 411ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu mRecordingTimeView.setVisibility(View.GONE); 412ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu if (!ApiHelper.HAS_ZOOM_WHEN_RECORDING && zoomSupported) { 413ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu // TODO: enable zoom UI here. 414ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu } 415ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu } 416ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu } 417ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu 418ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu public void showReviewImage(Bitmap bitmap) { 419ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu mReviewImage.setImageBitmap(bitmap); 420ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu mReviewImage.setVisibility(View.VISIBLE); 421ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu } 422ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu 423ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu public void showReviewControls() { 424ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu Util.fadeOut(mShutterButton); 425ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu Util.fadeIn(mReviewDoneButton); 426ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu Util.fadeIn(mReviewPlayButton); 427ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu mReviewImage.setVisibility(View.VISIBLE); 428ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu mMenu.setVisibility(View.GONE); 429ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu mOnScreenIndicators.setVisibility(View.GONE); 430ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu } 431ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu 432ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu public void hideReviewUI() { 433ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu mReviewImage.setVisibility(View.GONE); 434ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu mShutterButton.setEnabled(true); 435ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu mMenu.setVisibility(View.VISIBLE); 436ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu mOnScreenIndicators.setVisibility(View.VISIBLE); 437ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu Util.fadeOut(mReviewDoneButton); 438ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu Util.fadeOut(mReviewPlayButton); 439ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu Util.fadeIn(mShutterButton); 440ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu } 441ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu 442ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu private void setShowMenu(boolean show) { 443ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu if (mOnScreenIndicators != null) { 444ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu mOnScreenIndicators.setVisibility(show ? View.VISIBLE : View.GONE); 445ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu } 446ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu if (mMenu != null) { 447ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu mMenu.setVisibility(show ? View.VISIBLE : View.GONE); 448ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu } 449ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu } 450ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu 451ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu public void onFullScreenChanged(boolean full) { 452ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu if (mGestures != null) { 453ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu mGestures.setEnabled(full); 454ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu } 455ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu if (mPopup != null) { 456ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu dismissPopup(false, full); 457ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu } 458ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu if (mRenderOverlay != null) { 459ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu // this can not happen in capture mode 460ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu mRenderOverlay.setVisibility(full ? View.VISIBLE : View.GONE); 461ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu } 462ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu setShowMenu(full); 463ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu if (mBlocker != null) { 464ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu // this can not happen in capture mode 465ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu mBlocker.setVisibility(full ? View.VISIBLE : View.GONE); 466ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu } 467ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu } 468ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu 469ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu public void initializePopup(PreferenceGroup pref) { 470ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu mVideoMenu.initialize(pref); 471ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu } 472ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu 473ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu public void initializeZoom(Parameters param) { 474ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu if (param == null || !param.isZoomSupported()) return; 475ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu mZoomMax = param.getMaxZoom(); 476ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu mZoomRatios = param.getZoomRatios(); 477ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu // Currently we use immediate zoom for fast zooming to get better UX and 478ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu // there is no plan to take advantage of the smooth zoom. 479ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu mZoomRenderer.setZoomMax(mZoomMax); 480ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu mZoomRenderer.setZoom(param.getZoom()); 481ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu mZoomRenderer.setZoomValue(mZoomRatios.get(param.getZoom())); 482ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu mZoomRenderer.setOnZoomChangeListener(new ZoomChangeListener()); 483ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu } 484ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu 485ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu public void clickShutter() { 486ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu mShutterButton.performClick(); 487ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu } 488ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu 489ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu public void pressShutter(boolean pressed) { 490ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu mShutterButton.setPressed(pressed); 491ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu } 492ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu 493ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu public boolean dispatchTouchEvent(MotionEvent m) { 494f9adf16cc73ad803dee8e973e9e9205f583e1481Doris Liu if (mGestures != null && mRenderOverlay != null) { 495ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu return mGestures.dispatchTouch(m); 496ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu } 497ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu return false; 498ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu } 499ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu 500ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu public void setRecordingTime(String text) { 501ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu mRecordingTimeView.setText(text); 502ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu } 503ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu 504ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu public void setRecordingTimeTextColor(int color) { 505ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu mRecordingTimeView.setTextColor(color); 506ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu } 507ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu 508ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu private class ZoomChangeListener implements ZoomRenderer.OnZoomChangedListener { 509ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu @Override 510ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu public void onZoomValueChanged(int index) { 511ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu int newZoom = mController.onZoomChanged(index); 512ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu if (mZoomRenderer != null) { 513ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu mZoomRenderer.setZoomValue(mZoomRatios.get(newZoom)); 514ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu } 515ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu } 516ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu 517ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu @Override 518ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu public void onZoomStart() { 519ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu } 520ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu 521ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu @Override 522ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu public void onZoomEnd() { 523ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu } 524ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu } 525f79ef61a719d8edc9e76ddc00a6f667db2c363e4Michael Kolb 526f79ef61a719d8edc9e76ddc00a6f667db2c363e4Michael Kolb @Override 527f79ef61a719d8edc9e76ddc00a6f667db2c363e4Michael Kolb public void onSwipe(int direction) { 528f79ef61a719d8edc9e76ddc00a6f667db2c363e4Michael Kolb if (direction == PreviewGestures.DIR_UP) { 529f79ef61a719d8edc9e76ddc00a6f667db2c363e4Michael Kolb openMenu(); 530f79ef61a719d8edc9e76ddc00a6f667db2c363e4Michael Kolb } 531f79ef61a719d8edc9e76ddc00a6f667db2c363e4Michael Kolb } 532f79ef61a719d8edc9e76ddc00a6f667db2c363e4Michael Kolb 53380a3d636fa38bb78dbc9f224b4944a21a6e3271dSascha Haeberling /** 53480a3d636fa38bb78dbc9f224b4944a21a6e3271dSascha Haeberling * Enable or disable the preview thumbnail for click events. 53580a3d636fa38bb78dbc9f224b4944a21a6e3271dSascha Haeberling */ 53680a3d636fa38bb78dbc9f224b4944a21a6e3271dSascha Haeberling public void enablePreviewThumb(boolean enabled) { 53780a3d636fa38bb78dbc9f224b4944a21a6e3271dSascha Haeberling if (enabled) { 53880a3d636fa38bb78dbc9f224b4944a21a6e3271dSascha Haeberling mGestures.addTouchReceiver(mPreviewThumb); 53980a3d636fa38bb78dbc9f224b4944a21a6e3271dSascha Haeberling mPreviewThumb.setVisibility(View.VISIBLE); 54080a3d636fa38bb78dbc9f224b4944a21a6e3271dSascha Haeberling } else { 54180a3d636fa38bb78dbc9f224b4944a21a6e3271dSascha Haeberling mGestures.removeTouchReceiver(mPreviewThumb); 54280a3d636fa38bb78dbc9f224b4944a21a6e3271dSascha Haeberling mPreviewThumb.setVisibility(View.GONE); 54380a3d636fa38bb78dbc9f224b4944a21a6e3271dSascha Haeberling } 54480a3d636fa38bb78dbc9f224b4944a21a6e3271dSascha Haeberling } 545ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu} 546