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;
7980a3d636fa38bb78dbc9f224b4944a21a6e3271dSascha Haeberling    private View mPreviewThumb;
80ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu
81ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu    public VideoUI(CameraActivity activity, VideoController controller, View parent) {
82ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        mActivity = activity;
83ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        mController = controller;
84ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        mRootView = parent;
85ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        mActivity.getLayoutInflater().inflate(R.layout.video_module, (ViewGroup) mRootView, true);
86ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        mPreviewSurfaceView = (PreviewSurfaceView) mRootView
87ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu                .findViewById(R.id.preview_surface_view);
88ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        initializeMiscControls();
89ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        initializeControlByIntent();
90ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        initializeOverlay();
91ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu    }
92ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu
93ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu    private void initializeControlByIntent() {
94ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        mBlocker = mActivity.findViewById(R.id.blocker);
95ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        mMenu = mActivity.findViewById(R.id.menu);
96ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        mMenu.setOnClickListener(new OnClickListener() {
97ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu            @Override
98ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu            public void onClick(View v) {
99ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu                if (mPieRenderer != null) {
100ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu                    mPieRenderer.showInCenter();
101ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu                }
102ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu            }
103ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        });
104ec0f890e3283acd81cd1e3d2c55c7bf7b2b406d6Michael Kolb        mOnScreenIndicators = new OnScreenIndicators(mActivity,
105ae52b3e3f0f356e1b91e883729d0d82cb40d7a42Sascha Haeberling                mActivity.findViewById(R.id.on_screen_indicators));
106ae52b3e3f0f356e1b91e883729d0d82cb40d7a42Sascha Haeberling        mOnScreenIndicators.resetToDefault();
107ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        if (mController.isVideoCaptureIntent()) {
108ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu            mActivity.hideSwitcher();
109ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu            ViewGroup cameraControls = (ViewGroup) mActivity.findViewById(R.id.camera_controls);
110ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu            mActivity.getLayoutInflater().inflate(R.layout.review_module_control, cameraControls);
111ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu            // Cannot use RotateImageView for "done" and "cancel" button because
112ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu            // the tablet layout uses RotateLayout, which cannot be cast to
113ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu            // RotateImageView.
114ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu            mReviewDoneButton = mActivity.findViewById(R.id.btn_done);
115ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu            mReviewCancelButton = mActivity.findViewById(R.id.btn_cancel);
116ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu            mReviewPlayButton = mActivity.findViewById(R.id.btn_play);
117ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu            mReviewCancelButton.setVisibility(View.VISIBLE);
118ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu            mReviewDoneButton.setOnClickListener(new OnClickListener() {
119ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu                @Override
120ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu                public void onClick(View v) {
121ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu                    mController.onReviewDoneClicked(v);
122ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu                }
123ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu            });
124ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu            mReviewCancelButton.setOnClickListener(new OnClickListener() {
125ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu                @Override
126ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu                public void onClick(View v) {
127ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu                    mController.onReviewCancelClicked(v);
128ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu                }
129ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu            });
130ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu            mReviewPlayButton.setOnClickListener(new OnClickListener() {
131ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu                @Override
132ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu                public void onClick(View v) {
133ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu                    mController.onReviewPlayClicked(v);
134ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu                }
135ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu            });
136ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        }
137ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu    }
138ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu
139ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu    public boolean collapseCameraControls() {
140ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        boolean ret = false;
141ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        if (mPopup != null) {
142ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu            dismissPopup(false);
143ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu            ret = true;
144ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        }
145ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        return ret;
146ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu    }
147ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu
148ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu    public boolean removeTopLevelPopup() {
149ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        if (mPopup != null) {
150ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu            dismissPopup(true);
151ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu            return true;
152ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        }
153ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        return false;
154ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu    }
155ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu
156ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu    public void enableCameraControls(boolean enable) {
157ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        if (mGestures != null) {
158ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu            mGestures.setZoomOnly(!enable);
159ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        }
160ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        if (mPieRenderer != null && mPieRenderer.showsItems()) {
161ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu            mPieRenderer.hide();
162ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        }
163ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu    }
164ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu
165ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu    public void overrideSettings(final String... keyvalues) {
166ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        mVideoMenu.overrideSettings(keyvalues);
167ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu    }
168ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu
169ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu    public View getPreview() {
170ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        return mPreviewFrameLayout;
171ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu    }
172ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu
173ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu    public void setOrientationIndicator(int orientation, boolean animation) {
174ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        if (mGestures != null) {
175ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu            mGestures.setOrientation(orientation);
176ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        }
177ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        // We change the orientation of the linearlayout only for phone UI
178ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        // because when in portrait the width is not enough.
179ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        if (mLabelsLinearLayout != null) {
180ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu            if (((orientation / 90) & 1) == 0) {
181ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu                mLabelsLinearLayout.setOrientation(LinearLayout.VERTICAL);
182ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu            } else {
183ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu                mLabelsLinearLayout.setOrientation(LinearLayout.HORIZONTAL);
184ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu            }
185ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        }
186ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        mRecordingTimeRect.setOrientation(0, animation);
187ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu    }
188ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu
189ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu    public SurfaceHolder getSurfaceHolder() {
190ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        return mPreviewSurfaceView.getHolder();
191ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu    }
192ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu
193ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu    public void hideSurfaceView() {
194ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        mPreviewSurfaceView.setVisibility(View.GONE);
195ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu    }
196ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu
197ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu    public void showSurfaceView() {
198ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        mPreviewSurfaceView.setVisibility(View.VISIBLE);
199ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu    }
200ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu
201ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu    private void initializeOverlay() {
202ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        mRenderOverlay = (RenderOverlay) mRootView.findViewById(R.id.render_overlay);
203ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        if (mPieRenderer == null) {
204ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu            mPieRenderer = new PieRenderer(mActivity);
205ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu            mVideoMenu = new VideoMenu(mActivity, this, mPieRenderer);
206ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu            mPieRenderer.setPieListener(this);
207ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        }
208ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        mRenderOverlay.addRenderer(mPieRenderer);
209ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        if (mZoomRenderer == null) {
210ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu            mZoomRenderer = new ZoomRenderer(mActivity);
211ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        }
212ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        mRenderOverlay.addRenderer(mZoomRenderer);
213ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        if (mGestures == null) {
214f79ef61a719d8edc9e76ddc00a6f667db2c363e4Michael Kolb            mGestures = new PreviewGestures(mActivity, this, mZoomRenderer, mPieRenderer, this);
215ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        }
216ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        mGestures.setRenderOverlay(mRenderOverlay);
217cf18f7e34ea9c175e0cf10150a339e5ff016a57cDoris Liu        mGestures.reset();
218ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        mGestures.addTouchReceiver(mMenu);
219cf18f7e34ea9c175e0cf10150a339e5ff016a57cDoris Liu        mGestures.addUnclickableArea(mBlocker);
220ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        if (mController.isVideoCaptureIntent()) {
221ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu            if (mReviewCancelButton != null) {
222ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu                mGestures.addTouchReceiver(mReviewCancelButton);
223ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu            }
224ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu            if (mReviewDoneButton != null) {
225ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu                mGestures.addTouchReceiver(mReviewDoneButton);
226ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu            }
227ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu            if (mReviewPlayButton != null) {
228ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu                mGestures.addTouchReceiver(mReviewPlayButton);
229ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu            }
230ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        }
23180a3d636fa38bb78dbc9f224b4944a21a6e3271dSascha Haeberling
23280a3d636fa38bb78dbc9f224b4944a21a6e3271dSascha Haeberling        mPreviewThumb = mActivity.findViewById(R.id.preview_thumb);
23380a3d636fa38bb78dbc9f224b4944a21a6e3271dSascha Haeberling        mPreviewThumb.setOnClickListener(new OnClickListener() {
23480a3d636fa38bb78dbc9f224b4944a21a6e3271dSascha Haeberling            @Override
23580a3d636fa38bb78dbc9f224b4944a21a6e3271dSascha Haeberling            public void onClick(View v) {
23680a3d636fa38bb78dbc9f224b4944a21a6e3271dSascha Haeberling                mActivity.gotoGallery();
23780a3d636fa38bb78dbc9f224b4944a21a6e3271dSascha Haeberling            }
23880a3d636fa38bb78dbc9f224b4944a21a6e3271dSascha Haeberling        });
239ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu    }
240ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu
241ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu    public void setPrefChangedListener(OnPreferenceChangedListener listener) {
242ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        mVideoMenu.setListener(listener);
243ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu    }
244ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu
245ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu    private void initializeMiscControls() {
246ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        mPreviewFrameLayout = (PreviewFrameLayout) mRootView.findViewById(R.id.frame);
247ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        mPreviewFrameLayout.setOnLayoutChangeListener(mActivity);
248ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        mReviewImage = (ImageView) mRootView.findViewById(R.id.review_image);
249ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        mShutterButton = mActivity.getShutterButton();
250ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        mShutterButton.setImageResource(R.drawable.btn_new_shutter_video);
251ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        mShutterButton.setOnShutterButtonListener(mController);
252ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        mShutterButton.setVisibility(View.VISIBLE);
253ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        mShutterButton.requestFocus();
254ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        mShutterButton.enableTouch(true);
255ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        mRecordingTimeView = (TextView) mRootView.findViewById(R.id.recording_time);
256ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        mRecordingTimeRect = (RotateLayout) mRootView.findViewById(R.id.recording_time_rect);
257ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        mTimeLapseLabel = mRootView.findViewById(R.id.time_lapse_label);
258ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        // The R.id.labels can only be found in phone layout.
259ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        // That is, mLabelsLinearLayout should be null in tablet layout.
260ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        mLabelsLinearLayout = (LinearLayout) mRootView.findViewById(R.id.labels);
261ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu    }
262ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu
2639ea4147f6220e3a9fb6f9ae3fef46036919641b4Michael Kolb    public void updateOnScreenIndicators(Parameters param, ComboPreferences prefs) {
264ae52b3e3f0f356e1b91e883729d0d82cb40d7a42Sascha Haeberling      mOnScreenIndicators.updateFlashOnScreenIndicator(param.getFlashMode());
2659ea4147f6220e3a9fb6f9ae3fef46036919641b4Michael Kolb      boolean location = RecordLocationPreference.get(
2669ea4147f6220e3a9fb6f9ae3fef46036919641b4Michael Kolb              prefs, mActivity.getContentResolver());
2679ea4147f6220e3a9fb6f9ae3fef46036919641b4Michael Kolb      mOnScreenIndicators.updateLocationIndicator(location);
2689ea4147f6220e3a9fb6f9ae3fef46036919641b4Michael Kolb
269ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu    }
270ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu
271ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu    public void setAspectRatio(double ratio) {
272ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        mPreviewFrameLayout.setAspectRatio(ratio);
273ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu    }
274ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu
275ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu    public void showTimeLapseUI(boolean enable) {
276ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        if (mTimeLapseLabel != null) {
277ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu            mTimeLapseLabel.setVisibility(enable ? View.VISIBLE : View.GONE);
278ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        }
279ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu    }
280ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu
281f79ef61a719d8edc9e76ddc00a6f667db2c363e4Michael Kolb    private void openMenu() {
282f79ef61a719d8edc9e76ddc00a6f667db2c363e4Michael Kolb        if (mPieRenderer != null) {
283f79ef61a719d8edc9e76ddc00a6f667db2c363e4Michael Kolb            mPieRenderer.showInCenter();
284f79ef61a719d8edc9e76ddc00a6f667db2c363e4Michael Kolb        }
285f79ef61a719d8edc9e76ddc00a6f667db2c363e4Michael Kolb    }
286f79ef61a719d8edc9e76ddc00a6f667db2c363e4Michael Kolb
287ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu    public void showPopup(AbstractSettingPopup popup) {
288ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        mActivity.hideUI();
289ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        mBlocker.setVisibility(View.INVISIBLE);
290ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        setShowMenu(false);
291ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        mPopup = popup;
292ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        mPopup.setVisibility(View.VISIBLE);
293ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        FrameLayout.LayoutParams lp = new FrameLayout.LayoutParams(LayoutParams.WRAP_CONTENT,
294ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu                LayoutParams.WRAP_CONTENT);
295ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        lp.gravity = Gravity.CENTER;
296ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        ((FrameLayout) mRootView).addView(mPopup, lp);
297f9adf16cc73ad803dee8e973e9e9205f583e1481Doris Liu        mGestures.addTouchReceiver(mPopup);
298ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu    }
299ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu
300ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu    public void dismissPopup(boolean topLevelOnly) {
301ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        dismissPopup(topLevelOnly, true);
302ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu    }
303ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu
304ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu    public void dismissPopup(boolean topLevelPopupOnly, boolean fullScreen) {
305563e1555cdda8665e25c3afb0c68405df54d1afaDoris Liu        // In review mode, we do not want to bring up the camera UI
306563e1555cdda8665e25c3afb0c68405df54d1afaDoris Liu        if (mController.isInReviewMode()) return;
307563e1555cdda8665e25c3afb0c68405df54d1afaDoris Liu
308ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        if (fullScreen) {
309ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu            mActivity.showUI();
310ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu            mBlocker.setVisibility(View.VISIBLE);
311ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        }
312ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        setShowMenu(fullScreen);
313ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        if (mPopup != null) {
314f9adf16cc73ad803dee8e973e9e9205f583e1481Doris Liu            mGestures.removeTouchReceiver(mPopup);
315ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu            ((FrameLayout) mRootView).removeView(mPopup);
316ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu            mPopup = null;
317ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        }
318ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        mVideoMenu.popupDismissed(topLevelPopupOnly);
319ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu    }
320ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu
321ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu    public void onShowSwitcherPopup() {
322ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        hidePieRenderer();
323ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu    }
324ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu
325ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu    public boolean hidePieRenderer() {
326ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        if (mPieRenderer != null && mPieRenderer.showsItems()) {
327ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu            mPieRenderer.hide();
328ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu            return true;
329ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        }
330ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        return false;
331ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu    }
332ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu
33329002527ec98a38326f602661abda4d8968baeecDoris Liu    // disable preview gestures after shutter is pressed
33429002527ec98a38326f602661abda4d8968baeecDoris Liu    public void setShutterPressed(boolean pressed) {
33529002527ec98a38326f602661abda4d8968baeecDoris Liu        if (mGestures == null) return;
33629002527ec98a38326f602661abda4d8968baeecDoris Liu        mGestures.setEnabled(!pressed);
33729002527ec98a38326f602661abda4d8968baeecDoris Liu    }
33829002527ec98a38326f602661abda4d8968baeecDoris Liu
339ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu    public void enableShutter(boolean enable) {
340ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        if (mShutterButton != null) {
341ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu            mShutterButton.setEnabled(enable);
342ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        }
343ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu    }
344ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu
345ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu    // PieListener
346ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu    @Override
347ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu    public void onPieOpened(int centerX, int centerY) {
348a1db26536913f1259ad74c5e6e952521c05bf2f0Angus Kong        dismissPopup(false, true);
349ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        mActivity.cancelActivityTouchHandling();
350ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        mActivity.setSwipingEnabled(false);
351ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu    }
352ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu
353ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu    @Override
354ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu    public void onPieClosed() {
355ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        mActivity.setSwipingEnabled(true);
356ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu    }
357ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu
358ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu    public void showPreviewBorder(boolean enable) {
359ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        mPreviewFrameLayout.showBorder(enable);
360ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu    }
361ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu
362ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu    // SingleTapListener
363ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu    // Preview area is touched. Take a picture.
364ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu    @Override
365ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu    public void onSingleTapUp(View view, int x, int y) {
366ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        mController.onSingleTapUp(view, x, y);
367ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu    }
368ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu
369ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu    // SurfaceView callback
370ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu    @Override
371ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
372ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        Log.v(TAG, "Surface changed. width=" + width + ". height=" + height);
373ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu    }
374ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu
375ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu    @Override
376ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu    public void surfaceCreated(SurfaceHolder holder) {
377ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        Log.v(TAG, "Surface created");
378ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        mSurfaceViewReady = true;
379ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu    }
380ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu
381ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu    @Override
382ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu    public void surfaceDestroyed(SurfaceHolder holder) {
383ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        Log.v(TAG, "Surface destroyed");
384ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        mSurfaceViewReady = false;
385ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        mController.stopPreview();
386ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu    }
387ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu
388ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu    public boolean isSurfaceViewReady() {
389ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        return mSurfaceViewReady;
390ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu    }
391ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu
392ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu    public void showRecordingUI(boolean recording, boolean zoomSupported) {
393ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        mMenu.setVisibility(recording ? View.GONE : View.VISIBLE);
394ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        mOnScreenIndicators.setVisibility(recording ? View.GONE : View.VISIBLE);
395ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        if (recording) {
396ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu            mShutterButton.setImageResource(R.drawable.btn_shutter_video_recording);
397ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu            mActivity.hideSwitcher();
398ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu            mRecordingTimeView.setText("");
399ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu            mRecordingTimeView.setVisibility(View.VISIBLE);
400ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu            // The camera is not allowed to be accessed in older api levels during
401ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu            // recording. It is therefore necessary to hide the zoom UI on older
402ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu            // platforms.
403ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu            // See the documentation of android.media.MediaRecorder.start() for
404ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu            // further explanation.
405ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu            if (!ApiHelper.HAS_ZOOM_WHEN_RECORDING && zoomSupported) {
406ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu                // TODO: disable zoom UI here.
407ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu            }
408ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        } else {
409ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu            mShutterButton.setImageResource(R.drawable.btn_new_shutter_video);
410ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu            mActivity.showSwitcher();
411ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu            mRecordingTimeView.setVisibility(View.GONE);
412ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu            if (!ApiHelper.HAS_ZOOM_WHEN_RECORDING && zoomSupported) {
413ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu                // TODO: enable zoom UI here.
414ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu            }
415ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        }
416ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu    }
417ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu
418ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu    public void showReviewImage(Bitmap bitmap) {
419ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        mReviewImage.setImageBitmap(bitmap);
420ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        mReviewImage.setVisibility(View.VISIBLE);
421ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu    }
422ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu
423ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu    public void showReviewControls() {
424ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        Util.fadeOut(mShutterButton);
425ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        Util.fadeIn(mReviewDoneButton);
426ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        Util.fadeIn(mReviewPlayButton);
427ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        mReviewImage.setVisibility(View.VISIBLE);
428ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        mMenu.setVisibility(View.GONE);
429ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        mOnScreenIndicators.setVisibility(View.GONE);
430ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu    }
431ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu
432ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu    public void hideReviewUI() {
433ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        mReviewImage.setVisibility(View.GONE);
434ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        mShutterButton.setEnabled(true);
435ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        mMenu.setVisibility(View.VISIBLE);
436ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        mOnScreenIndicators.setVisibility(View.VISIBLE);
437ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        Util.fadeOut(mReviewDoneButton);
438ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        Util.fadeOut(mReviewPlayButton);
439ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        Util.fadeIn(mShutterButton);
440ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu    }
441ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu
442ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu    private void setShowMenu(boolean show) {
443ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        if (mOnScreenIndicators != null) {
444ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu            mOnScreenIndicators.setVisibility(show ? View.VISIBLE : View.GONE);
445ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        }
446ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        if (mMenu != null) {
447ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu            mMenu.setVisibility(show ? View.VISIBLE : View.GONE);
448ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        }
449ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu    }
450ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu
451ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu    public void onFullScreenChanged(boolean full) {
452ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        if (mGestures != null) {
453ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu            mGestures.setEnabled(full);
454ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        }
455ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        if (mPopup != null) {
456ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu            dismissPopup(false, full);
457ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        }
458ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        if (mRenderOverlay != null) {
459ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu            // this can not happen in capture mode
460ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu            mRenderOverlay.setVisibility(full ? View.VISIBLE : View.GONE);
461ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        }
462ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        setShowMenu(full);
463ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        if (mBlocker != null) {
464ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu            // this can not happen in capture mode
465ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu            mBlocker.setVisibility(full ? View.VISIBLE : View.GONE);
466ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        }
467ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu    }
468ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu
469ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu    public void initializePopup(PreferenceGroup pref) {
470ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        mVideoMenu.initialize(pref);
471ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu    }
472ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu
473ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu    public void initializeZoom(Parameters param) {
474ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        if (param == null || !param.isZoomSupported()) return;
475ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        mZoomMax = param.getMaxZoom();
476ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        mZoomRatios = param.getZoomRatios();
477ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        // Currently we use immediate zoom for fast zooming to get better UX and
478ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        // there is no plan to take advantage of the smooth zoom.
479ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        mZoomRenderer.setZoomMax(mZoomMax);
480ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        mZoomRenderer.setZoom(param.getZoom());
481ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        mZoomRenderer.setZoomValue(mZoomRatios.get(param.getZoom()));
482ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        mZoomRenderer.setOnZoomChangeListener(new ZoomChangeListener());
483ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu    }
484ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu
485ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu    public void clickShutter() {
486ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        mShutterButton.performClick();
487ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu    }
488ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu
489ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu    public void pressShutter(boolean pressed) {
490ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        mShutterButton.setPressed(pressed);
491ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu    }
492ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu
493ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu    public boolean dispatchTouchEvent(MotionEvent m) {
494f9adf16cc73ad803dee8e973e9e9205f583e1481Doris Liu        if (mGestures != null && mRenderOverlay != null) {
495ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu            return mGestures.dispatchTouch(m);
496ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        }
497ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        return false;
498ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu    }
499ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu
500ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu    public void setRecordingTime(String text) {
501ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        mRecordingTimeView.setText(text);
502ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu    }
503ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu
504ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu    public void setRecordingTimeTextColor(int color) {
505ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        mRecordingTimeView.setTextColor(color);
506ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu    }
507ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu
508ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu    private class ZoomChangeListener implements ZoomRenderer.OnZoomChangedListener {
509ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        @Override
510ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        public void onZoomValueChanged(int index) {
511ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu            int newZoom = mController.onZoomChanged(index);
512ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu            if (mZoomRenderer != null) {
513ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu                mZoomRenderer.setZoomValue(mZoomRatios.get(newZoom));
514ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu            }
515ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        }
516ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu
517ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        @Override
518ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        public void onZoomStart() {
519ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        }
520ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu
521ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        @Override
522ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        public void onZoomEnd() {
523ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu        }
524ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu    }
525f79ef61a719d8edc9e76ddc00a6f667db2c363e4Michael Kolb
526f79ef61a719d8edc9e76ddc00a6f667db2c363e4Michael Kolb    @Override
527f79ef61a719d8edc9e76ddc00a6f667db2c363e4Michael Kolb    public void onSwipe(int direction) {
528f79ef61a719d8edc9e76ddc00a6f667db2c363e4Michael Kolb        if (direction == PreviewGestures.DIR_UP) {
529f79ef61a719d8edc9e76ddc00a6f667db2c363e4Michael Kolb            openMenu();
530f79ef61a719d8edc9e76ddc00a6f667db2c363e4Michael Kolb        }
531f79ef61a719d8edc9e76ddc00a6f667db2c363e4Michael Kolb    }
532f79ef61a719d8edc9e76ddc00a6f667db2c363e4Michael Kolb
53380a3d636fa38bb78dbc9f224b4944a21a6e3271dSascha Haeberling    /**
53480a3d636fa38bb78dbc9f224b4944a21a6e3271dSascha Haeberling     * Enable or disable the preview thumbnail for click events.
53580a3d636fa38bb78dbc9f224b4944a21a6e3271dSascha Haeberling     */
53680a3d636fa38bb78dbc9f224b4944a21a6e3271dSascha Haeberling    public void enablePreviewThumb(boolean enabled) {
53780a3d636fa38bb78dbc9f224b4944a21a6e3271dSascha Haeberling        if (enabled) {
53880a3d636fa38bb78dbc9f224b4944a21a6e3271dSascha Haeberling            mGestures.addTouchReceiver(mPreviewThumb);
53980a3d636fa38bb78dbc9f224b4944a21a6e3271dSascha Haeberling            mPreviewThumb.setVisibility(View.VISIBLE);
54080a3d636fa38bb78dbc9f224b4944a21a6e3271dSascha Haeberling        } else {
54180a3d636fa38bb78dbc9f224b4944a21a6e3271dSascha Haeberling            mGestures.removeTouchReceiver(mPreviewThumb);
54280a3d636fa38bb78dbc9f224b4944a21a6e3271dSascha Haeberling            mPreviewThumb.setVisibility(View.GONE);
54380a3d636fa38bb78dbc9f224b4944a21a6e3271dSascha Haeberling        }
54480a3d636fa38bb78dbc9f224b4944a21a6e3271dSascha Haeberling    }
545ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu}
546