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