CameraActivity.java revision 690dc4722d068a1838b16dc0eabe9c7d518d524c
18872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb/*
28872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb * Copyright (C) 2012 The Android Open Source Project
38872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb *
48872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb * Licensed under the Apache License, Version 2.0 (the "License");
58872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb * you may not use this file except in compliance with the License.
68872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb * You may obtain a copy of the License at
78872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb *
88872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb *      http://www.apache.org/licenses/LICENSE-2.0
98872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb *
108872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb * Unless required by applicable law or agreed to in writing, software
118872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb * distributed under the License is distributed on an "AS IS" BASIS,
128872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
138872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb * See the License for the specific language governing permissions and
148872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb * limitations under the License.
158872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb */
168872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb
178872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolbpackage com.android.camera;
188872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb
19742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liuimport android.animation.Animator;
20a5682ab08e1d42fe272ec877929478b4adb769f5Mangesh Ghiwareimport android.annotation.TargetApi;
21fa9e2cc9ccbcd746f5765cb7a0afebcdb60e2973ztenghuiimport android.app.ActionBar;
226432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liuimport android.app.Activity;
23b84b9738c855a525dc1944165983cc3c342ce446Doris Liuimport android.content.BroadcastReceiver;
2486d36313d88fe96354f2cdd4f378e5ff8397c458Angus Kongimport android.content.ComponentName;
256432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liuimport android.content.ContentResolver;
2608650187c1f1a2d1ef7f754be0f479a29958daaaMichael Kolbimport android.content.Context;
278872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolbimport android.content.Intent;
28b84b9738c855a525dc1944165983cc3c342ce446Doris Liuimport android.content.IntentFilter;
2986d36313d88fe96354f2cdd4f378e5ff8397c458Angus Kongimport android.content.ServiceConnection;
302654dd9bb6a7d917dab1a48e2182c4f49fe71f11Sascha Haeberlingimport android.content.SharedPreferences;
313cf565c4242a9deab7da5eb84fc302c79d594f11Doris Liuimport android.content.pm.ActivityInfo;
328872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolbimport android.content.res.Configuration;
336432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liuimport android.graphics.drawable.ColorDrawable;
346432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liuimport android.net.Uri;
35a5682ab08e1d42fe272ec877929478b4adb769f5Mangesh Ghiwareimport android.nfc.NfcAdapter;
36a5682ab08e1d42fe272ec877929478b4adb769f5Mangesh Ghiwareimport android.nfc.NfcAdapter.CreateBeamUrisCallback;
37a5682ab08e1d42fe272ec877929478b4adb769f5Mangesh Ghiwareimport android.nfc.NfcEvent;
386f64b50db6565bc6454304fd20c0c4020b297bb7Sascha Haeberlingimport android.os.AsyncTask;
39a5682ab08e1d42fe272ec877929478b4adb769f5Mangesh Ghiwareimport android.os.Build;
408872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolbimport android.os.Bundle;
416432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liuimport android.os.Handler;
4286d36313d88fe96354f2cdd4f378e5ff8397c458Angus Kongimport android.os.IBinder;
43aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liuimport android.os.Looper;
44aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liuimport android.os.Message;
452654dd9bb6a7d917dab1a48e2182c4f49fe71f11Sascha Haeberlingimport android.preference.PreferenceManager;
462a7f44cac888de5683d05bef5708f846ee950f43Doris Liuimport android.provider.MediaStore;
473cf565c4242a9deab7da5eb84fc302c79d594f11Doris Liuimport android.provider.Settings;
4837f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberlingimport android.util.Log;
498872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolbimport android.view.KeyEvent;
506432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liuimport android.view.LayoutInflater;
510353ca2e048543bd6e233b4c2110a1df1070cd3fztenghuiimport android.view.Menu;
520353ca2e048543bd6e233b4c2110a1df1070cd3fztenghuiimport android.view.MenuInflater;
530353ca2e048543bd6e233b4c2110a1df1070cd3fztenghuiimport android.view.MenuItem;
54742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liuimport android.view.MotionEvent;
558872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolbimport android.view.OrientationEventListener;
568872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolbimport android.view.View;
576432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liuimport android.view.ViewGroup;
5808650187c1f1a2d1ef7f754be0f479a29958daaaMichael Kolbimport android.view.Window;
5908650187c1f1a2d1ef7f754be0f479a29958daaaMichael Kolbimport android.view.WindowManager;
60653c43be6e58be54cf2ac3c8efb2d65ac20bd03bAngus Kongimport android.widget.FrameLayout;
616432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liuimport android.widget.ImageView;
6237f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberlingimport android.widget.ProgressBar;
63cd2eeb0efc4370f20e9836e20eb11cb974e3b00dMangesh Ghiwareimport android.widget.ShareActionProvider;
648872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb
65ed15d1a140986473bbe7fffd72ec9618c41c5979Angus Kongimport com.android.camera.app.AppManagerFactory;
66ed15d1a140986473bbe7fffd72ec9618c41c5979Angus Kongimport com.android.camera.app.PanoramaStitchingManager;
6719ab725a5e640a1a20b1a6def083e37d1d1c1e20nicolasroardimport com.android.camera.crop.CropActivity;
686432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liuimport com.android.camera.data.CameraDataAdapter;
698e5e4eedb25a4589342660b928935acca4375fc7Angus Kongimport com.android.camera.data.CameraPreviewData;
708e5e4eedb25a4589342660b928935acca4375fc7Angus Kongimport com.android.camera.data.FixedFirstDataAdapter;
718e5e4eedb25a4589342660b928935acca4375fc7Angus Kongimport com.android.camera.data.FixedLastDataAdapter;
726432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liuimport com.android.camera.data.LocalData;
738e5e4eedb25a4589342660b928935acca4375fc7Angus Kongimport com.android.camera.data.LocalDataAdapter;
74064d6000933354f7bf344a41e0caa7052401c903ztenghuiimport com.android.camera.data.LocalMediaObserver;
756f64b50db6565bc6454304fd20c0c4020b297bb7Sascha Haeberlingimport com.android.camera.data.MediaDetails;
76bd26069d391830856c57c2141cd2efbc8423d871Angus Kongimport com.android.camera.data.SimpleViewData;
77a5a08d7642a1fdf961b057cc90e76c4c93103c15Sascha Haeberlingimport com.android.camera.tinyplanet.TinyPlanetFragment;
78ed15d1a140986473bbe7fffd72ec9618c41c5979Angus Kongimport com.android.camera.ui.ModuleSwitcher;
796f64b50db6565bc6454304fd20c0c4020b297bb7Sascha Haeberlingimport com.android.camera.ui.DetailsDialog;
806432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liuimport com.android.camera.ui.FilmStripView;
8188ef7664ba6a888fa5da8693091674e152b56192Sascha Haeberlingimport com.android.camera.util.ApiHelper;
82b50b5cbfbc0a67db6fc43373363b10381c9c61a3Angus Kongimport com.android.camera.util.CameraUtil;
83a9d66bdab247626b31dc182c4d62520b3abffdbdRuben Brunkimport com.android.camera.util.GcamHelper;
8437f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberlingimport com.android.camera.util.PhotoSphereHelper;
8588ef7664ba6a888fa5da8693091674e152b56192Sascha Haeberlingimport com.android.camera.util.PhotoSphereHelper.PanoramaViewHelper;
868e963a5a6016d246184ed65906f9d103e92b17e2Sascha Haeberlingimport com.android.camera2.R;
878872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb
884f795b878843e59810ec1dca05b7cdb37b5614c5Angus Kongimport static com.android.camera.CameraManager.CameraOpenErrorCallback;
894f795b878843e59810ec1dca05b7cdb37b5614c5Angus Kong
906432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liupublic class CameraActivity extends Activity
91aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu        implements ModuleSwitcher.ModuleSwitchListener,
92aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu        ActionBar.OnMenuVisibilityListener {
936432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu
946432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu    private static final String TAG = "CAM_Activity";
956432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu
964ed20592482d2ab2f3f48ee72d5b1c06bf009034Sascha Haeberling    /**
974ed20592482d2ab2f3f48ee72d5b1c06bf009034Sascha Haeberling     * The visibility flags to use to switch the system in either lights-out
984ed20592482d2ab2f3f48ee72d5b1c06bf009034Sascha Haeberling     * mode (pre-K) or hideybar mode (K and up).
994ed20592482d2ab2f3f48ee72d5b1c06bf009034Sascha Haeberling     */
1004ed20592482d2ab2f3f48ee72d5b1c06bf009034Sascha Haeberling    private static final int IMMERSIVE_FLAGS = getImmersiveFlags();
1014ed20592482d2ab2f3f48ee72d5b1c06bf009034Sascha Haeberling
1026432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu    private static final String INTENT_ACTION_STILL_IMAGE_CAMERA_SECURE =
1036432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu            "android.media.action.STILL_IMAGE_CAMERA_SECURE";
1046432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu    public static final String ACTION_IMAGE_CAPTURE_SECURE =
1056432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu            "android.media.action.IMAGE_CAPTURE_SECURE";
1066b9203214d828d72758943aca55adceab684a862ztenghui    public static final String ACTION_TRIM_VIDEO =
1076b9203214d828d72758943aca55adceab684a862ztenghui            "com.android.camera.action.TRIM";
1086b9203214d828d72758943aca55adceab684a862ztenghui    public static final String MEDIA_ITEM_PATH = "media-item-path";
1096432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu
1102654dd9bb6a7d917dab1a48e2182c4f49fe71f11Sascha Haeberling    private static final String PREF_STARTUP_MODULE_INDEX = "camera.startup_module";
1112654dd9bb6a7d917dab1a48e2182c4f49fe71f11Sascha Haeberling
1126432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu    // The intent extra for camera from secure lock screen. True if the gallery
1136432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu    // should only show newly captured pictures. sSecureAlbumId does not
1146432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu    // increment. This is used when switching between camera, camcorder, and
1156432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu    // panorama. If the extra is not set, it is in the normal camera mode.
1166432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu    public static final String SECURE_CAMERA_EXTRA = "secure_camera";
1176432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu
118b7639c641f2ed5d0c60546349c3aa9e90c026878Sascha Haeberling    /**
119b7639c641f2ed5d0c60546349c3aa9e90c026878Sascha Haeberling     * Request code from an activity we started that indicated that we do not
120b7639c641f2ed5d0c60546349c3aa9e90c026878Sascha Haeberling     * want to reset the view to the preview in onResume.
121b7639c641f2ed5d0c60546349c3aa9e90c026878Sascha Haeberling     */
122b7639c641f2ed5d0c60546349c3aa9e90c026878Sascha Haeberling    public static final int REQ_CODE_DONT_SWITCH_TO_PREVIEW = 142;
123b7639c641f2ed5d0c60546349c3aa9e90c026878Sascha Haeberling
124aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu    private static final int HIDE_ACTION_BAR = 1;
125aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu    private static final long SHOW_ACTION_BAR_TIMEOUT_MS = 3000;
126aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu
127b7639c641f2ed5d0c60546349c3aa9e90c026878Sascha Haeberling    /** Whether onResume should reset the view to the preview. */
128b7639c641f2ed5d0c60546349c3aa9e90c026878Sascha Haeberling    private boolean mResetToPreviewOnResume = true;
129b7639c641f2ed5d0c60546349c3aa9e90c026878Sascha Haeberling
1300353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui    // Supported operations at FilmStripView. Different data has different
1310353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui    // set of supported operations.
1320353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui    private static final int SUPPORT_DELETE = 1 << 0;
1330353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui    private static final int SUPPORT_ROTATE = 1 << 1;
1340353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui    private static final int SUPPORT_INFO = 1 << 2;
1350353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui    private static final int SUPPORT_CROP = 1 << 3;
1360353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui    private static final int SUPPORT_SETAS = 1 << 4;
1370353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui    private static final int SUPPORT_EDIT = 1 << 5;
1380353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui    private static final int SUPPORT_TRIM = 1 << 6;
139cd2eeb0efc4370f20e9836e20eb11cb974e3b00dMangesh Ghiware    private static final int SUPPORT_SHARE = 1 << 7;
140cd2eeb0efc4370f20e9836e20eb11cb974e3b00dMangesh Ghiware    private static final int SUPPORT_SHARE_PANORAMA360 = 1 << 8;
141cd2eeb0efc4370f20e9836e20eb11cb974e3b00dMangesh Ghiware    private static final int SUPPORT_SHOW_ON_MAP = 1 << 9;
1420353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui    private static final int SUPPORT_ALL = 0xffffffff;
1430353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui
1446f64b50db6565bc6454304fd20c0c4020b297bb7Sascha Haeberling    /** This data adapter is used by FilmStripView. */
1458e5e4eedb25a4589342660b928935acca4375fc7Angus Kong    private LocalDataAdapter mDataAdapter;
1468e5e4eedb25a4589342660b928935acca4375fc7Angus Kong    /** This data adapter represents the real local camera data. */
1478e5e4eedb25a4589342660b928935acca4375fc7Angus Kong    private LocalDataAdapter mWrappedDataAdapter;
1488e5e4eedb25a4589342660b928935acca4375fc7Angus Kong
1496798c34ddb5248f038f351674c6a6c7a20992c8cAngus Kong    private PanoramaStitchingManager mPanoramaManager;
1508872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb    private int mCurrentModuleIndex;
1516432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu    private CameraModule mCurrentModule;
152653c43be6e58be54cf2ac3c8efb2d65ac20bd03bAngus Kong    private FrameLayout mAboveFilmstripControlLayout;
153653c43be6e58be54cf2ac3c8efb2d65ac20bd03bAngus Kong    private View mCameraModuleRootView;
1546432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu    private FilmStripView mFilmStripView;
15537f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling    private ProgressBar mBottomProgress;
15637f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling    private View mPanoStitchingPanel;
1576432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu    private int mResultCodeForTesting;
1586432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu    private Intent mResultDataForTesting;
1596432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu    private OnScreenHint mStorageHint;
1606432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu    private long mStorageSpace = Storage.LOW_STORAGE_THRESHOLD;
1613cf565c4242a9deab7da5eb84fc302c79d594f11Doris Liu    private boolean mAutoRotateScreen;
1626432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu    private boolean mSecureCamera;
1636a8e8a1a0f3e8e62cd350733e275047475380d6bAngus Kong    // This is a hack to speed up the start of SecureCamera.
1646a8e8a1a0f3e8e62cd350733e275047475380d6bAngus Kong    private static boolean sFirstStartAfterScreenOn = true;
1656432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu    private int mLastRawOrientation;
1668872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb    private MyOrientationEventListener mOrientationListener;
1676432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu    private Handler mMainHandler;
168f1f5186f7d3fd8bf35009d9e65a43914c664d82bSascha Haeberling    private PanoramaViewHelper mPanoramaViewHelper;
1698e5e4eedb25a4589342660b928935acca4375fc7Angus Kong    private CameraPreviewData mCameraPreviewData;
170fa9e2cc9ccbcd746f5765cb7a0afebcdb60e2973ztenghui    private ActionBar mActionBar;
171aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu    private OnActionBarVisibilityListener mOnActionBarVisibilityListener = null;
1720353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui    private Menu mActionBarMenu;
173653c43be6e58be54cf2ac3c8efb2d65ac20bd03bAngus Kong    private ViewGroup mUndoDeletionBar;
174742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu    private boolean mIsUndoingDeletion = false;
1753cf565c4242a9deab7da5eb84fc302c79d594f11Doris Liu
176a5682ab08e1d42fe272ec877929478b4adb769f5Mangesh Ghiware    private Uri[] mNfcPushUris = new Uri[1];
177a5682ab08e1d42fe272ec877929478b4adb769f5Mangesh Ghiware
178cd2eeb0efc4370f20e9836e20eb11cb974e3b00dMangesh Ghiware    private ShareActionProvider mStandardShareActionProvider;
179cd2eeb0efc4370f20e9836e20eb11cb974e3b00dMangesh Ghiware    private Intent mStandardShareIntent;
180cd2eeb0efc4370f20e9836e20eb11cb974e3b00dMangesh Ghiware    private ShareActionProvider mPanoramaShareActionProvider;
181cd2eeb0efc4370f20e9836e20eb11cb974e3b00dMangesh Ghiware    private Intent mPanoramaShareIntent;
182064d6000933354f7bf344a41e0caa7052401c903ztenghui    private LocalMediaObserver mLocalImagesObserver;
183064d6000933354f7bf344a41e0caa7052401c903ztenghui    private LocalMediaObserver mLocalVideosObserver;
184064d6000933354f7bf344a41e0caa7052401c903ztenghui    private boolean mActivityPaused;
185064d6000933354f7bf344a41e0caa7052401c903ztenghui    private boolean mMediaDataChangedDuringPause;
186cd2eeb0efc4370f20e9836e20eb11cb974e3b00dMangesh Ghiware
1875199c2078f3aea06732015ce8ad354c066a2f4ecSascha Haeberling    private final int DEFAULT_SYSTEM_UI_VISIBILITY = View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
1885199c2078f3aea06732015ce8ad354c066a2f4ecSascha Haeberling            | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION;
189742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu    private boolean mPendingDeletion = false;
1905199c2078f3aea06732015ce8ad354c066a2f4ecSascha Haeberling
19105804751ba07c8abcf422f57467d0ed3de95576cztenghui    private Intent mVideoShareIntent;
19205804751ba07c8abcf422f57467d0ed3de95576cztenghui    private Intent mImageShareIntent;
19305804751ba07c8abcf422f57467d0ed3de95576cztenghui
1948872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb    private class MyOrientationEventListener
195a5a08d7642a1fdf961b057cc90e76c4c93103c15Sascha Haeberling            extends OrientationEventListener {
1968872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb        public MyOrientationEventListener(Context context) {
1978872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb            super(context);
1988872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb        }
1998872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb
2008872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb        @Override
2018872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb        public void onOrientationChanged(int orientation) {
2028872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb            // We keep the last known orientation. So if the user first orient
2038872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb            // the camera then point the camera to floor or sky, we still have
2048872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb            // the correct orientation.
205a5a08d7642a1fdf961b057cc90e76c4c93103c15Sascha Haeberling            if (orientation == ORIENTATION_UNKNOWN) {
206a5a08d7642a1fdf961b057cc90e76c4c93103c15Sascha Haeberling                return;
207a5a08d7642a1fdf961b057cc90e76c4c93103c15Sascha Haeberling            }
2088872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb            mLastRawOrientation = orientation;
2098872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb            mCurrentModule.onOrientationChanged(orientation);
2108872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb        }
2118872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb    }
2128872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb
2136432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu    private MediaSaveService mMediaSaveService;
2146432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu    private ServiceConnection mConnection = new ServiceConnection() {
215a5a08d7642a1fdf961b057cc90e76c4c93103c15Sascha Haeberling        @Override
216a5a08d7642a1fdf961b057cc90e76c4c93103c15Sascha Haeberling        public void onServiceConnected(ComponentName className, IBinder b) {
217a5a08d7642a1fdf961b057cc90e76c4c93103c15Sascha Haeberling            mMediaSaveService = ((MediaSaveService.LocalBinder) b).getService();
218a5a08d7642a1fdf961b057cc90e76c4c93103c15Sascha Haeberling            mCurrentModule.onMediaSaveServiceConnected(mMediaSaveService);
219a5a08d7642a1fdf961b057cc90e76c4c93103c15Sascha Haeberling        }
220a5a08d7642a1fdf961b057cc90e76c4c93103c15Sascha Haeberling
221a5a08d7642a1fdf961b057cc90e76c4c93103c15Sascha Haeberling        @Override
222a5a08d7642a1fdf961b057cc90e76c4c93103c15Sascha Haeberling        public void onServiceDisconnected(ComponentName className) {
223a5a08d7642a1fdf961b057cc90e76c4c93103c15Sascha Haeberling            if (mMediaSaveService != null) {
224a5a08d7642a1fdf961b057cc90e76c4c93103c15Sascha Haeberling                mMediaSaveService.setListener(null);
225a5a08d7642a1fdf961b057cc90e76c4c93103c15Sascha Haeberling                mMediaSaveService = null;
2268872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb            }
227a5a08d7642a1fdf961b057cc90e76c4c93103c15Sascha Haeberling        }
228a5a08d7642a1fdf961b057cc90e76c4c93103c15Sascha Haeberling    };
229e319aeabdc825f221df5af8a6ec080c6f5d41a94John Reck
2304f795b878843e59810ec1dca05b7cdb37b5614c5Angus Kong    private CameraOpenErrorCallback mCameraOpenErrorCallback =
2314f795b878843e59810ec1dca05b7cdb37b5614c5Angus Kong            new CameraOpenErrorCallback() {
2324f795b878843e59810ec1dca05b7cdb37b5614c5Angus Kong                @Override
2334f795b878843e59810ec1dca05b7cdb37b5614c5Angus Kong                public void onCameraDisabled(int cameraId) {
2344f795b878843e59810ec1dca05b7cdb37b5614c5Angus Kong                    CameraUtil.showErrorAndFinish(CameraActivity.this,
2354f795b878843e59810ec1dca05b7cdb37b5614c5Angus Kong                            R.string.camera_disabled);
2364f795b878843e59810ec1dca05b7cdb37b5614c5Angus Kong                }
2374f795b878843e59810ec1dca05b7cdb37b5614c5Angus Kong
2384f795b878843e59810ec1dca05b7cdb37b5614c5Angus Kong                @Override
2394f795b878843e59810ec1dca05b7cdb37b5614c5Angus Kong                public void onDeviceOpenFailure(int cameraId) {
2404f795b878843e59810ec1dca05b7cdb37b5614c5Angus Kong                    CameraUtil.showErrorAndFinish(CameraActivity.this,
2414f795b878843e59810ec1dca05b7cdb37b5614c5Angus Kong                            R.string.cannot_connect_camera);
2424f795b878843e59810ec1dca05b7cdb37b5614c5Angus Kong                }
2434f795b878843e59810ec1dca05b7cdb37b5614c5Angus Kong
2444f795b878843e59810ec1dca05b7cdb37b5614c5Angus Kong                @Override
2454f795b878843e59810ec1dca05b7cdb37b5614c5Angus Kong                public void onReconnectionFailure(CameraManager mgr) {
2464f795b878843e59810ec1dca05b7cdb37b5614c5Angus Kong                    CameraUtil.showErrorAndFinish(CameraActivity.this,
2474f795b878843e59810ec1dca05b7cdb37b5614c5Angus Kong                            R.string.cannot_connect_camera);
2484f795b878843e59810ec1dca05b7cdb37b5614c5Angus Kong                }
2494f795b878843e59810ec1dca05b7cdb37b5614c5Angus Kong            };
2504f795b878843e59810ec1dca05b7cdb37b5614c5Angus Kong
251b84b9738c855a525dc1944165983cc3c342ce446Doris Liu    // close activity when screen turns off
252b84b9738c855a525dc1944165983cc3c342ce446Doris Liu    private BroadcastReceiver mScreenOffReceiver = new BroadcastReceiver() {
253b84b9738c855a525dc1944165983cc3c342ce446Doris Liu        @Override
254b84b9738c855a525dc1944165983cc3c342ce446Doris Liu        public void onReceive(Context context, Intent intent) {
255b84b9738c855a525dc1944165983cc3c342ce446Doris Liu            finish();
256b84b9738c855a525dc1944165983cc3c342ce446Doris Liu        }
257b84b9738c855a525dc1944165983cc3c342ce446Doris Liu    };
258b84b9738c855a525dc1944165983cc3c342ce446Doris Liu
2596a8e8a1a0f3e8e62cd350733e275047475380d6bAngus Kong    private static BroadcastReceiver sScreenOffReceiver;
260a5a08d7642a1fdf961b057cc90e76c4c93103c15Sascha Haeberling
2616a8e8a1a0f3e8e62cd350733e275047475380d6bAngus Kong    private static class ScreenOffReceiver extends BroadcastReceiver {
2626a8e8a1a0f3e8e62cd350733e275047475380d6bAngus Kong        @Override
2636a8e8a1a0f3e8e62cd350733e275047475380d6bAngus Kong        public void onReceive(Context context, Intent intent) {
2646a8e8a1a0f3e8e62cd350733e275047475380d6bAngus Kong            sFirstStartAfterScreenOn = true;
2656a8e8a1a0f3e8e62cd350733e275047475380d6bAngus Kong        }
2666a8e8a1a0f3e8e62cd350733e275047475380d6bAngus Kong    }
2676a8e8a1a0f3e8e62cd350733e275047475380d6bAngus Kong
268aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu    private class MainHandler extends Handler {
269aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu        public MainHandler(Looper looper) {
270aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu            super(looper);
271aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu        }
272aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu
273aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu        @Override
274aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu        public void handleMessage(Message msg) {
275aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu            if (msg.what == HIDE_ACTION_BAR) {
276aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu                removeMessages(HIDE_ACTION_BAR);
277aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu                CameraActivity.this.setSystemBarsVisibility(false);
278aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu            }
279aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu        }
280aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu    }
281aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu
282aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu    public interface OnActionBarVisibilityListener {
283aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu        public void onActionBarVisibilityChanged(boolean isVisible);
284aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu    }
285aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu
286aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu    public void setOnActionBarVisibilityListener(OnActionBarVisibilityListener listener) {
287aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu        mOnActionBarVisibilityListener = listener;
288aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu    }
289aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu
2904ed20592482d2ab2f3f48ee72d5b1c06bf009034Sascha Haeberling    private static int getImmersiveFlags() {
291638e6f06c877d90b907f66ea9c22b3c6b73c7384Sascha Haeberling        if (ApiHelper.HAS_HIDEYBARS) {
2924ed20592482d2ab2f3f48ee72d5b1c06bf009034Sascha Haeberling            return View.SYSTEM_UI_FLAG_IMMERSIVE
2934ed20592482d2ab2f3f48ee72d5b1c06bf009034Sascha Haeberling                    | View.SYSTEM_UI_FLAG_TRANSPARENT_STATUS
2944ed20592482d2ab2f3f48ee72d5b1c06bf009034Sascha Haeberling                    | View.SYSTEM_UI_FLAG_TRANSPARENT_NAVIGATION
2954ed20592482d2ab2f3f48ee72d5b1c06bf009034Sascha Haeberling                    | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
2964ed20592482d2ab2f3f48ee72d5b1c06bf009034Sascha Haeberling                    | View.SYSTEM_UI_FLAG_FULLSCREEN;
2974ed20592482d2ab2f3f48ee72d5b1c06bf009034Sascha Haeberling        } else {
2984ed20592482d2ab2f3f48ee72d5b1c06bf009034Sascha Haeberling            // Pre-KitKat we use lights-out mode.
2994ed20592482d2ab2f3f48ee72d5b1c06bf009034Sascha Haeberling            return View.SYSTEM_UI_FLAG_LOW_PROFILE;
3004ed20592482d2ab2f3f48ee72d5b1c06bf009034Sascha Haeberling        }
3014ed20592482d2ab2f3f48ee72d5b1c06bf009034Sascha Haeberling    }
3024ed20592482d2ab2f3f48ee72d5b1c06bf009034Sascha Haeberling
3036a8e8a1a0f3e8e62cd350733e275047475380d6bAngus Kong    public static boolean isFirstStartAfterScreenOn() {
3046a8e8a1a0f3e8e62cd350733e275047475380d6bAngus Kong        return sFirstStartAfterScreenOn;
3056a8e8a1a0f3e8e62cd350733e275047475380d6bAngus Kong    }
3066a8e8a1a0f3e8e62cd350733e275047475380d6bAngus Kong
3076a8e8a1a0f3e8e62cd350733e275047475380d6bAngus Kong    public static void resetFirstStartAfterScreenOn() {
3086a8e8a1a0f3e8e62cd350733e275047475380d6bAngus Kong        sFirstStartAfterScreenOn = false;
3096a8e8a1a0f3e8e62cd350733e275047475380d6bAngus Kong    }
3106a8e8a1a0f3e8e62cd350733e275047475380d6bAngus Kong
31137f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling    private FilmStripView.Listener mFilmStripListener =
31237f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling            new FilmStripView.Listener() {
31337f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling                @Override
31437f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling                public void onDataPromoted(int dataID) {
31537f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling                    removeData(dataID);
31637f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling                }
317e319aeabdc825f221df5af8a6ec080c6f5d41a94John Reck
31837f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling                @Override
31937f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling                public void onDataDemoted(int dataID) {
32037f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling                    removeData(dataID);
32137f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling                }
322e319aeabdc825f221df5af8a6ec080c6f5d41a94John Reck
32337f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling                @Override
32437f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling                public void onDataFullScreenChange(int dataID, boolean full) {
3258566dd777cd219254c945240a31ac97de28792a2ztenghui                    boolean isCameraID = isCameraPreview(dataID);
3267b265a6b2f55c6ae7afc30e63ba324c4084a5d8eztenghui                    if (!isCameraID) {
327aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu                        if (!full) {
328aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu                            // Always show action bar in filmstrip mode
329aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu                            CameraActivity.this.setSystemBarsVisibility(true, false);
330aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu                        } else if (mActionBar.isShowing()) {
331aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu                            // Hide action bar after time out in full screen mode
332aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu                            mMainHandler.sendEmptyMessageDelayed(HIDE_ACTION_BAR,
333aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu                                    SHOW_ACTION_BAR_TIMEOUT_MS);
334aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu                        }
335fa9e2cc9ccbcd746f5765cb7a0afebcdb60e2973ztenghui                    }
33637f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling                }
33737f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling
3388566dd777cd219254c945240a31ac97de28792a2ztenghui                /**
3398566dd777cd219254c945240a31ac97de28792a2ztenghui                 * Check if the local data corresponding to dataID is the camera
3408566dd777cd219254c945240a31ac97de28792a2ztenghui                 * preview.
3418566dd777cd219254c945240a31ac97de28792a2ztenghui                 *
3428566dd777cd219254c945240a31ac97de28792a2ztenghui                 * @param dataID the ID of the local data
3438566dd777cd219254c945240a31ac97de28792a2ztenghui                 * @return true if the local data is not null and it is the
3448566dd777cd219254c945240a31ac97de28792a2ztenghui                 *         camera preview.
3458566dd777cd219254c945240a31ac97de28792a2ztenghui                 */
3468566dd777cd219254c945240a31ac97de28792a2ztenghui                private boolean isCameraPreview(int dataID) {
3478566dd777cd219254c945240a31ac97de28792a2ztenghui                    LocalData localData = mDataAdapter.getLocalData(dataID);
3488566dd777cd219254c945240a31ac97de28792a2ztenghui                    if (localData == null) {
3498566dd777cd219254c945240a31ac97de28792a2ztenghui                        Log.w(TAG, "Current data ID not found.");
3508566dd777cd219254c945240a31ac97de28792a2ztenghui                        return false;
3518566dd777cd219254c945240a31ac97de28792a2ztenghui                    }
3528566dd777cd219254c945240a31ac97de28792a2ztenghui                    return localData.getLocalDataType() == LocalData.LOCAL_CAMERA_PREVIEW;
3538566dd777cd219254c945240a31ac97de28792a2ztenghui                }
3548566dd777cd219254c945240a31ac97de28792a2ztenghui
35537f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling                @Override
35633035c19cc47adfb738c20cef66652ae451c8e10Mangesh Ghiware                public void onCurrentDataChanged(final int dataID, final boolean current) {
357aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu                    // Delay hiding action bar if there is any user interaction
358aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu                    if (mMainHandler.hasMessages(HIDE_ACTION_BAR)) {
359aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu                        mMainHandler.removeMessages(HIDE_ACTION_BAR);
360aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu                        mMainHandler.sendEmptyMessageDelayed(HIDE_ACTION_BAR,
361aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu                                SHOW_ACTION_BAR_TIMEOUT_MS);
362aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu                    }
36333035c19cc47adfb738c20cef66652ae451c8e10Mangesh Ghiware                    runOnUiThread(new Runnable() {
36433035c19cc47adfb738c20cef66652ae451c8e10Mangesh Ghiware                        @Override
36533035c19cc47adfb738c20cef66652ae451c8e10Mangesh Ghiware                        public void run() {
3667b265a6b2f55c6ae7afc30e63ba324c4084a5d8eztenghui                            LocalData currentData = mDataAdapter.getLocalData(dataID);
3677b265a6b2f55c6ae7afc30e63ba324c4084a5d8eztenghui                            if (currentData == null) {
3687b265a6b2f55c6ae7afc30e63ba324c4084a5d8eztenghui                                Log.w(TAG, "Current data ID not found.");
3697b265a6b2f55c6ae7afc30e63ba324c4084a5d8eztenghui                                hidePanoStitchingProgress();
3707b265a6b2f55c6ae7afc30e63ba324c4084a5d8eztenghui                                return;
3717b265a6b2f55c6ae7afc30e63ba324c4084a5d8eztenghui                            }
3727b265a6b2f55c6ae7afc30e63ba324c4084a5d8eztenghui                            boolean isCameraID = currentData.getLocalDataType() ==
3737b265a6b2f55c6ae7afc30e63ba324c4084a5d8eztenghui                                    LocalData.LOCAL_CAMERA_PREVIEW;
37433035c19cc47adfb738c20cef66652ae451c8e10Mangesh Ghiware                            if (!current) {
3757b265a6b2f55c6ae7afc30e63ba324c4084a5d8eztenghui                                if (isCameraID) {
3767b265a6b2f55c6ae7afc30e63ba324c4084a5d8eztenghui                                    mCurrentModule.onPreviewFocusChanged(false);
377aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu                                    CameraActivity.this.setSystemBarsVisibility(true);
3787b265a6b2f55c6ae7afc30e63ba324c4084a5d8eztenghui                                }
37933035c19cc47adfb738c20cef66652ae451c8e10Mangesh Ghiware                                hidePanoStitchingProgress();
38033035c19cc47adfb738c20cef66652ae451c8e10Mangesh Ghiware                            } else {
3817b265a6b2f55c6ae7afc30e63ba324c4084a5d8eztenghui                                if (isCameraID) {
3827b265a6b2f55c6ae7afc30e63ba324c4084a5d8eztenghui                                    mCurrentModule.onPreviewFocusChanged(true);
383a5a08d7642a1fdf961b057cc90e76c4c93103c15Sascha Haeberling                                    // Don't show the action bar in Camera
384a5a08d7642a1fdf961b057cc90e76c4c93103c15Sascha Haeberling                                    // preview.
385aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu                                    CameraActivity.this.setSystemBarsVisibility(false);
386742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu                                    if (mPendingDeletion) {
387742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu                                        performDeletion();
388742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu                                    }
3891ef76d4cbd73c02cb8d02cf4cde3f4cee81548d6Alan Newberger                                } else {
3901ef76d4cbd73c02cb8d02cf4cde3f4cee81548d6Alan Newberger                                    updateActionBarMenu(dataID);
3911ef76d4cbd73c02cb8d02cf4cde3f4cee81548d6Alan Newberger                                }
39233035c19cc47adfb738c20cef66652ae451c8e10Mangesh Ghiware
39333035c19cc47adfb738c20cef66652ae451c8e10Mangesh Ghiware                                Uri contentUri = currentData.getContentUri();
39433035c19cc47adfb738c20cef66652ae451c8e10Mangesh Ghiware                                if (contentUri == null) {
39533035c19cc47adfb738c20cef66652ae451c8e10Mangesh Ghiware                                    hidePanoStitchingProgress();
39633035c19cc47adfb738c20cef66652ae451c8e10Mangesh Ghiware                                    return;
39733035c19cc47adfb738c20cef66652ae451c8e10Mangesh Ghiware                                }
39833035c19cc47adfb738c20cef66652ae451c8e10Mangesh Ghiware                                int panoStitchingProgress = mPanoramaManager.getTaskProgress(
399a5a08d7642a1fdf961b057cc90e76c4c93103c15Sascha Haeberling                                        contentUri);
40033035c19cc47adfb738c20cef66652ae451c8e10Mangesh Ghiware                                if (panoStitchingProgress < 0) {
40133035c19cc47adfb738c20cef66652ae451c8e10Mangesh Ghiware                                    hidePanoStitchingProgress();
40233035c19cc47adfb738c20cef66652ae451c8e10Mangesh Ghiware                                    return;
40333035c19cc47adfb738c20cef66652ae451c8e10Mangesh Ghiware                                }
40433035c19cc47adfb738c20cef66652ae451c8e10Mangesh Ghiware                                showPanoStitchingProgress();
40533035c19cc47adfb738c20cef66652ae451c8e10Mangesh Ghiware                                updateStitchingProgress(panoStitchingProgress);
40633035c19cc47adfb738c20cef66652ae451c8e10Mangesh Ghiware                            }
40737f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling                        }
40833035c19cc47adfb738c20cef66652ae451c8e10Mangesh Ghiware                    });
40937f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling                }
410394023fb7e3c8d07d4aeafc30bf4b66ed481ebb7Sascha Haeberling
411394023fb7e3c8d07d4aeafc30bf4b66ed481ebb7Sascha Haeberling                @Override
412aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu                public void onToggleSystemDecorsVisibility(int dataID) {
413aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu                    // If action bar is showing, hide it immediately, otherwise
414aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu                    // show action bar and hide it later
415394023fb7e3c8d07d4aeafc30bf4b66ed481ebb7Sascha Haeberling                    if (mActionBar.isShowing()) {
416aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu                        CameraActivity.this.setSystemBarsVisibility(false);
417394023fb7e3c8d07d4aeafc30bf4b66ed481ebb7Sascha Haeberling                    } else {
4188566dd777cd219254c945240a31ac97de28792a2ztenghui                        // Don't show the action bar if that is the camera preview.
4198566dd777cd219254c945240a31ac97de28792a2ztenghui                        boolean isCameraID = isCameraPreview(dataID);
4208566dd777cd219254c945240a31ac97de28792a2ztenghui                        if (!isCameraID) {
421aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu                            CameraActivity.this.setSystemBarsVisibility(true, true);
422fd43e3be3d69f48a97bdd9084e9549f41e963cc2ztenghui                        }
423394023fb7e3c8d07d4aeafc30bf4b66ed481ebb7Sascha Haeberling                    }
424394023fb7e3c8d07d4aeafc30bf4b66ed481ebb7Sascha Haeberling                }
425aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu
426aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu                @Override
427aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu                public void setSystemDecorsVisibility(boolean visible) {
428aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu                    CameraActivity.this.setSystemBarsVisibility(visible);
429aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu                }
43037f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling            };
43137f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling
4324ed20592482d2ab2f3f48ee72d5b1c06bf009034Sascha Haeberling    public void gotoGallery() {
4334ed20592482d2ab2f3f48ee72d5b1c06bf009034Sascha Haeberling        mFilmStripView.getController().goToNextItem();
4344ed20592482d2ab2f3f48ee72d5b1c06bf009034Sascha Haeberling    }
4354ed20592482d2ab2f3f48ee72d5b1c06bf009034Sascha Haeberling
4365199c2078f3aea06732015ce8ad354c066a2f4ecSascha Haeberling    /**
437aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu     * If {@param visible} is false, this hides the action bar and switches the system UI
438aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu     * to lights-out mode.
4395199c2078f3aea06732015ce8ad354c066a2f4ecSascha Haeberling     */
440aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu
441aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu    private void setSystemBarsVisibility(boolean visible) {
442aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu        setSystemBarsVisibility(visible, false);
443aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu    }
444aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu
445aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu    /**
446aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu     * If {@param visible} is false, this hides the action bar and switches the
447aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu     * system UI to lights-out mode. If {@param hideLater} is true, a delayed message
448aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu     * will be sent after a timeout to hide the action bar.
449aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu     */
450aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu    private void setSystemBarsVisibility(boolean visible, boolean hideLater) {
451aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu        mMainHandler.removeMessages(HIDE_ACTION_BAR);
452aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu        boolean currentlyVisible = mActionBar.isShowing();
453aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu
454aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu        if (visible != currentlyVisible) {
455aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu            int visibility = DEFAULT_SYSTEM_UI_VISIBILITY | (visible ? View.SYSTEM_UI_FLAG_VISIBLE
456aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu                    : IMMERSIVE_FLAGS);
457aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu            mAboveFilmstripControlLayout.setSystemUiVisibility(visibility);
458aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu            if (visible) {
459aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu                mActionBar.show();
460aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu            } else {
461aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu                mActionBar.hide();
462aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu            }
463aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu            if (mOnActionBarVisibilityListener != null) {
464aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu                mOnActionBarVisibilityListener.onActionBarVisibilityChanged(visible);
465aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu            }
466aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu        }
467aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu
468aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu        // Now delay hiding the bars
469aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu        if (visible && hideLater) {
470aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu            mMainHandler.sendEmptyMessageDelayed(HIDE_ACTION_BAR, SHOW_ACTION_BAR_TIMEOUT_MS);
4715199c2078f3aea06732015ce8ad354c066a2f4ecSascha Haeberling        }
4725199c2078f3aea06732015ce8ad354c066a2f4ecSascha Haeberling    }
4735199c2078f3aea06732015ce8ad354c066a2f4ecSascha Haeberling
47437f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling    private void hidePanoStitchingProgress() {
47537f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling        mPanoStitchingPanel.setVisibility(View.GONE);
47637f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling    }
47737f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling
47837f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling    private void showPanoStitchingProgress() {
47937f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling        mPanoStitchingPanel.setVisibility(View.VISIBLE);
48037f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling    }
48137f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling
48237f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling    private void updateStitchingProgress(int progress) {
48337f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling        mBottomProgress.setProgress(progress);
48437f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling    }
4858872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb
486a5682ab08e1d42fe272ec877929478b4adb769f5Mangesh Ghiware    @TargetApi(Build.VERSION_CODES.JELLY_BEAN)
487a5682ab08e1d42fe272ec877929478b4adb769f5Mangesh Ghiware    private void setupNfcBeamPush() {
488a5682ab08e1d42fe272ec877929478b4adb769f5Mangesh Ghiware        NfcAdapter adapter = NfcAdapter.getDefaultAdapter(CameraActivity.this);
489a5682ab08e1d42fe272ec877929478b4adb769f5Mangesh Ghiware        if (adapter == null) {
490a5682ab08e1d42fe272ec877929478b4adb769f5Mangesh Ghiware            return;
491a5682ab08e1d42fe272ec877929478b4adb769f5Mangesh Ghiware        }
492a5682ab08e1d42fe272ec877929478b4adb769f5Mangesh Ghiware
493a5682ab08e1d42fe272ec877929478b4adb769f5Mangesh Ghiware        if (!ApiHelper.HAS_SET_BEAM_PUSH_URIS) {
494a5682ab08e1d42fe272ec877929478b4adb769f5Mangesh Ghiware            // Disable beaming
495a5682ab08e1d42fe272ec877929478b4adb769f5Mangesh Ghiware            adapter.setNdefPushMessage(null, CameraActivity.this);
496a5682ab08e1d42fe272ec877929478b4adb769f5Mangesh Ghiware            return;
497a5682ab08e1d42fe272ec877929478b4adb769f5Mangesh Ghiware        }
498a5682ab08e1d42fe272ec877929478b4adb769f5Mangesh Ghiware
499a5682ab08e1d42fe272ec877929478b4adb769f5Mangesh Ghiware        adapter.setBeamPushUris(null, CameraActivity.this);
500a5682ab08e1d42fe272ec877929478b4adb769f5Mangesh Ghiware        adapter.setBeamPushUrisCallback(new CreateBeamUrisCallback() {
501a5682ab08e1d42fe272ec877929478b4adb769f5Mangesh Ghiware            @Override
502a5682ab08e1d42fe272ec877929478b4adb769f5Mangesh Ghiware            public Uri[] createBeamUris(NfcEvent event) {
503a5682ab08e1d42fe272ec877929478b4adb769f5Mangesh Ghiware                return mNfcPushUris;
504a5682ab08e1d42fe272ec877929478b4adb769f5Mangesh Ghiware            }
505a5682ab08e1d42fe272ec877929478b4adb769f5Mangesh Ghiware        }, CameraActivity.this);
506a5682ab08e1d42fe272ec877929478b4adb769f5Mangesh Ghiware    }
507a5682ab08e1d42fe272ec877929478b4adb769f5Mangesh Ghiware
508a5682ab08e1d42fe272ec877929478b4adb769f5Mangesh Ghiware    private void setNfcBeamPushUri(Uri uri) {
509a5682ab08e1d42fe272ec877929478b4adb769f5Mangesh Ghiware        mNfcPushUris[0] = uri;
510a5682ab08e1d42fe272ec877929478b4adb769f5Mangesh Ghiware    }
511a5682ab08e1d42fe272ec877929478b4adb769f5Mangesh Ghiware
512cd2eeb0efc4370f20e9836e20eb11cb974e3b00dMangesh Ghiware    private void setStandardShareIntent(Uri contentUri, String mimeType) {
51305804751ba07c8abcf422f57467d0ed3de95576cztenghui        mStandardShareIntent = getShareIntentFromType(mimeType);
51405804751ba07c8abcf422f57467d0ed3de95576cztenghui        if (mStandardShareIntent != null) {
51505804751ba07c8abcf422f57467d0ed3de95576cztenghui            mStandardShareIntent.putExtra(Intent.EXTRA_STREAM, contentUri);
51605804751ba07c8abcf422f57467d0ed3de95576cztenghui            mStandardShareIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
51705804751ba07c8abcf422f57467d0ed3de95576cztenghui            if (mStandardShareActionProvider != null) {
51805804751ba07c8abcf422f57467d0ed3de95576cztenghui                mStandardShareActionProvider.setShareIntent(mStandardShareIntent);
51905804751ba07c8abcf422f57467d0ed3de95576cztenghui            }
520cd2eeb0efc4370f20e9836e20eb11cb974e3b00dMangesh Ghiware        }
52105804751ba07c8abcf422f57467d0ed3de95576cztenghui    }
52205804751ba07c8abcf422f57467d0ed3de95576cztenghui
52305804751ba07c8abcf422f57467d0ed3de95576cztenghui    /**
52405804751ba07c8abcf422f57467d0ed3de95576cztenghui     * Get the share intent according to the mimeType
52505804751ba07c8abcf422f57467d0ed3de95576cztenghui     *
52605804751ba07c8abcf422f57467d0ed3de95576cztenghui     * @param mimeType The mimeType of current data.
52705804751ba07c8abcf422f57467d0ed3de95576cztenghui     * @return the video/image's ShareIntent or null if mimeType is invalid.
52805804751ba07c8abcf422f57467d0ed3de95576cztenghui     */
52905804751ba07c8abcf422f57467d0ed3de95576cztenghui    private Intent getShareIntentFromType(String mimeType) {
53005804751ba07c8abcf422f57467d0ed3de95576cztenghui        // Lazily create the intent object.
53105804751ba07c8abcf422f57467d0ed3de95576cztenghui        if (mimeType.startsWith("video/")) {
53205804751ba07c8abcf422f57467d0ed3de95576cztenghui            if (mVideoShareIntent == null) {
53305804751ba07c8abcf422f57467d0ed3de95576cztenghui                mVideoShareIntent = new Intent(Intent.ACTION_SEND);
53405804751ba07c8abcf422f57467d0ed3de95576cztenghui                mVideoShareIntent.setType("video/*");
53505804751ba07c8abcf422f57467d0ed3de95576cztenghui            }
53605804751ba07c8abcf422f57467d0ed3de95576cztenghui            return mVideoShareIntent;
53705804751ba07c8abcf422f57467d0ed3de95576cztenghui        } else if (mimeType.startsWith("image/")) {
53805804751ba07c8abcf422f57467d0ed3de95576cztenghui            if (mImageShareIntent == null) {
53905804751ba07c8abcf422f57467d0ed3de95576cztenghui                mImageShareIntent = new Intent(Intent.ACTION_SEND);
54005804751ba07c8abcf422f57467d0ed3de95576cztenghui                mImageShareIntent.setType("image/*");
54105804751ba07c8abcf422f57467d0ed3de95576cztenghui            }
54205804751ba07c8abcf422f57467d0ed3de95576cztenghui            return mImageShareIntent;
543cd2eeb0efc4370f20e9836e20eb11cb974e3b00dMangesh Ghiware        }
54405804751ba07c8abcf422f57467d0ed3de95576cztenghui        Log.w(TAG, "unsupported mimeType " + mimeType);
54505804751ba07c8abcf422f57467d0ed3de95576cztenghui        return null;
546cd2eeb0efc4370f20e9836e20eb11cb974e3b00dMangesh Ghiware    }
547cd2eeb0efc4370f20e9836e20eb11cb974e3b00dMangesh Ghiware
548cd2eeb0efc4370f20e9836e20eb11cb974e3b00dMangesh Ghiware    private void setPanoramaShareIntent(Uri contentUri) {
549cd2eeb0efc4370f20e9836e20eb11cb974e3b00dMangesh Ghiware        if (mPanoramaShareIntent == null) {
550cd2eeb0efc4370f20e9836e20eb11cb974e3b00dMangesh Ghiware            mPanoramaShareIntent = new Intent(Intent.ACTION_SEND);
551cd2eeb0efc4370f20e9836e20eb11cb974e3b00dMangesh Ghiware        }
552cd2eeb0efc4370f20e9836e20eb11cb974e3b00dMangesh Ghiware        mPanoramaShareIntent.setType("application/vnd.google.panorama360+jpg");
553cd2eeb0efc4370f20e9836e20eb11cb974e3b00dMangesh Ghiware        mPanoramaShareIntent.putExtra(Intent.EXTRA_STREAM, contentUri);
554cd2eeb0efc4370f20e9836e20eb11cb974e3b00dMangesh Ghiware        if (mPanoramaShareActionProvider != null) {
555cd2eeb0efc4370f20e9836e20eb11cb974e3b00dMangesh Ghiware            mPanoramaShareActionProvider.setShareIntent(mPanoramaShareIntent);
556cd2eeb0efc4370f20e9836e20eb11cb974e3b00dMangesh Ghiware        }
557cd2eeb0efc4370f20e9836e20eb11cb974e3b00dMangesh Ghiware    }
558cd2eeb0efc4370f20e9836e20eb11cb974e3b00dMangesh Ghiware
559aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu    @Override
560aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu    public void onMenuVisibilityChanged(boolean isVisible) {
561aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu        // If menu is showing, we need to make sure action bar does not go away.
562aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu        mMainHandler.removeMessages(HIDE_ACTION_BAR);
563aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu        if (!isVisible) {
564aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu            mMainHandler.sendEmptyMessageDelayed(HIDE_ACTION_BAR, SHOW_ACTION_BAR_TIMEOUT_MS);
565aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu        }
566aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu    }
567aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu
5680353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui    /**
5690353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui     * According to the data type, make the menu items for supported operations
5700353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui     * visible.
571a5a08d7642a1fdf961b057cc90e76c4c93103c15Sascha Haeberling     *
572fae11a165e344a38811770c7d348eda214683edcSascha Haeberling     * @param dataID the data ID of the current item.
5730353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui     */
574fae11a165e344a38811770c7d348eda214683edcSascha Haeberling    private void updateActionBarMenu(int dataID) {
575fae11a165e344a38811770c7d348eda214683edcSascha Haeberling        LocalData currentData = mDataAdapter.getLocalData(dataID);
576fae11a165e344a38811770c7d348eda214683edcSascha Haeberling        int type = currentData.getLocalDataType();
577fae11a165e344a38811770c7d348eda214683edcSascha Haeberling
5780353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui        if (mActionBarMenu == null) {
5790353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui            return;
5800353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui        }
5810353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui
5820353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui        int supported = 0;
5830353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui        switch (type) {
5840353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui            case LocalData.LOCAL_IMAGE:
5850353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui                supported |= SUPPORT_DELETE | SUPPORT_ROTATE | SUPPORT_INFO
5860353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui                        | SUPPORT_CROP | SUPPORT_SETAS | SUPPORT_EDIT
587cd2eeb0efc4370f20e9836e20eb11cb974e3b00dMangesh Ghiware                        | SUPPORT_SHARE | SUPPORT_SHOW_ON_MAP;
5880353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui                break;
5890353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui            case LocalData.LOCAL_VIDEO:
590cd2eeb0efc4370f20e9836e20eb11cb974e3b00dMangesh Ghiware                supported |= SUPPORT_DELETE | SUPPORT_INFO | SUPPORT_TRIM
591cd2eeb0efc4370f20e9836e20eb11cb974e3b00dMangesh Ghiware                        | SUPPORT_SHARE;
5920353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui                break;
5930353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui            case LocalData.LOCAL_PHOTO_SPHERE:
5940353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui                supported |= SUPPORT_DELETE | SUPPORT_ROTATE | SUPPORT_INFO
5950353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui                        | SUPPORT_CROP | SUPPORT_SETAS | SUPPORT_EDIT
596cd2eeb0efc4370f20e9836e20eb11cb974e3b00dMangesh Ghiware                        | SUPPORT_SHARE | SUPPORT_SHOW_ON_MAP;
597cd2eeb0efc4370f20e9836e20eb11cb974e3b00dMangesh Ghiware                break;
598cd2eeb0efc4370f20e9836e20eb11cb974e3b00dMangesh Ghiware            case LocalData.LOCAL_360_PHOTO_SPHERE:
599cd2eeb0efc4370f20e9836e20eb11cb974e3b00dMangesh Ghiware                supported |= SUPPORT_DELETE | SUPPORT_ROTATE | SUPPORT_INFO
600cd2eeb0efc4370f20e9836e20eb11cb974e3b00dMangesh Ghiware                        | SUPPORT_CROP | SUPPORT_SETAS | SUPPORT_EDIT
601cd2eeb0efc4370f20e9836e20eb11cb974e3b00dMangesh Ghiware                        | SUPPORT_SHARE | SUPPORT_SHARE_PANORAMA360
6020353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui                        | SUPPORT_SHOW_ON_MAP;
6030353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui                break;
6040353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui            default:
6050353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui                break;
6060353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui        }
6070353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui
6080353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui        setMenuItemVisible(mActionBarMenu, R.id.action_delete,
6090353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui                (supported & SUPPORT_DELETE) != 0);
6100353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui        setMenuItemVisible(mActionBarMenu, R.id.action_rotate_ccw,
6110353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui                (supported & SUPPORT_ROTATE) != 0);
6120353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui        setMenuItemVisible(mActionBarMenu, R.id.action_rotate_cw,
6130353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui                (supported & SUPPORT_ROTATE) != 0);
614cd2eeb0efc4370f20e9836e20eb11cb974e3b00dMangesh Ghiware        setMenuItemVisible(mActionBarMenu, R.id.action_details,
615cd2eeb0efc4370f20e9836e20eb11cb974e3b00dMangesh Ghiware                (supported & SUPPORT_INFO) != 0);
6160353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui        setMenuItemVisible(mActionBarMenu, R.id.action_crop,
6170353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui                (supported & SUPPORT_CROP) != 0);
6180353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui        setMenuItemVisible(mActionBarMenu, R.id.action_setas,
6190353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui                (supported & SUPPORT_SETAS) != 0);
6200353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui        setMenuItemVisible(mActionBarMenu, R.id.action_edit,
6210353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui                (supported & SUPPORT_EDIT) != 0);
622cd2eeb0efc4370f20e9836e20eb11cb974e3b00dMangesh Ghiware        setMenuItemVisible(mActionBarMenu, R.id.action_trim,
623cd2eeb0efc4370f20e9836e20eb11cb974e3b00dMangesh Ghiware                (supported & SUPPORT_TRIM) != 0);
624cd2eeb0efc4370f20e9836e20eb11cb974e3b00dMangesh Ghiware
62533035c19cc47adfb738c20cef66652ae451c8e10Mangesh Ghiware        boolean standardShare = (supported & SUPPORT_SHARE) != 0;
62633035c19cc47adfb738c20cef66652ae451c8e10Mangesh Ghiware        boolean panoramaShare = (supported & SUPPORT_SHARE_PANORAMA360) != 0;
62733035c19cc47adfb738c20cef66652ae451c8e10Mangesh Ghiware        setMenuItemVisible(mActionBarMenu, R.id.action_share, standardShare);
62833035c19cc47adfb738c20cef66652ae451c8e10Mangesh Ghiware        setMenuItemVisible(mActionBarMenu, R.id.action_share_panorama, panoramaShare);
62933035c19cc47adfb738c20cef66652ae451c8e10Mangesh Ghiware
63033035c19cc47adfb738c20cef66652ae451c8e10Mangesh Ghiware        if (panoramaShare) {
63133035c19cc47adfb738c20cef66652ae451c8e10Mangesh Ghiware            // For 360 PhotoSphere, relegate standard share to the overflow menu
63233035c19cc47adfb738c20cef66652ae451c8e10Mangesh Ghiware            MenuItem item = mActionBarMenu.findItem(R.id.action_share);
63333035c19cc47adfb738c20cef66652ae451c8e10Mangesh Ghiware            if (item != null) {
63433035c19cc47adfb738c20cef66652ae451c8e10Mangesh Ghiware                item.setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER);
63533035c19cc47adfb738c20cef66652ae451c8e10Mangesh Ghiware                item.setTitle(getResources().getString(R.string.share_as_photo));
63633035c19cc47adfb738c20cef66652ae451c8e10Mangesh Ghiware            }
63733035c19cc47adfb738c20cef66652ae451c8e10Mangesh Ghiware            // And, promote "share as panorama" to action bar
63833035c19cc47adfb738c20cef66652ae451c8e10Mangesh Ghiware            item = mActionBarMenu.findItem(R.id.action_share_panorama);
63933035c19cc47adfb738c20cef66652ae451c8e10Mangesh Ghiware            if (item != null) {
64033035c19cc47adfb738c20cef66652ae451c8e10Mangesh Ghiware                item.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
64133035c19cc47adfb738c20cef66652ae451c8e10Mangesh Ghiware            }
642cd2eeb0efc4370f20e9836e20eb11cb974e3b00dMangesh Ghiware            setPanoramaShareIntent(currentData.getContentUri());
643cd2eeb0efc4370f20e9836e20eb11cb974e3b00dMangesh Ghiware        }
64433035c19cc47adfb738c20cef66652ae451c8e10Mangesh Ghiware        if (standardShare) {
64533035c19cc47adfb738c20cef66652ae451c8e10Mangesh Ghiware            if (!panoramaShare) {
64633035c19cc47adfb738c20cef66652ae451c8e10Mangesh Ghiware                MenuItem item = mActionBarMenu.findItem(R.id.action_share);
64733035c19cc47adfb738c20cef66652ae451c8e10Mangesh Ghiware                if (item != null) {
64833035c19cc47adfb738c20cef66652ae451c8e10Mangesh Ghiware                    item.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
64933035c19cc47adfb738c20cef66652ae451c8e10Mangesh Ghiware                    item.setTitle(getResources().getString(R.string.share));
65033035c19cc47adfb738c20cef66652ae451c8e10Mangesh Ghiware                }
65133035c19cc47adfb738c20cef66652ae451c8e10Mangesh Ghiware            }
65233035c19cc47adfb738c20cef66652ae451c8e10Mangesh Ghiware            setStandardShareIntent(currentData.getContentUri(), currentData.getMimeType());
653a5682ab08e1d42fe272ec877929478b4adb769f5Mangesh Ghiware            setNfcBeamPushUri(currentData.getContentUri());
65433035c19cc47adfb738c20cef66652ae451c8e10Mangesh Ghiware        }
655fae11a165e344a38811770c7d348eda214683edcSascha Haeberling
656fae11a165e344a38811770c7d348eda214683edcSascha Haeberling        boolean itemHasLocation = currentData.getLatLong() != null;
657fae11a165e344a38811770c7d348eda214683edcSascha Haeberling        setMenuItemVisible(mActionBarMenu, R.id.action_show_on_map,
658fae11a165e344a38811770c7d348eda214683edcSascha Haeberling                itemHasLocation && (supported & SUPPORT_SHOW_ON_MAP) != 0);
6590353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui    }
6600353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui
6610353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui    private void setMenuItemVisible(Menu menu, int itemId, boolean visible) {
6620353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui        MenuItem item = menu.findItem(itemId);
6630353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui        if (item != null)
6640353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui            item.setVisible(visible);
6650353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui    }
6660353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui
6676798c34ddb5248f038f351674c6a6c7a20992c8cAngus Kong    private ImageTaskManager.TaskListener mStitchingListener =
6686798c34ddb5248f038f351674c6a6c7a20992c8cAngus Kong            new ImageTaskManager.TaskListener() {
6696798c34ddb5248f038f351674c6a6c7a20992c8cAngus Kong                @Override
67037f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling                public void onTaskQueued(String filePath, final Uri imageUri) {
67137f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling                    mMainHandler.post(new Runnable() {
67237f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling                        @Override
67337f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling                        public void run() {
67437f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling                            notifyNewMedia(imageUri);
67537f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling                        }
67637f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling                    });
6776798c34ddb5248f038f351674c6a6c7a20992c8cAngus Kong                }
6786798c34ddb5248f038f351674c6a6c7a20992c8cAngus Kong
6796798c34ddb5248f038f351674c6a6c7a20992c8cAngus Kong                @Override
68037f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling                public void onTaskDone(String filePath, final Uri imageUri) {
68137f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling                    Log.v(TAG, "onTaskDone:" + filePath);
68237f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling                    mMainHandler.post(new Runnable() {
68337f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling                        @Override
68437f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling                        public void run() {
68537f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling                            int doneID = mDataAdapter.findDataByContentUri(imageUri);
68637f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling                            int currentDataId = mFilmStripView.getCurrentId();
68737f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling
68837f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling                            if (currentDataId == doneID) {
68937f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling                                hidePanoStitchingProgress();
69037f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling                                updateStitchingProgress(0);
69137f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling                            }
69237f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling
69337f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling                            mDataAdapter.refresh(getContentResolver(), imageUri);
69437f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling                        }
69537f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling                    });
6966798c34ddb5248f038f351674c6a6c7a20992c8cAngus Kong                }
6976798c34ddb5248f038f351674c6a6c7a20992c8cAngus Kong
6986798c34ddb5248f038f351674c6a6c7a20992c8cAngus Kong                @Override
6996798c34ddb5248f038f351674c6a6c7a20992c8cAngus Kong                public void onTaskProgress(
70037f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling                        String filePath, final Uri imageUri, final int progress) {
70137f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling                    mMainHandler.post(new Runnable() {
70237f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling                        @Override
70337f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling                        public void run() {
70437f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling                            int currentDataId = mFilmStripView.getCurrentId();
70537f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling                            if (currentDataId == -1) {
70637f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling                                return;
70737f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling                            }
70837f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling                            if (imageUri.equals(
70937f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling                                    mDataAdapter.getLocalData(currentDataId).getContentUri())) {
71037f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling                                updateStitchingProgress(progress);
71137f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling                            }
71237f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling                        }
71337f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling                    });
7146798c34ddb5248f038f351674c6a6c7a20992c8cAngus Kong                }
7156798c34ddb5248f038f351674c6a6c7a20992c8cAngus Kong            };
7166798c34ddb5248f038f351674c6a6c7a20992c8cAngus Kong
7176432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu    public MediaSaveService getMediaSaveService() {
7186432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu        return mMediaSaveService;
7198872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb    }
7208872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb
7216432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu    public void notifyNewMedia(Uri uri) {
7226432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu        ContentResolver cr = getContentResolver();
7236432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu        String mimeType = cr.getType(uri);
7246432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu        if (mimeType.startsWith("video/")) {
725b50b5cbfbc0a67db6fc43373363b10381c9c61a3Angus Kong            sendBroadcast(new Intent(CameraUtil.ACTION_NEW_VIDEO, uri));
7266432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu            mDataAdapter.addNewVideo(cr, uri);
7276432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu        } else if (mimeType.startsWith("image/")) {
728b50b5cbfbc0a67db6fc43373363b10381c9c61a3Angus Kong            CameraUtil.broadcastNewPicture(this, uri);
7296432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu            mDataAdapter.addNewPhoto(cr, uri);
73037f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling        } else if (mimeType.startsWith("application/stitching-preview")) {
73137f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling            mDataAdapter.addNewPhoto(cr, uri);
7326432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu        } else {
7336432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu            android.util.Log.w(TAG, "Unknown new media with MIME type:"
7346432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu                    + mimeType + ", uri:" + uri);
7356432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu        }
7368872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb    }
7378872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb
7386432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu    private void removeData(int dataID) {
7396432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu        mDataAdapter.removeData(CameraActivity.this, dataID);
740742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu        if (mDataAdapter.getTotalNumber() > 1) {
741742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu            showUndoDeletionBar();
742742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu        } else {
743742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu            // If camera preview is the only view left in filmstrip,
744742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu            // no need to show undo bar.
745742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu            performDeletion();
746742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu        }
7478872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb    }
7488872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb
7496432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu    private void bindMediaSaveService() {
7506432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu        Intent intent = new Intent(this, MediaSaveService.class);
7516432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu        bindService(intent, mConnection, Context.BIND_AUTO_CREATE);
7528872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb    }
7538872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb
7546432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu    private void unbindMediaSaveService() {
7556432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu        if (mConnection != null) {
7566432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu            unbindService(mConnection);
7576432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu        }
7588872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb    }
7598872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb
7606432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu    @Override
7610353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui    public boolean onCreateOptionsMenu(Menu menu) {
7620353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui        // Inflate the menu items for use in the action bar
7630353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui        MenuInflater inflater = getMenuInflater();
7640353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui        inflater.inflate(R.menu.operations, menu);
7650353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui        mActionBarMenu = menu;
766cd2eeb0efc4370f20e9836e20eb11cb974e3b00dMangesh Ghiware
767cd2eeb0efc4370f20e9836e20eb11cb974e3b00dMangesh Ghiware        // Configure the standard share action provider
768cd2eeb0efc4370f20e9836e20eb11cb974e3b00dMangesh Ghiware        MenuItem item = menu.findItem(R.id.action_share);
769cd2eeb0efc4370f20e9836e20eb11cb974e3b00dMangesh Ghiware        mStandardShareActionProvider = (ShareActionProvider) item.getActionProvider();
77033035c19cc47adfb738c20cef66652ae451c8e10Mangesh Ghiware        mStandardShareActionProvider.setShareHistoryFileName("standard_share_history.xml");
771cd2eeb0efc4370f20e9836e20eb11cb974e3b00dMangesh Ghiware        if (mStandardShareIntent != null) {
772cd2eeb0efc4370f20e9836e20eb11cb974e3b00dMangesh Ghiware            mStandardShareActionProvider.setShareIntent(mStandardShareIntent);
773cd2eeb0efc4370f20e9836e20eb11cb974e3b00dMangesh Ghiware        }
774cd2eeb0efc4370f20e9836e20eb11cb974e3b00dMangesh Ghiware
775cd2eeb0efc4370f20e9836e20eb11cb974e3b00dMangesh Ghiware        // Configure the panorama share action provider
776cd2eeb0efc4370f20e9836e20eb11cb974e3b00dMangesh Ghiware        item = menu.findItem(R.id.action_share_panorama);
777cd2eeb0efc4370f20e9836e20eb11cb974e3b00dMangesh Ghiware        mPanoramaShareActionProvider = (ShareActionProvider) item.getActionProvider();
77833035c19cc47adfb738c20cef66652ae451c8e10Mangesh Ghiware        mPanoramaShareActionProvider.setShareHistoryFileName("panorama_share_history.xml");
779cd2eeb0efc4370f20e9836e20eb11cb974e3b00dMangesh Ghiware        if (mPanoramaShareIntent != null) {
780cd2eeb0efc4370f20e9836e20eb11cb974e3b00dMangesh Ghiware            mPanoramaShareActionProvider.setShareIntent(mPanoramaShareIntent);
781cd2eeb0efc4370f20e9836e20eb11cb974e3b00dMangesh Ghiware        }
782cd2eeb0efc4370f20e9836e20eb11cb974e3b00dMangesh Ghiware
7830353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui        return super.onCreateOptionsMenu(menu);
7840353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui    }
7850353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui
7860353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui    @Override
7870353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui    public boolean onOptionsItemSelected(MenuItem item) {
7886f64b50db6565bc6454304fd20c0c4020b297bb7Sascha Haeberling        int currentDataId = mFilmStripView.getCurrentId();
7896f64b50db6565bc6454304fd20c0c4020b297bb7Sascha Haeberling        if (currentDataId < 0) {
7906f64b50db6565bc6454304fd20c0c4020b297bb7Sascha Haeberling            return false;
7916f64b50db6565bc6454304fd20c0c4020b297bb7Sascha Haeberling        }
7926f64b50db6565bc6454304fd20c0c4020b297bb7Sascha Haeberling        final LocalData localData = mDataAdapter.getLocalData(currentDataId);
7936f64b50db6565bc6454304fd20c0c4020b297bb7Sascha Haeberling
7940353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui        // Handle presses on the action bar items
7950353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui        switch (item.getItemId()) {
7963f969c1735e2636bf22dfe44104d0e99924cca97Alan Newberger            case android.R.id.home:
7973f969c1735e2636bf22dfe44104d0e99924cca97Alan Newberger                // ActionBar's Up/Home button was clicked
798690dc4722d068a1838b16dc0eabe9c7d518d524cAngus Kong                if (!CameraUtil.launchGallery(CameraActivity.this)) {
7995df64b0a818d4f85cb14602db725f05b0055c1d9Mangesh Ghiware                    mFilmStripView.getController().goToFirstItem();
8005df64b0a818d4f85cb14602db725f05b0055c1d9Mangesh Ghiware                }
8013f969c1735e2636bf22dfe44104d0e99924cca97Alan Newberger                return true;
8020353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui            case R.id.action_delete:
803e857cc90a98e280e2008beb03e2446bd642d2ec4Angus Kong                removeData(currentDataId);
8040353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui                return true;
8050353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui            case R.id.action_edit:
80688ef7664ba6a888fa5da8693091674e152b56192Sascha Haeberling                launchEditor(localData);
8070353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui                return true;
8080819304bc06ffd3498d9fd0d8a148c50f0903c46nicolasroard            case R.id.action_trim: {
8096b9203214d828d72758943aca55adceab684a862ztenghui                // This is going to be handled by the Gallery app.
8106b9203214d828d72758943aca55adceab684a862ztenghui                Intent intent = new Intent(ACTION_TRIM_VIDEO);
8116b9203214d828d72758943aca55adceab684a862ztenghui                LocalData currentData = mDataAdapter.getLocalData(
8126b9203214d828d72758943aca55adceab684a862ztenghui                        mFilmStripView.getCurrentId());
8136b9203214d828d72758943aca55adceab684a862ztenghui                intent.setData(currentData.getContentUri());
8146b9203214d828d72758943aca55adceab684a862ztenghui                // We need the file path to wrap this into a RandomAccessFile.
8156b9203214d828d72758943aca55adceab684a862ztenghui                intent.putExtra(MEDIA_ITEM_PATH, currentData.getPath());
816b7639c641f2ed5d0c60546349c3aa9e90c026878Sascha Haeberling                startActivityForResult(intent, REQ_CODE_DONT_SWITCH_TO_PREVIEW);
8170353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui                return true;
8180819304bc06ffd3498d9fd0d8a148c50f0903c46nicolasroard            }
8190353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui            case R.id.action_rotate_ccw:
820a16e7b50f3148f581439509279f242092e254309ztenghui                localData.rotate90Degrees(this, mDataAdapter, currentDataId, false);
8210353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui                return true;
8220353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui            case R.id.action_rotate_cw:
823a16e7b50f3148f581439509279f242092e254309ztenghui                localData.rotate90Degrees(this, mDataAdapter, currentDataId, true);
8240353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui                return true;
82519ab725a5e640a1a20b1a6def083e37d1d1c1e20nicolasroard            case R.id.action_crop: {
82619ab725a5e640a1a20b1a6def083e37d1d1c1e20nicolasroard                Intent intent = new Intent(CropActivity.CROP_ACTION);
82719ab725a5e640a1a20b1a6def083e37d1d1c1e20nicolasroard                intent.setClass(this, CropActivity.class);
82819ab725a5e640a1a20b1a6def083e37d1d1c1e20nicolasroard                intent.setDataAndType(localData.getContentUri(), localData.getMimeType())
82919ab725a5e640a1a20b1a6def083e37d1d1c1e20nicolasroard                        .setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
83019ab725a5e640a1a20b1a6def083e37d1d1c1e20nicolasroard                startActivityForResult(intent, REQ_CODE_DONT_SWITCH_TO_PREVIEW);
8310353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui                return true;
83219ab725a5e640a1a20b1a6def083e37d1d1c1e20nicolasroard            }
8330819304bc06ffd3498d9fd0d8a148c50f0903c46nicolasroard            case R.id.action_setas: {
8340819304bc06ffd3498d9fd0d8a148c50f0903c46nicolasroard                Intent intent = new Intent(Intent.ACTION_ATTACH_DATA)
8350819304bc06ffd3498d9fd0d8a148c50f0903c46nicolasroard                        .setDataAndType(localData.getContentUri(),
8360819304bc06ffd3498d9fd0d8a148c50f0903c46nicolasroard                                localData.getMimeType())
8370819304bc06ffd3498d9fd0d8a148c50f0903c46nicolasroard                        .setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
8380819304bc06ffd3498d9fd0d8a148c50f0903c46nicolasroard                intent.putExtra("mimeType", intent.getType());
839b7639c641f2ed5d0c60546349c3aa9e90c026878Sascha Haeberling                startActivityForResult(Intent.createChooser(
840b7639c641f2ed5d0c60546349c3aa9e90c026878Sascha Haeberling                        intent, getString(R.string.set_as)), REQ_CODE_DONT_SWITCH_TO_PREVIEW);
8410353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui                return true;
8420819304bc06ffd3498d9fd0d8a148c50f0903c46nicolasroard            }
8430353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui            case R.id.action_details:
8446f64b50db6565bc6454304fd20c0c4020b297bb7Sascha Haeberling                (new AsyncTask<Void, Void, MediaDetails>() {
8456f64b50db6565bc6454304fd20c0c4020b297bb7Sascha Haeberling                    @Override
8466f64b50db6565bc6454304fd20c0c4020b297bb7Sascha Haeberling                    protected MediaDetails doInBackground(Void... params) {
8476f64b50db6565bc6454304fd20c0c4020b297bb7Sascha Haeberling                        return localData.getMediaDetails(CameraActivity.this);
8486f64b50db6565bc6454304fd20c0c4020b297bb7Sascha Haeberling                    }
8496f64b50db6565bc6454304fd20c0c4020b297bb7Sascha Haeberling
8506f64b50db6565bc6454304fd20c0c4020b297bb7Sascha Haeberling                    @Override
8516f64b50db6565bc6454304fd20c0c4020b297bb7Sascha Haeberling                    protected void onPostExecute(MediaDetails mediaDetails) {
8526f64b50db6565bc6454304fd20c0c4020b297bb7Sascha Haeberling                        DetailsDialog.create(CameraActivity.this, mediaDetails).show();
8536f64b50db6565bc6454304fd20c0c4020b297bb7Sascha Haeberling                    }
8546f64b50db6565bc6454304fd20c0c4020b297bb7Sascha Haeberling                }).execute();
8550353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui                return true;
8560353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui            case R.id.action_show_on_map:
857fae11a165e344a38811770c7d348eda214683edcSascha Haeberling                double[] latLong = localData.getLatLong();
858fae11a165e344a38811770c7d348eda214683edcSascha Haeberling                if (latLong != null) {
859a5a08d7642a1fdf961b057cc90e76c4c93103c15Sascha Haeberling                    CameraUtil.showOnMap(this, latLong);
860fae11a165e344a38811770c7d348eda214683edcSascha Haeberling                }
8610353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui                return true;
8620353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui            default:
8630353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui                return super.onOptionsItemSelected(item);
8640353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui        }
8650353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui    }
8660353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui
867fd43e3be3d69f48a97bdd9084e9549f41e963cc2ztenghui    private boolean isCaptureIntent() {
868fd43e3be3d69f48a97bdd9084e9549f41e963cc2ztenghui        if (MediaStore.ACTION_VIDEO_CAPTURE.equals(getIntent().getAction())
869fd43e3be3d69f48a97bdd9084e9549f41e963cc2ztenghui                || MediaStore.ACTION_IMAGE_CAPTURE.equals(getIntent().getAction())
870fd43e3be3d69f48a97bdd9084e9549f41e963cc2ztenghui                || MediaStore.ACTION_IMAGE_CAPTURE_SECURE.equals(getIntent().getAction())) {
871fd43e3be3d69f48a97bdd9084e9549f41e963cc2ztenghui            return true;
872fd43e3be3d69f48a97bdd9084e9549f41e963cc2ztenghui        } else {
873fd43e3be3d69f48a97bdd9084e9549f41e963cc2ztenghui            return false;
874fd43e3be3d69f48a97bdd9084e9549f41e963cc2ztenghui        }
875fd43e3be3d69f48a97bdd9084e9549f41e963cc2ztenghui    }
876fd43e3be3d69f48a97bdd9084e9549f41e963cc2ztenghui
8770353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui    @Override
8786432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu    public void onCreate(Bundle state) {
8796432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu        super.onCreate(state);
88050df47071c776703a36dbc4cb90ec8d1df3c0f6eztenghui        getWindow().requestFeature(Window.FEATURE_ACTION_BAR);
8816432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu        setContentView(R.layout.camera_filmstrip);
882fa9e2cc9ccbcd746f5765cb7a0afebcdb60e2973ztenghui        mActionBar = getActionBar();
883aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu        mActionBar.addOnMenuVisibilityListener(this);
884fa9e2cc9ccbcd746f5765cb7a0afebcdb60e2973ztenghui
8856432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu        if (ApiHelper.HAS_ROTATION_ANIMATION) {
8866432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu            setRotationAnimation();
8876432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu        }
888aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu
889aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu        mMainHandler = new MainHandler(getMainLooper());
8906432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu        // Check if this is in the secure camera mode.
8916432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu        Intent intent = getIntent();
8926432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu        String action = intent.getAction();
893b84b9738c855a525dc1944165983cc3c342ce446Doris Liu        if (INTENT_ACTION_STILL_IMAGE_CAMERA_SECURE.equals(action)
894b84b9738c855a525dc1944165983cc3c342ce446Doris Liu                || ACTION_IMAGE_CAPTURE_SECURE.equals(action)) {
8956432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu            mSecureCamera = true;
8966432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu        } else {
8976432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu            mSecureCamera = intent.getBooleanExtra(SECURE_CAMERA_EXTRA, false);
8988872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb        }
899b84b9738c855a525dc1944165983cc3c342ce446Doris Liu
900b84b9738c855a525dc1944165983cc3c342ce446Doris Liu        if (mSecureCamera) {
901b84b9738c855a525dc1944165983cc3c342ce446Doris Liu            // Change the window flags so that secure camera can show when locked
902b84b9738c855a525dc1944165983cc3c342ce446Doris Liu            Window win = getWindow();
903b84b9738c855a525dc1944165983cc3c342ce446Doris Liu            WindowManager.LayoutParams params = win.getAttributes();
904b84b9738c855a525dc1944165983cc3c342ce446Doris Liu            params.flags |= WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED;
905b84b9738c855a525dc1944165983cc3c342ce446Doris Liu            win.setAttributes(params);
906b84b9738c855a525dc1944165983cc3c342ce446Doris Liu
907b84b9738c855a525dc1944165983cc3c342ce446Doris Liu            // Filter for screen off so that we can finish secure camera activity
908b84b9738c855a525dc1944165983cc3c342ce446Doris Liu            // when screen is off.
9096432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu            IntentFilter filter = new IntentFilter(Intent.ACTION_SCREEN_OFF);
9106432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu            registerReceiver(mScreenOffReceiver, filter);
9116a8e8a1a0f3e8e62cd350733e275047475380d6bAngus Kong            // TODO: This static screen off event receiver is a workaround to the
9126a8e8a1a0f3e8e62cd350733e275047475380d6bAngus Kong            // double onResume() invocation (onResume->onPause->onResume). We should
9136a8e8a1a0f3e8e62cd350733e275047475380d6bAngus Kong            // find a better solution to this.
9146a8e8a1a0f3e8e62cd350733e275047475380d6bAngus Kong            if (sScreenOffReceiver == null) {
9156a8e8a1a0f3e8e62cd350733e275047475380d6bAngus Kong                sScreenOffReceiver = new ScreenOffReceiver();
9166a8e8a1a0f3e8e62cd350733e275047475380d6bAngus Kong                registerReceiver(sScreenOffReceiver, filter);
9176a8e8a1a0f3e8e62cd350733e275047475380d6bAngus Kong            }
918b84b9738c855a525dc1944165983cc3c342ce446Doris Liu        }
919653c43be6e58be54cf2ac3c8efb2d65ac20bd03bAngus Kong        mAboveFilmstripControlLayout =
920653c43be6e58be54cf2ac3c8efb2d65ac20bd03bAngus Kong                (FrameLayout) findViewById(R.id.camera_above_filmstrip_layout);
921653c43be6e58be54cf2ac3c8efb2d65ac20bd03bAngus Kong        mAboveFilmstripControlLayout.setFitsSystemWindows(true);
9225199c2078f3aea06732015ce8ad354c066a2f4ecSascha Haeberling        // Hide action bar first since we are in full screen mode first, and
9235199c2078f3aea06732015ce8ad354c066a2f4ecSascha Haeberling        // switch the system UI to lights-out mode.
924aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu        this.setSystemBarsVisibility(false);
925ed15d1a140986473bbe7fffd72ec9618c41c5979Angus Kong        mPanoramaManager = AppManagerFactory.getInstance(this)
926ed15d1a140986473bbe7fffd72ec9618c41c5979Angus Kong                .getPanoramaStitchingManager();
9276798c34ddb5248f038f351674c6a6c7a20992c8cAngus Kong        mPanoramaManager.addTaskListener(mStitchingListener);
9286432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu        LayoutInflater inflater = getLayoutInflater();
9296432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu        View rootLayout = inflater.inflate(R.layout.camera, null, false);
930653c43be6e58be54cf2ac3c8efb2d65ac20bd03bAngus Kong        mCameraModuleRootView = rootLayout.findViewById(R.id.camera_app_root);
931fa9e2cc9ccbcd746f5765cb7a0afebcdb60e2973ztenghui        mPanoStitchingPanel = findViewById(R.id.pano_stitching_progress_panel);
93237f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling        mBottomProgress = (ProgressBar) findViewById(R.id.pano_stitching_progress_bar);
9338e5e4eedb25a4589342660b928935acca4375fc7Angus Kong        mCameraPreviewData = new CameraPreviewData(rootLayout,
9348e5e4eedb25a4589342660b928935acca4375fc7Angus Kong                FilmStripView.ImageData.SIZE_FULL,
9358e5e4eedb25a4589342660b928935acca4375fc7Angus Kong                FilmStripView.ImageData.SIZE_FULL);
93637f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling        // Put a CameraPreviewData at the first position.
9378e5e4eedb25a4589342660b928935acca4375fc7Angus Kong        mWrappedDataAdapter = new FixedFirstDataAdapter(
9388e5e4eedb25a4589342660b928935acca4375fc7Angus Kong                new CameraDataAdapter(new ColorDrawable(
9398e5e4eedb25a4589342660b928935acca4375fc7Angus Kong                        getResources().getColor(R.color.photo_placeholder))),
9408e5e4eedb25a4589342660b928935acca4375fc7Angus Kong                mCameraPreviewData);
9416432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu        mFilmStripView = (FilmStripView) findViewById(R.id.filmstrip_view);
9426432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu        mFilmStripView.setViewGap(
9436432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu                getResources().getDimensionPixelSize(R.dimen.camera_film_strip_gap));
944f1f5186f7d3fd8bf35009d9e65a43914c664d82bSascha Haeberling        mPanoramaViewHelper = new PanoramaViewHelper(this);
945f1f5186f7d3fd8bf35009d9e65a43914c664d82bSascha Haeberling        mPanoramaViewHelper.onCreate();
946f1f5186f7d3fd8bf35009d9e65a43914c664d82bSascha Haeberling        mFilmStripView.setPanoramaViewHelper(mPanoramaViewHelper);
9476432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu        // Set up the camera preview first so the preview shows up ASAP.
9486432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu        mFilmStripView.setListener(mFilmStripListener);
9492654dd9bb6a7d917dab1a48e2182c4f49fe71f11Sascha Haeberling
9502654dd9bb6a7d917dab1a48e2182c4f49fe71f11Sascha Haeberling        int moduleIndex = -1;
9512a7f44cac888de5683d05bef5708f846ee950f43Doris Liu        if (MediaStore.INTENT_ACTION_VIDEO_CAMERA.equals(getIntent().getAction())
9522a7f44cac888de5683d05bef5708f846ee950f43Doris Liu                || MediaStore.ACTION_VIDEO_CAPTURE.equals(getIntent().getAction())) {
953ed15d1a140986473bbe7fffd72ec9618c41c5979Angus Kong            moduleIndex = ModuleSwitcher.VIDEO_MODULE_INDEX;
9542654dd9bb6a7d917dab1a48e2182c4f49fe71f11Sascha Haeberling        } else if (MediaStore.INTENT_ACTION_STILL_IMAGE_CAMERA.equals(getIntent().getAction())
9552654dd9bb6a7d917dab1a48e2182c4f49fe71f11Sascha Haeberling                || MediaStore.INTENT_ACTION_STILL_IMAGE_CAMERA_SECURE.equals(getIntent()
9562654dd9bb6a7d917dab1a48e2182c4f49fe71f11Sascha Haeberling                        .getAction())
9572654dd9bb6a7d917dab1a48e2182c4f49fe71f11Sascha Haeberling                || MediaStore.ACTION_IMAGE_CAPTURE.equals(getIntent().getAction())
9582654dd9bb6a7d917dab1a48e2182c4f49fe71f11Sascha Haeberling                || MediaStore.ACTION_IMAGE_CAPTURE_SECURE.equals(getIntent().getAction())) {
959ed15d1a140986473bbe7fffd72ec9618c41c5979Angus Kong            moduleIndex = ModuleSwitcher.PHOTO_MODULE_INDEX;
9602a7f44cac888de5683d05bef5708f846ee950f43Doris Liu        } else {
9612654dd9bb6a7d917dab1a48e2182c4f49fe71f11Sascha Haeberling            // If the activity has not been started using an explicit intent,
9622654dd9bb6a7d917dab1a48e2182c4f49fe71f11Sascha Haeberling            // read the module index from the last time the user changed modes
9632654dd9bb6a7d917dab1a48e2182c4f49fe71f11Sascha Haeberling            SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
9642654dd9bb6a7d917dab1a48e2182c4f49fe71f11Sascha Haeberling            moduleIndex = prefs.getInt(PREF_STARTUP_MODULE_INDEX, -1);
965a9d66bdab247626b31dc182c4d62520b3abffdbdRuben Brunk            if ((moduleIndex == ModuleSwitcher.GCAM_MODULE_INDEX &&
966a9d66bdab247626b31dc182c4d62520b3abffdbdRuben Brunk                    !GcamHelper.hasGcamCapture(this)) || moduleIndex < 0) {
967ed15d1a140986473bbe7fffd72ec9618c41c5979Angus Kong                moduleIndex = ModuleSwitcher.PHOTO_MODULE_INDEX;
9682654dd9bb6a7d917dab1a48e2182c4f49fe71f11Sascha Haeberling            }
9692a7f44cac888de5683d05bef5708f846ee950f43Doris Liu        }
9702654dd9bb6a7d917dab1a48e2182c4f49fe71f11Sascha Haeberling
9716432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu        mOrientationListener = new MyOrientationEventListener(this);
972ed15d1a140986473bbe7fffd72ec9618c41c5979Angus Kong        setModuleFromIndex(moduleIndex);
973ed15d1a140986473bbe7fffd72ec9618c41c5979Angus Kong        mCurrentModule.init(this, mCameraModuleRootView);
97437f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling
97537f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling        if (!mSecureCamera) {
97637f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling            mDataAdapter = mWrappedDataAdapter;
977dcccc510652b835fdbd39310a07849af8203052aAngus Kong            mFilmStripView.setDataAdapter(mDataAdapter);
978a71946012df0eee8fe4859a22da3c56feba0344eAngus Kong            if (!isCaptureIntent()) {
979a71946012df0eee8fe4859a22da3c56feba0344eAngus Kong                mDataAdapter.requestLoad(getContentResolver());
980a71946012df0eee8fe4859a22da3c56feba0344eAngus Kong            }
98137f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling        } else {
982a5a08d7642a1fdf961b057cc90e76c4c93103c15Sascha Haeberling            // Put a lock placeholder as the last image by setting its date to
983a5a08d7642a1fdf961b057cc90e76c4c93103c15Sascha Haeberling            // 0.
98437f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling            ImageView v = (ImageView) getLayoutInflater().inflate(
98537f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling                    R.layout.secure_album_placeholder, null);
986690dc4722d068a1838b16dc0eabe9c7d518d524cAngus Kong            v.setOnClickListener(new View.OnClickListener() {
987690dc4722d068a1838b16dc0eabe9c7d518d524cAngus Kong                @Override
988690dc4722d068a1838b16dc0eabe9c7d518d524cAngus Kong                public void onClick(View view) {
989690dc4722d068a1838b16dc0eabe9c7d518d524cAngus Kong                    CameraUtil.launchGallery(CameraActivity.this);
990690dc4722d068a1838b16dc0eabe9c7d518d524cAngus Kong                    finish();
991690dc4722d068a1838b16dc0eabe9c7d518d524cAngus Kong                }
992690dc4722d068a1838b16dc0eabe9c7d518d524cAngus Kong            });
99337f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling            mDataAdapter = new FixedLastDataAdapter(
99437f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling                    mWrappedDataAdapter,
995bd26069d391830856c57c2141cd2efbc8423d871Angus Kong                    new SimpleViewData(
99637f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling                            v,
99737f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling                            v.getDrawable().getIntrinsicWidth(),
99837f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling                            v.getDrawable().getIntrinsicHeight(),
99937f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling                            0, 0));
100037f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling            // Flush out all the original data.
100137f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling            mDataAdapter.flush();
1002dcccc510652b835fdbd39310a07849af8203052aAngus Kong            mFilmStripView.setDataAdapter(mDataAdapter);
100337f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling        }
1004a5682ab08e1d42fe272ec877929478b4adb769f5Mangesh Ghiware
1005a5682ab08e1d42fe272ec877929478b4adb769f5Mangesh Ghiware        setupNfcBeamPush();
1006064d6000933354f7bf344a41e0caa7052401c903ztenghui
1007064d6000933354f7bf344a41e0caa7052401c903ztenghui        mLocalImagesObserver = new LocalMediaObserver(mMainHandler, this);
1008064d6000933354f7bf344a41e0caa7052401c903ztenghui        mLocalVideosObserver = new LocalMediaObserver(mMainHandler, this);
1009064d6000933354f7bf344a41e0caa7052401c903ztenghui
1010064d6000933354f7bf344a41e0caa7052401c903ztenghui        getContentResolver().registerContentObserver(
1011064d6000933354f7bf344a41e0caa7052401c903ztenghui                MediaStore.Images.Media.EXTERNAL_CONTENT_URI, true,
1012064d6000933354f7bf344a41e0caa7052401c903ztenghui                mLocalImagesObserver);
1013064d6000933354f7bf344a41e0caa7052401c903ztenghui        getContentResolver().registerContentObserver(
1014064d6000933354f7bf344a41e0caa7052401c903ztenghui                MediaStore.Video.Media.EXTERNAL_CONTENT_URI, true,
1015064d6000933354f7bf344a41e0caa7052401c903ztenghui                mLocalVideosObserver);
10168872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb    }
10178872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb
10186432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu    private void setRotationAnimation() {
10196432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu        int rotationAnimation = WindowManager.LayoutParams.ROTATION_ANIMATION_ROTATE;
10206432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu        rotationAnimation = WindowManager.LayoutParams.ROTATION_ANIMATION_CROSSFADE;
10216432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu        Window win = getWindow();
10226432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu        WindowManager.LayoutParams winParams = win.getAttributes();
10236432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu        winParams.rotationAnimation = rotationAnimation;
10246432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu        win.setAttributes(winParams);
10258872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb    }
10268872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb
10278872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb    @Override
10286432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu    public void onUserInteraction() {
10296432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu        super.onUserInteraction();
10306432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu        mCurrentModule.onUserInteraction();
103109106a41ee6acc6b20553662cb9b730702a8f08aDoris Liu    }
10328872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb
10338872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb    @Override
1034742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu    public boolean dispatchTouchEvent(MotionEvent ev) {
1035742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu        boolean result = super.dispatchTouchEvent(ev);
1036742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu        if (ev.getActionMasked() == MotionEvent.ACTION_DOWN) {
1037742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu            // Real deletion is postponed until the next user interaction after
1038742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu            // the gesture that triggers deletion. Until real deletion is performed,
1039742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu            // users can click the undo button to bring back the image that they
1040742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu            // chose to delete.
1041742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu            if (mPendingDeletion && !mIsUndoingDeletion) {
1042742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu                 performDeletion();
1043742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu            }
1044742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu        }
1045742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu        return result;
1046742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu    }
1047742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu
1048742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu    @Override
10498872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb    public void onPause() {
10508872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb        mOrientationListener.disable();
10518872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb        mCurrentModule.onPauseBeforeSuper();
10528872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb        super.onPause();
10538872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb        mCurrentModule.onPauseAfterSuper();
1054064d6000933354f7bf344a41e0caa7052401c903ztenghui        mActivityPaused = true;
10558872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb    }
10568872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb
10578872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb    @Override
1058b7639c641f2ed5d0c60546349c3aa9e90c026878Sascha Haeberling    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
1059064d6000933354f7bf344a41e0caa7052401c903ztenghui        if (requestCode == REQ_CODE_DONT_SWITCH_TO_PREVIEW) {
1060b7639c641f2ed5d0c60546349c3aa9e90c026878Sascha Haeberling            mResetToPreviewOnResume = false;
1061b7639c641f2ed5d0c60546349c3aa9e90c026878Sascha Haeberling        } else {
1062b7639c641f2ed5d0c60546349c3aa9e90c026878Sascha Haeberling            super.onActivityResult(requestCode, resultCode, data);
1063b7639c641f2ed5d0c60546349c3aa9e90c026878Sascha Haeberling        }
1064b7639c641f2ed5d0c60546349c3aa9e90c026878Sascha Haeberling    }
1065b7639c641f2ed5d0c60546349c3aa9e90c026878Sascha Haeberling
1066b7639c641f2ed5d0c60546349c3aa9e90c026878Sascha Haeberling    @Override
10678872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb    public void onResume() {
1068ce2b94917098f211cacaaebaa0f6b40021d3e3faAngus Kong        // TODO: Handle this in OrientationManager.
1069a5a08d7642a1fdf961b057cc90e76c4c93103c15Sascha Haeberling        // Auto-rotate off
10703cf565c4242a9deab7da5eb84fc302c79d594f11Doris Liu        if (Settings.System.getInt(getContentResolver(),
1071a5a08d7642a1fdf961b057cc90e76c4c93103c15Sascha Haeberling                Settings.System.ACCELEROMETER_ROTATION, 0) == 0) {
10723cf565c4242a9deab7da5eb84fc302c79d594f11Doris Liu            setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);
10733cf565c4242a9deab7da5eb84fc302c79d594f11Doris Liu            mAutoRotateScreen = false;
10743cf565c4242a9deab7da5eb84fc302c79d594f11Doris Liu        } else {
10753cf565c4242a9deab7da5eb84fc302c79d594f11Doris Liu            setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_FULL_SENSOR);
10763cf565c4242a9deab7da5eb84fc302c79d594f11Doris Liu            mAutoRotateScreen = true;
10773cf565c4242a9deab7da5eb84fc302c79d594f11Doris Liu        }
10788872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb        mOrientationListener.enable();
10798872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb        mCurrentModule.onResumeBeforeSuper();
10808872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb        super.onResume();
10818872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb        mCurrentModule.onResumeAfterSuper();
10828872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb
10836798c34ddb5248f038f351674c6a6c7a20992c8cAngus Kong        setSwipingEnabled(true);
1084b7639c641f2ed5d0c60546349c3aa9e90c026878Sascha Haeberling
1085b7639c641f2ed5d0c60546349c3aa9e90c026878Sascha Haeberling        if (mResetToPreviewOnResume) {
1086b7639c641f2ed5d0c60546349c3aa9e90c026878Sascha Haeberling            // Go to the preview on resume.
1087b7639c641f2ed5d0c60546349c3aa9e90c026878Sascha Haeberling            mFilmStripView.getController().goToFirstItem();
1088b7639c641f2ed5d0c60546349c3aa9e90c026878Sascha Haeberling        }
1089b7639c641f2ed5d0c60546349c3aa9e90c026878Sascha Haeberling        // Default is showing the preview, unless disabled by explicitly
1090b7639c641f2ed5d0c60546349c3aa9e90c026878Sascha Haeberling        // starting an activity we want to return from to the filmstrip rather
1091b7639c641f2ed5d0c60546349c3aa9e90c026878Sascha Haeberling        // than the preview.
1092b7639c641f2ed5d0c60546349c3aa9e90c026878Sascha Haeberling        mResetToPreviewOnResume = true;
1093064d6000933354f7bf344a41e0caa7052401c903ztenghui
1094064d6000933354f7bf344a41e0caa7052401c903ztenghui        mActivityPaused = false;
1095064d6000933354f7bf344a41e0caa7052401c903ztenghui        if (mMediaDataChangedDuringPause) {
1096064d6000933354f7bf344a41e0caa7052401c903ztenghui            mDataAdapter.requestLoad(getContentResolver());
1097064d6000933354f7bf344a41e0caa7052401c903ztenghui            mMediaDataChangedDuringPause = false;
1098064d6000933354f7bf344a41e0caa7052401c903ztenghui        }
10996798c34ddb5248f038f351674c6a6c7a20992c8cAngus Kong    }
11006798c34ddb5248f038f351674c6a6c7a20992c8cAngus Kong
11016798c34ddb5248f038f351674c6a6c7a20992c8cAngus Kong    @Override
11026798c34ddb5248f038f351674c6a6c7a20992c8cAngus Kong    public void onStart() {
11036798c34ddb5248f038f351674c6a6c7a20992c8cAngus Kong        super.onStart();
11047e374eb0a450ed2689b556ab42a0a88c8f74df2eAngus Kong        bindMediaSaveService();
1105f1f5186f7d3fd8bf35009d9e65a43914c664d82bSascha Haeberling        mPanoramaViewHelper.onStart();
1106f1f5186f7d3fd8bf35009d9e65a43914c664d82bSascha Haeberling    }
1107f1f5186f7d3fd8bf35009d9e65a43914c664d82bSascha Haeberling
1108f1f5186f7d3fd8bf35009d9e65a43914c664d82bSascha Haeberling    @Override
1109f1f5186f7d3fd8bf35009d9e65a43914c664d82bSascha Haeberling    protected void onStop() {
1110f1f5186f7d3fd8bf35009d9e65a43914c664d82bSascha Haeberling        super.onStop();
1111f1f5186f7d3fd8bf35009d9e65a43914c664d82bSascha Haeberling        mPanoramaViewHelper.onStop();
11127e374eb0a450ed2689b556ab42a0a88c8f74df2eAngus Kong        unbindMediaSaveService();
111308650187c1f1a2d1ef7f754be0f479a29958daaaMichael Kolb    }
111408650187c1f1a2d1ef7f754be0f479a29958daaaMichael Kolb
11158872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb    @Override
11166432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu    public void onDestroy() {
1117a5a08d7642a1fdf961b057cc90e76c4c93103c15Sascha Haeberling        if (mSecureCamera) {
1118a5a08d7642a1fdf961b057cc90e76c4c93103c15Sascha Haeberling            unregisterReceiver(mScreenOffReceiver);
1119a5a08d7642a1fdf961b057cc90e76c4c93103c15Sascha Haeberling        }
1120064d6000933354f7bf344a41e0caa7052401c903ztenghui        getContentResolver().unregisterContentObserver(mLocalImagesObserver);
1121064d6000933354f7bf344a41e0caa7052401c903ztenghui        getContentResolver().unregisterContentObserver(mLocalVideosObserver);
1122064d6000933354f7bf344a41e0caa7052401c903ztenghui
11236432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu        super.onDestroy();
11248872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb    }
11258872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb
11268872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb    @Override
11276432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu    public void onConfigurationChanged(Configuration config) {
11286432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu        super.onConfigurationChanged(config);
11296432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu        mCurrentModule.onConfigurationChanged(config);
11308872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb    }
11318872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb
11328872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb    @Override
11336432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu    public boolean onKeyDown(int keyCode, KeyEvent event) {
1134a5a08d7642a1fdf961b057cc90e76c4c93103c15Sascha Haeberling        if (mCurrentModule.onKeyDown(keyCode, event)) {
1135a5a08d7642a1fdf961b057cc90e76c4c93103c15Sascha Haeberling            return true;
1136a5a08d7642a1fdf961b057cc90e76c4c93103c15Sascha Haeberling        }
11376432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu        // Prevent software keyboard or voice search from showing up.
11386432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu        if (keyCode == KeyEvent.KEYCODE_SEARCH
11396432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu                || keyCode == KeyEvent.KEYCODE_MENU) {
1140a5a08d7642a1fdf961b057cc90e76c4c93103c15Sascha Haeberling            if (event.isLongPress()) {
1141a5a08d7642a1fdf961b057cc90e76c4c93103c15Sascha Haeberling                return true;
1142a5a08d7642a1fdf961b057cc90e76c4c93103c15Sascha Haeberling            }
11436432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu        }
11446432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu
11456432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu        return super.onKeyDown(keyCode, event);
11468872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb    }
11478872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb
11488872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb    @Override
11496432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu    public boolean onKeyUp(int keyCode, KeyEvent event) {
1150a5a08d7642a1fdf961b057cc90e76c4c93103c15Sascha Haeberling        if (mCurrentModule.onKeyUp(keyCode, event)) {
1151a5a08d7642a1fdf961b057cc90e76c4c93103c15Sascha Haeberling            return true;
1152a5a08d7642a1fdf961b057cc90e76c4c93103c15Sascha Haeberling        }
11536432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu        return super.onKeyUp(keyCode, event);
11548872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb    }
11558872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb
11565f6b50deaf46fb546ebf6d0d6244ebf7fb79c7caAlan Newberger    @Override
11575f6b50deaf46fb546ebf6d0d6244ebf7fb79c7caAlan Newberger    public void onBackPressed() {
11585f6b50deaf46fb546ebf6d0d6244ebf7fb79c7caAlan Newberger        if (!mFilmStripView.inCameraFullscreen()) {
11595f6b50deaf46fb546ebf6d0d6244ebf7fb79c7caAlan Newberger            mFilmStripView.getController().goToFirstItem();
11605f6b50deaf46fb546ebf6d0d6244ebf7fb79c7caAlan Newberger        } else if (!mCurrentModule.onBackPressed()) {
11615f6b50deaf46fb546ebf6d0d6244ebf7fb79c7caAlan Newberger            super.onBackPressed();
11625f6b50deaf46fb546ebf6d0d6244ebf7fb79c7caAlan Newberger        }
11635f6b50deaf46fb546ebf6d0d6244ebf7fb79c7caAlan Newberger    }
11645f6b50deaf46fb546ebf6d0d6244ebf7fb79c7caAlan Newberger
11656432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu    public boolean isAutoRotateScreen() {
11666432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu        return mAutoRotateScreen;
11678872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb    }
11688872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb
11696432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu    protected void updateStorageSpace() {
11706432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu        mStorageSpace = Storage.getAvailableSpace();
11718872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb    }
11728872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb
11736432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu    protected long getStorageSpace() {
11746432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu        return mStorageSpace;
11758872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb    }
11768872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb
11776432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu    protected void updateStorageSpaceAndHint() {
11786432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu        updateStorageSpace();
11796432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu        updateStorageHint(mStorageSpace);
11808872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb    }
11818872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb
11826432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu    protected void updateStorageHint() {
11836432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu        updateStorageHint(mStorageSpace);
11848872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb    }
11858872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb
11866432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu    protected boolean updateStorageHintOnResume() {
11876432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu        return true;
11886432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu    }
11896432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu
11906432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu    protected void updateStorageHint(long storageSpace) {
11916432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu        String message = null;
11926432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu        if (storageSpace == Storage.UNAVAILABLE) {
11936432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu            message = getString(R.string.no_storage);
11946432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu        } else if (storageSpace == Storage.PREPARING) {
11956432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu            message = getString(R.string.preparing_sd);
11966432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu        } else if (storageSpace == Storage.UNKNOWN_SIZE) {
11976432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu            message = getString(R.string.access_sd_fail);
11986432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu        } else if (storageSpace <= Storage.LOW_STORAGE_THRESHOLD) {
11996432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu            message = getString(R.string.spaceIsLow_content);
12008872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb        }
12016432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu
12026432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu        if (message != null) {
12036432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu            if (mStorageHint == null) {
12046432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu                mStorageHint = OnScreenHint.makeText(this, message);
12056432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu            } else {
12066432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu                mStorageHint.setText(message);
12076432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu            }
12086432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu            mStorageHint.show();
12096432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu        } else if (mStorageHint != null) {
12106432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu            mStorageHint.cancel();
12116432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu            mStorageHint = null;
12128872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb        }
12138872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb    }
12148872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb
12156432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu    protected void setResultEx(int resultCode) {
12166432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu        mResultCodeForTesting = resultCode;
12176432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu        setResult(resultCode);
12188872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb    }
12198872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb
12206432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu    protected void setResultEx(int resultCode, Intent data) {
12216432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu        mResultCodeForTesting = resultCode;
12226432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu        mResultDataForTesting = data;
12236432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu        setResult(resultCode, data);
12248872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb    }
12258872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb
12266432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu    public int getResultCode() {
12276432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu        return mResultCodeForTesting;
12288872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb    }
12298872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb
12306432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu    public Intent getResultData() {
12316432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu        return mResultDataForTesting;
12328872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb    }
12338872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb
12346432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu    public boolean isSecureCamera() {
12356432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu        return mSecureCamera;
12368872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb    }
12378872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb
12388872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb    @Override
1239ed15d1a140986473bbe7fffd72ec9618c41c5979Angus Kong    public void onModuleSelected(int moduleIndex) {
1240a5a08d7642a1fdf961b057cc90e76c4c93103c15Sascha Haeberling        if (mCurrentModuleIndex == moduleIndex) {
1241a5a08d7642a1fdf961b057cc90e76c4c93103c15Sascha Haeberling            return;
1242a5a08d7642a1fdf961b057cc90e76c4c93103c15Sascha Haeberling        }
12436432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu
12446432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu        CameraHolder.instance().keep();
12456432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu        closeModule(mCurrentModule);
12462654dd9bb6a7d917dab1a48e2182c4f49fe71f11Sascha Haeberling        setModuleFromIndex(moduleIndex);
12472654dd9bb6a7d917dab1a48e2182c4f49fe71f11Sascha Haeberling
12482654dd9bb6a7d917dab1a48e2182c4f49fe71f11Sascha Haeberling        openModule(mCurrentModule);
12492654dd9bb6a7d917dab1a48e2182c4f49fe71f11Sascha Haeberling        mCurrentModule.onOrientationChanged(mLastRawOrientation);
12502654dd9bb6a7d917dab1a48e2182c4f49fe71f11Sascha Haeberling        if (mMediaSaveService != null) {
12512654dd9bb6a7d917dab1a48e2182c4f49fe71f11Sascha Haeberling            mCurrentModule.onMediaSaveServiceConnected(mMediaSaveService);
12522654dd9bb6a7d917dab1a48e2182c4f49fe71f11Sascha Haeberling        }
12532654dd9bb6a7d917dab1a48e2182c4f49fe71f11Sascha Haeberling
12542654dd9bb6a7d917dab1a48e2182c4f49fe71f11Sascha Haeberling        // Store the module index so we can use it the next time the Camera
12552654dd9bb6a7d917dab1a48e2182c4f49fe71f11Sascha Haeberling        // starts up.
12562654dd9bb6a7d917dab1a48e2182c4f49fe71f11Sascha Haeberling        SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
12572654dd9bb6a7d917dab1a48e2182c4f49fe71f11Sascha Haeberling        prefs.edit().putInt(PREF_STARTUP_MODULE_INDEX, moduleIndex).apply();
12582654dd9bb6a7d917dab1a48e2182c4f49fe71f11Sascha Haeberling    }
12592654dd9bb6a7d917dab1a48e2182c4f49fe71f11Sascha Haeberling
12602654dd9bb6a7d917dab1a48e2182c4f49fe71f11Sascha Haeberling    /**
1261a5a08d7642a1fdf961b057cc90e76c4c93103c15Sascha Haeberling     * Sets the mCurrentModuleIndex, creates a new module instance for the given
1262a5a08d7642a1fdf961b057cc90e76c4c93103c15Sascha Haeberling     * index an sets it as mCurrentModule.
12632654dd9bb6a7d917dab1a48e2182c4f49fe71f11Sascha Haeberling     */
12642654dd9bb6a7d917dab1a48e2182c4f49fe71f11Sascha Haeberling    private void setModuleFromIndex(int moduleIndex) {
12652654dd9bb6a7d917dab1a48e2182c4f49fe71f11Sascha Haeberling        mCurrentModuleIndex = moduleIndex;
12662654dd9bb6a7d917dab1a48e2182c4f49fe71f11Sascha Haeberling        switch (moduleIndex) {
126715125661ad968cf4d40989a9bc88d11189beb0b3Sascha Haeberling            case ModuleSwitcher.VIDEO_MODULE_INDEX:
12686432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu                mCurrentModule = new VideoModule();
12696432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu                break;
1270ed15d1a140986473bbe7fffd72ec9618c41c5979Angus Kong
127115125661ad968cf4d40989a9bc88d11189beb0b3Sascha Haeberling            case ModuleSwitcher.PHOTO_MODULE_INDEX:
12726432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu                mCurrentModule = new PhotoModule();
12736432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu                break;
1274ed15d1a140986473bbe7fffd72ec9618c41c5979Angus Kong
127515125661ad968cf4d40989a9bc88d11189beb0b3Sascha Haeberling            case ModuleSwitcher.WIDE_ANGLE_PANO_MODULE_INDEX:
1276ed15d1a140986473bbe7fffd72ec9618c41c5979Angus Kong                mCurrentModule = new WideAnglePanoramaModule();
1277ed15d1a140986473bbe7fffd72ec9618c41c5979Angus Kong                break;
1278ed15d1a140986473bbe7fffd72ec9618c41c5979Angus Kong
127915125661ad968cf4d40989a9bc88d11189beb0b3Sascha Haeberling            case ModuleSwitcher.LIGHTCYCLE_MODULE_INDEX:
12808e963a5a6016d246184ed65906f9d103e92b17e2Sascha Haeberling                mCurrentModule = PhotoSphereHelper.createPanoramaModule();
12816432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu                break;
1282a9d66bdab247626b31dc182c4d62520b3abffdbdRuben Brunk            case ModuleSwitcher.GCAM_MODULE_INDEX:
1283a9d66bdab247626b31dc182c4d62520b3abffdbdRuben Brunk                // Force immediate release of Camera instance
1284a9d66bdab247626b31dc182c4d62520b3abffdbdRuben Brunk                CameraHolder.instance().strongRelease();
1285a9d66bdab247626b31dc182c4d62520b3abffdbdRuben Brunk                mCurrentModule = GcamHelper.createGcamModule();
1286a9d66bdab247626b31dc182c4d62520b3abffdbdRuben Brunk                break;
12872654dd9bb6a7d917dab1a48e2182c4f49fe71f11Sascha Haeberling            default:
128815125661ad968cf4d40989a9bc88d11189beb0b3Sascha Haeberling                // Fall back to photo mode.
128915125661ad968cf4d40989a9bc88d11189beb0b3Sascha Haeberling                mCurrentModule = new PhotoModule();
129015125661ad968cf4d40989a9bc88d11189beb0b3Sascha Haeberling                mCurrentModuleIndex = ModuleSwitcher.PHOTO_MODULE_INDEX;
12912654dd9bb6a7d917dab1a48e2182c4f49fe71f11Sascha Haeberling                break;
12926432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu        }
12938872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb    }
12948872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb
129588ef7664ba6a888fa5da8693091674e152b56192Sascha Haeberling    /**
129688ef7664ba6a888fa5da8693091674e152b56192Sascha Haeberling     * Launches an ACTION_EDIT intent for the given local data item.
129788ef7664ba6a888fa5da8693091674e152b56192Sascha Haeberling     */
129888ef7664ba6a888fa5da8693091674e152b56192Sascha Haeberling    public void launchEditor(LocalData data) {
129988ef7664ba6a888fa5da8693091674e152b56192Sascha Haeberling        Intent intent = new Intent(Intent.ACTION_EDIT)
130088ef7664ba6a888fa5da8693091674e152b56192Sascha Haeberling                .setDataAndType(data.getContentUri(), data.getMimeType())
130188ef7664ba6a888fa5da8693091674e152b56192Sascha Haeberling                .setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
1302064d6000933354f7bf344a41e0caa7052401c903ztenghui        startActivityForResult(Intent.createChooser(intent, null),
1303064d6000933354f7bf344a41e0caa7052401c903ztenghui                REQ_CODE_DONT_SWITCH_TO_PREVIEW);
130488ef7664ba6a888fa5da8693091674e152b56192Sascha Haeberling    }
130588ef7664ba6a888fa5da8693091674e152b56192Sascha Haeberling
1306a5a08d7642a1fdf961b057cc90e76c4c93103c15Sascha Haeberling    /**
1307a5a08d7642a1fdf961b057cc90e76c4c93103c15Sascha Haeberling     * Launch the tiny planet editor.
1308a5a08d7642a1fdf961b057cc90e76c4c93103c15Sascha Haeberling     *
1309a5a08d7642a1fdf961b057cc90e76c4c93103c15Sascha Haeberling     * @param data the data must be a 360 degree stereographically mapped
1310a5a08d7642a1fdf961b057cc90e76c4c93103c15Sascha Haeberling     *            panoramic image. It will not be modified, instead a new item
1311a5a08d7642a1fdf961b057cc90e76c4c93103c15Sascha Haeberling     *            with the result will be added to the filmstrip.
1312a5a08d7642a1fdf961b057cc90e76c4c93103c15Sascha Haeberling     */
1313a5a08d7642a1fdf961b057cc90e76c4c93103c15Sascha Haeberling    public void launchTinyPlanetEditor(LocalData data) {
1314a5a08d7642a1fdf961b057cc90e76c4c93103c15Sascha Haeberling        TinyPlanetFragment fragment = new TinyPlanetFragment();
1315a5a08d7642a1fdf961b057cc90e76c4c93103c15Sascha Haeberling        Bundle bundle = new Bundle();
1316a5a08d7642a1fdf961b057cc90e76c4c93103c15Sascha Haeberling        bundle.putString(TinyPlanetFragment.ARGUMENT_URI, data.getContentUri().toString());
1317a5a08d7642a1fdf961b057cc90e76c4c93103c15Sascha Haeberling        bundle.putString(TinyPlanetFragment.ARGUMENT_TITLE, data.getTitle());
1318a5a08d7642a1fdf961b057cc90e76c4c93103c15Sascha Haeberling        fragment.setArguments(bundle);
1319a5a08d7642a1fdf961b057cc90e76c4c93103c15Sascha Haeberling        fragment.show(getFragmentManager(), "tiny_planet");
1320a5a08d7642a1fdf961b057cc90e76c4c93103c15Sascha Haeberling    }
1321a5a08d7642a1fdf961b057cc90e76c4c93103c15Sascha Haeberling
13226432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu    private void openModule(CameraModule module) {
1323653c43be6e58be54cf2ac3c8efb2d65ac20bd03bAngus Kong        module.init(this, mCameraModuleRootView);
13246432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu        module.onResumeBeforeSuper();
13256432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu        module.onResumeAfterSuper();
13268872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb    }
13278872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb
13286432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu    private void closeModule(CameraModule module) {
13296432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu        module.onPauseBeforeSuper();
13306432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu        module.onPauseAfterSuper();
1331653c43be6e58be54cf2ac3c8efb2d65ac20bd03bAngus Kong        ((ViewGroup) mCameraModuleRootView).removeAllViews();
1332653c43be6e58be54cf2ac3c8efb2d65ac20bd03bAngus Kong    }
1333653c43be6e58be54cf2ac3c8efb2d65ac20bd03bAngus Kong
1334742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu    private void performDeletion() {
1335742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu        if (!mPendingDeletion) {
1336742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu            return;
1337742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu        }
1338742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu        hideUndoDeletionBar(false);
1339742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu        mDataAdapter.executeDeletion(CameraActivity.this);
1340742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu    }
1341742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu
1342742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu    public void showUndoDeletionBar() {
1343742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu        if (mPendingDeletion) {
1344742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu            performDeletion();
1345742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu        }
1346742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu        Log.v(TAG, "showing undo bar");
1347742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu        mPendingDeletion = true;
1348653c43be6e58be54cf2ac3c8efb2d65ac20bd03bAngus Kong        if (mUndoDeletionBar == null) {
1349653c43be6e58be54cf2ac3c8efb2d65ac20bd03bAngus Kong            ViewGroup v = (ViewGroup) getLayoutInflater().inflate(
1350653c43be6e58be54cf2ac3c8efb2d65ac20bd03bAngus Kong                    R.layout.undo_bar, mAboveFilmstripControlLayout, true);
1351653c43be6e58be54cf2ac3c8efb2d65ac20bd03bAngus Kong            mUndoDeletionBar = (ViewGroup) v.findViewById(R.id.camera_undo_deletion_bar);
1352653c43be6e58be54cf2ac3c8efb2d65ac20bd03bAngus Kong            View button = mUndoDeletionBar.findViewById(R.id.camera_undo_deletion_button);
1353653c43be6e58be54cf2ac3c8efb2d65ac20bd03bAngus Kong            button.setOnClickListener(new View.OnClickListener() {
1354653c43be6e58be54cf2ac3c8efb2d65ac20bd03bAngus Kong                @Override
1355653c43be6e58be54cf2ac3c8efb2d65ac20bd03bAngus Kong                public void onClick(View view) {
1356653c43be6e58be54cf2ac3c8efb2d65ac20bd03bAngus Kong                    mDataAdapter.undoDataRemoval();
1357742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu                    hideUndoDeletionBar(true);
1358742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu                }
1359742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu            });
1360742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu            // Setting undo bar clickable to avoid touch events going through
1361742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu            // the bar to the buttons (eg. edit button, etc) underneath the bar.
1362742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu            mUndoDeletionBar.setClickable(true);
1363742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu            // When there is user interaction going on with the undo button, we
1364742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu            // do not want to hide the undo bar.
1365742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu            button.setOnTouchListener(new View.OnTouchListener() {
1366742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu                @Override
1367742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu                public boolean onTouch(View v, MotionEvent event) {
1368742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu                    if (event.getActionMasked() == MotionEvent.ACTION_DOWN) {
1369742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu                        mIsUndoingDeletion = true;
1370742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu                    } else if (event.getActionMasked() == MotionEvent.ACTION_UP) {
1371742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu                        mIsUndoingDeletion =false;
1372742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu                    }
1373742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu                    return false;
1374653c43be6e58be54cf2ac3c8efb2d65ac20bd03bAngus Kong                }
1375653c43be6e58be54cf2ac3c8efb2d65ac20bd03bAngus Kong            });
1376653c43be6e58be54cf2ac3c8efb2d65ac20bd03bAngus Kong        }
1377653c43be6e58be54cf2ac3c8efb2d65ac20bd03bAngus Kong        mUndoDeletionBar.setAlpha(0f);
1378653c43be6e58be54cf2ac3c8efb2d65ac20bd03bAngus Kong        mUndoDeletionBar.setVisibility(View.VISIBLE);
1379742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu        mUndoDeletionBar.animate().setDuration(200).alpha(1f).setListener(null).start();
1380653c43be6e58be54cf2ac3c8efb2d65ac20bd03bAngus Kong    }
1381653c43be6e58be54cf2ac3c8efb2d65ac20bd03bAngus Kong
1382742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu    private void hideUndoDeletionBar(boolean withAnimation) {
1383653c43be6e58be54cf2ac3c8efb2d65ac20bd03bAngus Kong        Log.v(TAG, "Hiding undo deletion bar");
1384742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu        mPendingDeletion = false;
1385653c43be6e58be54cf2ac3c8efb2d65ac20bd03bAngus Kong        if (mUndoDeletionBar != null) {
1386742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu            if (withAnimation) {
1387742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu                mUndoDeletionBar.animate()
1388742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu                        .setDuration(200)
1389742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu                        .alpha(0f)
1390742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu                        .setListener(new Animator.AnimatorListener() {
1391742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu                            @Override
1392742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu                            public void onAnimationStart(Animator animation) {
1393742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu                                // Do nothing.
1394742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu                            }
1395742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu
1396742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu                            @Override
1397742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu                            public void onAnimationEnd(Animator animation) {
1398742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu                                mUndoDeletionBar.setVisibility(View.GONE);
1399742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu                            }
1400742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu
1401742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu                            @Override
1402742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu                            public void onAnimationCancel(Animator animation) {
1403742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu                                // Do nothing.
1404742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu                            }
1405742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu
1406742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu                            @Override
1407742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu                            public void onAnimationRepeat(Animator animation) {
1408742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu                                // Do nothing.
1409742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu                            }
1410742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu                        })
1411742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu                        .start();
1412742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu            } else {
1413742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu                mUndoDeletionBar.setVisibility(View.GONE);
1414742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu            }
1415653c43be6e58be54cf2ac3c8efb2d65ac20bd03bAngus Kong        }
14168872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb    }
14178872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb
14188872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb    @Override
14196432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu    public void onShowSwitcherPopup() {
14206432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu    }
14216432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu
1422a71946012df0eee8fe4859a22da3c56feba0344eAngus Kong    /**
1423a5a08d7642a1fdf961b057cc90e76c4c93103c15Sascha Haeberling     * Enable/disable swipe-to-filmstrip. Will always disable swipe if in
1424a5a08d7642a1fdf961b057cc90e76c4c93103c15Sascha Haeberling     * capture intent.
1425a71946012df0eee8fe4859a22da3c56feba0344eAngus Kong     *
1426a71946012df0eee8fe4859a22da3c56feba0344eAngus Kong     * @param enable {@code true} to enable swipe.
1427a71946012df0eee8fe4859a22da3c56feba0344eAngus Kong     */
14286432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu    public void setSwipingEnabled(boolean enable) {
1429a71946012df0eee8fe4859a22da3c56feba0344eAngus Kong        if (isCaptureIntent()) {
1430a71946012df0eee8fe4859a22da3c56feba0344eAngus Kong            mCameraPreviewData.lockPreview(true);
1431a71946012df0eee8fe4859a22da3c56feba0344eAngus Kong        } else {
1432a71946012df0eee8fe4859a22da3c56feba0344eAngus Kong            mCameraPreviewData.lockPreview(!enable);
1433a71946012df0eee8fe4859a22da3c56feba0344eAngus Kong        }
14348872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb    }
14358872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb
14368872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb    // Accessor methods for getting latency times used in performance testing
14378872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb    public long getAutoFocusTime() {
14388872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb        return (mCurrentModule instanceof PhotoModule) ?
14398872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb                ((PhotoModule) mCurrentModule).mAutoFocusTime : -1;
14408872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb    }
14418872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb
14428872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb    public long getShutterLag() {
14438872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb        return (mCurrentModule instanceof PhotoModule) ?
14448872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb                ((PhotoModule) mCurrentModule).mShutterLag : -1;
14458872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb    }
14468872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb
14478872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb    public long getShutterToPictureDisplayedTime() {
14488872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb        return (mCurrentModule instanceof PhotoModule) ?
14498872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb                ((PhotoModule) mCurrentModule).mShutterToPictureDisplayedTime : -1;
14508872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb    }
14518872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb
14528872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb    public long getPictureDisplayedToJpegCallbackTime() {
14538872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb        return (mCurrentModule instanceof PhotoModule) ?
14548872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb                ((PhotoModule) mCurrentModule).mPictureDisplayedToJpegCallbackTime : -1;
14558872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb    }
14568872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb
14578872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb    public long getJpegCallbackFinishTime() {
14588872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb        return (mCurrentModule instanceof PhotoModule) ?
14598872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb                ((PhotoModule) mCurrentModule).mJpegCallbackFinishTime : -1;
14608872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb    }
14618872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb
14628872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb    public long getCaptureStartTime() {
14638872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb        return (mCurrentModule instanceof PhotoModule) ?
14648872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb                ((PhotoModule) mCurrentModule).mCaptureStartTime : -1;
14658872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb    }
14668872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb
14678872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb    public boolean isRecording() {
14688872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb        return (mCurrentModule instanceof VideoModule) ?
14698872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb                ((VideoModule) mCurrentModule).isRecording() : false;
14708872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb    }
14714f795b878843e59810ec1dca05b7cdb37b5614c5Angus Kong
14724f795b878843e59810ec1dca05b7cdb37b5614c5Angus Kong    public CameraOpenErrorCallback getCameraOpenErrorCallback() {
14734f795b878843e59810ec1dca05b7cdb37b5614c5Angus Kong        return mCameraOpenErrorCallback;
14744f795b878843e59810ec1dca05b7cdb37b5614c5Angus Kong    }
1475064d6000933354f7bf344a41e0caa7052401c903ztenghui
1476064d6000933354f7bf344a41e0caa7052401c903ztenghui    /**
1477064d6000933354f7bf344a41e0caa7052401c903ztenghui     * When the activity is paused and MediaObserver get onChange() call, then
1478064d6000933354f7bf344a41e0caa7052401c903ztenghui     * we would like to set a dirty bit to reload the data at onResume().
1479064d6000933354f7bf344a41e0caa7052401c903ztenghui     */
1480064d6000933354f7bf344a41e0caa7052401c903ztenghui    public void setDirtyWhenPaused() {
1481064d6000933354f7bf344a41e0caa7052401c903ztenghui        if (mActivityPaused && !mMediaDataChangedDuringPause) {
1482064d6000933354f7bf344a41e0caa7052401c903ztenghui            mMediaDataChangedDuringPause = true;
1483064d6000933354f7bf344a41e0caa7052401c903ztenghui        }
1484064d6000933354f7bf344a41e0caa7052401c903ztenghui    }
14858872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb}
1486