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