VideoUI.java revision 37f3611bbdc787c996a99894dcef7d8fb77e3f7c
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; 226432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liuimport android.graphics.Matrix; 236432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liuimport android.graphics.SurfaceTexture; 246827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liuimport android.hardware.Camera.Parameters; 256432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liuimport android.os.Handler; 266432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liuimport android.os.Message; 276827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liuimport android.util.Log; 286827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liuimport android.view.Gravity; 296827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liuimport android.view.SurfaceHolder; 306432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liuimport android.view.SurfaceView; 316432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liuimport android.view.TextureView; 326432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liuimport android.view.TextureView.SurfaceTextureListener; 336827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liuimport android.view.View; 346827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liuimport android.view.View.OnClickListener; 356432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liuimport android.view.View.OnLayoutChangeListener; 366827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liuimport android.view.ViewGroup; 376827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liuimport android.widget.FrameLayout; 386827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liuimport android.widget.FrameLayout.LayoutParams; 396827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liuimport android.widget.ImageView; 406827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liuimport android.widget.LinearLayout; 416827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liuimport android.widget.TextView; 426827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu 436827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liuimport com.android.camera.CameraPreference.OnPreferenceChangedListener; 446827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liuimport com.android.camera.ui.AbstractSettingPopup; 456432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liuimport com.android.camera.ui.CameraControls; 466432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liuimport com.android.camera.ui.CameraRootView; 476432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liuimport com.android.camera.ui.CameraSwitcher; 486432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liuimport com.android.camera.ui.CameraSwitcher.CameraSwitchListener; 496827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liuimport com.android.camera.ui.PieRenderer; 506827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liuimport com.android.camera.ui.RenderOverlay; 516827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liuimport com.android.camera.ui.RotateLayout; 526827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liuimport com.android.camera.ui.ZoomRenderer; 538e963a5a6016d246184ed65906f9d103e92b17e2Sascha Haeberlingimport com.android.camera2.R; 546827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liuimport com.android.gallery3d.common.ApiHelper; 556827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu 566432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liupublic class VideoUI implements PieRenderer.PieListener, 573bc96b2d1106fc5ebec6fda6aad3bca4d62e81c0Michael Kolb PreviewGestures.SingleTapListener, 586432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu CameraRootView.MyDisplayListener, 596432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu SurfaceTextureListener, SurfaceHolder.Callback { 60395ee2d6d3c8fa9e16363517dc9e8afc8cbd609eAngus Kong private static final String TAG = "CAM_VideoUI"; 616432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu private static final int UPDATE_TRANSFORM_MATRIX = 1; 626827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu // module fields 636827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu private CameraActivity mActivity; 646827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu private View mRootView; 656432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu private TextureView mTextureView; 666827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu // An review image having same size as preview. It is displayed when 676827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu // recording is stopped in capture intent. 686827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu private ImageView mReviewImage; 696827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu private View mReviewCancelButton; 706827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu private View mReviewDoneButton; 716827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu private View mReviewPlayButton; 726827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu private ShutterButton mShutterButton; 736432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu private CameraSwitcher mSwitcher; 746827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu private TextView mRecordingTimeView; 756827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu private LinearLayout mLabelsLinearLayout; 766827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu private View mTimeLapseLabel; 776827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu private RenderOverlay mRenderOverlay; 786827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu private PieRenderer mPieRenderer; 796827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu private VideoMenu mVideoMenu; 806432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu private CameraControls mCameraControls; 816827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu private AbstractSettingPopup mPopup; 826827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu private ZoomRenderer mZoomRenderer; 836827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu private PreviewGestures mGestures; 846432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu private View mMenuButton; 856827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu private View mBlocker; 86140c263ebb2504fe1a0212a835f0098ce7973a22Sascha Haeberling private OnScreenIndicators mOnScreenIndicators; 876827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu private RotateLayout mRecordingTimeRect; 886432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu private final Object mLock = new Object(); 896432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu private SurfaceTexture mSurfaceTexture; 906827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu private VideoController mController; 916827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu private int mZoomMax; 926827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu private List<Integer> mZoomRatios; 934f91ab5d099632afd84dd7bd80a804cbbe1f3588Sascha Haeberling private View mPreviewThumb; 9437f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling private View mFlashOverlay; 956827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu 966432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu private SurfaceView mSurfaceView = null; 976432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu private int mPreviewWidth = 0; 986432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu private int mPreviewHeight = 0; 996432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu private float mSurfaceTextureUncroppedWidth; 1006432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu private float mSurfaceTextureUncroppedHeight; 1016432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu private float mAspectRatio = 4f / 3f; 1026432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu private Matrix mMatrix = null; 10337f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling private final AnimationManager mAnimationManager; 1046432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu private final Handler mHandler = new Handler() { 1056432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu @Override 1066432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu public void handleMessage(Message msg) { 1076432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu switch (msg.what) { 1086432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu case UPDATE_TRANSFORM_MATRIX: 1096432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu setTransformMatrix(mPreviewWidth, mPreviewHeight); 1106432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu break; 1116432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu default: 1126432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu break; 1136432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu } 1146432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu } 1156432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu }; 1166432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu private OnLayoutChangeListener mLayoutListener = new OnLayoutChangeListener() { 1176432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu @Override 1186432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu public void onLayoutChange(View v, int left, int top, int right, 1196432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) { 1206432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu int width = right - left; 1216432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu int height = bottom - top; 1226432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu // Full-screen screennail 1236432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu int w = width; 1246432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu int h = height; 1256432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu if (Util.getDisplayRotation(mActivity) % 180 != 0) { 1266432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu w = height; 1276432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu h = width; 1286432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu } 1296432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu if (mPreviewWidth != width || mPreviewHeight != height) { 1306432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu mPreviewWidth = width; 1316432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu mPreviewHeight = height; 1326432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu onScreenSizeChanged(width, height, w, h); 1336432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu } 1346432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu } 1356432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu }; 1366432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu 1376827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu public VideoUI(CameraActivity activity, VideoController controller, View parent) { 1386827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mActivity = activity; 1396827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mController = controller; 1406827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mRootView = parent; 1416827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mActivity.getLayoutInflater().inflate(R.layout.video_module, (ViewGroup) mRootView, true); 1426432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu mTextureView = (TextureView) mRootView.findViewById(R.id.preview_content); 1436432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu mTextureView.setSurfaceTextureListener(this); 1446432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu mRootView.addOnLayoutChangeListener(mLayoutListener); 1456432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu ((CameraRootView) mRootView).setDisplayChangeListener(this); 14637f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling mFlashOverlay = mRootView.findViewById(R.id.flash_overlay); 1476432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu mShutterButton = (ShutterButton) mRootView.findViewById(R.id.shutter_button); 1486432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu mSwitcher = (CameraSwitcher) mRootView.findViewById(R.id.camera_switcher); 149147e26ab7075f0acd3978f0cd0541cd1da4b50e1Doris Liu mSwitcher.setCurrentIndex(CameraSwitcher.VIDEO_MODULE_INDEX); 1506432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu mSwitcher.setSwitchListener((CameraSwitchListener) mActivity); 1516827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu initializeMiscControls(); 1526827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu initializeControlByIntent(); 1536827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu initializeOverlay(); 15437f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling mAnimationManager = new AnimationManager(); 1556827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu } 1566827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu 1576432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu 1586432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu public void initializeSurfaceView() { 1596432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu mSurfaceView = new SurfaceView(mActivity); 1606432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu ((ViewGroup) mRootView).addView(mSurfaceView, 0); 1616432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu mSurfaceView.getHolder().addCallback(this); 1626432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu } 1636432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu 1646827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu private void initializeControlByIntent() { 1656827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mBlocker = mActivity.findViewById(R.id.blocker); 1666432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu mMenuButton = mActivity.findViewById(R.id.menu); 1676432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu mMenuButton.setOnClickListener(new OnClickListener() { 1686827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu @Override 1696827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu public void onClick(View v) { 1706827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu if (mPieRenderer != null) { 1716827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mPieRenderer.showInCenter(); 1726827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu } 1736827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu } 1746827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu }); 1756432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu 1766432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu mCameraControls = (CameraControls) mActivity.findViewById(R.id.camera_controls); 177eb8adc1754fc668435ee57d1be2235b80fc8c009Michael Kolb mOnScreenIndicators = new OnScreenIndicators(mActivity, 178140c263ebb2504fe1a0212a835f0098ce7973a22Sascha Haeberling mActivity.findViewById(R.id.on_screen_indicators)); 179140c263ebb2504fe1a0212a835f0098ce7973a22Sascha Haeberling mOnScreenIndicators.resetToDefault(); 1806827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu if (mController.isVideoCaptureIntent()) { 1816432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu hideSwitcher(); 1826432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu mActivity.getLayoutInflater().inflate(R.layout.review_module_control, 1836432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu (ViewGroup) mCameraControls); 1846827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu // Cannot use RotateImageView for "done" and "cancel" button because 1856827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu // the tablet layout uses RotateLayout, which cannot be cast to 1866827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu // RotateImageView. 1876827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mReviewDoneButton = mActivity.findViewById(R.id.btn_done); 1886827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mReviewCancelButton = mActivity.findViewById(R.id.btn_cancel); 1896827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mReviewPlayButton = mActivity.findViewById(R.id.btn_play); 1906827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mReviewCancelButton.setVisibility(View.VISIBLE); 1916827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mReviewDoneButton.setOnClickListener(new OnClickListener() { 1926827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu @Override 1936827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu public void onClick(View v) { 1946827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mController.onReviewDoneClicked(v); 1956827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu } 1966827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu }); 1976827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mReviewCancelButton.setOnClickListener(new OnClickListener() { 1986827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu @Override 1996827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu public void onClick(View v) { 2006827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mController.onReviewCancelClicked(v); 2016827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu } 2026827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu }); 2036827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mReviewPlayButton.setOnClickListener(new OnClickListener() { 2046827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu @Override 2056827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu public void onClick(View v) { 2066827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mController.onReviewPlayClicked(v); 2076827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu } 2086827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu }); 2096827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu } 2106827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu } 2116827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu 2126432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu public void setPreviewSize(int width, int height) { 2136432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu if (width == 0 || height == 0) { 2146432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu Log.w(TAG, "Preview size should not be 0."); 2156432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu return; 2166432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu } 2176432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu if (width > height) { 2186432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu mAspectRatio = (float) width / height; 2196432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu } else { 2206432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu mAspectRatio = (float) height / width; 2216432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu } 2226432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu mHandler.sendEmptyMessage(UPDATE_TRANSFORM_MATRIX); 2236432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu } 2246432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu 2256432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu public int getPreviewWidth() { 2266432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu return mPreviewWidth; 2276432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu } 2286432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu 2296432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu public int getPreviewHeight() { 2306432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu return mPreviewHeight; 2316432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu } 2326432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu 2336432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu public void onScreenSizeChanged(int width, int height, int previewWidth, int previewHeight) { 2346432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu setTransformMatrix(width, height); 2356432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu } 2366432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu 2376432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu private void setTransformMatrix(int width, int height) { 2386432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu mMatrix = mTextureView.getTransform(mMatrix); 2396432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu int orientation = Util.getDisplayRotation(mActivity); 2406432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu float scaleX = 1f, scaleY = 1f; 2416432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu float scaledTextureWidth, scaledTextureHeight; 2426432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu if (width > height) { 2436432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu scaledTextureWidth = Math.max(width, 2446432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu (int) (height * mAspectRatio)); 2456432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu scaledTextureHeight = Math.max(height, 2466432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu (int)(width / mAspectRatio)); 2476432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu } else { 2486432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu scaledTextureWidth = Math.max(width, 2496432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu (int) (height / mAspectRatio)); 2506432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu scaledTextureHeight = Math.max(height, 2516432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu (int) (width * mAspectRatio)); 2526432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu } 2536432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu 2546432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu if (mSurfaceTextureUncroppedWidth != scaledTextureWidth || 2556432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu mSurfaceTextureUncroppedHeight != scaledTextureHeight) { 2566432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu mSurfaceTextureUncroppedWidth = scaledTextureWidth; 2576432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu mSurfaceTextureUncroppedHeight = scaledTextureHeight; 2586432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu } 2596432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu scaleX = scaledTextureWidth / width; 2606432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu scaleY = scaledTextureHeight / height; 2616432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu mMatrix.setScale(scaleX, scaleY, (float) width / 2, (float) height / 2); 2626432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu mTextureView.setTransform(mMatrix); 2636432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu 2646432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu if (mSurfaceView != null && mSurfaceView.getVisibility() == View.VISIBLE) { 2656432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu LayoutParams lp = (LayoutParams) mSurfaceView.getLayoutParams(); 2666432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu lp.width = (int) mSurfaceTextureUncroppedWidth; 2676432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu lp.height = (int) mSurfaceTextureUncroppedHeight; 2686432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu lp.gravity = Gravity.CENTER; 2696432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu mSurfaceView.requestLayout(); 2706432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu } 2716432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu } 2726432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu 27337f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling /** 27437f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling * Starts a flash animation 27537f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling */ 27637f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling public void animateFlash() { 27737f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling mAnimationManager.startFlashAnimation(mFlashOverlay); 27837f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling } 27937f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling 28037f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling /** 28137f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling * Starts a capture animation 28237f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling * @param bitmap the captured image that we shrink and slide in the animation 28337f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling */ 28437f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling public void animateCapture(Bitmap bitmap) { 28537f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling ((ImageView) mPreviewThumb).setImageBitmap(bitmap); 28637f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling mAnimationManager.startCaptureAnimation(mPreviewThumb); 28737f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling } 28837f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling 28937f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling /** 29037f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling * Cancels on-going animations 29137f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling */ 29237f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling public void cancelAnimations() { 29337f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling mAnimationManager.cancelAnimations(); 29437f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling } 29537f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling 2966432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu public void hideUI() { 2976432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu mCameraControls.setVisibility(View.INVISIBLE); 2986432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu mSwitcher.closePopup(); 2996432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu } 3006432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu 3016432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu public void showUI() { 3026432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu mCameraControls.setVisibility(View.VISIBLE); 3036432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu } 3046432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu 3056432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu public void hideSwitcher() { 3066432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu mSwitcher.closePopup(); 3076432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu mSwitcher.setVisibility(View.INVISIBLE); 3086432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu } 3096432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu 3106432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu public void showSwitcher() { 3116432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu mSwitcher.setVisibility(View.VISIBLE); 3126432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu } 3136432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu 3146827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu public boolean collapseCameraControls() { 3156827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu boolean ret = false; 3166827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu if (mPopup != null) { 3176827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu dismissPopup(false); 3186827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu ret = true; 3196827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu } 3206827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu return ret; 3216827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu } 3226827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu 3236827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu public boolean removeTopLevelPopup() { 3246827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu if (mPopup != null) { 3256827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu dismissPopup(true); 3266827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu return true; 3276827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu } 3286827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu return false; 3296827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu } 3306827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu 3316827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu public void enableCameraControls(boolean enable) { 3326827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu if (mGestures != null) { 3336827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mGestures.setZoomOnly(!enable); 3346827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu } 3356827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu if (mPieRenderer != null && mPieRenderer.showsItems()) { 3366827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mPieRenderer.hide(); 3376827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu } 3386827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu } 3396827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu 3406827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu public void overrideSettings(final String... keyvalues) { 3416827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mVideoMenu.overrideSettings(keyvalues); 3426827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu } 3436827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu 3446827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu public void setOrientationIndicator(int orientation, boolean animation) { 3456827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu // We change the orientation of the linearlayout only for phone UI 3466827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu // because when in portrait the width is not enough. 3476827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu if (mLabelsLinearLayout != null) { 3486827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu if (((orientation / 90) & 1) == 0) { 3496827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mLabelsLinearLayout.setOrientation(LinearLayout.VERTICAL); 3506827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu } else { 3516827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mLabelsLinearLayout.setOrientation(LinearLayout.HORIZONTAL); 3526827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu } 3536827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu } 3546827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mRecordingTimeRect.setOrientation(0, animation); 3556827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu } 3566827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu 3576827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu public SurfaceHolder getSurfaceHolder() { 3586432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu return mSurfaceView.getHolder(); 3596827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu } 3606827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu 3616827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu public void hideSurfaceView() { 3626432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu mSurfaceView.setVisibility(View.GONE); 3636432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu mTextureView.setVisibility(View.VISIBLE); 3646432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu setTransformMatrix(mPreviewWidth, mPreviewHeight); 3656827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu } 3666827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu 3676827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu public void showSurfaceView() { 3686432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu mSurfaceView.setVisibility(View.VISIBLE); 3696432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu mTextureView.setVisibility(View.GONE); 3706432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu setTransformMatrix(mPreviewWidth, mPreviewHeight); 3716827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu } 3726827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu 3736827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu private void initializeOverlay() { 3746827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mRenderOverlay = (RenderOverlay) mRootView.findViewById(R.id.render_overlay); 3756827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu if (mPieRenderer == null) { 3766827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mPieRenderer = new PieRenderer(mActivity); 3776827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mVideoMenu = new VideoMenu(mActivity, this, mPieRenderer); 3786827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mPieRenderer.setPieListener(this); 3796827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu } 3806827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mRenderOverlay.addRenderer(mPieRenderer); 3816827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu if (mZoomRenderer == null) { 3826827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mZoomRenderer = new ZoomRenderer(mActivity); 3836827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu } 3846827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mRenderOverlay.addRenderer(mZoomRenderer); 3856827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu if (mGestures == null) { 3866432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu mGestures = new PreviewGestures(mActivity, this, mZoomRenderer, mPieRenderer); 3876432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu mRenderOverlay.setGestures(mGestures); 3886827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu } 3896827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mGestures.setRenderOverlay(mRenderOverlay); 3904f91ab5d099632afd84dd7bd80a804cbbe1f3588Sascha Haeberling 3914f91ab5d099632afd84dd7bd80a804cbbe1f3588Sascha Haeberling mPreviewThumb = mActivity.findViewById(R.id.preview_thumb); 3924f91ab5d099632afd84dd7bd80a804cbbe1f3588Sascha Haeberling mPreviewThumb.setOnClickListener(new OnClickListener() { 3934f91ab5d099632afd84dd7bd80a804cbbe1f3588Sascha Haeberling @Override 3944f91ab5d099632afd84dd7bd80a804cbbe1f3588Sascha Haeberling public void onClick(View v) { 3956432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu // TODO: Go to filmstrip view 3964f91ab5d099632afd84dd7bd80a804cbbe1f3588Sascha Haeberling } 3974f91ab5d099632afd84dd7bd80a804cbbe1f3588Sascha Haeberling }); 3986827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu } 3996827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu 4006827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu public void setPrefChangedListener(OnPreferenceChangedListener listener) { 4016827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mVideoMenu.setListener(listener); 4026827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu } 4036827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu 4046827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu private void initializeMiscControls() { 4056827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mReviewImage = (ImageView) mRootView.findViewById(R.id.review_image); 4066827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mShutterButton.setImageResource(R.drawable.btn_new_shutter_video); 4076827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mShutterButton.setOnShutterButtonListener(mController); 4086827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mShutterButton.setVisibility(View.VISIBLE); 4096827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mShutterButton.requestFocus(); 4106827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mShutterButton.enableTouch(true); 4116827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mRecordingTimeView = (TextView) mRootView.findViewById(R.id.recording_time); 4126827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mRecordingTimeRect = (RotateLayout) mRootView.findViewById(R.id.recording_time_rect); 4136827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mTimeLapseLabel = mRootView.findViewById(R.id.time_lapse_label); 4146827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu // The R.id.labels can only be found in phone layout. 4156827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu // That is, mLabelsLinearLayout should be null in tablet layout. 4166827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mLabelsLinearLayout = (LinearLayout) mRootView.findViewById(R.id.labels); 4176827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu } 4186827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu 4198788079a51a90255dce330e56afcb6674deccbf7Michael Kolb public void updateOnScreenIndicators(Parameters param, ComboPreferences prefs) { 420140c263ebb2504fe1a0212a835f0098ce7973a22Sascha Haeberling mOnScreenIndicators.updateFlashOnScreenIndicator(param.getFlashMode()); 4218788079a51a90255dce330e56afcb6674deccbf7Michael Kolb boolean location = RecordLocationPreference.get( 4228788079a51a90255dce330e56afcb6674deccbf7Michael Kolb prefs, mActivity.getContentResolver()); 4238788079a51a90255dce330e56afcb6674deccbf7Michael Kolb mOnScreenIndicators.updateLocationIndicator(location); 4248788079a51a90255dce330e56afcb6674deccbf7Michael Kolb 4256827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu } 4266827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu 4276827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu public void setAspectRatio(double ratio) { 4286432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu // mPreviewFrameLayout.setAspectRatio(ratio); 4296827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu } 4306827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu 4316827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu public void showTimeLapseUI(boolean enable) { 4326827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu if (mTimeLapseLabel != null) { 4336827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mTimeLapseLabel.setVisibility(enable ? View.VISIBLE : View.GONE); 4346827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu } 4356827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu } 4366827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu 4373bc96b2d1106fc5ebec6fda6aad3bca4d62e81c0Michael Kolb private void openMenu() { 4383bc96b2d1106fc5ebec6fda6aad3bca4d62e81c0Michael Kolb if (mPieRenderer != null) { 4393bc96b2d1106fc5ebec6fda6aad3bca4d62e81c0Michael Kolb mPieRenderer.showInCenter(); 4403bc96b2d1106fc5ebec6fda6aad3bca4d62e81c0Michael Kolb } 4413bc96b2d1106fc5ebec6fda6aad3bca4d62e81c0Michael Kolb } 4423bc96b2d1106fc5ebec6fda6aad3bca4d62e81c0Michael Kolb 4436827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu public void showPopup(AbstractSettingPopup popup) { 4446432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu hideUI(); 4456827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mBlocker.setVisibility(View.INVISIBLE); 4466827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu setShowMenu(false); 4476827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mPopup = popup; 4486827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mPopup.setVisibility(View.VISIBLE); 4496827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu FrameLayout.LayoutParams lp = new FrameLayout.LayoutParams(LayoutParams.WRAP_CONTENT, 4506827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu LayoutParams.WRAP_CONTENT); 4516827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu lp.gravity = Gravity.CENTER; 4526827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu ((FrameLayout) mRootView).addView(mPopup, lp); 4536827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu } 4546827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu 4556827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu public void dismissPopup(boolean topLevelOnly) { 4566827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu dismissPopup(topLevelOnly, true); 4576827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu } 4586827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu 4596827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu public void dismissPopup(boolean topLevelPopupOnly, boolean fullScreen) { 46069ef5ea6ed838cf6fba834811f01122d349a61cfDoris Liu // In review mode, we do not want to bring up the camera UI 46169ef5ea6ed838cf6fba834811f01122d349a61cfDoris Liu if (mController.isInReviewMode()) return; 46269ef5ea6ed838cf6fba834811f01122d349a61cfDoris Liu 4636827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu if (fullScreen) { 4646432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu showUI(); 4656827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mBlocker.setVisibility(View.VISIBLE); 4666827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu } 4676827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu setShowMenu(fullScreen); 4686827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu if (mPopup != null) { 4696827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu ((FrameLayout) mRootView).removeView(mPopup); 4706827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mPopup = null; 4716827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu } 4726827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mVideoMenu.popupDismissed(topLevelPopupOnly); 4736827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu } 4746827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu 4756827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu public void onShowSwitcherPopup() { 4766827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu hidePieRenderer(); 4776827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu } 4786827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu 4796827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu public boolean hidePieRenderer() { 4806827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu if (mPieRenderer != null && mPieRenderer.showsItems()) { 4816827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mPieRenderer.hide(); 4826827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu return true; 4836827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu } 4846827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu return false; 4856827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu } 4866827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu 48761f2b082014fe4402dd208029e9378dd5cb1fd1dDoris Liu // disable preview gestures after shutter is pressed 48861f2b082014fe4402dd208029e9378dd5cb1fd1dDoris Liu public void setShutterPressed(boolean pressed) { 48961f2b082014fe4402dd208029e9378dd5cb1fd1dDoris Liu if (mGestures == null) return; 49061f2b082014fe4402dd208029e9378dd5cb1fd1dDoris Liu mGestures.setEnabled(!pressed); 49161f2b082014fe4402dd208029e9378dd5cb1fd1dDoris Liu } 49261f2b082014fe4402dd208029e9378dd5cb1fd1dDoris Liu 4936827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu public void enableShutter(boolean enable) { 4946827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu if (mShutterButton != null) { 4956827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mShutterButton.setEnabled(enable); 4966827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu } 4976827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu } 4986827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu 4996827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu // PieListener 5006827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu @Override 5016827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu public void onPieOpened(int centerX, int centerY) { 5026432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu setSwipingEnabled(false); 50391fffb39cf1eb7919cab48c56eb1b44727f4e5c2Angus Kong dismissPopup(false, true); 5046827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu } 5056827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu 5066827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu @Override 5076827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu public void onPieClosed() { 5086432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu setSwipingEnabled(true); 5096432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu } 5106432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu 5116432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu public void setSwipingEnabled(boolean enable) { 5126432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu mActivity.setSwipingEnabled(enable); 5136827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu } 5146827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu 5156827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu public void showPreviewBorder(boolean enable) { 5166432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu // TODO: mPreviewFrameLayout.showBorder(enable); 5176827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu } 5186827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu 5196827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu // SingleTapListener 5206827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu // Preview area is touched. Take a picture. 5216827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu @Override 5226827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu public void onSingleTapUp(View view, int x, int y) { 5236827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mController.onSingleTapUp(view, x, y); 5246827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu } 5256827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu 5266827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu public void showRecordingUI(boolean recording, boolean zoomSupported) { 5276432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu mMenuButton.setVisibility(recording ? View.GONE : View.VISIBLE); 5286827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mOnScreenIndicators.setVisibility(recording ? View.GONE : View.VISIBLE); 5296827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu if (recording) { 5306827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mShutterButton.setImageResource(R.drawable.btn_shutter_video_recording); 5316432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu hideSwitcher(); 5326827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mRecordingTimeView.setText(""); 5336827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mRecordingTimeView.setVisibility(View.VISIBLE); 5346827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu // The camera is not allowed to be accessed in older api levels during 5356827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu // recording. It is therefore necessary to hide the zoom UI on older 5366827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu // platforms. 5376827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu // See the documentation of android.media.MediaRecorder.start() for 5386827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu // further explanation. 5396827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu if (!ApiHelper.HAS_ZOOM_WHEN_RECORDING && zoomSupported) { 5406827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu // TODO: disable zoom UI here. 5416827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu } 5426827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu } else { 5436827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mShutterButton.setImageResource(R.drawable.btn_new_shutter_video); 5446432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu showSwitcher(); 5456827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mRecordingTimeView.setVisibility(View.GONE); 5466827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu if (!ApiHelper.HAS_ZOOM_WHEN_RECORDING && zoomSupported) { 5476827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu // TODO: enable zoom UI here. 5486827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu } 5496827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu } 5506827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu } 5516827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu 5526827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu public void showReviewImage(Bitmap bitmap) { 5536827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mReviewImage.setImageBitmap(bitmap); 5546827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mReviewImage.setVisibility(View.VISIBLE); 5556827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu } 5566827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu 5576827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu public void showReviewControls() { 5586827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu Util.fadeOut(mShutterButton); 5596827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu Util.fadeIn(mReviewDoneButton); 5606827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu Util.fadeIn(mReviewPlayButton); 5616827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mReviewImage.setVisibility(View.VISIBLE); 5626432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu mMenuButton.setVisibility(View.GONE); 5636827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mOnScreenIndicators.setVisibility(View.GONE); 5646827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu } 5656827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu 5666827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu public void hideReviewUI() { 5676827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mReviewImage.setVisibility(View.GONE); 5686827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mShutterButton.setEnabled(true); 5696432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu mMenuButton.setVisibility(View.VISIBLE); 5706827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mOnScreenIndicators.setVisibility(View.VISIBLE); 5716827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu Util.fadeOut(mReviewDoneButton); 5726827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu Util.fadeOut(mReviewPlayButton); 5736827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu Util.fadeIn(mShutterButton); 5746827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu } 5756827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu 5766827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu private void setShowMenu(boolean show) { 5776827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu if (mOnScreenIndicators != null) { 5786827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mOnScreenIndicators.setVisibility(show ? View.VISIBLE : View.GONE); 5796827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu } 5806432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu if (mMenuButton != null) { 5816432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu mMenuButton.setVisibility(show ? View.VISIBLE : View.GONE); 5826827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu } 5836827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu } 5846827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu 5856432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu public void onSwitchMode(boolean toCamera) { 5866432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu if (toCamera) { 5876432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu showUI(); 5886432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu } else { 5896432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu hideUI(); 5906432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu } 5916827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu if (mGestures != null) { 5926432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu mGestures.setEnabled(toCamera); 5936827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu } 5946827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu if (mPopup != null) { 5956432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu dismissPopup(false, toCamera); 5966827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu } 5976827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu if (mRenderOverlay != null) { 5986827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu // this can not happen in capture mode 5996432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu mRenderOverlay.setVisibility(toCamera ? View.VISIBLE : View.GONE); 6006827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu } 6016432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu setShowMenu(toCamera); 6026827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu } 6036827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu 6046827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu public void initializePopup(PreferenceGroup pref) { 6056827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mVideoMenu.initialize(pref); 6066827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu } 6076827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu 6086827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu public void initializeZoom(Parameters param) { 6096432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu if (param == null || !param.isZoomSupported()) { 6106432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu mGestures.setZoomEnabled(false); 6116432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu return; 6126432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu } 6136432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu mGestures.setZoomEnabled(true); 6146827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mZoomMax = param.getMaxZoom(); 6156827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mZoomRatios = param.getZoomRatios(); 6166827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu // Currently we use immediate zoom for fast zooming to get better UX and 6176827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu // there is no plan to take advantage of the smooth zoom. 6186827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mZoomRenderer.setZoomMax(mZoomMax); 6196827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mZoomRenderer.setZoom(param.getZoom()); 6206827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mZoomRenderer.setZoomValue(mZoomRatios.get(param.getZoom())); 6216827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mZoomRenderer.setOnZoomChangeListener(new ZoomChangeListener()); 6226827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu } 6236827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu 6246827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu public void clickShutter() { 6256827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mShutterButton.performClick(); 6266827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu } 6276827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu 6286827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu public void pressShutter(boolean pressed) { 6296827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mShutterButton.setPressed(pressed); 6306827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu } 6316827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu 6326432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu public View getShutterButton() { 6336432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu return mShutterButton; 6346827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu } 6356827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu 6366827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu public void setRecordingTime(String text) { 6376827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mRecordingTimeView.setText(text); 6386827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu } 6396827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu 6406827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu public void setRecordingTimeTextColor(int color) { 6416827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mRecordingTimeView.setTextColor(color); 6426827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu } 6436827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu 6446432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu public boolean isVisible() { 6456432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu return mTextureView.getVisibility() == View.VISIBLE; 6466432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu } 6476432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu 6486432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu public void onDisplayChanged() { 6496432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu mCameraControls.checkLayoutFlip(); 6506432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu mController.updateCameraOrientation(); 6516432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu } 6526432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu 6536827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu private class ZoomChangeListener implements ZoomRenderer.OnZoomChangedListener { 6546827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu @Override 6556827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu public void onZoomValueChanged(int index) { 6566827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu int newZoom = mController.onZoomChanged(index); 6576827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu if (mZoomRenderer != null) { 6586827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu mZoomRenderer.setZoomValue(mZoomRatios.get(newZoom)); 6596827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu } 6606827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu } 6616827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu 6626827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu @Override 6636827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu public void onZoomStart() { 6646827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu } 6656827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu 6666827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu @Override 6676827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu public void onZoomEnd() { 6686827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu } 6696827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu } 6703bc96b2d1106fc5ebec6fda6aad3bca4d62e81c0Michael Kolb 6716432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu public SurfaceTexture getSurfaceTexture() { 6726432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu return mSurfaceTexture; 6733bc96b2d1106fc5ebec6fda6aad3bca4d62e81c0Michael Kolb } 6743bc96b2d1106fc5ebec6fda6aad3bca4d62e81c0Michael Kolb 6756432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu // SurfaceTexture callbacks 6766432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu @Override 6776432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu public void onSurfaceTextureAvailable(SurfaceTexture surface, int width, int height) { 678395ee2d6d3c8fa9e16363517dc9e8afc8cbd609eAngus Kong mSurfaceTexture = surface; 679395ee2d6d3c8fa9e16363517dc9e8afc8cbd609eAngus Kong mController.onPreviewUIReady(); 6804f91ab5d099632afd84dd7bd80a804cbbe1f3588Sascha Haeberling } 6816432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu 6826432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu @Override 6836432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu public boolean onSurfaceTextureDestroyed(SurfaceTexture surface) { 6846432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu mSurfaceTexture = null; 685395ee2d6d3c8fa9e16363517dc9e8afc8cbd609eAngus Kong mController.onPreviewUIDestroyed(); 6866432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu Log.d(TAG, "surfaceTexture is destroyed"); 6876432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu return true; 6886432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu } 6896432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu 6906432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu @Override 6916432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu public void onSurfaceTextureSizeChanged(SurfaceTexture surface, int width, int height) { 6926432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu } 6936432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu 6946432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu @Override 6956432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu public void onSurfaceTextureUpdated(SurfaceTexture surface) { 6966432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu } 6976432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu 6986432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu // SurfaceHolder callbacks 6996432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu @Override 7006432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { 7016432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu Log.v(TAG, "Surface changed. width=" + width + ". height=" + height); 7026432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu } 7036432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu 7046432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu @Override 7056432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu public void surfaceCreated(SurfaceHolder holder) { 7066432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu Log.v(TAG, "Surface created"); 7076432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu } 7086432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu 7096432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu @Override 7106432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu public void surfaceDestroyed(SurfaceHolder holder) { 7116432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu Log.v(TAG, "Surface destroyed"); 7126432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu mController.stopPreview(); 7136432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu } 7146827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu} 715