blob: 7fbaff01cd6c2e18b3262fe2561db4616ab10fe1 [file] [log] [blame]
Doris Liu6827ce22013-03-12 19:24:28 -07001/*
Doris Liu6432cd62013-06-13 17:20:31 -07002 * Copyright (C) 2012 The Android Open Source Project
Doris Liu6827ce22013-03-12 19:24:28 -07003 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package com.android.camera;
18
Byunghun Jeon802f5132014-06-16 17:42:26 -070019import java.util.List;
20
Santhosh Kumar H E6bc53a12013-10-25 13:14:10 +053021import android.content.res.Configuration;
Doris Liu6827ce22013-03-12 19:24:28 -070022import android.graphics.Bitmap;
Doris Liuc3679c02013-08-08 18:08:43 -070023import android.graphics.Color;
Doris Liu6432cd62013-06-13 17:20:31 -070024import android.graphics.Matrix;
Likai Ding40d36372014-11-20 08:00:28 +080025import android.graphics.SurfaceTexture;
Doris Liuc3679c02013-08-08 18:08:43 -070026import android.graphics.drawable.ColorDrawable;
Doris Liu6827ce22013-03-12 19:24:28 -070027import android.hardware.Camera.Parameters;
Doris Liu6432cd62013-06-13 17:20:31 -070028import android.os.Handler;
29import android.os.Message;
Doris Liu6827ce22013-03-12 19:24:28 -070030import android.util.Log;
31import android.view.Gravity;
Doris Liu6827ce22013-03-12 19:24:28 -070032import android.view.SurfaceHolder;
Doris Liu6432cd62013-06-13 17:20:31 -070033import android.view.SurfaceView;
Likai Ding40d36372014-11-20 08:00:28 +080034import android.view.TextureView;
35import android.view.TextureView.SurfaceTextureListener;
Byunghun Jeon802f5132014-06-16 17:42:26 -070036import android.view.MotionEvent;
Doris Liu6827ce22013-03-12 19:24:28 -070037import android.view.View;
38import android.view.View.OnClickListener;
Doris Liu6432cd62013-06-13 17:20:31 -070039import android.view.View.OnLayoutChangeListener;
Doris Liu6827ce22013-03-12 19:24:28 -070040import android.view.ViewGroup;
Byunghun Jeon802f5132014-06-16 17:42:26 -070041import android.view.ViewPropertyAnimator;
Doris Liu6827ce22013-03-12 19:24:28 -070042import android.widget.FrameLayout.LayoutParams;
43import android.widget.ImageView;
44import android.widget.LinearLayout;
Byunghun Jeon802f5132014-06-16 17:42:26 -070045import android.widget.ListView;
Doris Liuc3679c02013-08-08 18:08:43 -070046import android.widget.PopupWindow;
Doris Liu6827ce22013-03-12 19:24:28 -070047import android.widget.TextView;
48
49import com.android.camera.CameraPreference.OnPreferenceChangedListener;
50import com.android.camera.ui.AbstractSettingPopup;
Doris Liu6432cd62013-06-13 17:20:31 -070051import com.android.camera.ui.CameraControls;
52import com.android.camera.ui.CameraRootView;
Angus Konged15d1a2013-08-19 15:06:12 -070053import com.android.camera.ui.ModuleSwitcher;
Doris Liu6827ce22013-03-12 19:24:28 -070054import com.android.camera.ui.PieRenderer;
Doris Liu6827ce22013-03-12 19:24:28 -070055import com.android.camera.ui.RenderOverlay;
56import com.android.camera.ui.RotateLayout;
57import com.android.camera.ui.ZoomRenderer;
Angus Kongb50b5cb2013-08-09 14:55:20 -070058import com.android.camera.util.CameraUtil;
Sachin Shah89d153b2014-08-15 18:36:44 -070059import org.codeaurora.snapcam.R;
Sascha Haeberling638e6f02013-09-18 14:28:51 -070060
Doris Liu6432cd62013-06-13 17:20:31 -070061public class VideoUI implements PieRenderer.PieListener,
Michael Kolb3bc96b22013-03-12 10:24:42 -070062 PreviewGestures.SingleTapListener,
Doris Liu6432cd62013-06-13 17:20:31 -070063 CameraRootView.MyDisplayListener,
Likai Ding40d36372014-11-20 08:00:28 +080064 SurfaceTextureListener, SurfaceHolder.Callback,
Manikanta Kanamarlapudiae019672014-01-06 14:31:43 +053065 PauseButton.OnPauseButtonListener {
Angus Kong395ee2d2013-07-15 12:42:41 -070066 private static final String TAG = "CAM_VideoUI";
Doris Liu6432cd62013-06-13 17:20:31 -070067 private static final int UPDATE_TRANSFORM_MATRIX = 1;
Doris Liu6827ce22013-03-12 19:24:28 -070068 // module fields
69 private CameraActivity mActivity;
70 private View mRootView;
Likai Ding40d36372014-11-20 08:00:28 +080071 private TextureView mTextureView;
Doris Liu6827ce22013-03-12 19:24:28 -070072 // An review image having same size as preview. It is displayed when
73 // recording is stopped in capture intent.
74 private ImageView mReviewImage;
75 private View mReviewCancelButton;
76 private View mReviewDoneButton;
77 private View mReviewPlayButton;
78 private ShutterButton mShutterButton;
Manikanta Kanamarlapudiae019672014-01-06 14:31:43 +053079 private PauseButton mPauseButton;
Angus Konged15d1a2013-08-19 15:06:12 -070080 private ModuleSwitcher mSwitcher;
Doris Liu6827ce22013-03-12 19:24:28 -070081 private TextView mRecordingTimeView;
82 private LinearLayout mLabelsLinearLayout;
83 private View mTimeLapseLabel;
84 private RenderOverlay mRenderOverlay;
85 private PieRenderer mPieRenderer;
86 private VideoMenu mVideoMenu;
Doris Liu6432cd62013-06-13 17:20:31 -070087 private CameraControls mCameraControls;
Doris Liuc3679c02013-08-08 18:08:43 -070088 private SettingsPopup mPopup;
Doris Liu6827ce22013-03-12 19:24:28 -070089 private ZoomRenderer mZoomRenderer;
90 private PreviewGestures mGestures;
Doris Liu6432cd62013-06-13 17:20:31 -070091 private View mMenuButton;
Sascha Haeberling140c2632013-04-23 09:58:51 -070092 private OnScreenIndicators mOnScreenIndicators;
Doris Liu6827ce22013-03-12 19:24:28 -070093 private RotateLayout mRecordingTimeRect;
Doris Liufe6596c2013-10-08 11:03:37 -070094 private boolean mRecordingStarted = false;
Likai Ding40d36372014-11-20 08:00:28 +080095 private SurfaceTexture mSurfaceTexture;
Doris Liu6827ce22013-03-12 19:24:28 -070096 private VideoController mController;
97 private int mZoomMax;
98 private List<Integer> mZoomRatios;
Likai Ding512a1ad2014-11-20 08:00:10 +080099 private View mPreviewThumb;
Sascha Haeberling37f36112013-08-06 14:31:52 -0700100 private View mFlashOverlay;
Santhosh Kumar H E6bc53a12013-10-25 13:14:10 +0530101 private boolean mOrientationResize;
102 private boolean mPrevOrientationResize;
Kerong Suiea667a62014-04-08 17:52:03 +0800103 private boolean mIsTimeLapse = false;
Byunghun Jeon802f5132014-06-16 17:42:26 -0700104 private LinearLayout mMenuLayout;
105 private LinearLayout mSubMenuLayout;
106 private LinearLayout mPreviewMenuLayout;
Likai Ding546ba362014-11-21 01:52:54 +0800107 private CustomVideoMenu mCustomVideoMenu;
Doris Liu6827ce22013-03-12 19:24:28 -0700108
Doris Liu3a45c332013-10-15 19:10:28 -0700109 private View mPreviewCover;
Doris Liu6432cd62013-06-13 17:20:31 -0700110 private SurfaceView mSurfaceView = null;
111 private int mPreviewWidth = 0;
112 private int mPreviewHeight = 0;
Likai Ding40d36372014-11-20 08:00:28 +0800113 private float mSurfaceTextureUncroppedWidth;
114 private float mSurfaceTextureUncroppedHeight;
Doris Liu6432cd62013-06-13 17:20:31 -0700115 private float mAspectRatio = 4f / 3f;
Santhosh Kumar H E6bc53a12013-10-25 13:14:10 +0530116 private boolean mAspectRatioResize;
Doris Liu6432cd62013-06-13 17:20:31 -0700117 private Matrix mMatrix = null;
Sascha Haeberling37f36112013-08-06 14:31:52 -0700118 private final AnimationManager mAnimationManager;
Byunghun Jeon802f5132014-06-16 17:42:26 -0700119 private boolean mUIhidden = false;
120 private int mPreviewOrientation = -1;
121
Doris Liu6432cd62013-06-13 17:20:31 -0700122 private final Handler mHandler = new Handler() {
123 @Override
124 public void handleMessage(Message msg) {
125 switch (msg.what) {
126 case UPDATE_TRANSFORM_MATRIX:
127 setTransformMatrix(mPreviewWidth, mPreviewHeight);
128 break;
129 default:
130 break;
131 }
132 }
133 };
134 private OnLayoutChangeListener mLayoutListener = new OnLayoutChangeListener() {
135 @Override
136 public void onLayoutChange(View v, int left, int top, int right,
137 int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) {
138 int width = right - left;
139 int height = bottom - top;
Likai Ding40d36372014-11-20 08:00:28 +0800140 // Full-screen screennail
141 int w = width;
142 int h = height;
143 if (CameraUtil.getDisplayRotation(mActivity) % 180 != 0) {
144 w = height;
145 h = width;
Doris Liu6432cd62013-06-13 17:20:31 -0700146 }
Santhosh Kumar H E6bc53a12013-10-25 13:14:10 +0530147 if (mPreviewWidth != width || mPreviewHeight != height
148 || (mOrientationResize != mPrevOrientationResize)
Likai Ding40d36372014-11-20 08:00:28 +0800149 || (mAspectRatioResize)) {
Doris Liu6432cd62013-06-13 17:20:31 -0700150 mPreviewWidth = width;
151 mPreviewHeight = height;
Likai Ding40d36372014-11-20 08:00:28 +0800152 onScreenSizeChanged(width, height, w, h);
Santhosh Kumar H E6bc53a12013-10-25 13:14:10 +0530153 mAspectRatioResize = false;
Doris Liu6432cd62013-06-13 17:20:31 -0700154 }
Likai Ding546ba362014-11-21 01:52:54 +0800155 mCustomVideoMenu.tryToCloseSubList();
Doris Liu6432cd62013-06-13 17:20:31 -0700156 }
157 };
158
Doris Liu3a45c332013-10-15 19:10:28 -0700159 public void showPreviewCover() {
160 mPreviewCover.setVisibility(View.VISIBLE);
161 }
162
Doris Liuc3679c02013-08-08 18:08:43 -0700163 private class SettingsPopup extends PopupWindow {
164 public SettingsPopup(View popup) {
165 super(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
166 setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
167 setOutsideTouchable(true);
168 setFocusable(true);
169 popup.setVisibility(View.VISIBLE);
170 setContentView(popup);
171 showAtLocation(mRootView, Gravity.CENTER, 0, 0);
172 }
173
174 public void dismiss(boolean topLevelOnly) {
175 super.dismiss();
176 popupDismissed();
177 showUI();
Likai Ding546ba362014-11-21 01:52:54 +0800178 mVideoMenu.popupDismissed(topLevelOnly);
Sascha Haeberling4ec139d2013-10-09 23:46:20 -0700179
180 // Switch back into fullscreen/lights-out mode after popup
181 // is dimissed.
182 mActivity.setSystemBarsVisibility(false);
Doris Liuc3679c02013-08-08 18:08:43 -0700183 }
184
185 @Override
186 public void dismiss() {
187 // Called by Framework when touch outside the popup or hit back key
188 dismiss(true);
189 }
190 }
191
Doris Liu6827ce22013-03-12 19:24:28 -0700192 public VideoUI(CameraActivity activity, VideoController controller, View parent) {
193 mActivity = activity;
194 mController = controller;
195 mRootView = parent;
Likai Ding40d36372014-11-20 08:00:28 +0800196 mActivity.getLayoutInflater().inflate(R.layout.video_module, (ViewGroup) mRootView, true);
Doris Liu3a45c332013-10-15 19:10:28 -0700197 mPreviewCover = mRootView.findViewById(R.id.preview_cover);
Likai Ding40d36372014-11-20 08:00:28 +0800198 mTextureView = (TextureView) mRootView.findViewById(R.id.preview_content);
199 mTextureView.setSurfaceTextureListener(this);
200 mTextureView.addOnLayoutChangeListener(mLayoutListener);
Sascha Haeberling37f36112013-08-06 14:31:52 -0700201 mFlashOverlay = mRootView.findViewById(R.id.flash_overlay);
Doris Liu6432cd62013-06-13 17:20:31 -0700202 mShutterButton = (ShutterButton) mRootView.findViewById(R.id.shutter_button);
Angus Konged15d1a2013-08-19 15:06:12 -0700203 mSwitcher = (ModuleSwitcher) mRootView.findViewById(R.id.camera_switcher);
204 mSwitcher.setCurrentIndex(ModuleSwitcher.VIDEO_MODULE_INDEX);
205 mSwitcher.setSwitchListener(mActivity);
Doris Liu6827ce22013-03-12 19:24:28 -0700206 initializeMiscControls();
207 initializeControlByIntent();
208 initializeOverlay();
Manikanta Kanamarlapudiae019672014-01-06 14:31:43 +0530209 initializePauseButton();
Sascha Haeberling37f36112013-08-06 14:31:52 -0700210 mAnimationManager = new AnimationManager();
Santhosh Kumar H E6bc53a12013-10-25 13:14:10 +0530211 mOrientationResize = false;
212 mPrevOrientationResize = false;
Doris Liu6827ce22013-03-12 19:24:28 -0700213 }
214
Santhosh Kumar H E6bc53a12013-10-25 13:14:10 +0530215 public void cameraOrientationPreviewResize(boolean orientation){
216 mPrevOrientationResize = mOrientationResize;
217 mOrientationResize = orientation;
218 }
Doris Liu6432cd62013-06-13 17:20:31 -0700219
220 public void initializeSurfaceView() {
Likai Ding40d36372014-11-20 08:00:28 +0800221 mSurfaceView = new SurfaceView(mActivity);
222 ((ViewGroup) mRootView).addView(mSurfaceView, 0);
223 mSurfaceView.getHolder().addCallback(this);
Doris Liu6432cd62013-06-13 17:20:31 -0700224 }
225
Doris Liu6827ce22013-03-12 19:24:28 -0700226 private void initializeControlByIntent() {
Doris Liu2a7f44c2013-08-12 15:18:53 -0700227 mMenuButton = mRootView.findViewById(R.id.menu);
Doris Liu6432cd62013-06-13 17:20:31 -0700228 mMenuButton.setOnClickListener(new OnClickListener() {
Doris Liu6827ce22013-03-12 19:24:28 -0700229 @Override
230 public void onClick(View v) {
Likai Ding546ba362014-11-21 01:52:54 +0800231 mCustomVideoMenu.openFirstLevel();
Doris Liu6827ce22013-03-12 19:24:28 -0700232 }
233 });
Doris Liu6432cd62013-06-13 17:20:31 -0700234
Doris Liu2a7f44c2013-08-12 15:18:53 -0700235 mCameraControls = (CameraControls) mRootView.findViewById(R.id.camera_controls);
Michael Kolbeb8adc12013-04-26 11:09:29 -0700236 mOnScreenIndicators = new OnScreenIndicators(mActivity,
Doris Liu2a7f44c2013-08-12 15:18:53 -0700237 mRootView.findViewById(R.id.on_screen_indicators));
Sascha Haeberling140c2632013-04-23 09:58:51 -0700238 mOnScreenIndicators.resetToDefault();
Doris Liu6827ce22013-03-12 19:24:28 -0700239 if (mController.isVideoCaptureIntent()) {
Doris Liu6432cd62013-06-13 17:20:31 -0700240 hideSwitcher();
241 mActivity.getLayoutInflater().inflate(R.layout.review_module_control,
242 (ViewGroup) mCameraControls);
Doris Liu6827ce22013-03-12 19:24:28 -0700243 // Cannot use RotateImageView for "done" and "cancel" button because
244 // the tablet layout uses RotateLayout, which cannot be cast to
245 // RotateImageView.
Doris Liu2a7f44c2013-08-12 15:18:53 -0700246 mReviewDoneButton = mRootView.findViewById(R.id.btn_done);
247 mReviewCancelButton = mRootView.findViewById(R.id.btn_cancel);
248 mReviewPlayButton = mRootView.findViewById(R.id.btn_play);
Doris Liu6827ce22013-03-12 19:24:28 -0700249 mReviewCancelButton.setVisibility(View.VISIBLE);
250 mReviewDoneButton.setOnClickListener(new OnClickListener() {
251 @Override
252 public void onClick(View v) {
253 mController.onReviewDoneClicked(v);
254 }
255 });
256 mReviewCancelButton.setOnClickListener(new OnClickListener() {
257 @Override
258 public void onClick(View v) {
259 mController.onReviewCancelClicked(v);
260 }
261 });
262 mReviewPlayButton.setOnClickListener(new OnClickListener() {
263 @Override
264 public void onClick(View v) {
265 mController.onReviewPlayClicked(v);
266 }
267 });
268 }
269 }
270
Doris Liu6432cd62013-06-13 17:20:31 -0700271 public void setPreviewSize(int width, int height) {
272 if (width == 0 || height == 0) {
273 Log.w(TAG, "Preview size should not be 0.");
274 return;
275 }
Santhosh Kumar H E6bc53a12013-10-25 13:14:10 +0530276 float ratio;
Doris Liu6432cd62013-06-13 17:20:31 -0700277 if (width > height) {
Santhosh Kumar H E6bc53a12013-10-25 13:14:10 +0530278 ratio = (float) width / height;
Doris Liu6432cd62013-06-13 17:20:31 -0700279 } else {
Santhosh Kumar H E6bc53a12013-10-25 13:14:10 +0530280 ratio = (float) height / width;
281 }
282 if (mOrientationResize &&
283 mActivity.getResources().getConfiguration().orientation
284 != Configuration.ORIENTATION_PORTRAIT) {
285 ratio = 1 / ratio;
286 }
287
288 if (ratio != mAspectRatio){
289 mAspectRatioResize = true;
290 mAspectRatio = ratio;
Doris Liu6432cd62013-06-13 17:20:31 -0700291 }
Likai Ding40d36372014-11-20 08:00:28 +0800292 mHandler.sendEmptyMessage(UPDATE_TRANSFORM_MATRIX);
Doris Liu6432cd62013-06-13 17:20:31 -0700293 }
294
295 public int getPreviewWidth() {
296 return mPreviewWidth;
297 }
298
299 public int getPreviewHeight() {
300 return mPreviewHeight;
301 }
302
Likai Ding40d36372014-11-20 08:00:28 +0800303 public void onScreenSizeChanged(int width, int height, int previewWidth, int previewHeight) {
304 setTransformMatrix(width, height);
305 }
Byunghun Jeon6ee7e412014-08-29 17:56:11 -0700306
Likai Ding40d36372014-11-20 08:00:28 +0800307 private void setTransformMatrix(int width, int height) {
308 mMatrix = mTextureView.getTransform(mMatrix);
309 int orientation = CameraUtil.getDisplayRotation(mActivity);
310 float scaleX = 1f, scaleY = 1f;
Doris Liu6432cd62013-06-13 17:20:31 -0700311 float scaledTextureWidth, scaledTextureHeight;
Likai Ding40d36372014-11-20 08:00:28 +0800312 if (mOrientationResize){
313 if (width/mAspectRatio > height){
Byunghun Jeon6ee7e412014-08-29 17:56:11 -0700314 scaledTextureHeight = height;
Likai Ding40d36372014-11-20 08:00:28 +0800315 scaledTextureWidth = (int)(height * mAspectRatio + 0.5f);
316 } else {
317 scaledTextureWidth = width;
318 scaledTextureHeight = (int)(width / mAspectRatio + 0.5f);
Santhosh Kumar H E6bc53a12013-10-25 13:14:10 +0530319 }
Doris Liu6432cd62013-06-13 17:20:31 -0700320 } else {
Santhosh Kumar H E6bc53a12013-10-25 13:14:10 +0530321 if (width > height) {
Likai Ding2f163f22014-09-04 17:43:28 +0800322 scaledTextureWidth = Math.max(width, height * mAspectRatio);
323 scaledTextureHeight = Math.max(height, width / mAspectRatio);
Santhosh Kumar H E6bc53a12013-10-25 13:14:10 +0530324 } else {
Likai Ding2f163f22014-09-04 17:43:28 +0800325 scaledTextureWidth = Math.max(width, height / mAspectRatio);
326 scaledTextureHeight = Math.max(height, width * mAspectRatio);
Santhosh Kumar H E6bc53a12013-10-25 13:14:10 +0530327 }
Doris Liu6432cd62013-06-13 17:20:31 -0700328 }
329
Likai Ding40d36372014-11-20 08:00:28 +0800330 if (mSurfaceTextureUncroppedWidth != scaledTextureWidth ||
331 mSurfaceTextureUncroppedHeight != scaledTextureHeight) {
332 mSurfaceTextureUncroppedWidth = scaledTextureWidth;
333 mSurfaceTextureUncroppedHeight = scaledTextureHeight;
334 }
335 scaleX = scaledTextureWidth / width;
336 scaleY = scaledTextureHeight / height;
337 mMatrix.setScale(scaleX, scaleY, (float) width / 2, (float) height / 2);
338 mTextureView.setTransform(mMatrix);
339
340 if (mSurfaceView != null && mSurfaceView.getVisibility() == View.VISIBLE) {
341 LayoutParams lp = (LayoutParams) mSurfaceView.getLayoutParams();
342 lp.width = (int) mSurfaceTextureUncroppedWidth;
343 lp.height = (int) mSurfaceTextureUncroppedHeight;
344 lp.gravity = Gravity.CENTER;
345 mSurfaceView.requestLayout();
346 }
Doris Liu6432cd62013-06-13 17:20:31 -0700347 }
348
Sascha Haeberling37f36112013-08-06 14:31:52 -0700349 /**
350 * Starts a flash animation
351 */
352 public void animateFlash() {
353 mAnimationManager.startFlashAnimation(mFlashOverlay);
354 }
355
356 /**
357 * Starts a capture animation
Doris Liu3973deb2013-08-21 13:42:22 -0700358 */
359 public void animateCapture() {
360 Bitmap bitmap = null;
Likai Ding40d36372014-11-20 08:00:28 +0800361 if (mTextureView != null) {
362 bitmap = mTextureView.getBitmap((int) mSurfaceTextureUncroppedWidth / 2,
363 (int) mSurfaceTextureUncroppedHeight / 2);
364 }
Doris Liu3973deb2013-08-21 13:42:22 -0700365 animateCapture(bitmap);
366 }
367
368 /**
369 * Starts a capture animation
Sascha Haeberling37f36112013-08-06 14:31:52 -0700370 * @param bitmap the captured image that we shrink and slide in the animation
371 */
372 public void animateCapture(Bitmap bitmap) {
Doris Liu3973deb2013-08-21 13:42:22 -0700373 if (bitmap == null) {
374 Log.e(TAG, "No valid bitmap for capture animation.");
375 return;
376 }
Likai Ding512a1ad2014-11-20 08:00:10 +0800377 ((ImageView) mPreviewThumb).setImageBitmap(bitmap);
Sascha Haeberling37f36112013-08-06 14:31:52 -0700378 mAnimationManager.startCaptureAnimation(mPreviewThumb);
379 }
380
381 /**
382 * Cancels on-going animations
383 */
384 public void cancelAnimations() {
385 mAnimationManager.cancelAnimations();
386 }
387
Doris Liu6432cd62013-06-13 17:20:31 -0700388 public void hideUI() {
Doris Liu6432cd62013-06-13 17:20:31 -0700389 mSwitcher.closePopup();
Byunghun Jeon802f5132014-06-16 17:42:26 -0700390 if (mUIhidden)
391 return;
392 mUIhidden = true;
393 mCameraControls.hideUI();
Doris Liu6432cd62013-06-13 17:20:31 -0700394 }
395
396 public void showUI() {
Likai Ding546ba362014-11-21 01:52:54 +0800397 if (!mUIhidden || (mCustomVideoMenu != null && mCustomVideoMenu.isMenuBeingShown()))
Byunghun Jeon802f5132014-06-16 17:42:26 -0700398 return;
399 mUIhidden = false;
400 mCameraControls.showUI();
Doris Liu6432cd62013-06-13 17:20:31 -0700401 }
402
Erin Dahlgren3044d8c2013-10-10 18:23:45 -0700403 public boolean arePreviewControlsVisible() {
Byunghun Jeon802f5132014-06-16 17:42:26 -0700404 return !mUIhidden;
Erin Dahlgren3044d8c2013-10-10 18:23:45 -0700405 }
406
Doris Liu6432cd62013-06-13 17:20:31 -0700407 public void hideSwitcher() {
408 mSwitcher.closePopup();
409 mSwitcher.setVisibility(View.INVISIBLE);
410 }
411
412 public void showSwitcher() {
413 mSwitcher.setVisibility(View.VISIBLE);
414 }
415
Doris Liu6827ce22013-03-12 19:24:28 -0700416 public boolean collapseCameraControls() {
417 boolean ret = false;
Byunghun Jeon802f5132014-06-16 17:42:26 -0700418 mSwitcher.closePopup();
Likai Ding546ba362014-11-21 01:52:54 +0800419 if (mCustomVideoMenu != null) {
420 mCustomVideoMenu.closeAllView();
Byunghun Jeon802f5132014-06-16 17:42:26 -0700421 }
Doris Liu6827ce22013-03-12 19:24:28 -0700422 if (mPopup != null) {
423 dismissPopup(false);
424 ret = true;
425 }
426 return ret;
427 }
428
429 public boolean removeTopLevelPopup() {
430 if (mPopup != null) {
431 dismissPopup(true);
432 return true;
433 }
434 return false;
435 }
436
437 public void enableCameraControls(boolean enable) {
438 if (mGestures != null) {
439 mGestures.setZoomOnly(!enable);
440 }
441 if (mPieRenderer != null && mPieRenderer.showsItems()) {
442 mPieRenderer.hide();
443 }
444 }
445
Doris Liu59390062013-10-10 17:20:56 -0700446 public void initDisplayChangeListener() {
447 ((CameraRootView) mRootView).setDisplayChangeListener(this);
448 }
449
Byunghun Jeon802f5132014-06-16 17:42:26 -0700450 public void setDisplayOrientation(int orientation) {
451 if ((mPreviewOrientation == -1 || mPreviewOrientation != orientation)
Likai Ding546ba362014-11-21 01:52:54 +0800452 && mCustomVideoMenu != null && mCustomVideoMenu.isPreviewMenuBeingShown()) {
Byunghun Jeon802f5132014-06-16 17:42:26 -0700453 dismissSceneModeMenu();
Likai Ding546ba362014-11-21 01:52:54 +0800454 mCustomVideoMenu.addModeBack();
Byunghun Jeon802f5132014-06-16 17:42:26 -0700455 }
456 mPreviewOrientation = orientation;
457 }
458
Doris Liu59390062013-10-10 17:20:56 -0700459 public void removeDisplayChangeListener() {
460 ((CameraRootView) mRootView).removeDisplayChangeListener();
461 }
462
Doris Liu6827ce22013-03-12 19:24:28 -0700463 public void overrideSettings(final String... keyvalues) {
Dimitar Borisov19656472014-09-24 17:32:06 +0300464 if (mVideoMenu != null) {
465 mVideoMenu.overrideSettings(keyvalues);
466 }
Doris Liu6827ce22013-03-12 19:24:28 -0700467 }
468
Doris Liu6827ce22013-03-12 19:24:28 -0700469 public void setOrientationIndicator(int orientation, boolean animation) {
Doris Liu6827ce22013-03-12 19:24:28 -0700470 // We change the orientation of the linearlayout only for phone UI
471 // because when in portrait the width is not enough.
472 if (mLabelsLinearLayout != null) {
473 if (((orientation / 90) & 1) == 0) {
474 mLabelsLinearLayout.setOrientation(LinearLayout.VERTICAL);
475 } else {
476 mLabelsLinearLayout.setOrientation(LinearLayout.HORIZONTAL);
477 }
478 }
479 mRecordingTimeRect.setOrientation(0, animation);
480 }
481
482 public SurfaceHolder getSurfaceHolder() {
Likai Ding40d36372014-11-20 08:00:28 +0800483 return mSurfaceView.getHolder();
Doris Liu6827ce22013-03-12 19:24:28 -0700484 }
485
486 public void hideSurfaceView() {
Doris Liu6432cd62013-06-13 17:20:31 -0700487 mSurfaceView.setVisibility(View.GONE);
Likai Ding40d36372014-11-20 08:00:28 +0800488 mTextureView.setVisibility(View.VISIBLE);
Doris Liu6432cd62013-06-13 17:20:31 -0700489 setTransformMatrix(mPreviewWidth, mPreviewHeight);
Doris Liu6827ce22013-03-12 19:24:28 -0700490 }
491
492 public void showSurfaceView() {
Doris Liu6432cd62013-06-13 17:20:31 -0700493 mSurfaceView.setVisibility(View.VISIBLE);
Likai Ding40d36372014-11-20 08:00:28 +0800494 mTextureView.setVisibility(View.GONE);
Doris Liu6432cd62013-06-13 17:20:31 -0700495 setTransformMatrix(mPreviewWidth, mPreviewHeight);
Doris Liu6827ce22013-03-12 19:24:28 -0700496 }
497
498 private void initializeOverlay() {
499 mRenderOverlay = (RenderOverlay) mRootView.findViewById(R.id.render_overlay);
500 if (mPieRenderer == null) {
501 mPieRenderer = new PieRenderer(mActivity);
Likai Ding546ba362014-11-21 01:52:54 +0800502 mVideoMenu = new VideoMenu(mActivity, this, mPieRenderer);
Doris Liu6827ce22013-03-12 19:24:28 -0700503 mPieRenderer.setPieListener(this);
504 }
Likai Ding546ba362014-11-21 01:52:54 +0800505 if (mCustomVideoMenu == null) {
506 mCustomVideoMenu = new CustomVideoMenu(mActivity, this);
Byunghun Jeon802f5132014-06-16 17:42:26 -0700507 }
Doris Liu6827ce22013-03-12 19:24:28 -0700508 mRenderOverlay.addRenderer(mPieRenderer);
509 if (mZoomRenderer == null) {
510 mZoomRenderer = new ZoomRenderer(mActivity);
511 }
512 mRenderOverlay.addRenderer(mZoomRenderer);
513 if (mGestures == null) {
Doris Liu6432cd62013-06-13 17:20:31 -0700514 mGestures = new PreviewGestures(mActivity, this, mZoomRenderer, mPieRenderer);
515 mRenderOverlay.setGestures(mGestures);
Doris Liu6827ce22013-03-12 19:24:28 -0700516 }
Likai Ding546ba362014-11-21 01:52:54 +0800517 mGestures.setCustomVideoMenu(mCustomVideoMenu);
Byunghun Jeon802f5132014-06-16 17:42:26 -0700518
Doris Liu6827ce22013-03-12 19:24:28 -0700519 mGestures.setRenderOverlay(mRenderOverlay);
Sascha Haeberling4f91ab52013-05-21 11:26:13 -0700520
Likai Ding512a1ad2014-11-20 08:00:10 +0800521 mPreviewThumb = mRootView.findViewById(R.id.preview_thumb);
Sascha Haeberling4f91ab52013-05-21 11:26:13 -0700522 mPreviewThumb.setOnClickListener(new OnClickListener() {
523 @Override
524 public void onClick(View v) {
Doris Liufe6596c2013-10-08 11:03:37 -0700525 // Do not allow navigation to filmstrip during video recording
Byunghun Jeon802f5132014-06-16 17:42:26 -0700526 if (!mRecordingStarted && !CameraControls.isAnimating()) {
Doris Liufe6596c2013-10-08 11:03:37 -0700527 mActivity.gotoGallery();
528 }
Sascha Haeberling4f91ab52013-05-21 11:26:13 -0700529 }
530 });
Byunghun Jeon802f5132014-06-16 17:42:26 -0700531
532 mActivity.setPreviewGestures(mGestures);
Doris Liu6827ce22013-03-12 19:24:28 -0700533 }
534
535 public void setPrefChangedListener(OnPreferenceChangedListener listener) {
536 mVideoMenu.setListener(listener);
Likai Ding546ba362014-11-21 01:52:54 +0800537 mCustomVideoMenu.setListener(listener);
Doris Liu6827ce22013-03-12 19:24:28 -0700538 }
539
540 private void initializeMiscControls() {
Doris Liu6827ce22013-03-12 19:24:28 -0700541 mReviewImage = (ImageView) mRootView.findViewById(R.id.review_image);
Doris Liu6827ce22013-03-12 19:24:28 -0700542 mShutterButton.setImageResource(R.drawable.btn_new_shutter_video);
543 mShutterButton.setOnShutterButtonListener(mController);
544 mShutterButton.setVisibility(View.VISIBLE);
545 mShutterButton.requestFocus();
546 mShutterButton.enableTouch(true);
547 mRecordingTimeView = (TextView) mRootView.findViewById(R.id.recording_time);
548 mRecordingTimeRect = (RotateLayout) mRootView.findViewById(R.id.recording_time_rect);
549 mTimeLapseLabel = mRootView.findViewById(R.id.time_lapse_label);
550 // The R.id.labels can only be found in phone layout.
551 // That is, mLabelsLinearLayout should be null in tablet layout.
552 mLabelsLinearLayout = (LinearLayout) mRootView.findViewById(R.id.labels);
553 }
554
Manikanta Kanamarlapudiae019672014-01-06 14:31:43 +0530555 private void initializePauseButton() {
556 mPauseButton = (PauseButton) mRootView.findViewById(R.id.video_pause);
557 mPauseButton.setOnPauseButtonListener(this);
558 }
559
Michael Kolb87880792013-04-30 15:38:49 -0700560 public void updateOnScreenIndicators(Parameters param, ComboPreferences prefs) {
Sascha Haeberling140c2632013-04-23 09:58:51 -0700561 mOnScreenIndicators.updateFlashOnScreenIndicator(param.getFlashMode());
Michael Kolb87880792013-04-30 15:38:49 -0700562 boolean location = RecordLocationPreference.get(
563 prefs, mActivity.getContentResolver());
564 mOnScreenIndicators.updateLocationIndicator(location);
565
Doris Liu6827ce22013-03-12 19:24:28 -0700566 }
567
568 public void setAspectRatio(double ratio) {
Santhosh Kumar H E6bc53a12013-10-25 13:14:10 +0530569 if (mOrientationResize &&
570 mActivity.getResources().getConfiguration().orientation
571 != Configuration.ORIENTATION_PORTRAIT) {
572 ratio = 1 / ratio;
573 }
574
Likai Ding40d36372014-11-20 08:00:28 +0800575 if (ratio != mAspectRatio){
Santhosh Kumar H E6bc53a12013-10-25 13:14:10 +0530576 mAspectRatioResize = true;
577 mAspectRatio = (float)ratio;
578 }
Likai Ding40d36372014-11-20 08:00:28 +0800579 mHandler.sendEmptyMessage(UPDATE_TRANSFORM_MATRIX);
Santhosh Kumar H E6bc53a12013-10-25 13:14:10 +0530580
Doris Liu6827ce22013-03-12 19:24:28 -0700581 }
582
583 public void showTimeLapseUI(boolean enable) {
584 if (mTimeLapseLabel != null) {
585 mTimeLapseLabel.setVisibility(enable ? View.VISIBLE : View.GONE);
586 }
Kerong Suiea667a62014-04-08 17:52:03 +0800587 mIsTimeLapse = enable;
Doris Liu6827ce22013-03-12 19:24:28 -0700588 }
589
Michael Kolb3bc96b22013-03-12 10:24:42 -0700590 private void openMenu() {
591 if (mPieRenderer != null) {
592 mPieRenderer.showInCenter();
593 }
594 }
595
Doris Liu6827ce22013-03-12 19:24:28 -0700596 public void dismissPopup(boolean topLevelOnly) {
Doris Liu69ef5ea2013-05-07 13:48:10 -0700597 // In review mode, we do not want to bring up the camera UI
598 if (mController.isInReviewMode()) return;
Doris Liu6827ce22013-03-12 19:24:28 -0700599 if (mPopup != null) {
Doris Liuc3679c02013-08-08 18:08:43 -0700600 mPopup.dismiss(topLevelOnly);
Doris Liu6827ce22013-03-12 19:24:28 -0700601 }
Doris Liuc3679c02013-08-08 18:08:43 -0700602 }
603
604 private void popupDismissed() {
605 mPopup = null;
606 }
607
Byunghun Jeon802f5132014-06-16 17:42:26 -0700608 public boolean onBackPressed() {
Likai Ding546ba362014-11-21 01:52:54 +0800609 if (mCustomVideoMenu != null && mCustomVideoMenu.handleBackKey()) {
Byunghun Jeon802f5132014-06-16 17:42:26 -0700610 return true;
611 }
612 if (hidePieRenderer()) {
613 return true;
614 } else {
615 return removeTopLevelPopup();
616 }
617 }
618
619 public void cleanupListview() {
620 showUI();
621 mActivity.setSystemBarsVisibility(false);
622 }
623
624 public void dismissLevel1() {
625 if (mMenuLayout != null) {
626 ((ViewGroup) mRootView).removeView(mMenuLayout);
627 mMenuLayout = null;
628 }
629 }
630
631 public void dismissLevel2() {
632 if (mSubMenuLayout != null) {
633 ((ViewGroup) mRootView).removeView(mSubMenuLayout);
634 mSubMenuLayout = null;
635 }
636 }
637
638 public boolean sendTouchToPreviewMenu(MotionEvent ev) {
639 return mPreviewMenuLayout.dispatchTouchEvent(ev);
640 }
641
642 public boolean sendTouchToMenu(MotionEvent ev) {
643 View v = mMenuLayout.getChildAt(0);
644 return v.dispatchTouchEvent(ev);
645 }
646
647 public void dismissSceneModeMenu() {
648 if (mPreviewMenuLayout != null) {
649 ((ViewGroup) mRootView).removeView(mPreviewMenuLayout);
650 mPreviewMenuLayout = null;
651 }
652 }
653
654 public void removeSceneModeMenu() {
655 if (mPreviewMenuLayout != null) {
656 ((ViewGroup) mRootView).removeView(mPreviewMenuLayout);
657 mPreviewMenuLayout = null;
658 }
659 cleanupListview();
660 }
661
662 public void removeLevel2() {
663 if (mSubMenuLayout != null) {
664 View v = mSubMenuLayout.getChildAt(0);
665 mSubMenuLayout.removeView(v);
666 }
667 }
668
669 public void showPopup(ListView popup, int level, boolean animate) {
670 hideUI();
671
672 popup.setVisibility(View.VISIBLE);
673 if (level == 1) {
674 if (mMenuLayout == null) {
675 mMenuLayout = new LinearLayout(mActivity);
676 ViewGroup.LayoutParams params = new ViewGroup.LayoutParams(
677 CameraActivity.SETTING_LIST_WIDTH_1, LayoutParams.WRAP_CONTENT);
678 mMenuLayout.setLayoutParams(params);
679 ((ViewGroup) mRootView).addView(mMenuLayout);
680 }
681 mMenuLayout.addView(popup);
682 }
683 if (level == 2) {
684 if (mSubMenuLayout == null) {
685 mSubMenuLayout = new LinearLayout(mActivity);
686 ViewGroup.LayoutParams params = new ViewGroup.LayoutParams(
687 CameraActivity.SETTING_LIST_WIDTH_2, LayoutParams.WRAP_CONTENT);
688 mSubMenuLayout.setLayoutParams(params);
689
690 ((ViewGroup) mRootView).addView(mSubMenuLayout);
691 }
692 mSubMenuLayout.addView(popup);
693 mSubMenuLayout.setX(CameraActivity.SETTING_LIST_WIDTH_1);
694 }
695 if (animate) {
696 if (level == 1)
Likai Ding546ba362014-11-21 01:52:54 +0800697 mCustomVideoMenu.animateSlideIn(popup, CameraActivity.SETTING_LIST_WIDTH_1, true);
Byunghun Jeon802f5132014-06-16 17:42:26 -0700698 if (level == 2)
Likai Ding546ba362014-11-21 01:52:54 +0800699 mCustomVideoMenu.animateFadeIn(popup);
Byunghun Jeon802f5132014-06-16 17:42:26 -0700700 }
701 else
702 popup.setAlpha(0.85f);
703 }
704
705 public ViewGroup getMenuLayout() {
706 return mMenuLayout;
707 }
708
709 public void setPreviewMenuLayout(LinearLayout layout) {
710 mPreviewMenuLayout = layout;
711 }
712
713 public ViewGroup getPreviewMenuLayout() {
714 return mPreviewMenuLayout;
715 }
716
Doris Liuc3679c02013-08-08 18:08:43 -0700717 public void showPopup(AbstractSettingPopup popup) {
718 hideUI();
719
720 if (mPopup != null) {
721 mPopup.dismiss(false);
722 }
723 mPopup = new SettingsPopup(popup);
Doris Liu6827ce22013-03-12 19:24:28 -0700724 }
725
726 public void onShowSwitcherPopup() {
727 hidePieRenderer();
728 }
729
730 public boolean hidePieRenderer() {
731 if (mPieRenderer != null && mPieRenderer.showsItems()) {
732 mPieRenderer.hide();
733 return true;
734 }
735 return false;
736 }
737
Doris Liu61f2b082013-03-27 17:25:43 -0700738 // disable preview gestures after shutter is pressed
739 public void setShutterPressed(boolean pressed) {
740 if (mGestures == null) return;
741 mGestures.setEnabled(!pressed);
742 }
743
Doris Liu6827ce22013-03-12 19:24:28 -0700744 public void enableShutter(boolean enable) {
745 if (mShutterButton != null) {
Shalaj Jain467b4f22014-11-10 14:01:09 -0800746 if (enable) {
747 Log.v(TAG, "Shutter Button enabled !!");
748 } else {
749 Log.v(TAG, "Shutter Button disabled !!");
750 }
Doris Liu6827ce22013-03-12 19:24:28 -0700751 mShutterButton.setEnabled(enable);
752 }
753 }
754
755 // PieListener
756 @Override
757 public void onPieOpened(int centerX, int centerY) {
Doris Liu6432cd62013-06-13 17:20:31 -0700758 setSwipingEnabled(false);
Andy Huibers249653e2013-11-11 22:30:49 -0800759 // Close module selection menu when pie menu is opened.
760 mSwitcher.closePopup();
Doris Liu6827ce22013-03-12 19:24:28 -0700761 }
762
763 @Override
764 public void onPieClosed() {
Doris Liu6432cd62013-06-13 17:20:31 -0700765 setSwipingEnabled(true);
766 }
767
768 public void setSwipingEnabled(boolean enable) {
769 mActivity.setSwipingEnabled(enable);
Doris Liu6827ce22013-03-12 19:24:28 -0700770 }
771
772 public void showPreviewBorder(boolean enable) {
Doris Liu6432cd62013-06-13 17:20:31 -0700773 // TODO: mPreviewFrameLayout.showBorder(enable);
Doris Liu6827ce22013-03-12 19:24:28 -0700774 }
775
776 // SingleTapListener
777 // Preview area is touched. Take a picture.
778 @Override
779 public void onSingleTapUp(View view, int x, int y) {
780 mController.onSingleTapUp(view, x, y);
781 }
782
Doris Liufe6596c2013-10-08 11:03:37 -0700783 public void showRecordingUI(boolean recording) {
784 mRecordingStarted = recording;
Doris Liu6432cd62013-06-13 17:20:31 -0700785 mMenuButton.setVisibility(recording ? View.GONE : View.VISIBLE);
Doris Liu6827ce22013-03-12 19:24:28 -0700786 mOnScreenIndicators.setVisibility(recording ? View.GONE : View.VISIBLE);
787 if (recording) {
Byunghun Jeon802f5132014-06-16 17:42:26 -0700788 mShutterButton.setImageResource(R.drawable.shutter_button_video_stop);
Doris Liu6432cd62013-06-13 17:20:31 -0700789 hideSwitcher();
Doris Liu6827ce22013-03-12 19:24:28 -0700790 mRecordingTimeView.setText("");
791 mRecordingTimeView.setVisibility(View.VISIBLE);
Kerong Suiea667a62014-04-08 17:52:03 +0800792 mPauseButton.setVisibility(mIsTimeLapse ? View.GONE : View.VISIBLE);
Doris Liu6827ce22013-03-12 19:24:28 -0700793 } else {
794 mShutterButton.setImageResource(R.drawable.btn_new_shutter_video);
Doris Liu2a7f44c2013-08-12 15:18:53 -0700795 if (!mController.isVideoCaptureIntent()) {
796 showSwitcher();
797 }
Doris Liu6827ce22013-03-12 19:24:28 -0700798 mRecordingTimeView.setVisibility(View.GONE);
Manikanta Kanamarlapudiae019672014-01-06 14:31:43 +0530799 mPauseButton.setVisibility(View.GONE);
Doris Liu6827ce22013-03-12 19:24:28 -0700800 }
801 }
802
Byunghun Jeon802f5132014-06-16 17:42:26 -0700803 public void hideUIwhileRecording() {
Likai Ding546ba362014-11-21 01:52:54 +0800804 mCustomVideoMenu.hideUI();
Byunghun Jeon802f5132014-06-16 17:42:26 -0700805 }
806
807 public void showUIafterRecording() {
Likai Ding546ba362014-11-21 01:52:54 +0800808 mCustomVideoMenu.showUI();
Byunghun Jeon802f5132014-06-16 17:42:26 -0700809 }
810
Doris Liu6827ce22013-03-12 19:24:28 -0700811 public void showReviewImage(Bitmap bitmap) {
812 mReviewImage.setImageBitmap(bitmap);
813 mReviewImage.setVisibility(View.VISIBLE);
814 }
815
816 public void showReviewControls() {
Angus Kongb50b5cb2013-08-09 14:55:20 -0700817 CameraUtil.fadeOut(mShutterButton);
818 CameraUtil.fadeIn(mReviewDoneButton);
819 CameraUtil.fadeIn(mReviewPlayButton);
Doris Liu6827ce22013-03-12 19:24:28 -0700820 mReviewImage.setVisibility(View.VISIBLE);
Doris Liu6432cd62013-06-13 17:20:31 -0700821 mMenuButton.setVisibility(View.GONE);
Doris Liu6827ce22013-03-12 19:24:28 -0700822 mOnScreenIndicators.setVisibility(View.GONE);
823 }
824
825 public void hideReviewUI() {
826 mReviewImage.setVisibility(View.GONE);
827 mShutterButton.setEnabled(true);
Doris Liu6432cd62013-06-13 17:20:31 -0700828 mMenuButton.setVisibility(View.VISIBLE);
Doris Liu6827ce22013-03-12 19:24:28 -0700829 mOnScreenIndicators.setVisibility(View.VISIBLE);
Angus Kongb50b5cb2013-08-09 14:55:20 -0700830 CameraUtil.fadeOut(mReviewDoneButton);
831 CameraUtil.fadeOut(mReviewPlayButton);
832 CameraUtil.fadeIn(mShutterButton);
Doris Liu6827ce22013-03-12 19:24:28 -0700833 }
834
835 private void setShowMenu(boolean show) {
Kerong Sui8c238462014-04-08 15:49:29 +0800836 if (mController.isVideoCaptureIntent())
837 return;
Doris Liu6827ce22013-03-12 19:24:28 -0700838 if (mOnScreenIndicators != null) {
839 mOnScreenIndicators.setVisibility(show ? View.VISIBLE : View.GONE);
840 }
Doris Liu6827ce22013-03-12 19:24:28 -0700841 }
842
ztenghui7b265a62013-09-09 14:58:44 -0700843 public void onPreviewFocusChanged(boolean previewFocused) {
844 if (previewFocused) {
Doris Liu6432cd62013-06-13 17:20:31 -0700845 showUI();
846 } else {
847 hideUI();
848 }
Doris Liu6827ce22013-03-12 19:24:28 -0700849 if (mGestures != null) {
ztenghui7b265a62013-09-09 14:58:44 -0700850 mGestures.setEnabled(previewFocused);
Doris Liu6827ce22013-03-12 19:24:28 -0700851 }
Doris Liu6827ce22013-03-12 19:24:28 -0700852 if (mRenderOverlay != null) {
853 // this can not happen in capture mode
ztenghui7b265a62013-09-09 14:58:44 -0700854 mRenderOverlay.setVisibility(previewFocused ? View.VISIBLE : View.GONE);
Doris Liu6827ce22013-03-12 19:24:28 -0700855 }
ztenghui7b265a62013-09-09 14:58:44 -0700856 setShowMenu(previewFocused);
Doris Liu6827ce22013-03-12 19:24:28 -0700857 }
858
859 public void initializePopup(PreferenceGroup pref) {
860 mVideoMenu.initialize(pref);
Likai Ding546ba362014-11-21 01:52:54 +0800861 mCustomVideoMenu.initialize(pref);
Doris Liu6827ce22013-03-12 19:24:28 -0700862 }
863
864 public void initializeZoom(Parameters param) {
Doris Liu6432cd62013-06-13 17:20:31 -0700865 if (param == null || !param.isZoomSupported()) {
866 mGestures.setZoomEnabled(false);
867 return;
868 }
869 mGestures.setZoomEnabled(true);
Doris Liu6827ce22013-03-12 19:24:28 -0700870 mZoomMax = param.getMaxZoom();
871 mZoomRatios = param.getZoomRatios();
872 // Currently we use immediate zoom for fast zooming to get better UX and
873 // there is no plan to take advantage of the smooth zoom.
874 mZoomRenderer.setZoomMax(mZoomMax);
875 mZoomRenderer.setZoom(param.getZoom());
876 mZoomRenderer.setZoomValue(mZoomRatios.get(param.getZoom()));
877 mZoomRenderer.setOnZoomChangeListener(new ZoomChangeListener());
878 }
879
880 public void clickShutter() {
881 mShutterButton.performClick();
882 }
883
884 public void pressShutter(boolean pressed) {
885 mShutterButton.setPressed(pressed);
886 }
887
Doris Liu6432cd62013-06-13 17:20:31 -0700888 public View getShutterButton() {
889 return mShutterButton;
Doris Liu6827ce22013-03-12 19:24:28 -0700890 }
891
892 public void setRecordingTime(String text) {
893 mRecordingTimeView.setText(text);
894 }
895
896 public void setRecordingTimeTextColor(int color) {
897 mRecordingTimeView.setTextColor(color);
898 }
899
Doris Liu6432cd62013-06-13 17:20:31 -0700900 public boolean isVisible() {
ztenghui285a5be2013-10-09 15:59:47 -0700901 return mCameraControls.getVisibility() == View.VISIBLE;
Doris Liu6432cd62013-06-13 17:20:31 -0700902 }
903
ztenghui7b265a62013-09-09 14:58:44 -0700904 @Override
Doris Liu6432cd62013-06-13 17:20:31 -0700905 public void onDisplayChanged() {
906 mCameraControls.checkLayoutFlip();
907 mController.updateCameraOrientation();
908 }
909
Doris Liu6827ce22013-03-12 19:24:28 -0700910 private class ZoomChangeListener implements ZoomRenderer.OnZoomChangedListener {
911 @Override
912 public void onZoomValueChanged(int index) {
913 int newZoom = mController.onZoomChanged(index);
914 if (mZoomRenderer != null) {
915 mZoomRenderer.setZoomValue(mZoomRatios.get(newZoom));
916 }
917 }
918
919 @Override
920 public void onZoomStart() {
Alok Kediya23f3cf52013-10-02 17:42:36 +0530921 if (mPieRenderer != null) {
Santhosh Kumar H E78702742013-10-25 19:01:33 +0530922 if (!mRecordingStarted) mPieRenderer.hide();
Alok Kediya23f3cf52013-10-02 17:42:36 +0530923 mPieRenderer.setBlockFocus(true);
924 }
Doris Liu6827ce22013-03-12 19:24:28 -0700925 }
926
927 @Override
928 public void onZoomEnd() {
Alok Kediya23f3cf52013-10-02 17:42:36 +0530929 if (mPieRenderer != null) {
930 mPieRenderer.setBlockFocus(false);
931 }
Doris Liu6827ce22013-03-12 19:24:28 -0700932 }
933 }
Michael Kolb3bc96b22013-03-12 10:24:42 -0700934
Likai Ding40d36372014-11-20 08:00:28 +0800935 public SurfaceTexture getSurfaceTexture() {
936 return mSurfaceTexture;
937 }
938
939 // SurfaceTexture callbacks
Michael Kolb3bc96b22013-03-12 10:24:42 -0700940 @Override
Likai Ding40d36372014-11-20 08:00:28 +0800941 public void onSurfaceTextureAvailable(SurfaceTexture surface, int width, int height) {
942 mSurfaceTexture = surface;
943 mController.onPreviewUIReady();
944 }
945
946 @Override
947 public boolean onSurfaceTextureDestroyed(SurfaceTexture surface) {
948 mSurfaceTexture = null;
949 mController.onPreviewUIDestroyed();
950 Log.d(TAG, "surfaceTexture is destroyed");
951 return true;
952 }
953
954 @Override
955 public void onSurfaceTextureSizeChanged(SurfaceTexture surface, int width, int height) {
956 }
957
958 @Override
959 public void onSurfaceTextureUpdated(SurfaceTexture surface) {
Andy Huibersfccf83b2013-11-06 14:37:26 -0800960 // Make sure preview cover is hidden if preview data is available.
961 if (mPreviewCover.getVisibility() != View.GONE) {
962 mPreviewCover.setVisibility(View.GONE);
963 }
Doris Liu6432cd62013-06-13 17:20:31 -0700964 }
965
Likai Ding40d36372014-11-20 08:00:28 +0800966 // SurfaceHolder callbacks
967 @Override
968 public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
969 Log.v(TAG, "Surface changed. width=" + width + ". height=" + height);
970 }
971
Doris Liu6432cd62013-06-13 17:20:31 -0700972 @Override
973 public void surfaceCreated(SurfaceHolder holder) {
Likai Ding40d36372014-11-20 08:00:28 +0800974 Log.v(TAG, "Surface created");
Doris Liu6432cd62013-06-13 17:20:31 -0700975 }
976
977 @Override
978 public void surfaceDestroyed(SurfaceHolder holder) {
Likai Ding40d36372014-11-20 08:00:28 +0800979 Log.v(TAG, "Surface destroyed");
980 mController.stopPreview();
Sascha Haeberling4f91ab52013-05-21 11:26:13 -0700981 }
Manikanta Kanamarlapudiae019672014-01-06 14:31:43 +0530982
Byunghun Jeon802f5132014-06-16 17:42:26 -0700983 public View getRootView() {
984 return mRootView;
985 }
986
Manikanta Kanamarlapudiae019672014-01-06 14:31:43 +0530987 @Override
988 public void onButtonPause() {
989 mRecordingTimeView.setCompoundDrawablesWithIntrinsicBounds(
Likai Ding40d36372014-11-20 08:00:28 +0800990 R.drawable.ic_pausing_indicator, 0, 0, 0);
991 mController.onButtonPause();
Manikanta Kanamarlapudiae019672014-01-06 14:31:43 +0530992 }
993
994 @Override
995 public void onButtonContinue() {
996 mRecordingTimeView.setCompoundDrawablesWithIntrinsicBounds(
Likai Ding40d36372014-11-20 08:00:28 +0800997 R.drawable.ic_recording_indicator, 0, 0, 0);
Manikanta Kanamarlapudiae019672014-01-06 14:31:43 +0530998 mController.onButtonContinue();
999 }
1000
1001 public void resetPauseButton() {
1002 mRecordingTimeView.setCompoundDrawablesWithIntrinsicBounds(
1003 R.drawable.ic_recording_indicator, 0, 0, 0);
1004 mPauseButton.setPaused(false);
1005 }
kaiyizde529662014-07-21 16:47:27 +08001006
1007 public void setPreference(String key, String value) {
1008 mVideoMenu.setPreference(key, value);
1009 }
Byunghun Jeon802f5132014-06-16 17:42:26 -07001010
1011 public boolean hideSwitcherPopup() {
1012 if (mSwitcher != null && mSwitcher.showsPopup()) {
1013 mSwitcher.closePopup();
1014 return true;
1015 }
1016 return false;
1017 }
Doris Liu6827ce22013-03-12 19:24:28 -07001018}