CameraActivity.java revision 249653e41763cffbd9bd5ef2298c5120488897fb
18872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb/* 28872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb * Copyright (C) 2012 The Android Open Source Project 38872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb * 48872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb * Licensed under the Apache License, Version 2.0 (the "License"); 58872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb * you may not use this file except in compliance with the License. 68872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb * You may obtain a copy of the License at 78872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb * 88872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb * http://www.apache.org/licenses/LICENSE-2.0 98872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb * 108872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb * Unless required by applicable law or agreed to in writing, software 118872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb * distributed under the License is distributed on an "AS IS" BASIS, 128872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 138872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb * See the License for the specific language governing permissions and 148872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb * limitations under the License. 158872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb */ 168872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 178872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolbpackage com.android.camera; 188872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 19742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liuimport android.animation.Animator; 20a5682ab08e1d42fe272ec877929478b4adb769f5Mangesh Ghiwareimport android.annotation.TargetApi; 21fa9e2cc9ccbcd746f5765cb7a0afebcdb60e2973ztenghuiimport android.app.ActionBar; 226432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liuimport android.app.Activity; 2330968d0f9a5094d62de1fb023b8bf7dc3202ebafMangesh Ghiwareimport android.content.ActivityNotFoundException; 24b84b9738c855a525dc1944165983cc3c342ce446Doris Liuimport android.content.BroadcastReceiver; 2586d36313d88fe96354f2cdd4f378e5ff8397c458Angus Kongimport android.content.ComponentName; 266432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liuimport android.content.ContentResolver; 2708650187c1f1a2d1ef7f754be0f479a29958daaaMichael Kolbimport android.content.Context; 288872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolbimport android.content.Intent; 29b84b9738c855a525dc1944165983cc3c342ce446Doris Liuimport android.content.IntentFilter; 3086d36313d88fe96354f2cdd4f378e5ff8397c458Angus Kongimport android.content.ServiceConnection; 312654dd9bb6a7d917dab1a48e2182c4f49fe71f11Sascha Haeberlingimport android.content.SharedPreferences; 323cf565c4242a9deab7da5eb84fc302c79d594f11Doris Liuimport android.content.pm.ActivityInfo; 338872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolbimport android.content.res.Configuration; 346432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liuimport android.graphics.drawable.ColorDrawable; 356432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liuimport android.net.Uri; 36a5682ab08e1d42fe272ec877929478b4adb769f5Mangesh Ghiwareimport android.nfc.NfcAdapter; 37a5682ab08e1d42fe272ec877929478b4adb769f5Mangesh Ghiwareimport android.nfc.NfcAdapter.CreateBeamUrisCallback; 38a5682ab08e1d42fe272ec877929478b4adb769f5Mangesh Ghiwareimport android.nfc.NfcEvent; 396f64b50db6565bc6454304fd20c0c4020b297bb7Sascha Haeberlingimport android.os.AsyncTask; 40a5682ab08e1d42fe272ec877929478b4adb769f5Mangesh Ghiwareimport android.os.Build; 418872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolbimport android.os.Bundle; 426432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liuimport android.os.Handler; 4386d36313d88fe96354f2cdd4f378e5ff8397c458Angus Kongimport android.os.IBinder; 44aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liuimport android.os.Looper; 45aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liuimport android.os.Message; 462654dd9bb6a7d917dab1a48e2182c4f49fe71f11Sascha Haeberlingimport android.preference.PreferenceManager; 472a7f44cac888de5683d05bef5708f846ee950f43Doris Liuimport android.provider.MediaStore; 483cf565c4242a9deab7da5eb84fc302c79d594f11Doris Liuimport android.provider.Settings; 4937f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberlingimport android.util.Log; 508872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolbimport android.view.KeyEvent; 516432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liuimport android.view.LayoutInflater; 520353ca2e048543bd6e233b4c2110a1df1070cd3fztenghuiimport android.view.Menu; 530353ca2e048543bd6e233b4c2110a1df1070cd3fztenghuiimport android.view.MenuInflater; 540353ca2e048543bd6e233b4c2110a1df1070cd3fztenghuiimport android.view.MenuItem; 55742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liuimport android.view.MotionEvent; 568872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolbimport android.view.OrientationEventListener; 578872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolbimport android.view.View; 586432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liuimport android.view.ViewGroup; 5908650187c1f1a2d1ef7f754be0f479a29958daaaMichael Kolbimport android.view.Window; 6008650187c1f1a2d1ef7f754be0f479a29958daaaMichael Kolbimport android.view.WindowManager; 61653c43be6e58be54cf2ac3c8efb2d65ac20bd03bAngus Kongimport android.widget.FrameLayout; 626432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liuimport android.widget.ImageView; 6337f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberlingimport android.widget.ProgressBar; 64cd2eeb0efc4370f20e9836e20eb11cb974e3b00dMangesh Ghiwareimport android.widget.ShareActionProvider; 658872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 66ed15d1a140986473bbe7fffd72ec9618c41c5979Angus Kongimport com.android.camera.app.AppManagerFactory; 677cfcafdf8f4a439c8fa87b612616fe409979e8a4Ruben Brunkimport com.android.camera.app.PlaceholderManager; 68ed15d1a140986473bbe7fffd72ec9618c41c5979Angus Kongimport com.android.camera.app.PanoramaStitchingManager; 6919ab725a5e640a1a20b1a6def083e37d1d1c1e20nicolasroardimport com.android.camera.crop.CropActivity; 706432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liuimport com.android.camera.data.CameraDataAdapter; 718e5e4eedb25a4589342660b928935acca4375fc7Angus Kongimport com.android.camera.data.CameraPreviewData; 728e5e4eedb25a4589342660b928935acca4375fc7Angus Kongimport com.android.camera.data.FixedFirstDataAdapter; 738e5e4eedb25a4589342660b928935acca4375fc7Angus Kongimport com.android.camera.data.FixedLastDataAdapter; 743250987bd014d1c5463b8a39bbe988165ab1cc3fAngus Kongimport com.android.camera.data.InProgressDataWrapper; 756432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liuimport com.android.camera.data.LocalData; 768e5e4eedb25a4589342660b928935acca4375fc7Angus Kongimport com.android.camera.data.LocalDataAdapter; 77064d6000933354f7bf344a41e0caa7052401c903ztenghuiimport com.android.camera.data.LocalMediaObserver; 786f64b50db6565bc6454304fd20c0c4020b297bb7Sascha Haeberlingimport com.android.camera.data.MediaDetails; 79bd26069d391830856c57c2141cd2efbc8423d871Angus Kongimport com.android.camera.data.SimpleViewData; 80a5a08d7642a1fdf961b057cc90e76c4c93103c15Sascha Haeberlingimport com.android.camera.tinyplanet.TinyPlanetFragment; 81ed15d1a140986473bbe7fffd72ec9618c41c5979Angus Kongimport com.android.camera.ui.ModuleSwitcher; 826f64b50db6565bc6454304fd20c0c4020b297bb7Sascha Haeberlingimport com.android.camera.ui.DetailsDialog; 836432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liuimport com.android.camera.ui.FilmStripView; 8488ef7664ba6a888fa5da8693091674e152b56192Sascha Haeberlingimport com.android.camera.util.ApiHelper; 85b50b5cbfbc0a67db6fc43373363b10381c9c61a3Angus Kongimport com.android.camera.util.CameraUtil; 86a9d66bdab247626b31dc182c4d62520b3abffdbdRuben Brunkimport com.android.camera.util.GcamHelper; 87761306fadfa94b538f43e8cf3463bf6d22814947Alan Newbergerimport com.android.camera.util.IntentHelper; 8837f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberlingimport com.android.camera.util.PhotoSphereHelper; 8988ef7664ba6a888fa5da8693091674e152b56192Sascha Haeberlingimport com.android.camera.util.PhotoSphereHelper.PanoramaViewHelper; 90cbd8267ee99e457f72822e8d8187b5e6823104f8Seth Raphaelimport com.android.camera.util.UsageStatistics; 918e963a5a6016d246184ed65906f9d103e92b17e2Sascha Haeberlingimport com.android.camera2.R; 928872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 93cbd8267ee99e457f72822e8d8187b5e6823104f8Seth Raphaelimport java.io.File; 94cbd8267ee99e457f72822e8d8187b5e6823104f8Seth Raphael 954f795b878843e59810ec1dca05b7cdb37b5614c5Angus Kongimport static com.android.camera.CameraManager.CameraOpenErrorCallback; 964f795b878843e59810ec1dca05b7cdb37b5614c5Angus Kong 976432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liupublic class CameraActivity extends Activity 98aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu implements ModuleSwitcher.ModuleSwitchListener, 99cbd8267ee99e457f72822e8d8187b5e6823104f8Seth Raphael ActionBar.OnMenuVisibilityListener, 100cbd8267ee99e457f72822e8d8187b5e6823104f8Seth Raphael ShareActionProvider.OnShareTargetSelectedListener { 1016432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu 1026432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu private static final String TAG = "CAM_Activity"; 1036432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu 1046432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu private static final String INTENT_ACTION_STILL_IMAGE_CAMERA_SECURE = 1056432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu "android.media.action.STILL_IMAGE_CAMERA_SECURE"; 1066432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu public static final String ACTION_IMAGE_CAPTURE_SECURE = 1076432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu "android.media.action.IMAGE_CAPTURE_SECURE"; 1086b9203214d828d72758943aca55adceab684a862ztenghui public static final String ACTION_TRIM_VIDEO = 1096b9203214d828d72758943aca55adceab684a862ztenghui "com.android.camera.action.TRIM"; 1106b9203214d828d72758943aca55adceab684a862ztenghui public static final String MEDIA_ITEM_PATH = "media-item-path"; 1116432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu 1126432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu // The intent extra for camera from secure lock screen. True if the gallery 1136432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu // should only show newly captured pictures. sSecureAlbumId does not 1146432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu // increment. This is used when switching between camera, camcorder, and 1156432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu // panorama. If the extra is not set, it is in the normal camera mode. 1166432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu public static final String SECURE_CAMERA_EXTRA = "secure_camera"; 1176432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu 118b7639c641f2ed5d0c60546349c3aa9e90c026878Sascha Haeberling /** 119b7639c641f2ed5d0c60546349c3aa9e90c026878Sascha Haeberling * Request code from an activity we started that indicated that we do not 120b7639c641f2ed5d0c60546349c3aa9e90c026878Sascha Haeberling * want to reset the view to the preview in onResume. 121b7639c641f2ed5d0c60546349c3aa9e90c026878Sascha Haeberling */ 122b7639c641f2ed5d0c60546349c3aa9e90c026878Sascha Haeberling public static final int REQ_CODE_DONT_SWITCH_TO_PREVIEW = 142; 123b7639c641f2ed5d0c60546349c3aa9e90c026878Sascha Haeberling 124d217ed0fa931d2a080a159c24e4012697baf5ae3Ruben Brunk public static final int REQ_CODE_GCAM_DEBUG_POSTCAPTURE = 999; 125d217ed0fa931d2a080a159c24e4012697baf5ae3Ruben Brunk 126aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu private static final int HIDE_ACTION_BAR = 1; 127aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu private static final long SHOW_ACTION_BAR_TIMEOUT_MS = 3000; 128aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu 129b7639c641f2ed5d0c60546349c3aa9e90c026878Sascha Haeberling /** Whether onResume should reset the view to the preview. */ 130b7639c641f2ed5d0c60546349c3aa9e90c026878Sascha Haeberling private boolean mResetToPreviewOnResume = true; 131b7639c641f2ed5d0c60546349c3aa9e90c026878Sascha Haeberling 1320353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui // Supported operations at FilmStripView. Different data has different 1330353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui // set of supported operations. 1340353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui private static final int SUPPORT_DELETE = 1 << 0; 1350353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui private static final int SUPPORT_ROTATE = 1 << 1; 1360353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui private static final int SUPPORT_INFO = 1 << 2; 1370353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui private static final int SUPPORT_CROP = 1 << 3; 1380353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui private static final int SUPPORT_SETAS = 1 << 4; 1390353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui private static final int SUPPORT_EDIT = 1 << 5; 1400353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui private static final int SUPPORT_TRIM = 1 << 6; 141cd2eeb0efc4370f20e9836e20eb11cb974e3b00dMangesh Ghiware private static final int SUPPORT_SHARE = 1 << 7; 142cd2eeb0efc4370f20e9836e20eb11cb974e3b00dMangesh Ghiware private static final int SUPPORT_SHARE_PANORAMA360 = 1 << 8; 143cd2eeb0efc4370f20e9836e20eb11cb974e3b00dMangesh Ghiware private static final int SUPPORT_SHOW_ON_MAP = 1 << 9; 1440353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui private static final int SUPPORT_ALL = 0xffffffff; 1450353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui 1466f64b50db6565bc6454304fd20c0c4020b297bb7Sascha Haeberling /** This data adapter is used by FilmStripView. */ 1478e5e4eedb25a4589342660b928935acca4375fc7Angus Kong private LocalDataAdapter mDataAdapter; 1488e5e4eedb25a4589342660b928935acca4375fc7Angus Kong /** This data adapter represents the real local camera data. */ 1498e5e4eedb25a4589342660b928935acca4375fc7Angus Kong private LocalDataAdapter mWrappedDataAdapter; 1508e5e4eedb25a4589342660b928935acca4375fc7Angus Kong 1516798c34ddb5248f038f351674c6a6c7a20992c8cAngus Kong private PanoramaStitchingManager mPanoramaManager; 1527cfcafdf8f4a439c8fa87b612616fe409979e8a4Ruben Brunk private PlaceholderManager mPlaceholderManager; 1538872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb private int mCurrentModuleIndex; 1546432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu private CameraModule mCurrentModule; 155653c43be6e58be54cf2ac3c8efb2d65ac20bd03bAngus Kong private FrameLayout mAboveFilmstripControlLayout; 156653c43be6e58be54cf2ac3c8efb2d65ac20bd03bAngus Kong private View mCameraModuleRootView; 1576432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu private FilmStripView mFilmStripView; 15837f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling private ProgressBar mBottomProgress; 15937f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling private View mPanoStitchingPanel; 1606432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu private int mResultCodeForTesting; 1616432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu private Intent mResultDataForTesting; 1626432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu private OnScreenHint mStorageHint; 1632dcc0a9dfcc23f090bbe36308f92d72f68c4f0a2Angus Kong private long mStorageSpaceBytes = Storage.LOW_STORAGE_THRESHOLD_BYTES; 1643cf565c4242a9deab7da5eb84fc302c79d594f11Doris Liu private boolean mAutoRotateScreen; 1656432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu private boolean mSecureCamera; 1666a8e8a1a0f3e8e62cd350733e275047475380d6bAngus Kong // This is a hack to speed up the start of SecureCamera. 1676a8e8a1a0f3e8e62cd350733e275047475380d6bAngus Kong private static boolean sFirstStartAfterScreenOn = true; 1686432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu private int mLastRawOrientation; 1698872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb private MyOrientationEventListener mOrientationListener; 1706432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu private Handler mMainHandler; 171f1f5186f7d3fd8bf35009d9e65a43914c664d82bSascha Haeberling private PanoramaViewHelper mPanoramaViewHelper; 1728e5e4eedb25a4589342660b928935acca4375fc7Angus Kong private CameraPreviewData mCameraPreviewData; 173fa9e2cc9ccbcd746f5765cb7a0afebcdb60e2973ztenghui private ActionBar mActionBar; 174aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu private OnActionBarVisibilityListener mOnActionBarVisibilityListener = null; 1750353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui private Menu mActionBarMenu; 176653c43be6e58be54cf2ac3c8efb2d65ac20bd03bAngus Kong private ViewGroup mUndoDeletionBar; 177742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu private boolean mIsUndoingDeletion = false; 1783cf565c4242a9deab7da5eb84fc302c79d594f11Doris Liu 179a5682ab08e1d42fe272ec877929478b4adb769f5Mangesh Ghiware private Uri[] mNfcPushUris = new Uri[1]; 180a5682ab08e1d42fe272ec877929478b4adb769f5Mangesh Ghiware 181cd2eeb0efc4370f20e9836e20eb11cb974e3b00dMangesh Ghiware private ShareActionProvider mStandardShareActionProvider; 182cd2eeb0efc4370f20e9836e20eb11cb974e3b00dMangesh Ghiware private Intent mStandardShareIntent; 183cd2eeb0efc4370f20e9836e20eb11cb974e3b00dMangesh Ghiware private ShareActionProvider mPanoramaShareActionProvider; 184cd2eeb0efc4370f20e9836e20eb11cb974e3b00dMangesh Ghiware private Intent mPanoramaShareIntent; 185064d6000933354f7bf344a41e0caa7052401c903ztenghui private LocalMediaObserver mLocalImagesObserver; 186064d6000933354f7bf344a41e0caa7052401c903ztenghui private LocalMediaObserver mLocalVideosObserver; 187cd2eeb0efc4370f20e9836e20eb11cb974e3b00dMangesh Ghiware 1885199c2078f3aea06732015ce8ad354c066a2f4ecSascha Haeberling private final int DEFAULT_SYSTEM_UI_VISIBILITY = View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN 1895199c2078f3aea06732015ce8ad354c066a2f4ecSascha Haeberling | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION; 190742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu private boolean mPendingDeletion = false; 1915199c2078f3aea06732015ce8ad354c066a2f4ecSascha Haeberling 19205804751ba07c8abcf422f57467d0ed3de95576cztenghui private Intent mVideoShareIntent; 19305804751ba07c8abcf422f57467d0ed3de95576cztenghui private Intent mImageShareIntent; 19405804751ba07c8abcf422f57467d0ed3de95576cztenghui 1958872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb private class MyOrientationEventListener 196a5a08d7642a1fdf961b057cc90e76c4c93103c15Sascha Haeberling extends OrientationEventListener { 1978872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb public MyOrientationEventListener(Context context) { 1988872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb super(context); 1998872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 2008872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 2018872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb @Override 2028872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb public void onOrientationChanged(int orientation) { 2038872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb // We keep the last known orientation. So if the user first orient 2048872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb // the camera then point the camera to floor or sky, we still have 2058872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb // the correct orientation. 206a5a08d7642a1fdf961b057cc90e76c4c93103c15Sascha Haeberling if (orientation == ORIENTATION_UNKNOWN) { 207a5a08d7642a1fdf961b057cc90e76c4c93103c15Sascha Haeberling return; 208a5a08d7642a1fdf961b057cc90e76c4c93103c15Sascha Haeberling } 2098872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb mLastRawOrientation = orientation; 2108872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb mCurrentModule.onOrientationChanged(orientation); 2118872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 2128872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 2138872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 2146432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu private MediaSaveService mMediaSaveService; 2156432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu private ServiceConnection mConnection = new ServiceConnection() { 216a5a08d7642a1fdf961b057cc90e76c4c93103c15Sascha Haeberling @Override 217a5a08d7642a1fdf961b057cc90e76c4c93103c15Sascha Haeberling public void onServiceConnected(ComponentName className, IBinder b) { 218a5a08d7642a1fdf961b057cc90e76c4c93103c15Sascha Haeberling mMediaSaveService = ((MediaSaveService.LocalBinder) b).getService(); 219a5a08d7642a1fdf961b057cc90e76c4c93103c15Sascha Haeberling mCurrentModule.onMediaSaveServiceConnected(mMediaSaveService); 220a5a08d7642a1fdf961b057cc90e76c4c93103c15Sascha Haeberling } 221a5a08d7642a1fdf961b057cc90e76c4c93103c15Sascha Haeberling 222a5a08d7642a1fdf961b057cc90e76c4c93103c15Sascha Haeberling @Override 223a5a08d7642a1fdf961b057cc90e76c4c93103c15Sascha Haeberling public void onServiceDisconnected(ComponentName className) { 224a5a08d7642a1fdf961b057cc90e76c4c93103c15Sascha Haeberling if (mMediaSaveService != null) { 225a5a08d7642a1fdf961b057cc90e76c4c93103c15Sascha Haeberling mMediaSaveService.setListener(null); 226a5a08d7642a1fdf961b057cc90e76c4c93103c15Sascha Haeberling mMediaSaveService = null; 2278872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 228a5a08d7642a1fdf961b057cc90e76c4c93103c15Sascha Haeberling } 229a5a08d7642a1fdf961b057cc90e76c4c93103c15Sascha Haeberling }; 230e319aeabdc825f221df5af8a6ec080c6f5d41a94John Reck 2314f795b878843e59810ec1dca05b7cdb37b5614c5Angus Kong private CameraOpenErrorCallback mCameraOpenErrorCallback = 2324f795b878843e59810ec1dca05b7cdb37b5614c5Angus Kong new CameraOpenErrorCallback() { 2334f795b878843e59810ec1dca05b7cdb37b5614c5Angus Kong @Override 2344f795b878843e59810ec1dca05b7cdb37b5614c5Angus Kong public void onCameraDisabled(int cameraId) { 235cbd8267ee99e457f72822e8d8187b5e6823104f8Seth Raphael UsageStatistics.onEvent(UsageStatistics.COMPONENT_CAMERA, 236cbd8267ee99e457f72822e8d8187b5e6823104f8Seth Raphael UsageStatistics.ACTION_OPEN_FAIL, "security"); 237cbd8267ee99e457f72822e8d8187b5e6823104f8Seth Raphael 2384f795b878843e59810ec1dca05b7cdb37b5614c5Angus Kong CameraUtil.showErrorAndFinish(CameraActivity.this, 2394f795b878843e59810ec1dca05b7cdb37b5614c5Angus Kong R.string.camera_disabled); 2404f795b878843e59810ec1dca05b7cdb37b5614c5Angus Kong } 2414f795b878843e59810ec1dca05b7cdb37b5614c5Angus Kong 2424f795b878843e59810ec1dca05b7cdb37b5614c5Angus Kong @Override 2434f795b878843e59810ec1dca05b7cdb37b5614c5Angus Kong public void onDeviceOpenFailure(int cameraId) { 244cbd8267ee99e457f72822e8d8187b5e6823104f8Seth Raphael UsageStatistics.onEvent(UsageStatistics.COMPONENT_CAMERA, 245cbd8267ee99e457f72822e8d8187b5e6823104f8Seth Raphael UsageStatistics.ACTION_OPEN_FAIL, "open"); 246cbd8267ee99e457f72822e8d8187b5e6823104f8Seth Raphael 2474f795b878843e59810ec1dca05b7cdb37b5614c5Angus Kong CameraUtil.showErrorAndFinish(CameraActivity.this, 2484f795b878843e59810ec1dca05b7cdb37b5614c5Angus Kong R.string.cannot_connect_camera); 2494f795b878843e59810ec1dca05b7cdb37b5614c5Angus Kong } 2504f795b878843e59810ec1dca05b7cdb37b5614c5Angus Kong 2514f795b878843e59810ec1dca05b7cdb37b5614c5Angus Kong @Override 2524f795b878843e59810ec1dca05b7cdb37b5614c5Angus Kong public void onReconnectionFailure(CameraManager mgr) { 253cbd8267ee99e457f72822e8d8187b5e6823104f8Seth Raphael UsageStatistics.onEvent(UsageStatistics.COMPONENT_CAMERA, 254cbd8267ee99e457f72822e8d8187b5e6823104f8Seth Raphael UsageStatistics.ACTION_OPEN_FAIL, "reconnect"); 255cbd8267ee99e457f72822e8d8187b5e6823104f8Seth Raphael 2564f795b878843e59810ec1dca05b7cdb37b5614c5Angus Kong CameraUtil.showErrorAndFinish(CameraActivity.this, 2574f795b878843e59810ec1dca05b7cdb37b5614c5Angus Kong R.string.cannot_connect_camera); 2584f795b878843e59810ec1dca05b7cdb37b5614c5Angus Kong } 2594f795b878843e59810ec1dca05b7cdb37b5614c5Angus Kong }; 2604f795b878843e59810ec1dca05b7cdb37b5614c5Angus Kong 261b84b9738c855a525dc1944165983cc3c342ce446Doris Liu // close activity when screen turns off 262b84b9738c855a525dc1944165983cc3c342ce446Doris Liu private BroadcastReceiver mScreenOffReceiver = new BroadcastReceiver() { 263b84b9738c855a525dc1944165983cc3c342ce446Doris Liu @Override 264b84b9738c855a525dc1944165983cc3c342ce446Doris Liu public void onReceive(Context context, Intent intent) { 265b84b9738c855a525dc1944165983cc3c342ce446Doris Liu finish(); 266b84b9738c855a525dc1944165983cc3c342ce446Doris Liu } 267b84b9738c855a525dc1944165983cc3c342ce446Doris Liu }; 268b84b9738c855a525dc1944165983cc3c342ce446Doris Liu 2696a8e8a1a0f3e8e62cd350733e275047475380d6bAngus Kong private static BroadcastReceiver sScreenOffReceiver; 270a5a08d7642a1fdf961b057cc90e76c4c93103c15Sascha Haeberling 2716a8e8a1a0f3e8e62cd350733e275047475380d6bAngus Kong private static class ScreenOffReceiver extends BroadcastReceiver { 2726a8e8a1a0f3e8e62cd350733e275047475380d6bAngus Kong @Override 2736a8e8a1a0f3e8e62cd350733e275047475380d6bAngus Kong public void onReceive(Context context, Intent intent) { 2746a8e8a1a0f3e8e62cd350733e275047475380d6bAngus Kong sFirstStartAfterScreenOn = true; 2756a8e8a1a0f3e8e62cd350733e275047475380d6bAngus Kong } 2766a8e8a1a0f3e8e62cd350733e275047475380d6bAngus Kong } 2776a8e8a1a0f3e8e62cd350733e275047475380d6bAngus Kong 278aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu private class MainHandler extends Handler { 279aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu public MainHandler(Looper looper) { 280aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu super(looper); 281aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu } 282aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu 283aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu @Override 284aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu public void handleMessage(Message msg) { 285aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu if (msg.what == HIDE_ACTION_BAR) { 286aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu removeMessages(HIDE_ACTION_BAR); 287aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu CameraActivity.this.setSystemBarsVisibility(false); 288aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu } 289aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu } 290aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu } 291aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu 292aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu public interface OnActionBarVisibilityListener { 293aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu public void onActionBarVisibilityChanged(boolean isVisible); 294aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu } 295aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu 296aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu public void setOnActionBarVisibilityListener(OnActionBarVisibilityListener listener) { 297aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu mOnActionBarVisibilityListener = listener; 298aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu } 299aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu 3006a8e8a1a0f3e8e62cd350733e275047475380d6bAngus Kong public static boolean isFirstStartAfterScreenOn() { 3016a8e8a1a0f3e8e62cd350733e275047475380d6bAngus Kong return sFirstStartAfterScreenOn; 3026a8e8a1a0f3e8e62cd350733e275047475380d6bAngus Kong } 3036a8e8a1a0f3e8e62cd350733e275047475380d6bAngus Kong 3046a8e8a1a0f3e8e62cd350733e275047475380d6bAngus Kong public static void resetFirstStartAfterScreenOn() { 3056a8e8a1a0f3e8e62cd350733e275047475380d6bAngus Kong sFirstStartAfterScreenOn = false; 3066a8e8a1a0f3e8e62cd350733e275047475380d6bAngus Kong } 3076a8e8a1a0f3e8e62cd350733e275047475380d6bAngus Kong 308cbd8267ee99e457f72822e8d8187b5e6823104f8Seth Raphael private String fileNameFromDataID(int dataID) { 309cbd8267ee99e457f72822e8d8187b5e6823104f8Seth Raphael final LocalData localData = mDataAdapter.getLocalData(dataID); 310cbd8267ee99e457f72822e8d8187b5e6823104f8Seth Raphael 311cbd8267ee99e457f72822e8d8187b5e6823104f8Seth Raphael File localFile = new File(localData.getPath()); 312cbd8267ee99e457f72822e8d8187b5e6823104f8Seth Raphael return localFile.getName(); 313cbd8267ee99e457f72822e8d8187b5e6823104f8Seth Raphael } 314cbd8267ee99e457f72822e8d8187b5e6823104f8Seth Raphael 31537f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling private FilmStripView.Listener mFilmStripListener = 31637f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling new FilmStripView.Listener() { 31737f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling @Override 31837f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling public void onDataPromoted(int dataID) { 319cbd8267ee99e457f72822e8d8187b5e6823104f8Seth Raphael UsageStatistics.onEvent(UsageStatistics.COMPONENT_CAMERA, 320cbd8267ee99e457f72822e8d8187b5e6823104f8Seth Raphael UsageStatistics.ACTION_DELETE, "promoted", 0, 321cbd8267ee99e457f72822e8d8187b5e6823104f8Seth Raphael UsageStatistics.hashFileName(fileNameFromDataID(dataID))); 322cbd8267ee99e457f72822e8d8187b5e6823104f8Seth Raphael 32337f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling removeData(dataID); 32437f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling } 325e319aeabdc825f221df5af8a6ec080c6f5d41a94John Reck 32637f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling @Override 32737f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling public void onDataDemoted(int dataID) { 328cbd8267ee99e457f72822e8d8187b5e6823104f8Seth Raphael UsageStatistics.onEvent(UsageStatistics.COMPONENT_CAMERA, 329cbd8267ee99e457f72822e8d8187b5e6823104f8Seth Raphael UsageStatistics.ACTION_DELETE, "demoted", 0, 330cbd8267ee99e457f72822e8d8187b5e6823104f8Seth Raphael UsageStatistics.hashFileName(fileNameFromDataID(dataID))); 331cbd8267ee99e457f72822e8d8187b5e6823104f8Seth Raphael 33237f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling removeData(dataID); 33337f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling } 334e319aeabdc825f221df5af8a6ec080c6f5d41a94John Reck 33537f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling @Override 33637f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling public void onDataFullScreenChange(int dataID, boolean full) { 3378566dd777cd219254c945240a31ac97de28792a2ztenghui boolean isCameraID = isCameraPreview(dataID); 3387b265a6b2f55c6ae7afc30e63ba324c4084a5d8eztenghui if (!isCameraID) { 339aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu if (!full) { 340aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu // Always show action bar in filmstrip mode 341aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu CameraActivity.this.setSystemBarsVisibility(true, false); 342aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu } else if (mActionBar.isShowing()) { 343aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu // Hide action bar after time out in full screen mode 344aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu mMainHandler.sendEmptyMessageDelayed(HIDE_ACTION_BAR, 345aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu SHOW_ACTION_BAR_TIMEOUT_MS); 346aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu } 347fa9e2cc9ccbcd746f5765cb7a0afebcdb60e2973ztenghui } 34837f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling } 34937f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling 3508566dd777cd219254c945240a31ac97de28792a2ztenghui /** 3518566dd777cd219254c945240a31ac97de28792a2ztenghui * Check if the local data corresponding to dataID is the camera 3528566dd777cd219254c945240a31ac97de28792a2ztenghui * preview. 3538566dd777cd219254c945240a31ac97de28792a2ztenghui * 3548566dd777cd219254c945240a31ac97de28792a2ztenghui * @param dataID the ID of the local data 3558566dd777cd219254c945240a31ac97de28792a2ztenghui * @return true if the local data is not null and it is the 3568566dd777cd219254c945240a31ac97de28792a2ztenghui * camera preview. 3578566dd777cd219254c945240a31ac97de28792a2ztenghui */ 3588566dd777cd219254c945240a31ac97de28792a2ztenghui private boolean isCameraPreview(int dataID) { 3598566dd777cd219254c945240a31ac97de28792a2ztenghui LocalData localData = mDataAdapter.getLocalData(dataID); 3608566dd777cd219254c945240a31ac97de28792a2ztenghui if (localData == null) { 3618566dd777cd219254c945240a31ac97de28792a2ztenghui Log.w(TAG, "Current data ID not found."); 3628566dd777cd219254c945240a31ac97de28792a2ztenghui return false; 3638566dd777cd219254c945240a31ac97de28792a2ztenghui } 3648566dd777cd219254c945240a31ac97de28792a2ztenghui return localData.getLocalDataType() == LocalData.LOCAL_CAMERA_PREVIEW; 3658566dd777cd219254c945240a31ac97de28792a2ztenghui } 3668566dd777cd219254c945240a31ac97de28792a2ztenghui 36737f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling @Override 3683044d8c577432d6e9721fc8b26ac2afbbaf21266Erin Dahlgren public void onReload() { 3693044d8c577432d6e9721fc8b26ac2afbbaf21266Erin Dahlgren setPreviewControlsVisibility(true); 37017f1e65142df55ebccfa30720cd1265f9ab67e96ztenghui CameraActivity.this.setSystemBarsVisibility(false); 3713044d8c577432d6e9721fc8b26ac2afbbaf21266Erin Dahlgren } 3723044d8c577432d6e9721fc8b26ac2afbbaf21266Erin Dahlgren 3733044d8c577432d6e9721fc8b26ac2afbbaf21266Erin Dahlgren @Override 3743044d8c577432d6e9721fc8b26ac2afbbaf21266Erin Dahlgren public void onCurrentDataCentered(int dataID) { 3753044d8c577432d6e9721fc8b26ac2afbbaf21266Erin Dahlgren if (dataID != 0 && !mFilmStripView.isCameraPreview()) { 3763044d8c577432d6e9721fc8b26ac2afbbaf21266Erin Dahlgren // For now, We ignore all items that are not the camera preview. 3773044d8c577432d6e9721fc8b26ac2afbbaf21266Erin Dahlgren return; 3783044d8c577432d6e9721fc8b26ac2afbbaf21266Erin Dahlgren } 3793044d8c577432d6e9721fc8b26ac2afbbaf21266Erin Dahlgren 3803044d8c577432d6e9721fc8b26ac2afbbaf21266Erin Dahlgren if(!arePreviewControlsVisible()) { 3813044d8c577432d6e9721fc8b26ac2afbbaf21266Erin Dahlgren setPreviewControlsVisibility(true); 382fd7f0a9ffd8e7db21e556b1a60a7602ef5d0fe29Erin Dahlgren CameraActivity.this.setSystemBarsVisibility(false); 3833044d8c577432d6e9721fc8b26ac2afbbaf21266Erin Dahlgren } 3843044d8c577432d6e9721fc8b26ac2afbbaf21266Erin Dahlgren } 3853044d8c577432d6e9721fc8b26ac2afbbaf21266Erin Dahlgren 3863044d8c577432d6e9721fc8b26ac2afbbaf21266Erin Dahlgren @Override 3873044d8c577432d6e9721fc8b26ac2afbbaf21266Erin Dahlgren public void onCurrentDataOffCentered(int dataID) { 3883044d8c577432d6e9721fc8b26ac2afbbaf21266Erin Dahlgren if (dataID != 0 && !mFilmStripView.isCameraPreview()) { 3893044d8c577432d6e9721fc8b26ac2afbbaf21266Erin Dahlgren // For now, We ignore all items that are not the camera preview. 3903044d8c577432d6e9721fc8b26ac2afbbaf21266Erin Dahlgren return; 3913044d8c577432d6e9721fc8b26ac2afbbaf21266Erin Dahlgren } 3923044d8c577432d6e9721fc8b26ac2afbbaf21266Erin Dahlgren 3933044d8c577432d6e9721fc8b26ac2afbbaf21266Erin Dahlgren if (arePreviewControlsVisible()) { 3943044d8c577432d6e9721fc8b26ac2afbbaf21266Erin Dahlgren setPreviewControlsVisibility(false); 3953044d8c577432d6e9721fc8b26ac2afbbaf21266Erin Dahlgren } 3963044d8c577432d6e9721fc8b26ac2afbbaf21266Erin Dahlgren } 3973044d8c577432d6e9721fc8b26ac2afbbaf21266Erin Dahlgren 3983044d8c577432d6e9721fc8b26ac2afbbaf21266Erin Dahlgren @Override 39902cafdfb92a2d53b76c2bb180ee5289a80f4f4acAngus Kong public void onDataFocusChanged(final int dataID, final boolean focused) { 400aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu // Delay hiding action bar if there is any user interaction 401aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu if (mMainHandler.hasMessages(HIDE_ACTION_BAR)) { 402aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu mMainHandler.removeMessages(HIDE_ACTION_BAR); 403aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu mMainHandler.sendEmptyMessageDelayed(HIDE_ACTION_BAR, 404aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu SHOW_ACTION_BAR_TIMEOUT_MS); 405aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu } 40602cafdfb92a2d53b76c2bb180ee5289a80f4f4acAngus Kong // TODO: This callback is UI event callback, should always 40702cafdfb92a2d53b76c2bb180ee5289a80f4f4acAngus Kong // happen on UI thread. Find the reason for this 40802cafdfb92a2d53b76c2bb180ee5289a80f4f4acAngus Kong // runOnUiThread() and fix it. 40933035c19cc47adfb738c20cef66652ae451c8e10Mangesh Ghiware runOnUiThread(new Runnable() { 41033035c19cc47adfb738c20cef66652ae451c8e10Mangesh Ghiware @Override 41133035c19cc47adfb738c20cef66652ae451c8e10Mangesh Ghiware public void run() { 4127b265a6b2f55c6ae7afc30e63ba324c4084a5d8eztenghui LocalData currentData = mDataAdapter.getLocalData(dataID); 4137b265a6b2f55c6ae7afc30e63ba324c4084a5d8eztenghui if (currentData == null) { 4147b265a6b2f55c6ae7afc30e63ba324c4084a5d8eztenghui Log.w(TAG, "Current data ID not found."); 4157b265a6b2f55c6ae7afc30e63ba324c4084a5d8eztenghui hidePanoStitchingProgress(); 4167b265a6b2f55c6ae7afc30e63ba324c4084a5d8eztenghui return; 4177b265a6b2f55c6ae7afc30e63ba324c4084a5d8eztenghui } 4187b265a6b2f55c6ae7afc30e63ba324c4084a5d8eztenghui boolean isCameraID = currentData.getLocalDataType() == 4197b265a6b2f55c6ae7afc30e63ba324c4084a5d8eztenghui LocalData.LOCAL_CAMERA_PREVIEW; 42002cafdfb92a2d53b76c2bb180ee5289a80f4f4acAngus Kong if (!focused) { 4217b265a6b2f55c6ae7afc30e63ba324c4084a5d8eztenghui if (isCameraID) { 4227b265a6b2f55c6ae7afc30e63ba324c4084a5d8eztenghui mCurrentModule.onPreviewFocusChanged(false); 423aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu CameraActivity.this.setSystemBarsVisibility(true); 4247b265a6b2f55c6ae7afc30e63ba324c4084a5d8eztenghui } 42533035c19cc47adfb738c20cef66652ae451c8e10Mangesh Ghiware hidePanoStitchingProgress(); 42633035c19cc47adfb738c20cef66652ae451c8e10Mangesh Ghiware } else { 4277b265a6b2f55c6ae7afc30e63ba324c4084a5d8eztenghui if (isCameraID) { 428a5a08d7642a1fdf961b057cc90e76c4c93103c15Sascha Haeberling // Don't show the action bar in Camera 429a5a08d7642a1fdf961b057cc90e76c4c93103c15Sascha Haeberling // preview. 430aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu CameraActivity.this.setSystemBarsVisibility(false); 4313044d8c577432d6e9721fc8b26ac2afbbaf21266Erin Dahlgren 432742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu if (mPendingDeletion) { 433742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu performDeletion(); 434742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu } 4351ef76d4cbd73c02cb8d02cf4cde3f4cee81548d6Alan Newberger } else { 4361ef76d4cbd73c02cb8d02cf4cde3f4cee81548d6Alan Newberger updateActionBarMenu(dataID); 4371ef76d4cbd73c02cb8d02cf4cde3f4cee81548d6Alan Newberger } 43833035c19cc47adfb738c20cef66652ae451c8e10Mangesh Ghiware 43933035c19cc47adfb738c20cef66652ae451c8e10Mangesh Ghiware Uri contentUri = currentData.getContentUri(); 44033035c19cc47adfb738c20cef66652ae451c8e10Mangesh Ghiware if (contentUri == null) { 44133035c19cc47adfb738c20cef66652ae451c8e10Mangesh Ghiware hidePanoStitchingProgress(); 44233035c19cc47adfb738c20cef66652ae451c8e10Mangesh Ghiware return; 44333035c19cc47adfb738c20cef66652ae451c8e10Mangesh Ghiware } 44433035c19cc47adfb738c20cef66652ae451c8e10Mangesh Ghiware int panoStitchingProgress = mPanoramaManager.getTaskProgress( 445a5a08d7642a1fdf961b057cc90e76c4c93103c15Sascha Haeberling contentUri); 44633035c19cc47adfb738c20cef66652ae451c8e10Mangesh Ghiware if (panoStitchingProgress < 0) { 44733035c19cc47adfb738c20cef66652ae451c8e10Mangesh Ghiware hidePanoStitchingProgress(); 44833035c19cc47adfb738c20cef66652ae451c8e10Mangesh Ghiware return; 44933035c19cc47adfb738c20cef66652ae451c8e10Mangesh Ghiware } 45033035c19cc47adfb738c20cef66652ae451c8e10Mangesh Ghiware showPanoStitchingProgress(); 45133035c19cc47adfb738c20cef66652ae451c8e10Mangesh Ghiware updateStitchingProgress(panoStitchingProgress); 45233035c19cc47adfb738c20cef66652ae451c8e10Mangesh Ghiware } 45337f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling } 45433035c19cc47adfb738c20cef66652ae451c8e10Mangesh Ghiware }); 45537f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling } 456394023fb7e3c8d07d4aeafc30bf4b66ed481ebb7Sascha Haeberling 457394023fb7e3c8d07d4aeafc30bf4b66ed481ebb7Sascha Haeberling @Override 458aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu public void onToggleSystemDecorsVisibility(int dataID) { 459aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu // If action bar is showing, hide it immediately, otherwise 460aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu // show action bar and hide it later 461394023fb7e3c8d07d4aeafc30bf4b66ed481ebb7Sascha Haeberling if (mActionBar.isShowing()) { 462aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu CameraActivity.this.setSystemBarsVisibility(false); 463394023fb7e3c8d07d4aeafc30bf4b66ed481ebb7Sascha Haeberling } else { 4648566dd777cd219254c945240a31ac97de28792a2ztenghui // Don't show the action bar if that is the camera preview. 4658566dd777cd219254c945240a31ac97de28792a2ztenghui boolean isCameraID = isCameraPreview(dataID); 4668566dd777cd219254c945240a31ac97de28792a2ztenghui if (!isCameraID) { 467aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu CameraActivity.this.setSystemBarsVisibility(true, true); 468fd43e3be3d69f48a97bdd9084e9549f41e963cc2ztenghui } 469394023fb7e3c8d07d4aeafc30bf4b66ed481ebb7Sascha Haeberling } 470394023fb7e3c8d07d4aeafc30bf4b66ed481ebb7Sascha Haeberling } 471aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu 472aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu @Override 473aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu public void setSystemDecorsVisibility(boolean visible) { 474aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu CameraActivity.this.setSystemBarsVisibility(visible); 475aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu } 47637f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling }; 47737f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling 4784ed20592482d2ab2f3f48ee72d5b1c06bf009034Sascha Haeberling public void gotoGallery() { 479cbd8267ee99e457f72822e8d8187b5e6823104f8Seth Raphael UsageStatistics.onEvent(UsageStatistics.COMPONENT_CAMERA, UsageStatistics.ACTION_FILMSTRIP, 480cbd8267ee99e457f72822e8d8187b5e6823104f8Seth Raphael "thumbnailTap"); 481cbd8267ee99e457f72822e8d8187b5e6823104f8Seth Raphael 4824ed20592482d2ab2f3f48ee72d5b1c06bf009034Sascha Haeberling mFilmStripView.getController().goToNextItem(); 4834ed20592482d2ab2f3f48ee72d5b1c06bf009034Sascha Haeberling } 4844ed20592482d2ab2f3f48ee72d5b1c06bf009034Sascha Haeberling 4855199c2078f3aea06732015ce8ad354c066a2f4ecSascha Haeberling /** 486aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu * If {@param visible} is false, this hides the action bar and switches the system UI 487aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu * to lights-out mode. 4885199c2078f3aea06732015ce8ad354c066a2f4ecSascha Haeberling */ 48997cb1ea3dbcf03b4e1fc6b149bf475ef3f3920fcDoris Liu // TODO: This should not be called outside of the activity. 4904ec139dc81482ebfef1e62a3987c53bd5880c759Sascha Haeberling public void setSystemBarsVisibility(boolean visible) { 491aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu setSystemBarsVisibility(visible, false); 492aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu } 493aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu 494aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu /** 495aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu * If {@param visible} is false, this hides the action bar and switches the 496aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu * system UI to lights-out mode. If {@param hideLater} is true, a delayed message 497aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu * will be sent after a timeout to hide the action bar. 498aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu */ 499aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu private void setSystemBarsVisibility(boolean visible, boolean hideLater) { 500aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu mMainHandler.removeMessages(HIDE_ACTION_BAR); 501aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu 50217f1e65142df55ebccfa30720cd1265f9ab67e96ztenghui int currentSystemUIVisibility = mAboveFilmstripControlLayout.getSystemUiVisibility(); 50317f1e65142df55ebccfa30720cd1265f9ab67e96ztenghui int newSystemUIVisibility = DEFAULT_SYSTEM_UI_VISIBILITY | 50417f1e65142df55ebccfa30720cd1265f9ab67e96ztenghui (visible ? View.SYSTEM_UI_FLAG_VISIBLE : 50517f1e65142df55ebccfa30720cd1265f9ab67e96ztenghui View.SYSTEM_UI_FLAG_LOW_PROFILE | View.SYSTEM_UI_FLAG_FULLSCREEN); 50617f1e65142df55ebccfa30720cd1265f9ab67e96ztenghui if (newSystemUIVisibility != currentSystemUIVisibility) { 50717f1e65142df55ebccfa30720cd1265f9ab67e96ztenghui mAboveFilmstripControlLayout.setSystemUiVisibility(newSystemUIVisibility); 50817f1e65142df55ebccfa30720cd1265f9ab67e96ztenghui } 50997cb1ea3dbcf03b4e1fc6b149bf475ef3f3920fcDoris Liu 51017f1e65142df55ebccfa30720cd1265f9ab67e96ztenghui boolean currentActionBarVisibility = mActionBar.isShowing(); 51117f1e65142df55ebccfa30720cd1265f9ab67e96ztenghui if (visible != currentActionBarVisibility) { 512aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu if (visible) { 513aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu mActionBar.show(); 514aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu } else { 515aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu mActionBar.hide(); 516aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu } 517aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu if (mOnActionBarVisibilityListener != null) { 518aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu mOnActionBarVisibilityListener.onActionBarVisibilityChanged(visible); 519aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu } 520aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu } 521aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu 522aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu // Now delay hiding the bars 523aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu if (visible && hideLater) { 524aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu mMainHandler.sendEmptyMessageDelayed(HIDE_ACTION_BAR, SHOW_ACTION_BAR_TIMEOUT_MS); 5255199c2078f3aea06732015ce8ad354c066a2f4ecSascha Haeberling } 5265199c2078f3aea06732015ce8ad354c066a2f4ecSascha Haeberling } 5275199c2078f3aea06732015ce8ad354c066a2f4ecSascha Haeberling 52837f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling private void hidePanoStitchingProgress() { 52937f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling mPanoStitchingPanel.setVisibility(View.GONE); 53037f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling } 53137f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling 53237f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling private void showPanoStitchingProgress() { 53337f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling mPanoStitchingPanel.setVisibility(View.VISIBLE); 53437f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling } 53537f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling 53637f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling private void updateStitchingProgress(int progress) { 53737f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling mBottomProgress.setProgress(progress); 53837f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling } 5398872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 540a5682ab08e1d42fe272ec877929478b4adb769f5Mangesh Ghiware @TargetApi(Build.VERSION_CODES.JELLY_BEAN) 541a5682ab08e1d42fe272ec877929478b4adb769f5Mangesh Ghiware private void setupNfcBeamPush() { 542a5682ab08e1d42fe272ec877929478b4adb769f5Mangesh Ghiware NfcAdapter adapter = NfcAdapter.getDefaultAdapter(CameraActivity.this); 543a5682ab08e1d42fe272ec877929478b4adb769f5Mangesh Ghiware if (adapter == null) { 544a5682ab08e1d42fe272ec877929478b4adb769f5Mangesh Ghiware return; 545a5682ab08e1d42fe272ec877929478b4adb769f5Mangesh Ghiware } 546a5682ab08e1d42fe272ec877929478b4adb769f5Mangesh Ghiware 547a5682ab08e1d42fe272ec877929478b4adb769f5Mangesh Ghiware if (!ApiHelper.HAS_SET_BEAM_PUSH_URIS) { 548a5682ab08e1d42fe272ec877929478b4adb769f5Mangesh Ghiware // Disable beaming 549a5682ab08e1d42fe272ec877929478b4adb769f5Mangesh Ghiware adapter.setNdefPushMessage(null, CameraActivity.this); 550a5682ab08e1d42fe272ec877929478b4adb769f5Mangesh Ghiware return; 551a5682ab08e1d42fe272ec877929478b4adb769f5Mangesh Ghiware } 552a5682ab08e1d42fe272ec877929478b4adb769f5Mangesh Ghiware 553a5682ab08e1d42fe272ec877929478b4adb769f5Mangesh Ghiware adapter.setBeamPushUris(null, CameraActivity.this); 554a5682ab08e1d42fe272ec877929478b4adb769f5Mangesh Ghiware adapter.setBeamPushUrisCallback(new CreateBeamUrisCallback() { 555a5682ab08e1d42fe272ec877929478b4adb769f5Mangesh Ghiware @Override 556a5682ab08e1d42fe272ec877929478b4adb769f5Mangesh Ghiware public Uri[] createBeamUris(NfcEvent event) { 557a5682ab08e1d42fe272ec877929478b4adb769f5Mangesh Ghiware return mNfcPushUris; 558a5682ab08e1d42fe272ec877929478b4adb769f5Mangesh Ghiware } 559a5682ab08e1d42fe272ec877929478b4adb769f5Mangesh Ghiware }, CameraActivity.this); 560a5682ab08e1d42fe272ec877929478b4adb769f5Mangesh Ghiware } 561a5682ab08e1d42fe272ec877929478b4adb769f5Mangesh Ghiware 562a5682ab08e1d42fe272ec877929478b4adb769f5Mangesh Ghiware private void setNfcBeamPushUri(Uri uri) { 563a5682ab08e1d42fe272ec877929478b4adb769f5Mangesh Ghiware mNfcPushUris[0] = uri; 564a5682ab08e1d42fe272ec877929478b4adb769f5Mangesh Ghiware } 565a5682ab08e1d42fe272ec877929478b4adb769f5Mangesh Ghiware 566cd2eeb0efc4370f20e9836e20eb11cb974e3b00dMangesh Ghiware private void setStandardShareIntent(Uri contentUri, String mimeType) { 56705804751ba07c8abcf422f57467d0ed3de95576cztenghui mStandardShareIntent = getShareIntentFromType(mimeType); 56805804751ba07c8abcf422f57467d0ed3de95576cztenghui if (mStandardShareIntent != null) { 56905804751ba07c8abcf422f57467d0ed3de95576cztenghui mStandardShareIntent.putExtra(Intent.EXTRA_STREAM, contentUri); 57005804751ba07c8abcf422f57467d0ed3de95576cztenghui mStandardShareIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); 57105804751ba07c8abcf422f57467d0ed3de95576cztenghui if (mStandardShareActionProvider != null) { 57205804751ba07c8abcf422f57467d0ed3de95576cztenghui mStandardShareActionProvider.setShareIntent(mStandardShareIntent); 57305804751ba07c8abcf422f57467d0ed3de95576cztenghui } 574cd2eeb0efc4370f20e9836e20eb11cb974e3b00dMangesh Ghiware } 57505804751ba07c8abcf422f57467d0ed3de95576cztenghui } 57605804751ba07c8abcf422f57467d0ed3de95576cztenghui 57705804751ba07c8abcf422f57467d0ed3de95576cztenghui /** 57805804751ba07c8abcf422f57467d0ed3de95576cztenghui * Get the share intent according to the mimeType 57905804751ba07c8abcf422f57467d0ed3de95576cztenghui * 58005804751ba07c8abcf422f57467d0ed3de95576cztenghui * @param mimeType The mimeType of current data. 58105804751ba07c8abcf422f57467d0ed3de95576cztenghui * @return the video/image's ShareIntent or null if mimeType is invalid. 58205804751ba07c8abcf422f57467d0ed3de95576cztenghui */ 58305804751ba07c8abcf422f57467d0ed3de95576cztenghui private Intent getShareIntentFromType(String mimeType) { 58405804751ba07c8abcf422f57467d0ed3de95576cztenghui // Lazily create the intent object. 58505804751ba07c8abcf422f57467d0ed3de95576cztenghui if (mimeType.startsWith("video/")) { 58605804751ba07c8abcf422f57467d0ed3de95576cztenghui if (mVideoShareIntent == null) { 58705804751ba07c8abcf422f57467d0ed3de95576cztenghui mVideoShareIntent = new Intent(Intent.ACTION_SEND); 58805804751ba07c8abcf422f57467d0ed3de95576cztenghui mVideoShareIntent.setType("video/*"); 58905804751ba07c8abcf422f57467d0ed3de95576cztenghui } 59005804751ba07c8abcf422f57467d0ed3de95576cztenghui return mVideoShareIntent; 59105804751ba07c8abcf422f57467d0ed3de95576cztenghui } else if (mimeType.startsWith("image/")) { 59205804751ba07c8abcf422f57467d0ed3de95576cztenghui if (mImageShareIntent == null) { 59305804751ba07c8abcf422f57467d0ed3de95576cztenghui mImageShareIntent = new Intent(Intent.ACTION_SEND); 59405804751ba07c8abcf422f57467d0ed3de95576cztenghui mImageShareIntent.setType("image/*"); 59505804751ba07c8abcf422f57467d0ed3de95576cztenghui } 59605804751ba07c8abcf422f57467d0ed3de95576cztenghui return mImageShareIntent; 597cd2eeb0efc4370f20e9836e20eb11cb974e3b00dMangesh Ghiware } 59805804751ba07c8abcf422f57467d0ed3de95576cztenghui Log.w(TAG, "unsupported mimeType " + mimeType); 59905804751ba07c8abcf422f57467d0ed3de95576cztenghui return null; 600cd2eeb0efc4370f20e9836e20eb11cb974e3b00dMangesh Ghiware } 601cd2eeb0efc4370f20e9836e20eb11cb974e3b00dMangesh Ghiware 602cd2eeb0efc4370f20e9836e20eb11cb974e3b00dMangesh Ghiware private void setPanoramaShareIntent(Uri contentUri) { 603cd2eeb0efc4370f20e9836e20eb11cb974e3b00dMangesh Ghiware if (mPanoramaShareIntent == null) { 604cd2eeb0efc4370f20e9836e20eb11cb974e3b00dMangesh Ghiware mPanoramaShareIntent = new Intent(Intent.ACTION_SEND); 605cd2eeb0efc4370f20e9836e20eb11cb974e3b00dMangesh Ghiware } 606cd2eeb0efc4370f20e9836e20eb11cb974e3b00dMangesh Ghiware mPanoramaShareIntent.setType("application/vnd.google.panorama360+jpg"); 607cd2eeb0efc4370f20e9836e20eb11cb974e3b00dMangesh Ghiware mPanoramaShareIntent.putExtra(Intent.EXTRA_STREAM, contentUri); 608cd2eeb0efc4370f20e9836e20eb11cb974e3b00dMangesh Ghiware if (mPanoramaShareActionProvider != null) { 609cd2eeb0efc4370f20e9836e20eb11cb974e3b00dMangesh Ghiware mPanoramaShareActionProvider.setShareIntent(mPanoramaShareIntent); 610cd2eeb0efc4370f20e9836e20eb11cb974e3b00dMangesh Ghiware } 611cd2eeb0efc4370f20e9836e20eb11cb974e3b00dMangesh Ghiware } 612cd2eeb0efc4370f20e9836e20eb11cb974e3b00dMangesh Ghiware 613aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu @Override 614aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu public void onMenuVisibilityChanged(boolean isVisible) { 615aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu // If menu is showing, we need to make sure action bar does not go away. 616aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu mMainHandler.removeMessages(HIDE_ACTION_BAR); 617aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu if (!isVisible) { 618aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu mMainHandler.sendEmptyMessageDelayed(HIDE_ACTION_BAR, SHOW_ACTION_BAR_TIMEOUT_MS); 619aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu } 620aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu } 621aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu 622cbd8267ee99e457f72822e8d8187b5e6823104f8Seth Raphael @Override 623cbd8267ee99e457f72822e8d8187b5e6823104f8Seth Raphael public boolean onShareTargetSelected(ShareActionProvider shareActionProvider, Intent intent) { 624cbd8267ee99e457f72822e8d8187b5e6823104f8Seth Raphael int currentDataId = mFilmStripView.getCurrentId(); 625cbd8267ee99e457f72822e8d8187b5e6823104f8Seth Raphael if (currentDataId < 0) { 626cbd8267ee99e457f72822e8d8187b5e6823104f8Seth Raphael return false; 627cbd8267ee99e457f72822e8d8187b5e6823104f8Seth Raphael } 628cbd8267ee99e457f72822e8d8187b5e6823104f8Seth Raphael UsageStatistics.onEvent(UsageStatistics.COMPONENT_CAMERA, UsageStatistics.ACTION_SHARE, 629cbd8267ee99e457f72822e8d8187b5e6823104f8Seth Raphael intent.getComponent().getPackageName(), 0, 630cbd8267ee99e457f72822e8d8187b5e6823104f8Seth Raphael UsageStatistics.hashFileName(fileNameFromDataID(currentDataId))); 631cbd8267ee99e457f72822e8d8187b5e6823104f8Seth Raphael return true; 632cbd8267ee99e457f72822e8d8187b5e6823104f8Seth Raphael } 633cbd8267ee99e457f72822e8d8187b5e6823104f8Seth Raphael 6340353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui /** 6350353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui * According to the data type, make the menu items for supported operations 6360353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui * visible. 637a5a08d7642a1fdf961b057cc90e76c4c93103c15Sascha Haeberling * 638fae11a165e344a38811770c7d348eda214683edcSascha Haeberling * @param dataID the data ID of the current item. 6390353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui */ 640fae11a165e344a38811770c7d348eda214683edcSascha Haeberling private void updateActionBarMenu(int dataID) { 641fae11a165e344a38811770c7d348eda214683edcSascha Haeberling LocalData currentData = mDataAdapter.getLocalData(dataID); 642d4f69ed6fa6e302955ce8d0b2a21f47794ce7d64Erin Dahlgren if (currentData == null) { 643d4f69ed6fa6e302955ce8d0b2a21f47794ce7d64Erin Dahlgren return; 644d4f69ed6fa6e302955ce8d0b2a21f47794ce7d64Erin Dahlgren } 645fae11a165e344a38811770c7d348eda214683edcSascha Haeberling int type = currentData.getLocalDataType(); 646fae11a165e344a38811770c7d348eda214683edcSascha Haeberling 6470353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui if (mActionBarMenu == null) { 6480353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui return; 6490353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui } 6500353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui 6510353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui int supported = 0; 6523250987bd014d1c5463b8a39bbe988165ab1cc3fAngus Kong 6530353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui switch (type) { 6540353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui case LocalData.LOCAL_IMAGE: 6550353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui supported |= SUPPORT_DELETE | SUPPORT_ROTATE | SUPPORT_INFO 6560353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui | SUPPORT_CROP | SUPPORT_SETAS | SUPPORT_EDIT 657cd2eeb0efc4370f20e9836e20eb11cb974e3b00dMangesh Ghiware | SUPPORT_SHARE | SUPPORT_SHOW_ON_MAP; 6580353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui break; 6590353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui case LocalData.LOCAL_VIDEO: 660cd2eeb0efc4370f20e9836e20eb11cb974e3b00dMangesh Ghiware supported |= SUPPORT_DELETE | SUPPORT_INFO | SUPPORT_TRIM 661cd2eeb0efc4370f20e9836e20eb11cb974e3b00dMangesh Ghiware | SUPPORT_SHARE; 6620353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui break; 6630353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui case LocalData.LOCAL_PHOTO_SPHERE: 6640353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui supported |= SUPPORT_DELETE | SUPPORT_ROTATE | SUPPORT_INFO 6650353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui | SUPPORT_CROP | SUPPORT_SETAS | SUPPORT_EDIT 666cd2eeb0efc4370f20e9836e20eb11cb974e3b00dMangesh Ghiware | SUPPORT_SHARE | SUPPORT_SHOW_ON_MAP; 667cd2eeb0efc4370f20e9836e20eb11cb974e3b00dMangesh Ghiware break; 668cd2eeb0efc4370f20e9836e20eb11cb974e3b00dMangesh Ghiware case LocalData.LOCAL_360_PHOTO_SPHERE: 669cd2eeb0efc4370f20e9836e20eb11cb974e3b00dMangesh Ghiware supported |= SUPPORT_DELETE | SUPPORT_ROTATE | SUPPORT_INFO 670cd2eeb0efc4370f20e9836e20eb11cb974e3b00dMangesh Ghiware | SUPPORT_CROP | SUPPORT_SETAS | SUPPORT_EDIT 671cd2eeb0efc4370f20e9836e20eb11cb974e3b00dMangesh Ghiware | SUPPORT_SHARE | SUPPORT_SHARE_PANORAMA360 6720353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui | SUPPORT_SHOW_ON_MAP; 6730353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui break; 6740353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui default: 6750353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui break; 6760353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui } 6770353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui 678e941cbeeacac11fbae5ae8b06cc1b311e3f6f36dztenghui // In secure camera mode, we only support delete operation. 679e941cbeeacac11fbae5ae8b06cc1b311e3f6f36dztenghui if (isSecureCamera()) { 680e941cbeeacac11fbae5ae8b06cc1b311e3f6f36dztenghui supported &= SUPPORT_DELETE; 681e941cbeeacac11fbae5ae8b06cc1b311e3f6f36dztenghui } 682e941cbeeacac11fbae5ae8b06cc1b311e3f6f36dztenghui 6830353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui setMenuItemVisible(mActionBarMenu, R.id.action_delete, 6840353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui (supported & SUPPORT_DELETE) != 0); 6850353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui setMenuItemVisible(mActionBarMenu, R.id.action_rotate_ccw, 6860353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui (supported & SUPPORT_ROTATE) != 0); 6870353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui setMenuItemVisible(mActionBarMenu, R.id.action_rotate_cw, 6880353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui (supported & SUPPORT_ROTATE) != 0); 689cd2eeb0efc4370f20e9836e20eb11cb974e3b00dMangesh Ghiware setMenuItemVisible(mActionBarMenu, R.id.action_details, 690cd2eeb0efc4370f20e9836e20eb11cb974e3b00dMangesh Ghiware (supported & SUPPORT_INFO) != 0); 6910353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui setMenuItemVisible(mActionBarMenu, R.id.action_crop, 6920353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui (supported & SUPPORT_CROP) != 0); 6930353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui setMenuItemVisible(mActionBarMenu, R.id.action_setas, 6940353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui (supported & SUPPORT_SETAS) != 0); 6950353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui setMenuItemVisible(mActionBarMenu, R.id.action_edit, 6960353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui (supported & SUPPORT_EDIT) != 0); 697cd2eeb0efc4370f20e9836e20eb11cb974e3b00dMangesh Ghiware setMenuItemVisible(mActionBarMenu, R.id.action_trim, 698cd2eeb0efc4370f20e9836e20eb11cb974e3b00dMangesh Ghiware (supported & SUPPORT_TRIM) != 0); 699cd2eeb0efc4370f20e9836e20eb11cb974e3b00dMangesh Ghiware 70033035c19cc47adfb738c20cef66652ae451c8e10Mangesh Ghiware boolean standardShare = (supported & SUPPORT_SHARE) != 0; 70133035c19cc47adfb738c20cef66652ae451c8e10Mangesh Ghiware boolean panoramaShare = (supported & SUPPORT_SHARE_PANORAMA360) != 0; 70233035c19cc47adfb738c20cef66652ae451c8e10Mangesh Ghiware setMenuItemVisible(mActionBarMenu, R.id.action_share, standardShare); 70333035c19cc47adfb738c20cef66652ae451c8e10Mangesh Ghiware setMenuItemVisible(mActionBarMenu, R.id.action_share_panorama, panoramaShare); 70433035c19cc47adfb738c20cef66652ae451c8e10Mangesh Ghiware 70533035c19cc47adfb738c20cef66652ae451c8e10Mangesh Ghiware if (panoramaShare) { 70633035c19cc47adfb738c20cef66652ae451c8e10Mangesh Ghiware // For 360 PhotoSphere, relegate standard share to the overflow menu 70733035c19cc47adfb738c20cef66652ae451c8e10Mangesh Ghiware MenuItem item = mActionBarMenu.findItem(R.id.action_share); 70833035c19cc47adfb738c20cef66652ae451c8e10Mangesh Ghiware if (item != null) { 70933035c19cc47adfb738c20cef66652ae451c8e10Mangesh Ghiware item.setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER); 71033035c19cc47adfb738c20cef66652ae451c8e10Mangesh Ghiware item.setTitle(getResources().getString(R.string.share_as_photo)); 71133035c19cc47adfb738c20cef66652ae451c8e10Mangesh Ghiware } 71233035c19cc47adfb738c20cef66652ae451c8e10Mangesh Ghiware // And, promote "share as panorama" to action bar 71333035c19cc47adfb738c20cef66652ae451c8e10Mangesh Ghiware item = mActionBarMenu.findItem(R.id.action_share_panorama); 71433035c19cc47adfb738c20cef66652ae451c8e10Mangesh Ghiware if (item != null) { 71533035c19cc47adfb738c20cef66652ae451c8e10Mangesh Ghiware item.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM); 71633035c19cc47adfb738c20cef66652ae451c8e10Mangesh Ghiware } 717cd2eeb0efc4370f20e9836e20eb11cb974e3b00dMangesh Ghiware setPanoramaShareIntent(currentData.getContentUri()); 718cd2eeb0efc4370f20e9836e20eb11cb974e3b00dMangesh Ghiware } 71933035c19cc47adfb738c20cef66652ae451c8e10Mangesh Ghiware if (standardShare) { 72033035c19cc47adfb738c20cef66652ae451c8e10Mangesh Ghiware if (!panoramaShare) { 72133035c19cc47adfb738c20cef66652ae451c8e10Mangesh Ghiware MenuItem item = mActionBarMenu.findItem(R.id.action_share); 72233035c19cc47adfb738c20cef66652ae451c8e10Mangesh Ghiware if (item != null) { 72333035c19cc47adfb738c20cef66652ae451c8e10Mangesh Ghiware item.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM); 72433035c19cc47adfb738c20cef66652ae451c8e10Mangesh Ghiware item.setTitle(getResources().getString(R.string.share)); 72533035c19cc47adfb738c20cef66652ae451c8e10Mangesh Ghiware } 72633035c19cc47adfb738c20cef66652ae451c8e10Mangesh Ghiware } 72733035c19cc47adfb738c20cef66652ae451c8e10Mangesh Ghiware setStandardShareIntent(currentData.getContentUri(), currentData.getMimeType()); 728a5682ab08e1d42fe272ec877929478b4adb769f5Mangesh Ghiware setNfcBeamPushUri(currentData.getContentUri()); 72933035c19cc47adfb738c20cef66652ae451c8e10Mangesh Ghiware } 730fae11a165e344a38811770c7d348eda214683edcSascha Haeberling 731fae11a165e344a38811770c7d348eda214683edcSascha Haeberling boolean itemHasLocation = currentData.getLatLong() != null; 732fae11a165e344a38811770c7d348eda214683edcSascha Haeberling setMenuItemVisible(mActionBarMenu, R.id.action_show_on_map, 733fae11a165e344a38811770c7d348eda214683edcSascha Haeberling itemHasLocation && (supported & SUPPORT_SHOW_ON_MAP) != 0); 7340353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui } 7350353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui 7360353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui private void setMenuItemVisible(Menu menu, int itemId, boolean visible) { 7370353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui MenuItem item = menu.findItem(itemId); 7380353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui if (item != null) 7390353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui item.setVisible(visible); 7400353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui } 7410353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui 7427cfcafdf8f4a439c8fa87b612616fe409979e8a4Ruben Brunk private ImageTaskManager.TaskListener mPlaceholderListener = 7437cfcafdf8f4a439c8fa87b612616fe409979e8a4Ruben Brunk new ImageTaskManager.TaskListener() { 7447cfcafdf8f4a439c8fa87b612616fe409979e8a4Ruben Brunk 7457cfcafdf8f4a439c8fa87b612616fe409979e8a4Ruben Brunk @Override 7467cfcafdf8f4a439c8fa87b612616fe409979e8a4Ruben Brunk public void onTaskQueued(String filePath, final Uri imageUri) { 7477cfcafdf8f4a439c8fa87b612616fe409979e8a4Ruben Brunk mMainHandler.post(new Runnable() { 7487cfcafdf8f4a439c8fa87b612616fe409979e8a4Ruben Brunk @Override 7497cfcafdf8f4a439c8fa87b612616fe409979e8a4Ruben Brunk public void run() { 7507cfcafdf8f4a439c8fa87b612616fe409979e8a4Ruben Brunk notifyNewMedia(imageUri); 7517cfcafdf8f4a439c8fa87b612616fe409979e8a4Ruben Brunk int dataID = mDataAdapter.findDataByContentUri(imageUri); 7527cfcafdf8f4a439c8fa87b612616fe409979e8a4Ruben Brunk if (dataID != -1) { 7537cfcafdf8f4a439c8fa87b612616fe409979e8a4Ruben Brunk LocalData d = mDataAdapter.getLocalData(dataID); 7547cfcafdf8f4a439c8fa87b612616fe409979e8a4Ruben Brunk InProgressDataWrapper newData = new InProgressDataWrapper(d, true); 7557cfcafdf8f4a439c8fa87b612616fe409979e8a4Ruben Brunk mDataAdapter.updateData(dataID, newData); 7567cfcafdf8f4a439c8fa87b612616fe409979e8a4Ruben Brunk } 7577cfcafdf8f4a439c8fa87b612616fe409979e8a4Ruben Brunk } 7587cfcafdf8f4a439c8fa87b612616fe409979e8a4Ruben Brunk }); 7597cfcafdf8f4a439c8fa87b612616fe409979e8a4Ruben Brunk } 7607cfcafdf8f4a439c8fa87b612616fe409979e8a4Ruben Brunk 7617cfcafdf8f4a439c8fa87b612616fe409979e8a4Ruben Brunk @Override 7627cfcafdf8f4a439c8fa87b612616fe409979e8a4Ruben Brunk public void onTaskDone(String filePath, final Uri imageUri) { 7637cfcafdf8f4a439c8fa87b612616fe409979e8a4Ruben Brunk mMainHandler.post(new Runnable() { 7647cfcafdf8f4a439c8fa87b612616fe409979e8a4Ruben Brunk @Override 7657cfcafdf8f4a439c8fa87b612616fe409979e8a4Ruben Brunk public void run() { 7667cfcafdf8f4a439c8fa87b612616fe409979e8a4Ruben Brunk mDataAdapter.refresh(getContentResolver(), imageUri); 7677cfcafdf8f4a439c8fa87b612616fe409979e8a4Ruben Brunk } 7687cfcafdf8f4a439c8fa87b612616fe409979e8a4Ruben Brunk }); 7697cfcafdf8f4a439c8fa87b612616fe409979e8a4Ruben Brunk } 7707cfcafdf8f4a439c8fa87b612616fe409979e8a4Ruben Brunk 7717cfcafdf8f4a439c8fa87b612616fe409979e8a4Ruben Brunk @Override 7727cfcafdf8f4a439c8fa87b612616fe409979e8a4Ruben Brunk public void onTaskProgress(String filePath, Uri imageUri, int progress) { 7737cfcafdf8f4a439c8fa87b612616fe409979e8a4Ruben Brunk // Do nothing 7747cfcafdf8f4a439c8fa87b612616fe409979e8a4Ruben Brunk } 7757cfcafdf8f4a439c8fa87b612616fe409979e8a4Ruben Brunk }; 7767cfcafdf8f4a439c8fa87b612616fe409979e8a4Ruben Brunk 7776798c34ddb5248f038f351674c6a6c7a20992c8cAngus Kong private ImageTaskManager.TaskListener mStitchingListener = 7786798c34ddb5248f038f351674c6a6c7a20992c8cAngus Kong new ImageTaskManager.TaskListener() { 7796798c34ddb5248f038f351674c6a6c7a20992c8cAngus Kong @Override 78037f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling public void onTaskQueued(String filePath, final Uri imageUri) { 78137f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling mMainHandler.post(new Runnable() { 78237f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling @Override 78337f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling public void run() { 78437f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling notifyNewMedia(imageUri); 7853250987bd014d1c5463b8a39bbe988165ab1cc3fAngus Kong int dataID = mDataAdapter.findDataByContentUri(imageUri); 7863250987bd014d1c5463b8a39bbe988165ab1cc3fAngus Kong if (dataID != -1) { 7873250987bd014d1c5463b8a39bbe988165ab1cc3fAngus Kong // Don't allow special UI actions (swipe to 7883250987bd014d1c5463b8a39bbe988165ab1cc3fAngus Kong // delete, for example) on in-progress data. 7893250987bd014d1c5463b8a39bbe988165ab1cc3fAngus Kong LocalData d = mDataAdapter.getLocalData(dataID); 7903250987bd014d1c5463b8a39bbe988165ab1cc3fAngus Kong InProgressDataWrapper newData = new InProgressDataWrapper(d); 7913250987bd014d1c5463b8a39bbe988165ab1cc3fAngus Kong mDataAdapter.updateData(dataID, newData); 7923250987bd014d1c5463b8a39bbe988165ab1cc3fAngus Kong } 79337f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling } 79437f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling }); 7956798c34ddb5248f038f351674c6a6c7a20992c8cAngus Kong } 7966798c34ddb5248f038f351674c6a6c7a20992c8cAngus Kong 7976798c34ddb5248f038f351674c6a6c7a20992c8cAngus Kong @Override 79837f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling public void onTaskDone(String filePath, final Uri imageUri) { 79937f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling Log.v(TAG, "onTaskDone:" + filePath); 80037f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling mMainHandler.post(new Runnable() { 80137f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling @Override 80237f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling public void run() { 80337f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling int doneID = mDataAdapter.findDataByContentUri(imageUri); 80437f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling int currentDataId = mFilmStripView.getCurrentId(); 80537f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling 80637f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling if (currentDataId == doneID) { 80737f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling hidePanoStitchingProgress(); 80837f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling updateStitchingProgress(0); 80937f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling } 81037f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling 81137f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling mDataAdapter.refresh(getContentResolver(), imageUri); 81237f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling } 81337f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling }); 8146798c34ddb5248f038f351674c6a6c7a20992c8cAngus Kong } 8156798c34ddb5248f038f351674c6a6c7a20992c8cAngus Kong 8166798c34ddb5248f038f351674c6a6c7a20992c8cAngus Kong @Override 8176798c34ddb5248f038f351674c6a6c7a20992c8cAngus Kong public void onTaskProgress( 81837f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling String filePath, final Uri imageUri, final int progress) { 81937f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling mMainHandler.post(new Runnable() { 82037f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling @Override 82137f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling public void run() { 82237f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling int currentDataId = mFilmStripView.getCurrentId(); 82337f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling if (currentDataId == -1) { 82437f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling return; 82537f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling } 82637f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling if (imageUri.equals( 82737f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling mDataAdapter.getLocalData(currentDataId).getContentUri())) { 82837f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling updateStitchingProgress(progress); 82937f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling } 83037f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling } 83137f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling }); 8326798c34ddb5248f038f351674c6a6c7a20992c8cAngus Kong } 8336798c34ddb5248f038f351674c6a6c7a20992c8cAngus Kong }; 8346798c34ddb5248f038f351674c6a6c7a20992c8cAngus Kong 8356432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu public MediaSaveService getMediaSaveService() { 8366432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu return mMediaSaveService; 8378872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 8388872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 8396432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu public void notifyNewMedia(Uri uri) { 8406432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu ContentResolver cr = getContentResolver(); 8416432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu String mimeType = cr.getType(uri); 8426432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu if (mimeType.startsWith("video/")) { 843b50b5cbfbc0a67db6fc43373363b10381c9c61a3Angus Kong sendBroadcast(new Intent(CameraUtil.ACTION_NEW_VIDEO, uri)); 8446432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu mDataAdapter.addNewVideo(cr, uri); 8456432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu } else if (mimeType.startsWith("image/")) { 846b50b5cbfbc0a67db6fc43373363b10381c9c61a3Angus Kong CameraUtil.broadcastNewPicture(this, uri); 8476432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu mDataAdapter.addNewPhoto(cr, uri); 84837f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling } else if (mimeType.startsWith("application/stitching-preview")) { 84937f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling mDataAdapter.addNewPhoto(cr, uri); 8507cfcafdf8f4a439c8fa87b612616fe409979e8a4Ruben Brunk } else if (mimeType.startsWith(PlaceholderManager.PLACEHOLDER_MIME_TYPE)) { 8517cfcafdf8f4a439c8fa87b612616fe409979e8a4Ruben Brunk mDataAdapter.addNewPhoto(cr, uri); 8526432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu } else { 8536432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu android.util.Log.w(TAG, "Unknown new media with MIME type:" 8546432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu + mimeType + ", uri:" + uri); 8556432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu } 8568872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 8578872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 8586432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu private void removeData(int dataID) { 8596432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu mDataAdapter.removeData(CameraActivity.this, dataID); 860742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu if (mDataAdapter.getTotalNumber() > 1) { 861742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu showUndoDeletionBar(); 862742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu } else { 863742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu // If camera preview is the only view left in filmstrip, 864742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu // no need to show undo bar. 865f2c14330a49abb55f75bfae6b3bae67a0dad115bDoris Liu mPendingDeletion = true; 866742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu performDeletion(); 867742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu } 8688872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 8698872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 8706432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu private void bindMediaSaveService() { 8716432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu Intent intent = new Intent(this, MediaSaveService.class); 8726432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu bindService(intent, mConnection, Context.BIND_AUTO_CREATE); 8738872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 8748872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 8756432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu private void unbindMediaSaveService() { 8766432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu if (mConnection != null) { 8776432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu unbindService(mConnection); 8786432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu } 8798872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 8808872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 8816432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu @Override 8820353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui public boolean onCreateOptionsMenu(Menu menu) { 8830353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui // Inflate the menu items for use in the action bar 8840353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui MenuInflater inflater = getMenuInflater(); 8850353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui inflater.inflate(R.menu.operations, menu); 8860353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui mActionBarMenu = menu; 887cd2eeb0efc4370f20e9836e20eb11cb974e3b00dMangesh Ghiware 888cd2eeb0efc4370f20e9836e20eb11cb974e3b00dMangesh Ghiware // Configure the standard share action provider 889cd2eeb0efc4370f20e9836e20eb11cb974e3b00dMangesh Ghiware MenuItem item = menu.findItem(R.id.action_share); 890cd2eeb0efc4370f20e9836e20eb11cb974e3b00dMangesh Ghiware mStandardShareActionProvider = (ShareActionProvider) item.getActionProvider(); 89133035c19cc47adfb738c20cef66652ae451c8e10Mangesh Ghiware mStandardShareActionProvider.setShareHistoryFileName("standard_share_history.xml"); 892cd2eeb0efc4370f20e9836e20eb11cb974e3b00dMangesh Ghiware if (mStandardShareIntent != null) { 893cd2eeb0efc4370f20e9836e20eb11cb974e3b00dMangesh Ghiware mStandardShareActionProvider.setShareIntent(mStandardShareIntent); 894cd2eeb0efc4370f20e9836e20eb11cb974e3b00dMangesh Ghiware } 895cd2eeb0efc4370f20e9836e20eb11cb974e3b00dMangesh Ghiware 896cd2eeb0efc4370f20e9836e20eb11cb974e3b00dMangesh Ghiware // Configure the panorama share action provider 897cd2eeb0efc4370f20e9836e20eb11cb974e3b00dMangesh Ghiware item = menu.findItem(R.id.action_share_panorama); 898cd2eeb0efc4370f20e9836e20eb11cb974e3b00dMangesh Ghiware mPanoramaShareActionProvider = (ShareActionProvider) item.getActionProvider(); 89933035c19cc47adfb738c20cef66652ae451c8e10Mangesh Ghiware mPanoramaShareActionProvider.setShareHistoryFileName("panorama_share_history.xml"); 900cd2eeb0efc4370f20e9836e20eb11cb974e3b00dMangesh Ghiware if (mPanoramaShareIntent != null) { 901cd2eeb0efc4370f20e9836e20eb11cb974e3b00dMangesh Ghiware mPanoramaShareActionProvider.setShareIntent(mPanoramaShareIntent); 902cd2eeb0efc4370f20e9836e20eb11cb974e3b00dMangesh Ghiware } 903cd2eeb0efc4370f20e9836e20eb11cb974e3b00dMangesh Ghiware 904cbd8267ee99e457f72822e8d8187b5e6823104f8Seth Raphael mStandardShareActionProvider.setOnShareTargetSelectedListener(this); 905cbd8267ee99e457f72822e8d8187b5e6823104f8Seth Raphael mPanoramaShareActionProvider.setOnShareTargetSelectedListener(this); 906cbd8267ee99e457f72822e8d8187b5e6823104f8Seth Raphael 9070353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui return super.onCreateOptionsMenu(menu); 9080353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui } 9090353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui 9100353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui @Override 9110353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui public boolean onOptionsItemSelected(MenuItem item) { 9126f64b50db6565bc6454304fd20c0c4020b297bb7Sascha Haeberling int currentDataId = mFilmStripView.getCurrentId(); 9136f64b50db6565bc6454304fd20c0c4020b297bb7Sascha Haeberling if (currentDataId < 0) { 9146f64b50db6565bc6454304fd20c0c4020b297bb7Sascha Haeberling return false; 9156f64b50db6565bc6454304fd20c0c4020b297bb7Sascha Haeberling } 9166f64b50db6565bc6454304fd20c0c4020b297bb7Sascha Haeberling final LocalData localData = mDataAdapter.getLocalData(currentDataId); 9176f64b50db6565bc6454304fd20c0c4020b297bb7Sascha Haeberling 9180353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui // Handle presses on the action bar items 9190353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui switch (item.getItemId()) { 9203f969c1735e2636bf22dfe44104d0e99924cca97Alan Newberger case android.R.id.home: 9213f969c1735e2636bf22dfe44104d0e99924cca97Alan Newberger // ActionBar's Up/Home button was clicked 92230968d0f9a5094d62de1fb023b8bf7dc3202ebafMangesh Ghiware try { 923761306fadfa94b538f43e8cf3463bf6d22814947Alan Newberger startActivity(IntentHelper.getGalleryIntent(this)); 92430968d0f9a5094d62de1fb023b8bf7dc3202ebafMangesh Ghiware return true; 92530968d0f9a5094d62de1fb023b8bf7dc3202ebafMangesh Ghiware } catch (ActivityNotFoundException e) { 926761306fadfa94b538f43e8cf3463bf6d22814947Alan Newberger Log.w(TAG, "Failed to launch gallery activity, closing"); 92730968d0f9a5094d62de1fb023b8bf7dc3202ebafMangesh Ghiware finish(); 9285df64b0a818d4f85cb14602db725f05b0055c1d9Mangesh Ghiware } 9290353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui case R.id.action_delete: 930cbd8267ee99e457f72822e8d8187b5e6823104f8Seth Raphael UsageStatistics.onEvent(UsageStatistics.COMPONENT_CAMERA, 931cbd8267ee99e457f72822e8d8187b5e6823104f8Seth Raphael UsageStatistics.ACTION_DELETE, null, 0, 932cbd8267ee99e457f72822e8d8187b5e6823104f8Seth Raphael UsageStatistics.hashFileName(fileNameFromDataID(currentDataId))); 933e857cc90a98e280e2008beb03e2446bd642d2ec4Angus Kong removeData(currentDataId); 9340353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui return true; 9350353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui case R.id.action_edit: 936cbd8267ee99e457f72822e8d8187b5e6823104f8Seth Raphael UsageStatistics.onEvent(UsageStatistics.COMPONENT_CAMERA, 937cbd8267ee99e457f72822e8d8187b5e6823104f8Seth Raphael UsageStatistics.ACTION_EDIT, null, 0, 938cbd8267ee99e457f72822e8d8187b5e6823104f8Seth Raphael UsageStatistics.hashFileName(fileNameFromDataID(currentDataId))); 93988ef7664ba6a888fa5da8693091674e152b56192Sascha Haeberling launchEditor(localData); 9400353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui return true; 9410819304bc06ffd3498d9fd0d8a148c50f0903c46nicolasroard case R.id.action_trim: { 9426b9203214d828d72758943aca55adceab684a862ztenghui // This is going to be handled by the Gallery app. 9436b9203214d828d72758943aca55adceab684a862ztenghui Intent intent = new Intent(ACTION_TRIM_VIDEO); 9446b9203214d828d72758943aca55adceab684a862ztenghui LocalData currentData = mDataAdapter.getLocalData( 9456b9203214d828d72758943aca55adceab684a862ztenghui mFilmStripView.getCurrentId()); 9466b9203214d828d72758943aca55adceab684a862ztenghui intent.setData(currentData.getContentUri()); 9476b9203214d828d72758943aca55adceab684a862ztenghui // We need the file path to wrap this into a RandomAccessFile. 9486b9203214d828d72758943aca55adceab684a862ztenghui intent.putExtra(MEDIA_ITEM_PATH, currentData.getPath()); 949b7639c641f2ed5d0c60546349c3aa9e90c026878Sascha Haeberling startActivityForResult(intent, REQ_CODE_DONT_SWITCH_TO_PREVIEW); 9500353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui return true; 9510819304bc06ffd3498d9fd0d8a148c50f0903c46nicolasroard } 9520353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui case R.id.action_rotate_ccw: 953a16e7b50f3148f581439509279f242092e254309ztenghui localData.rotate90Degrees(this, mDataAdapter, currentDataId, false); 9540353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui return true; 9550353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui case R.id.action_rotate_cw: 956a16e7b50f3148f581439509279f242092e254309ztenghui localData.rotate90Degrees(this, mDataAdapter, currentDataId, true); 9570353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui return true; 95819ab725a5e640a1a20b1a6def083e37d1d1c1e20nicolasroard case R.id.action_crop: { 959cbd8267ee99e457f72822e8d8187b5e6823104f8Seth Raphael UsageStatistics.onEvent(UsageStatistics.COMPONENT_CAMERA, 960cbd8267ee99e457f72822e8d8187b5e6823104f8Seth Raphael UsageStatistics.ACTION_CROP, null, 0, 961cbd8267ee99e457f72822e8d8187b5e6823104f8Seth Raphael UsageStatistics.hashFileName(fileNameFromDataID(currentDataId))); 96219ab725a5e640a1a20b1a6def083e37d1d1c1e20nicolasroard Intent intent = new Intent(CropActivity.CROP_ACTION); 96319ab725a5e640a1a20b1a6def083e37d1d1c1e20nicolasroard intent.setClass(this, CropActivity.class); 96419ab725a5e640a1a20b1a6def083e37d1d1c1e20nicolasroard intent.setDataAndType(localData.getContentUri(), localData.getMimeType()) 96519ab725a5e640a1a20b1a6def083e37d1d1c1e20nicolasroard .setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); 96619ab725a5e640a1a20b1a6def083e37d1d1c1e20nicolasroard startActivityForResult(intent, REQ_CODE_DONT_SWITCH_TO_PREVIEW); 9670353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui return true; 96819ab725a5e640a1a20b1a6def083e37d1d1c1e20nicolasroard } 9690819304bc06ffd3498d9fd0d8a148c50f0903c46nicolasroard case R.id.action_setas: { 9700819304bc06ffd3498d9fd0d8a148c50f0903c46nicolasroard Intent intent = new Intent(Intent.ACTION_ATTACH_DATA) 9710819304bc06ffd3498d9fd0d8a148c50f0903c46nicolasroard .setDataAndType(localData.getContentUri(), 9720819304bc06ffd3498d9fd0d8a148c50f0903c46nicolasroard localData.getMimeType()) 9730819304bc06ffd3498d9fd0d8a148c50f0903c46nicolasroard .setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); 9740819304bc06ffd3498d9fd0d8a148c50f0903c46nicolasroard intent.putExtra("mimeType", intent.getType()); 975b7639c641f2ed5d0c60546349c3aa9e90c026878Sascha Haeberling startActivityForResult(Intent.createChooser( 976b7639c641f2ed5d0c60546349c3aa9e90c026878Sascha Haeberling intent, getString(R.string.set_as)), REQ_CODE_DONT_SWITCH_TO_PREVIEW); 9770353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui return true; 9780819304bc06ffd3498d9fd0d8a148c50f0903c46nicolasroard } 9790353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui case R.id.action_details: 9806f64b50db6565bc6454304fd20c0c4020b297bb7Sascha Haeberling (new AsyncTask<Void, Void, MediaDetails>() { 9816f64b50db6565bc6454304fd20c0c4020b297bb7Sascha Haeberling @Override 9826f64b50db6565bc6454304fd20c0c4020b297bb7Sascha Haeberling protected MediaDetails doInBackground(Void... params) { 9836f64b50db6565bc6454304fd20c0c4020b297bb7Sascha Haeberling return localData.getMediaDetails(CameraActivity.this); 9846f64b50db6565bc6454304fd20c0c4020b297bb7Sascha Haeberling } 9856f64b50db6565bc6454304fd20c0c4020b297bb7Sascha Haeberling 9866f64b50db6565bc6454304fd20c0c4020b297bb7Sascha Haeberling @Override 9876f64b50db6565bc6454304fd20c0c4020b297bb7Sascha Haeberling protected void onPostExecute(MediaDetails mediaDetails) { 98864cea6aadb912067e31f1a158044c5efeb3e64afSascha Haeberling if (mediaDetails != null) { 98964cea6aadb912067e31f1a158044c5efeb3e64afSascha Haeberling DetailsDialog.create(CameraActivity.this, mediaDetails).show(); 99064cea6aadb912067e31f1a158044c5efeb3e64afSascha Haeberling } 9916f64b50db6565bc6454304fd20c0c4020b297bb7Sascha Haeberling } 9926f64b50db6565bc6454304fd20c0c4020b297bb7Sascha Haeberling }).execute(); 9930353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui return true; 9940353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui case R.id.action_show_on_map: 995fae11a165e344a38811770c7d348eda214683edcSascha Haeberling double[] latLong = localData.getLatLong(); 996fae11a165e344a38811770c7d348eda214683edcSascha Haeberling if (latLong != null) { 997a5a08d7642a1fdf961b057cc90e76c4c93103c15Sascha Haeberling CameraUtil.showOnMap(this, latLong); 998fae11a165e344a38811770c7d348eda214683edcSascha Haeberling } 9990353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui return true; 10000353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui default: 10010353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui return super.onOptionsItemSelected(item); 10020353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui } 10030353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui } 10040353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui 1005fd43e3be3d69f48a97bdd9084e9549f41e963cc2ztenghui private boolean isCaptureIntent() { 1006fd43e3be3d69f48a97bdd9084e9549f41e963cc2ztenghui if (MediaStore.ACTION_VIDEO_CAPTURE.equals(getIntent().getAction()) 1007fd43e3be3d69f48a97bdd9084e9549f41e963cc2ztenghui || MediaStore.ACTION_IMAGE_CAPTURE.equals(getIntent().getAction()) 1008fd43e3be3d69f48a97bdd9084e9549f41e963cc2ztenghui || MediaStore.ACTION_IMAGE_CAPTURE_SECURE.equals(getIntent().getAction())) { 1009fd43e3be3d69f48a97bdd9084e9549f41e963cc2ztenghui return true; 1010fd43e3be3d69f48a97bdd9084e9549f41e963cc2ztenghui } else { 1011fd43e3be3d69f48a97bdd9084e9549f41e963cc2ztenghui return false; 1012fd43e3be3d69f48a97bdd9084e9549f41e963cc2ztenghui } 1013fd43e3be3d69f48a97bdd9084e9549f41e963cc2ztenghui } 1014fd43e3be3d69f48a97bdd9084e9549f41e963cc2ztenghui 10150353ca2e048543bd6e233b4c2110a1df1070cd3fztenghui @Override 10166432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu public void onCreate(Bundle state) { 10176432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu super.onCreate(state); 1018048bf4d0b46c4c34d8caa801c8ddc8c1ff4e79cfSascha Haeberling GcamHelper.init(getContentResolver()); 1019048bf4d0b46c4c34d8caa801c8ddc8c1ff4e79cfSascha Haeberling 102050df47071c776703a36dbc4cb90ec8d1df3c0f6eztenghui getWindow().requestFeature(Window.FEATURE_ACTION_BAR); 10216432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu setContentView(R.layout.camera_filmstrip); 1022fa9e2cc9ccbcd746f5765cb7a0afebcdb60e2973ztenghui mActionBar = getActionBar(); 1023aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu mActionBar.addOnMenuVisibilityListener(this); 1024fa9e2cc9ccbcd746f5765cb7a0afebcdb60e2973ztenghui 10256432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu if (ApiHelper.HAS_ROTATION_ANIMATION) { 10266432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu setRotationAnimation(); 10276432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu } 1028aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu 1029aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu mMainHandler = new MainHandler(getMainLooper()); 10306432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu // Check if this is in the secure camera mode. 10316432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu Intent intent = getIntent(); 10326432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu String action = intent.getAction(); 1033b84b9738c855a525dc1944165983cc3c342ce446Doris Liu if (INTENT_ACTION_STILL_IMAGE_CAMERA_SECURE.equals(action) 1034b84b9738c855a525dc1944165983cc3c342ce446Doris Liu || ACTION_IMAGE_CAPTURE_SECURE.equals(action)) { 10356432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu mSecureCamera = true; 10366432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu } else { 10376432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu mSecureCamera = intent.getBooleanExtra(SECURE_CAMERA_EXTRA, false); 10388872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 1039b84b9738c855a525dc1944165983cc3c342ce446Doris Liu 1040b84b9738c855a525dc1944165983cc3c342ce446Doris Liu if (mSecureCamera) { 1041b84b9738c855a525dc1944165983cc3c342ce446Doris Liu // Change the window flags so that secure camera can show when locked 1042b84b9738c855a525dc1944165983cc3c342ce446Doris Liu Window win = getWindow(); 1043b84b9738c855a525dc1944165983cc3c342ce446Doris Liu WindowManager.LayoutParams params = win.getAttributes(); 1044b84b9738c855a525dc1944165983cc3c342ce446Doris Liu params.flags |= WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED; 1045b84b9738c855a525dc1944165983cc3c342ce446Doris Liu win.setAttributes(params); 1046b84b9738c855a525dc1944165983cc3c342ce446Doris Liu 1047b84b9738c855a525dc1944165983cc3c342ce446Doris Liu // Filter for screen off so that we can finish secure camera activity 1048b84b9738c855a525dc1944165983cc3c342ce446Doris Liu // when screen is off. 10496432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu IntentFilter filter = new IntentFilter(Intent.ACTION_SCREEN_OFF); 10506432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu registerReceiver(mScreenOffReceiver, filter); 10516a8e8a1a0f3e8e62cd350733e275047475380d6bAngus Kong // TODO: This static screen off event receiver is a workaround to the 10526a8e8a1a0f3e8e62cd350733e275047475380d6bAngus Kong // double onResume() invocation (onResume->onPause->onResume). We should 10536a8e8a1a0f3e8e62cd350733e275047475380d6bAngus Kong // find a better solution to this. 10546a8e8a1a0f3e8e62cd350733e275047475380d6bAngus Kong if (sScreenOffReceiver == null) { 10556a8e8a1a0f3e8e62cd350733e275047475380d6bAngus Kong sScreenOffReceiver = new ScreenOffReceiver(); 10566a8e8a1a0f3e8e62cd350733e275047475380d6bAngus Kong registerReceiver(sScreenOffReceiver, filter); 10576a8e8a1a0f3e8e62cd350733e275047475380d6bAngus Kong } 1058b84b9738c855a525dc1944165983cc3c342ce446Doris Liu } 1059653c43be6e58be54cf2ac3c8efb2d65ac20bd03bAngus Kong mAboveFilmstripControlLayout = 1060653c43be6e58be54cf2ac3c8efb2d65ac20bd03bAngus Kong (FrameLayout) findViewById(R.id.camera_above_filmstrip_layout); 1061653c43be6e58be54cf2ac3c8efb2d65ac20bd03bAngus Kong mAboveFilmstripControlLayout.setFitsSystemWindows(true); 10625199c2078f3aea06732015ce8ad354c066a2f4ecSascha Haeberling // Hide action bar first since we are in full screen mode first, and 10635199c2078f3aea06732015ce8ad354c066a2f4ecSascha Haeberling // switch the system UI to lights-out mode. 1064aa8744284864cda5570e8dfa4eccc2747cee52dcDoris Liu this.setSystemBarsVisibility(false); 1065ed15d1a140986473bbe7fffd72ec9618c41c5979Angus Kong mPanoramaManager = AppManagerFactory.getInstance(this) 1066ed15d1a140986473bbe7fffd72ec9618c41c5979Angus Kong .getPanoramaStitchingManager(); 10677cfcafdf8f4a439c8fa87b612616fe409979e8a4Ruben Brunk mPlaceholderManager = AppManagerFactory.getInstance(this) 10687cfcafdf8f4a439c8fa87b612616fe409979e8a4Ruben Brunk .getGcamProcessingManager(); 10696798c34ddb5248f038f351674c6a6c7a20992c8cAngus Kong mPanoramaManager.addTaskListener(mStitchingListener); 10707cfcafdf8f4a439c8fa87b612616fe409979e8a4Ruben Brunk mPlaceholderManager.addTaskListener(mPlaceholderListener); 10716432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu LayoutInflater inflater = getLayoutInflater(); 10726432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu View rootLayout = inflater.inflate(R.layout.camera, null, false); 1073653c43be6e58be54cf2ac3c8efb2d65ac20bd03bAngus Kong mCameraModuleRootView = rootLayout.findViewById(R.id.camera_app_root); 1074fa9e2cc9ccbcd746f5765cb7a0afebcdb60e2973ztenghui mPanoStitchingPanel = findViewById(R.id.pano_stitching_progress_panel); 107537f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling mBottomProgress = (ProgressBar) findViewById(R.id.pano_stitching_progress_bar); 10768e5e4eedb25a4589342660b928935acca4375fc7Angus Kong mCameraPreviewData = new CameraPreviewData(rootLayout, 10778e5e4eedb25a4589342660b928935acca4375fc7Angus Kong FilmStripView.ImageData.SIZE_FULL, 10788e5e4eedb25a4589342660b928935acca4375fc7Angus Kong FilmStripView.ImageData.SIZE_FULL); 107937f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling // Put a CameraPreviewData at the first position. 10808e5e4eedb25a4589342660b928935acca4375fc7Angus Kong mWrappedDataAdapter = new FixedFirstDataAdapter( 10818e5e4eedb25a4589342660b928935acca4375fc7Angus Kong new CameraDataAdapter(new ColorDrawable( 10828e5e4eedb25a4589342660b928935acca4375fc7Angus Kong getResources().getColor(R.color.photo_placeholder))), 10838e5e4eedb25a4589342660b928935acca4375fc7Angus Kong mCameraPreviewData); 10846432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu mFilmStripView = (FilmStripView) findViewById(R.id.filmstrip_view); 10856432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu mFilmStripView.setViewGap( 10866432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu getResources().getDimensionPixelSize(R.dimen.camera_film_strip_gap)); 1087f1f5186f7d3fd8bf35009d9e65a43914c664d82bSascha Haeberling mPanoramaViewHelper = new PanoramaViewHelper(this); 1088f1f5186f7d3fd8bf35009d9e65a43914c664d82bSascha Haeberling mPanoramaViewHelper.onCreate(); 1089f1f5186f7d3fd8bf35009d9e65a43914c664d82bSascha Haeberling mFilmStripView.setPanoramaViewHelper(mPanoramaViewHelper); 10906432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu // Set up the camera preview first so the preview shows up ASAP. 10916432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu mFilmStripView.setListener(mFilmStripListener); 10922654dd9bb6a7d917dab1a48e2182c4f49fe71f11Sascha Haeberling 10932654dd9bb6a7d917dab1a48e2182c4f49fe71f11Sascha Haeberling int moduleIndex = -1; 10942a7f44cac888de5683d05bef5708f846ee950f43Doris Liu if (MediaStore.INTENT_ACTION_VIDEO_CAMERA.equals(getIntent().getAction()) 10952a7f44cac888de5683d05bef5708f846ee950f43Doris Liu || MediaStore.ACTION_VIDEO_CAPTURE.equals(getIntent().getAction())) { 1096ed15d1a140986473bbe7fffd72ec9618c41c5979Angus Kong moduleIndex = ModuleSwitcher.VIDEO_MODULE_INDEX; 10972654dd9bb6a7d917dab1a48e2182c4f49fe71f11Sascha Haeberling } else if (MediaStore.INTENT_ACTION_STILL_IMAGE_CAMERA.equals(getIntent().getAction()) 10982654dd9bb6a7d917dab1a48e2182c4f49fe71f11Sascha Haeberling || MediaStore.INTENT_ACTION_STILL_IMAGE_CAMERA_SECURE.equals(getIntent() 10992654dd9bb6a7d917dab1a48e2182c4f49fe71f11Sascha Haeberling .getAction()) 11002654dd9bb6a7d917dab1a48e2182c4f49fe71f11Sascha Haeberling || MediaStore.ACTION_IMAGE_CAPTURE.equals(getIntent().getAction()) 11012654dd9bb6a7d917dab1a48e2182c4f49fe71f11Sascha Haeberling || MediaStore.ACTION_IMAGE_CAPTURE_SECURE.equals(getIntent().getAction())) { 1102ed15d1a140986473bbe7fffd72ec9618c41c5979Angus Kong moduleIndex = ModuleSwitcher.PHOTO_MODULE_INDEX; 11032a7f44cac888de5683d05bef5708f846ee950f43Doris Liu } else { 11042654dd9bb6a7d917dab1a48e2182c4f49fe71f11Sascha Haeberling // If the activity has not been started using an explicit intent, 11052654dd9bb6a7d917dab1a48e2182c4f49fe71f11Sascha Haeberling // read the module index from the last time the user changed modes 11062654dd9bb6a7d917dab1a48e2182c4f49fe71f11Sascha Haeberling SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this); 11070fb819b4619cd4ac20f9d381739e444da011d4edAngus Kong moduleIndex = prefs.getInt(CameraSettings.KEY_STARTUP_MODULE_INDEX, -1); 1108a9d66bdab247626b31dc182c4d62520b3abffdbdRuben Brunk if ((moduleIndex == ModuleSwitcher.GCAM_MODULE_INDEX && 110998f38bb04daa3db49a072718cd8b5005b8b73af1Sascha Haeberling !GcamHelper.hasGcamCapture()) || moduleIndex < 0) { 1110ed15d1a140986473bbe7fffd72ec9618c41c5979Angus Kong moduleIndex = ModuleSwitcher.PHOTO_MODULE_INDEX; 11112654dd9bb6a7d917dab1a48e2182c4f49fe71f11Sascha Haeberling } 11122a7f44cac888de5683d05bef5708f846ee950f43Doris Liu } 11132654dd9bb6a7d917dab1a48e2182c4f49fe71f11Sascha Haeberling 11146432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu mOrientationListener = new MyOrientationEventListener(this); 1115ed15d1a140986473bbe7fffd72ec9618c41c5979Angus Kong setModuleFromIndex(moduleIndex); 1116ed15d1a140986473bbe7fffd72ec9618c41c5979Angus Kong mCurrentModule.init(this, mCameraModuleRootView); 111737f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling 111837f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling if (!mSecureCamera) { 111937f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling mDataAdapter = mWrappedDataAdapter; 1120dcccc510652b835fdbd39310a07849af8203052aAngus Kong mFilmStripView.setDataAdapter(mDataAdapter); 1121a71946012df0eee8fe4859a22da3c56feba0344eAngus Kong if (!isCaptureIntent()) { 1122a71946012df0eee8fe4859a22da3c56feba0344eAngus Kong mDataAdapter.requestLoad(getContentResolver()); 1123a71946012df0eee8fe4859a22da3c56feba0344eAngus Kong } 112437f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling } else { 1125a5a08d7642a1fdf961b057cc90e76c4c93103c15Sascha Haeberling // Put a lock placeholder as the last image by setting its date to 1126a5a08d7642a1fdf961b057cc90e76c4c93103c15Sascha Haeberling // 0. 112737f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling ImageView v = (ImageView) getLayoutInflater().inflate( 112837f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling R.layout.secure_album_placeholder, null); 1129690dc4722d068a1838b16dc0eabe9c7d518d524cAngus Kong v.setOnClickListener(new View.OnClickListener() { 1130690dc4722d068a1838b16dc0eabe9c7d518d524cAngus Kong @Override 1131690dc4722d068a1838b16dc0eabe9c7d518d524cAngus Kong public void onClick(View view) { 1132761306fadfa94b538f43e8cf3463bf6d22814947Alan Newberger try { 1133cbd8267ee99e457f72822e8d8187b5e6823104f8Seth Raphael UsageStatistics.onEvent(UsageStatistics.COMPONENT_CAMERA, 1134cbd8267ee99e457f72822e8d8187b5e6823104f8Seth Raphael UsageStatistics.ACTION_GALLERY, null); 1135761306fadfa94b538f43e8cf3463bf6d22814947Alan Newberger startActivity(IntentHelper.getGalleryIntent(CameraActivity.this)); 1136761306fadfa94b538f43e8cf3463bf6d22814947Alan Newberger } catch (ActivityNotFoundException e) { 1137761306fadfa94b538f43e8cf3463bf6d22814947Alan Newberger Log.w(TAG, "Failed to launch gallery activity, closing"); 1138761306fadfa94b538f43e8cf3463bf6d22814947Alan Newberger } 1139690dc4722d068a1838b16dc0eabe9c7d518d524cAngus Kong finish(); 1140690dc4722d068a1838b16dc0eabe9c7d518d524cAngus Kong } 1141690dc4722d068a1838b16dc0eabe9c7d518d524cAngus Kong }); 114237f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling mDataAdapter = new FixedLastDataAdapter( 114337f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling mWrappedDataAdapter, 1144bd26069d391830856c57c2141cd2efbc8423d871Angus Kong new SimpleViewData( 114537f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling v, 114637f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling v.getDrawable().getIntrinsicWidth(), 114737f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling v.getDrawable().getIntrinsicHeight(), 114837f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling 0, 0)); 114937f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling // Flush out all the original data. 115037f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling mDataAdapter.flush(); 1151dcccc510652b835fdbd39310a07849af8203052aAngus Kong mFilmStripView.setDataAdapter(mDataAdapter); 115237f3611bbdc787c996a99894dcef7d8fb77e3f7cSascha Haeberling } 1153a5682ab08e1d42fe272ec877929478b4adb769f5Mangesh Ghiware 1154a5682ab08e1d42fe272ec877929478b4adb769f5Mangesh Ghiware setupNfcBeamPush(); 1155064d6000933354f7bf344a41e0caa7052401c903ztenghui 11562b86d873ca4fb3a921139633ed7be9959ab452dfDoris Liu mLocalImagesObserver = new LocalMediaObserver(); 11572b86d873ca4fb3a921139633ed7be9959ab452dfDoris Liu mLocalVideosObserver = new LocalMediaObserver(); 1158064d6000933354f7bf344a41e0caa7052401c903ztenghui 1159064d6000933354f7bf344a41e0caa7052401c903ztenghui getContentResolver().registerContentObserver( 1160064d6000933354f7bf344a41e0caa7052401c903ztenghui MediaStore.Images.Media.EXTERNAL_CONTENT_URI, true, 1161064d6000933354f7bf344a41e0caa7052401c903ztenghui mLocalImagesObserver); 1162064d6000933354f7bf344a41e0caa7052401c903ztenghui getContentResolver().registerContentObserver( 1163064d6000933354f7bf344a41e0caa7052401c903ztenghui MediaStore.Video.Media.EXTERNAL_CONTENT_URI, true, 1164064d6000933354f7bf344a41e0caa7052401c903ztenghui mLocalVideosObserver); 11658872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 11668872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 11676432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu private void setRotationAnimation() { 11686432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu int rotationAnimation = WindowManager.LayoutParams.ROTATION_ANIMATION_ROTATE; 11696432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu rotationAnimation = WindowManager.LayoutParams.ROTATION_ANIMATION_CROSSFADE; 11706432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu Window win = getWindow(); 11716432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu WindowManager.LayoutParams winParams = win.getAttributes(); 11726432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu winParams.rotationAnimation = rotationAnimation; 11736432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu win.setAttributes(winParams); 11748872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 11758872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 11768872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb @Override 11776432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu public void onUserInteraction() { 11786432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu super.onUserInteraction(); 11796432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu mCurrentModule.onUserInteraction(); 118009106a41ee6acc6b20553662cb9b730702a8f08aDoris Liu } 11818872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 11828872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb @Override 1183742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu public boolean dispatchTouchEvent(MotionEvent ev) { 1184742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu boolean result = super.dispatchTouchEvent(ev); 1185742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu if (ev.getActionMasked() == MotionEvent.ACTION_DOWN) { 1186742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu // Real deletion is postponed until the next user interaction after 1187742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu // the gesture that triggers deletion. Until real deletion is performed, 1188742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu // users can click the undo button to bring back the image that they 1189742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu // chose to delete. 1190742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu if (mPendingDeletion && !mIsUndoingDeletion) { 1191742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu performDeletion(); 1192742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu } 1193742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu } 1194742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu return result; 1195742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu } 1196742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu 1197742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu @Override 11988872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb public void onPause() { 1199f2c14330a49abb55f75bfae6b3bae67a0dad115bDoris Liu // Delete photos that are pending deletion 1200f2c14330a49abb55f75bfae6b3bae67a0dad115bDoris Liu performDeletion(); 12018872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb mOrientationListener.disable(); 12028872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb mCurrentModule.onPauseBeforeSuper(); 12038872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb super.onPause(); 12048872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb mCurrentModule.onPauseAfterSuper(); 12052b86d873ca4fb3a921139633ed7be9959ab452dfDoris Liu 12062b86d873ca4fb3a921139633ed7be9959ab452dfDoris Liu mLocalImagesObserver.setActivityPaused(true); 12072b86d873ca4fb3a921139633ed7be9959ab452dfDoris Liu mLocalVideosObserver.setActivityPaused(true); 12088872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 12098872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 12108872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb @Override 1211b7639c641f2ed5d0c60546349c3aa9e90c026878Sascha Haeberling protected void onActivityResult(int requestCode, int resultCode, Intent data) { 1212064d6000933354f7bf344a41e0caa7052401c903ztenghui if (requestCode == REQ_CODE_DONT_SWITCH_TO_PREVIEW) { 1213b7639c641f2ed5d0c60546349c3aa9e90c026878Sascha Haeberling mResetToPreviewOnResume = false; 1214b7639c641f2ed5d0c60546349c3aa9e90c026878Sascha Haeberling } else { 1215b7639c641f2ed5d0c60546349c3aa9e90c026878Sascha Haeberling super.onActivityResult(requestCode, resultCode, data); 1216b7639c641f2ed5d0c60546349c3aa9e90c026878Sascha Haeberling } 1217b7639c641f2ed5d0c60546349c3aa9e90c026878Sascha Haeberling } 1218b7639c641f2ed5d0c60546349c3aa9e90c026878Sascha Haeberling 1219b7639c641f2ed5d0c60546349c3aa9e90c026878Sascha Haeberling @Override 12208872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb public void onResume() { 1221ce2b94917098f211cacaaebaa0f6b40021d3e3faAngus Kong // TODO: Handle this in OrientationManager. 1222a5a08d7642a1fdf961b057cc90e76c4c93103c15Sascha Haeberling // Auto-rotate off 12233cf565c4242a9deab7da5eb84fc302c79d594f11Doris Liu if (Settings.System.getInt(getContentResolver(), 1224a5a08d7642a1fdf961b057cc90e76c4c93103c15Sascha Haeberling Settings.System.ACCELEROMETER_ROTATION, 0) == 0) { 12253cf565c4242a9deab7da5eb84fc302c79d594f11Doris Liu setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED); 12263cf565c4242a9deab7da5eb84fc302c79d594f11Doris Liu mAutoRotateScreen = false; 12273cf565c4242a9deab7da5eb84fc302c79d594f11Doris Liu } else { 12283cf565c4242a9deab7da5eb84fc302c79d594f11Doris Liu setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_FULL_SENSOR); 12293cf565c4242a9deab7da5eb84fc302c79d594f11Doris Liu mAutoRotateScreen = true; 12303cf565c4242a9deab7da5eb84fc302c79d594f11Doris Liu } 1231cbd8267ee99e457f72822e8d8187b5e6823104f8Seth Raphael 1232cbd8267ee99e457f72822e8d8187b5e6823104f8Seth Raphael UsageStatistics.onEvent(UsageStatistics.COMPONENT_CAMERA, 1233cbd8267ee99e457f72822e8d8187b5e6823104f8Seth Raphael UsageStatistics.ACTION_FOREGROUNDED, this.getClass().getSimpleName()); 1234cbd8267ee99e457f72822e8d8187b5e6823104f8Seth Raphael 12358872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb mOrientationListener.enable(); 12368872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb mCurrentModule.onResumeBeforeSuper(); 12378872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb super.onResume(); 12388872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb mCurrentModule.onResumeAfterSuper(); 12398872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 12406798c34ddb5248f038f351674c6a6c7a20992c8cAngus Kong setSwipingEnabled(true); 1241b7639c641f2ed5d0c60546349c3aa9e90c026878Sascha Haeberling 1242b7639c641f2ed5d0c60546349c3aa9e90c026878Sascha Haeberling if (mResetToPreviewOnResume) { 1243b7639c641f2ed5d0c60546349c3aa9e90c026878Sascha Haeberling // Go to the preview on resume. 1244b7639c641f2ed5d0c60546349c3aa9e90c026878Sascha Haeberling mFilmStripView.getController().goToFirstItem(); 1245b7639c641f2ed5d0c60546349c3aa9e90c026878Sascha Haeberling } 1246b7639c641f2ed5d0c60546349c3aa9e90c026878Sascha Haeberling // Default is showing the preview, unless disabled by explicitly 1247b7639c641f2ed5d0c60546349c3aa9e90c026878Sascha Haeberling // starting an activity we want to return from to the filmstrip rather 1248b7639c641f2ed5d0c60546349c3aa9e90c026878Sascha Haeberling // than the preview. 1249b7639c641f2ed5d0c60546349c3aa9e90c026878Sascha Haeberling mResetToPreviewOnResume = true; 1250064d6000933354f7bf344a41e0caa7052401c903ztenghui 12512b86d873ca4fb3a921139633ed7be9959ab452dfDoris Liu if (mLocalVideosObserver.isMediaDataChangedDuringPause() 12522b86d873ca4fb3a921139633ed7be9959ab452dfDoris Liu || mLocalImagesObserver.isMediaDataChangedDuringPause()) { 12532d5c74785d19f1944cab92948a6fa8233086ebc1Angus Kong if (!mSecureCamera) { 12542d5c74785d19f1944cab92948a6fa8233086ebc1Angus Kong // If it's secure camera, requestLoad() should not be called 12552d5c74785d19f1944cab92948a6fa8233086ebc1Angus Kong // as it will load all the data. 12562d5c74785d19f1944cab92948a6fa8233086ebc1Angus Kong mDataAdapter.requestLoad(getContentResolver()); 12572d5c74785d19f1944cab92948a6fa8233086ebc1Angus Kong } 1258064d6000933354f7bf344a41e0caa7052401c903ztenghui } 12592b86d873ca4fb3a921139633ed7be9959ab452dfDoris Liu mLocalImagesObserver.setActivityPaused(false); 12602b86d873ca4fb3a921139633ed7be9959ab452dfDoris Liu mLocalVideosObserver.setActivityPaused(false); 12616798c34ddb5248f038f351674c6a6c7a20992c8cAngus Kong } 12626798c34ddb5248f038f351674c6a6c7a20992c8cAngus Kong 12636798c34ddb5248f038f351674c6a6c7a20992c8cAngus Kong @Override 12646798c34ddb5248f038f351674c6a6c7a20992c8cAngus Kong public void onStart() { 12656798c34ddb5248f038f351674c6a6c7a20992c8cAngus Kong super.onStart(); 12667e374eb0a450ed2689b556ab42a0a88c8f74df2eAngus Kong bindMediaSaveService(); 1267f1f5186f7d3fd8bf35009d9e65a43914c664d82bSascha Haeberling mPanoramaViewHelper.onStart(); 1268f1f5186f7d3fd8bf35009d9e65a43914c664d82bSascha Haeberling } 1269f1f5186f7d3fd8bf35009d9e65a43914c664d82bSascha Haeberling 1270f1f5186f7d3fd8bf35009d9e65a43914c664d82bSascha Haeberling @Override 1271f1f5186f7d3fd8bf35009d9e65a43914c664d82bSascha Haeberling protected void onStop() { 1272f1f5186f7d3fd8bf35009d9e65a43914c664d82bSascha Haeberling super.onStop(); 1273f1f5186f7d3fd8bf35009d9e65a43914c664d82bSascha Haeberling mPanoramaViewHelper.onStop(); 12747e374eb0a450ed2689b556ab42a0a88c8f74df2eAngus Kong unbindMediaSaveService(); 127508650187c1f1a2d1ef7f754be0f479a29958daaaMichael Kolb } 127608650187c1f1a2d1ef7f754be0f479a29958daaaMichael Kolb 12778872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb @Override 12786432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu public void onDestroy() { 1279a5a08d7642a1fdf961b057cc90e76c4c93103c15Sascha Haeberling if (mSecureCamera) { 1280a5a08d7642a1fdf961b057cc90e76c4c93103c15Sascha Haeberling unregisterReceiver(mScreenOffReceiver); 1281a5a08d7642a1fdf961b057cc90e76c4c93103c15Sascha Haeberling } 1282064d6000933354f7bf344a41e0caa7052401c903ztenghui getContentResolver().unregisterContentObserver(mLocalImagesObserver); 1283064d6000933354f7bf344a41e0caa7052401c903ztenghui getContentResolver().unregisterContentObserver(mLocalVideosObserver); 1284064d6000933354f7bf344a41e0caa7052401c903ztenghui 12856432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu super.onDestroy(); 12868872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 12878872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 12888872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb @Override 12896432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu public void onConfigurationChanged(Configuration config) { 12906432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu super.onConfigurationChanged(config); 12916432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu mCurrentModule.onConfigurationChanged(config); 12928872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 12938872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 12948872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb @Override 12956432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu public boolean onKeyDown(int keyCode, KeyEvent event) { 1296dba16ae7d0aee0c3984df68b5787a0d0a7cd6f50Doris Liu if (mFilmStripView.inCameraFullscreen()) { 1297dba16ae7d0aee0c3984df68b5787a0d0a7cd6f50Doris Liu if (mCurrentModule.onKeyDown(keyCode, event)) { 1298a5a08d7642a1fdf961b057cc90e76c4c93103c15Sascha Haeberling return true; 1299a5a08d7642a1fdf961b057cc90e76c4c93103c15Sascha Haeberling } 1300dba16ae7d0aee0c3984df68b5787a0d0a7cd6f50Doris Liu // Prevent software keyboard or voice search from showing up. 1301dba16ae7d0aee0c3984df68b5787a0d0a7cd6f50Doris Liu if (keyCode == KeyEvent.KEYCODE_SEARCH 1302dba16ae7d0aee0c3984df68b5787a0d0a7cd6f50Doris Liu || keyCode == KeyEvent.KEYCODE_MENU) { 1303dba16ae7d0aee0c3984df68b5787a0d0a7cd6f50Doris Liu if (event.isLongPress()) { 1304dba16ae7d0aee0c3984df68b5787a0d0a7cd6f50Doris Liu return true; 1305dba16ae7d0aee0c3984df68b5787a0d0a7cd6f50Doris Liu } 1306dba16ae7d0aee0c3984df68b5787a0d0a7cd6f50Doris Liu } 13076432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu } 13086432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu 13096432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu return super.onKeyDown(keyCode, event); 13108872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 13118872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 13128872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb @Override 13136432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu public boolean onKeyUp(int keyCode, KeyEvent event) { 1314dba16ae7d0aee0c3984df68b5787a0d0a7cd6f50Doris Liu if (mFilmStripView.inCameraFullscreen() && mCurrentModule.onKeyUp(keyCode, event)) { 1315a5a08d7642a1fdf961b057cc90e76c4c93103c15Sascha Haeberling return true; 1316a5a08d7642a1fdf961b057cc90e76c4c93103c15Sascha Haeberling } 13176432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu return super.onKeyUp(keyCode, event); 13188872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 13198872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 13205f6b50deaf46fb546ebf6d0d6244ebf7fb79c7caAlan Newberger @Override 13215f6b50deaf46fb546ebf6d0d6244ebf7fb79c7caAlan Newberger public void onBackPressed() { 13225f6b50deaf46fb546ebf6d0d6244ebf7fb79c7caAlan Newberger if (!mFilmStripView.inCameraFullscreen()) { 13235f6b50deaf46fb546ebf6d0d6244ebf7fb79c7caAlan Newberger mFilmStripView.getController().goToFirstItem(); 13245f6b50deaf46fb546ebf6d0d6244ebf7fb79c7caAlan Newberger } else if (!mCurrentModule.onBackPressed()) { 13255f6b50deaf46fb546ebf6d0d6244ebf7fb79c7caAlan Newberger super.onBackPressed(); 13265f6b50deaf46fb546ebf6d0d6244ebf7fb79c7caAlan Newberger } 13275f6b50deaf46fb546ebf6d0d6244ebf7fb79c7caAlan Newberger } 13285f6b50deaf46fb546ebf6d0d6244ebf7fb79c7caAlan Newberger 13296432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu public boolean isAutoRotateScreen() { 13306432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu return mAutoRotateScreen; 13318872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 13328872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 13336432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu protected void updateStorageSpace() { 13342dcc0a9dfcc23f090bbe36308f92d72f68c4f0a2Angus Kong mStorageSpaceBytes = Storage.getAvailableSpace(); 13358872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 13368872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 13372dcc0a9dfcc23f090bbe36308f92d72f68c4f0a2Angus Kong protected long getStorageSpaceBytes() { 13382dcc0a9dfcc23f090bbe36308f92d72f68c4f0a2Angus Kong return mStorageSpaceBytes; 13398872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 13408872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 13416432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu protected void updateStorageSpaceAndHint() { 13426432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu updateStorageSpace(); 13432dcc0a9dfcc23f090bbe36308f92d72f68c4f0a2Angus Kong updateStorageHint(mStorageSpaceBytes); 13446432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu } 13456432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu 13466432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu protected void updateStorageHint(long storageSpace) { 13476432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu String message = null; 13486432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu if (storageSpace == Storage.UNAVAILABLE) { 13496432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu message = getString(R.string.no_storage); 13506432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu } else if (storageSpace == Storage.PREPARING) { 13516432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu message = getString(R.string.preparing_sd); 13526432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu } else if (storageSpace == Storage.UNKNOWN_SIZE) { 13536432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu message = getString(R.string.access_sd_fail); 13542dcc0a9dfcc23f090bbe36308f92d72f68c4f0a2Angus Kong } else if (storageSpace <= Storage.LOW_STORAGE_THRESHOLD_BYTES) { 13556432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu message = getString(R.string.spaceIsLow_content); 13568872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 13576432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu 13586432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu if (message != null) { 13596432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu if (mStorageHint == null) { 13606432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu mStorageHint = OnScreenHint.makeText(this, message); 13616432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu } else { 13626432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu mStorageHint.setText(message); 13636432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu } 13646432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu mStorageHint.show(); 13656432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu } else if (mStorageHint != null) { 13666432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu mStorageHint.cancel(); 13676432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu mStorageHint = null; 13688872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 13698872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 13708872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 13716432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu protected void setResultEx(int resultCode) { 13726432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu mResultCodeForTesting = resultCode; 13736432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu setResult(resultCode); 13748872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 13758872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 13766432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu protected void setResultEx(int resultCode, Intent data) { 13776432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu mResultCodeForTesting = resultCode; 13786432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu mResultDataForTesting = data; 13796432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu setResult(resultCode, data); 13808872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 13818872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 13826432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu public int getResultCode() { 13836432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu return mResultCodeForTesting; 13848872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 13858872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 13866432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu public Intent getResultData() { 13876432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu return mResultDataForTesting; 13888872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 13898872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 13906432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu public boolean isSecureCamera() { 13916432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu return mSecureCamera; 13928872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 13938872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 13948872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb @Override 1395ed15d1a140986473bbe7fffd72ec9618c41c5979Angus Kong public void onModuleSelected(int moduleIndex) { 1396a5a08d7642a1fdf961b057cc90e76c4c93103c15Sascha Haeberling if (mCurrentModuleIndex == moduleIndex) { 1397a5a08d7642a1fdf961b057cc90e76c4c93103c15Sascha Haeberling return; 1398a5a08d7642a1fdf961b057cc90e76c4c93103c15Sascha Haeberling } 13996432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu 14006432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu CameraHolder.instance().keep(); 14016432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu closeModule(mCurrentModule); 14022654dd9bb6a7d917dab1a48e2182c4f49fe71f11Sascha Haeberling setModuleFromIndex(moduleIndex); 14032654dd9bb6a7d917dab1a48e2182c4f49fe71f11Sascha Haeberling 14042654dd9bb6a7d917dab1a48e2182c4f49fe71f11Sascha Haeberling openModule(mCurrentModule); 14052654dd9bb6a7d917dab1a48e2182c4f49fe71f11Sascha Haeberling mCurrentModule.onOrientationChanged(mLastRawOrientation); 14062654dd9bb6a7d917dab1a48e2182c4f49fe71f11Sascha Haeberling if (mMediaSaveService != null) { 14072654dd9bb6a7d917dab1a48e2182c4f49fe71f11Sascha Haeberling mCurrentModule.onMediaSaveServiceConnected(mMediaSaveService); 14082654dd9bb6a7d917dab1a48e2182c4f49fe71f11Sascha Haeberling } 14092654dd9bb6a7d917dab1a48e2182c4f49fe71f11Sascha Haeberling 14102654dd9bb6a7d917dab1a48e2182c4f49fe71f11Sascha Haeberling // Store the module index so we can use it the next time the Camera 14112654dd9bb6a7d917dab1a48e2182c4f49fe71f11Sascha Haeberling // starts up. 14122654dd9bb6a7d917dab1a48e2182c4f49fe71f11Sascha Haeberling SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this); 14130fb819b4619cd4ac20f9d381739e444da011d4edAngus Kong prefs.edit().putInt(CameraSettings.KEY_STARTUP_MODULE_INDEX, moduleIndex).apply(); 14142654dd9bb6a7d917dab1a48e2182c4f49fe71f11Sascha Haeberling } 14152654dd9bb6a7d917dab1a48e2182c4f49fe71f11Sascha Haeberling 14162654dd9bb6a7d917dab1a48e2182c4f49fe71f11Sascha Haeberling /** 1417a5a08d7642a1fdf961b057cc90e76c4c93103c15Sascha Haeberling * Sets the mCurrentModuleIndex, creates a new module instance for the given 1418a5a08d7642a1fdf961b057cc90e76c4c93103c15Sascha Haeberling * index an sets it as mCurrentModule. 14192654dd9bb6a7d917dab1a48e2182c4f49fe71f11Sascha Haeberling */ 14202654dd9bb6a7d917dab1a48e2182c4f49fe71f11Sascha Haeberling private void setModuleFromIndex(int moduleIndex) { 14212654dd9bb6a7d917dab1a48e2182c4f49fe71f11Sascha Haeberling mCurrentModuleIndex = moduleIndex; 14222654dd9bb6a7d917dab1a48e2182c4f49fe71f11Sascha Haeberling switch (moduleIndex) { 142315125661ad968cf4d40989a9bc88d11189beb0b3Sascha Haeberling case ModuleSwitcher.VIDEO_MODULE_INDEX: 14246432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu mCurrentModule = new VideoModule(); 14256432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu break; 1426ed15d1a140986473bbe7fffd72ec9618c41c5979Angus Kong 142715125661ad968cf4d40989a9bc88d11189beb0b3Sascha Haeberling case ModuleSwitcher.PHOTO_MODULE_INDEX: 14286432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu mCurrentModule = new PhotoModule(); 14296432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu break; 1430ed15d1a140986473bbe7fffd72ec9618c41c5979Angus Kong 143115125661ad968cf4d40989a9bc88d11189beb0b3Sascha Haeberling case ModuleSwitcher.WIDE_ANGLE_PANO_MODULE_INDEX: 1432ed15d1a140986473bbe7fffd72ec9618c41c5979Angus Kong mCurrentModule = new WideAnglePanoramaModule(); 1433ed15d1a140986473bbe7fffd72ec9618c41c5979Angus Kong break; 1434ed15d1a140986473bbe7fffd72ec9618c41c5979Angus Kong 143515125661ad968cf4d40989a9bc88d11189beb0b3Sascha Haeberling case ModuleSwitcher.LIGHTCYCLE_MODULE_INDEX: 14368e963a5a6016d246184ed65906f9d103e92b17e2Sascha Haeberling mCurrentModule = PhotoSphereHelper.createPanoramaModule(); 14376432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu break; 1438a9d66bdab247626b31dc182c4d62520b3abffdbdRuben Brunk case ModuleSwitcher.GCAM_MODULE_INDEX: 1439a9d66bdab247626b31dc182c4d62520b3abffdbdRuben Brunk // Force immediate release of Camera instance 1440a9d66bdab247626b31dc182c4d62520b3abffdbdRuben Brunk CameraHolder.instance().strongRelease(); 1441a9d66bdab247626b31dc182c4d62520b3abffdbdRuben Brunk mCurrentModule = GcamHelper.createGcamModule(); 1442a9d66bdab247626b31dc182c4d62520b3abffdbdRuben Brunk break; 14432654dd9bb6a7d917dab1a48e2182c4f49fe71f11Sascha Haeberling default: 144415125661ad968cf4d40989a9bc88d11189beb0b3Sascha Haeberling // Fall back to photo mode. 144515125661ad968cf4d40989a9bc88d11189beb0b3Sascha Haeberling mCurrentModule = new PhotoModule(); 144615125661ad968cf4d40989a9bc88d11189beb0b3Sascha Haeberling mCurrentModuleIndex = ModuleSwitcher.PHOTO_MODULE_INDEX; 14472654dd9bb6a7d917dab1a48e2182c4f49fe71f11Sascha Haeberling break; 14486432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu } 14498872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 14508872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 145188ef7664ba6a888fa5da8693091674e152b56192Sascha Haeberling /** 145288ef7664ba6a888fa5da8693091674e152b56192Sascha Haeberling * Launches an ACTION_EDIT intent for the given local data item. 145388ef7664ba6a888fa5da8693091674e152b56192Sascha Haeberling */ 145488ef7664ba6a888fa5da8693091674e152b56192Sascha Haeberling public void launchEditor(LocalData data) { 145588ef7664ba6a888fa5da8693091674e152b56192Sascha Haeberling Intent intent = new Intent(Intent.ACTION_EDIT) 145688ef7664ba6a888fa5da8693091674e152b56192Sascha Haeberling .setDataAndType(data.getContentUri(), data.getMimeType()) 145788ef7664ba6a888fa5da8693091674e152b56192Sascha Haeberling .setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); 145805a04924312fbcda2161da01e0749eb80c2663d1Erin Dahlgren try { 145905a04924312fbcda2161da01e0749eb80c2663d1Erin Dahlgren startActivityForResult(intent, REQ_CODE_DONT_SWITCH_TO_PREVIEW); 146005a04924312fbcda2161da01e0749eb80c2663d1Erin Dahlgren } catch (ActivityNotFoundException e) { 146105a04924312fbcda2161da01e0749eb80c2663d1Erin Dahlgren startActivityForResult(Intent.createChooser(intent, null), 146205a04924312fbcda2161da01e0749eb80c2663d1Erin Dahlgren REQ_CODE_DONT_SWITCH_TO_PREVIEW); 146305a04924312fbcda2161da01e0749eb80c2663d1Erin Dahlgren } 146488ef7664ba6a888fa5da8693091674e152b56192Sascha Haeberling } 146588ef7664ba6a888fa5da8693091674e152b56192Sascha Haeberling 1466a5a08d7642a1fdf961b057cc90e76c4c93103c15Sascha Haeberling /** 1467a5a08d7642a1fdf961b057cc90e76c4c93103c15Sascha Haeberling * Launch the tiny planet editor. 1468a5a08d7642a1fdf961b057cc90e76c4c93103c15Sascha Haeberling * 1469a5a08d7642a1fdf961b057cc90e76c4c93103c15Sascha Haeberling * @param data the data must be a 360 degree stereographically mapped 1470a5a08d7642a1fdf961b057cc90e76c4c93103c15Sascha Haeberling * panoramic image. It will not be modified, instead a new item 1471a5a08d7642a1fdf961b057cc90e76c4c93103c15Sascha Haeberling * with the result will be added to the filmstrip. 1472a5a08d7642a1fdf961b057cc90e76c4c93103c15Sascha Haeberling */ 1473a5a08d7642a1fdf961b057cc90e76c4c93103c15Sascha Haeberling public void launchTinyPlanetEditor(LocalData data) { 1474a5a08d7642a1fdf961b057cc90e76c4c93103c15Sascha Haeberling TinyPlanetFragment fragment = new TinyPlanetFragment(); 1475a5a08d7642a1fdf961b057cc90e76c4c93103c15Sascha Haeberling Bundle bundle = new Bundle(); 1476a5a08d7642a1fdf961b057cc90e76c4c93103c15Sascha Haeberling bundle.putString(TinyPlanetFragment.ARGUMENT_URI, data.getContentUri().toString()); 1477a5a08d7642a1fdf961b057cc90e76c4c93103c15Sascha Haeberling bundle.putString(TinyPlanetFragment.ARGUMENT_TITLE, data.getTitle()); 1478a5a08d7642a1fdf961b057cc90e76c4c93103c15Sascha Haeberling fragment.setArguments(bundle); 1479a5a08d7642a1fdf961b057cc90e76c4c93103c15Sascha Haeberling fragment.show(getFragmentManager(), "tiny_planet"); 1480a5a08d7642a1fdf961b057cc90e76c4c93103c15Sascha Haeberling } 1481a5a08d7642a1fdf961b057cc90e76c4c93103c15Sascha Haeberling 14826432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu private void openModule(CameraModule module) { 1483653c43be6e58be54cf2ac3c8efb2d65ac20bd03bAngus Kong module.init(this, mCameraModuleRootView); 14846432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu module.onResumeBeforeSuper(); 14856432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu module.onResumeAfterSuper(); 14868872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 14878872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 14886432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu private void closeModule(CameraModule module) { 14896432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu module.onPauseBeforeSuper(); 14906432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu module.onPauseAfterSuper(); 1491653c43be6e58be54cf2ac3c8efb2d65ac20bd03bAngus Kong ((ViewGroup) mCameraModuleRootView).removeAllViews(); 1492653c43be6e58be54cf2ac3c8efb2d65ac20bd03bAngus Kong } 1493653c43be6e58be54cf2ac3c8efb2d65ac20bd03bAngus Kong 1494742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu private void performDeletion() { 1495742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu if (!mPendingDeletion) { 1496742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu return; 1497742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu } 1498742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu hideUndoDeletionBar(false); 1499742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu mDataAdapter.executeDeletion(CameraActivity.this); 1500fd7f0a9ffd8e7db21e556b1a60a7602ef5d0fe29Erin Dahlgren 1501fd7f0a9ffd8e7db21e556b1a60a7602ef5d0fe29Erin Dahlgren int currentId = mFilmStripView.getCurrentId(); 1502fd7f0a9ffd8e7db21e556b1a60a7602ef5d0fe29Erin Dahlgren updateActionBarMenu(currentId); 1503fd7f0a9ffd8e7db21e556b1a60a7602ef5d0fe29Erin Dahlgren mFilmStripListener.onCurrentDataCentered(currentId); 1504742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu } 1505742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu 1506742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu public void showUndoDeletionBar() { 1507742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu if (mPendingDeletion) { 1508742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu performDeletion(); 1509742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu } 1510742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu Log.v(TAG, "showing undo bar"); 1511742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu mPendingDeletion = true; 1512653c43be6e58be54cf2ac3c8efb2d65ac20bd03bAngus Kong if (mUndoDeletionBar == null) { 1513653c43be6e58be54cf2ac3c8efb2d65ac20bd03bAngus Kong ViewGroup v = (ViewGroup) getLayoutInflater().inflate( 1514653c43be6e58be54cf2ac3c8efb2d65ac20bd03bAngus Kong R.layout.undo_bar, mAboveFilmstripControlLayout, true); 1515653c43be6e58be54cf2ac3c8efb2d65ac20bd03bAngus Kong mUndoDeletionBar = (ViewGroup) v.findViewById(R.id.camera_undo_deletion_bar); 1516653c43be6e58be54cf2ac3c8efb2d65ac20bd03bAngus Kong View button = mUndoDeletionBar.findViewById(R.id.camera_undo_deletion_button); 1517653c43be6e58be54cf2ac3c8efb2d65ac20bd03bAngus Kong button.setOnClickListener(new View.OnClickListener() { 1518653c43be6e58be54cf2ac3c8efb2d65ac20bd03bAngus Kong @Override 1519653c43be6e58be54cf2ac3c8efb2d65ac20bd03bAngus Kong public void onClick(View view) { 1520653c43be6e58be54cf2ac3c8efb2d65ac20bd03bAngus Kong mDataAdapter.undoDataRemoval(); 1521742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu hideUndoDeletionBar(true); 1522742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu } 1523742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu }); 1524742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu // Setting undo bar clickable to avoid touch events going through 1525742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu // the bar to the buttons (eg. edit button, etc) underneath the bar. 1526742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu mUndoDeletionBar.setClickable(true); 1527742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu // When there is user interaction going on with the undo button, we 1528742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu // do not want to hide the undo bar. 1529742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu button.setOnTouchListener(new View.OnTouchListener() { 1530742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu @Override 1531742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu public boolean onTouch(View v, MotionEvent event) { 1532742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu if (event.getActionMasked() == MotionEvent.ACTION_DOWN) { 1533742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu mIsUndoingDeletion = true; 1534742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu } else if (event.getActionMasked() == MotionEvent.ACTION_UP) { 1535742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu mIsUndoingDeletion =false; 1536742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu } 1537742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu return false; 1538653c43be6e58be54cf2ac3c8efb2d65ac20bd03bAngus Kong } 1539653c43be6e58be54cf2ac3c8efb2d65ac20bd03bAngus Kong }); 1540653c43be6e58be54cf2ac3c8efb2d65ac20bd03bAngus Kong } 1541653c43be6e58be54cf2ac3c8efb2d65ac20bd03bAngus Kong mUndoDeletionBar.setAlpha(0f); 1542653c43be6e58be54cf2ac3c8efb2d65ac20bd03bAngus Kong mUndoDeletionBar.setVisibility(View.VISIBLE); 1543742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu mUndoDeletionBar.animate().setDuration(200).alpha(1f).setListener(null).start(); 1544653c43be6e58be54cf2ac3c8efb2d65ac20bd03bAngus Kong } 1545653c43be6e58be54cf2ac3c8efb2d65ac20bd03bAngus Kong 1546742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu private void hideUndoDeletionBar(boolean withAnimation) { 1547653c43be6e58be54cf2ac3c8efb2d65ac20bd03bAngus Kong Log.v(TAG, "Hiding undo deletion bar"); 1548742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu mPendingDeletion = false; 1549653c43be6e58be54cf2ac3c8efb2d65ac20bd03bAngus Kong if (mUndoDeletionBar != null) { 1550742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu if (withAnimation) { 1551742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu mUndoDeletionBar.animate() 1552742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu .setDuration(200) 1553742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu .alpha(0f) 1554742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu .setListener(new Animator.AnimatorListener() { 1555742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu @Override 1556742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu public void onAnimationStart(Animator animation) { 1557742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu // Do nothing. 1558742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu } 1559742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu 1560742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu @Override 1561742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu public void onAnimationEnd(Animator animation) { 1562742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu mUndoDeletionBar.setVisibility(View.GONE); 1563742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu } 1564742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu 1565742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu @Override 1566742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu public void onAnimationCancel(Animator animation) { 1567742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu // Do nothing. 1568742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu } 1569742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu 1570742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu @Override 1571742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu public void onAnimationRepeat(Animator animation) { 1572742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu // Do nothing. 1573742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu } 1574742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu }) 1575742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu .start(); 1576742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu } else { 1577742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu mUndoDeletionBar.setVisibility(View.GONE); 1578742cd5b18e1899bee1d430b61891238c0f3502b6Doris Liu } 1579653c43be6e58be54cf2ac3c8efb2d65ac20bd03bAngus Kong } 15808872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 15818872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 15828872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb @Override 15836432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu public void onShowSwitcherPopup() { 1584249653e41763cffbd9bd5ef2298c5120488897fbAndy Huibers mCurrentModule.onShowSwitcherPopup(); 15856432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu } 15866432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu 1587a71946012df0eee8fe4859a22da3c56feba0344eAngus Kong /** 1588a5a08d7642a1fdf961b057cc90e76c4c93103c15Sascha Haeberling * Enable/disable swipe-to-filmstrip. Will always disable swipe if in 1589a5a08d7642a1fdf961b057cc90e76c4c93103c15Sascha Haeberling * capture intent. 1590a71946012df0eee8fe4859a22da3c56feba0344eAngus Kong * 1591a71946012df0eee8fe4859a22da3c56feba0344eAngus Kong * @param enable {@code true} to enable swipe. 1592a71946012df0eee8fe4859a22da3c56feba0344eAngus Kong */ 15936432cd65159731a28d9239426b0f0f4d7c44fa98Doris Liu public void setSwipingEnabled(boolean enable) { 1594a71946012df0eee8fe4859a22da3c56feba0344eAngus Kong if (isCaptureIntent()) { 1595a71946012df0eee8fe4859a22da3c56feba0344eAngus Kong mCameraPreviewData.lockPreview(true); 1596a71946012df0eee8fe4859a22da3c56feba0344eAngus Kong } else { 1597a71946012df0eee8fe4859a22da3c56feba0344eAngus Kong mCameraPreviewData.lockPreview(!enable); 1598a71946012df0eee8fe4859a22da3c56feba0344eAngus Kong } 15998872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 16008872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 16013044d8c577432d6e9721fc8b26ac2afbbaf21266Erin Dahlgren 16023044d8c577432d6e9721fc8b26ac2afbbaf21266Erin Dahlgren /** 16033044d8c577432d6e9721fc8b26ac2afbbaf21266Erin Dahlgren * Check whether camera controls are visible. 16043044d8c577432d6e9721fc8b26ac2afbbaf21266Erin Dahlgren * 16053044d8c577432d6e9721fc8b26ac2afbbaf21266Erin Dahlgren * @return whether controls are visible. 16063044d8c577432d6e9721fc8b26ac2afbbaf21266Erin Dahlgren */ 16073044d8c577432d6e9721fc8b26ac2afbbaf21266Erin Dahlgren private boolean arePreviewControlsVisible() { 16083044d8c577432d6e9721fc8b26ac2afbbaf21266Erin Dahlgren return mCurrentModule.arePreviewControlsVisible(); 16093044d8c577432d6e9721fc8b26ac2afbbaf21266Erin Dahlgren } 16103044d8c577432d6e9721fc8b26ac2afbbaf21266Erin Dahlgren 16113044d8c577432d6e9721fc8b26ac2afbbaf21266Erin Dahlgren /** 16123044d8c577432d6e9721fc8b26ac2afbbaf21266Erin Dahlgren * Show or hide the {@link CameraControls} using the current module's 16133044d8c577432d6e9721fc8b26ac2afbbaf21266Erin Dahlgren * implementation of {@link #onPreviewFocusChanged}. 16143044d8c577432d6e9721fc8b26ac2afbbaf21266Erin Dahlgren * 16153044d8c577432d6e9721fc8b26ac2afbbaf21266Erin Dahlgren * @param showControls whether to show camera controls. 16163044d8c577432d6e9721fc8b26ac2afbbaf21266Erin Dahlgren */ 16173044d8c577432d6e9721fc8b26ac2afbbaf21266Erin Dahlgren private void setPreviewControlsVisibility(boolean showControls) { 16183044d8c577432d6e9721fc8b26ac2afbbaf21266Erin Dahlgren mCurrentModule.onPreviewFocusChanged(showControls); 16193044d8c577432d6e9721fc8b26ac2afbbaf21266Erin Dahlgren } 16203044d8c577432d6e9721fc8b26ac2afbbaf21266Erin Dahlgren 16218872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb // Accessor methods for getting latency times used in performance testing 16228872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb public long getAutoFocusTime() { 16238872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb return (mCurrentModule instanceof PhotoModule) ? 16248872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb ((PhotoModule) mCurrentModule).mAutoFocusTime : -1; 16258872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 16268872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 16278872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb public long getShutterLag() { 16288872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb return (mCurrentModule instanceof PhotoModule) ? 16298872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb ((PhotoModule) mCurrentModule).mShutterLag : -1; 16308872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 16318872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 16328872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb public long getShutterToPictureDisplayedTime() { 16338872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb return (mCurrentModule instanceof PhotoModule) ? 16348872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb ((PhotoModule) mCurrentModule).mShutterToPictureDisplayedTime : -1; 16358872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 16368872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 16378872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb public long getPictureDisplayedToJpegCallbackTime() { 16388872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb return (mCurrentModule instanceof PhotoModule) ? 16398872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb ((PhotoModule) mCurrentModule).mPictureDisplayedToJpegCallbackTime : -1; 16408872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 16418872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 16428872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb public long getJpegCallbackFinishTime() { 16438872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb return (mCurrentModule instanceof PhotoModule) ? 16448872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb ((PhotoModule) mCurrentModule).mJpegCallbackFinishTime : -1; 16458872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 16468872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 16478872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb public long getCaptureStartTime() { 16488872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb return (mCurrentModule instanceof PhotoModule) ? 16498872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb ((PhotoModule) mCurrentModule).mCaptureStartTime : -1; 16508872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 16518872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 16528872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb public boolean isRecording() { 16538872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb return (mCurrentModule instanceof VideoModule) ? 16548872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb ((VideoModule) mCurrentModule).isRecording() : false; 16558872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 16564f795b878843e59810ec1dca05b7cdb37b5614c5Angus Kong 16574f795b878843e59810ec1dca05b7cdb37b5614c5Angus Kong public CameraOpenErrorCallback getCameraOpenErrorCallback() { 16584f795b878843e59810ec1dca05b7cdb37b5614c5Angus Kong return mCameraOpenErrorCallback; 16594f795b878843e59810ec1dca05b7cdb37b5614c5Angus Kong } 1660d217ed0fa931d2a080a159c24e4012697baf5ae3Ruben Brunk 1661d217ed0fa931d2a080a159c24e4012697baf5ae3Ruben Brunk // For debugging purposes only. 1662d217ed0fa931d2a080a159c24e4012697baf5ae3Ruben Brunk public CameraModule getCurrentModule() { 1663d217ed0fa931d2a080a159c24e4012697baf5ae3Ruben Brunk return mCurrentModule; 1664d217ed0fa931d2a080a159c24e4012697baf5ae3Ruben Brunk } 16658872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb} 1666