VideoUI.java revision 69ef5ea6ed838cf6fba834811f01122d349a61cf
16827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu/* 26827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu * Copyright (C) 2013 The Android Open Source Project 36827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu * 46827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu * Licensed under the Apache License, Version 2.0 (the "License"); 56827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu * you may not use this file except in compliance with the License. 66827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu * You may obtain a copy of the License at 76827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu * 86827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu * http://www.apache.org/licenses/LICENSE-2.0 96827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu * 106827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu * Unless required by applicable law or agreed to in writing, software 116827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu * distributed under the License is distributed on an "AS IS" BASIS, 126827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 136827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu * See the License for the specific language governing permissions and 146827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu * limitations under the License. 156827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu */ 166827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu 176827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liupackage com.android.camera; 186827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu 196827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liuimport android.graphics.Bitmap; 206827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liuimport android.hardware.Camera.Parameters; 216827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liuimport android.util.Log; 226827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liuimport android.view.Gravity; 236827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liuimport android.view.MotionEvent; 246827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liuimport android.view.SurfaceHolder; 256827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liuimport android.view.View; 266827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liuimport android.view.View.OnClickListener; 276827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liuimport android.view.ViewGroup; 286827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liuimport android.widget.FrameLayout; 296827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liuimport android.widget.FrameLayout.LayoutParams; 306827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liuimport android.widget.ImageView; 316827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liuimport android.widget.LinearLayout; 326827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liuimport android.widget.TextView; 336827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu 346827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liuimport com.android.camera.CameraPreference.OnPreferenceChangedListener; 356827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liuimport com.android.camera.ui.AbstractSettingPopup; 366827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liuimport com.android.camera.ui.PieRenderer; 376827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liuimport com.android.camera.ui.PreviewSurfaceView; 386827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liuimport com.android.camera.ui.RenderOverlay; 396827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liuimport com.android.camera.ui.RotateLayout; 406827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liuimport com.android.camera.ui.ZoomRenderer; 416827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liuimport com.android.gallery3d.R; 426827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liuimport com.android.gallery3d.common.ApiHelper; 436827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu 446827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liuimport java.util.List; 456827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu 466827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liupublic class VideoUI implements SurfaceHolder.Callback, PieRenderer.PieListener, 473bc96b2d1106fc5ebec6fda6aad3bca4d62e81c0Michael Kolb PreviewGestures.SingleTapListener, 483bc96b2d1106fc5ebec6fda6aad3bca4d62e81c0Michael Kolb PreviewGestures.SwipeListener { 496827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu private final static String TAG = "CAM_VideoUI"; 506827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu // module fields 516827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu private CameraActivity mActivity; 526827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu private View mRootView; 536827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu private PreviewFrameLayout mPreviewFrameLayout; 546827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu private boolean mSurfaceViewReady; 556827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu private PreviewSurfaceView mPreviewSurfaceView; 566827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu // An review image having same size as preview. It is displayed when 576827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu // recording is stopped in capture intent. 586827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu private ImageView mReviewImage; 596827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu private View mReviewCancelButton; 606827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu private View mReviewDoneButton; 616827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu private View mReviewPlayButton; 626827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu private ShutterButton mShutterButton; 636827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu private TextView mRecordingTimeView; 646827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu private LinearLayout mLabelsLinearLayout; 656827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu private View mTimeLapseLabel; 666827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu private RenderOverlay mRenderOverlay; 676827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu private PieRenderer mPieRenderer; 686827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu private VideoMenu mVideoMenu; 696827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu private AbstractSettingPopup mPopup; 706827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu private ZoomRenderer mZoomRenderer; 716827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu private PreviewGestures mGestures; 726827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu private View mMenu; 736827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu private View mBlocker; 74140c263ebb2504fe1a0212a835f0098ce7973a22Sascha Haeberling private OnScreenIndicators mOnScreenIndicators; 756827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu private RotateLayout mRecordingTimeRect; 766827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu private VideoController mController; 776827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu private int mZoomMax; 786827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu private List<Integer> mZoomRatios; 796827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu 806827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu public VideoUI(CameraActivity activity, VideoController controller, View parent) { 816827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mActivity = activity; 826827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mController = controller; 836827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mRootView = parent; 846827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mActivity.getLayoutInflater().inflate(R.layout.video_module, (ViewGroup) mRootView, true); 856827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mPreviewSurfaceView = (PreviewSurfaceView) mRootView 866827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu .findViewById(R.id.preview_surface_view); 876827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu initializeMiscControls(); 886827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu initializeControlByIntent(); 896827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu initializeOverlay(); 906827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu } 916827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu 926827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu private void initializeControlByIntent() { 936827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mBlocker = mActivity.findViewById(R.id.blocker); 946827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mMenu = mActivity.findViewById(R.id.menu); 956827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mMenu.setOnClickListener(new OnClickListener() { 966827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu @Override 976827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu public void onClick(View v) { 986827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu if (mPieRenderer != null) { 996827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mPieRenderer.showInCenter(); 1006827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu } 1016827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu } 1026827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu }); 103eb8adc1754fc668435ee57d1be2235b80fc8c009Michael Kolb mOnScreenIndicators = new OnScreenIndicators(mActivity, 104140c263ebb2504fe1a0212a835f0098ce7973a22Sascha Haeberling mActivity.findViewById(R.id.on_screen_indicators)); 105140c263ebb2504fe1a0212a835f0098ce7973a22Sascha Haeberling mOnScreenIndicators.resetToDefault(); 1066827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu if (mController.isVideoCaptureIntent()) { 1076827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mActivity.hideSwitcher(); 1086827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu ViewGroup cameraControls = (ViewGroup) mActivity.findViewById(R.id.camera_controls); 1096827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mActivity.getLayoutInflater().inflate(R.layout.review_module_control, cameraControls); 1106827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu // Cannot use RotateImageView for "done" and "cancel" button because 1116827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu // the tablet layout uses RotateLayout, which cannot be cast to 1126827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu // RotateImageView. 1136827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mReviewDoneButton = mActivity.findViewById(R.id.btn_done); 1146827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mReviewCancelButton = mActivity.findViewById(R.id.btn_cancel); 1156827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mReviewPlayButton = mActivity.findViewById(R.id.btn_play); 1166827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mReviewCancelButton.setVisibility(View.VISIBLE); 1176827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mReviewDoneButton.setOnClickListener(new OnClickListener() { 1186827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu @Override 1196827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu public void onClick(View v) { 1206827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mController.onReviewDoneClicked(v); 1216827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu } 1226827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu }); 1236827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mReviewCancelButton.setOnClickListener(new OnClickListener() { 1246827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu @Override 1256827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu public void onClick(View v) { 1266827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mController.onReviewCancelClicked(v); 1276827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu } 1286827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu }); 1296827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mReviewPlayButton.setOnClickListener(new OnClickListener() { 1306827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu @Override 1316827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu public void onClick(View v) { 1326827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mController.onReviewPlayClicked(v); 1336827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu } 1346827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu }); 1356827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu } 1366827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu } 1376827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu 1386827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu public boolean collapseCameraControls() { 1396827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu boolean ret = false; 1406827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu if (mPopup != null) { 1416827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu dismissPopup(false); 1426827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu ret = true; 1436827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu } 1446827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu return ret; 1456827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu } 1466827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu 1476827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu public boolean removeTopLevelPopup() { 1486827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu if (mPopup != null) { 1496827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu dismissPopup(true); 1506827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu return true; 1516827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu } 1526827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu return false; 1536827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu } 1546827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu 1556827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu public void enableCameraControls(boolean enable) { 1566827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu if (mGestures != null) { 1576827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mGestures.setZoomOnly(!enable); 1586827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu } 1596827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu if (mPieRenderer != null && mPieRenderer.showsItems()) { 1606827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mPieRenderer.hide(); 1616827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu } 1626827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu } 1636827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu 1646827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu public void overrideSettings(final String... keyvalues) { 1656827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mVideoMenu.overrideSettings(keyvalues); 1666827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu } 1676827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu 1686827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu public View getPreview() { 1696827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu return mPreviewFrameLayout; 1706827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu } 1716827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu 1726827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu public void setOrientationIndicator(int orientation, boolean animation) { 1736827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu if (mGestures != null) { 1746827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mGestures.setOrientation(orientation); 1756827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu } 1766827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu // We change the orientation of the linearlayout only for phone UI 1776827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu // because when in portrait the width is not enough. 1786827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu if (mLabelsLinearLayout != null) { 1796827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu if (((orientation / 90) & 1) == 0) { 1806827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mLabelsLinearLayout.setOrientation(LinearLayout.VERTICAL); 1816827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu } else { 1826827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mLabelsLinearLayout.setOrientation(LinearLayout.HORIZONTAL); 1836827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu } 1846827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu } 1856827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mRecordingTimeRect.setOrientation(0, animation); 1866827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu } 1876827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu 1886827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu public SurfaceHolder getSurfaceHolder() { 1896827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu return mPreviewSurfaceView.getHolder(); 1906827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu } 1916827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu 1926827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu public void hideSurfaceView() { 1936827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mPreviewSurfaceView.setVisibility(View.GONE); 1946827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu } 1956827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu 1966827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu public void showSurfaceView() { 1976827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mPreviewSurfaceView.setVisibility(View.VISIBLE); 1986827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu } 1996827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu 2006827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu private void initializeOverlay() { 2016827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mRenderOverlay = (RenderOverlay) mRootView.findViewById(R.id.render_overlay); 2026827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu if (mPieRenderer == null) { 2036827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mPieRenderer = new PieRenderer(mActivity); 2046827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mVideoMenu = new VideoMenu(mActivity, this, mPieRenderer); 2056827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mPieRenderer.setPieListener(this); 2066827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu } 2076827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mRenderOverlay.addRenderer(mPieRenderer); 2086827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu if (mZoomRenderer == null) { 2096827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mZoomRenderer = new ZoomRenderer(mActivity); 2106827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu } 2116827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mRenderOverlay.addRenderer(mZoomRenderer); 2126827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu if (mGestures == null) { 2133bc96b2d1106fc5ebec6fda6aad3bca4d62e81c0Michael Kolb mGestures = new PreviewGestures(mActivity, this, mZoomRenderer, mPieRenderer, this); 2146827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu } 2156827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mGestures.setRenderOverlay(mRenderOverlay); 2169cdfe00cf57f05f81e6d02ca050e6afd8cc4a25fDoris Liu mGestures.reset(); 2176827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mGestures.addTouchReceiver(mMenu); 2189cdfe00cf57f05f81e6d02ca050e6afd8cc4a25fDoris Liu mGestures.addUnclickableArea(mBlocker); 2196827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu if (mController.isVideoCaptureIntent()) { 2206827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu if (mReviewCancelButton != null) { 2216827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mGestures.addTouchReceiver(mReviewCancelButton); 2226827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu } 2236827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu if (mReviewDoneButton != null) { 2246827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mGestures.addTouchReceiver(mReviewDoneButton); 2256827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu } 2266827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu if (mReviewPlayButton != null) { 2276827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mGestures.addTouchReceiver(mReviewPlayButton); 2286827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu } 2296827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu } 2306827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu } 2316827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu 2326827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu public void setPrefChangedListener(OnPreferenceChangedListener listener) { 2336827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mVideoMenu.setListener(listener); 2346827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu } 2356827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu 2366827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu private void initializeMiscControls() { 2376827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mPreviewFrameLayout = (PreviewFrameLayout) mRootView.findViewById(R.id.frame); 2386827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mPreviewFrameLayout.setOnLayoutChangeListener(mActivity); 2396827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mReviewImage = (ImageView) mRootView.findViewById(R.id.review_image); 2406827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mShutterButton = mActivity.getShutterButton(); 2416827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mShutterButton.setImageResource(R.drawable.btn_new_shutter_video); 2426827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mShutterButton.setOnShutterButtonListener(mController); 2436827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mShutterButton.setVisibility(View.VISIBLE); 2446827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mShutterButton.requestFocus(); 2456827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mShutterButton.enableTouch(true); 2466827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mRecordingTimeView = (TextView) mRootView.findViewById(R.id.recording_time); 2476827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mRecordingTimeRect = (RotateLayout) mRootView.findViewById(R.id.recording_time_rect); 2486827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mTimeLapseLabel = mRootView.findViewById(R.id.time_lapse_label); 2496827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu // The R.id.labels can only be found in phone layout. 2506827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu // That is, mLabelsLinearLayout should be null in tablet layout. 2516827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mLabelsLinearLayout = (LinearLayout) mRootView.findViewById(R.id.labels); 2526827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu } 2536827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu 2548788079a51a90255dce330e56afcb6674deccbf7Michael Kolb public void updateOnScreenIndicators(Parameters param, ComboPreferences prefs) { 255140c263ebb2504fe1a0212a835f0098ce7973a22Sascha Haeberling mOnScreenIndicators.updateFlashOnScreenIndicator(param.getFlashMode()); 2568788079a51a90255dce330e56afcb6674deccbf7Michael Kolb boolean location = RecordLocationPreference.get( 2578788079a51a90255dce330e56afcb6674deccbf7Michael Kolb prefs, mActivity.getContentResolver()); 2588788079a51a90255dce330e56afcb6674deccbf7Michael Kolb mOnScreenIndicators.updateLocationIndicator(location); 2598788079a51a90255dce330e56afcb6674deccbf7Michael Kolb 2606827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu } 2616827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu 2626827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu public void setAspectRatio(double ratio) { 2636827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mPreviewFrameLayout.setAspectRatio(ratio); 2646827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu } 2656827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu 2666827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu public void showTimeLapseUI(boolean enable) { 2676827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu if (mTimeLapseLabel != null) { 2686827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mTimeLapseLabel.setVisibility(enable ? View.VISIBLE : View.GONE); 2696827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu } 2706827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu } 2716827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu 2723bc96b2d1106fc5ebec6fda6aad3bca4d62e81c0Michael Kolb private void openMenu() { 2733bc96b2d1106fc5ebec6fda6aad3bca4d62e81c0Michael Kolb if (mPieRenderer != null) { 2743bc96b2d1106fc5ebec6fda6aad3bca4d62e81c0Michael Kolb mPieRenderer.showInCenter(); 2753bc96b2d1106fc5ebec6fda6aad3bca4d62e81c0Michael Kolb } 2763bc96b2d1106fc5ebec6fda6aad3bca4d62e81c0Michael Kolb } 2773bc96b2d1106fc5ebec6fda6aad3bca4d62e81c0Michael Kolb 2786827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu public void showPopup(AbstractSettingPopup popup) { 2796827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mActivity.hideUI(); 2806827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mBlocker.setVisibility(View.INVISIBLE); 2816827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu setShowMenu(false); 2826827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mPopup = popup; 2836827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mPopup.setVisibility(View.VISIBLE); 2846827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu FrameLayout.LayoutParams lp = new FrameLayout.LayoutParams(LayoutParams.WRAP_CONTENT, 2856827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu LayoutParams.WRAP_CONTENT); 2866827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu lp.gravity = Gravity.CENTER; 2876827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu ((FrameLayout) mRootView).addView(mPopup, lp); 288fd2e619a2fb263315816b3579a9c6751c398132dDoris Liu mGestures.addTouchReceiver(mPopup); 2896827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu } 2906827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu 2916827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu public void dismissPopup(boolean topLevelOnly) { 2926827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu dismissPopup(topLevelOnly, true); 2936827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu } 2946827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu 2956827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu public void dismissPopup(boolean topLevelPopupOnly, boolean fullScreen) { 29669ef5ea6ed838cf6fba834811f01122d349a61cfDoris Liu // In review mode, we do not want to bring up the camera UI 29769ef5ea6ed838cf6fba834811f01122d349a61cfDoris Liu if (mController.isInReviewMode()) return; 29869ef5ea6ed838cf6fba834811f01122d349a61cfDoris Liu 2996827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu if (fullScreen) { 3006827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mActivity.showUI(); 3016827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mBlocker.setVisibility(View.VISIBLE); 3026827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu } 3036827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu setShowMenu(fullScreen); 3046827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu if (mPopup != null) { 305fd2e619a2fb263315816b3579a9c6751c398132dDoris Liu mGestures.removeTouchReceiver(mPopup); 3066827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu ((FrameLayout) mRootView).removeView(mPopup); 3076827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mPopup = null; 3086827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu } 3096827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mVideoMenu.popupDismissed(topLevelPopupOnly); 3106827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu } 3116827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu 3126827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu public void onShowSwitcherPopup() { 3136827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu hidePieRenderer(); 3146827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu } 3156827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu 3166827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu public boolean hidePieRenderer() { 3176827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu if (mPieRenderer != null && mPieRenderer.showsItems()) { 3186827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mPieRenderer.hide(); 3196827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu return true; 3206827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu } 3216827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu return false; 3226827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu } 3236827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu 32461f2b082014fe4402dd208029e9378dd5cb1fd1dDoris Liu // disable preview gestures after shutter is pressed 32561f2b082014fe4402dd208029e9378dd5cb1fd1dDoris Liu public void setShutterPressed(boolean pressed) { 32661f2b082014fe4402dd208029e9378dd5cb1fd1dDoris Liu if (mGestures == null) return; 32761f2b082014fe4402dd208029e9378dd5cb1fd1dDoris Liu mGestures.setEnabled(!pressed); 32861f2b082014fe4402dd208029e9378dd5cb1fd1dDoris Liu } 32961f2b082014fe4402dd208029e9378dd5cb1fd1dDoris Liu 3306827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu public void enableShutter(boolean enable) { 3316827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu if (mShutterButton != null) { 3326827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mShutterButton.setEnabled(enable); 3336827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu } 3346827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu } 3356827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu 3366827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu // PieListener 3376827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu @Override 3386827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu public void onPieOpened(int centerX, int centerY) { 3396827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mActivity.cancelActivityTouchHandling(); 3406827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mActivity.setSwipingEnabled(false); 3416827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu } 3426827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu 3436827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu @Override 3446827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu public void onPieClosed() { 3456827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mActivity.setSwipingEnabled(true); 3466827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu } 3476827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu 3486827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu public void showPreviewBorder(boolean enable) { 3496827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mPreviewFrameLayout.showBorder(enable); 3506827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu } 3516827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu 3526827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu // SingleTapListener 3536827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu // Preview area is touched. Take a picture. 3546827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu @Override 3556827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu public void onSingleTapUp(View view, int x, int y) { 3566827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mController.onSingleTapUp(view, x, y); 3576827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu } 3586827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu 3596827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu // SurfaceView callback 3606827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu @Override 3616827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { 3626827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu Log.v(TAG, "Surface changed. width=" + width + ". height=" + height); 3636827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu } 3646827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu 3656827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu @Override 3666827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu public void surfaceCreated(SurfaceHolder holder) { 3676827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu Log.v(TAG, "Surface created"); 3686827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mSurfaceViewReady = true; 3696827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu } 3706827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu 3716827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu @Override 3726827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu public void surfaceDestroyed(SurfaceHolder holder) { 3736827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu Log.v(TAG, "Surface destroyed"); 3746827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mSurfaceViewReady = false; 3756827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mController.stopPreview(); 3766827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu } 3776827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu 3786827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu public boolean isSurfaceViewReady() { 3796827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu return mSurfaceViewReady; 3806827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu } 3816827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu 3826827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu public void showRecordingUI(boolean recording, boolean zoomSupported) { 3836827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mMenu.setVisibility(recording ? View.GONE : View.VISIBLE); 3846827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mOnScreenIndicators.setVisibility(recording ? View.GONE : View.VISIBLE); 3856827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu if (recording) { 3866827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mShutterButton.setImageResource(R.drawable.btn_shutter_video_recording); 3876827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mActivity.hideSwitcher(); 3886827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mRecordingTimeView.setText(""); 3896827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mRecordingTimeView.setVisibility(View.VISIBLE); 3906827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu // The camera is not allowed to be accessed in older api levels during 3916827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu // recording. It is therefore necessary to hide the zoom UI on older 3926827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu // platforms. 3936827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu // See the documentation of android.media.MediaRecorder.start() for 3946827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu // further explanation. 3956827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu if (!ApiHelper.HAS_ZOOM_WHEN_RECORDING && zoomSupported) { 3966827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu // TODO: disable zoom UI here. 3976827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu } 3986827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu } else { 3996827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mShutterButton.setImageResource(R.drawable.btn_new_shutter_video); 4006827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mActivity.showSwitcher(); 4016827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mRecordingTimeView.setVisibility(View.GONE); 4026827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu if (!ApiHelper.HAS_ZOOM_WHEN_RECORDING && zoomSupported) { 4036827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu // TODO: enable zoom UI here. 4046827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu } 4056827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu } 4066827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu } 4076827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu 4086827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu public void showReviewImage(Bitmap bitmap) { 4096827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mReviewImage.setImageBitmap(bitmap); 4106827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mReviewImage.setVisibility(View.VISIBLE); 4116827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu } 4126827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu 4136827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu public void showReviewControls() { 4146827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu Util.fadeOut(mShutterButton); 4156827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu Util.fadeIn(mReviewDoneButton); 4166827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu Util.fadeIn(mReviewPlayButton); 4176827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mReviewImage.setVisibility(View.VISIBLE); 4186827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mMenu.setVisibility(View.GONE); 4196827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mOnScreenIndicators.setVisibility(View.GONE); 4206827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu } 4216827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu 4226827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu public void hideReviewUI() { 4236827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mReviewImage.setVisibility(View.GONE); 4246827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mShutterButton.setEnabled(true); 4256827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mMenu.setVisibility(View.VISIBLE); 4266827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mOnScreenIndicators.setVisibility(View.VISIBLE); 4276827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu Util.fadeOut(mReviewDoneButton); 4286827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu Util.fadeOut(mReviewPlayButton); 4296827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu Util.fadeIn(mShutterButton); 4306827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu } 4316827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu 4326827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu private void setShowMenu(boolean show) { 4336827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu if (mOnScreenIndicators != null) { 4346827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mOnScreenIndicators.setVisibility(show ? View.VISIBLE : View.GONE); 4356827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu } 4366827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu if (mMenu != null) { 4376827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mMenu.setVisibility(show ? View.VISIBLE : View.GONE); 4386827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu } 4396827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu } 4406827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu 4416827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu public void onFullScreenChanged(boolean full) { 4426827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu if (mGestures != null) { 4436827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mGestures.setEnabled(full); 4446827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu } 4456827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu if (mPopup != null) { 4466827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu dismissPopup(false, full); 4476827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu } 4486827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu if (mRenderOverlay != null) { 4496827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu // this can not happen in capture mode 4506827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mRenderOverlay.setVisibility(full ? View.VISIBLE : View.GONE); 4516827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu } 4526827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu setShowMenu(full); 4536827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu if (mBlocker != null) { 4546827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu // this can not happen in capture mode 4556827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mBlocker.setVisibility(full ? View.VISIBLE : View.GONE); 4566827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu } 4576827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu } 4586827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu 4596827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu public void initializePopup(PreferenceGroup pref) { 4606827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mVideoMenu.initialize(pref); 4616827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu } 4626827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu 4636827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu public void initializeZoom(Parameters param) { 4646827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu if (param == null || !param.isZoomSupported()) return; 4656827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mZoomMax = param.getMaxZoom(); 4666827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mZoomRatios = param.getZoomRatios(); 4676827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu // Currently we use immediate zoom for fast zooming to get better UX and 4686827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu // there is no plan to take advantage of the smooth zoom. 4696827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mZoomRenderer.setZoomMax(mZoomMax); 4706827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mZoomRenderer.setZoom(param.getZoom()); 4716827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mZoomRenderer.setZoomValue(mZoomRatios.get(param.getZoom())); 4726827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mZoomRenderer.setOnZoomChangeListener(new ZoomChangeListener()); 4736827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu } 4746827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu 4756827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu public void clickShutter() { 4766827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mShutterButton.performClick(); 4776827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu } 4786827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu 4796827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu public void pressShutter(boolean pressed) { 4806827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mShutterButton.setPressed(pressed); 4816827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu } 4826827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu 4836827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu public boolean dispatchTouchEvent(MotionEvent m) { 484fd2e619a2fb263315816b3579a9c6751c398132dDoris Liu if (mGestures != null && mRenderOverlay != null) { 4856827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu return mGestures.dispatchTouch(m); 4866827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu } 4876827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu return false; 4886827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu } 4896827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu 4906827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu public void setRecordingTime(String text) { 4916827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mRecordingTimeView.setText(text); 4926827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu } 4936827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu 4946827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu public void setRecordingTimeTextColor(int color) { 4956827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mRecordingTimeView.setTextColor(color); 4966827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu } 4976827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu 4986827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu private class ZoomChangeListener implements ZoomRenderer.OnZoomChangedListener { 4996827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu @Override 5006827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu public void onZoomValueChanged(int index) { 5016827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu int newZoom = mController.onZoomChanged(index); 5026827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu if (mZoomRenderer != null) { 5036827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mZoomRenderer.setZoomValue(mZoomRatios.get(newZoom)); 5046827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu } 5056827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu } 5066827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu 5076827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu @Override 5086827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu public void onZoomStart() { 5096827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu } 5106827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu 5116827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu @Override 5126827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu public void onZoomEnd() { 5136827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu } 5146827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu } 5153bc96b2d1106fc5ebec6fda6aad3bca4d62e81c0Michael Kolb 5163bc96b2d1106fc5ebec6fda6aad3bca4d62e81c0Michael Kolb @Override 5173bc96b2d1106fc5ebec6fda6aad3bca4d62e81c0Michael Kolb public void onSwipe(int direction) { 5183bc96b2d1106fc5ebec6fda6aad3bca4d62e81c0Michael Kolb if (direction == PreviewGestures.DIR_UP) { 5193bc96b2d1106fc5ebec6fda6aad3bca4d62e81c0Michael Kolb openMenu(); 5203bc96b2d1106fc5ebec6fda6aad3bca4d62e81c0Michael Kolb } 5213bc96b2d1106fc5ebec6fda6aad3bca4d62e81c0Michael Kolb } 5223bc96b2d1106fc5ebec6fda6aad3bca4d62e81c0Michael Kolb 5236827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu} 524