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