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;
2330968d0f9a5094d62de1fb023b8bf7dc3202ebafMangesh Ghiwareimport android.content.ActivityNotFoundException;
24b84b9738c855a525dc1944165983cc3c342ce446Doris Liuimport android.content.BroadcastReceiver;
2586d36313d88fe96354f2cdd4f378e5ff8397c458Angus Kongimport android.content.ComponentName;
266432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liuimport android.content.ContentResolver;
2708650187c1f1a2d1ef7f754be0f479a29958daaaMichael Kolbimport android.content.Context;
288872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolbimport android.content.Intent;
29b84b9738c855a525dc1944165983cc3c342ce446Doris Liuimport android.content.IntentFilter;
3086d36313d88fe96354f2cdd4f378e5ff8397c458Angus Kongimport android.content.ServiceConnection;
312654dd9bb6a7d917dab1a48e2182c4f49fe71f11Sascha Haeberlingimport android.content.SharedPreferences;
323cf565c4242a9deab7da5eb84fc302c79d594f11Doris Liuimport android.content.pm.ActivityInfo;
338872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolbimport android.content.res.Configuration;
346432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liuimport android.graphics.drawable.ColorDrawable;
356432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liuimport android.net.Uri;
36a5682ab08e1d42fe272ec877929478b4adb769f5Mangesh Ghiwareimport android.nfc.NfcAdapter;
37a5682ab08e1d42fe272ec877929478b4adb769f5Mangesh Ghiwareimport android.nfc.NfcAdapter.CreateBeamUrisCallback;
38a5682ab08e1d42fe272ec877929478b4adb769f5Mangesh Ghiwareimport android.nfc.NfcEvent;
396f64b50db6565bc6454304fd20c0c4020b297bb7Sascha Haeberlingimport android.os.AsyncTask;
40a5682ab08e1d42fe272ec877929478b4adb769f5Mangesh Ghiwareimport android.os.Build;
418872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolbimport android.os.Bundle;
426432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liuimport android.os.Handler;
4386d36313d88fe96354f2cdd4f378e5ff8397c458Angus Kongimport android.os.IBinder;
44aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liuimport android.os.Looper;
45aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liuimport android.os.Message;
462654dd9bb6a7d917dab1a48e2182c4f49fe71f11Sascha Haeberlingimport android.preference.PreferenceManager;
472a7f44cac888de5683d05bef5708f846ee950f43Doris Liuimport android.provider.MediaStore;
483cf565c4242a9deab7da5eb84fc302c79d594f11Doris Liuimport android.provider.Settings;
4937f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberlingimport android.util.Log;
508872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolbimport android.view.KeyEvent;
516432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liuimport android.view.LayoutInflater;
520353ca2e048543bd6e233b4c2110a1df1070cd3fztenghuiimport android.view.Menu;
530353ca2e048543bd6e233b4c2110a1df1070cd3fztenghuiimport android.view.MenuInflater;
540353ca2e048543bd6e233b4c2110a1df1070cd3fztenghuiimport android.view.MenuItem;
55742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liuimport android.view.MotionEvent;
568872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolbimport android.view.OrientationEventListener;
578872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolbimport android.view.View;
586432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liuimport android.view.ViewGroup;
5908650187c1f1a2d1ef7f754be0f479a29958daaaMichael Kolbimport android.view.Window;
6008650187c1f1a2d1ef7f754be0f479a29958daaaMichael Kolbimport android.view.WindowManager;
61653c43be6e58be54cf2ac3c8efb2d65ac20bd03bAngus Kongimport android.widget.FrameLayout;
626432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liuimport android.widget.ImageView;
6337f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberlingimport android.widget.ProgressBar;
64cd2eeb0efc4370f20e9836e20eb11cb974e3b00dMangesh Ghiwareimport android.widget.ShareActionProvider;
658872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb
66ed15d1a140986473bbe7fffd72ec9618c41c5979Angus Kongimport com.android.camera.app.AppManagerFactory;
677cfcafdf8f4a439c8fa87b612616fe409979e8a4Ruben Brunkimport com.android.camera.app.PlaceholderManager;
68ed15d1a140986473bbe7fffd72ec9618c41c5979Angus Kongimport com.android.camera.app.PanoramaStitchingManager;
6919ab725a5e640a1a20b1a6def083e37d1d1c1e20nicolasroardimport com.android.camera.crop.CropActivity;
706432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liuimport com.android.camera.data.CameraDataAdapter;
718e5e4eedb25a4589342660b928935acca4375fc7Angus Kongimport com.android.camera.data.CameraPreviewData;
728e5e4eedb25a4589342660b928935acca4375fc7Angus Kongimport com.android.camera.data.FixedFirstDataAdapter;
738e5e4eedb25a4589342660b928935acca4375fc7Angus Kongimport com.android.camera.data.FixedLastDataAdapter;
743250987bd014d1c5463b8a39bbe988165ab1cc3fAngus Kongimport com.android.camera.data.InProgressDataWrapper;
756432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liuimport com.android.camera.data.LocalData;
768e5e4eedb25a4589342660b928935acca4375fc7Angus Kongimport com.android.camera.data.LocalDataAdapter;
77064d6000933354f7bf344a41e0caa7052401c903ztenghuiimport com.android.camera.data.LocalMediaObserver;
786f64b50db6565bc6454304fd20c0c4020b297bb7Sascha Haeberlingimport com.android.camera.data.MediaDetails;
79bd26069d391830856c57c2141cd2efbc8423d871Angus Kongimport com.android.camera.data.SimpleViewData;
80a5a08d7642a1fdf961b057cc90e76c4c93103c15Sascha Haeberlingimport com.android.camera.tinyplanet.TinyPlanetFragment;
81ed15d1a140986473bbe7fffd72ec9618c41c5979Angus Kongimport com.android.camera.ui.ModuleSwitcher;
826f64b50db6565bc6454304fd20c0c4020b297bb7Sascha Haeberlingimport com.android.camera.ui.DetailsDialog;
836432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liuimport com.android.camera.ui.FilmStripView;
8488ef7664ba6a888fa5da8693091674e152b56192Sascha Haeberlingimport com.android.camera.util.ApiHelper;
85b50b5cbfbc0a67db6fc43373363b10381c9c61a3Angus Kongimport com.android.camera.util.CameraUtil;
86a9d66bdab247626b31dc182c4d62520b3abffdbdRuben Brunkimport com.android.camera.util.GcamHelper;
87761306fadfa94b538f43e8cf3463bf6d22814947Alan Newbergerimport com.android.camera.util.IntentHelper;
8837f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberlingimport com.android.camera.util.PhotoSphereHelper;
8988ef7664ba6a888fa5da8693091674e152b56192Sascha Haeberlingimport com.android.camera.util.PhotoSphereHelper.PanoramaViewHelper;
90cbd8267ee99e457f72822e8d8187b5e6823104f8Seth Raphaelimport com.android.camera.util.UsageStatistics;
918e963a5a6016d246184ed65906f9d103e92b17e2Sascha Haeberlingimport com.android.camera2.R;
928872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb
93cbd8267ee99e457f72822e8d8187b5e6823104f8Seth Raphaelimport java.io.File;
94cbd8267ee99e457f72822e8d8187b5e6823104f8Seth Raphael
954f795b878843e59810ec1dca05b7cdb37b5614c5Angus Kongimport static com.android.camera.CameraManager.CameraOpenErrorCallback;
964f795b878843e59810ec1dca05b7cdb37b5614c5Angus Kong
976432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liupublic class CameraActivity extends Activity
98aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu        implements ModuleSwitcher.ModuleSwitchListener,
99cbd8267ee99e457f72822e8d8187b5e6823104f8Seth Raphael        ActionBar.OnMenuVisibilityListener,
100cbd8267ee99e457f72822e8d8187b5e6823104f8Seth Raphael        ShareActionProvider.OnShareTargetSelectedListener {
1016432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu
1026432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu    private static final String TAG = "CAM_Activity";
1036432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu
1046432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu    private static final String INTENT_ACTION_STILL_IMAGE_CAMERA_SECURE =
1056432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu            "android.media.action.STILL_IMAGE_CAMERA_SECURE";
1066432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu    public static final String ACTION_IMAGE_CAPTURE_SECURE =
1076432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu            "android.media.action.IMAGE_CAPTURE_SECURE";
1086b9203214d828d72758943aca55adceab684a862ztenghui    public static final String ACTION_TRIM_VIDEO =
1096b9203214d828d72758943aca55adceab684a862ztenghui            "com.android.camera.action.TRIM";
1106b9203214d828d72758943aca55adceab684a862ztenghui    public static final String MEDIA_ITEM_PATH = "media-item-path";
1116432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu
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
124d217ed0fa931d2a080a159c24e4012697baf5ae3Ruben Brunk    public static final int REQ_CODE_GCAM_DEBUG_POSTCAPTURE = 999;
125d217ed0fa931d2a080a159c24e4012697baf5ae3Ruben Brunk
126aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu    private static final int HIDE_ACTION_BAR = 1;
127aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu    private static final long SHOW_ACTION_BAR_TIMEOUT_MS = 3000;
128aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu
129b7639c641f2ed5d0c60546349c3aa9e90c026878Sascha Haeberling    /** Whether onResume should reset the view to the preview. */
130b7639c641f2ed5d0c60546349c3aa9e90c026878Sascha Haeberling    private boolean mResetToPreviewOnResume = true;
131b7639c641f2ed5d0c60546349c3aa9e90c026878Sascha Haeberling
1320353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui    // Supported operations at FilmStripView. Different data has different
1330353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui    // set of supported operations.
1340353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui    private static final int SUPPORT_DELETE = 1 << 0;
1350353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui    private static final int SUPPORT_ROTATE = 1 << 1;
1360353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui    private static final int SUPPORT_INFO = 1 << 2;
1370353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui    private static final int SUPPORT_CROP = 1 << 3;
1380353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui    private static final int SUPPORT_SETAS = 1 << 4;
1390353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui    private static final int SUPPORT_EDIT = 1 << 5;
1400353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui    private static final int SUPPORT_TRIM = 1 << 6;
141cd2eeb0efc4370f20e9836e20eb11cb974e3b00dMangesh Ghiware    private static final int SUPPORT_SHARE = 1 << 7;
142cd2eeb0efc4370f20e9836e20eb11cb974e3b00dMangesh Ghiware    private static final int SUPPORT_SHARE_PANORAMA360 = 1 << 8;
143cd2eeb0efc4370f20e9836e20eb11cb974e3b00dMangesh Ghiware    private static final int SUPPORT_SHOW_ON_MAP = 1 << 9;
1440353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui    private static final int SUPPORT_ALL = 0xffffffff;
1450353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui
1466f64b50db6565bc6454304fd20c0c4020b297bb7Sascha Haeberling    /** This data adapter is used by FilmStripView. */
1478e5e4eedb25a4589342660b928935acca4375fc7Angus Kong    private LocalDataAdapter mDataAdapter;
1488e5e4eedb25a4589342660b928935acca4375fc7Angus Kong    /** This data adapter represents the real local camera data. */
1498e5e4eedb25a4589342660b928935acca4375fc7Angus Kong    private LocalDataAdapter mWrappedDataAdapter;
1508e5e4eedb25a4589342660b928935acca4375fc7Angus Kong
1516798c34ddb5248f038f351674c6a6c7a20992c8cAngus Kong    private PanoramaStitchingManager mPanoramaManager;
1527cfcafdf8f4a439c8fa87b612616fe409979e8a4Ruben Brunk    private PlaceholderManager mPlaceholderManager;
1538872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb    private int mCurrentModuleIndex;
1546432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu    private CameraModule mCurrentModule;
155653c43be6e58be54cf2ac3c8efb2d65ac20bd03bAngus Kong    private FrameLayout mAboveFilmstripControlLayout;
156653c43be6e58be54cf2ac3c8efb2d65ac20bd03bAngus Kong    private View mCameraModuleRootView;
1576432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu    private FilmStripView mFilmStripView;
15837f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling    private ProgressBar mBottomProgress;
15937f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling    private View mPanoStitchingPanel;
1606432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu    private int mResultCodeForTesting;
1616432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu    private Intent mResultDataForTesting;
1626432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu    private OnScreenHint mStorageHint;
1632dcc0a9dfcc23f090bbe36308f92d72f68c4f0a2Angus Kong    private long mStorageSpaceBytes = Storage.LOW_STORAGE_THRESHOLD_BYTES;
1643cf565c4242a9deab7da5eb84fc302c79d594f11Doris Liu    private boolean mAutoRotateScreen;
1656432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu    private boolean mSecureCamera;
1666a8e8a1a0f3e8e62cd350733e275047475380d6bAngus Kong    // This is a hack to speed up the start of SecureCamera.
1676a8e8a1a0f3e8e62cd350733e275047475380d6bAngus Kong    private static boolean sFirstStartAfterScreenOn = true;
1686432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu    private int mLastRawOrientation;
1698872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb    private MyOrientationEventListener mOrientationListener;
1706432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu    private Handler mMainHandler;
171f1f5186f7d3fd8bf35009d9e65a43914c664d82bSascha Haeberling    private PanoramaViewHelper mPanoramaViewHelper;
1728e5e4eedb25a4589342660b928935acca4375fc7Angus Kong    private CameraPreviewData mCameraPreviewData;
173fa9e2cc9ccbcd746f5765cb7a0afebcdb60e2973ztenghui    private ActionBar mActionBar;
174aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu    private OnActionBarVisibilityListener mOnActionBarVisibilityListener = null;
1750353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui    private Menu mActionBarMenu;
176653c43be6e58be54cf2ac3c8efb2d65ac20bd03bAngus Kong    private ViewGroup mUndoDeletionBar;
177742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu    private boolean mIsUndoingDeletion = false;
1783cf565c4242a9deab7da5eb84fc302c79d594f11Doris Liu
179a5682ab08e1d42fe272ec877929478b4adb769f5Mangesh Ghiware    private Uri[] mNfcPushUris = new Uri[1];
180a5682ab08e1d42fe272ec877929478b4adb769f5Mangesh Ghiware
181cd2eeb0efc4370f20e9836e20eb11cb974e3b00dMangesh Ghiware    private ShareActionProvider mStandardShareActionProvider;
182cd2eeb0efc4370f20e9836e20eb11cb974e3b00dMangesh Ghiware    private Intent mStandardShareIntent;
183cd2eeb0efc4370f20e9836e20eb11cb974e3b00dMangesh Ghiware    private ShareActionProvider mPanoramaShareActionProvider;
184cd2eeb0efc4370f20e9836e20eb11cb974e3b00dMangesh Ghiware    private Intent mPanoramaShareIntent;
185064d6000933354f7bf344a41e0caa7052401c903ztenghui    private LocalMediaObserver mLocalImagesObserver;
186064d6000933354f7bf344a41e0caa7052401c903ztenghui    private LocalMediaObserver mLocalVideosObserver;
187cd2eeb0efc4370f20e9836e20eb11cb974e3b00dMangesh Ghiware
1885199c2078f3aea06732015ce8ad354c066a2f4ecSascha Haeberling    private final int DEFAULT_SYSTEM_UI_VISIBILITY = View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
1895199c2078f3aea06732015ce8ad354c066a2f4ecSascha Haeberling            | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION;
190742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu    private boolean mPendingDeletion = false;
1915199c2078f3aea06732015ce8ad354c066a2f4ecSascha Haeberling
19205804751ba07c8abcf422f57467d0ed3de95576cztenghui    private Intent mVideoShareIntent;
19305804751ba07c8abcf422f57467d0ed3de95576cztenghui    private Intent mImageShareIntent;
19405804751ba07c8abcf422f57467d0ed3de95576cztenghui
1958872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb    private class MyOrientationEventListener
196a5a08d7642a1fdf961b057cc90e76c4c93103c15Sascha Haeberling            extends OrientationEventListener {
1978872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb        public MyOrientationEventListener(Context context) {
1988872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb            super(context);
1998872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb        }
2008872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb
2018872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb        @Override
2028872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb        public void onOrientationChanged(int orientation) {
2038872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb            // We keep the last known orientation. So if the user first orient
2048872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb            // the camera then point the camera to floor or sky, we still have
2058872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb            // the correct orientation.
206a5a08d7642a1fdf961b057cc90e76c4c93103c15Sascha Haeberling            if (orientation == ORIENTATION_UNKNOWN) {
207a5a08d7642a1fdf961b057cc90e76c4c93103c15Sascha Haeberling                return;
208a5a08d7642a1fdf961b057cc90e76c4c93103c15Sascha Haeberling            }
2098872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb            mLastRawOrientation = orientation;
2108872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb            mCurrentModule.onOrientationChanged(orientation);
2118872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb        }
2128872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb    }
2138872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb
2146432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu    private MediaSaveService mMediaSaveService;
2156432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu    private ServiceConnection mConnection = new ServiceConnection() {
216a5a08d7642a1fdf961b057cc90e76c4c93103c15Sascha Haeberling        @Override
217a5a08d7642a1fdf961b057cc90e76c4c93103c15Sascha Haeberling        public void onServiceConnected(ComponentName className, IBinder b) {
218a5a08d7642a1fdf961b057cc90e76c4c93103c15Sascha Haeberling            mMediaSaveService = ((MediaSaveService.LocalBinder) b).getService();
219a5a08d7642a1fdf961b057cc90e76c4c93103c15Sascha Haeberling            mCurrentModule.onMediaSaveServiceConnected(mMediaSaveService);
220a5a08d7642a1fdf961b057cc90e76c4c93103c15Sascha Haeberling        }
221a5a08d7642a1fdf961b057cc90e76c4c93103c15Sascha Haeberling
222a5a08d7642a1fdf961b057cc90e76c4c93103c15Sascha Haeberling        @Override
223a5a08d7642a1fdf961b057cc90e76c4c93103c15Sascha Haeberling        public void onServiceDisconnected(ComponentName className) {
224a5a08d7642a1fdf961b057cc90e76c4c93103c15Sascha Haeberling            if (mMediaSaveService != null) {
225a5a08d7642a1fdf961b057cc90e76c4c93103c15Sascha Haeberling                mMediaSaveService.setListener(null);
226a5a08d7642a1fdf961b057cc90e76c4c93103c15Sascha Haeberling                mMediaSaveService = null;
2278872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb            }
228a5a08d7642a1fdf961b057cc90e76c4c93103c15Sascha Haeberling        }
229a5a08d7642a1fdf961b057cc90e76c4c93103c15Sascha Haeberling    };
230e319aeabdc825f221df5af8a6ec080c6f5d41a94John Reck
2314f795b878843e59810ec1dca05b7cdb37b5614c5Angus Kong    private CameraOpenErrorCallback mCameraOpenErrorCallback =
2324f795b878843e59810ec1dca05b7cdb37b5614c5Angus Kong            new CameraOpenErrorCallback() {
2334f795b878843e59810ec1dca05b7cdb37b5614c5Angus Kong                @Override
2344f795b878843e59810ec1dca05b7cdb37b5614c5Angus Kong                public void onCameraDisabled(int cameraId) {
235cbd8267ee99e457f72822e8d8187b5e6823104f8Seth Raphael                    UsageStatistics.onEvent(UsageStatistics.COMPONENT_CAMERA,
236cbd8267ee99e457f72822e8d8187b5e6823104f8Seth Raphael                            UsageStatistics.ACTION_OPEN_FAIL, "security");
237cbd8267ee99e457f72822e8d8187b5e6823104f8Seth Raphael
2384f795b878843e59810ec1dca05b7cdb37b5614c5Angus Kong                    CameraUtil.showErrorAndFinish(CameraActivity.this,
2394f795b878843e59810ec1dca05b7cdb37b5614c5Angus Kong                            R.string.camera_disabled);
2404f795b878843e59810ec1dca05b7cdb37b5614c5Angus Kong                }
2414f795b878843e59810ec1dca05b7cdb37b5614c5Angus Kong
2424f795b878843e59810ec1dca05b7cdb37b5614c5Angus Kong                @Override
2434f795b878843e59810ec1dca05b7cdb37b5614c5Angus Kong                public void onDeviceOpenFailure(int cameraId) {
244cbd8267ee99e457f72822e8d8187b5e6823104f8Seth Raphael                    UsageStatistics.onEvent(UsageStatistics.COMPONENT_CAMERA,
245cbd8267ee99e457f72822e8d8187b5e6823104f8Seth Raphael                            UsageStatistics.ACTION_OPEN_FAIL, "open");
246cbd8267ee99e457f72822e8d8187b5e6823104f8Seth Raphael
2474f795b878843e59810ec1dca05b7cdb37b5614c5Angus Kong                    CameraUtil.showErrorAndFinish(CameraActivity.this,
2484f795b878843e59810ec1dca05b7cdb37b5614c5Angus Kong                            R.string.cannot_connect_camera);
2494f795b878843e59810ec1dca05b7cdb37b5614c5Angus Kong                }
2504f795b878843e59810ec1dca05b7cdb37b5614c5Angus Kong
2514f795b878843e59810ec1dca05b7cdb37b5614c5Angus Kong                @Override
2524f795b878843e59810ec1dca05b7cdb37b5614c5Angus Kong                public void onReconnectionFailure(CameraManager mgr) {
253cbd8267ee99e457f72822e8d8187b5e6823104f8Seth Raphael                    UsageStatistics.onEvent(UsageStatistics.COMPONENT_CAMERA,
254cbd8267ee99e457f72822e8d8187b5e6823104f8Seth Raphael                            UsageStatistics.ACTION_OPEN_FAIL, "reconnect");
255cbd8267ee99e457f72822e8d8187b5e6823104f8Seth Raphael
2564f795b878843e59810ec1dca05b7cdb37b5614c5Angus Kong                    CameraUtil.showErrorAndFinish(CameraActivity.this,
2574f795b878843e59810ec1dca05b7cdb37b5614c5Angus Kong                            R.string.cannot_connect_camera);
2584f795b878843e59810ec1dca05b7cdb37b5614c5Angus Kong                }
2594f795b878843e59810ec1dca05b7cdb37b5614c5Angus Kong            };
2604f795b878843e59810ec1dca05b7cdb37b5614c5Angus Kong
261b84b9738c855a525dc1944165983cc3c342ce446Doris Liu    // close activity when screen turns off
262b84b9738c855a525dc1944165983cc3c342ce446Doris Liu    private BroadcastReceiver mScreenOffReceiver = new BroadcastReceiver() {
263b84b9738c855a525dc1944165983cc3c342ce446Doris Liu        @Override
264b84b9738c855a525dc1944165983cc3c342ce446Doris Liu        public void onReceive(Context context, Intent intent) {
265b84b9738c855a525dc1944165983cc3c342ce446Doris Liu            finish();
266b84b9738c855a525dc1944165983cc3c342ce446Doris Liu        }
267b84b9738c855a525dc1944165983cc3c342ce446Doris Liu    };
268b84b9738c855a525dc1944165983cc3c342ce446Doris Liu
2696a8e8a1a0f3e8e62cd350733e275047475380d6bAngus Kong    private static BroadcastReceiver sScreenOffReceiver;
270a5a08d7642a1fdf961b057cc90e76c4c93103c15Sascha Haeberling
2716a8e8a1a0f3e8e62cd350733e275047475380d6bAngus Kong    private static class ScreenOffReceiver extends BroadcastReceiver {
2726a8e8a1a0f3e8e62cd350733e275047475380d6bAngus Kong        @Override
2736a8e8a1a0f3e8e62cd350733e275047475380d6bAngus Kong        public void onReceive(Context context, Intent intent) {
2746a8e8a1a0f3e8e62cd350733e275047475380d6bAngus Kong            sFirstStartAfterScreenOn = true;
2756a8e8a1a0f3e8e62cd350733e275047475380d6bAngus Kong        }
2766a8e8a1a0f3e8e62cd350733e275047475380d6bAngus Kong    }
2776a8e8a1a0f3e8e62cd350733e275047475380d6bAngus Kong
278aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu    private class MainHandler extends Handler {
279aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu        public MainHandler(Looper looper) {
280aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu            super(looper);
281aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu        }
282aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu
283aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu        @Override
284aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu        public void handleMessage(Message msg) {
285aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu            if (msg.what == HIDE_ACTION_BAR) {
286aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu                removeMessages(HIDE_ACTION_BAR);
287aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu                CameraActivity.this.setSystemBarsVisibility(false);
288aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu            }
289aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu        }
290aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu    }
291aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu
292aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu    public interface OnActionBarVisibilityListener {
293aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu        public void onActionBarVisibilityChanged(boolean isVisible);
294aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu    }
295aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu
296aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu    public void setOnActionBarVisibilityListener(OnActionBarVisibilityListener listener) {
297aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu        mOnActionBarVisibilityListener = listener;
298aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu    }
299aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu
3006a8e8a1a0f3e8e62cd350733e275047475380d6bAngus Kong    public static boolean isFirstStartAfterScreenOn() {
3016a8e8a1a0f3e8e62cd350733e275047475380d6bAngus Kong        return sFirstStartAfterScreenOn;
3026a8e8a1a0f3e8e62cd350733e275047475380d6bAngus Kong    }
3036a8e8a1a0f3e8e62cd350733e275047475380d6bAngus Kong
3046a8e8a1a0f3e8e62cd350733e275047475380d6bAngus Kong    public static void resetFirstStartAfterScreenOn() {
3056a8e8a1a0f3e8e62cd350733e275047475380d6bAngus Kong        sFirstStartAfterScreenOn = false;
3066a8e8a1a0f3e8e62cd350733e275047475380d6bAngus Kong    }
3076a8e8a1a0f3e8e62cd350733e275047475380d6bAngus Kong
308cbd8267ee99e457f72822e8d8187b5e6823104f8Seth Raphael    private String fileNameFromDataID(int dataID) {
309cbd8267ee99e457f72822e8d8187b5e6823104f8Seth Raphael        final LocalData localData = mDataAdapter.getLocalData(dataID);
310cbd8267ee99e457f72822e8d8187b5e6823104f8Seth Raphael
311cbd8267ee99e457f72822e8d8187b5e6823104f8Seth Raphael        File localFile = new File(localData.getPath());
312cbd8267ee99e457f72822e8d8187b5e6823104f8Seth Raphael        return localFile.getName();
313cbd8267ee99e457f72822e8d8187b5e6823104f8Seth Raphael    }
314cbd8267ee99e457f72822e8d8187b5e6823104f8Seth Raphael
31537f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling    private FilmStripView.Listener mFilmStripListener =
31637f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling            new FilmStripView.Listener() {
31737f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling                @Override
31837f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling                public void onDataPromoted(int dataID) {
319cbd8267ee99e457f72822e8d8187b5e6823104f8Seth Raphael                    UsageStatistics.onEvent(UsageStatistics.COMPONENT_CAMERA,
320cbd8267ee99e457f72822e8d8187b5e6823104f8Seth Raphael                            UsageStatistics.ACTION_DELETE, "promoted", 0,
321cbd8267ee99e457f72822e8d8187b5e6823104f8Seth Raphael                            UsageStatistics.hashFileName(fileNameFromDataID(dataID)));
322cbd8267ee99e457f72822e8d8187b5e6823104f8Seth Raphael
32337f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling                    removeData(dataID);
32437f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling                }
325e319aeabdc825f221df5af8a6ec080c6f5d41a94John Reck
32637f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling                @Override
32737f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling                public void onDataDemoted(int dataID) {
328cbd8267ee99e457f72822e8d8187b5e6823104f8Seth Raphael                    UsageStatistics.onEvent(UsageStatistics.COMPONENT_CAMERA,
329cbd8267ee99e457f72822e8d8187b5e6823104f8Seth Raphael                            UsageStatistics.ACTION_DELETE, "demoted", 0,
330cbd8267ee99e457f72822e8d8187b5e6823104f8Seth Raphael                            UsageStatistics.hashFileName(fileNameFromDataID(dataID)));
331cbd8267ee99e457f72822e8d8187b5e6823104f8Seth Raphael
33237f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling                    removeData(dataID);
33337f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling                }
334e319aeabdc825f221df5af8a6ec080c6f5d41a94John Reck
33537f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling                @Override
33637f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling                public void onDataFullScreenChange(int dataID, boolean full) {
3378566dd777cd219254c945240a31ac97de28792a2ztenghui                    boolean isCameraID = isCameraPreview(dataID);
3387b265a6b2f55c6ae7afc30e63ba324c4084a5d8eztenghui                    if (!isCameraID) {
339aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu                        if (!full) {
340aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu                            // Always show action bar in filmstrip mode
341aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu                            CameraActivity.this.setSystemBarsVisibility(true, false);
342aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu                        } else if (mActionBar.isShowing()) {
343aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu                            // Hide action bar after time out in full screen mode
344aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu                            mMainHandler.sendEmptyMessageDelayed(HIDE_ACTION_BAR,
345aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu                                    SHOW_ACTION_BAR_TIMEOUT_MS);
346aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu                        }
347fa9e2cc9ccbcd746f5765cb7a0afebcdb60e2973ztenghui                    }
34837f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling                }
34937f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling
3508566dd777cd219254c945240a31ac97de28792a2ztenghui                /**
3518566dd777cd219254c945240a31ac97de28792a2ztenghui                 * Check if the local data corresponding to dataID is the camera
3528566dd777cd219254c945240a31ac97de28792a2ztenghui                 * preview.
3538566dd777cd219254c945240a31ac97de28792a2ztenghui                 *
3548566dd777cd219254c945240a31ac97de28792a2ztenghui                 * @param dataID the ID of the local data
3558566dd777cd219254c945240a31ac97de28792a2ztenghui                 * @return true if the local data is not null and it is the
3568566dd777cd219254c945240a31ac97de28792a2ztenghui                 *         camera preview.
3578566dd777cd219254c945240a31ac97de28792a2ztenghui                 */
3588566dd777cd219254c945240a31ac97de28792a2ztenghui                private boolean isCameraPreview(int dataID) {
3598566dd777cd219254c945240a31ac97de28792a2ztenghui                    LocalData localData = mDataAdapter.getLocalData(dataID);
3608566dd777cd219254c945240a31ac97de28792a2ztenghui                    if (localData == null) {
3618566dd777cd219254c945240a31ac97de28792a2ztenghui                        Log.w(TAG, "Current data ID not found.");
3628566dd777cd219254c945240a31ac97de28792a2ztenghui                        return false;
3638566dd777cd219254c945240a31ac97de28792a2ztenghui                    }
3648566dd777cd219254c945240a31ac97de28792a2ztenghui                    return localData.getLocalDataType() == LocalData.LOCAL_CAMERA_PREVIEW;
3658566dd777cd219254c945240a31ac97de28792a2ztenghui                }
3668566dd777cd219254c945240a31ac97de28792a2ztenghui
36737f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling                @Override
3683044d8c577432d6e9721fc8b26ac2afbbaf21266Erin Dahlgren                public void onReload() {
3693044d8c577432d6e9721fc8b26ac2afbbaf21266Erin Dahlgren                    setPreviewControlsVisibility(true);
37017f1e65142df55ebccfa30720cd1265f9ab67e96ztenghui                    CameraActivity.this.setSystemBarsVisibility(false);
3713044d8c577432d6e9721fc8b26ac2afbbaf21266Erin Dahlgren                }
3723044d8c577432d6e9721fc8b26ac2afbbaf21266Erin Dahlgren
3733044d8c577432d6e9721fc8b26ac2afbbaf21266Erin Dahlgren                @Override
3743044d8c577432d6e9721fc8b26ac2afbbaf21266Erin Dahlgren                public void onCurrentDataCentered(int dataID) {
3753044d8c577432d6e9721fc8b26ac2afbbaf21266Erin Dahlgren                    if (dataID != 0 && !mFilmStripView.isCameraPreview()) {
3763044d8c577432d6e9721fc8b26ac2afbbaf21266Erin Dahlgren                        // For now, We ignore all items that are not the camera preview.
3773044d8c577432d6e9721fc8b26ac2afbbaf21266Erin Dahlgren                        return;
3783044d8c577432d6e9721fc8b26ac2afbbaf21266Erin Dahlgren                    }
3793044d8c577432d6e9721fc8b26ac2afbbaf21266Erin Dahlgren
3803044d8c577432d6e9721fc8b26ac2afbbaf21266Erin Dahlgren                    if(!arePreviewControlsVisible()) {
3813044d8c577432d6e9721fc8b26ac2afbbaf21266Erin Dahlgren                        setPreviewControlsVisibility(true);
382fd7f0a9ffd8e7db21e556b1a60a7602ef5d0fe29Erin Dahlgren                        CameraActivity.this.setSystemBarsVisibility(false);
3833044d8c577432d6e9721fc8b26ac2afbbaf21266Erin Dahlgren                    }
3843044d8c577432d6e9721fc8b26ac2afbbaf21266Erin Dahlgren                }
3853044d8c577432d6e9721fc8b26ac2afbbaf21266Erin Dahlgren
3863044d8c577432d6e9721fc8b26ac2afbbaf21266Erin Dahlgren                @Override
3873044d8c577432d6e9721fc8b26ac2afbbaf21266Erin Dahlgren                public void onCurrentDataOffCentered(int dataID) {
3883044d8c577432d6e9721fc8b26ac2afbbaf21266Erin Dahlgren                    if (dataID != 0 && !mFilmStripView.isCameraPreview()) {
3893044d8c577432d6e9721fc8b26ac2afbbaf21266Erin Dahlgren                        // For now, We ignore all items that are not the camera preview.
3903044d8c577432d6e9721fc8b26ac2afbbaf21266Erin Dahlgren                        return;
3913044d8c577432d6e9721fc8b26ac2afbbaf21266Erin Dahlgren                    }
3923044d8c577432d6e9721fc8b26ac2afbbaf21266Erin Dahlgren
3933044d8c577432d6e9721fc8b26ac2afbbaf21266Erin Dahlgren                    if (arePreviewControlsVisible()) {
3943044d8c577432d6e9721fc8b26ac2afbbaf21266Erin Dahlgren                        setPreviewControlsVisibility(false);
3953044d8c577432d6e9721fc8b26ac2afbbaf21266Erin Dahlgren                    }
3963044d8c577432d6e9721fc8b26ac2afbbaf21266Erin Dahlgren                }
3973044d8c577432d6e9721fc8b26ac2afbbaf21266Erin Dahlgren
3983044d8c577432d6e9721fc8b26ac2afbbaf21266Erin Dahlgren                @Override
39902cafdfb92a2d53b76c2bb180ee5289a80f4f4acAngus Kong                public void onDataFocusChanged(final int dataID, final boolean focused) {
400aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu                    // Delay hiding action bar if there is any user interaction
401aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu                    if (mMainHandler.hasMessages(HIDE_ACTION_BAR)) {
402aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu                        mMainHandler.removeMessages(HIDE_ACTION_BAR);
403aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu                        mMainHandler.sendEmptyMessageDelayed(HIDE_ACTION_BAR,
404aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu                                SHOW_ACTION_BAR_TIMEOUT_MS);
405aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu                    }
40602cafdfb92a2d53b76c2bb180ee5289a80f4f4acAngus Kong                    // TODO: This callback is UI event callback, should always
40702cafdfb92a2d53b76c2bb180ee5289a80f4f4acAngus Kong                    // happen on UI thread. Find the reason for this
40802cafdfb92a2d53b76c2bb180ee5289a80f4f4acAngus Kong                    // runOnUiThread() and fix it.
40933035c19cc47adfb738c20cef66652ae451c8e10Mangesh Ghiware                    runOnUiThread(new Runnable() {
41033035c19cc47adfb738c20cef66652ae451c8e10Mangesh Ghiware                        @Override
41133035c19cc47adfb738c20cef66652ae451c8e10Mangesh Ghiware                        public void run() {
4127b265a6b2f55c6ae7afc30e63ba324c4084a5d8eztenghui                            LocalData currentData = mDataAdapter.getLocalData(dataID);
4137b265a6b2f55c6ae7afc30e63ba324c4084a5d8eztenghui                            if (currentData == null) {
4147b265a6b2f55c6ae7afc30e63ba324c4084a5d8eztenghui                                Log.w(TAG, "Current data ID not found.");
4157b265a6b2f55c6ae7afc30e63ba324c4084a5d8eztenghui                                hidePanoStitchingProgress();
4167b265a6b2f55c6ae7afc30e63ba324c4084a5d8eztenghui                                return;
4177b265a6b2f55c6ae7afc30e63ba324c4084a5d8eztenghui                            }
4187b265a6b2f55c6ae7afc30e63ba324c4084a5d8eztenghui                            boolean isCameraID = currentData.getLocalDataType() ==
4197b265a6b2f55c6ae7afc30e63ba324c4084a5d8eztenghui                                    LocalData.LOCAL_CAMERA_PREVIEW;
42002cafdfb92a2d53b76c2bb180ee5289a80f4f4acAngus Kong                            if (!focused) {
4217b265a6b2f55c6ae7afc30e63ba324c4084a5d8eztenghui                                if (isCameraID) {
4227b265a6b2f55c6ae7afc30e63ba324c4084a5d8eztenghui                                    mCurrentModule.onPreviewFocusChanged(false);
423aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu                                    CameraActivity.this.setSystemBarsVisibility(true);
4247b265a6b2f55c6ae7afc30e63ba324c4084a5d8eztenghui                                }
42533035c19cc47adfb738c20cef66652ae451c8e10Mangesh Ghiware                                hidePanoStitchingProgress();
42633035c19cc47adfb738c20cef66652ae451c8e10Mangesh Ghiware                            } else {
4277b265a6b2f55c6ae7afc30e63ba324c4084a5d8eztenghui                                if (isCameraID) {
428a5a08d7642a1fdf961b057cc90e76c4c93103c15Sascha Haeberling                                    // Don't show the action bar in Camera
429a5a08d7642a1fdf961b057cc90e76c4c93103c15Sascha Haeberling                                    // preview.
430aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu                                    CameraActivity.this.setSystemBarsVisibility(false);
4313044d8c577432d6e9721fc8b26ac2afbbaf21266Erin Dahlgren
432742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu                                    if (mPendingDeletion) {
433742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu                                        performDeletion();
434742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu                                    }
4351ef76d4cbd73c02cb8d02cf4cde3f4cee81548d6Alan Newberger                                } else {
4361ef76d4cbd73c02cb8d02cf4cde3f4cee81548d6Alan Newberger                                    updateActionBarMenu(dataID);
4371ef76d4cbd73c02cb8d02cf4cde3f4cee81548d6Alan Newberger                                }
43833035c19cc47adfb738c20cef66652ae451c8e10Mangesh Ghiware
43933035c19cc47adfb738c20cef66652ae451c8e10Mangesh Ghiware                                Uri contentUri = currentData.getContentUri();
44033035c19cc47adfb738c20cef66652ae451c8e10Mangesh Ghiware                                if (contentUri == null) {
44133035c19cc47adfb738c20cef66652ae451c8e10Mangesh Ghiware                                    hidePanoStitchingProgress();
44233035c19cc47adfb738c20cef66652ae451c8e10Mangesh Ghiware                                    return;
44333035c19cc47adfb738c20cef66652ae451c8e10Mangesh Ghiware                                }
44433035c19cc47adfb738c20cef66652ae451c8e10Mangesh Ghiware                                int panoStitchingProgress = mPanoramaManager.getTaskProgress(
445a5a08d7642a1fdf961b057cc90e76c4c93103c15Sascha Haeberling                                        contentUri);
44633035c19cc47adfb738c20cef66652ae451c8e10Mangesh Ghiware                                if (panoStitchingProgress < 0) {
44733035c19cc47adfb738c20cef66652ae451c8e10Mangesh Ghiware                                    hidePanoStitchingProgress();
44833035c19cc47adfb738c20cef66652ae451c8e10Mangesh Ghiware                                    return;
44933035c19cc47adfb738c20cef66652ae451c8e10Mangesh Ghiware                                }
45033035c19cc47adfb738c20cef66652ae451c8e10Mangesh Ghiware                                showPanoStitchingProgress();
45133035c19cc47adfb738c20cef66652ae451c8e10Mangesh Ghiware                                updateStitchingProgress(panoStitchingProgress);
45233035c19cc47adfb738c20cef66652ae451c8e10Mangesh Ghiware                            }
45337f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling                        }
45433035c19cc47adfb738c20cef66652ae451c8e10Mangesh Ghiware                    });
45537f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling                }
456394023fb7e3c8d07d4aeafc30bf4b66ed481ebb7Sascha Haeberling
457394023fb7e3c8d07d4aeafc30bf4b66ed481ebb7Sascha Haeberling                @Override
458aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu                public void onToggleSystemDecorsVisibility(int dataID) {
459aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu                    // If action bar is showing, hide it immediately, otherwise
460aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu                    // show action bar and hide it later
461394023fb7e3c8d07d4aeafc30bf4b66ed481ebb7Sascha Haeberling                    if (mActionBar.isShowing()) {
462aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu                        CameraActivity.this.setSystemBarsVisibility(false);
463394023fb7e3c8d07d4aeafc30bf4b66ed481ebb7Sascha Haeberling                    } else {
4648566dd777cd219254c945240a31ac97de28792a2ztenghui                        // Don't show the action bar if that is the camera preview.
4658566dd777cd219254c945240a31ac97de28792a2ztenghui                        boolean isCameraID = isCameraPreview(dataID);
4668566dd777cd219254c945240a31ac97de28792a2ztenghui                        if (!isCameraID) {
467aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu                            CameraActivity.this.setSystemBarsVisibility(true, true);
468fd43e3be3d69f48a97bdd9084e9549f41e963cc2ztenghui                        }
469394023fb7e3c8d07d4aeafc30bf4b66ed481ebb7Sascha Haeberling                    }
470394023fb7e3c8d07d4aeafc30bf4b66ed481ebb7Sascha Haeberling                }
471aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu
472aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu                @Override
473aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu                public void setSystemDecorsVisibility(boolean visible) {
474aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu                    CameraActivity.this.setSystemBarsVisibility(visible);
475aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu                }
47637f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling            };
47737f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling
4784ed20592482d2ab2f3f48ee72d5b1c06bf009034Sascha Haeberling    public void gotoGallery() {
479cbd8267ee99e457f72822e8d8187b5e6823104f8Seth Raphael        UsageStatistics.onEvent(UsageStatistics.COMPONENT_CAMERA, UsageStatistics.ACTION_FILMSTRIP,
480cbd8267ee99e457f72822e8d8187b5e6823104f8Seth Raphael                "thumbnailTap");
481cbd8267ee99e457f72822e8d8187b5e6823104f8Seth Raphael
4824ed20592482d2ab2f3f48ee72d5b1c06bf009034Sascha Haeberling        mFilmStripView.getController().goToNextItem();
4834ed20592482d2ab2f3f48ee72d5b1c06bf009034Sascha Haeberling    }
4844ed20592482d2ab2f3f48ee72d5b1c06bf009034Sascha Haeberling
4855199c2078f3aea06732015ce8ad354c066a2f4ecSascha Haeberling    /**
486aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu     * If {@param visible} is false, this hides the action bar and switches the system UI
487aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu     * to lights-out mode.
4885199c2078f3aea06732015ce8ad354c066a2f4ecSascha Haeberling     */
48997cb1ea3dbcf03b4e1fc6b149bf475ef3f3920fcDoris Liu    // TODO: This should not be called outside of the activity.
4904ec139dc81482ebfef1e62a3987c53bd5880c759Sascha Haeberling    public void setSystemBarsVisibility(boolean visible) {
491aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu        setSystemBarsVisibility(visible, false);
492aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu    }
493aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu
494aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu    /**
495aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu     * If {@param visible} is false, this hides the action bar and switches the
496aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu     * system UI to lights-out mode. If {@param hideLater} is true, a delayed message
497aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu     * will be sent after a timeout to hide the action bar.
498aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu     */
499aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu    private void setSystemBarsVisibility(boolean visible, boolean hideLater) {
500aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu        mMainHandler.removeMessages(HIDE_ACTION_BAR);
501aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu
50217f1e65142df55ebccfa30720cd1265f9ab67e96ztenghui        int currentSystemUIVisibility = mAboveFilmstripControlLayout.getSystemUiVisibility();
50317f1e65142df55ebccfa30720cd1265f9ab67e96ztenghui        int newSystemUIVisibility = DEFAULT_SYSTEM_UI_VISIBILITY |
50417f1e65142df55ebccfa30720cd1265f9ab67e96ztenghui                (visible ? View.SYSTEM_UI_FLAG_VISIBLE :
50517f1e65142df55ebccfa30720cd1265f9ab67e96ztenghui                        View.SYSTEM_UI_FLAG_LOW_PROFILE | View.SYSTEM_UI_FLAG_FULLSCREEN);
50617f1e65142df55ebccfa30720cd1265f9ab67e96ztenghui        if (newSystemUIVisibility != currentSystemUIVisibility) {
50717f1e65142df55ebccfa30720cd1265f9ab67e96ztenghui            mAboveFilmstripControlLayout.setSystemUiVisibility(newSystemUIVisibility);
50817f1e65142df55ebccfa30720cd1265f9ab67e96ztenghui        }
50997cb1ea3dbcf03b4e1fc6b149bf475ef3f3920fcDoris Liu
51017f1e65142df55ebccfa30720cd1265f9ab67e96ztenghui        boolean currentActionBarVisibility = mActionBar.isShowing();
51117f1e65142df55ebccfa30720cd1265f9ab67e96ztenghui        if (visible != currentActionBarVisibility) {
512aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu            if (visible) {
513aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu                mActionBar.show();
514aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu            } else {
515aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu                mActionBar.hide();
516aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu            }
517aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu            if (mOnActionBarVisibilityListener != null) {
518aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu                mOnActionBarVisibilityListener.onActionBarVisibilityChanged(visible);
519aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu            }
520aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu        }
521aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu
522aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu        // Now delay hiding the bars
523aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu        if (visible && hideLater) {
524aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu            mMainHandler.sendEmptyMessageDelayed(HIDE_ACTION_BAR, SHOW_ACTION_BAR_TIMEOUT_MS);
5255199c2078f3aea06732015ce8ad354c066a2f4ecSascha Haeberling        }
5265199c2078f3aea06732015ce8ad354c066a2f4ecSascha Haeberling    }
5275199c2078f3aea06732015ce8ad354c066a2f4ecSascha Haeberling
52837f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling    private void hidePanoStitchingProgress() {
52937f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling        mPanoStitchingPanel.setVisibility(View.GONE);
53037f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling    }
53137f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling
53237f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling    private void showPanoStitchingProgress() {
53337f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling        mPanoStitchingPanel.setVisibility(View.VISIBLE);
53437f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling    }
53537f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling
53637f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling    private void updateStitchingProgress(int progress) {
53737f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling        mBottomProgress.setProgress(progress);
53837f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling    }
5398872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb
540a5682ab08e1d42fe272ec877929478b4adb769f5Mangesh Ghiware    @TargetApi(Build.VERSION_CODES.JELLY_BEAN)
541a5682ab08e1d42fe272ec877929478b4adb769f5Mangesh Ghiware    private void setupNfcBeamPush() {
542a5682ab08e1d42fe272ec877929478b4adb769f5Mangesh Ghiware        NfcAdapter adapter = NfcAdapter.getDefaultAdapter(CameraActivity.this);
543a5682ab08e1d42fe272ec877929478b4adb769f5Mangesh Ghiware        if (adapter == null) {
544a5682ab08e1d42fe272ec877929478b4adb769f5Mangesh Ghiware            return;
545a5682ab08e1d42fe272ec877929478b4adb769f5Mangesh Ghiware        }
546a5682ab08e1d42fe272ec877929478b4adb769f5Mangesh Ghiware
547a5682ab08e1d42fe272ec877929478b4adb769f5Mangesh Ghiware        if (!ApiHelper.HAS_SET_BEAM_PUSH_URIS) {
548a5682ab08e1d42fe272ec877929478b4adb769f5Mangesh Ghiware            // Disable beaming
549a5682ab08e1d42fe272ec877929478b4adb769f5Mangesh Ghiware            adapter.setNdefPushMessage(null, CameraActivity.this);
550a5682ab08e1d42fe272ec877929478b4adb769f5Mangesh Ghiware            return;
551a5682ab08e1d42fe272ec877929478b4adb769f5Mangesh Ghiware        }
552a5682ab08e1d42fe272ec877929478b4adb769f5Mangesh Ghiware
553a5682ab08e1d42fe272ec877929478b4adb769f5Mangesh Ghiware        adapter.setBeamPushUris(null, CameraActivity.this);
554a5682ab08e1d42fe272ec877929478b4adb769f5Mangesh Ghiware        adapter.setBeamPushUrisCallback(new CreateBeamUrisCallback() {
555a5682ab08e1d42fe272ec877929478b4adb769f5Mangesh Ghiware            @Override
556a5682ab08e1d42fe272ec877929478b4adb769f5Mangesh Ghiware            public Uri[] createBeamUris(NfcEvent event) {
557a5682ab08e1d42fe272ec877929478b4adb769f5Mangesh Ghiware                return mNfcPushUris;
558a5682ab08e1d42fe272ec877929478b4adb769f5Mangesh Ghiware            }
559a5682ab08e1d42fe272ec877929478b4adb769f5Mangesh Ghiware        }, CameraActivity.this);
560a5682ab08e1d42fe272ec877929478b4adb769f5Mangesh Ghiware    }
561a5682ab08e1d42fe272ec877929478b4adb769f5Mangesh Ghiware
562a5682ab08e1d42fe272ec877929478b4adb769f5Mangesh Ghiware    private void setNfcBeamPushUri(Uri uri) {
563a5682ab08e1d42fe272ec877929478b4adb769f5Mangesh Ghiware        mNfcPushUris[0] = uri;
564a5682ab08e1d42fe272ec877929478b4adb769f5Mangesh Ghiware    }
565a5682ab08e1d42fe272ec877929478b4adb769f5Mangesh Ghiware
566cd2eeb0efc4370f20e9836e20eb11cb974e3b00dMangesh Ghiware    private void setStandardShareIntent(Uri contentUri, String mimeType) {
56705804751ba07c8abcf422f57467d0ed3de95576cztenghui        mStandardShareIntent = getShareIntentFromType(mimeType);
56805804751ba07c8abcf422f57467d0ed3de95576cztenghui        if (mStandardShareIntent != null) {
56905804751ba07c8abcf422f57467d0ed3de95576cztenghui            mStandardShareIntent.putExtra(Intent.EXTRA_STREAM, contentUri);
57005804751ba07c8abcf422f57467d0ed3de95576cztenghui            mStandardShareIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
57105804751ba07c8abcf422f57467d0ed3de95576cztenghui            if (mStandardShareActionProvider != null) {
57205804751ba07c8abcf422f57467d0ed3de95576cztenghui                mStandardShareActionProvider.setShareIntent(mStandardShareIntent);
57305804751ba07c8abcf422f57467d0ed3de95576cztenghui            }
574cd2eeb0efc4370f20e9836e20eb11cb974e3b00dMangesh Ghiware        }
57505804751ba07c8abcf422f57467d0ed3de95576cztenghui    }
57605804751ba07c8abcf422f57467d0ed3de95576cztenghui
57705804751ba07c8abcf422f57467d0ed3de95576cztenghui    /**
57805804751ba07c8abcf422f57467d0ed3de95576cztenghui     * Get the share intent according to the mimeType
57905804751ba07c8abcf422f57467d0ed3de95576cztenghui     *
58005804751ba07c8abcf422f57467d0ed3de95576cztenghui     * @param mimeType The mimeType of current data.
58105804751ba07c8abcf422f57467d0ed3de95576cztenghui     * @return the video/image's ShareIntent or null if mimeType is invalid.
58205804751ba07c8abcf422f57467d0ed3de95576cztenghui     */
58305804751ba07c8abcf422f57467d0ed3de95576cztenghui    private Intent getShareIntentFromType(String mimeType) {
58405804751ba07c8abcf422f57467d0ed3de95576cztenghui        // Lazily create the intent object.
58505804751ba07c8abcf422f57467d0ed3de95576cztenghui        if (mimeType.startsWith("video/")) {
58605804751ba07c8abcf422f57467d0ed3de95576cztenghui            if (mVideoShareIntent == null) {
58705804751ba07c8abcf422f57467d0ed3de95576cztenghui                mVideoShareIntent = new Intent(Intent.ACTION_SEND);
58805804751ba07c8abcf422f57467d0ed3de95576cztenghui                mVideoShareIntent.setType("video/*");
58905804751ba07c8abcf422f57467d0ed3de95576cztenghui            }
59005804751ba07c8abcf422f57467d0ed3de95576cztenghui            return mVideoShareIntent;
59105804751ba07c8abcf422f57467d0ed3de95576cztenghui        } else if (mimeType.startsWith("image/")) {
59205804751ba07c8abcf422f57467d0ed3de95576cztenghui            if (mImageShareIntent == null) {
59305804751ba07c8abcf422f57467d0ed3de95576cztenghui                mImageShareIntent = new Intent(Intent.ACTION_SEND);
59405804751ba07c8abcf422f57467d0ed3de95576cztenghui                mImageShareIntent.setType("image/*");
59505804751ba07c8abcf422f57467d0ed3de95576cztenghui            }
59605804751ba07c8abcf422f57467d0ed3de95576cztenghui            return mImageShareIntent;
597cd2eeb0efc4370f20e9836e20eb11cb974e3b00dMangesh Ghiware        }
59805804751ba07c8abcf422f57467d0ed3de95576cztenghui        Log.w(TAG, "unsupported mimeType " + mimeType);
59905804751ba07c8abcf422f57467d0ed3de95576cztenghui        return null;
600cd2eeb0efc4370f20e9836e20eb11cb974e3b00dMangesh Ghiware    }
601cd2eeb0efc4370f20e9836e20eb11cb974e3b00dMangesh Ghiware
602cd2eeb0efc4370f20e9836e20eb11cb974e3b00dMangesh Ghiware    private void setPanoramaShareIntent(Uri contentUri) {
603cd2eeb0efc4370f20e9836e20eb11cb974e3b00dMangesh Ghiware        if (mPanoramaShareIntent == null) {
604cd2eeb0efc4370f20e9836e20eb11cb974e3b00dMangesh Ghiware            mPanoramaShareIntent = new Intent(Intent.ACTION_SEND);
605cd2eeb0efc4370f20e9836e20eb11cb974e3b00dMangesh Ghiware        }
606cd2eeb0efc4370f20e9836e20eb11cb974e3b00dMangesh Ghiware        mPanoramaShareIntent.setType("application/vnd.google.panorama360+jpg");
607cd2eeb0efc4370f20e9836e20eb11cb974e3b00dMangesh Ghiware        mPanoramaShareIntent.putExtra(Intent.EXTRA_STREAM, contentUri);
608cd2eeb0efc4370f20e9836e20eb11cb974e3b00dMangesh Ghiware        if (mPanoramaShareActionProvider != null) {
609cd2eeb0efc4370f20e9836e20eb11cb974e3b00dMangesh Ghiware            mPanoramaShareActionProvider.setShareIntent(mPanoramaShareIntent);
610cd2eeb0efc4370f20e9836e20eb11cb974e3b00dMangesh Ghiware        }
611cd2eeb0efc4370f20e9836e20eb11cb974e3b00dMangesh Ghiware    }
612cd2eeb0efc4370f20e9836e20eb11cb974e3b00dMangesh Ghiware
613aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu    @Override
614aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu    public void onMenuVisibilityChanged(boolean isVisible) {
615aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu        // If menu is showing, we need to make sure action bar does not go away.
616aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu        mMainHandler.removeMessages(HIDE_ACTION_BAR);
617aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu        if (!isVisible) {
618aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu            mMainHandler.sendEmptyMessageDelayed(HIDE_ACTION_BAR, SHOW_ACTION_BAR_TIMEOUT_MS);
619aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu        }
620aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu    }
621aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu
622cbd8267ee99e457f72822e8d8187b5e6823104f8Seth Raphael    @Override
623cbd8267ee99e457f72822e8d8187b5e6823104f8Seth Raphael    public boolean onShareTargetSelected(ShareActionProvider shareActionProvider, Intent intent) {
624cbd8267ee99e457f72822e8d8187b5e6823104f8Seth Raphael        int currentDataId = mFilmStripView.getCurrentId();
625cbd8267ee99e457f72822e8d8187b5e6823104f8Seth Raphael        if (currentDataId < 0) {
626cbd8267ee99e457f72822e8d8187b5e6823104f8Seth Raphael            return false;
627cbd8267ee99e457f72822e8d8187b5e6823104f8Seth Raphael        }
628cbd8267ee99e457f72822e8d8187b5e6823104f8Seth Raphael        UsageStatistics.onEvent(UsageStatistics.COMPONENT_CAMERA, UsageStatistics.ACTION_SHARE,
629cbd8267ee99e457f72822e8d8187b5e6823104f8Seth Raphael                intent.getComponent().getPackageName(), 0,
630cbd8267ee99e457f72822e8d8187b5e6823104f8Seth Raphael                UsageStatistics.hashFileName(fileNameFromDataID(currentDataId)));
631cbd8267ee99e457f72822e8d8187b5e6823104f8Seth Raphael        return true;
632cbd8267ee99e457f72822e8d8187b5e6823104f8Seth Raphael    }
633cbd8267ee99e457f72822e8d8187b5e6823104f8Seth Raphael
6340353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui    /**
6350353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui     * According to the data type, make the menu items for supported operations
6360353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui     * visible.
637a5a08d7642a1fdf961b057cc90e76c4c93103c15Sascha Haeberling     *
638fae11a165e344a38811770c7d348eda214683edcSascha Haeberling     * @param dataID the data ID of the current item.
6390353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui     */
640fae11a165e344a38811770c7d348eda214683edcSascha Haeberling    private void updateActionBarMenu(int dataID) {
641fae11a165e344a38811770c7d348eda214683edcSascha Haeberling        LocalData currentData = mDataAdapter.getLocalData(dataID);
642d4f69ed6fa6e302955ce8d0b2a21f47794ce7d64Erin Dahlgren        if (currentData == null) {
643d4f69ed6fa6e302955ce8d0b2a21f47794ce7d64Erin Dahlgren            return;
644d4f69ed6fa6e302955ce8d0b2a21f47794ce7d64Erin Dahlgren        }
645fae11a165e344a38811770c7d348eda214683edcSascha Haeberling        int type = currentData.getLocalDataType();
646fae11a165e344a38811770c7d348eda214683edcSascha Haeberling
6470353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui        if (mActionBarMenu == null) {
6480353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui            return;
6490353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui        }
6500353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui
6510353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui        int supported = 0;
6523250987bd014d1c5463b8a39bbe988165ab1cc3fAngus Kong
6530353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui        switch (type) {
6540353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui            case LocalData.LOCAL_IMAGE:
6550353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui                supported |= SUPPORT_DELETE | SUPPORT_ROTATE | SUPPORT_INFO
6560353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui                        | SUPPORT_CROP | SUPPORT_SETAS | SUPPORT_EDIT
657cd2eeb0efc4370f20e9836e20eb11cb974e3b00dMangesh Ghiware                        | SUPPORT_SHARE | SUPPORT_SHOW_ON_MAP;
6580353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui                break;
6590353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui            case LocalData.LOCAL_VIDEO:
660cd2eeb0efc4370f20e9836e20eb11cb974e3b00dMangesh Ghiware                supported |= SUPPORT_DELETE | SUPPORT_INFO | SUPPORT_TRIM
661cd2eeb0efc4370f20e9836e20eb11cb974e3b00dMangesh Ghiware                        | SUPPORT_SHARE;
6620353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui                break;
6630353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui            case LocalData.LOCAL_PHOTO_SPHERE:
6640353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui                supported |= SUPPORT_DELETE | SUPPORT_ROTATE | SUPPORT_INFO
6650353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui                        | SUPPORT_CROP | SUPPORT_SETAS | SUPPORT_EDIT
666cd2eeb0efc4370f20e9836e20eb11cb974e3b00dMangesh Ghiware                        | SUPPORT_SHARE | SUPPORT_SHOW_ON_MAP;
667cd2eeb0efc4370f20e9836e20eb11cb974e3b00dMangesh Ghiware                break;
668cd2eeb0efc4370f20e9836e20eb11cb974e3b00dMangesh Ghiware            case LocalData.LOCAL_360_PHOTO_SPHERE:
669cd2eeb0efc4370f20e9836e20eb11cb974e3b00dMangesh Ghiware                supported |= SUPPORT_DELETE | SUPPORT_ROTATE | SUPPORT_INFO
670cd2eeb0efc4370f20e9836e20eb11cb974e3b00dMangesh Ghiware                        | SUPPORT_CROP | SUPPORT_SETAS | SUPPORT_EDIT
671cd2eeb0efc4370f20e9836e20eb11cb974e3b00dMangesh Ghiware                        | SUPPORT_SHARE | SUPPORT_SHARE_PANORAMA360
6720353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui                        | SUPPORT_SHOW_ON_MAP;
6730353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui                break;
6740353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui            default:
6750353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui                break;
6760353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui        }
6770353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui
678e941cbeeacac11fbae5ae8b06cc1b311e3f6f36dztenghui        // In secure camera mode, we only support delete operation.
679e941cbeeacac11fbae5ae8b06cc1b311e3f6f36dztenghui        if (isSecureCamera()) {
680e941cbeeacac11fbae5ae8b06cc1b311e3f6f36dztenghui            supported &= SUPPORT_DELETE;
681e941cbeeacac11fbae5ae8b06cc1b311e3f6f36dztenghui        }
682e941cbeeacac11fbae5ae8b06cc1b311e3f6f36dztenghui
6830353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui        setMenuItemVisible(mActionBarMenu, R.id.action_delete,
6840353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui                (supported & SUPPORT_DELETE) != 0);
6850353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui        setMenuItemVisible(mActionBarMenu, R.id.action_rotate_ccw,
6860353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui                (supported & SUPPORT_ROTATE) != 0);
6870353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui        setMenuItemVisible(mActionBarMenu, R.id.action_rotate_cw,
6880353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui                (supported & SUPPORT_ROTATE) != 0);
689cd2eeb0efc4370f20e9836e20eb11cb974e3b00dMangesh Ghiware        setMenuItemVisible(mActionBarMenu, R.id.action_details,
690cd2eeb0efc4370f20e9836e20eb11cb974e3b00dMangesh Ghiware                (supported & SUPPORT_INFO) != 0);
6910353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui        setMenuItemVisible(mActionBarMenu, R.id.action_crop,
6920353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui                (supported & SUPPORT_CROP) != 0);
6930353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui        setMenuItemVisible(mActionBarMenu, R.id.action_setas,
6940353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui                (supported & SUPPORT_SETAS) != 0);
6950353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui        setMenuItemVisible(mActionBarMenu, R.id.action_edit,
6960353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui                (supported & SUPPORT_EDIT) != 0);
697cd2eeb0efc4370f20e9836e20eb11cb974e3b00dMangesh Ghiware        setMenuItemVisible(mActionBarMenu, R.id.action_trim,
698cd2eeb0efc4370f20e9836e20eb11cb974e3b00dMangesh Ghiware                (supported & SUPPORT_TRIM) != 0);
699cd2eeb0efc4370f20e9836e20eb11cb974e3b00dMangesh Ghiware
70033035c19cc47adfb738c20cef66652ae451c8e10Mangesh Ghiware        boolean standardShare = (supported & SUPPORT_SHARE) != 0;
70133035c19cc47adfb738c20cef66652ae451c8e10Mangesh Ghiware        boolean panoramaShare = (supported & SUPPORT_SHARE_PANORAMA360) != 0;
70233035c19cc47adfb738c20cef66652ae451c8e10Mangesh Ghiware        setMenuItemVisible(mActionBarMenu, R.id.action_share, standardShare);
70333035c19cc47adfb738c20cef66652ae451c8e10Mangesh Ghiware        setMenuItemVisible(mActionBarMenu, R.id.action_share_panorama, panoramaShare);
70433035c19cc47adfb738c20cef66652ae451c8e10Mangesh Ghiware
70533035c19cc47adfb738c20cef66652ae451c8e10Mangesh Ghiware        if (panoramaShare) {
70633035c19cc47adfb738c20cef66652ae451c8e10Mangesh Ghiware            // For 360 PhotoSphere, relegate standard share to the overflow menu
70733035c19cc47adfb738c20cef66652ae451c8e10Mangesh Ghiware            MenuItem item = mActionBarMenu.findItem(R.id.action_share);
70833035c19cc47adfb738c20cef66652ae451c8e10Mangesh Ghiware            if (item != null) {
70933035c19cc47adfb738c20cef66652ae451c8e10Mangesh Ghiware                item.setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER);
71033035c19cc47adfb738c20cef66652ae451c8e10Mangesh Ghiware                item.setTitle(getResources().getString(R.string.share_as_photo));
71133035c19cc47adfb738c20cef66652ae451c8e10Mangesh Ghiware            }
71233035c19cc47adfb738c20cef66652ae451c8e10Mangesh Ghiware            // And, promote "share as panorama" to action bar
71333035c19cc47adfb738c20cef66652ae451c8e10Mangesh Ghiware            item = mActionBarMenu.findItem(R.id.action_share_panorama);
71433035c19cc47adfb738c20cef66652ae451c8e10Mangesh Ghiware            if (item != null) {
71533035c19cc47adfb738c20cef66652ae451c8e10Mangesh Ghiware                item.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
71633035c19cc47adfb738c20cef66652ae451c8e10Mangesh Ghiware            }
717cd2eeb0efc4370f20e9836e20eb11cb974e3b00dMangesh Ghiware            setPanoramaShareIntent(currentData.getContentUri());
718cd2eeb0efc4370f20e9836e20eb11cb974e3b00dMangesh Ghiware        }
71933035c19cc47adfb738c20cef66652ae451c8e10Mangesh Ghiware        if (standardShare) {
72033035c19cc47adfb738c20cef66652ae451c8e10Mangesh Ghiware            if (!panoramaShare) {
72133035c19cc47adfb738c20cef66652ae451c8e10Mangesh Ghiware                MenuItem item = mActionBarMenu.findItem(R.id.action_share);
72233035c19cc47adfb738c20cef66652ae451c8e10Mangesh Ghiware                if (item != null) {
72333035c19cc47adfb738c20cef66652ae451c8e10Mangesh Ghiware                    item.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
72433035c19cc47adfb738c20cef66652ae451c8e10Mangesh Ghiware                    item.setTitle(getResources().getString(R.string.share));
72533035c19cc47adfb738c20cef66652ae451c8e10Mangesh Ghiware                }
72633035c19cc47adfb738c20cef66652ae451c8e10Mangesh Ghiware            }
72733035c19cc47adfb738c20cef66652ae451c8e10Mangesh Ghiware            setStandardShareIntent(currentData.getContentUri(), currentData.getMimeType());
728a5682ab08e1d42fe272ec877929478b4adb769f5Mangesh Ghiware            setNfcBeamPushUri(currentData.getContentUri());
72933035c19cc47adfb738c20cef66652ae451c8e10Mangesh Ghiware        }
730fae11a165e344a38811770c7d348eda214683edcSascha Haeberling
731fae11a165e344a38811770c7d348eda214683edcSascha Haeberling        boolean itemHasLocation = currentData.getLatLong() != null;
732fae11a165e344a38811770c7d348eda214683edcSascha Haeberling        setMenuItemVisible(mActionBarMenu, R.id.action_show_on_map,
733fae11a165e344a38811770c7d348eda214683edcSascha Haeberling                itemHasLocation && (supported & SUPPORT_SHOW_ON_MAP) != 0);
7340353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui    }
7350353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui
7360353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui    private void setMenuItemVisible(Menu menu, int itemId, boolean visible) {
7370353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui        MenuItem item = menu.findItem(itemId);
7380353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui        if (item != null)
7390353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui            item.setVisible(visible);
7400353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui    }
7410353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui
7427cfcafdf8f4a439c8fa87b612616fe409979e8a4Ruben Brunk    private ImageTaskManager.TaskListener mPlaceholderListener =
7437cfcafdf8f4a439c8fa87b612616fe409979e8a4Ruben Brunk            new ImageTaskManager.TaskListener() {
7447cfcafdf8f4a439c8fa87b612616fe409979e8a4Ruben Brunk
7457cfcafdf8f4a439c8fa87b612616fe409979e8a4Ruben Brunk                @Override
7467cfcafdf8f4a439c8fa87b612616fe409979e8a4Ruben Brunk                public void onTaskQueued(String filePath, final Uri imageUri) {
7477cfcafdf8f4a439c8fa87b612616fe409979e8a4Ruben Brunk                    mMainHandler.post(new Runnable() {
7487cfcafdf8f4a439c8fa87b612616fe409979e8a4Ruben Brunk                        @Override
7497cfcafdf8f4a439c8fa87b612616fe409979e8a4Ruben Brunk                        public void run() {
7507cfcafdf8f4a439c8fa87b612616fe409979e8a4Ruben Brunk                            notifyNewMedia(imageUri);
7517cfcafdf8f4a439c8fa87b612616fe409979e8a4Ruben Brunk                            int dataID = mDataAdapter.findDataByContentUri(imageUri);
7527cfcafdf8f4a439c8fa87b612616fe409979e8a4Ruben Brunk                            if (dataID != -1) {
7537cfcafdf8f4a439c8fa87b612616fe409979e8a4Ruben Brunk                                LocalData d = mDataAdapter.getLocalData(dataID);
7547cfcafdf8f4a439c8fa87b612616fe409979e8a4Ruben Brunk                                InProgressDataWrapper newData = new InProgressDataWrapper(d, true);
7557cfcafdf8f4a439c8fa87b612616fe409979e8a4Ruben Brunk                                mDataAdapter.updateData(dataID, newData);
7567cfcafdf8f4a439c8fa87b612616fe409979e8a4Ruben Brunk                            }
7577cfcafdf8f4a439c8fa87b612616fe409979e8a4Ruben Brunk                        }
7587cfcafdf8f4a439c8fa87b612616fe409979e8a4Ruben Brunk                    });
7597cfcafdf8f4a439c8fa87b612616fe409979e8a4Ruben Brunk                }
7607cfcafdf8f4a439c8fa87b612616fe409979e8a4Ruben Brunk
7617cfcafdf8f4a439c8fa87b612616fe409979e8a4Ruben Brunk                @Override
7627cfcafdf8f4a439c8fa87b612616fe409979e8a4Ruben Brunk                public void onTaskDone(String filePath, final Uri imageUri) {
7637cfcafdf8f4a439c8fa87b612616fe409979e8a4Ruben Brunk                    mMainHandler.post(new Runnable() {
7647cfcafdf8f4a439c8fa87b612616fe409979e8a4Ruben Brunk                        @Override
7657cfcafdf8f4a439c8fa87b612616fe409979e8a4Ruben Brunk                        public void run() {
7667cfcafdf8f4a439c8fa87b612616fe409979e8a4Ruben Brunk                            mDataAdapter.refresh(getContentResolver(), imageUri);
7677cfcafdf8f4a439c8fa87b612616fe409979e8a4Ruben Brunk                        }
7687cfcafdf8f4a439c8fa87b612616fe409979e8a4Ruben Brunk                    });
7697cfcafdf8f4a439c8fa87b612616fe409979e8a4Ruben Brunk                }
7707cfcafdf8f4a439c8fa87b612616fe409979e8a4Ruben Brunk
7717cfcafdf8f4a439c8fa87b612616fe409979e8a4Ruben Brunk                @Override
7727cfcafdf8f4a439c8fa87b612616fe409979e8a4Ruben Brunk                public void onTaskProgress(String filePath, Uri imageUri, int progress) {
7737cfcafdf8f4a439c8fa87b612616fe409979e8a4Ruben Brunk                    // Do nothing
7747cfcafdf8f4a439c8fa87b612616fe409979e8a4Ruben Brunk                }
7757cfcafdf8f4a439c8fa87b612616fe409979e8a4Ruben Brunk    };
7767cfcafdf8f4a439c8fa87b612616fe409979e8a4Ruben Brunk
7776798c34ddb5248f038f351674c6a6c7a20992c8cAngus Kong    private ImageTaskManager.TaskListener mStitchingListener =
7786798c34ddb5248f038f351674c6a6c7a20992c8cAngus Kong            new ImageTaskManager.TaskListener() {
7796798c34ddb5248f038f351674c6a6c7a20992c8cAngus Kong                @Override
78037f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling                public void onTaskQueued(String filePath, final Uri imageUri) {
78137f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling                    mMainHandler.post(new Runnable() {
78237f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling                        @Override
78337f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling                        public void run() {
78437f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling                            notifyNewMedia(imageUri);
7853250987bd014d1c5463b8a39bbe988165ab1cc3fAngus Kong                            int dataID = mDataAdapter.findDataByContentUri(imageUri);
7863250987bd014d1c5463b8a39bbe988165ab1cc3fAngus Kong                            if (dataID != -1) {
7873250987bd014d1c5463b8a39bbe988165ab1cc3fAngus Kong                                // Don't allow special UI actions (swipe to
7883250987bd014d1c5463b8a39bbe988165ab1cc3fAngus Kong                                // delete, for example) on in-progress data.
7893250987bd014d1c5463b8a39bbe988165ab1cc3fAngus Kong                                LocalData d = mDataAdapter.getLocalData(dataID);
7903250987bd014d1c5463b8a39bbe988165ab1cc3fAngus Kong                                InProgressDataWrapper newData = new InProgressDataWrapper(d);
7913250987bd014d1c5463b8a39bbe988165ab1cc3fAngus Kong                                mDataAdapter.updateData(dataID, newData);
7923250987bd014d1c5463b8a39bbe988165ab1cc3fAngus Kong                            }
79337f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling                        }
79437f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling                    });
7956798c34ddb5248f038f351674c6a6c7a20992c8cAngus Kong                }
7966798c34ddb5248f038f351674c6a6c7a20992c8cAngus Kong
7976798c34ddb5248f038f351674c6a6c7a20992c8cAngus Kong                @Override
79837f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling                public void onTaskDone(String filePath, final Uri imageUri) {
79937f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling                    Log.v(TAG, "onTaskDone:" + filePath);
80037f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling                    mMainHandler.post(new Runnable() {
80137f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling                        @Override
80237f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling                        public void run() {
80337f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling                            int doneID = mDataAdapter.findDataByContentUri(imageUri);
80437f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling                            int currentDataId = mFilmStripView.getCurrentId();
80537f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling
80637f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling                            if (currentDataId == doneID) {
80737f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling                                hidePanoStitchingProgress();
80837f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling                                updateStitchingProgress(0);
80937f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling                            }
81037f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling
81137f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling                            mDataAdapter.refresh(getContentResolver(), imageUri);
81237f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling                        }
81337f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling                    });
8146798c34ddb5248f038f351674c6a6c7a20992c8cAngus Kong                }
8156798c34ddb5248f038f351674c6a6c7a20992c8cAngus Kong
8166798c34ddb5248f038f351674c6a6c7a20992c8cAngus Kong                @Override
8176798c34ddb5248f038f351674c6a6c7a20992c8cAngus Kong                public void onTaskProgress(
81837f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling                        String filePath, final Uri imageUri, final int progress) {
81937f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling                    mMainHandler.post(new Runnable() {
82037f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling                        @Override
82137f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling                        public void run() {
82237f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling                            int currentDataId = mFilmStripView.getCurrentId();
82337f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling                            if (currentDataId == -1) {
82437f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling                                return;
82537f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling                            }
82637f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling                            if (imageUri.equals(
82737f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling                                    mDataAdapter.getLocalData(currentDataId).getContentUri())) {
82837f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling                                updateStitchingProgress(progress);
82937f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling                            }
83037f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling                        }
83137f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling                    });
8326798c34ddb5248f038f351674c6a6c7a20992c8cAngus Kong                }
8336798c34ddb5248f038f351674c6a6c7a20992c8cAngus Kong            };
8346798c34ddb5248f038f351674c6a6c7a20992c8cAngus Kong
8356432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu    public MediaSaveService getMediaSaveService() {
8366432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu        return mMediaSaveService;
8378872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb    }
8388872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb
8396432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu    public void notifyNewMedia(Uri uri) {
8406432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu        ContentResolver cr = getContentResolver();
8416432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu        String mimeType = cr.getType(uri);
8426432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu        if (mimeType.startsWith("video/")) {
843b50b5cbfbc0a67db6fc43373363b10381c9c61a3Angus Kong            sendBroadcast(new Intent(CameraUtil.ACTION_NEW_VIDEO, uri));
8446432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu            mDataAdapter.addNewVideo(cr, uri);
8456432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu        } else if (mimeType.startsWith("image/")) {
846b50b5cbfbc0a67db6fc43373363b10381c9c61a3Angus Kong            CameraUtil.broadcastNewPicture(this, uri);
8476432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu            mDataAdapter.addNewPhoto(cr, uri);
84837f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling        } else if (mimeType.startsWith("application/stitching-preview")) {
84937f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling            mDataAdapter.addNewPhoto(cr, uri);
8507cfcafdf8f4a439c8fa87b612616fe409979e8a4Ruben Brunk        } else if (mimeType.startsWith(PlaceholderManager.PLACEHOLDER_MIME_TYPE)) {
8517cfcafdf8f4a439c8fa87b612616fe409979e8a4Ruben Brunk            mDataAdapter.addNewPhoto(cr, uri);
8526432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu        } else {
8536432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu            android.util.Log.w(TAG, "Unknown new media with MIME type:"
8546432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu                    + mimeType + ", uri:" + uri);
8556432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu        }
8568872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb    }
8578872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb
8586432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu    private void removeData(int dataID) {
8596432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu        mDataAdapter.removeData(CameraActivity.this, dataID);
860742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu        if (mDataAdapter.getTotalNumber() > 1) {
861742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu            showUndoDeletionBar();
862742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu        } else {
863742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu            // If camera preview is the only view left in filmstrip,
864742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu            // no need to show undo bar.
865f2c14330a49abb55f75bfae6b3bae67a0dad115bDoris Liu            mPendingDeletion = true;
866742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu            performDeletion();
867742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu        }
8688872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb    }
8698872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb
8706432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu    private void bindMediaSaveService() {
8716432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu        Intent intent = new Intent(this, MediaSaveService.class);
8726432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu        bindService(intent, mConnection, Context.BIND_AUTO_CREATE);
8738872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb    }
8748872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb
8756432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu    private void unbindMediaSaveService() {
8766432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu        if (mConnection != null) {
8776432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu            unbindService(mConnection);
8786432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu        }
8798872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb    }
8808872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb
8816432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu    @Override
8820353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui    public boolean onCreateOptionsMenu(Menu menu) {
8830353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui        // Inflate the menu items for use in the action bar
8840353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui        MenuInflater inflater = getMenuInflater();
8850353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui        inflater.inflate(R.menu.operations, menu);
8860353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui        mActionBarMenu = menu;
887cd2eeb0efc4370f20e9836e20eb11cb974e3b00dMangesh Ghiware
888cd2eeb0efc4370f20e9836e20eb11cb974e3b00dMangesh Ghiware        // Configure the standard share action provider
889cd2eeb0efc4370f20e9836e20eb11cb974e3b00dMangesh Ghiware        MenuItem item = menu.findItem(R.id.action_share);
890cd2eeb0efc4370f20e9836e20eb11cb974e3b00dMangesh Ghiware        mStandardShareActionProvider = (ShareActionProvider) item.getActionProvider();
89133035c19cc47adfb738c20cef66652ae451c8e10Mangesh Ghiware        mStandardShareActionProvider.setShareHistoryFileName("standard_share_history.xml");
892cd2eeb0efc4370f20e9836e20eb11cb974e3b00dMangesh Ghiware        if (mStandardShareIntent != null) {
893cd2eeb0efc4370f20e9836e20eb11cb974e3b00dMangesh Ghiware            mStandardShareActionProvider.setShareIntent(mStandardShareIntent);
894cd2eeb0efc4370f20e9836e20eb11cb974e3b00dMangesh Ghiware        }
895cd2eeb0efc4370f20e9836e20eb11cb974e3b00dMangesh Ghiware
896cd2eeb0efc4370f20e9836e20eb11cb974e3b00dMangesh Ghiware        // Configure the panorama share action provider
897cd2eeb0efc4370f20e9836e20eb11cb974e3b00dMangesh Ghiware        item = menu.findItem(R.id.action_share_panorama);
898cd2eeb0efc4370f20e9836e20eb11cb974e3b00dMangesh Ghiware        mPanoramaShareActionProvider = (ShareActionProvider) item.getActionProvider();
89933035c19cc47adfb738c20cef66652ae451c8e10Mangesh Ghiware        mPanoramaShareActionProvider.setShareHistoryFileName("panorama_share_history.xml");
900cd2eeb0efc4370f20e9836e20eb11cb974e3b00dMangesh Ghiware        if (mPanoramaShareIntent != null) {
901cd2eeb0efc4370f20e9836e20eb11cb974e3b00dMangesh Ghiware            mPanoramaShareActionProvider.setShareIntent(mPanoramaShareIntent);
902cd2eeb0efc4370f20e9836e20eb11cb974e3b00dMangesh Ghiware        }
903cd2eeb0efc4370f20e9836e20eb11cb974e3b00dMangesh Ghiware
904cbd8267ee99e457f72822e8d8187b5e6823104f8Seth Raphael        mStandardShareActionProvider.setOnShareTargetSelectedListener(this);
905cbd8267ee99e457f72822e8d8187b5e6823104f8Seth Raphael        mPanoramaShareActionProvider.setOnShareTargetSelectedListener(this);
906cbd8267ee99e457f72822e8d8187b5e6823104f8Seth Raphael
9070353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui        return super.onCreateOptionsMenu(menu);
9080353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui    }
9090353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui
9100353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui    @Override
9110353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui    public boolean onOptionsItemSelected(MenuItem item) {
9126f64b50db6565bc6454304fd20c0c4020b297bb7Sascha Haeberling        int currentDataId = mFilmStripView.getCurrentId();
9136f64b50db6565bc6454304fd20c0c4020b297bb7Sascha Haeberling        if (currentDataId < 0) {
9146f64b50db6565bc6454304fd20c0c4020b297bb7Sascha Haeberling            return false;
9156f64b50db6565bc6454304fd20c0c4020b297bb7Sascha Haeberling        }
9166f64b50db6565bc6454304fd20c0c4020b297bb7Sascha Haeberling        final LocalData localData = mDataAdapter.getLocalData(currentDataId);
9176f64b50db6565bc6454304fd20c0c4020b297bb7Sascha Haeberling
9180353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui        // Handle presses on the action bar items
9190353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui        switch (item.getItemId()) {
9203f969c1735e2636bf22dfe44104d0e99924cca97Alan Newberger            case android.R.id.home:
9213f969c1735e2636bf22dfe44104d0e99924cca97Alan Newberger                // ActionBar's Up/Home button was clicked
92230968d0f9a5094d62de1fb023b8bf7dc3202ebafMangesh Ghiware                try {
923761306fadfa94b538f43e8cf3463bf6d22814947Alan Newberger                    startActivity(IntentHelper.getGalleryIntent(this));
92430968d0f9a5094d62de1fb023b8bf7dc3202ebafMangesh Ghiware                    return true;
92530968d0f9a5094d62de1fb023b8bf7dc3202ebafMangesh Ghiware                } catch (ActivityNotFoundException e) {
926761306fadfa94b538f43e8cf3463bf6d22814947Alan Newberger                    Log.w(TAG, "Failed to launch gallery activity, closing");
92730968d0f9a5094d62de1fb023b8bf7dc3202ebafMangesh Ghiware                    finish();
9285df64b0a818d4f85cb14602db725f05b0055c1d9Mangesh Ghiware                }
9290353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui            case R.id.action_delete:
930cbd8267ee99e457f72822e8d8187b5e6823104f8Seth Raphael                UsageStatistics.onEvent(UsageStatistics.COMPONENT_CAMERA,
931cbd8267ee99e457f72822e8d8187b5e6823104f8Seth Raphael                        UsageStatistics.ACTION_DELETE, null, 0,
932cbd8267ee99e457f72822e8d8187b5e6823104f8Seth Raphael                        UsageStatistics.hashFileName(fileNameFromDataID(currentDataId)));
933e857cc90a98e280e2008beb03e2446bd642d2ec4Angus Kong                removeData(currentDataId);
9340353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui                return true;
9350353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui            case R.id.action_edit:
936cbd8267ee99e457f72822e8d8187b5e6823104f8Seth Raphael                UsageStatistics.onEvent(UsageStatistics.COMPONENT_CAMERA,
937cbd8267ee99e457f72822e8d8187b5e6823104f8Seth Raphael                        UsageStatistics.ACTION_EDIT, null, 0,
938cbd8267ee99e457f72822e8d8187b5e6823104f8Seth Raphael                        UsageStatistics.hashFileName(fileNameFromDataID(currentDataId)));
93988ef7664ba6a888fa5da8693091674e152b56192Sascha Haeberling                launchEditor(localData);
9400353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui                return true;
9410819304bc06ffd3498d9fd0d8a148c50f0903c46nicolasroard            case R.id.action_trim: {
9426b9203214d828d72758943aca55adceab684a862ztenghui                // This is going to be handled by the Gallery app.
9436b9203214d828d72758943aca55adceab684a862ztenghui                Intent intent = new Intent(ACTION_TRIM_VIDEO);
9446b9203214d828d72758943aca55adceab684a862ztenghui                LocalData currentData = mDataAdapter.getLocalData(
9456b9203214d828d72758943aca55adceab684a862ztenghui                        mFilmStripView.getCurrentId());
9466b9203214d828d72758943aca55adceab684a862ztenghui                intent.setData(currentData.getContentUri());
9476b9203214d828d72758943aca55adceab684a862ztenghui                // We need the file path to wrap this into a RandomAccessFile.
9486b9203214d828d72758943aca55adceab684a862ztenghui                intent.putExtra(MEDIA_ITEM_PATH, currentData.getPath());
949b7639c641f2ed5d0c60546349c3aa9e90c026878Sascha Haeberling                startActivityForResult(intent, REQ_CODE_DONT_SWITCH_TO_PREVIEW);
9500353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui                return true;
9510819304bc06ffd3498d9fd0d8a148c50f0903c46nicolasroard            }
9520353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui            case R.id.action_rotate_ccw:
953a16e7b50f3148f581439509279f242092e254309ztenghui                localData.rotate90Degrees(this, mDataAdapter, currentDataId, false);
9540353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui                return true;
9550353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui            case R.id.action_rotate_cw:
956a16e7b50f3148f581439509279f242092e254309ztenghui                localData.rotate90Degrees(this, mDataAdapter, currentDataId, true);
9570353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui                return true;
95819ab725a5e640a1a20b1a6def083e37d1d1c1e20nicolasroard            case R.id.action_crop: {
959cbd8267ee99e457f72822e8d8187b5e6823104f8Seth Raphael                UsageStatistics.onEvent(UsageStatistics.COMPONENT_CAMERA,
960cbd8267ee99e457f72822e8d8187b5e6823104f8Seth Raphael                        UsageStatistics.ACTION_CROP, null, 0,
961cbd8267ee99e457f72822e8d8187b5e6823104f8Seth Raphael                        UsageStatistics.hashFileName(fileNameFromDataID(currentDataId)));
96219ab725a5e640a1a20b1a6def083e37d1d1c1e20nicolasroard                Intent intent = new Intent(CropActivity.CROP_ACTION);
96319ab725a5e640a1a20b1a6def083e37d1d1c1e20nicolasroard                intent.setClass(this, CropActivity.class);
96419ab725a5e640a1a20b1a6def083e37d1d1c1e20nicolasroard                intent.setDataAndType(localData.getContentUri(), localData.getMimeType())
96519ab725a5e640a1a20b1a6def083e37d1d1c1e20nicolasroard                        .setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
96619ab725a5e640a1a20b1a6def083e37d1d1c1e20nicolasroard                startActivityForResult(intent, REQ_CODE_DONT_SWITCH_TO_PREVIEW);
9670353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui                return true;
96819ab725a5e640a1a20b1a6def083e37d1d1c1e20nicolasroard            }
9690819304bc06ffd3498d9fd0d8a148c50f0903c46nicolasroard            case R.id.action_setas: {
9700819304bc06ffd3498d9fd0d8a148c50f0903c46nicolasroard                Intent intent = new Intent(Intent.ACTION_ATTACH_DATA)
9710819304bc06ffd3498d9fd0d8a148c50f0903c46nicolasroard                        .setDataAndType(localData.getContentUri(),
9720819304bc06ffd3498d9fd0d8a148c50f0903c46nicolasroard                                localData.getMimeType())
9730819304bc06ffd3498d9fd0d8a148c50f0903c46nicolasroard                        .setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
9740819304bc06ffd3498d9fd0d8a148c50f0903c46nicolasroard                intent.putExtra("mimeType", intent.getType());
975b7639c641f2ed5d0c60546349c3aa9e90c026878Sascha Haeberling                startActivityForResult(Intent.createChooser(
976b7639c641f2ed5d0c60546349c3aa9e90c026878Sascha Haeberling                        intent, getString(R.string.set_as)), REQ_CODE_DONT_SWITCH_TO_PREVIEW);
9770353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui                return true;
9780819304bc06ffd3498d9fd0d8a148c50f0903c46nicolasroard            }
9790353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui            case R.id.action_details:
9806f64b50db6565bc6454304fd20c0c4020b297bb7Sascha Haeberling                (new AsyncTask<Void, Void, MediaDetails>() {
9816f64b50db6565bc6454304fd20c0c4020b297bb7Sascha Haeberling                    @Override
9826f64b50db6565bc6454304fd20c0c4020b297bb7Sascha Haeberling                    protected MediaDetails doInBackground(Void... params) {
9836f64b50db6565bc6454304fd20c0c4020b297bb7Sascha Haeberling                        return localData.getMediaDetails(CameraActivity.this);
9846f64b50db6565bc6454304fd20c0c4020b297bb7Sascha Haeberling                    }
9856f64b50db6565bc6454304fd20c0c4020b297bb7Sascha Haeberling
9866f64b50db6565bc6454304fd20c0c4020b297bb7Sascha Haeberling                    @Override
9876f64b50db6565bc6454304fd20c0c4020b297bb7Sascha Haeberling                    protected void onPostExecute(MediaDetails mediaDetails) {
98864cea6aadb912067e31f1a158044c5efeb3e64afSascha Haeberling                        if (mediaDetails != null) {
98964cea6aadb912067e31f1a158044c5efeb3e64afSascha Haeberling                            DetailsDialog.create(CameraActivity.this, mediaDetails).show();
99064cea6aadb912067e31f1a158044c5efeb3e64afSascha Haeberling                        }
9916f64b50db6565bc6454304fd20c0c4020b297bb7Sascha Haeberling                    }
9926f64b50db6565bc6454304fd20c0c4020b297bb7Sascha Haeberling                }).execute();
9930353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui                return true;
9940353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui            case R.id.action_show_on_map:
995fae11a165e344a38811770c7d348eda214683edcSascha Haeberling                double[] latLong = localData.getLatLong();
996fae11a165e344a38811770c7d348eda214683edcSascha Haeberling                if (latLong != null) {
997a5a08d7642a1fdf961b057cc90e76c4c93103c15Sascha Haeberling                    CameraUtil.showOnMap(this, latLong);
998fae11a165e344a38811770c7d348eda214683edcSascha Haeberling                }
9990353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui                return true;
10000353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui            default:
10010353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui                return super.onOptionsItemSelected(item);
10020353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui        }
10030353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui    }
10040353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui
1005fd43e3be3d69f48a97bdd9084e9549f41e963cc2ztenghui    private boolean isCaptureIntent() {
1006fd43e3be3d69f48a97bdd9084e9549f41e963cc2ztenghui        if (MediaStore.ACTION_VIDEO_CAPTURE.equals(getIntent().getAction())
1007fd43e3be3d69f48a97bdd9084e9549f41e963cc2ztenghui                || MediaStore.ACTION_IMAGE_CAPTURE.equals(getIntent().getAction())
1008fd43e3be3d69f48a97bdd9084e9549f41e963cc2ztenghui                || MediaStore.ACTION_IMAGE_CAPTURE_SECURE.equals(getIntent().getAction())) {
1009fd43e3be3d69f48a97bdd9084e9549f41e963cc2ztenghui            return true;
1010fd43e3be3d69f48a97bdd9084e9549f41e963cc2ztenghui        } else {
1011fd43e3be3d69f48a97bdd9084e9549f41e963cc2ztenghui            return false;
1012fd43e3be3d69f48a97bdd9084e9549f41e963cc2ztenghui        }
1013fd43e3be3d69f48a97bdd9084e9549f41e963cc2ztenghui    }
1014fd43e3be3d69f48a97bdd9084e9549f41e963cc2ztenghui
10150353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui    @Override
10166432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu    public void onCreate(Bundle state) {
10176432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu        super.onCreate(state);
1018048bf4d0b46c4c34d8caa801c8ddc8c1ff4e79cfSascha Haeberling        GcamHelper.init(getContentResolver());
1019048bf4d0b46c4c34d8caa801c8ddc8c1ff4e79cfSascha Haeberling
102050df47071c776703a36dbc4cb90ec8d1df3c0f6eztenghui        getWindow().requestFeature(Window.FEATURE_ACTION_BAR);
10216432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu        setContentView(R.layout.camera_filmstrip);
1022fa9e2cc9ccbcd746f5765cb7a0afebcdb60e2973ztenghui        mActionBar = getActionBar();
1023aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu        mActionBar.addOnMenuVisibilityListener(this);
1024fa9e2cc9ccbcd746f5765cb7a0afebcdb60e2973ztenghui
10256432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu        if (ApiHelper.HAS_ROTATION_ANIMATION) {
10266432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu            setRotationAnimation();
10276432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu        }
1028aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu
1029aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu        mMainHandler = new MainHandler(getMainLooper());
10306432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu        // Check if this is in the secure camera mode.
10316432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu        Intent intent = getIntent();
10326432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu        String action = intent.getAction();
1033b84b9738c855a525dc1944165983cc3c342ce446Doris Liu        if (INTENT_ACTION_STILL_IMAGE_CAMERA_SECURE.equals(action)
1034b84b9738c855a525dc1944165983cc3c342ce446Doris Liu                || ACTION_IMAGE_CAPTURE_SECURE.equals(action)) {
10356432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu            mSecureCamera = true;
10366432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu        } else {
10376432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu            mSecureCamera = intent.getBooleanExtra(SECURE_CAMERA_EXTRA, false);
10388872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb        }
1039b84b9738c855a525dc1944165983cc3c342ce446Doris Liu
1040b84b9738c855a525dc1944165983cc3c342ce446Doris Liu        if (mSecureCamera) {
1041b84b9738c855a525dc1944165983cc3c342ce446Doris Liu            // Change the window flags so that secure camera can show when locked
1042b84b9738c855a525dc1944165983cc3c342ce446Doris Liu            Window win = getWindow();
1043b84b9738c855a525dc1944165983cc3c342ce446Doris Liu            WindowManager.LayoutParams params = win.getAttributes();
1044b84b9738c855a525dc1944165983cc3c342ce446Doris Liu            params.flags |= WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED;
1045b84b9738c855a525dc1944165983cc3c342ce446Doris Liu            win.setAttributes(params);
1046b84b9738c855a525dc1944165983cc3c342ce446Doris Liu
1047b84b9738c855a525dc1944165983cc3c342ce446Doris Liu            // Filter for screen off so that we can finish secure camera activity
1048b84b9738c855a525dc1944165983cc3c342ce446Doris Liu            // when screen is off.
10496432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu            IntentFilter filter = new IntentFilter(Intent.ACTION_SCREEN_OFF);
10506432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu            registerReceiver(mScreenOffReceiver, filter);
10516a8e8a1a0f3e8e62cd350733e275047475380d6bAngus Kong            // TODO: This static screen off event receiver is a workaround to the
10526a8e8a1a0f3e8e62cd350733e275047475380d6bAngus Kong            // double onResume() invocation (onResume->onPause->onResume). We should
10536a8e8a1a0f3e8e62cd350733e275047475380d6bAngus Kong            // find a better solution to this.
10546a8e8a1a0f3e8e62cd350733e275047475380d6bAngus Kong            if (sScreenOffReceiver == null) {
10556a8e8a1a0f3e8e62cd350733e275047475380d6bAngus Kong                sScreenOffReceiver = new ScreenOffReceiver();
10566a8e8a1a0f3e8e62cd350733e275047475380d6bAngus Kong                registerReceiver(sScreenOffReceiver, filter);
10576a8e8a1a0f3e8e62cd350733e275047475380d6bAngus Kong            }
1058b84b9738c855a525dc1944165983cc3c342ce446Doris Liu        }
1059653c43be6e58be54cf2ac3c8efb2d65ac20bd03bAngus Kong        mAboveFilmstripControlLayout =
1060653c43be6e58be54cf2ac3c8efb2d65ac20bd03bAngus Kong                (FrameLayout) findViewById(R.id.camera_above_filmstrip_layout);
1061653c43be6e58be54cf2ac3c8efb2d65ac20bd03bAngus Kong        mAboveFilmstripControlLayout.setFitsSystemWindows(true);
10625199c2078f3aea06732015ce8ad354c066a2f4ecSascha Haeberling        // Hide action bar first since we are in full screen mode first, and
10635199c2078f3aea06732015ce8ad354c066a2f4ecSascha Haeberling        // switch the system UI to lights-out mode.
1064aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu        this.setSystemBarsVisibility(false);
1065ed15d1a140986473bbe7fffd72ec9618c41c5979Angus Kong        mPanoramaManager = AppManagerFactory.getInstance(this)
1066ed15d1a140986473bbe7fffd72ec9618c41c5979Angus Kong                .getPanoramaStitchingManager();
10677cfcafdf8f4a439c8fa87b612616fe409979e8a4Ruben Brunk        mPlaceholderManager = AppManagerFactory.getInstance(this)
10687cfcafdf8f4a439c8fa87b612616fe409979e8a4Ruben Brunk                .getGcamProcessingManager();
10696798c34ddb5248f038f351674c6a6c7a20992c8cAngus Kong        mPanoramaManager.addTaskListener(mStitchingListener);
10707cfcafdf8f4a439c8fa87b612616fe409979e8a4Ruben Brunk        mPlaceholderManager.addTaskListener(mPlaceholderListener);
10716432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu        LayoutInflater inflater = getLayoutInflater();
10726432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu        View rootLayout = inflater.inflate(R.layout.camera, null, false);
1073653c43be6e58be54cf2ac3c8efb2d65ac20bd03bAngus Kong        mCameraModuleRootView = rootLayout.findViewById(R.id.camera_app_root);
1074fa9e2cc9ccbcd746f5765cb7a0afebcdb60e2973ztenghui        mPanoStitchingPanel = findViewById(R.id.pano_stitching_progress_panel);
107537f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling        mBottomProgress = (ProgressBar) findViewById(R.id.pano_stitching_progress_bar);
10768e5e4eedb25a4589342660b928935acca4375fc7Angus Kong        mCameraPreviewData = new CameraPreviewData(rootLayout,
10778e5e4eedb25a4589342660b928935acca4375fc7Angus Kong                FilmStripView.ImageData.SIZE_FULL,
10788e5e4eedb25a4589342660b928935acca4375fc7Angus Kong                FilmStripView.ImageData.SIZE_FULL);
107937f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling        // Put a CameraPreviewData at the first position.
10808e5e4eedb25a4589342660b928935acca4375fc7Angus Kong        mWrappedDataAdapter = new FixedFirstDataAdapter(
10818e5e4eedb25a4589342660b928935acca4375fc7Angus Kong                new CameraDataAdapter(new ColorDrawable(
10828e5e4eedb25a4589342660b928935acca4375fc7Angus Kong                        getResources().getColor(R.color.photo_placeholder))),
10838e5e4eedb25a4589342660b928935acca4375fc7Angus Kong                mCameraPreviewData);
10846432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu        mFilmStripView = (FilmStripView) findViewById(R.id.filmstrip_view);
10856432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu        mFilmStripView.setViewGap(
10866432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu                getResources().getDimensionPixelSize(R.dimen.camera_film_strip_gap));
1087f1f5186f7d3fd8bf35009d9e65a43914c664d82bSascha Haeberling        mPanoramaViewHelper = new PanoramaViewHelper(this);
1088f1f5186f7d3fd8bf35009d9e65a43914c664d82bSascha Haeberling        mPanoramaViewHelper.onCreate();
1089f1f5186f7d3fd8bf35009d9e65a43914c664d82bSascha Haeberling        mFilmStripView.setPanoramaViewHelper(mPanoramaViewHelper);
10906432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu        // Set up the camera preview first so the preview shows up ASAP.
10916432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu        mFilmStripView.setListener(mFilmStripListener);
10922654dd9bb6a7d917dab1a48e2182c4f49fe71f11Sascha Haeberling
10932654dd9bb6a7d917dab1a48e2182c4f49fe71f11Sascha Haeberling        int moduleIndex = -1;
10942a7f44cac888de5683d05bef5708f846ee950f43Doris Liu        if (MediaStore.INTENT_ACTION_VIDEO_CAMERA.equals(getIntent().getAction())
10952a7f44cac888de5683d05bef5708f846ee950f43Doris Liu                || MediaStore.ACTION_VIDEO_CAPTURE.equals(getIntent().getAction())) {
1096ed15d1a140986473bbe7fffd72ec9618c41c5979Angus Kong            moduleIndex = ModuleSwitcher.VIDEO_MODULE_INDEX;
10972654dd9bb6a7d917dab1a48e2182c4f49fe71f11Sascha Haeberling        } else if (MediaStore.INTENT_ACTION_STILL_IMAGE_CAMERA.equals(getIntent().getAction())
10982654dd9bb6a7d917dab1a48e2182c4f49fe71f11Sascha Haeberling                || MediaStore.INTENT_ACTION_STILL_IMAGE_CAMERA_SECURE.equals(getIntent()
1099baffb73ca83d9d81c379f9f3b9f46cdac7355a0dRuben Brunk                        .getAction())) {
1100baffb73ca83d9d81c379f9f3b9f46cdac7355a0dRuben Brunk            moduleIndex = ModuleSwitcher.PHOTO_MODULE_INDEX;
1101baffb73ca83d9d81c379f9f3b9f46cdac7355a0dRuben Brunk            SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
1102baffb73ca83d9d81c379f9f3b9f46cdac7355a0dRuben Brunk            if (prefs.getInt(CameraSettings.KEY_STARTUP_MODULE_INDEX, -1)
1103baffb73ca83d9d81c379f9f3b9f46cdac7355a0dRuben Brunk                        == ModuleSwitcher.GCAM_MODULE_INDEX && GcamHelper.hasGcamCapture()) {
1104baffb73ca83d9d81c379f9f3b9f46cdac7355a0dRuben Brunk                moduleIndex = ModuleSwitcher.GCAM_MODULE_INDEX;
1105baffb73ca83d9d81c379f9f3b9f46cdac7355a0dRuben Brunk            }
1106baffb73ca83d9d81c379f9f3b9f46cdac7355a0dRuben Brunk        } else if (MediaStore.ACTION_IMAGE_CAPTURE.equals(getIntent().getAction())
11072654dd9bb6a7d917dab1a48e2182c4f49fe71f11Sascha Haeberling                || MediaStore.ACTION_IMAGE_CAPTURE_SECURE.equals(getIntent().getAction())) {
1108ed15d1a140986473bbe7fffd72ec9618c41c5979Angus Kong            moduleIndex = ModuleSwitcher.PHOTO_MODULE_INDEX;
11092a7f44cac888de5683d05bef5708f846ee950f43Doris Liu        } else {
11102654dd9bb6a7d917dab1a48e2182c4f49fe71f11Sascha Haeberling            // If the activity has not been started using an explicit intent,
11112654dd9bb6a7d917dab1a48e2182c4f49fe71f11Sascha Haeberling            // read the module index from the last time the user changed modes
11122654dd9bb6a7d917dab1a48e2182c4f49fe71f11Sascha Haeberling            SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
11130fb819b4619cd4ac20f9d381739e444da011d4edAngus Kong            moduleIndex = prefs.getInt(CameraSettings.KEY_STARTUP_MODULE_INDEX, -1);
1114a9d66bdab247626b31dc182c4d62520b3abffdbdRuben Brunk            if ((moduleIndex == ModuleSwitcher.GCAM_MODULE_INDEX &&
111598f38bb04daa3db49a072718cd8b5005b8b73af1Sascha Haeberling                    !GcamHelper.hasGcamCapture()) || moduleIndex < 0) {
1116ed15d1a140986473bbe7fffd72ec9618c41c5979Angus Kong                moduleIndex = ModuleSwitcher.PHOTO_MODULE_INDEX;
11172654dd9bb6a7d917dab1a48e2182c4f49fe71f11Sascha Haeberling            }
11182a7f44cac888de5683d05bef5708f846ee950f43Doris Liu        }
11192654dd9bb6a7d917dab1a48e2182c4f49fe71f11Sascha Haeberling
11206432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu        mOrientationListener = new MyOrientationEventListener(this);
1121ed15d1a140986473bbe7fffd72ec9618c41c5979Angus Kong        setModuleFromIndex(moduleIndex);
1122ed15d1a140986473bbe7fffd72ec9618c41c5979Angus Kong        mCurrentModule.init(this, mCameraModuleRootView);
112337f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling
112437f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling        if (!mSecureCamera) {
112537f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling            mDataAdapter = mWrappedDataAdapter;
1126dcccc510652b835fdbd39310a07849af8203052aAngus Kong            mFilmStripView.setDataAdapter(mDataAdapter);
1127a71946012df0eee8fe4859a22da3c56feba0344eAngus Kong            if (!isCaptureIntent()) {
1128a71946012df0eee8fe4859a22da3c56feba0344eAngus Kong                mDataAdapter.requestLoad(getContentResolver());
1129a71946012df0eee8fe4859a22da3c56feba0344eAngus Kong            }
113037f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling        } else {
1131a5a08d7642a1fdf961b057cc90e76c4c93103c15Sascha Haeberling            // Put a lock placeholder as the last image by setting its date to
1132a5a08d7642a1fdf961b057cc90e76c4c93103c15Sascha Haeberling            // 0.
113337f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling            ImageView v = (ImageView) getLayoutInflater().inflate(
113437f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling                    R.layout.secure_album_placeholder, null);
1135690dc4722d068a1838b16dc0eabe9c7d518d524cAngus Kong            v.setOnClickListener(new View.OnClickListener() {
1136690dc4722d068a1838b16dc0eabe9c7d518d524cAngus Kong                @Override
1137690dc4722d068a1838b16dc0eabe9c7d518d524cAngus Kong                public void onClick(View view) {
1138761306fadfa94b538f43e8cf3463bf6d22814947Alan Newberger                    try {
1139cbd8267ee99e457f72822e8d8187b5e6823104f8Seth Raphael                        UsageStatistics.onEvent(UsageStatistics.COMPONENT_CAMERA,
1140cbd8267ee99e457f72822e8d8187b5e6823104f8Seth Raphael                                UsageStatistics.ACTION_GALLERY, null);
1141761306fadfa94b538f43e8cf3463bf6d22814947Alan Newberger                        startActivity(IntentHelper.getGalleryIntent(CameraActivity.this));
1142761306fadfa94b538f43e8cf3463bf6d22814947Alan Newberger                    } catch (ActivityNotFoundException e) {
1143761306fadfa94b538f43e8cf3463bf6d22814947Alan Newberger                        Log.w(TAG, "Failed to launch gallery activity, closing");
1144761306fadfa94b538f43e8cf3463bf6d22814947Alan Newberger                    }
1145690dc4722d068a1838b16dc0eabe9c7d518d524cAngus Kong                    finish();
1146690dc4722d068a1838b16dc0eabe9c7d518d524cAngus Kong                }
1147690dc4722d068a1838b16dc0eabe9c7d518d524cAngus Kong            });
114837f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling            mDataAdapter = new FixedLastDataAdapter(
114937f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling                    mWrappedDataAdapter,
1150bd26069d391830856c57c2141cd2efbc8423d871Angus Kong                    new SimpleViewData(
115137f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling                            v,
115237f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling                            v.getDrawable().getIntrinsicWidth(),
115337f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling                            v.getDrawable().getIntrinsicHeight(),
115437f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling                            0, 0));
115537f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling            // Flush out all the original data.
115637f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling            mDataAdapter.flush();
1157dcccc510652b835fdbd39310a07849af8203052aAngus Kong            mFilmStripView.setDataAdapter(mDataAdapter);
115837f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling        }
1159a5682ab08e1d42fe272ec877929478b4adb769f5Mangesh Ghiware
1160a5682ab08e1d42fe272ec877929478b4adb769f5Mangesh Ghiware        setupNfcBeamPush();
1161064d6000933354f7bf344a41e0caa7052401c903ztenghui
11622b86d873ca4fb3a921139633ed7be9959ab452dfDoris Liu        mLocalImagesObserver = new LocalMediaObserver();
11632b86d873ca4fb3a921139633ed7be9959ab452dfDoris Liu        mLocalVideosObserver = new LocalMediaObserver();
1164064d6000933354f7bf344a41e0caa7052401c903ztenghui
1165064d6000933354f7bf344a41e0caa7052401c903ztenghui        getContentResolver().registerContentObserver(
1166064d6000933354f7bf344a41e0caa7052401c903ztenghui                MediaStore.Images.Media.EXTERNAL_CONTENT_URI, true,
1167064d6000933354f7bf344a41e0caa7052401c903ztenghui                mLocalImagesObserver);
1168064d6000933354f7bf344a41e0caa7052401c903ztenghui        getContentResolver().registerContentObserver(
1169064d6000933354f7bf344a41e0caa7052401c903ztenghui                MediaStore.Video.Media.EXTERNAL_CONTENT_URI, true,
1170064d6000933354f7bf344a41e0caa7052401c903ztenghui                mLocalVideosObserver);
11718872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb    }
11728872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb
11736432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu    private void setRotationAnimation() {
11746432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu        int rotationAnimation = WindowManager.LayoutParams.ROTATION_ANIMATION_ROTATE;
11756432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu        rotationAnimation = WindowManager.LayoutParams.ROTATION_ANIMATION_CROSSFADE;
11766432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu        Window win = getWindow();
11776432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu        WindowManager.LayoutParams winParams = win.getAttributes();
11786432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu        winParams.rotationAnimation = rotationAnimation;
11796432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu        win.setAttributes(winParams);
11808872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb    }
11818872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb
11828872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb    @Override
11836432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu    public void onUserInteraction() {
11846432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu        super.onUserInteraction();
11856432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu        mCurrentModule.onUserInteraction();
118609106a41ee6acc6b20553662cb9b730702a8f08aDoris Liu    }
11878872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb
11888872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb    @Override
1189742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu    public boolean dispatchTouchEvent(MotionEvent ev) {
1190742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu        boolean result = super.dispatchTouchEvent(ev);
1191742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu        if (ev.getActionMasked() == MotionEvent.ACTION_DOWN) {
1192742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu            // Real deletion is postponed until the next user interaction after
1193742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu            // the gesture that triggers deletion. Until real deletion is performed,
1194742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu            // users can click the undo button to bring back the image that they
1195742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu            // chose to delete.
1196742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu            if (mPendingDeletion && !mIsUndoingDeletion) {
1197742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu                 performDeletion();
1198742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu            }
1199742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu        }
1200742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu        return result;
1201742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu    }
1202742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu
1203742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu    @Override
12048872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb    public void onPause() {
1205f2c14330a49abb55f75bfae6b3bae67a0dad115bDoris Liu        // Delete photos that are pending deletion
1206f2c14330a49abb55f75bfae6b3bae67a0dad115bDoris Liu        performDeletion();
12078872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb        mOrientationListener.disable();
12088872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb        mCurrentModule.onPauseBeforeSuper();
12098872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb        super.onPause();
12108872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb        mCurrentModule.onPauseAfterSuper();
12112b86d873ca4fb3a921139633ed7be9959ab452dfDoris Liu
12122b86d873ca4fb3a921139633ed7be9959ab452dfDoris Liu        mLocalImagesObserver.setActivityPaused(true);
12132b86d873ca4fb3a921139633ed7be9959ab452dfDoris Liu        mLocalVideosObserver.setActivityPaused(true);
12148872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb    }
12158872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb
12168872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb    @Override
1217b7639c641f2ed5d0c60546349c3aa9e90c026878Sascha Haeberling    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
1218064d6000933354f7bf344a41e0caa7052401c903ztenghui        if (requestCode == REQ_CODE_DONT_SWITCH_TO_PREVIEW) {
1219b7639c641f2ed5d0c60546349c3aa9e90c026878Sascha Haeberling            mResetToPreviewOnResume = false;
1220b7639c641f2ed5d0c60546349c3aa9e90c026878Sascha Haeberling        } else {
1221b7639c641f2ed5d0c60546349c3aa9e90c026878Sascha Haeberling            super.onActivityResult(requestCode, resultCode, data);
1222b7639c641f2ed5d0c60546349c3aa9e90c026878Sascha Haeberling        }
1223b7639c641f2ed5d0c60546349c3aa9e90c026878Sascha Haeberling    }
1224b7639c641f2ed5d0c60546349c3aa9e90c026878Sascha Haeberling
1225b7639c641f2ed5d0c60546349c3aa9e90c026878Sascha Haeberling    @Override
12268872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb    public void onResume() {
1227ce2b94917098f211cacaaebaa0f6b40021d3e3faAngus Kong        // TODO: Handle this in OrientationManager.
1228a5a08d7642a1fdf961b057cc90e76c4c93103c15Sascha Haeberling        // Auto-rotate off
12293cf565c4242a9deab7da5eb84fc302c79d594f11Doris Liu        if (Settings.System.getInt(getContentResolver(),
1230a5a08d7642a1fdf961b057cc90e76c4c93103c15Sascha Haeberling                Settings.System.ACCELEROMETER_ROTATION, 0) == 0) {
12313cf565c4242a9deab7da5eb84fc302c79d594f11Doris Liu            setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);
12323cf565c4242a9deab7da5eb84fc302c79d594f11Doris Liu            mAutoRotateScreen = false;
12333cf565c4242a9deab7da5eb84fc302c79d594f11Doris Liu        } else {
12343cf565c4242a9deab7da5eb84fc302c79d594f11Doris Liu            setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_FULL_SENSOR);
12353cf565c4242a9deab7da5eb84fc302c79d594f11Doris Liu            mAutoRotateScreen = true;
12363cf565c4242a9deab7da5eb84fc302c79d594f11Doris Liu        }
1237cbd8267ee99e457f72822e8d8187b5e6823104f8Seth Raphael
1238cbd8267ee99e457f72822e8d8187b5e6823104f8Seth Raphael        UsageStatistics.onEvent(UsageStatistics.COMPONENT_CAMERA,
1239cbd8267ee99e457f72822e8d8187b5e6823104f8Seth Raphael                UsageStatistics.ACTION_FOREGROUNDED, this.getClass().getSimpleName());
1240cbd8267ee99e457f72822e8d8187b5e6823104f8Seth Raphael
12418872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb        mOrientationListener.enable();
12428872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb        mCurrentModule.onResumeBeforeSuper();
12438872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb        super.onResume();
12448872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb        mCurrentModule.onResumeAfterSuper();
12458872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb
12466798c34ddb5248f038f351674c6a6c7a20992c8cAngus Kong        setSwipingEnabled(true);
1247b7639c641f2ed5d0c60546349c3aa9e90c026878Sascha Haeberling
1248b7639c641f2ed5d0c60546349c3aa9e90c026878Sascha Haeberling        if (mResetToPreviewOnResume) {
1249b7639c641f2ed5d0c60546349c3aa9e90c026878Sascha Haeberling            // Go to the preview on resume.
1250b7639c641f2ed5d0c60546349c3aa9e90c026878Sascha Haeberling            mFilmStripView.getController().goToFirstItem();
1251b7639c641f2ed5d0c60546349c3aa9e90c026878Sascha Haeberling        }
1252b7639c641f2ed5d0c60546349c3aa9e90c026878Sascha Haeberling        // Default is showing the preview, unless disabled by explicitly
1253b7639c641f2ed5d0c60546349c3aa9e90c026878Sascha Haeberling        // starting an activity we want to return from to the filmstrip rather
1254b7639c641f2ed5d0c60546349c3aa9e90c026878Sascha Haeberling        // than the preview.
1255b7639c641f2ed5d0c60546349c3aa9e90c026878Sascha Haeberling        mResetToPreviewOnResume = true;
1256064d6000933354f7bf344a41e0caa7052401c903ztenghui
12572b86d873ca4fb3a921139633ed7be9959ab452dfDoris Liu        if (mLocalVideosObserver.isMediaDataChangedDuringPause()
12582b86d873ca4fb3a921139633ed7be9959ab452dfDoris Liu                || mLocalImagesObserver.isMediaDataChangedDuringPause()) {
12592d5c74785d19f1944cab92948a6fa8233086ebc1Angus Kong            if (!mSecureCamera) {
12602d5c74785d19f1944cab92948a6fa8233086ebc1Angus Kong                // If it's secure camera, requestLoad() should not be called
12612d5c74785d19f1944cab92948a6fa8233086ebc1Angus Kong                // as it will load all the data.
12622d5c74785d19f1944cab92948a6fa8233086ebc1Angus Kong                mDataAdapter.requestLoad(getContentResolver());
12632d5c74785d19f1944cab92948a6fa8233086ebc1Angus Kong            }
1264064d6000933354f7bf344a41e0caa7052401c903ztenghui        }
12652b86d873ca4fb3a921139633ed7be9959ab452dfDoris Liu        mLocalImagesObserver.setActivityPaused(false);
12662b86d873ca4fb3a921139633ed7be9959ab452dfDoris Liu        mLocalVideosObserver.setActivityPaused(false);
12676798c34ddb5248f038f351674c6a6c7a20992c8cAngus Kong    }
12686798c34ddb5248f038f351674c6a6c7a20992c8cAngus Kong
12696798c34ddb5248f038f351674c6a6c7a20992c8cAngus Kong    @Override
12706798c34ddb5248f038f351674c6a6c7a20992c8cAngus Kong    public void onStart() {
12716798c34ddb5248f038f351674c6a6c7a20992c8cAngus Kong        super.onStart();
12727e374eb0a450ed2689b556ab42a0a88c8f74df2eAngus Kong        bindMediaSaveService();
1273f1f5186f7d3fd8bf35009d9e65a43914c664d82bSascha Haeberling        mPanoramaViewHelper.onStart();
1274f1f5186f7d3fd8bf35009d9e65a43914c664d82bSascha Haeberling    }
1275f1f5186f7d3fd8bf35009d9e65a43914c664d82bSascha Haeberling
1276f1f5186f7d3fd8bf35009d9e65a43914c664d82bSascha Haeberling    @Override
1277f1f5186f7d3fd8bf35009d9e65a43914c664d82bSascha Haeberling    protected void onStop() {
1278f1f5186f7d3fd8bf35009d9e65a43914c664d82bSascha Haeberling        super.onStop();
1279f1f5186f7d3fd8bf35009d9e65a43914c664d82bSascha Haeberling        mPanoramaViewHelper.onStop();
12807e374eb0a450ed2689b556ab42a0a88c8f74df2eAngus Kong        unbindMediaSaveService();
128108650187c1f1a2d1ef7f754be0f479a29958daaaMichael Kolb    }
128208650187c1f1a2d1ef7f754be0f479a29958daaaMichael Kolb
12838872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb    @Override
12846432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu    public void onDestroy() {
1285a5a08d7642a1fdf961b057cc90e76c4c93103c15Sascha Haeberling        if (mSecureCamera) {
1286a5a08d7642a1fdf961b057cc90e76c4c93103c15Sascha Haeberling            unregisterReceiver(mScreenOffReceiver);
1287a5a08d7642a1fdf961b057cc90e76c4c93103c15Sascha Haeberling        }
1288064d6000933354f7bf344a41e0caa7052401c903ztenghui        getContentResolver().unregisterContentObserver(mLocalImagesObserver);
1289064d6000933354f7bf344a41e0caa7052401c903ztenghui        getContentResolver().unregisterContentObserver(mLocalVideosObserver);
1290064d6000933354f7bf344a41e0caa7052401c903ztenghui
12916432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu        super.onDestroy();
12928872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb    }
12938872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb
12948872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb    @Override
12956432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu    public void onConfigurationChanged(Configuration config) {
12966432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu        super.onConfigurationChanged(config);
12976432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu        mCurrentModule.onConfigurationChanged(config);
12988872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb    }
12998872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb
13008872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb    @Override
13016432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu    public boolean onKeyDown(int keyCode, KeyEvent event) {
1302dba16ae7d0aee0c3984df68b5787a0d0a7cd6f50Doris Liu        if (mFilmStripView.inCameraFullscreen()) {
1303dba16ae7d0aee0c3984df68b5787a0d0a7cd6f50Doris Liu            if (mCurrentModule.onKeyDown(keyCode, event)) {
1304a5a08d7642a1fdf961b057cc90e76c4c93103c15Sascha Haeberling                return true;
1305a5a08d7642a1fdf961b057cc90e76c4c93103c15Sascha Haeberling            }
1306dba16ae7d0aee0c3984df68b5787a0d0a7cd6f50Doris Liu            // Prevent software keyboard or voice search from showing up.
1307dba16ae7d0aee0c3984df68b5787a0d0a7cd6f50Doris Liu            if (keyCode == KeyEvent.KEYCODE_SEARCH
1308dba16ae7d0aee0c3984df68b5787a0d0a7cd6f50Doris Liu                    || keyCode == KeyEvent.KEYCODE_MENU) {
1309dba16ae7d0aee0c3984df68b5787a0d0a7cd6f50Doris Liu                if (event.isLongPress()) {
1310dba16ae7d0aee0c3984df68b5787a0d0a7cd6f50Doris Liu                    return true;
1311dba16ae7d0aee0c3984df68b5787a0d0a7cd6f50Doris Liu                }
1312dba16ae7d0aee0c3984df68b5787a0d0a7cd6f50Doris Liu            }
13136432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu        }
13146432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu
13156432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu        return super.onKeyDown(keyCode, event);
13168872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb    }
13178872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb
13188872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb    @Override
13196432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu    public boolean onKeyUp(int keyCode, KeyEvent event) {
1320dba16ae7d0aee0c3984df68b5787a0d0a7cd6f50Doris Liu        if (mFilmStripView.inCameraFullscreen() && mCurrentModule.onKeyUp(keyCode, event)) {
1321a5a08d7642a1fdf961b057cc90e76c4c93103c15Sascha Haeberling            return true;
1322a5a08d7642a1fdf961b057cc90e76c4c93103c15Sascha Haeberling        }
13236432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu        return super.onKeyUp(keyCode, event);
13248872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb    }
13258872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb
13265f6b50deaf46fb546ebf6d0d6244ebf7fb79c7caAlan Newberger    @Override
13275f6b50deaf46fb546ebf6d0d6244ebf7fb79c7caAlan Newberger    public void onBackPressed() {
13285f6b50deaf46fb546ebf6d0d6244ebf7fb79c7caAlan Newberger        if (!mFilmStripView.inCameraFullscreen()) {
13295f6b50deaf46fb546ebf6d0d6244ebf7fb79c7caAlan Newberger            mFilmStripView.getController().goToFirstItem();
13305f6b50deaf46fb546ebf6d0d6244ebf7fb79c7caAlan Newberger        } else if (!mCurrentModule.onBackPressed()) {
13315f6b50deaf46fb546ebf6d0d6244ebf7fb79c7caAlan Newberger            super.onBackPressed();
13325f6b50deaf46fb546ebf6d0d6244ebf7fb79c7caAlan Newberger        }
13335f6b50deaf46fb546ebf6d0d6244ebf7fb79c7caAlan Newberger    }
13345f6b50deaf46fb546ebf6d0d6244ebf7fb79c7caAlan Newberger
13356432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu    public boolean isAutoRotateScreen() {
13366432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu        return mAutoRotateScreen;
13378872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb    }
13388872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb
13396432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu    protected void updateStorageSpace() {
13402dcc0a9dfcc23f090bbe36308f92d72f68c4f0a2Angus Kong        mStorageSpaceBytes = Storage.getAvailableSpace();
13418872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb    }
13428872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb
13432dcc0a9dfcc23f090bbe36308f92d72f68c4f0a2Angus Kong    protected long getStorageSpaceBytes() {
13442dcc0a9dfcc23f090bbe36308f92d72f68c4f0a2Angus Kong        return mStorageSpaceBytes;
13458872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb    }
13468872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb
13476432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu    protected void updateStorageSpaceAndHint() {
13486432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu        updateStorageSpace();
13492dcc0a9dfcc23f090bbe36308f92d72f68c4f0a2Angus Kong        updateStorageHint(mStorageSpaceBytes);
13506432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu    }
13516432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu
13526432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu    protected void updateStorageHint(long storageSpace) {
13536432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu        String message = null;
13546432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu        if (storageSpace == Storage.UNAVAILABLE) {
13556432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu            message = getString(R.string.no_storage);
13566432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu        } else if (storageSpace == Storage.PREPARING) {
13576432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu            message = getString(R.string.preparing_sd);
13586432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu        } else if (storageSpace == Storage.UNKNOWN_SIZE) {
13596432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu            message = getString(R.string.access_sd_fail);
13602dcc0a9dfcc23f090bbe36308f92d72f68c4f0a2Angus Kong        } else if (storageSpace <= Storage.LOW_STORAGE_THRESHOLD_BYTES) {
13616432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu            message = getString(R.string.spaceIsLow_content);
13628872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb        }
13636432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu
13646432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu        if (message != null) {
13656432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu            if (mStorageHint == null) {
13666432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu                mStorageHint = OnScreenHint.makeText(this, message);
13676432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu            } else {
13686432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu                mStorageHint.setText(message);
13696432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu            }
13706432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu            mStorageHint.show();
13716432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu        } else if (mStorageHint != null) {
13726432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu            mStorageHint.cancel();
13736432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu            mStorageHint = null;
13748872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb        }
13758872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb    }
13768872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb
13776432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu    protected void setResultEx(int resultCode) {
13786432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu        mResultCodeForTesting = resultCode;
13796432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu        setResult(resultCode);
13808872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb    }
13818872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb
13826432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu    protected void setResultEx(int resultCode, Intent data) {
13836432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu        mResultCodeForTesting = resultCode;
13846432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu        mResultDataForTesting = data;
13856432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu        setResult(resultCode, data);
13868872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb    }
13878872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb
13886432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu    public int getResultCode() {
13896432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu        return mResultCodeForTesting;
13908872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb    }
13918872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb
13926432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu    public Intent getResultData() {
13936432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu        return mResultDataForTesting;
13948872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb    }
13958872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb
13966432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu    public boolean isSecureCamera() {
13976432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu        return mSecureCamera;
13988872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb    }
13998872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb
14008872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb    @Override
1401ed15d1a140986473bbe7fffd72ec9618c41c5979Angus Kong    public void onModuleSelected(int moduleIndex) {
1402a5a08d7642a1fdf961b057cc90e76c4c93103c15Sascha Haeberling        if (mCurrentModuleIndex == moduleIndex) {
1403a5a08d7642a1fdf961b057cc90e76c4c93103c15Sascha Haeberling            return;
1404a5a08d7642a1fdf961b057cc90e76c4c93103c15Sascha Haeberling        }
14056432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu
14066432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu        CameraHolder.instance().keep();
14076432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu        closeModule(mCurrentModule);
14082654dd9bb6a7d917dab1a48e2182c4f49fe71f11Sascha Haeberling        setModuleFromIndex(moduleIndex);
14092654dd9bb6a7d917dab1a48e2182c4f49fe71f11Sascha Haeberling
14102654dd9bb6a7d917dab1a48e2182c4f49fe71f11Sascha Haeberling        openModule(mCurrentModule);
14112654dd9bb6a7d917dab1a48e2182c4f49fe71f11Sascha Haeberling        mCurrentModule.onOrientationChanged(mLastRawOrientation);
14122654dd9bb6a7d917dab1a48e2182c4f49fe71f11Sascha Haeberling        if (mMediaSaveService != null) {
14132654dd9bb6a7d917dab1a48e2182c4f49fe71f11Sascha Haeberling            mCurrentModule.onMediaSaveServiceConnected(mMediaSaveService);
14142654dd9bb6a7d917dab1a48e2182c4f49fe71f11Sascha Haeberling        }
14152654dd9bb6a7d917dab1a48e2182c4f49fe71f11Sascha Haeberling
14162654dd9bb6a7d917dab1a48e2182c4f49fe71f11Sascha Haeberling        // Store the module index so we can use it the next time the Camera
14172654dd9bb6a7d917dab1a48e2182c4f49fe71f11Sascha Haeberling        // starts up.
14182654dd9bb6a7d917dab1a48e2182c4f49fe71f11Sascha Haeberling        SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
14190fb819b4619cd4ac20f9d381739e444da011d4edAngus Kong        prefs.edit().putInt(CameraSettings.KEY_STARTUP_MODULE_INDEX, moduleIndex).apply();
14202654dd9bb6a7d917dab1a48e2182c4f49fe71f11Sascha Haeberling    }
14212654dd9bb6a7d917dab1a48e2182c4f49fe71f11Sascha Haeberling
14222654dd9bb6a7d917dab1a48e2182c4f49fe71f11Sascha Haeberling    /**
1423a5a08d7642a1fdf961b057cc90e76c4c93103c15Sascha Haeberling     * Sets the mCurrentModuleIndex, creates a new module instance for the given
1424a5a08d7642a1fdf961b057cc90e76c4c93103c15Sascha Haeberling     * index an sets it as mCurrentModule.
14252654dd9bb6a7d917dab1a48e2182c4f49fe71f11Sascha Haeberling     */
14262654dd9bb6a7d917dab1a48e2182c4f49fe71f11Sascha Haeberling    private void setModuleFromIndex(int moduleIndex) {
14272654dd9bb6a7d917dab1a48e2182c4f49fe71f11Sascha Haeberling        mCurrentModuleIndex = moduleIndex;
14282654dd9bb6a7d917dab1a48e2182c4f49fe71f11Sascha Haeberling        switch (moduleIndex) {
142915125661ad968cf4d40989a9bc88d11189beb0b3Sascha Haeberling            case ModuleSwitcher.VIDEO_MODULE_INDEX:
14306432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu                mCurrentModule = new VideoModule();
14316432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu                break;
1432ed15d1a140986473bbe7fffd72ec9618c41c5979Angus Kong
143315125661ad968cf4d40989a9bc88d11189beb0b3Sascha Haeberling            case ModuleSwitcher.PHOTO_MODULE_INDEX:
14346432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu                mCurrentModule = new PhotoModule();
14356432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu                break;
1436ed15d1a140986473bbe7fffd72ec9618c41c5979Angus Kong
143715125661ad968cf4d40989a9bc88d11189beb0b3Sascha Haeberling            case ModuleSwitcher.WIDE_ANGLE_PANO_MODULE_INDEX:
1438ed15d1a140986473bbe7fffd72ec9618c41c5979Angus Kong                mCurrentModule = new WideAnglePanoramaModule();
1439ed15d1a140986473bbe7fffd72ec9618c41c5979Angus Kong                break;
1440ed15d1a140986473bbe7fffd72ec9618c41c5979Angus Kong
144115125661ad968cf4d40989a9bc88d11189beb0b3Sascha Haeberling            case ModuleSwitcher.LIGHTCYCLE_MODULE_INDEX:
14428e963a5a6016d246184ed65906f9d103e92b17e2Sascha Haeberling                mCurrentModule = PhotoSphereHelper.createPanoramaModule();
14436432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu                break;
1444a9d66bdab247626b31dc182c4d62520b3abffdbdRuben Brunk            case ModuleSwitcher.GCAM_MODULE_INDEX:
1445a9d66bdab247626b31dc182c4d62520b3abffdbdRuben Brunk                // Force immediate release of Camera instance
1446a9d66bdab247626b31dc182c4d62520b3abffdbdRuben Brunk                CameraHolder.instance().strongRelease();
1447a9d66bdab247626b31dc182c4d62520b3abffdbdRuben Brunk                mCurrentModule = GcamHelper.createGcamModule();
1448a9d66bdab247626b31dc182c4d62520b3abffdbdRuben Brunk                break;
14492654dd9bb6a7d917dab1a48e2182c4f49fe71f11Sascha Haeberling            default:
145015125661ad968cf4d40989a9bc88d11189beb0b3Sascha Haeberling                // Fall back to photo mode.
145115125661ad968cf4d40989a9bc88d11189beb0b3Sascha Haeberling                mCurrentModule = new PhotoModule();
145215125661ad968cf4d40989a9bc88d11189beb0b3Sascha Haeberling                mCurrentModuleIndex = ModuleSwitcher.PHOTO_MODULE_INDEX;
14532654dd9bb6a7d917dab1a48e2182c4f49fe71f11Sascha Haeberling                break;
14546432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu        }
14558872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb    }
14568872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb
145788ef7664ba6a888fa5da8693091674e152b56192Sascha Haeberling    /**
145888ef7664ba6a888fa5da8693091674e152b56192Sascha Haeberling     * Launches an ACTION_EDIT intent for the given local data item.
145988ef7664ba6a888fa5da8693091674e152b56192Sascha Haeberling     */
146088ef7664ba6a888fa5da8693091674e152b56192Sascha Haeberling    public void launchEditor(LocalData data) {
146188ef7664ba6a888fa5da8693091674e152b56192Sascha Haeberling        Intent intent = new Intent(Intent.ACTION_EDIT)
146288ef7664ba6a888fa5da8693091674e152b56192Sascha Haeberling                .setDataAndType(data.getContentUri(), data.getMimeType())
146388ef7664ba6a888fa5da8693091674e152b56192Sascha Haeberling                .setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
146405a04924312fbcda2161da01e0749eb80c2663d1Erin Dahlgren        try {
146505a04924312fbcda2161da01e0749eb80c2663d1Erin Dahlgren            startActivityForResult(intent, REQ_CODE_DONT_SWITCH_TO_PREVIEW);
146605a04924312fbcda2161da01e0749eb80c2663d1Erin Dahlgren        } catch (ActivityNotFoundException e) {
146705a04924312fbcda2161da01e0749eb80c2663d1Erin Dahlgren            startActivityForResult(Intent.createChooser(intent, null),
146805a04924312fbcda2161da01e0749eb80c2663d1Erin Dahlgren                    REQ_CODE_DONT_SWITCH_TO_PREVIEW);
146905a04924312fbcda2161da01e0749eb80c2663d1Erin Dahlgren        }
147088ef7664ba6a888fa5da8693091674e152b56192Sascha Haeberling    }
147188ef7664ba6a888fa5da8693091674e152b56192Sascha Haeberling
1472a5a08d7642a1fdf961b057cc90e76c4c93103c15Sascha Haeberling    /**
1473a5a08d7642a1fdf961b057cc90e76c4c93103c15Sascha Haeberling     * Launch the tiny planet editor.
1474a5a08d7642a1fdf961b057cc90e76c4c93103c15Sascha Haeberling     *
1475a5a08d7642a1fdf961b057cc90e76c4c93103c15Sascha Haeberling     * @param data the data must be a 360 degree stereographically mapped
1476a5a08d7642a1fdf961b057cc90e76c4c93103c15Sascha Haeberling     *            panoramic image. It will not be modified, instead a new item
1477a5a08d7642a1fdf961b057cc90e76c4c93103c15Sascha Haeberling     *            with the result will be added to the filmstrip.
1478a5a08d7642a1fdf961b057cc90e76c4c93103c15Sascha Haeberling     */
1479a5a08d7642a1fdf961b057cc90e76c4c93103c15Sascha Haeberling    public void launchTinyPlanetEditor(LocalData data) {
1480a5a08d7642a1fdf961b057cc90e76c4c93103c15Sascha Haeberling        TinyPlanetFragment fragment = new TinyPlanetFragment();
1481a5a08d7642a1fdf961b057cc90e76c4c93103c15Sascha Haeberling        Bundle bundle = new Bundle();
1482a5a08d7642a1fdf961b057cc90e76c4c93103c15Sascha Haeberling        bundle.putString(TinyPlanetFragment.ARGUMENT_URI, data.getContentUri().toString());
1483a5a08d7642a1fdf961b057cc90e76c4c93103c15Sascha Haeberling        bundle.putString(TinyPlanetFragment.ARGUMENT_TITLE, data.getTitle());
1484a5a08d7642a1fdf961b057cc90e76c4c93103c15Sascha Haeberling        fragment.setArguments(bundle);
1485a5a08d7642a1fdf961b057cc90e76c4c93103c15Sascha Haeberling        fragment.show(getFragmentManager(), "tiny_planet");
1486a5a08d7642a1fdf961b057cc90e76c4c93103c15Sascha Haeberling    }
1487a5a08d7642a1fdf961b057cc90e76c4c93103c15Sascha Haeberling
14886432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu    private void openModule(CameraModule module) {
1489653c43be6e58be54cf2ac3c8efb2d65ac20bd03bAngus Kong        module.init(this, mCameraModuleRootView);
14906432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu        module.onResumeBeforeSuper();
14916432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu        module.onResumeAfterSuper();
14928872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb    }
14938872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb
14946432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu    private void closeModule(CameraModule module) {
14956432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu        module.onPauseBeforeSuper();
14966432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu        module.onPauseAfterSuper();
1497653c43be6e58be54cf2ac3c8efb2d65ac20bd03bAngus Kong        ((ViewGroup) mCameraModuleRootView).removeAllViews();
1498653c43be6e58be54cf2ac3c8efb2d65ac20bd03bAngus Kong    }
1499653c43be6e58be54cf2ac3c8efb2d65ac20bd03bAngus Kong
1500742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu    private void performDeletion() {
1501742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu        if (!mPendingDeletion) {
1502742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu            return;
1503742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu        }
1504742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu        hideUndoDeletionBar(false);
1505742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu        mDataAdapter.executeDeletion(CameraActivity.this);
1506fd7f0a9ffd8e7db21e556b1a60a7602ef5d0fe29Erin Dahlgren
1507fd7f0a9ffd8e7db21e556b1a60a7602ef5d0fe29Erin Dahlgren        int currentId = mFilmStripView.getCurrentId();
1508fd7f0a9ffd8e7db21e556b1a60a7602ef5d0fe29Erin Dahlgren        updateActionBarMenu(currentId);
1509fd7f0a9ffd8e7db21e556b1a60a7602ef5d0fe29Erin Dahlgren        mFilmStripListener.onCurrentDataCentered(currentId);
1510742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu    }
1511742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu
1512742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu    public void showUndoDeletionBar() {
1513742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu        if (mPendingDeletion) {
1514742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu            performDeletion();
1515742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu        }
1516742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu        Log.v(TAG, "showing undo bar");
1517742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu        mPendingDeletion = true;
1518653c43be6e58be54cf2ac3c8efb2d65ac20bd03bAngus Kong        if (mUndoDeletionBar == null) {
1519653c43be6e58be54cf2ac3c8efb2d65ac20bd03bAngus Kong            ViewGroup v = (ViewGroup) getLayoutInflater().inflate(
1520653c43be6e58be54cf2ac3c8efb2d65ac20bd03bAngus Kong                    R.layout.undo_bar, mAboveFilmstripControlLayout, true);
1521653c43be6e58be54cf2ac3c8efb2d65ac20bd03bAngus Kong            mUndoDeletionBar = (ViewGroup) v.findViewById(R.id.camera_undo_deletion_bar);
1522653c43be6e58be54cf2ac3c8efb2d65ac20bd03bAngus Kong            View button = mUndoDeletionBar.findViewById(R.id.camera_undo_deletion_button);
1523653c43be6e58be54cf2ac3c8efb2d65ac20bd03bAngus Kong            button.setOnClickListener(new View.OnClickListener() {
1524653c43be6e58be54cf2ac3c8efb2d65ac20bd03bAngus Kong                @Override
1525653c43be6e58be54cf2ac3c8efb2d65ac20bd03bAngus Kong                public void onClick(View view) {
1526653c43be6e58be54cf2ac3c8efb2d65ac20bd03bAngus Kong                    mDataAdapter.undoDataRemoval();
1527742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu                    hideUndoDeletionBar(true);
1528742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu                }
1529742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu            });
1530742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu            // Setting undo bar clickable to avoid touch events going through
1531742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu            // the bar to the buttons (eg. edit button, etc) underneath the bar.
1532742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu            mUndoDeletionBar.setClickable(true);
1533742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu            // When there is user interaction going on with the undo button, we
1534742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu            // do not want to hide the undo bar.
1535742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu            button.setOnTouchListener(new View.OnTouchListener() {
1536742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu                @Override
1537742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu                public boolean onTouch(View v, MotionEvent event) {
1538742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu                    if (event.getActionMasked() == MotionEvent.ACTION_DOWN) {
1539742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu                        mIsUndoingDeletion = true;
1540742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu                    } else if (event.getActionMasked() == MotionEvent.ACTION_UP) {
1541742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu                        mIsUndoingDeletion =false;
1542742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu                    }
1543742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu                    return false;
1544653c43be6e58be54cf2ac3c8efb2d65ac20bd03bAngus Kong                }
1545653c43be6e58be54cf2ac3c8efb2d65ac20bd03bAngus Kong            });
1546653c43be6e58be54cf2ac3c8efb2d65ac20bd03bAngus Kong        }
1547653c43be6e58be54cf2ac3c8efb2d65ac20bd03bAngus Kong        mUndoDeletionBar.setAlpha(0f);
1548653c43be6e58be54cf2ac3c8efb2d65ac20bd03bAngus Kong        mUndoDeletionBar.setVisibility(View.VISIBLE);
1549742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu        mUndoDeletionBar.animate().setDuration(200).alpha(1f).setListener(null).start();
1550653c43be6e58be54cf2ac3c8efb2d65ac20bd03bAngus Kong    }
1551653c43be6e58be54cf2ac3c8efb2d65ac20bd03bAngus Kong
1552742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu    private void hideUndoDeletionBar(boolean withAnimation) {
1553653c43be6e58be54cf2ac3c8efb2d65ac20bd03bAngus Kong        Log.v(TAG, "Hiding undo deletion bar");
1554742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu        mPendingDeletion = false;
1555653c43be6e58be54cf2ac3c8efb2d65ac20bd03bAngus Kong        if (mUndoDeletionBar != null) {
1556742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu            if (withAnimation) {
1557742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu                mUndoDeletionBar.animate()
1558742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu                        .setDuration(200)
1559742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu                        .alpha(0f)
1560742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu                        .setListener(new Animator.AnimatorListener() {
1561742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu                            @Override
1562742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu                            public void onAnimationStart(Animator animation) {
1563742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu                                // Do nothing.
1564742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu                            }
1565742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu
1566742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu                            @Override
1567742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu                            public void onAnimationEnd(Animator animation) {
1568742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu                                mUndoDeletionBar.setVisibility(View.GONE);
1569742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu                            }
1570742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu
1571742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu                            @Override
1572742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu                            public void onAnimationCancel(Animator animation) {
1573742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu                                // Do nothing.
1574742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu                            }
1575742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu
1576742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu                            @Override
1577742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu                            public void onAnimationRepeat(Animator animation) {
1578742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu                                // Do nothing.
1579742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu                            }
1580742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu                        })
1581742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu                        .start();
1582742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu            } else {
1583742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu                mUndoDeletionBar.setVisibility(View.GONE);
1584742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu            }
1585653c43be6e58be54cf2ac3c8efb2d65ac20bd03bAngus Kong        }
15868872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb    }
15878872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb
15888872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb    @Override
15896432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu    public void onShowSwitcherPopup() {
1590249653e41763cffbd9bd5ef2298c5120488897fbAndy Huibers        mCurrentModule.onShowSwitcherPopup();
15916432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu    }
15926432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu
1593a71946012df0eee8fe4859a22da3c56feba0344eAngus Kong    /**
1594a5a08d7642a1fdf961b057cc90e76c4c93103c15Sascha Haeberling     * Enable/disable swipe-to-filmstrip. Will always disable swipe if in
1595a5a08d7642a1fdf961b057cc90e76c4c93103c15Sascha Haeberling     * capture intent.
1596a71946012df0eee8fe4859a22da3c56feba0344eAngus Kong     *
1597a71946012df0eee8fe4859a22da3c56feba0344eAngus Kong     * @param enable {@code true} to enable swipe.
1598a71946012df0eee8fe4859a22da3c56feba0344eAngus Kong     */
15996432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu    public void setSwipingEnabled(boolean enable) {
1600a71946012df0eee8fe4859a22da3c56feba0344eAngus Kong        if (isCaptureIntent()) {
1601a71946012df0eee8fe4859a22da3c56feba0344eAngus Kong            mCameraPreviewData.lockPreview(true);
1602a71946012df0eee8fe4859a22da3c56feba0344eAngus Kong        } else {
1603a71946012df0eee8fe4859a22da3c56feba0344eAngus Kong            mCameraPreviewData.lockPreview(!enable);
1604a71946012df0eee8fe4859a22da3c56feba0344eAngus Kong        }
16058872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb    }
16068872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb
16073044d8c577432d6e9721fc8b26ac2afbbaf21266Erin Dahlgren
16083044d8c577432d6e9721fc8b26ac2afbbaf21266Erin Dahlgren    /**
16093044d8c577432d6e9721fc8b26ac2afbbaf21266Erin Dahlgren     * Check whether camera controls are visible.
16103044d8c577432d6e9721fc8b26ac2afbbaf21266Erin Dahlgren     *
16113044d8c577432d6e9721fc8b26ac2afbbaf21266Erin Dahlgren     * @return whether controls are visible.
16123044d8c577432d6e9721fc8b26ac2afbbaf21266Erin Dahlgren     */
16133044d8c577432d6e9721fc8b26ac2afbbaf21266Erin Dahlgren    private boolean arePreviewControlsVisible() {
16143044d8c577432d6e9721fc8b26ac2afbbaf21266Erin Dahlgren        return mCurrentModule.arePreviewControlsVisible();
16153044d8c577432d6e9721fc8b26ac2afbbaf21266Erin Dahlgren    }
16163044d8c577432d6e9721fc8b26ac2afbbaf21266Erin Dahlgren
16173044d8c577432d6e9721fc8b26ac2afbbaf21266Erin Dahlgren    /**
16183044d8c577432d6e9721fc8b26ac2afbbaf21266Erin Dahlgren     * Show or hide the {@link CameraControls} using the current module's
16193044d8c577432d6e9721fc8b26ac2afbbaf21266Erin Dahlgren     * implementation of {@link #onPreviewFocusChanged}.
16203044d8c577432d6e9721fc8b26ac2afbbaf21266Erin Dahlgren     *
16213044d8c577432d6e9721fc8b26ac2afbbaf21266Erin Dahlgren     * @param showControls whether to show camera controls.
16223044d8c577432d6e9721fc8b26ac2afbbaf21266Erin Dahlgren     */
16233044d8c577432d6e9721fc8b26ac2afbbaf21266Erin Dahlgren    private void setPreviewControlsVisibility(boolean showControls) {
16243044d8c577432d6e9721fc8b26ac2afbbaf21266Erin Dahlgren        mCurrentModule.onPreviewFocusChanged(showControls);
16253044d8c577432d6e9721fc8b26ac2afbbaf21266Erin Dahlgren    }
16263044d8c577432d6e9721fc8b26ac2afbbaf21266Erin Dahlgren
16278872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb    // Accessor methods for getting latency times used in performance testing
16288872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb    public long getAutoFocusTime() {
16298872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb        return (mCurrentModule instanceof PhotoModule) ?
16308872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb                ((PhotoModule) mCurrentModule).mAutoFocusTime : -1;
16318872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb    }
16328872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb
16338872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb    public long getShutterLag() {
16348872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb        return (mCurrentModule instanceof PhotoModule) ?
16358872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb                ((PhotoModule) mCurrentModule).mShutterLag : -1;
16368872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb    }
16378872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb
16388872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb    public long getShutterToPictureDisplayedTime() {
16398872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb        return (mCurrentModule instanceof PhotoModule) ?
16408872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb                ((PhotoModule) mCurrentModule).mShutterToPictureDisplayedTime : -1;
16418872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb    }
16428872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb
16438872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb    public long getPictureDisplayedToJpegCallbackTime() {
16448872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb        return (mCurrentModule instanceof PhotoModule) ?
16458872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb                ((PhotoModule) mCurrentModule).mPictureDisplayedToJpegCallbackTime : -1;
16468872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb    }
16478872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb
16488872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb    public long getJpegCallbackFinishTime() {
16498872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb        return (mCurrentModule instanceof PhotoModule) ?
16508872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb                ((PhotoModule) mCurrentModule).mJpegCallbackFinishTime : -1;
16518872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb    }
16528872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb
16538872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb    public long getCaptureStartTime() {
16548872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb        return (mCurrentModule instanceof PhotoModule) ?
16558872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb                ((PhotoModule) mCurrentModule).mCaptureStartTime : -1;
16568872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb    }
16578872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb
16588872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb    public boolean isRecording() {
16598872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb        return (mCurrentModule instanceof VideoModule) ?
16608872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb                ((VideoModule) mCurrentModule).isRecording() : false;
16618872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb    }
16624f795b878843e59810ec1dca05b7cdb37b5614c5Angus Kong
16634f795b878843e59810ec1dca05b7cdb37b5614c5Angus Kong    public CameraOpenErrorCallback getCameraOpenErrorCallback() {
16644f795b878843e59810ec1dca05b7cdb37b5614c5Angus Kong        return mCameraOpenErrorCallback;
16654f795b878843e59810ec1dca05b7cdb37b5614c5Angus Kong    }
1666d217ed0fa931d2a080a159c24e4012697baf5ae3Ruben Brunk
1667d217ed0fa931d2a080a159c24e4012697baf5ae3Ruben Brunk    // For debugging purposes only.
1668d217ed0fa931d2a080a159c24e4012697baf5ae3Ruben Brunk    public CameraModule getCurrentModule() {
1669d217ed0fa931d2a080a159c24e4012697baf5ae3Ruben Brunk        return mCurrentModule;
1670d217ed0fa931d2a080a159c24e4012697baf5ae3Ruben Brunk    }
16718872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb}
1672