blob: 6dd793d01089c6456b353cd0e033a1ed8592469c [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;
Doris Liuc3679c02013-08-08 18:08:43 -070025import android.graphics.drawable.ColorDrawable;
Doris Liu6827ce22013-03-12 19:24:28 -070026import android.hardware.Camera.Parameters;
Doris Liu6432cd62013-06-13 17:20:31 -070027import android.os.Handler;
28import android.os.Message;
Doris Liu6827ce22013-03-12 19:24:28 -070029import android.util.Log;
30import android.view.Gravity;
Doris Liu6827ce22013-03-12 19:24:28 -070031import android.view.SurfaceHolder;
Byunghun Jeon6ee7e412014-08-29 17:56:11 -070032import android.view.SurfaceHolder.Callback;
Doris Liu6432cd62013-06-13 17:20:31 -070033import android.view.SurfaceView;
Byunghun Jeon802f5132014-06-16 17:42:26 -070034import android.view.MotionEvent;
Doris Liu6827ce22013-03-12 19:24:28 -070035import android.view.View;
36import android.view.View.OnClickListener;
Doris Liu6432cd62013-06-13 17:20:31 -070037import android.view.View.OnLayoutChangeListener;
Doris Liu6827ce22013-03-12 19:24:28 -070038import android.view.ViewGroup;
Byunghun Jeon802f5132014-06-16 17:42:26 -070039import android.view.ViewPropertyAnimator;
Byunghun Jeon6ee7e412014-08-29 17:56:11 -070040import android.widget.FrameLayout;
Doris Liu6827ce22013-03-12 19:24:28 -070041import android.widget.FrameLayout.LayoutParams;
42import android.widget.ImageView;
43import android.widget.LinearLayout;
Byunghun Jeon802f5132014-06-16 17:42:26 -070044import android.widget.ListView;
Doris Liuc3679c02013-08-08 18:08:43 -070045import android.widget.PopupWindow;
Doris Liu6827ce22013-03-12 19:24:28 -070046import android.widget.TextView;
47
Byunghun Jeon71b2bfc2014-10-13 18:34:37 -070048import com.android.camera.CameraActivity.UpdatePreviewThumbnail;
Doris Liu6827ce22013-03-12 19:24:28 -070049import 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,
Byunghun Jeon6ee7e412014-08-29 17:56:11 -070064 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;
Byunghun Jeon6ee7e412014-08-29 17:56:11 -070071 private SurfaceHolder mSurfaceHolder;
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;
Doris Liu6827ce22013-03-12 19:24:28 -070095 private VideoController mController;
96 private int mZoomMax;
97 private List<Integer> mZoomRatios;
Byunghun Jeon71b2bfc2014-10-13 18:34:37 -070098 private ImageView mPreviewThumb;
Sascha Haeberling37f36112013-08-06 14:31:52 -070099 private View mFlashOverlay;
Santhosh Kumar H E6bc53a12013-10-25 13:14:10 +0530100 private boolean mOrientationResize;
101 private boolean mPrevOrientationResize;
Kerong Suiea667a62014-04-08 17:52:03 +0800102 private boolean mIsTimeLapse = false;
Byunghun Jeon802f5132014-06-16 17:42:26 -0700103 private LinearLayout mMenuLayout;
104 private LinearLayout mSubMenuLayout;
105 private LinearLayout mPreviewMenuLayout;
Likai Ding546ba362014-11-21 01:52:54 +0800106 private CustomVideoMenu mCustomVideoMenu;
Doris Liu6827ce22013-03-12 19:24:28 -0700107
Doris Liu3a45c332013-10-15 19:10:28 -0700108 private View mPreviewCover;
Doris Liu6432cd62013-06-13 17:20:31 -0700109 private SurfaceView mSurfaceView = null;
110 private int mPreviewWidth = 0;
111 private int mPreviewHeight = 0;
Doris Liu6432cd62013-06-13 17:20:31 -0700112 private float mAspectRatio = 4f / 3f;
Santhosh Kumar H E6bc53a12013-10-25 13:14:10 +0530113 private boolean mAspectRatioResize;
Doris Liu6432cd62013-06-13 17:20:31 -0700114 private Matrix mMatrix = null;
Sascha Haeberling37f36112013-08-06 14:31:52 -0700115 private final AnimationManager mAnimationManager;
Byunghun Jeon802f5132014-06-16 17:42:26 -0700116 private boolean mUIhidden = false;
117 private int mPreviewOrientation = -1;
118
Byunghun Jeon6ee7e412014-08-29 17:56:11 -0700119 // temporary variables for updating SurfaceView
120 private int mTempWidth;
121 private int mTempHeight;
122
Doris Liu6432cd62013-06-13 17:20:31 -0700123 private final Handler mHandler = new Handler() {
124 @Override
125 public void handleMessage(Message msg) {
126 switch (msg.what) {
127 case UPDATE_TRANSFORM_MATRIX:
128 setTransformMatrix(mPreviewWidth, mPreviewHeight);
129 break;
130 default:
131 break;
132 }
133 }
134 };
Byunghun Jeon6ee7e412014-08-29 17:56:11 -0700135
136 private final Handler mSurfaceViewUpdateHandler = new Handler();
137
138 private Runnable updateSurfaceView = new Runnable() {
139
140 @Override
141 public void run() {
142 FrameLayout.LayoutParams params = (FrameLayout.LayoutParams) mSurfaceView
143 .getLayoutParams();
144 params.width = mTempWidth;
145 params.height = mTempHeight;
146 mSurfaceView.setLayoutParams(params);
147 }
148 };
149
Doris Liu6432cd62013-06-13 17:20:31 -0700150 private OnLayoutChangeListener mLayoutListener = new OnLayoutChangeListener() {
151 @Override
152 public void onLayoutChange(View v, int left, int top, int right,
153 int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) {
154 int width = right - left;
155 int height = bottom - top;
Byunghun Jeon6ee7e412014-08-29 17:56:11 -0700156
157 int orientation = mActivity.getResources().getConfiguration().orientation;
158 if ((orientation == Configuration.ORIENTATION_PORTRAIT && width > height)
159 || (orientation == Configuration.ORIENTATION_LANDSCAPE && width < height)) {
160 // The screen has rotated; swap SurfaceView width & height
161 // to ensure correct preview
162 int oldWidth = width;
163 width = height;
164 height = oldWidth;
165 Log.d(TAG, "Swapping SurfaceView width & height dimensions");
Doris Liu6432cd62013-06-13 17:20:31 -0700166 }
Byunghun Jeon6ee7e412014-08-29 17:56:11 -0700167
Santhosh Kumar H E6bc53a12013-10-25 13:14:10 +0530168 if (mPreviewWidth != width || mPreviewHeight != height
169 || (mOrientationResize != mPrevOrientationResize)
Byunghun Jeon6ee7e412014-08-29 17:56:11 -0700170 || mAspectRatioResize) {
Doris Liu6432cd62013-06-13 17:20:31 -0700171 mPreviewWidth = width;
172 mPreviewHeight = height;
Byunghun Jeon6ee7e412014-08-29 17:56:11 -0700173 setTransformMatrix(width, height);
Santhosh Kumar H E6bc53a12013-10-25 13:14:10 +0530174 mAspectRatioResize = false;
Doris Liu6432cd62013-06-13 17:20:31 -0700175 }
Likai Ding546ba362014-11-21 01:52:54 +0800176 mCustomVideoMenu.tryToCloseSubList();
Doris Liu6432cd62013-06-13 17:20:31 -0700177 }
178 };
179
Doris Liu3a45c332013-10-15 19:10:28 -0700180 public void showPreviewCover() {
181 mPreviewCover.setVisibility(View.VISIBLE);
182 }
183
Doris Liuc3679c02013-08-08 18:08:43 -0700184 private class SettingsPopup extends PopupWindow {
185 public SettingsPopup(View popup) {
186 super(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
187 setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
188 setOutsideTouchable(true);
189 setFocusable(true);
190 popup.setVisibility(View.VISIBLE);
191 setContentView(popup);
192 showAtLocation(mRootView, Gravity.CENTER, 0, 0);
193 }
194
195 public void dismiss(boolean topLevelOnly) {
196 super.dismiss();
197 popupDismissed();
198 showUI();
Likai Ding546ba362014-11-21 01:52:54 +0800199 mVideoMenu.popupDismissed(topLevelOnly);
Sascha Haeberling4ec139d2013-10-09 23:46:20 -0700200
201 // Switch back into fullscreen/lights-out mode after popup
202 // is dimissed.
203 mActivity.setSystemBarsVisibility(false);
Doris Liuc3679c02013-08-08 18:08:43 -0700204 }
205
206 @Override
207 public void dismiss() {
208 // Called by Framework when touch outside the popup or hit back key
209 dismiss(true);
210 }
211 }
212
Doris Liu6827ce22013-03-12 19:24:28 -0700213 public VideoUI(CameraActivity activity, VideoController controller, View parent) {
214 mActivity = activity;
215 mController = controller;
216 mRootView = parent;
Byunghun Jeon6ee7e412014-08-29 17:56:11 -0700217 mActivity.getLayoutInflater().inflate(R.layout.video_module,
218 (ViewGroup) mRootView, true);
Doris Liu3a45c332013-10-15 19:10:28 -0700219 mPreviewCover = mRootView.findViewById(R.id.preview_cover);
Byunghun Jeon6ee7e412014-08-29 17:56:11 -0700220 // display the view
221 mSurfaceView = (SurfaceView) mRootView.findViewById(R.id.mdp_preview_content);
222 mSurfaceView.setVisibility(View.VISIBLE);
223 mSurfaceHolder = mSurfaceView.getHolder();
224 mSurfaceHolder.addCallback(this);
225 mSurfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
226 mSurfaceView.addOnLayoutChangeListener(mLayoutListener);
227 Log.v(TAG, "Using mdp_preview_content (MDP path)");
228
Sascha Haeberling37f36112013-08-06 14:31:52 -0700229 mFlashOverlay = mRootView.findViewById(R.id.flash_overlay);
Doris Liu6432cd62013-06-13 17:20:31 -0700230 mShutterButton = (ShutterButton) mRootView.findViewById(R.id.shutter_button);
Angus Konged15d1a2013-08-19 15:06:12 -0700231 mSwitcher = (ModuleSwitcher) mRootView.findViewById(R.id.camera_switcher);
232 mSwitcher.setCurrentIndex(ModuleSwitcher.VIDEO_MODULE_INDEX);
233 mSwitcher.setSwitchListener(mActivity);
Byunghun Jeon6ee7e412014-08-29 17:56:11 -0700234
Doris Liu6827ce22013-03-12 19:24:28 -0700235 initializeMiscControls();
236 initializeControlByIntent();
237 initializeOverlay();
Manikanta Kanamarlapudiae019672014-01-06 14:31:43 +0530238 initializePauseButton();
Sascha Haeberling37f36112013-08-06 14:31:52 -0700239 mAnimationManager = new AnimationManager();
Santhosh Kumar H E6bc53a12013-10-25 13:14:10 +0530240 mOrientationResize = false;
241 mPrevOrientationResize = false;
Doris Liu6827ce22013-03-12 19:24:28 -0700242 }
243
Byunghun Jeon71b2bfc2014-10-13 18:34:37 -0700244 public void updatePreviewThumbnail() {
245 mPreviewThumb.setVisibility(View.VISIBLE);
246 Bitmap bitmap = mActivity.getPreviewThumbBitmap();
247 if (bitmap != null)
248 mPreviewThumb.setImageBitmap(bitmap);
249 else {
250 UpdatePreviewThumbnail task = mActivity.new UpdatePreviewThumbnail(mPreviewThumb);
251 task.execute();
252 }
253 }
254
255 public void updateWithNewPreviewThumbnail() {
256 mPreviewThumb.setVisibility(View.VISIBLE);
257 UpdatePreviewThumbnail task = mActivity.new UpdatePreviewThumbnail(mPreviewThumb);
258 task.execute();
259 }
260
Santhosh Kumar H E6bc53a12013-10-25 13:14:10 +0530261 public void cameraOrientationPreviewResize(boolean orientation){
262 mPrevOrientationResize = mOrientationResize;
263 mOrientationResize = orientation;
264 }
Doris Liu6432cd62013-06-13 17:20:31 -0700265
266 public void initializeSurfaceView() {
Byunghun Jeon6ee7e412014-08-29 17:56:11 -0700267 if (mSurfaceView == null) {
268 mSurfaceView = new SurfaceView(mActivity);
269 ((ViewGroup) mRootView).addView(mSurfaceView, 0);
270 mSurfaceHolder = mSurfaceView.getHolder();
271 mSurfaceHolder.addCallback(this);
272 }
Doris Liu6432cd62013-06-13 17:20:31 -0700273 }
274
Doris Liu6827ce22013-03-12 19:24:28 -0700275 private void initializeControlByIntent() {
Doris Liu2a7f44c2013-08-12 15:18:53 -0700276 mMenuButton = mRootView.findViewById(R.id.menu);
Doris Liu6432cd62013-06-13 17:20:31 -0700277 mMenuButton.setOnClickListener(new OnClickListener() {
Doris Liu6827ce22013-03-12 19:24:28 -0700278 @Override
279 public void onClick(View v) {
Likai Ding546ba362014-11-21 01:52:54 +0800280 mCustomVideoMenu.openFirstLevel();
Doris Liu6827ce22013-03-12 19:24:28 -0700281 }
282 });
Doris Liu6432cd62013-06-13 17:20:31 -0700283
Doris Liu2a7f44c2013-08-12 15:18:53 -0700284 mCameraControls = (CameraControls) mRootView.findViewById(R.id.camera_controls);
Michael Kolbeb8adc12013-04-26 11:09:29 -0700285 mOnScreenIndicators = new OnScreenIndicators(mActivity,
Doris Liu2a7f44c2013-08-12 15:18:53 -0700286 mRootView.findViewById(R.id.on_screen_indicators));
Sascha Haeberling140c2632013-04-23 09:58:51 -0700287 mOnScreenIndicators.resetToDefault();
Doris Liu6827ce22013-03-12 19:24:28 -0700288 if (mController.isVideoCaptureIntent()) {
Doris Liu6432cd62013-06-13 17:20:31 -0700289 hideSwitcher();
290 mActivity.getLayoutInflater().inflate(R.layout.review_module_control,
291 (ViewGroup) mCameraControls);
Doris Liu6827ce22013-03-12 19:24:28 -0700292 // Cannot use RotateImageView for "done" and "cancel" button because
293 // the tablet layout uses RotateLayout, which cannot be cast to
294 // RotateImageView.
Doris Liu2a7f44c2013-08-12 15:18:53 -0700295 mReviewDoneButton = mRootView.findViewById(R.id.btn_done);
296 mReviewCancelButton = mRootView.findViewById(R.id.btn_cancel);
297 mReviewPlayButton = mRootView.findViewById(R.id.btn_play);
Doris Liu6827ce22013-03-12 19:24:28 -0700298 mReviewCancelButton.setVisibility(View.VISIBLE);
299 mReviewDoneButton.setOnClickListener(new OnClickListener() {
300 @Override
301 public void onClick(View v) {
302 mController.onReviewDoneClicked(v);
303 }
304 });
305 mReviewCancelButton.setOnClickListener(new OnClickListener() {
306 @Override
307 public void onClick(View v) {
308 mController.onReviewCancelClicked(v);
309 }
310 });
311 mReviewPlayButton.setOnClickListener(new OnClickListener() {
312 @Override
313 public void onClick(View v) {
314 mController.onReviewPlayClicked(v);
315 }
316 });
317 }
318 }
319
Doris Liu6432cd62013-06-13 17:20:31 -0700320 public void setPreviewSize(int width, int height) {
321 if (width == 0 || height == 0) {
322 Log.w(TAG, "Preview size should not be 0.");
323 return;
324 }
Santhosh Kumar H E6bc53a12013-10-25 13:14:10 +0530325 float ratio;
Doris Liu6432cd62013-06-13 17:20:31 -0700326 if (width > height) {
Santhosh Kumar H E6bc53a12013-10-25 13:14:10 +0530327 ratio = (float) width / height;
Doris Liu6432cd62013-06-13 17:20:31 -0700328 } else {
Santhosh Kumar H E6bc53a12013-10-25 13:14:10 +0530329 ratio = (float) height / width;
330 }
331 if (mOrientationResize &&
332 mActivity.getResources().getConfiguration().orientation
333 != Configuration.ORIENTATION_PORTRAIT) {
334 ratio = 1 / ratio;
335 }
336
337 if (ratio != mAspectRatio){
338 mAspectRatioResize = true;
339 mAspectRatio = ratio;
Doris Liu6432cd62013-06-13 17:20:31 -0700340 }
Byunghun Jeon6ee7e412014-08-29 17:56:11 -0700341
342 if (mPreviewWidth > 0 && mPreviewHeight > 0) {
343 mHandler.sendEmptyMessage(UPDATE_TRANSFORM_MATRIX);
344 }
Doris Liu6432cd62013-06-13 17:20:31 -0700345 }
346
347 public int getPreviewWidth() {
348 return mPreviewWidth;
349 }
350
351 public int getPreviewHeight() {
352 return mPreviewHeight;
353 }
354
Doris Liu6432cd62013-06-13 17:20:31 -0700355 private void setTransformMatrix(int width, int height) {
Byunghun Jeon6ee7e412014-08-29 17:56:11 -0700356 mMatrix = mSurfaceView.getMatrix();
357
Doris Liu6432cd62013-06-13 17:20:31 -0700358 float scaledTextureWidth, scaledTextureHeight;
Byunghun Jeon6ee7e412014-08-29 17:56:11 -0700359 if (mOrientationResize) {
360 scaledTextureWidth = height * mAspectRatio;
361 if (scaledTextureWidth > width) {
Santhosh Kumar H E6bc53a12013-10-25 13:14:10 +0530362 scaledTextureWidth = width;
Byunghun Jeon6ee7e412014-08-29 17:56:11 -0700363 scaledTextureHeight = scaledTextureWidth / mAspectRatio;
364 } else {
365 scaledTextureHeight = height;
Santhosh Kumar H E6bc53a12013-10-25 13:14:10 +0530366 }
Doris Liu6432cd62013-06-13 17:20:31 -0700367 } else {
Santhosh Kumar H E6bc53a12013-10-25 13:14:10 +0530368 if (width > height) {
Likai Ding2f163f22014-09-04 17:43:28 +0800369 scaledTextureWidth = Math.max(width, height * mAspectRatio);
370 scaledTextureHeight = Math.max(height, width / mAspectRatio);
Santhosh Kumar H E6bc53a12013-10-25 13:14:10 +0530371 } else {
Likai Ding2f163f22014-09-04 17:43:28 +0800372 scaledTextureWidth = Math.max(width, height / mAspectRatio);
373 scaledTextureHeight = Math.max(height, width * mAspectRatio);
Santhosh Kumar H E6bc53a12013-10-25 13:14:10 +0530374 }
Doris Liu6432cd62013-06-13 17:20:31 -0700375 }
376
Byunghun Jeon6ee7e412014-08-29 17:56:11 -0700377 Log.v(TAG, "setTransformMatrix: scaledTextureWidth = " + scaledTextureWidth
378 + ", scaledTextureHeight = " + scaledTextureHeight);
379 mTempWidth = (int) scaledTextureWidth;
380 mTempHeight = (int) scaledTextureHeight;
381 mSurfaceView.requestLayout();
382 mHandler.post(updateSurfaceView);
Doris Liu6432cd62013-06-13 17:20:31 -0700383 }
384
Sascha Haeberling37f36112013-08-06 14:31:52 -0700385 /**
386 * Starts a flash animation
387 */
388 public void animateFlash() {
389 mAnimationManager.startFlashAnimation(mFlashOverlay);
390 }
391
392 /**
393 * Starts a capture animation
Doris Liu3973deb2013-08-21 13:42:22 -0700394 */
395 public void animateCapture() {
396 Bitmap bitmap = null;
Doris Liu3973deb2013-08-21 13:42:22 -0700397 animateCapture(bitmap);
398 }
399
400 /**
401 * Starts a capture animation
Sascha Haeberling37f36112013-08-06 14:31:52 -0700402 * @param bitmap the captured image that we shrink and slide in the animation
403 */
404 public void animateCapture(Bitmap bitmap) {
Doris Liu3973deb2013-08-21 13:42:22 -0700405 if (bitmap == null) {
406 Log.e(TAG, "No valid bitmap for capture animation.");
407 return;
408 }
Byunghun Jeon71b2bfc2014-10-13 18:34:37 -0700409 mPreviewThumb.setImageBitmap(bitmap);
Sascha Haeberling37f36112013-08-06 14:31:52 -0700410 mAnimationManager.startCaptureAnimation(mPreviewThumb);
411 }
412
413 /**
414 * Cancels on-going animations
415 */
416 public void cancelAnimations() {
417 mAnimationManager.cancelAnimations();
418 }
419
Doris Liu6432cd62013-06-13 17:20:31 -0700420 public void hideUI() {
Doris Liu6432cd62013-06-13 17:20:31 -0700421 mSwitcher.closePopup();
Byunghun Jeon802f5132014-06-16 17:42:26 -0700422 if (mUIhidden)
423 return;
424 mUIhidden = true;
425 mCameraControls.hideUI();
Doris Liu6432cd62013-06-13 17:20:31 -0700426 }
427
428 public void showUI() {
Likai Ding546ba362014-11-21 01:52:54 +0800429 if (!mUIhidden || (mCustomVideoMenu != null && mCustomVideoMenu.isMenuBeingShown()))
Byunghun Jeon802f5132014-06-16 17:42:26 -0700430 return;
431 mUIhidden = false;
432 mCameraControls.showUI();
Doris Liu6432cd62013-06-13 17:20:31 -0700433 }
434
Erin Dahlgren3044d8c2013-10-10 18:23:45 -0700435 public boolean arePreviewControlsVisible() {
Byunghun Jeon802f5132014-06-16 17:42:26 -0700436 return !mUIhidden;
Erin Dahlgren3044d8c2013-10-10 18:23:45 -0700437 }
438
Doris Liu6432cd62013-06-13 17:20:31 -0700439 public void hideSwitcher() {
440 mSwitcher.closePopup();
441 mSwitcher.setVisibility(View.INVISIBLE);
442 }
443
444 public void showSwitcher() {
445 mSwitcher.setVisibility(View.VISIBLE);
446 }
447
Doris Liu6827ce22013-03-12 19:24:28 -0700448 public boolean collapseCameraControls() {
449 boolean ret = false;
Byunghun Jeon802f5132014-06-16 17:42:26 -0700450 mSwitcher.closePopup();
Likai Ding546ba362014-11-21 01:52:54 +0800451 if (mCustomVideoMenu != null) {
452 mCustomVideoMenu.closeAllView();
Byunghun Jeon802f5132014-06-16 17:42:26 -0700453 }
Doris Liu6827ce22013-03-12 19:24:28 -0700454 if (mPopup != null) {
455 dismissPopup(false);
456 ret = true;
457 }
458 return ret;
459 }
460
461 public boolean removeTopLevelPopup() {
462 if (mPopup != null) {
463 dismissPopup(true);
464 return true;
465 }
466 return false;
467 }
468
469 public void enableCameraControls(boolean enable) {
470 if (mGestures != null) {
471 mGestures.setZoomOnly(!enable);
472 }
473 if (mPieRenderer != null && mPieRenderer.showsItems()) {
474 mPieRenderer.hide();
475 }
476 }
477
Doris Liu59390062013-10-10 17:20:56 -0700478 public void initDisplayChangeListener() {
479 ((CameraRootView) mRootView).setDisplayChangeListener(this);
480 }
481
Byunghun Jeon802f5132014-06-16 17:42:26 -0700482 public void setDisplayOrientation(int orientation) {
483 if ((mPreviewOrientation == -1 || mPreviewOrientation != orientation)
Likai Ding546ba362014-11-21 01:52:54 +0800484 && mCustomVideoMenu != null && mCustomVideoMenu.isPreviewMenuBeingShown()) {
Byunghun Jeon802f5132014-06-16 17:42:26 -0700485 dismissSceneModeMenu();
Likai Ding546ba362014-11-21 01:52:54 +0800486 mCustomVideoMenu.addModeBack();
Byunghun Jeon802f5132014-06-16 17:42:26 -0700487 }
488 mPreviewOrientation = orientation;
489 }
490
Doris Liu59390062013-10-10 17:20:56 -0700491 public void removeDisplayChangeListener() {
492 ((CameraRootView) mRootView).removeDisplayChangeListener();
493 }
494
Doris Liu6827ce22013-03-12 19:24:28 -0700495 public void overrideSettings(final String... keyvalues) {
Dimitar Borisov19656472014-09-24 17:32:06 +0300496 if (mVideoMenu != null) {
497 mVideoMenu.overrideSettings(keyvalues);
498 }
Doris Liu6827ce22013-03-12 19:24:28 -0700499 }
500
Doris Liu6827ce22013-03-12 19:24:28 -0700501 public void setOrientationIndicator(int orientation, boolean animation) {
Doris Liu6827ce22013-03-12 19:24:28 -0700502 // We change the orientation of the linearlayout only for phone UI
503 // because when in portrait the width is not enough.
504 if (mLabelsLinearLayout != null) {
505 if (((orientation / 90) & 1) == 0) {
506 mLabelsLinearLayout.setOrientation(LinearLayout.VERTICAL);
507 } else {
508 mLabelsLinearLayout.setOrientation(LinearLayout.HORIZONTAL);
509 }
510 }
511 mRecordingTimeRect.setOrientation(0, animation);
512 }
513
514 public SurfaceHolder getSurfaceHolder() {
Byunghun Jeon6ee7e412014-08-29 17:56:11 -0700515 return mSurfaceHolder;
Doris Liu6827ce22013-03-12 19:24:28 -0700516 }
517
518 public void hideSurfaceView() {
Doris Liu6432cd62013-06-13 17:20:31 -0700519 mSurfaceView.setVisibility(View.GONE);
Byunghun Jeon6ee7e412014-08-29 17:56:11 -0700520
Doris Liu6432cd62013-06-13 17:20:31 -0700521 setTransformMatrix(mPreviewWidth, mPreviewHeight);
Doris Liu6827ce22013-03-12 19:24:28 -0700522 }
523
524 public void showSurfaceView() {
Doris Liu6432cd62013-06-13 17:20:31 -0700525 mSurfaceView.setVisibility(View.VISIBLE);
Byunghun Jeon6ee7e412014-08-29 17:56:11 -0700526
Doris Liu6432cd62013-06-13 17:20:31 -0700527 setTransformMatrix(mPreviewWidth, mPreviewHeight);
Doris Liu6827ce22013-03-12 19:24:28 -0700528 }
529
530 private void initializeOverlay() {
531 mRenderOverlay = (RenderOverlay) mRootView.findViewById(R.id.render_overlay);
532 if (mPieRenderer == null) {
533 mPieRenderer = new PieRenderer(mActivity);
Likai Ding546ba362014-11-21 01:52:54 +0800534 mVideoMenu = new VideoMenu(mActivity, this, mPieRenderer);
Doris Liu6827ce22013-03-12 19:24:28 -0700535 mPieRenderer.setPieListener(this);
536 }
Likai Ding546ba362014-11-21 01:52:54 +0800537 if (mCustomVideoMenu == null) {
538 mCustomVideoMenu = new CustomVideoMenu(mActivity, this);
Byunghun Jeon802f5132014-06-16 17:42:26 -0700539 }
Doris Liu6827ce22013-03-12 19:24:28 -0700540 mRenderOverlay.addRenderer(mPieRenderer);
541 if (mZoomRenderer == null) {
542 mZoomRenderer = new ZoomRenderer(mActivity);
543 }
544 mRenderOverlay.addRenderer(mZoomRenderer);
545 if (mGestures == null) {
Doris Liu6432cd62013-06-13 17:20:31 -0700546 mGestures = new PreviewGestures(mActivity, this, mZoomRenderer, mPieRenderer);
547 mRenderOverlay.setGestures(mGestures);
Doris Liu6827ce22013-03-12 19:24:28 -0700548 }
Likai Ding546ba362014-11-21 01:52:54 +0800549 mGestures.setCustomVideoMenu(mCustomVideoMenu);
Byunghun Jeon802f5132014-06-16 17:42:26 -0700550
Doris Liu6827ce22013-03-12 19:24:28 -0700551 mGestures.setRenderOverlay(mRenderOverlay);
Sascha Haeberling4f91ab52013-05-21 11:26:13 -0700552
Byunghun Jeon71b2bfc2014-10-13 18:34:37 -0700553 mPreviewThumb = (ImageView) mRootView.findViewById(R.id.preview_thumb);
Sascha Haeberling4f91ab52013-05-21 11:26:13 -0700554 mPreviewThumb.setOnClickListener(new OnClickListener() {
555 @Override
556 public void onClick(View v) {
Doris Liufe6596c2013-10-08 11:03:37 -0700557 // Do not allow navigation to filmstrip during video recording
Byunghun Jeon802f5132014-06-16 17:42:26 -0700558 if (!mRecordingStarted && !CameraControls.isAnimating()) {
Doris Liufe6596c2013-10-08 11:03:37 -0700559 mActivity.gotoGallery();
560 }
Sascha Haeberling4f91ab52013-05-21 11:26:13 -0700561 }
562 });
Byunghun Jeon802f5132014-06-16 17:42:26 -0700563
564 mActivity.setPreviewGestures(mGestures);
Doris Liu6827ce22013-03-12 19:24:28 -0700565 }
566
567 public void setPrefChangedListener(OnPreferenceChangedListener listener) {
568 mVideoMenu.setListener(listener);
Likai Ding546ba362014-11-21 01:52:54 +0800569 mCustomVideoMenu.setListener(listener);
Doris Liu6827ce22013-03-12 19:24:28 -0700570 }
571
572 private void initializeMiscControls() {
Doris Liu6827ce22013-03-12 19:24:28 -0700573 mReviewImage = (ImageView) mRootView.findViewById(R.id.review_image);
Doris Liu6827ce22013-03-12 19:24:28 -0700574 mShutterButton.setImageResource(R.drawable.btn_new_shutter_video);
575 mShutterButton.setOnShutterButtonListener(mController);
576 mShutterButton.setVisibility(View.VISIBLE);
577 mShutterButton.requestFocus();
578 mShutterButton.enableTouch(true);
579 mRecordingTimeView = (TextView) mRootView.findViewById(R.id.recording_time);
580 mRecordingTimeRect = (RotateLayout) mRootView.findViewById(R.id.recording_time_rect);
581 mTimeLapseLabel = mRootView.findViewById(R.id.time_lapse_label);
582 // The R.id.labels can only be found in phone layout.
583 // That is, mLabelsLinearLayout should be null in tablet layout.
584 mLabelsLinearLayout = (LinearLayout) mRootView.findViewById(R.id.labels);
585 }
586
Manikanta Kanamarlapudiae019672014-01-06 14:31:43 +0530587 private void initializePauseButton() {
588 mPauseButton = (PauseButton) mRootView.findViewById(R.id.video_pause);
589 mPauseButton.setOnPauseButtonListener(this);
590 }
591
Michael Kolb87880792013-04-30 15:38:49 -0700592 public void updateOnScreenIndicators(Parameters param, ComboPreferences prefs) {
Sascha Haeberling140c2632013-04-23 09:58:51 -0700593 mOnScreenIndicators.updateFlashOnScreenIndicator(param.getFlashMode());
Michael Kolb87880792013-04-30 15:38:49 -0700594 boolean location = RecordLocationPreference.get(
595 prefs, mActivity.getContentResolver());
596 mOnScreenIndicators.updateLocationIndicator(location);
597
Doris Liu6827ce22013-03-12 19:24:28 -0700598 }
599
600 public void setAspectRatio(double ratio) {
Santhosh Kumar H E6bc53a12013-10-25 13:14:10 +0530601 if (mOrientationResize &&
602 mActivity.getResources().getConfiguration().orientation
603 != Configuration.ORIENTATION_PORTRAIT) {
604 ratio = 1 / ratio;
605 }
606
Byunghun Jeon6ee7e412014-08-29 17:56:11 -0700607 if (ratio != mAspectRatio) {
Santhosh Kumar H E6bc53a12013-10-25 13:14:10 +0530608 mAspectRatioResize = true;
609 mAspectRatio = (float)ratio;
610 }
Santhosh Kumar H E6bc53a12013-10-25 13:14:10 +0530611
Byunghun Jeon6ee7e412014-08-29 17:56:11 -0700612 mSurfaceView.requestLayout();
613
614 if (mPreviewWidth > 0 && mPreviewHeight > 0) {
615 mHandler.sendEmptyMessage(UPDATE_TRANSFORM_MATRIX);
616 }
Doris Liu6827ce22013-03-12 19:24:28 -0700617 }
618
619 public void showTimeLapseUI(boolean enable) {
620 if (mTimeLapseLabel != null) {
621 mTimeLapseLabel.setVisibility(enable ? View.VISIBLE : View.GONE);
622 }
Kerong Suiea667a62014-04-08 17:52:03 +0800623 mIsTimeLapse = enable;
Doris Liu6827ce22013-03-12 19:24:28 -0700624 }
625
Michael Kolb3bc96b22013-03-12 10:24:42 -0700626 private void openMenu() {
627 if (mPieRenderer != null) {
628 mPieRenderer.showInCenter();
629 }
630 }
631
Doris Liu6827ce22013-03-12 19:24:28 -0700632 public void dismissPopup(boolean topLevelOnly) {
Doris Liu69ef5ea2013-05-07 13:48:10 -0700633 // In review mode, we do not want to bring up the camera UI
634 if (mController.isInReviewMode()) return;
Doris Liu6827ce22013-03-12 19:24:28 -0700635 if (mPopup != null) {
Doris Liuc3679c02013-08-08 18:08:43 -0700636 mPopup.dismiss(topLevelOnly);
Doris Liu6827ce22013-03-12 19:24:28 -0700637 }
Doris Liuc3679c02013-08-08 18:08:43 -0700638 }
639
640 private void popupDismissed() {
641 mPopup = null;
642 }
643
Byunghun Jeon802f5132014-06-16 17:42:26 -0700644 public boolean onBackPressed() {
Likai Ding546ba362014-11-21 01:52:54 +0800645 if (mCustomVideoMenu != null && mCustomVideoMenu.handleBackKey()) {
Byunghun Jeon802f5132014-06-16 17:42:26 -0700646 return true;
647 }
648 if (hidePieRenderer()) {
649 return true;
650 } else {
651 return removeTopLevelPopup();
652 }
653 }
654
655 public void cleanupListview() {
656 showUI();
657 mActivity.setSystemBarsVisibility(false);
658 }
659
660 public void dismissLevel1() {
661 if (mMenuLayout != null) {
662 ((ViewGroup) mRootView).removeView(mMenuLayout);
663 mMenuLayout = null;
664 }
665 }
666
667 public void dismissLevel2() {
668 if (mSubMenuLayout != null) {
669 ((ViewGroup) mRootView).removeView(mSubMenuLayout);
670 mSubMenuLayout = null;
671 }
672 }
673
674 public boolean sendTouchToPreviewMenu(MotionEvent ev) {
675 return mPreviewMenuLayout.dispatchTouchEvent(ev);
676 }
677
678 public boolean sendTouchToMenu(MotionEvent ev) {
679 View v = mMenuLayout.getChildAt(0);
680 return v.dispatchTouchEvent(ev);
681 }
682
683 public void dismissSceneModeMenu() {
684 if (mPreviewMenuLayout != null) {
685 ((ViewGroup) mRootView).removeView(mPreviewMenuLayout);
686 mPreviewMenuLayout = null;
687 }
688 }
689
690 public void removeSceneModeMenu() {
691 if (mPreviewMenuLayout != null) {
692 ((ViewGroup) mRootView).removeView(mPreviewMenuLayout);
693 mPreviewMenuLayout = null;
694 }
695 cleanupListview();
696 }
697
698 public void removeLevel2() {
699 if (mSubMenuLayout != null) {
700 View v = mSubMenuLayout.getChildAt(0);
701 mSubMenuLayout.removeView(v);
702 }
703 }
704
705 public void showPopup(ListView popup, int level, boolean animate) {
706 hideUI();
707
708 popup.setVisibility(View.VISIBLE);
709 if (level == 1) {
710 if (mMenuLayout == null) {
711 mMenuLayout = new LinearLayout(mActivity);
712 ViewGroup.LayoutParams params = new ViewGroup.LayoutParams(
713 CameraActivity.SETTING_LIST_WIDTH_1, LayoutParams.WRAP_CONTENT);
714 mMenuLayout.setLayoutParams(params);
715 ((ViewGroup) mRootView).addView(mMenuLayout);
716 }
717 mMenuLayout.addView(popup);
718 }
719 if (level == 2) {
720 if (mSubMenuLayout == null) {
721 mSubMenuLayout = new LinearLayout(mActivity);
722 ViewGroup.LayoutParams params = new ViewGroup.LayoutParams(
723 CameraActivity.SETTING_LIST_WIDTH_2, LayoutParams.WRAP_CONTENT);
724 mSubMenuLayout.setLayoutParams(params);
725
726 ((ViewGroup) mRootView).addView(mSubMenuLayout);
727 }
728 mSubMenuLayout.addView(popup);
729 mSubMenuLayout.setX(CameraActivity.SETTING_LIST_WIDTH_1);
730 }
731 if (animate) {
732 if (level == 1)
Likai Ding546ba362014-11-21 01:52:54 +0800733 mCustomVideoMenu.animateSlideIn(popup, CameraActivity.SETTING_LIST_WIDTH_1, true);
Byunghun Jeon802f5132014-06-16 17:42:26 -0700734 if (level == 2)
Likai Ding546ba362014-11-21 01:52:54 +0800735 mCustomVideoMenu.animateFadeIn(popup);
Byunghun Jeon802f5132014-06-16 17:42:26 -0700736 }
737 else
738 popup.setAlpha(0.85f);
739 }
740
741 public ViewGroup getMenuLayout() {
742 return mMenuLayout;
743 }
744
745 public void setPreviewMenuLayout(LinearLayout layout) {
746 mPreviewMenuLayout = layout;
747 }
748
749 public ViewGroup getPreviewMenuLayout() {
750 return mPreviewMenuLayout;
751 }
752
Doris Liuc3679c02013-08-08 18:08:43 -0700753 public void showPopup(AbstractSettingPopup popup) {
754 hideUI();
755
756 if (mPopup != null) {
757 mPopup.dismiss(false);
758 }
759 mPopup = new SettingsPopup(popup);
Doris Liu6827ce22013-03-12 19:24:28 -0700760 }
761
762 public void onShowSwitcherPopup() {
763 hidePieRenderer();
764 }
765
766 public boolean hidePieRenderer() {
767 if (mPieRenderer != null && mPieRenderer.showsItems()) {
768 mPieRenderer.hide();
769 return true;
770 }
771 return false;
772 }
773
Doris Liu61f2b082013-03-27 17:25:43 -0700774 // disable preview gestures after shutter is pressed
775 public void setShutterPressed(boolean pressed) {
776 if (mGestures == null) return;
777 mGestures.setEnabled(!pressed);
778 }
779
Doris Liu6827ce22013-03-12 19:24:28 -0700780 public void enableShutter(boolean enable) {
781 if (mShutterButton != null) {
Shalaj Jain467b4f22014-11-10 14:01:09 -0800782 if (enable) {
783 Log.v(TAG, "Shutter Button enabled !!");
784 } else {
785 Log.v(TAG, "Shutter Button disabled !!");
786 }
Doris Liu6827ce22013-03-12 19:24:28 -0700787 mShutterButton.setEnabled(enable);
788 }
789 }
790
791 // PieListener
792 @Override
793 public void onPieOpened(int centerX, int centerY) {
Doris Liu6432cd62013-06-13 17:20:31 -0700794 setSwipingEnabled(false);
Andy Huibers249653e2013-11-11 22:30:49 -0800795 // Close module selection menu when pie menu is opened.
796 mSwitcher.closePopup();
Doris Liu6827ce22013-03-12 19:24:28 -0700797 }
798
799 @Override
800 public void onPieClosed() {
Doris Liu6432cd62013-06-13 17:20:31 -0700801 setSwipingEnabled(true);
802 }
803
804 public void setSwipingEnabled(boolean enable) {
805 mActivity.setSwipingEnabled(enable);
Doris Liu6827ce22013-03-12 19:24:28 -0700806 }
807
808 public void showPreviewBorder(boolean enable) {
Doris Liu6432cd62013-06-13 17:20:31 -0700809 // TODO: mPreviewFrameLayout.showBorder(enable);
Doris Liu6827ce22013-03-12 19:24:28 -0700810 }
811
812 // SingleTapListener
813 // Preview area is touched. Take a picture.
814 @Override
815 public void onSingleTapUp(View view, int x, int y) {
816 mController.onSingleTapUp(view, x, y);
817 }
818
Doris Liufe6596c2013-10-08 11:03:37 -0700819 public void showRecordingUI(boolean recording) {
820 mRecordingStarted = recording;
Doris Liu6432cd62013-06-13 17:20:31 -0700821 mMenuButton.setVisibility(recording ? View.GONE : View.VISIBLE);
Doris Liu6827ce22013-03-12 19:24:28 -0700822 mOnScreenIndicators.setVisibility(recording ? View.GONE : View.VISIBLE);
823 if (recording) {
Byunghun Jeon802f5132014-06-16 17:42:26 -0700824 mShutterButton.setImageResource(R.drawable.shutter_button_video_stop);
Doris Liu6432cd62013-06-13 17:20:31 -0700825 hideSwitcher();
Doris Liu6827ce22013-03-12 19:24:28 -0700826 mRecordingTimeView.setText("");
827 mRecordingTimeView.setVisibility(View.VISIBLE);
Kerong Suiea667a62014-04-08 17:52:03 +0800828 mPauseButton.setVisibility(mIsTimeLapse ? View.GONE : View.VISIBLE);
Doris Liu6827ce22013-03-12 19:24:28 -0700829 } else {
830 mShutterButton.setImageResource(R.drawable.btn_new_shutter_video);
Doris Liu2a7f44c2013-08-12 15:18:53 -0700831 if (!mController.isVideoCaptureIntent()) {
832 showSwitcher();
833 }
Doris Liu6827ce22013-03-12 19:24:28 -0700834 mRecordingTimeView.setVisibility(View.GONE);
Manikanta Kanamarlapudiae019672014-01-06 14:31:43 +0530835 mPauseButton.setVisibility(View.GONE);
Doris Liu6827ce22013-03-12 19:24:28 -0700836 }
837 }
838
Byunghun Jeon802f5132014-06-16 17:42:26 -0700839 public void hideUIwhileRecording() {
Likai Ding546ba362014-11-21 01:52:54 +0800840 mCustomVideoMenu.hideUI();
Byunghun Jeon802f5132014-06-16 17:42:26 -0700841 }
842
843 public void showUIafterRecording() {
Likai Ding546ba362014-11-21 01:52:54 +0800844 mCustomVideoMenu.showUI();
Byunghun Jeon802f5132014-06-16 17:42:26 -0700845 }
846
Doris Liu6827ce22013-03-12 19:24:28 -0700847 public void showReviewImage(Bitmap bitmap) {
848 mReviewImage.setImageBitmap(bitmap);
849 mReviewImage.setVisibility(View.VISIBLE);
850 }
851
852 public void showReviewControls() {
Angus Kongb50b5cb2013-08-09 14:55:20 -0700853 CameraUtil.fadeOut(mShutterButton);
854 CameraUtil.fadeIn(mReviewDoneButton);
855 CameraUtil.fadeIn(mReviewPlayButton);
Doris Liu6827ce22013-03-12 19:24:28 -0700856 mReviewImage.setVisibility(View.VISIBLE);
Doris Liu6432cd62013-06-13 17:20:31 -0700857 mMenuButton.setVisibility(View.GONE);
Doris Liu6827ce22013-03-12 19:24:28 -0700858 mOnScreenIndicators.setVisibility(View.GONE);
859 }
860
861 public void hideReviewUI() {
862 mReviewImage.setVisibility(View.GONE);
863 mShutterButton.setEnabled(true);
Doris Liu6432cd62013-06-13 17:20:31 -0700864 mMenuButton.setVisibility(View.VISIBLE);
Doris Liu6827ce22013-03-12 19:24:28 -0700865 mOnScreenIndicators.setVisibility(View.VISIBLE);
Angus Kongb50b5cb2013-08-09 14:55:20 -0700866 CameraUtil.fadeOut(mReviewDoneButton);
867 CameraUtil.fadeOut(mReviewPlayButton);
868 CameraUtil.fadeIn(mShutterButton);
Doris Liu6827ce22013-03-12 19:24:28 -0700869 }
870
871 private void setShowMenu(boolean show) {
Kerong Sui8c238462014-04-08 15:49:29 +0800872 if (mController.isVideoCaptureIntent())
873 return;
Doris Liu6827ce22013-03-12 19:24:28 -0700874 if (mOnScreenIndicators != null) {
875 mOnScreenIndicators.setVisibility(show ? View.VISIBLE : View.GONE);
876 }
Doris Liu6827ce22013-03-12 19:24:28 -0700877 }
878
ztenghui7b265a62013-09-09 14:58:44 -0700879 public void onPreviewFocusChanged(boolean previewFocused) {
880 if (previewFocused) {
Doris Liu6432cd62013-06-13 17:20:31 -0700881 showUI();
882 } else {
883 hideUI();
884 }
Doris Liu6827ce22013-03-12 19:24:28 -0700885 if (mGestures != null) {
ztenghui7b265a62013-09-09 14:58:44 -0700886 mGestures.setEnabled(previewFocused);
Doris Liu6827ce22013-03-12 19:24:28 -0700887 }
Doris Liu6827ce22013-03-12 19:24:28 -0700888 if (mRenderOverlay != null) {
889 // this can not happen in capture mode
ztenghui7b265a62013-09-09 14:58:44 -0700890 mRenderOverlay.setVisibility(previewFocused ? View.VISIBLE : View.GONE);
Doris Liu6827ce22013-03-12 19:24:28 -0700891 }
ztenghui7b265a62013-09-09 14:58:44 -0700892 setShowMenu(previewFocused);
Doris Liu6827ce22013-03-12 19:24:28 -0700893 }
894
895 public void initializePopup(PreferenceGroup pref) {
896 mVideoMenu.initialize(pref);
Likai Ding546ba362014-11-21 01:52:54 +0800897 mCustomVideoMenu.initialize(pref);
Doris Liu6827ce22013-03-12 19:24:28 -0700898 }
899
900 public void initializeZoom(Parameters param) {
Doris Liu6432cd62013-06-13 17:20:31 -0700901 if (param == null || !param.isZoomSupported()) {
902 mGestures.setZoomEnabled(false);
903 return;
904 }
905 mGestures.setZoomEnabled(true);
Doris Liu6827ce22013-03-12 19:24:28 -0700906 mZoomMax = param.getMaxZoom();
907 mZoomRatios = param.getZoomRatios();
908 // Currently we use immediate zoom for fast zooming to get better UX and
909 // there is no plan to take advantage of the smooth zoom.
910 mZoomRenderer.setZoomMax(mZoomMax);
911 mZoomRenderer.setZoom(param.getZoom());
912 mZoomRenderer.setZoomValue(mZoomRatios.get(param.getZoom()));
913 mZoomRenderer.setOnZoomChangeListener(new ZoomChangeListener());
914 }
915
916 public void clickShutter() {
917 mShutterButton.performClick();
918 }
919
920 public void pressShutter(boolean pressed) {
921 mShutterButton.setPressed(pressed);
922 }
923
Doris Liu6432cd62013-06-13 17:20:31 -0700924 public View getShutterButton() {
925 return mShutterButton;
Doris Liu6827ce22013-03-12 19:24:28 -0700926 }
927
928 public void setRecordingTime(String text) {
929 mRecordingTimeView.setText(text);
930 }
931
932 public void setRecordingTimeTextColor(int color) {
933 mRecordingTimeView.setTextColor(color);
934 }
935
Doris Liu6432cd62013-06-13 17:20:31 -0700936 public boolean isVisible() {
ztenghui285a5be2013-10-09 15:59:47 -0700937 return mCameraControls.getVisibility() == View.VISIBLE;
Doris Liu6432cd62013-06-13 17:20:31 -0700938 }
939
ztenghui7b265a62013-09-09 14:58:44 -0700940 @Override
Doris Liu6432cd62013-06-13 17:20:31 -0700941 public void onDisplayChanged() {
942 mCameraControls.checkLayoutFlip();
943 mController.updateCameraOrientation();
944 }
945
Doris Liu6827ce22013-03-12 19:24:28 -0700946 private class ZoomChangeListener implements ZoomRenderer.OnZoomChangedListener {
947 @Override
948 public void onZoomValueChanged(int index) {
949 int newZoom = mController.onZoomChanged(index);
950 if (mZoomRenderer != null) {
951 mZoomRenderer.setZoomValue(mZoomRatios.get(newZoom));
952 }
953 }
954
955 @Override
956 public void onZoomStart() {
Alok Kediya23f3cf52013-10-02 17:42:36 +0530957 if (mPieRenderer != null) {
Santhosh Kumar H E78702742013-10-25 19:01:33 +0530958 if (!mRecordingStarted) mPieRenderer.hide();
Alok Kediya23f3cf52013-10-02 17:42:36 +0530959 mPieRenderer.setBlockFocus(true);
960 }
Doris Liu6827ce22013-03-12 19:24:28 -0700961 }
962
963 @Override
964 public void onZoomEnd() {
Alok Kediya23f3cf52013-10-02 17:42:36 +0530965 if (mPieRenderer != null) {
966 mPieRenderer.setBlockFocus(false);
967 }
Doris Liu6827ce22013-03-12 19:24:28 -0700968 }
969 }
Michael Kolb3bc96b22013-03-12 10:24:42 -0700970
Byunghun Jeon6ee7e412014-08-29 17:56:11 -0700971 // SurfaceHolder callbacks
Michael Kolb3bc96b22013-03-12 10:24:42 -0700972 @Override
Byunghun Jeon6ee7e412014-08-29 17:56:11 -0700973 public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
974 Log.v(TAG, "surfaceChanged: width = " + width + ", height = " + height);
Andy Huibersfccf83b2013-11-06 14:37:26 -0800975 // Make sure preview cover is hidden if preview data is available.
976 if (mPreviewCover.getVisibility() != View.GONE) {
977 mPreviewCover.setVisibility(View.GONE);
978 }
Doris Liu6432cd62013-06-13 17:20:31 -0700979 }
980
Doris Liu6432cd62013-06-13 17:20:31 -0700981 @Override
982 public void surfaceCreated(SurfaceHolder holder) {
Byunghun Jeon6ee7e412014-08-29 17:56:11 -0700983 Log.v(TAG, "surfaceCreated");
984 mSurfaceHolder = holder;
985 mController.onPreviewUIReady();
986 if (mPreviewWidth != 0 && mPreviewHeight != 0) {
987 // Re-apply transform matrix for new surface texture
988 setTransformMatrix(mPreviewWidth, mPreviewHeight);
989 }
Byunghun Jeon71b2bfc2014-10-13 18:34:37 -0700990 updatePreviewThumbnail();
Doris Liu6432cd62013-06-13 17:20:31 -0700991 }
992
993 @Override
994 public void surfaceDestroyed(SurfaceHolder holder) {
Byunghun Jeon6ee7e412014-08-29 17:56:11 -0700995 Log.v(TAG, "surfaceDestroyed");
996 mSurfaceHolder = null;
997 mController.onPreviewUIDestroyed();
Sascha Haeberling4f91ab52013-05-21 11:26:13 -0700998 }
Manikanta Kanamarlapudiae019672014-01-06 14:31:43 +0530999
Byunghun Jeon802f5132014-06-16 17:42:26 -07001000 public View getRootView() {
1001 return mRootView;
1002 }
1003
Manikanta Kanamarlapudiae019672014-01-06 14:31:43 +05301004 @Override
1005 public void onButtonPause() {
1006 mRecordingTimeView.setCompoundDrawablesWithIntrinsicBounds(
Byunghun Jeon6ee7e412014-08-29 17:56:11 -07001007 R.drawable.ic_pausing_indicator, 0, 0, 0);
1008 mController.onButtonPause();
Manikanta Kanamarlapudiae019672014-01-06 14:31:43 +05301009 }
1010
1011 @Override
1012 public void onButtonContinue() {
1013 mRecordingTimeView.setCompoundDrawablesWithIntrinsicBounds(
Byunghun Jeon6ee7e412014-08-29 17:56:11 -07001014 R.drawable.ic_recording_indicator, 0, 0, 0);
Manikanta Kanamarlapudiae019672014-01-06 14:31:43 +05301015 mController.onButtonContinue();
1016 }
1017
1018 public void resetPauseButton() {
1019 mRecordingTimeView.setCompoundDrawablesWithIntrinsicBounds(
1020 R.drawable.ic_recording_indicator, 0, 0, 0);
1021 mPauseButton.setPaused(false);
1022 }
kaiyizde529662014-07-21 16:47:27 +08001023
1024 public void setPreference(String key, String value) {
1025 mVideoMenu.setPreference(key, value);
1026 }
Byunghun Jeon802f5132014-06-16 17:42:26 -07001027
1028 public boolean hideSwitcherPopup() {
1029 if (mSwitcher != null && mSwitcher.showsPopup()) {
1030 mSwitcher.closePopup();
1031 return true;
1032 }
1033 return false;
1034 }
Doris Liu6827ce22013-03-12 19:24:28 -07001035}