VideoUI.java revision b50b5cbfbc0a67db6fc43373363b10381c9c61a3
16827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu/* 26432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu * Copyright (C) 2012 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 198e963a5a6016d246184ed65906f9d103e92b17e2Sascha Haeberlingimport java.util.List; 208e963a5a6016d246184ed65906f9d103e92b17e2Sascha Haeberling 216827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liuimport android.graphics.Bitmap; 22c3679c0961521165499380c77344acc69072b2acDoris Liuimport android.graphics.Color; 236432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liuimport android.graphics.Matrix; 246432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liuimport android.graphics.SurfaceTexture; 25c3679c0961521165499380c77344acc69072b2acDoris Liuimport android.graphics.drawable.ColorDrawable; 266827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liuimport android.hardware.Camera.Parameters; 276432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liuimport android.os.Handler; 286432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liuimport android.os.Message; 296827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liuimport android.util.Log; 306827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liuimport android.view.Gravity; 316827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liuimport android.view.SurfaceHolder; 326432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liuimport android.view.SurfaceView; 336432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liuimport android.view.TextureView; 346432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liuimport android.view.TextureView.SurfaceTextureListener; 356827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liuimport android.view.View; 366827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liuimport android.view.View.OnClickListener; 376432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liuimport android.view.View.OnLayoutChangeListener; 386827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liuimport android.view.ViewGroup; 396827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liuimport android.widget.FrameLayout; 406827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liuimport android.widget.FrameLayout.LayoutParams; 416827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liuimport android.widget.ImageView; 426827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liuimport android.widget.LinearLayout; 43c3679c0961521165499380c77344acc69072b2acDoris Liuimport android.widget.PopupWindow; 446827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liuimport android.widget.TextView; 456827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu 466827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liuimport com.android.camera.CameraPreference.OnPreferenceChangedListener; 476827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liuimport com.android.camera.ui.AbstractSettingPopup; 486432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liuimport com.android.camera.ui.CameraControls; 496432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liuimport com.android.camera.ui.CameraRootView; 506432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liuimport com.android.camera.ui.CameraSwitcher; 516432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liuimport com.android.camera.ui.CameraSwitcher.CameraSwitchListener; 526827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liuimport com.android.camera.ui.PieRenderer; 536827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liuimport com.android.camera.ui.RenderOverlay; 546827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liuimport com.android.camera.ui.RotateLayout; 556827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liuimport com.android.camera.ui.ZoomRenderer; 56b50b5cbfbc0a67db6fc43373363b10381c9c61a3Angus Kongimport com.android.camera.util.CameraUtil; 578e963a5a6016d246184ed65906f9d103e92b17e2Sascha Haeberlingimport com.android.camera2.R; 58b50b5cbfbc0a67db6fc43373363b10381c9c61a3Angus Kongimport com.android.camera.util.ApiHelper; 596827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu 606432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liupublic class VideoUI implements PieRenderer.PieListener, 613bc96b2d1106fc5ebec6fda6aad3bca4d62e81c0Michael Kolb PreviewGestures.SingleTapListener, 626432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu CameraRootView.MyDisplayListener, 636432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu SurfaceTextureListener, SurfaceHolder.Callback { 64395ee2d6d3c8fa9e16363517dc9e8afc8cbd609eAngus Kong private static final String TAG = "CAM_VideoUI"; 656432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu private static final int UPDATE_TRANSFORM_MATRIX = 1; 666827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu // module fields 676827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu private CameraActivity mActivity; 686827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu private View mRootView; 696432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu private TextureView mTextureView; 706827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu // An review image having same size as preview. It is displayed when 716827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu // recording is stopped in capture intent. 726827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu private ImageView mReviewImage; 736827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu private View mReviewCancelButton; 746827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu private View mReviewDoneButton; 756827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu private View mReviewPlayButton; 766827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu private ShutterButton mShutterButton; 776432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu private CameraSwitcher mSwitcher; 786827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu private TextView mRecordingTimeView; 796827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu private LinearLayout mLabelsLinearLayout; 806827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu private View mTimeLapseLabel; 816827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu private RenderOverlay mRenderOverlay; 826827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu private PieRenderer mPieRenderer; 836827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu private VideoMenu mVideoMenu; 846432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu private CameraControls mCameraControls; 85c3679c0961521165499380c77344acc69072b2acDoris Liu private SettingsPopup mPopup; 866827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu private ZoomRenderer mZoomRenderer; 876827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu private PreviewGestures mGestures; 886432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu private View mMenuButton; 89140c263ebb2504fe1a0212a835f0098ce7973a22Sascha Haeberling private OnScreenIndicators mOnScreenIndicators; 906827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu private RotateLayout mRecordingTimeRect; 916432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu private SurfaceTexture mSurfaceTexture; 926827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu private VideoController mController; 936827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu private int mZoomMax; 946827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu private List<Integer> mZoomRatios; 954f91ab5d099632afd84dd7bd80a804cbbe1f3588Sascha Haeberling private View mPreviewThumb; 9637f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling private View mFlashOverlay; 976827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu 986432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu private SurfaceView mSurfaceView = null; 996432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu private int mPreviewWidth = 0; 1006432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu private int mPreviewHeight = 0; 1016432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu private float mSurfaceTextureUncroppedWidth; 1026432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu private float mSurfaceTextureUncroppedHeight; 1036432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu private float mAspectRatio = 4f / 3f; 1046432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu private Matrix mMatrix = null; 10537f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling private final AnimationManager mAnimationManager; 1066432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu private final Handler mHandler = new Handler() { 1076432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu @Override 1086432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu public void handleMessage(Message msg) { 1096432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu switch (msg.what) { 1106432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu case UPDATE_TRANSFORM_MATRIX: 1116432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu setTransformMatrix(mPreviewWidth, mPreviewHeight); 1126432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu break; 1136432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu default: 1146432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu break; 1156432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu } 1166432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu } 1176432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu }; 1186432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu private OnLayoutChangeListener mLayoutListener = new OnLayoutChangeListener() { 1196432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu @Override 1206432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu public void onLayoutChange(View v, int left, int top, int right, 1216432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) { 1226432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu int width = right - left; 1236432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu int height = bottom - top; 1246432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu // Full-screen screennail 1256432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu int w = width; 1266432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu int h = height; 127b50b5cbfbc0a67db6fc43373363b10381c9c61a3Angus Kong if (CameraUtil.getDisplayRotation(mActivity) % 180 != 0) { 1286432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu w = height; 1296432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu h = width; 1306432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu } 1316432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu if (mPreviewWidth != width || mPreviewHeight != height) { 1326432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu mPreviewWidth = width; 1336432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu mPreviewHeight = height; 1346432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu onScreenSizeChanged(width, height, w, h); 1356432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu } 1366432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu } 1376432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu }; 1386432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu 139c3679c0961521165499380c77344acc69072b2acDoris Liu private class SettingsPopup extends PopupWindow { 140c3679c0961521165499380c77344acc69072b2acDoris Liu public SettingsPopup(View popup) { 141c3679c0961521165499380c77344acc69072b2acDoris Liu super(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); 142c3679c0961521165499380c77344acc69072b2acDoris Liu setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT)); 143c3679c0961521165499380c77344acc69072b2acDoris Liu setOutsideTouchable(true); 144c3679c0961521165499380c77344acc69072b2acDoris Liu setFocusable(true); 145c3679c0961521165499380c77344acc69072b2acDoris Liu popup.setVisibility(View.VISIBLE); 146c3679c0961521165499380c77344acc69072b2acDoris Liu setContentView(popup); 147c3679c0961521165499380c77344acc69072b2acDoris Liu showAtLocation(mRootView, Gravity.CENTER, 0, 0); 148c3679c0961521165499380c77344acc69072b2acDoris Liu } 149c3679c0961521165499380c77344acc69072b2acDoris Liu 150c3679c0961521165499380c77344acc69072b2acDoris Liu public void dismiss(boolean topLevelOnly) { 151c3679c0961521165499380c77344acc69072b2acDoris Liu super.dismiss(); 152c3679c0961521165499380c77344acc69072b2acDoris Liu popupDismissed(); 153c3679c0961521165499380c77344acc69072b2acDoris Liu showUI(); 154c3679c0961521165499380c77344acc69072b2acDoris Liu mVideoMenu.popupDismissed(topLevelOnly); 155c3679c0961521165499380c77344acc69072b2acDoris Liu } 156c3679c0961521165499380c77344acc69072b2acDoris Liu 157c3679c0961521165499380c77344acc69072b2acDoris Liu @Override 158c3679c0961521165499380c77344acc69072b2acDoris Liu public void dismiss() { 159c3679c0961521165499380c77344acc69072b2acDoris Liu // Called by Framework when touch outside the popup or hit back key 160c3679c0961521165499380c77344acc69072b2acDoris Liu dismiss(true); 161c3679c0961521165499380c77344acc69072b2acDoris Liu } 162c3679c0961521165499380c77344acc69072b2acDoris Liu } 163c3679c0961521165499380c77344acc69072b2acDoris Liu 1646827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu public VideoUI(CameraActivity activity, VideoController controller, View parent) { 1656827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mActivity = activity; 1666827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mController = controller; 1676827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mRootView = parent; 1686827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mActivity.getLayoutInflater().inflate(R.layout.video_module, (ViewGroup) mRootView, true); 1696432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu mTextureView = (TextureView) mRootView.findViewById(R.id.preview_content); 1706432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu mTextureView.setSurfaceTextureListener(this); 1716432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu mRootView.addOnLayoutChangeListener(mLayoutListener); 1726432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu ((CameraRootView) mRootView).setDisplayChangeListener(this); 17337f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling mFlashOverlay = mRootView.findViewById(R.id.flash_overlay); 1746432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu mShutterButton = (ShutterButton) mRootView.findViewById(R.id.shutter_button); 1756432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu mSwitcher = (CameraSwitcher) mRootView.findViewById(R.id.camera_switcher); 176147e26ab7075f0acd3978f0cd0541cd1da4b50e1Doris Liu mSwitcher.setCurrentIndex(CameraSwitcher.VIDEO_MODULE_INDEX); 1776432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu mSwitcher.setSwitchListener((CameraSwitchListener) mActivity); 1786827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu initializeMiscControls(); 1796827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu initializeControlByIntent(); 1806827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu initializeOverlay(); 18137f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling mAnimationManager = new AnimationManager(); 1826827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu } 1836827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu 1846432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu 1856432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu public void initializeSurfaceView() { 1866432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu mSurfaceView = new SurfaceView(mActivity); 1876432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu ((ViewGroup) mRootView).addView(mSurfaceView, 0); 1886432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu mSurfaceView.getHolder().addCallback(this); 1896432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu } 1906432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu 1916827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu private void initializeControlByIntent() { 1926432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu mMenuButton = mActivity.findViewById(R.id.menu); 1936432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu mMenuButton.setOnClickListener(new OnClickListener() { 1946827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu @Override 1956827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu public void onClick(View v) { 1966827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu if (mPieRenderer != null) { 1976827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mPieRenderer.showInCenter(); 1986827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu } 1996827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu } 2006827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu }); 2016432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu 2026432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu mCameraControls = (CameraControls) mActivity.findViewById(R.id.camera_controls); 203eb8adc1754fc668435ee57d1be2235b80fc8c009Michael Kolb mOnScreenIndicators = new OnScreenIndicators(mActivity, 204140c263ebb2504fe1a0212a835f0098ce7973a22Sascha Haeberling mActivity.findViewById(R.id.on_screen_indicators)); 205140c263ebb2504fe1a0212a835f0098ce7973a22Sascha Haeberling mOnScreenIndicators.resetToDefault(); 2066827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu if (mController.isVideoCaptureIntent()) { 2076432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu hideSwitcher(); 2086432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu mActivity.getLayoutInflater().inflate(R.layout.review_module_control, 2096432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu (ViewGroup) mCameraControls); 2106827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu // Cannot use RotateImageView for "done" and "cancel" button because 2116827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu // the tablet layout uses RotateLayout, which cannot be cast to 2126827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu // RotateImageView. 2136827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mReviewDoneButton = mActivity.findViewById(R.id.btn_done); 2146827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mReviewCancelButton = mActivity.findViewById(R.id.btn_cancel); 2156827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mReviewPlayButton = mActivity.findViewById(R.id.btn_play); 2166827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mReviewCancelButton.setVisibility(View.VISIBLE); 2176827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mReviewDoneButton.setOnClickListener(new OnClickListener() { 2186827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu @Override 2196827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu public void onClick(View v) { 2206827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mController.onReviewDoneClicked(v); 2216827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu } 2226827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu }); 2236827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mReviewCancelButton.setOnClickListener(new OnClickListener() { 2246827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu @Override 2256827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu public void onClick(View v) { 2266827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mController.onReviewCancelClicked(v); 2276827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu } 2286827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu }); 2296827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mReviewPlayButton.setOnClickListener(new OnClickListener() { 2306827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu @Override 2316827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu public void onClick(View v) { 2326827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mController.onReviewPlayClicked(v); 2336827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu } 2346827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu }); 2356827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu } 2366827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu } 2376827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu 2386432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu public void setPreviewSize(int width, int height) { 2396432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu if (width == 0 || height == 0) { 2406432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu Log.w(TAG, "Preview size should not be 0."); 2416432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu return; 2426432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu } 2436432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu if (width > height) { 2446432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu mAspectRatio = (float) width / height; 2456432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu } else { 2466432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu mAspectRatio = (float) height / width; 2476432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu } 2486432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu mHandler.sendEmptyMessage(UPDATE_TRANSFORM_MATRIX); 2496432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu } 2506432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu 2516432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu public int getPreviewWidth() { 2526432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu return mPreviewWidth; 2536432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu } 2546432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu 2556432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu public int getPreviewHeight() { 2566432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu return mPreviewHeight; 2576432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu } 2586432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu 2596432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu public void onScreenSizeChanged(int width, int height, int previewWidth, int previewHeight) { 2606432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu setTransformMatrix(width, height); 2616432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu } 2626432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu 2636432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu private void setTransformMatrix(int width, int height) { 2646432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu mMatrix = mTextureView.getTransform(mMatrix); 265b50b5cbfbc0a67db6fc43373363b10381c9c61a3Angus Kong int orientation = CameraUtil.getDisplayRotation(mActivity); 2666432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu float scaleX = 1f, scaleY = 1f; 2676432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu float scaledTextureWidth, scaledTextureHeight; 2686432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu if (width > height) { 2696432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu scaledTextureWidth = Math.max(width, 2706432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu (int) (height * mAspectRatio)); 2716432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu scaledTextureHeight = Math.max(height, 2726432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu (int)(width / mAspectRatio)); 2736432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu } else { 2746432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu scaledTextureWidth = Math.max(width, 2756432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu (int) (height / mAspectRatio)); 2766432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu scaledTextureHeight = Math.max(height, 2776432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu (int) (width * mAspectRatio)); 2786432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu } 2796432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu 2806432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu if (mSurfaceTextureUncroppedWidth != scaledTextureWidth || 2816432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu mSurfaceTextureUncroppedHeight != scaledTextureHeight) { 2826432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu mSurfaceTextureUncroppedWidth = scaledTextureWidth; 2836432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu mSurfaceTextureUncroppedHeight = scaledTextureHeight; 2846432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu } 2856432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu scaleX = scaledTextureWidth / width; 2866432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu scaleY = scaledTextureHeight / height; 2876432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu mMatrix.setScale(scaleX, scaleY, (float) width / 2, (float) height / 2); 2886432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu mTextureView.setTransform(mMatrix); 2896432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu 2906432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu if (mSurfaceView != null && mSurfaceView.getVisibility() == View.VISIBLE) { 2916432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu LayoutParams lp = (LayoutParams) mSurfaceView.getLayoutParams(); 2926432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu lp.width = (int) mSurfaceTextureUncroppedWidth; 2936432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu lp.height = (int) mSurfaceTextureUncroppedHeight; 2946432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu lp.gravity = Gravity.CENTER; 2956432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu mSurfaceView.requestLayout(); 2966432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu } 2976432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu } 2986432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu 29937f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling /** 30037f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling * Starts a flash animation 30137f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling */ 30237f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling public void animateFlash() { 30337f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling mAnimationManager.startFlashAnimation(mFlashOverlay); 30437f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling } 30537f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling 30637f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling /** 30737f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling * Starts a capture animation 30837f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling * @param bitmap the captured image that we shrink and slide in the animation 30937f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling */ 31037f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling public void animateCapture(Bitmap bitmap) { 31137f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling ((ImageView) mPreviewThumb).setImageBitmap(bitmap); 31237f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling mAnimationManager.startCaptureAnimation(mPreviewThumb); 31337f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling } 31437f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling 31537f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling /** 31637f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling * Cancels on-going animations 31737f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling */ 31837f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling public void cancelAnimations() { 31937f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling mAnimationManager.cancelAnimations(); 32037f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling } 32137f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling 3226432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu public void hideUI() { 3236432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu mCameraControls.setVisibility(View.INVISIBLE); 3246432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu mSwitcher.closePopup(); 3256432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu } 3266432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu 3276432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu public void showUI() { 3286432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu mCameraControls.setVisibility(View.VISIBLE); 3296432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu } 3306432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu 3316432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu public void hideSwitcher() { 3326432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu mSwitcher.closePopup(); 3336432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu mSwitcher.setVisibility(View.INVISIBLE); 3346432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu } 3356432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu 3366432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu public void showSwitcher() { 3376432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu mSwitcher.setVisibility(View.VISIBLE); 3386432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu } 3396432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu 3406827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu public boolean collapseCameraControls() { 3416827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu boolean ret = false; 3426827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu if (mPopup != null) { 3436827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu dismissPopup(false); 3446827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu ret = true; 3456827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu } 3466827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu return ret; 3476827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu } 3486827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu 3496827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu public boolean removeTopLevelPopup() { 3506827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu if (mPopup != null) { 3516827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu dismissPopup(true); 3526827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu return true; 3536827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu } 3546827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu return false; 3556827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu } 3566827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu 3576827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu public void enableCameraControls(boolean enable) { 3586827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu if (mGestures != null) { 3596827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mGestures.setZoomOnly(!enable); 3606827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu } 3616827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu if (mPieRenderer != null && mPieRenderer.showsItems()) { 3626827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mPieRenderer.hide(); 3636827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu } 3646827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu } 3656827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu 3666827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu public void overrideSettings(final String... keyvalues) { 3676827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mVideoMenu.overrideSettings(keyvalues); 3686827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu } 3696827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu 3706827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu public void setOrientationIndicator(int orientation, boolean animation) { 3716827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu // We change the orientation of the linearlayout only for phone UI 3726827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu // because when in portrait the width is not enough. 3736827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu if (mLabelsLinearLayout != null) { 3746827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu if (((orientation / 90) & 1) == 0) { 3756827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mLabelsLinearLayout.setOrientation(LinearLayout.VERTICAL); 3766827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu } else { 3776827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mLabelsLinearLayout.setOrientation(LinearLayout.HORIZONTAL); 3786827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu } 3796827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu } 3806827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mRecordingTimeRect.setOrientation(0, animation); 3816827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu } 3826827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu 3836827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu public SurfaceHolder getSurfaceHolder() { 3846432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu return mSurfaceView.getHolder(); 3856827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu } 3866827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu 3876827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu public void hideSurfaceView() { 3886432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu mSurfaceView.setVisibility(View.GONE); 3896432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu mTextureView.setVisibility(View.VISIBLE); 3906432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu setTransformMatrix(mPreviewWidth, mPreviewHeight); 3916827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu } 3926827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu 3936827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu public void showSurfaceView() { 3946432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu mSurfaceView.setVisibility(View.VISIBLE); 3956432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu mTextureView.setVisibility(View.GONE); 3966432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu setTransformMatrix(mPreviewWidth, mPreviewHeight); 3976827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu } 3986827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu 3996827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu private void initializeOverlay() { 4006827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mRenderOverlay = (RenderOverlay) mRootView.findViewById(R.id.render_overlay); 4016827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu if (mPieRenderer == null) { 4026827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mPieRenderer = new PieRenderer(mActivity); 4036827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mVideoMenu = new VideoMenu(mActivity, this, mPieRenderer); 4046827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mPieRenderer.setPieListener(this); 4056827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu } 4066827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mRenderOverlay.addRenderer(mPieRenderer); 4076827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu if (mZoomRenderer == null) { 4086827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mZoomRenderer = new ZoomRenderer(mActivity); 4096827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu } 4106827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mRenderOverlay.addRenderer(mZoomRenderer); 4116827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu if (mGestures == null) { 4126432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu mGestures = new PreviewGestures(mActivity, this, mZoomRenderer, mPieRenderer); 4136432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu mRenderOverlay.setGestures(mGestures); 4146827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu } 4156827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mGestures.setRenderOverlay(mRenderOverlay); 4164f91ab5d099632afd84dd7bd80a804cbbe1f3588Sascha Haeberling 4174f91ab5d099632afd84dd7bd80a804cbbe1f3588Sascha Haeberling mPreviewThumb = mActivity.findViewById(R.id.preview_thumb); 4184f91ab5d099632afd84dd7bd80a804cbbe1f3588Sascha Haeberling mPreviewThumb.setOnClickListener(new OnClickListener() { 4194f91ab5d099632afd84dd7bd80a804cbbe1f3588Sascha Haeberling @Override 4204f91ab5d099632afd84dd7bd80a804cbbe1f3588Sascha Haeberling public void onClick(View v) { 4216432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu // TODO: Go to filmstrip view 4224f91ab5d099632afd84dd7bd80a804cbbe1f3588Sascha Haeberling } 4234f91ab5d099632afd84dd7bd80a804cbbe1f3588Sascha Haeberling }); 4246827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu } 4256827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu 4266827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu public void setPrefChangedListener(OnPreferenceChangedListener listener) { 4276827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mVideoMenu.setListener(listener); 4286827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu } 4296827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu 4306827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu private void initializeMiscControls() { 4316827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mReviewImage = (ImageView) mRootView.findViewById(R.id.review_image); 4326827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mShutterButton.setImageResource(R.drawable.btn_new_shutter_video); 4336827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mShutterButton.setOnShutterButtonListener(mController); 4346827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mShutterButton.setVisibility(View.VISIBLE); 4356827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mShutterButton.requestFocus(); 4366827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mShutterButton.enableTouch(true); 4376827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mRecordingTimeView = (TextView) mRootView.findViewById(R.id.recording_time); 4386827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mRecordingTimeRect = (RotateLayout) mRootView.findViewById(R.id.recording_time_rect); 4396827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mTimeLapseLabel = mRootView.findViewById(R.id.time_lapse_label); 4406827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu // The R.id.labels can only be found in phone layout. 4416827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu // That is, mLabelsLinearLayout should be null in tablet layout. 4426827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mLabelsLinearLayout = (LinearLayout) mRootView.findViewById(R.id.labels); 4436827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu } 4446827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu 4458788079a51a90255dce330e56afcb6674deccbf7Michael Kolb public void updateOnScreenIndicators(Parameters param, ComboPreferences prefs) { 446140c263ebb2504fe1a0212a835f0098ce7973a22Sascha Haeberling mOnScreenIndicators.updateFlashOnScreenIndicator(param.getFlashMode()); 4478788079a51a90255dce330e56afcb6674deccbf7Michael Kolb boolean location = RecordLocationPreference.get( 4488788079a51a90255dce330e56afcb6674deccbf7Michael Kolb prefs, mActivity.getContentResolver()); 4498788079a51a90255dce330e56afcb6674deccbf7Michael Kolb mOnScreenIndicators.updateLocationIndicator(location); 4508788079a51a90255dce330e56afcb6674deccbf7Michael Kolb 4516827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu } 4526827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu 4536827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu public void setAspectRatio(double ratio) { 4546432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu // mPreviewFrameLayout.setAspectRatio(ratio); 4556827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu } 4566827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu 4576827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu public void showTimeLapseUI(boolean enable) { 4586827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu if (mTimeLapseLabel != null) { 4596827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mTimeLapseLabel.setVisibility(enable ? View.VISIBLE : View.GONE); 4606827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu } 4616827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu } 4626827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu 4633bc96b2d1106fc5ebec6fda6aad3bca4d62e81c0Michael Kolb private void openMenu() { 4643bc96b2d1106fc5ebec6fda6aad3bca4d62e81c0Michael Kolb if (mPieRenderer != null) { 4653bc96b2d1106fc5ebec6fda6aad3bca4d62e81c0Michael Kolb mPieRenderer.showInCenter(); 4663bc96b2d1106fc5ebec6fda6aad3bca4d62e81c0Michael Kolb } 4673bc96b2d1106fc5ebec6fda6aad3bca4d62e81c0Michael Kolb } 4683bc96b2d1106fc5ebec6fda6aad3bca4d62e81c0Michael Kolb 469c3679c0961521165499380c77344acc69072b2acDoris Liu public void dismissPopup(boolean topLevelOnly) { 470c3679c0961521165499380c77344acc69072b2acDoris Liu // In review mode, we do not want to bring up the camera UI 471c3679c0961521165499380c77344acc69072b2acDoris Liu if (mController.isInReviewMode()) return; 472c3679c0961521165499380c77344acc69072b2acDoris Liu if (mPopup != null) { 473c3679c0961521165499380c77344acc69072b2acDoris Liu mPopup.dismiss(topLevelOnly); 474c3679c0961521165499380c77344acc69072b2acDoris Liu } 4756827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu } 4766827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu 477c3679c0961521165499380c77344acc69072b2acDoris Liu private void popupDismissed() { 478c3679c0961521165499380c77344acc69072b2acDoris Liu mPopup = null; 4796827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu } 4806827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu 481c3679c0961521165499380c77344acc69072b2acDoris Liu public void showPopup(AbstractSettingPopup popup) { 482c3679c0961521165499380c77344acc69072b2acDoris Liu hideUI(); 48369ef5ea6ed838cf6fba834811f01122d349a61cfDoris Liu 4846827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu if (mPopup != null) { 485c3679c0961521165499380c77344acc69072b2acDoris Liu mPopup.dismiss(false); 4866827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu } 487c3679c0961521165499380c77344acc69072b2acDoris Liu mPopup = new SettingsPopup(popup); 4886827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu } 4896827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu 4906827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu public void onShowSwitcherPopup() { 4916827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu hidePieRenderer(); 4926827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu } 4936827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu 4946827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu public boolean hidePieRenderer() { 4956827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu if (mPieRenderer != null && mPieRenderer.showsItems()) { 4966827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mPieRenderer.hide(); 4976827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu return true; 4986827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu } 4996827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu return false; 5006827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu } 5016827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu 50261f2b082014fe4402dd208029e9378dd5cb1fd1dDoris Liu // disable preview gestures after shutter is pressed 50361f2b082014fe4402dd208029e9378dd5cb1fd1dDoris Liu public void setShutterPressed(boolean pressed) { 50461f2b082014fe4402dd208029e9378dd5cb1fd1dDoris Liu if (mGestures == null) return; 50561f2b082014fe4402dd208029e9378dd5cb1fd1dDoris Liu mGestures.setEnabled(!pressed); 50661f2b082014fe4402dd208029e9378dd5cb1fd1dDoris Liu } 50761f2b082014fe4402dd208029e9378dd5cb1fd1dDoris Liu 5086827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu public void enableShutter(boolean enable) { 5096827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu if (mShutterButton != null) { 5106827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mShutterButton.setEnabled(enable); 5116827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu } 5126827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu } 5136827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu 5146827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu // PieListener 5156827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu @Override 5166827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu public void onPieOpened(int centerX, int centerY) { 5176432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu setSwipingEnabled(false); 5186827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu } 5196827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu 5206827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu @Override 5216827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu public void onPieClosed() { 5226432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu setSwipingEnabled(true); 5236432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu } 5246432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu 5256432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu public void setSwipingEnabled(boolean enable) { 5266432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu mActivity.setSwipingEnabled(enable); 5276827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu } 5286827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu 5296827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu public void showPreviewBorder(boolean enable) { 5306432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu // TODO: mPreviewFrameLayout.showBorder(enable); 5316827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu } 5326827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu 5336827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu // SingleTapListener 5346827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu // Preview area is touched. Take a picture. 5356827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu @Override 5366827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu public void onSingleTapUp(View view, int x, int y) { 5376827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mController.onSingleTapUp(view, x, y); 5386827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu } 5396827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu 5406827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu public void showRecordingUI(boolean recording, boolean zoomSupported) { 5416432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu mMenuButton.setVisibility(recording ? View.GONE : View.VISIBLE); 5426827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mOnScreenIndicators.setVisibility(recording ? View.GONE : View.VISIBLE); 5436827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu if (recording) { 5446827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mShutterButton.setImageResource(R.drawable.btn_shutter_video_recording); 5456432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu hideSwitcher(); 5466827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mRecordingTimeView.setText(""); 5476827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mRecordingTimeView.setVisibility(View.VISIBLE); 5486827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu // The camera is not allowed to be accessed in older api levels during 5496827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu // recording. It is therefore necessary to hide the zoom UI on older 5506827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu // platforms. 5516827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu // See the documentation of android.media.MediaRecorder.start() for 5526827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu // further explanation. 5536827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu if (!ApiHelper.HAS_ZOOM_WHEN_RECORDING && zoomSupported) { 5546827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu // TODO: disable zoom UI here. 5556827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu } 5566827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu } else { 5576827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mShutterButton.setImageResource(R.drawable.btn_new_shutter_video); 5586432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu showSwitcher(); 5596827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mRecordingTimeView.setVisibility(View.GONE); 5606827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu if (!ApiHelper.HAS_ZOOM_WHEN_RECORDING && zoomSupported) { 5616827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu // TODO: enable zoom UI here. 5626827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu } 5636827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu } 5646827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu } 5656827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu 5666827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu public void showReviewImage(Bitmap bitmap) { 5676827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mReviewImage.setImageBitmap(bitmap); 5686827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mReviewImage.setVisibility(View.VISIBLE); 5696827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu } 5706827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu 5716827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu public void showReviewControls() { 572b50b5cbfbc0a67db6fc43373363b10381c9c61a3Angus Kong CameraUtil.fadeOut(mShutterButton); 573b50b5cbfbc0a67db6fc43373363b10381c9c61a3Angus Kong CameraUtil.fadeIn(mReviewDoneButton); 574b50b5cbfbc0a67db6fc43373363b10381c9c61a3Angus Kong CameraUtil.fadeIn(mReviewPlayButton); 5756827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mReviewImage.setVisibility(View.VISIBLE); 5766432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu mMenuButton.setVisibility(View.GONE); 5776827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mOnScreenIndicators.setVisibility(View.GONE); 5786827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu } 5796827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu 5806827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu public void hideReviewUI() { 5816827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mReviewImage.setVisibility(View.GONE); 5826827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mShutterButton.setEnabled(true); 5836432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu mMenuButton.setVisibility(View.VISIBLE); 5846827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mOnScreenIndicators.setVisibility(View.VISIBLE); 585b50b5cbfbc0a67db6fc43373363b10381c9c61a3Angus Kong CameraUtil.fadeOut(mReviewDoneButton); 586b50b5cbfbc0a67db6fc43373363b10381c9c61a3Angus Kong CameraUtil.fadeOut(mReviewPlayButton); 587b50b5cbfbc0a67db6fc43373363b10381c9c61a3Angus Kong CameraUtil.fadeIn(mShutterButton); 5886827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu } 5896827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu 5906827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu private void setShowMenu(boolean show) { 5916827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu if (mOnScreenIndicators != null) { 5926827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mOnScreenIndicators.setVisibility(show ? View.VISIBLE : View.GONE); 5936827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu } 5946432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu if (mMenuButton != null) { 5956432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu mMenuButton.setVisibility(show ? View.VISIBLE : View.GONE); 5966827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu } 5976827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu } 5986827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu 5996432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu public void onSwitchMode(boolean toCamera) { 6006432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu if (toCamera) { 6016432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu showUI(); 6026432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu } else { 6036432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu hideUI(); 6046432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu } 6056827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu if (mGestures != null) { 6066432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu mGestures.setEnabled(toCamera); 6076827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu } 6086827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu if (mRenderOverlay != null) { 6096827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu // this can not happen in capture mode 6106432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu mRenderOverlay.setVisibility(toCamera ? View.VISIBLE : View.GONE); 6116827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu } 6126432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu setShowMenu(toCamera); 6136827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu } 6146827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu 6156827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu public void initializePopup(PreferenceGroup pref) { 6166827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mVideoMenu.initialize(pref); 6176827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu } 6186827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu 6196827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu public void initializeZoom(Parameters param) { 6206432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu if (param == null || !param.isZoomSupported()) { 6216432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu mGestures.setZoomEnabled(false); 6226432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu return; 6236432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu } 6246432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu mGestures.setZoomEnabled(true); 6256827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mZoomMax = param.getMaxZoom(); 6266827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mZoomRatios = param.getZoomRatios(); 6276827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu // Currently we use immediate zoom for fast zooming to get better UX and 6286827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu // there is no plan to take advantage of the smooth zoom. 6296827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mZoomRenderer.setZoomMax(mZoomMax); 6306827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mZoomRenderer.setZoom(param.getZoom()); 6316827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mZoomRenderer.setZoomValue(mZoomRatios.get(param.getZoom())); 6326827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mZoomRenderer.setOnZoomChangeListener(new ZoomChangeListener()); 6336827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu } 6346827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu 6356827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu public void clickShutter() { 6366827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mShutterButton.performClick(); 6376827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu } 6386827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu 6396827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu public void pressShutter(boolean pressed) { 6406827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mShutterButton.setPressed(pressed); 6416827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu } 6426827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu 6436432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu public View getShutterButton() { 6446432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu return mShutterButton; 6456827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu } 6466827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu 6476827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu public void setRecordingTime(String text) { 6486827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mRecordingTimeView.setText(text); 6496827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu } 6506827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu 6516827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu public void setRecordingTimeTextColor(int color) { 6526827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mRecordingTimeView.setTextColor(color); 6536827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu } 6546827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu 6556432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu public boolean isVisible() { 6566432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu return mTextureView.getVisibility() == View.VISIBLE; 6576432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu } 6586432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu 6596432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu public void onDisplayChanged() { 6606432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu mCameraControls.checkLayoutFlip(); 6616432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu mController.updateCameraOrientation(); 6626432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu } 6636432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu 6646827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu private class ZoomChangeListener implements ZoomRenderer.OnZoomChangedListener { 6656827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu @Override 6666827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu public void onZoomValueChanged(int index) { 6676827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu int newZoom = mController.onZoomChanged(index); 6686827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu if (mZoomRenderer != null) { 6696827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mZoomRenderer.setZoomValue(mZoomRatios.get(newZoom)); 6706827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu } 6716827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu } 6726827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu 6736827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu @Override 6746827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu public void onZoomStart() { 6756827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu } 6766827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu 6776827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu @Override 6786827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu public void onZoomEnd() { 6796827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu } 6806827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu } 6813bc96b2d1106fc5ebec6fda6aad3bca4d62e81c0Michael Kolb 6826432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu public SurfaceTexture getSurfaceTexture() { 6836432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu return mSurfaceTexture; 6843bc96b2d1106fc5ebec6fda6aad3bca4d62e81c0Michael Kolb } 6853bc96b2d1106fc5ebec6fda6aad3bca4d62e81c0Michael Kolb 6866432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu // SurfaceTexture callbacks 6876432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu @Override 6886432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu public void onSurfaceTextureAvailable(SurfaceTexture surface, int width, int height) { 689395ee2d6d3c8fa9e16363517dc9e8afc8cbd609eAngus Kong mSurfaceTexture = surface; 690395ee2d6d3c8fa9e16363517dc9e8afc8cbd609eAngus Kong mController.onPreviewUIReady(); 6914f91ab5d099632afd84dd7bd80a804cbbe1f3588Sascha Haeberling } 6926432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu 6936432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu @Override 6946432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu public boolean onSurfaceTextureDestroyed(SurfaceTexture surface) { 6956432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu mSurfaceTexture = null; 696395ee2d6d3c8fa9e16363517dc9e8afc8cbd609eAngus Kong mController.onPreviewUIDestroyed(); 6976432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu Log.d(TAG, "surfaceTexture is destroyed"); 6986432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu return true; 6996432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu } 7006432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu 7016432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu @Override 7026432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu public void onSurfaceTextureSizeChanged(SurfaceTexture surface, int width, int height) { 7036432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu } 7046432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu 7056432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu @Override 7066432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu public void onSurfaceTextureUpdated(SurfaceTexture surface) { 7076432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu } 7086432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu 7096432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu // SurfaceHolder callbacks 7106432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu @Override 7116432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { 7126432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu Log.v(TAG, "Surface changed. width=" + width + ". height=" + height); 7136432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu } 7146432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu 7156432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu @Override 7166432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu public void surfaceCreated(SurfaceHolder holder) { 7176432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu Log.v(TAG, "Surface created"); 7186432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu } 7196432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu 7206432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu @Override 7216432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu public void surfaceDestroyed(SurfaceHolder holder) { 7226432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu Log.v(TAG, "Surface destroyed"); 7236432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu mController.stopPreview(); 7246432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu } 7256827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu} 726