VideoUI.java revision ec0f890e3283acd81cd1e3d2c55c7bf7b2b406d6
1ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu/*
2ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu * Copyright (C) 2013 The Android Open Source Project
3ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu *
4ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu * Licensed under the Apache License, Version 2.0 (the "License");
5ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu * you may not use this file except in compliance with the License.
6ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu * You may obtain a copy of the License at
7ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu *
8ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu *      http://www.apache.org/licenses/LICENSE-2.0
9ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu *
10ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu * Unless required by applicable law or agreed to in writing, software
11ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu * distributed under the License is distributed on an "AS IS" BASIS,
12ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu * See the License for the specific language governing permissions and
14ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu * limitations under the License.
15ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu */
16ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu
17ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liupackage com.android.camera;
18ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu
19ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liuimport android.graphics.Bitmap;
20ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liuimport android.hardware.Camera.Parameters;
21ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liuimport android.util.Log;
22ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liuimport android.view.Gravity;
23ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liuimport android.view.MotionEvent;
24ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liuimport android.view.SurfaceHolder;
25ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liuimport android.view.View;
26ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liuimport android.view.View.OnClickListener;
27ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liuimport android.view.ViewGroup;
28ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liuimport android.widget.FrameLayout;
29ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liuimport android.widget.FrameLayout.LayoutParams;
30ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liuimport android.widget.ImageView;
31ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liuimport android.widget.LinearLayout;
32ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liuimport android.widget.TextView;
33ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu
34ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liuimport com.android.camera.CameraPreference.OnPreferenceChangedListener;
35ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liuimport com.android.camera.ui.AbstractSettingPopup;
36ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liuimport com.android.camera.ui.PieRenderer;
37ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liuimport com.android.camera.ui.PreviewSurfaceView;
38ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liuimport com.android.camera.ui.RenderOverlay;
39ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liuimport com.android.camera.ui.RotateLayout;
40ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liuimport com.android.camera.ui.ZoomRenderer;
41ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liuimport com.android.gallery3d.R;
42ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liuimport com.android.gallery3d.common.ApiHelper;
43ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu
44ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liuimport java.util.List;
45ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu
46ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liupublic class VideoUI implements SurfaceHolder.Callback, PieRenderer.PieListener,
47f79ef61a719d8edc9e76ddc00a6f667db2c363e4Michael Kolb        PreviewGestures.SingleTapListener,
48f79ef61a719d8edc9e76ddc00a6f667db2c363e4Michael Kolb        PreviewGestures.SwipeListener {
49ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu    private final static String TAG = "CAM_VideoUI";
50ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu    // module fields
51ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu    private CameraActivity mActivity;
52ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu    private View mRootView;
53ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu    private PreviewFrameLayout mPreviewFrameLayout;
54ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu    private boolean mSurfaceViewReady;
55ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu    private PreviewSurfaceView mPreviewSurfaceView;
56ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu    // An review image having same size as preview. It is displayed when
57ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu    // recording is stopped in capture intent.
58ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu    private ImageView mReviewImage;
59ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu    private View mReviewCancelButton;
60ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu    private View mReviewDoneButton;
61ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu    private View mReviewPlayButton;
62ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu    private ShutterButton mShutterButton;
63ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu    private TextView mRecordingTimeView;
64ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu    private LinearLayout mLabelsLinearLayout;
65ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu    private View mTimeLapseLabel;
66ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu    private RenderOverlay mRenderOverlay;
67ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu    private PieRenderer mPieRenderer;
68ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu    private VideoMenu mVideoMenu;
69ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu    private AbstractSettingPopup mPopup;
70ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu    private ZoomRenderer mZoomRenderer;
71ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu    private PreviewGestures mGestures;
72ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu    private View mMenu;
73ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu    private View mBlocker;
74ae52b3e3f0f356e1b91e883729d0d82cb40d7a42Sascha Haeberling    private OnScreenIndicators mOnScreenIndicators;
75ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu    private RotateLayout mRecordingTimeRect;
76ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu    private VideoController mController;
77ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu    private int mZoomMax;
78ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu    private List<Integer> mZoomRatios;
79ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu
80ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu    public VideoUI(CameraActivity activity, VideoController controller, View parent) {
81ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        mActivity = activity;
82ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        mController = controller;
83ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        mRootView = parent;
84ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        mActivity.getLayoutInflater().inflate(R.layout.video_module, (ViewGroup) mRootView, true);
85ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        mPreviewSurfaceView = (PreviewSurfaceView) mRootView
86ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu                .findViewById(R.id.preview_surface_view);
87ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        initializeMiscControls();
88ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        initializeControlByIntent();
89ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        initializeOverlay();
90ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu    }
91ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu
92ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu    private void initializeControlByIntent() {
93ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        mBlocker = mActivity.findViewById(R.id.blocker);
94ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        mMenu = mActivity.findViewById(R.id.menu);
95ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        mMenu.setOnClickListener(new OnClickListener() {
96ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu            @Override
97ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu            public void onClick(View v) {
98ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu                if (mPieRenderer != null) {
99ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu                    mPieRenderer.showInCenter();
100ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu                }
101ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu            }
102ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        });
103ec0f890e3283acd81cd1e3d2c55c7bf7b2b406d6Michael Kolb        mOnScreenIndicators = new OnScreenIndicators(mActivity,
104ae52b3e3f0f356e1b91e883729d0d82cb40d7a42Sascha Haeberling                mActivity.findViewById(R.id.on_screen_indicators));
105ae52b3e3f0f356e1b91e883729d0d82cb40d7a42Sascha Haeberling        mOnScreenIndicators.resetToDefault();
106ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        if (mController.isVideoCaptureIntent()) {
107ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu            mActivity.hideSwitcher();
108ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu            ViewGroup cameraControls = (ViewGroup) mActivity.findViewById(R.id.camera_controls);
109ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu            mActivity.getLayoutInflater().inflate(R.layout.review_module_control, cameraControls);
110ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu            // Cannot use RotateImageView for "done" and "cancel" button because
111ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu            // the tablet layout uses RotateLayout, which cannot be cast to
112ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu            // RotateImageView.
113ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu            mReviewDoneButton = mActivity.findViewById(R.id.btn_done);
114ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu            mReviewCancelButton = mActivity.findViewById(R.id.btn_cancel);
115ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu            mReviewPlayButton = mActivity.findViewById(R.id.btn_play);
116ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu            mReviewCancelButton.setVisibility(View.VISIBLE);
117ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu            mReviewDoneButton.setOnClickListener(new OnClickListener() {
118ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu                @Override
119ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu                public void onClick(View v) {
120ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu                    mController.onReviewDoneClicked(v);
121ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu                }
122ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu            });
123ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu            mReviewCancelButton.setOnClickListener(new OnClickListener() {
124ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu                @Override
125ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu                public void onClick(View v) {
126ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu                    mController.onReviewCancelClicked(v);
127ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu                }
128ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu            });
129ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu            mReviewPlayButton.setOnClickListener(new OnClickListener() {
130ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu                @Override
131ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu                public void onClick(View v) {
132ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu                    mController.onReviewPlayClicked(v);
133ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu                }
134ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu            });
135ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        }
136ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu    }
137ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu
138ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu    public boolean collapseCameraControls() {
139ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        boolean ret = false;
140ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        if (mPopup != null) {
141ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu            dismissPopup(false);
142ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu            ret = true;
143ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        }
144ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        return ret;
145ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu    }
146ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu
147ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu    public boolean removeTopLevelPopup() {
148ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        if (mPopup != null) {
149ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu            dismissPopup(true);
150ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu            return true;
151ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        }
152ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        return false;
153ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu    }
154ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu
155ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu    public void enableCameraControls(boolean enable) {
156ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        if (mGestures != null) {
157ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu            mGestures.setZoomOnly(!enable);
158ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        }
159ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        if (mPieRenderer != null && mPieRenderer.showsItems()) {
160ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu            mPieRenderer.hide();
161ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        }
162ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu    }
163ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu
164ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu    public void overrideSettings(final String... keyvalues) {
165ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        mVideoMenu.overrideSettings(keyvalues);
166ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu    }
167ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu
168ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu    public View getPreview() {
169ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        return mPreviewFrameLayout;
170ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu    }
171ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu
172ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu    public void setOrientationIndicator(int orientation, boolean animation) {
173ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        if (mGestures != null) {
174ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu            mGestures.setOrientation(orientation);
175ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        }
176ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        // We change the orientation of the linearlayout only for phone UI
177ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        // because when in portrait the width is not enough.
178ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        if (mLabelsLinearLayout != null) {
179ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu            if (((orientation / 90) & 1) == 0) {
180ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu                mLabelsLinearLayout.setOrientation(LinearLayout.VERTICAL);
181ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu            } else {
182ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu                mLabelsLinearLayout.setOrientation(LinearLayout.HORIZONTAL);
183ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu            }
184ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        }
185ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        mRecordingTimeRect.setOrientation(0, animation);
186ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu    }
187ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu
188ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu    public SurfaceHolder getSurfaceHolder() {
189ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        return mPreviewSurfaceView.getHolder();
190ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu    }
191ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu
192ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu    public void hideSurfaceView() {
193ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        mPreviewSurfaceView.setVisibility(View.GONE);
194ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu    }
195ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu
196ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu    public void showSurfaceView() {
197ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        mPreviewSurfaceView.setVisibility(View.VISIBLE);
198ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu    }
199ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu
200ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu    private void initializeOverlay() {
201ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        mRenderOverlay = (RenderOverlay) mRootView.findViewById(R.id.render_overlay);
202ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        if (mPieRenderer == null) {
203ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu            mPieRenderer = new PieRenderer(mActivity);
204ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu            mVideoMenu = new VideoMenu(mActivity, this, mPieRenderer);
205ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu            mPieRenderer.setPieListener(this);
206ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        }
207ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        mRenderOverlay.addRenderer(mPieRenderer);
208ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        if (mZoomRenderer == null) {
209ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu            mZoomRenderer = new ZoomRenderer(mActivity);
210ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        }
211ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        mRenderOverlay.addRenderer(mZoomRenderer);
212ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        if (mGestures == null) {
213f79ef61a719d8edc9e76ddc00a6f667db2c363e4Michael Kolb            mGestures = new PreviewGestures(mActivity, this, mZoomRenderer, mPieRenderer, this);
214ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        }
215ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        mGestures.setRenderOverlay(mRenderOverlay);
216cf18f7e34ea9c175e0cf10150a339e5ff016a57cDoris Liu        mGestures.reset();
217ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        mGestures.addTouchReceiver(mMenu);
218cf18f7e34ea9c175e0cf10150a339e5ff016a57cDoris Liu        mGestures.addUnclickableArea(mBlocker);
219ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        if (mController.isVideoCaptureIntent()) {
220ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu            if (mReviewCancelButton != null) {
221ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu                mGestures.addTouchReceiver(mReviewCancelButton);
222ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu            }
223ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu            if (mReviewDoneButton != null) {
224ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu                mGestures.addTouchReceiver(mReviewDoneButton);
225ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu            }
226ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu            if (mReviewPlayButton != null) {
227ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu                mGestures.addTouchReceiver(mReviewPlayButton);
228ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu            }
229ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        }
230ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu    }
231ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu
232ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu    public void setPrefChangedListener(OnPreferenceChangedListener listener) {
233ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        mVideoMenu.setListener(listener);
234ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu    }
235ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu
236ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu    private void initializeMiscControls() {
237ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        mPreviewFrameLayout = (PreviewFrameLayout) mRootView.findViewById(R.id.frame);
238ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        mPreviewFrameLayout.setOnLayoutChangeListener(mActivity);
239ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        mReviewImage = (ImageView) mRootView.findViewById(R.id.review_image);
240ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        mShutterButton = mActivity.getShutterButton();
241ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        mShutterButton.setImageResource(R.drawable.btn_new_shutter_video);
242ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        mShutterButton.setOnShutterButtonListener(mController);
243ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        mShutterButton.setVisibility(View.VISIBLE);
244ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        mShutterButton.requestFocus();
245ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        mShutterButton.enableTouch(true);
246ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        mRecordingTimeView = (TextView) mRootView.findViewById(R.id.recording_time);
247ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        mRecordingTimeRect = (RotateLayout) mRootView.findViewById(R.id.recording_time_rect);
248ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        mTimeLapseLabel = mRootView.findViewById(R.id.time_lapse_label);
249ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        // The R.id.labels can only be found in phone layout.
250ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        // That is, mLabelsLinearLayout should be null in tablet layout.
251ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        mLabelsLinearLayout = (LinearLayout) mRootView.findViewById(R.id.labels);
252ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu    }
253ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu
254ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu    public void updateOnScreenIndicators(Parameters param) {
255ae52b3e3f0f356e1b91e883729d0d82cb40d7a42Sascha Haeberling      mOnScreenIndicators.updateFlashOnScreenIndicator(param.getFlashMode());
256ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu    }
257ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu
258ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu    public void setAspectRatio(double ratio) {
259ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        mPreviewFrameLayout.setAspectRatio(ratio);
260ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu    }
261ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu
262ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu    public void showTimeLapseUI(boolean enable) {
263ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        if (mTimeLapseLabel != null) {
264ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu            mTimeLapseLabel.setVisibility(enable ? View.VISIBLE : View.GONE);
265ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        }
266ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu    }
267ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu
268f79ef61a719d8edc9e76ddc00a6f667db2c363e4Michael Kolb    private void openMenu() {
269f79ef61a719d8edc9e76ddc00a6f667db2c363e4Michael Kolb        if (mPieRenderer != null) {
270f79ef61a719d8edc9e76ddc00a6f667db2c363e4Michael Kolb            mPieRenderer.showInCenter();
271f79ef61a719d8edc9e76ddc00a6f667db2c363e4Michael Kolb        }
272f79ef61a719d8edc9e76ddc00a6f667db2c363e4Michael Kolb    }
273f79ef61a719d8edc9e76ddc00a6f667db2c363e4Michael Kolb
274ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu    public void showPopup(AbstractSettingPopup popup) {
275ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        mActivity.hideUI();
276ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        mBlocker.setVisibility(View.INVISIBLE);
277ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        setShowMenu(false);
278ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        mPopup = popup;
279ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        mPopup.setVisibility(View.VISIBLE);
280ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        FrameLayout.LayoutParams lp = new FrameLayout.LayoutParams(LayoutParams.WRAP_CONTENT,
281ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu                LayoutParams.WRAP_CONTENT);
282ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        lp.gravity = Gravity.CENTER;
283ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        ((FrameLayout) mRootView).addView(mPopup, lp);
284f9adf16cc73ad803dee8e973e9e9205f583e1481Doris Liu        mGestures.addTouchReceiver(mPopup);
285ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu    }
286ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu
287ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu    public void dismissPopup(boolean topLevelOnly) {
288ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        dismissPopup(topLevelOnly, true);
289ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu    }
290ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu
291ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu    public void dismissPopup(boolean topLevelPopupOnly, boolean fullScreen) {
292ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        if (fullScreen) {
293ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu            mActivity.showUI();
294ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu            mBlocker.setVisibility(View.VISIBLE);
295ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        }
296ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        setShowMenu(fullScreen);
297ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        if (mPopup != null) {
298f9adf16cc73ad803dee8e973e9e9205f583e1481Doris Liu            mGestures.removeTouchReceiver(mPopup);
299ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu            ((FrameLayout) mRootView).removeView(mPopup);
300ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu            mPopup = null;
301ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        }
302ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        mVideoMenu.popupDismissed(topLevelPopupOnly);
303ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu    }
304ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu
305ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu    public void onShowSwitcherPopup() {
306ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        hidePieRenderer();
307ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu    }
308ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu
309ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu    public boolean hidePieRenderer() {
310ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        if (mPieRenderer != null && mPieRenderer.showsItems()) {
311ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu            mPieRenderer.hide();
312ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu            return true;
313ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        }
314ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        return false;
315ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu    }
316ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu
31729002527ec98a38326f602661abda4d8968baeecDoris Liu    // disable preview gestures after shutter is pressed
31829002527ec98a38326f602661abda4d8968baeecDoris Liu    public void setShutterPressed(boolean pressed) {
31929002527ec98a38326f602661abda4d8968baeecDoris Liu        if (mGestures == null) return;
32029002527ec98a38326f602661abda4d8968baeecDoris Liu        mGestures.setEnabled(!pressed);
32129002527ec98a38326f602661abda4d8968baeecDoris Liu    }
32229002527ec98a38326f602661abda4d8968baeecDoris Liu
323ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu    public void enableShutter(boolean enable) {
324ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        if (mShutterButton != null) {
325ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu            mShutterButton.setEnabled(enable);
326ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        }
327ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu    }
328ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu
329ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu    // PieListener
330ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu    @Override
331ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu    public void onPieOpened(int centerX, int centerY) {
332ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        mActivity.cancelActivityTouchHandling();
333ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        mActivity.setSwipingEnabled(false);
334ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu    }
335ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu
336ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu    @Override
337ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu    public void onPieClosed() {
338ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        mActivity.setSwipingEnabled(true);
339ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu    }
340ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu
341ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu    public void showPreviewBorder(boolean enable) {
342ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        mPreviewFrameLayout.showBorder(enable);
343ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu    }
344ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu
345ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu    // SingleTapListener
346ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu    // Preview area is touched. Take a picture.
347ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu    @Override
348ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu    public void onSingleTapUp(View view, int x, int y) {
349ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        mController.onSingleTapUp(view, x, y);
350ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu    }
351ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu
352ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu    // SurfaceView callback
353ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu    @Override
354ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
355ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        Log.v(TAG, "Surface changed. width=" + width + ". height=" + height);
356ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu    }
357ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu
358ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu    @Override
359ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu    public void surfaceCreated(SurfaceHolder holder) {
360ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        Log.v(TAG, "Surface created");
361ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        mSurfaceViewReady = true;
362ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu    }
363ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu
364ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu    @Override
365ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu    public void surfaceDestroyed(SurfaceHolder holder) {
366ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        Log.v(TAG, "Surface destroyed");
367ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        mSurfaceViewReady = false;
368ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        mController.stopPreview();
369ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu    }
370ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu
371ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu    public boolean isSurfaceViewReady() {
372ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        return mSurfaceViewReady;
373ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu    }
374ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu
375ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu    public void showRecordingUI(boolean recording, boolean zoomSupported) {
376ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        mMenu.setVisibility(recording ? View.GONE : View.VISIBLE);
377ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        mOnScreenIndicators.setVisibility(recording ? View.GONE : View.VISIBLE);
378ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        if (recording) {
379ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu            mShutterButton.setImageResource(R.drawable.btn_shutter_video_recording);
380ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu            mActivity.hideSwitcher();
381ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu            mRecordingTimeView.setText("");
382ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu            mRecordingTimeView.setVisibility(View.VISIBLE);
383ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu            // The camera is not allowed to be accessed in older api levels during
384ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu            // recording. It is therefore necessary to hide the zoom UI on older
385ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu            // platforms.
386ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu            // See the documentation of android.media.MediaRecorder.start() for
387ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu            // further explanation.
388ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu            if (!ApiHelper.HAS_ZOOM_WHEN_RECORDING && zoomSupported) {
389ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu                // TODO: disable zoom UI here.
390ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu            }
391ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        } else {
392ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu            mShutterButton.setImageResource(R.drawable.btn_new_shutter_video);
393ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu            mActivity.showSwitcher();
394ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu            mRecordingTimeView.setVisibility(View.GONE);
395ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu            if (!ApiHelper.HAS_ZOOM_WHEN_RECORDING && zoomSupported) {
396ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu                // TODO: enable zoom UI here.
397ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu            }
398ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        }
399ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu    }
400ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu
401ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu    public void showReviewImage(Bitmap bitmap) {
402ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        mReviewImage.setImageBitmap(bitmap);
403ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        mReviewImage.setVisibility(View.VISIBLE);
404ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu    }
405ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu
406ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu    public void showReviewControls() {
407ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        Util.fadeOut(mShutterButton);
408ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        Util.fadeIn(mReviewDoneButton);
409ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        Util.fadeIn(mReviewPlayButton);
410ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        mReviewImage.setVisibility(View.VISIBLE);
411ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        mMenu.setVisibility(View.GONE);
412ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        mOnScreenIndicators.setVisibility(View.GONE);
413ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu    }
414ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu
415ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu    public void hideReviewUI() {
416ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        mReviewImage.setVisibility(View.GONE);
417ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        mShutterButton.setEnabled(true);
418ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        mMenu.setVisibility(View.VISIBLE);
419ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        mOnScreenIndicators.setVisibility(View.VISIBLE);
420ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        Util.fadeOut(mReviewDoneButton);
421ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        Util.fadeOut(mReviewPlayButton);
422ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        Util.fadeIn(mShutterButton);
423ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu    }
424ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu
425ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu    private void setShowMenu(boolean show) {
426ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        if (mOnScreenIndicators != null) {
427ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu            mOnScreenIndicators.setVisibility(show ? View.VISIBLE : View.GONE);
428ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        }
429ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        if (mMenu != null) {
430ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu            mMenu.setVisibility(show ? View.VISIBLE : View.GONE);
431ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        }
432ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu    }
433ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu
434ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu    public void onFullScreenChanged(boolean full) {
435ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        if (mGestures != null) {
436ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu            mGestures.setEnabled(full);
437ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        }
438ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        if (mPopup != null) {
439ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu            dismissPopup(false, full);
440ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        }
441ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        if (mRenderOverlay != null) {
442ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu            // this can not happen in capture mode
443ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu            mRenderOverlay.setVisibility(full ? View.VISIBLE : View.GONE);
444ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        }
445ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        setShowMenu(full);
446ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        if (mBlocker != null) {
447ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu            // this can not happen in capture mode
448ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu            mBlocker.setVisibility(full ? View.VISIBLE : View.GONE);
449ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        }
450ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu    }
451ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu
452ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu    public void initializePopup(PreferenceGroup pref) {
453ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        mVideoMenu.initialize(pref);
454ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu    }
455ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu
456ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu    public void initializeZoom(Parameters param) {
457ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        if (param == null || !param.isZoomSupported()) return;
458ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        mZoomMax = param.getMaxZoom();
459ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        mZoomRatios = param.getZoomRatios();
460ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        // Currently we use immediate zoom for fast zooming to get better UX and
461ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        // there is no plan to take advantage of the smooth zoom.
462ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        mZoomRenderer.setZoomMax(mZoomMax);
463ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        mZoomRenderer.setZoom(param.getZoom());
464ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        mZoomRenderer.setZoomValue(mZoomRatios.get(param.getZoom()));
465ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        mZoomRenderer.setOnZoomChangeListener(new ZoomChangeListener());
466ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu    }
467ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu
468ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu    public void clickShutter() {
469ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        mShutterButton.performClick();
470ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu    }
471ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu
472ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu    public void pressShutter(boolean pressed) {
473ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        mShutterButton.setPressed(pressed);
474ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu    }
475ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu
476ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu    public boolean dispatchTouchEvent(MotionEvent m) {
477f9adf16cc73ad803dee8e973e9e9205f583e1481Doris Liu        if (mGestures != null && mRenderOverlay != null) {
478ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu            return mGestures.dispatchTouch(m);
479ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        }
480ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        return false;
481ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu    }
482ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu
483ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu    public void setRecordingTime(String text) {
484ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        mRecordingTimeView.setText(text);
485ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu    }
486ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu
487ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu    public void setRecordingTimeTextColor(int color) {
488ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        mRecordingTimeView.setTextColor(color);
489ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu    }
490ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu
491ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu    private class ZoomChangeListener implements ZoomRenderer.OnZoomChangedListener {
492ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        @Override
493ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        public void onZoomValueChanged(int index) {
494ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu            int newZoom = mController.onZoomChanged(index);
495ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu            if (mZoomRenderer != null) {
496ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu                mZoomRenderer.setZoomValue(mZoomRatios.get(newZoom));
497ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu            }
498ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        }
499ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu
500ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        @Override
501ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        public void onZoomStart() {
502ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        }
503ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu
504ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        @Override
505ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        public void onZoomEnd() {
506ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        }
507ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu    }
508f79ef61a719d8edc9e76ddc00a6f667db2c363e4Michael Kolb
509f79ef61a719d8edc9e76ddc00a6f667db2c363e4Michael Kolb    @Override
510f79ef61a719d8edc9e76ddc00a6f667db2c363e4Michael Kolb    public void onSwipe(int direction) {
511f79ef61a719d8edc9e76ddc00a6f667db2c363e4Michael Kolb        if (direction == PreviewGestures.DIR_UP) {
512f79ef61a719d8edc9e76ddc00a6f667db2c363e4Michael Kolb            openMenu();
513f79ef61a719d8edc9e76ddc00a6f667db2c363e4Michael Kolb        }
514f79ef61a719d8edc9e76ddc00a6f667db2c363e4Michael Kolb    }
515f79ef61a719d8edc9e76ddc00a6f667db2c363e4Michael Kolb
516ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu}
517