VideoUI.java revision 69ef5ea6ed838cf6fba834811f01122d349a61cf
16827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu/*
26827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu * Copyright (C) 2013 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
196827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liuimport android.graphics.Bitmap;
206827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liuimport android.hardware.Camera.Parameters;
216827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liuimport android.util.Log;
226827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liuimport android.view.Gravity;
236827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liuimport android.view.MotionEvent;
246827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liuimport android.view.SurfaceHolder;
256827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liuimport android.view.View;
266827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liuimport android.view.View.OnClickListener;
276827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liuimport android.view.ViewGroup;
286827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liuimport android.widget.FrameLayout;
296827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liuimport android.widget.FrameLayout.LayoutParams;
306827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liuimport android.widget.ImageView;
316827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liuimport android.widget.LinearLayout;
326827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liuimport android.widget.TextView;
336827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu
346827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liuimport com.android.camera.CameraPreference.OnPreferenceChangedListener;
356827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liuimport com.android.camera.ui.AbstractSettingPopup;
366827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liuimport com.android.camera.ui.PieRenderer;
376827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liuimport com.android.camera.ui.PreviewSurfaceView;
386827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liuimport com.android.camera.ui.RenderOverlay;
396827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liuimport com.android.camera.ui.RotateLayout;
406827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liuimport com.android.camera.ui.ZoomRenderer;
416827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liuimport com.android.gallery3d.R;
426827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liuimport com.android.gallery3d.common.ApiHelper;
436827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu
446827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liuimport java.util.List;
456827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu
466827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liupublic class VideoUI implements SurfaceHolder.Callback, PieRenderer.PieListener,
473bc96b2d1106fc5ebec6fda6aad3bca4d62e81c0Michael Kolb        PreviewGestures.SingleTapListener,
483bc96b2d1106fc5ebec6fda6aad3bca4d62e81c0Michael Kolb        PreviewGestures.SwipeListener {
496827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu    private final static String TAG = "CAM_VideoUI";
506827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu    // module fields
516827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu    private CameraActivity mActivity;
526827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu    private View mRootView;
536827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu    private PreviewFrameLayout mPreviewFrameLayout;
546827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu    private boolean mSurfaceViewReady;
556827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu    private PreviewSurfaceView mPreviewSurfaceView;
566827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu    // An review image having same size as preview. It is displayed when
576827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu    // recording is stopped in capture intent.
586827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu    private ImageView mReviewImage;
596827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu    private View mReviewCancelButton;
606827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu    private View mReviewDoneButton;
616827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu    private View mReviewPlayButton;
626827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu    private ShutterButton mShutterButton;
636827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu    private TextView mRecordingTimeView;
646827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu    private LinearLayout mLabelsLinearLayout;
656827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu    private View mTimeLapseLabel;
666827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu    private RenderOverlay mRenderOverlay;
676827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu    private PieRenderer mPieRenderer;
686827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu    private VideoMenu mVideoMenu;
696827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu    private AbstractSettingPopup mPopup;
706827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu    private ZoomRenderer mZoomRenderer;
716827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu    private PreviewGestures mGestures;
726827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu    private View mMenu;
736827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu    private View mBlocker;
74140c263ebb2504fe1a0212a835f0098ce7973a22Sascha Haeberling    private OnScreenIndicators mOnScreenIndicators;
756827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu    private RotateLayout mRecordingTimeRect;
766827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu    private VideoController mController;
776827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu    private int mZoomMax;
786827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu    private List<Integer> mZoomRatios;
796827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu
806827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu    public VideoUI(CameraActivity activity, VideoController controller, View parent) {
816827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu        mActivity = activity;
826827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu        mController = controller;
836827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu        mRootView = parent;
846827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu        mActivity.getLayoutInflater().inflate(R.layout.video_module, (ViewGroup) mRootView, true);
856827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu        mPreviewSurfaceView = (PreviewSurfaceView) mRootView
866827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu                .findViewById(R.id.preview_surface_view);
876827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu        initializeMiscControls();
886827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu        initializeControlByIntent();
896827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu        initializeOverlay();
906827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu    }
916827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu
926827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu    private void initializeControlByIntent() {
936827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu        mBlocker = mActivity.findViewById(R.id.blocker);
946827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu        mMenu = mActivity.findViewById(R.id.menu);
956827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu        mMenu.setOnClickListener(new OnClickListener() {
966827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu            @Override
976827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu            public void onClick(View v) {
986827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu                if (mPieRenderer != null) {
996827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu                    mPieRenderer.showInCenter();
1006827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu                }
1016827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu            }
1026827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu        });
103eb8adc1754fc668435ee57d1be2235b80fc8c009Michael Kolb        mOnScreenIndicators = new OnScreenIndicators(mActivity,
104140c263ebb2504fe1a0212a835f0098ce7973a22Sascha Haeberling                mActivity.findViewById(R.id.on_screen_indicators));
105140c263ebb2504fe1a0212a835f0098ce7973a22Sascha Haeberling        mOnScreenIndicators.resetToDefault();
1066827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu        if (mController.isVideoCaptureIntent()) {
1076827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu            mActivity.hideSwitcher();
1086827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu            ViewGroup cameraControls = (ViewGroup) mActivity.findViewById(R.id.camera_controls);
1096827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu            mActivity.getLayoutInflater().inflate(R.layout.review_module_control, cameraControls);
1106827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu            // Cannot use RotateImageView for "done" and "cancel" button because
1116827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu            // the tablet layout uses RotateLayout, which cannot be cast to
1126827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu            // RotateImageView.
1136827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu            mReviewDoneButton = mActivity.findViewById(R.id.btn_done);
1146827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu            mReviewCancelButton = mActivity.findViewById(R.id.btn_cancel);
1156827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu            mReviewPlayButton = mActivity.findViewById(R.id.btn_play);
1166827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu            mReviewCancelButton.setVisibility(View.VISIBLE);
1176827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu            mReviewDoneButton.setOnClickListener(new OnClickListener() {
1186827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu                @Override
1196827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu                public void onClick(View v) {
1206827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu                    mController.onReviewDoneClicked(v);
1216827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu                }
1226827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu            });
1236827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu            mReviewCancelButton.setOnClickListener(new OnClickListener() {
1246827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu                @Override
1256827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu                public void onClick(View v) {
1266827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu                    mController.onReviewCancelClicked(v);
1276827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu                }
1286827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu            });
1296827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu            mReviewPlayButton.setOnClickListener(new OnClickListener() {
1306827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu                @Override
1316827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu                public void onClick(View v) {
1326827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu                    mController.onReviewPlayClicked(v);
1336827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu                }
1346827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu            });
1356827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu        }
1366827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu    }
1376827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu
1386827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu    public boolean collapseCameraControls() {
1396827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu        boolean ret = false;
1406827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu        if (mPopup != null) {
1416827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu            dismissPopup(false);
1426827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu            ret = true;
1436827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu        }
1446827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu        return ret;
1456827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu    }
1466827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu
1476827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu    public boolean removeTopLevelPopup() {
1486827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu        if (mPopup != null) {
1496827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu            dismissPopup(true);
1506827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu            return true;
1516827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu        }
1526827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu        return false;
1536827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu    }
1546827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu
1556827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu    public void enableCameraControls(boolean enable) {
1566827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu        if (mGestures != null) {
1576827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu            mGestures.setZoomOnly(!enable);
1586827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu        }
1596827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu        if (mPieRenderer != null && mPieRenderer.showsItems()) {
1606827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu            mPieRenderer.hide();
1616827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu        }
1626827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu    }
1636827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu
1646827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu    public void overrideSettings(final String... keyvalues) {
1656827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu        mVideoMenu.overrideSettings(keyvalues);
1666827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu    }
1676827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu
1686827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu    public View getPreview() {
1696827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu        return mPreviewFrameLayout;
1706827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu    }
1716827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu
1726827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu    public void setOrientationIndicator(int orientation, boolean animation) {
1736827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu        if (mGestures != null) {
1746827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu            mGestures.setOrientation(orientation);
1756827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu        }
1766827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu        // We change the orientation of the linearlayout only for phone UI
1776827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu        // because when in portrait the width is not enough.
1786827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu        if (mLabelsLinearLayout != null) {
1796827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu            if (((orientation / 90) & 1) == 0) {
1806827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu                mLabelsLinearLayout.setOrientation(LinearLayout.VERTICAL);
1816827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu            } else {
1826827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu                mLabelsLinearLayout.setOrientation(LinearLayout.HORIZONTAL);
1836827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu            }
1846827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu        }
1856827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu        mRecordingTimeRect.setOrientation(0, animation);
1866827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu    }
1876827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu
1886827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu    public SurfaceHolder getSurfaceHolder() {
1896827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu        return mPreviewSurfaceView.getHolder();
1906827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu    }
1916827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu
1926827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu    public void hideSurfaceView() {
1936827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu        mPreviewSurfaceView.setVisibility(View.GONE);
1946827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu    }
1956827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu
1966827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu    public void showSurfaceView() {
1976827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu        mPreviewSurfaceView.setVisibility(View.VISIBLE);
1986827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu    }
1996827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu
2006827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu    private void initializeOverlay() {
2016827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu        mRenderOverlay = (RenderOverlay) mRootView.findViewById(R.id.render_overlay);
2026827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu        if (mPieRenderer == null) {
2036827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu            mPieRenderer = new PieRenderer(mActivity);
2046827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu            mVideoMenu = new VideoMenu(mActivity, this, mPieRenderer);
2056827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu            mPieRenderer.setPieListener(this);
2066827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu        }
2076827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu        mRenderOverlay.addRenderer(mPieRenderer);
2086827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu        if (mZoomRenderer == null) {
2096827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu            mZoomRenderer = new ZoomRenderer(mActivity);
2106827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu        }
2116827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu        mRenderOverlay.addRenderer(mZoomRenderer);
2126827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu        if (mGestures == null) {
2133bc96b2d1106fc5ebec6fda6aad3bca4d62e81c0Michael Kolb            mGestures = new PreviewGestures(mActivity, this, mZoomRenderer, mPieRenderer, this);
2146827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu        }
2156827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu        mGestures.setRenderOverlay(mRenderOverlay);
2169cdfe00cf57f05f81e6d02ca050e6afd8cc4a25fDoris Liu        mGestures.reset();
2176827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu        mGestures.addTouchReceiver(mMenu);
2189cdfe00cf57f05f81e6d02ca050e6afd8cc4a25fDoris Liu        mGestures.addUnclickableArea(mBlocker);
2196827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu        if (mController.isVideoCaptureIntent()) {
2206827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu            if (mReviewCancelButton != null) {
2216827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu                mGestures.addTouchReceiver(mReviewCancelButton);
2226827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu            }
2236827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu            if (mReviewDoneButton != null) {
2246827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu                mGestures.addTouchReceiver(mReviewDoneButton);
2256827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu            }
2266827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu            if (mReviewPlayButton != null) {
2276827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu                mGestures.addTouchReceiver(mReviewPlayButton);
2286827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu            }
2296827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu        }
2306827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu    }
2316827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu
2326827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu    public void setPrefChangedListener(OnPreferenceChangedListener listener) {
2336827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu        mVideoMenu.setListener(listener);
2346827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu    }
2356827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu
2366827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu    private void initializeMiscControls() {
2376827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu        mPreviewFrameLayout = (PreviewFrameLayout) mRootView.findViewById(R.id.frame);
2386827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu        mPreviewFrameLayout.setOnLayoutChangeListener(mActivity);
2396827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu        mReviewImage = (ImageView) mRootView.findViewById(R.id.review_image);
2406827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu        mShutterButton = mActivity.getShutterButton();
2416827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu        mShutterButton.setImageResource(R.drawable.btn_new_shutter_video);
2426827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu        mShutterButton.setOnShutterButtonListener(mController);
2436827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu        mShutterButton.setVisibility(View.VISIBLE);
2446827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu        mShutterButton.requestFocus();
2456827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu        mShutterButton.enableTouch(true);
2466827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu        mRecordingTimeView = (TextView) mRootView.findViewById(R.id.recording_time);
2476827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu        mRecordingTimeRect = (RotateLayout) mRootView.findViewById(R.id.recording_time_rect);
2486827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu        mTimeLapseLabel = mRootView.findViewById(R.id.time_lapse_label);
2496827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu        // The R.id.labels can only be found in phone layout.
2506827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu        // That is, mLabelsLinearLayout should be null in tablet layout.
2516827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu        mLabelsLinearLayout = (LinearLayout) mRootView.findViewById(R.id.labels);
2526827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu    }
2536827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu
2548788079a51a90255dce330e56afcb6674deccbf7Michael Kolb    public void updateOnScreenIndicators(Parameters param, ComboPreferences prefs) {
255140c263ebb2504fe1a0212a835f0098ce7973a22Sascha Haeberling      mOnScreenIndicators.updateFlashOnScreenIndicator(param.getFlashMode());
2568788079a51a90255dce330e56afcb6674deccbf7Michael Kolb      boolean location = RecordLocationPreference.get(
2578788079a51a90255dce330e56afcb6674deccbf7Michael Kolb              prefs, mActivity.getContentResolver());
2588788079a51a90255dce330e56afcb6674deccbf7Michael Kolb      mOnScreenIndicators.updateLocationIndicator(location);
2598788079a51a90255dce330e56afcb6674deccbf7Michael Kolb
2606827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu    }
2616827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu
2626827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu    public void setAspectRatio(double ratio) {
2636827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu        mPreviewFrameLayout.setAspectRatio(ratio);
2646827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu    }
2656827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu
2666827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu    public void showTimeLapseUI(boolean enable) {
2676827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu        if (mTimeLapseLabel != null) {
2686827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu            mTimeLapseLabel.setVisibility(enable ? View.VISIBLE : View.GONE);
2696827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu        }
2706827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu    }
2716827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu
2723bc96b2d1106fc5ebec6fda6aad3bca4d62e81c0Michael Kolb    private void openMenu() {
2733bc96b2d1106fc5ebec6fda6aad3bca4d62e81c0Michael Kolb        if (mPieRenderer != null) {
2743bc96b2d1106fc5ebec6fda6aad3bca4d62e81c0Michael Kolb            mPieRenderer.showInCenter();
2753bc96b2d1106fc5ebec6fda6aad3bca4d62e81c0Michael Kolb        }
2763bc96b2d1106fc5ebec6fda6aad3bca4d62e81c0Michael Kolb    }
2773bc96b2d1106fc5ebec6fda6aad3bca4d62e81c0Michael Kolb
2786827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu    public void showPopup(AbstractSettingPopup popup) {
2796827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu        mActivity.hideUI();
2806827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu        mBlocker.setVisibility(View.INVISIBLE);
2816827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu        setShowMenu(false);
2826827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu        mPopup = popup;
2836827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu        mPopup.setVisibility(View.VISIBLE);
2846827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu        FrameLayout.LayoutParams lp = new FrameLayout.LayoutParams(LayoutParams.WRAP_CONTENT,
2856827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu                LayoutParams.WRAP_CONTENT);
2866827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu        lp.gravity = Gravity.CENTER;
2876827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu        ((FrameLayout) mRootView).addView(mPopup, lp);
288fd2e619a2fb263315816b3579a9c6751c398132dDoris Liu        mGestures.addTouchReceiver(mPopup);
2896827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu    }
2906827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu
2916827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu    public void dismissPopup(boolean topLevelOnly) {
2926827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu        dismissPopup(topLevelOnly, true);
2936827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu    }
2946827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu
2956827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu    public void dismissPopup(boolean topLevelPopupOnly, boolean fullScreen) {
29669ef5ea6ed838cf6fba834811f01122d349a61cfDoris Liu        // In review mode, we do not want to bring up the camera UI
29769ef5ea6ed838cf6fba834811f01122d349a61cfDoris Liu        if (mController.isInReviewMode()) return;
29869ef5ea6ed838cf6fba834811f01122d349a61cfDoris Liu
2996827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu        if (fullScreen) {
3006827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu            mActivity.showUI();
3016827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu            mBlocker.setVisibility(View.VISIBLE);
3026827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu        }
3036827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu        setShowMenu(fullScreen);
3046827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu        if (mPopup != null) {
305fd2e619a2fb263315816b3579a9c6751c398132dDoris Liu            mGestures.removeTouchReceiver(mPopup);
3066827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu            ((FrameLayout) mRootView).removeView(mPopup);
3076827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu            mPopup = null;
3086827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu        }
3096827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu        mVideoMenu.popupDismissed(topLevelPopupOnly);
3106827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu    }
3116827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu
3126827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu    public void onShowSwitcherPopup() {
3136827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu        hidePieRenderer();
3146827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu    }
3156827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu
3166827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu    public boolean hidePieRenderer() {
3176827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu        if (mPieRenderer != null && mPieRenderer.showsItems()) {
3186827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu            mPieRenderer.hide();
3196827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu            return true;
3206827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu        }
3216827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu        return false;
3226827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu    }
3236827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu
32461f2b082014fe4402dd208029e9378dd5cb1fd1dDoris Liu    // disable preview gestures after shutter is pressed
32561f2b082014fe4402dd208029e9378dd5cb1fd1dDoris Liu    public void setShutterPressed(boolean pressed) {
32661f2b082014fe4402dd208029e9378dd5cb1fd1dDoris Liu        if (mGestures == null) return;
32761f2b082014fe4402dd208029e9378dd5cb1fd1dDoris Liu        mGestures.setEnabled(!pressed);
32861f2b082014fe4402dd208029e9378dd5cb1fd1dDoris Liu    }
32961f2b082014fe4402dd208029e9378dd5cb1fd1dDoris Liu
3306827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu    public void enableShutter(boolean enable) {
3316827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu        if (mShutterButton != null) {
3326827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu            mShutterButton.setEnabled(enable);
3336827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu        }
3346827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu    }
3356827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu
3366827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu    // PieListener
3376827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu    @Override
3386827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu    public void onPieOpened(int centerX, int centerY) {
3396827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu        mActivity.cancelActivityTouchHandling();
3406827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu        mActivity.setSwipingEnabled(false);
3416827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu    }
3426827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu
3436827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu    @Override
3446827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu    public void onPieClosed() {
3456827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu        mActivity.setSwipingEnabled(true);
3466827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu    }
3476827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu
3486827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu    public void showPreviewBorder(boolean enable) {
3496827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu        mPreviewFrameLayout.showBorder(enable);
3506827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu    }
3516827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu
3526827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu    // SingleTapListener
3536827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu    // Preview area is touched. Take a picture.
3546827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu    @Override
3556827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu    public void onSingleTapUp(View view, int x, int y) {
3566827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu        mController.onSingleTapUp(view, x, y);
3576827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu    }
3586827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu
3596827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu    // SurfaceView callback
3606827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu    @Override
3616827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
3626827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu        Log.v(TAG, "Surface changed. width=" + width + ". height=" + height);
3636827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu    }
3646827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu
3656827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu    @Override
3666827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu    public void surfaceCreated(SurfaceHolder holder) {
3676827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu        Log.v(TAG, "Surface created");
3686827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu        mSurfaceViewReady = true;
3696827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu    }
3706827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu
3716827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu    @Override
3726827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu    public void surfaceDestroyed(SurfaceHolder holder) {
3736827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu        Log.v(TAG, "Surface destroyed");
3746827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu        mSurfaceViewReady = false;
3756827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu        mController.stopPreview();
3766827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu    }
3776827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu
3786827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu    public boolean isSurfaceViewReady() {
3796827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu        return mSurfaceViewReady;
3806827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu    }
3816827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu
3826827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu    public void showRecordingUI(boolean recording, boolean zoomSupported) {
3836827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu        mMenu.setVisibility(recording ? View.GONE : View.VISIBLE);
3846827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu        mOnScreenIndicators.setVisibility(recording ? View.GONE : View.VISIBLE);
3856827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu        if (recording) {
3866827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu            mShutterButton.setImageResource(R.drawable.btn_shutter_video_recording);
3876827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu            mActivity.hideSwitcher();
3886827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu            mRecordingTimeView.setText("");
3896827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu            mRecordingTimeView.setVisibility(View.VISIBLE);
3906827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu            // The camera is not allowed to be accessed in older api levels during
3916827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu            // recording. It is therefore necessary to hide the zoom UI on older
3926827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu            // platforms.
3936827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu            // See the documentation of android.media.MediaRecorder.start() for
3946827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu            // further explanation.
3956827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu            if (!ApiHelper.HAS_ZOOM_WHEN_RECORDING && zoomSupported) {
3966827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu                // TODO: disable zoom UI here.
3976827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu            }
3986827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu        } else {
3996827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu            mShutterButton.setImageResource(R.drawable.btn_new_shutter_video);
4006827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu            mActivity.showSwitcher();
4016827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu            mRecordingTimeView.setVisibility(View.GONE);
4026827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu            if (!ApiHelper.HAS_ZOOM_WHEN_RECORDING && zoomSupported) {
4036827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu                // TODO: enable zoom UI here.
4046827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu            }
4056827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu        }
4066827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu    }
4076827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu
4086827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu    public void showReviewImage(Bitmap bitmap) {
4096827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu        mReviewImage.setImageBitmap(bitmap);
4106827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu        mReviewImage.setVisibility(View.VISIBLE);
4116827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu    }
4126827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu
4136827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu    public void showReviewControls() {
4146827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu        Util.fadeOut(mShutterButton);
4156827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu        Util.fadeIn(mReviewDoneButton);
4166827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu        Util.fadeIn(mReviewPlayButton);
4176827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu        mReviewImage.setVisibility(View.VISIBLE);
4186827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu        mMenu.setVisibility(View.GONE);
4196827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu        mOnScreenIndicators.setVisibility(View.GONE);
4206827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu    }
4216827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu
4226827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu    public void hideReviewUI() {
4236827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu        mReviewImage.setVisibility(View.GONE);
4246827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu        mShutterButton.setEnabled(true);
4256827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu        mMenu.setVisibility(View.VISIBLE);
4266827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu        mOnScreenIndicators.setVisibility(View.VISIBLE);
4276827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu        Util.fadeOut(mReviewDoneButton);
4286827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu        Util.fadeOut(mReviewPlayButton);
4296827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu        Util.fadeIn(mShutterButton);
4306827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu    }
4316827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu
4326827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu    private void setShowMenu(boolean show) {
4336827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu        if (mOnScreenIndicators != null) {
4346827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu            mOnScreenIndicators.setVisibility(show ? View.VISIBLE : View.GONE);
4356827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu        }
4366827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu        if (mMenu != null) {
4376827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu            mMenu.setVisibility(show ? View.VISIBLE : View.GONE);
4386827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu        }
4396827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu    }
4406827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu
4416827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu    public void onFullScreenChanged(boolean full) {
4426827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu        if (mGestures != null) {
4436827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu            mGestures.setEnabled(full);
4446827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu        }
4456827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu        if (mPopup != null) {
4466827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu            dismissPopup(false, full);
4476827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu        }
4486827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu        if (mRenderOverlay != null) {
4496827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu            // this can not happen in capture mode
4506827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu            mRenderOverlay.setVisibility(full ? View.VISIBLE : View.GONE);
4516827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu        }
4526827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu        setShowMenu(full);
4536827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu        if (mBlocker != null) {
4546827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu            // this can not happen in capture mode
4556827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu            mBlocker.setVisibility(full ? View.VISIBLE : View.GONE);
4566827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu        }
4576827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu    }
4586827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu
4596827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu    public void initializePopup(PreferenceGroup pref) {
4606827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu        mVideoMenu.initialize(pref);
4616827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu    }
4626827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu
4636827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu    public void initializeZoom(Parameters param) {
4646827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu        if (param == null || !param.isZoomSupported()) return;
4656827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu        mZoomMax = param.getMaxZoom();
4666827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu        mZoomRatios = param.getZoomRatios();
4676827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu        // Currently we use immediate zoom for fast zooming to get better UX and
4686827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu        // there is no plan to take advantage of the smooth zoom.
4696827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu        mZoomRenderer.setZoomMax(mZoomMax);
4706827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu        mZoomRenderer.setZoom(param.getZoom());
4716827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu        mZoomRenderer.setZoomValue(mZoomRatios.get(param.getZoom()));
4726827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu        mZoomRenderer.setOnZoomChangeListener(new ZoomChangeListener());
4736827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu    }
4746827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu
4756827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu    public void clickShutter() {
4766827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu        mShutterButton.performClick();
4776827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu    }
4786827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu
4796827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu    public void pressShutter(boolean pressed) {
4806827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu        mShutterButton.setPressed(pressed);
4816827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu    }
4826827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu
4836827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu    public boolean dispatchTouchEvent(MotionEvent m) {
484fd2e619a2fb263315816b3579a9c6751c398132dDoris Liu        if (mGestures != null && mRenderOverlay != null) {
4856827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu            return mGestures.dispatchTouch(m);
4866827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu        }
4876827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu        return false;
4886827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu    }
4896827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu
4906827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu    public void setRecordingTime(String text) {
4916827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu        mRecordingTimeView.setText(text);
4926827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu    }
4936827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu
4946827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu    public void setRecordingTimeTextColor(int color) {
4956827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu        mRecordingTimeView.setTextColor(color);
4966827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu    }
4976827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu
4986827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu    private class ZoomChangeListener implements ZoomRenderer.OnZoomChangedListener {
4996827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu        @Override
5006827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu        public void onZoomValueChanged(int index) {
5016827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu            int newZoom = mController.onZoomChanged(index);
5026827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu            if (mZoomRenderer != null) {
5036827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu                mZoomRenderer.setZoomValue(mZoomRatios.get(newZoom));
5046827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu            }
5056827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu        }
5066827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu
5076827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu        @Override
5086827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu        public void onZoomStart() {
5096827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu        }
5106827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu
5116827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu        @Override
5126827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu        public void onZoomEnd() {
5136827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu        }
5146827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu    }
5153bc96b2d1106fc5ebec6fda6aad3bca4d62e81c0Michael Kolb
5163bc96b2d1106fc5ebec6fda6aad3bca4d62e81c0Michael Kolb    @Override
5173bc96b2d1106fc5ebec6fda6aad3bca4d62e81c0Michael Kolb    public void onSwipe(int direction) {
5183bc96b2d1106fc5ebec6fda6aad3bca4d62e81c0Michael Kolb        if (direction == PreviewGestures.DIR_UP) {
5193bc96b2d1106fc5ebec6fda6aad3bca4d62e81c0Michael Kolb            openMenu();
5203bc96b2d1106fc5ebec6fda6aad3bca4d62e81c0Michael Kolb        }
5213bc96b2d1106fc5ebec6fda6aad3bca4d62e81c0Michael Kolb    }
5223bc96b2d1106fc5ebec6fda6aad3bca4d62e81c0Michael Kolb
5236827ce281bd3a83ca2ffa552cd090e2b427c5f83Doris Liu}
524