1f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin/* 2f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * Copyright (C) 2010 The Android Open Source Project 3f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * 4f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * Licensed under the Apache License, Version 2.0 (the "License"); 5f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * you may not use this file except in compliance with the License. 6f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * You may obtain a copy of the License at 7f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * 8f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * http://www.apache.org/licenses/LICENSE-2.0 9f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * 10f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * Unless required by applicable law or agreed to in writing, software 11f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * distributed under the License is distributed on an "AS IS" BASIS, 12f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * See the License for the specific language governing permissions and 14f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * limitations under the License. 15f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin */ 16f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 17f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linpackage com.android.gallery3d.app; 18f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 19fc86994f86f8cfb31e151c9e730dc1e9dc7b3349Yuli Huangimport android.annotation.TargetApi; 201336062985c9824d7fd796b1cebd5eaa8e4163caOwen Linimport android.app.ActionBar.OnMenuVisibilityListener; 218bc5bebba780ca4a322b466b06fc909331697cf4Owen Linimport android.app.Activity; 22604f053d040782159b61d3b74ee533bc2c0ccdd0Ray Chenimport android.content.ActivityNotFoundException; 23604f053d040782159b61d3b74ee533bc2c0ccdd0Ray Chenimport android.content.Context; 24604f053d040782159b61d3b74ee533bc2c0ccdd0Ray Chenimport android.content.Intent; 25a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescuimport android.content.pm.PackageManager; 2604ac045bf8da5082bbb0bdc9ea5f9c9b5b796ad0Yuli Huangimport android.graphics.Rect; 27604f053d040782159b61d3b74ee533bc2c0ccdd0Ray Chenimport android.net.Uri; 2833ef03776b7734717b16f6fc861b831fb1b1dfacMartijn Coenenimport android.nfc.NfcAdapter; 29ddf0225a5192a589fc578945f56440b09bf74d12John Reckimport android.nfc.NfcAdapter.CreateBeamUrisCallback; 30ddf0225a5192a589fc578945f56440b09bf74d12John Reckimport android.nfc.NfcEvent; 31604f053d040782159b61d3b74ee533bc2c0ccdd0Ray Chenimport android.os.Bundle; 32604f053d040782159b61d3b74ee533bc2c0ccdd0Ray Chenimport android.os.Handler; 33604f053d040782159b61d3b74ee533bc2c0ccdd0Ray Chenimport android.os.Message; 34b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescuimport android.os.SystemClock; 351336062985c9824d7fd796b1cebd5eaa8e4163caOwen Linimport android.view.Menu; 361336062985c9824d7fd796b1cebd5eaa8e4163caOwen Linimport android.view.MenuItem; 37a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescuimport android.widget.RelativeLayout; 38604f053d040782159b61d3b74ee533bc2c0ccdd0Ray Chenimport android.widget.Toast; 39604f053d040782159b61d3b74ee533bc2c0ccdd0Ray Chen 405bd00332556b20c141b5c7f16433d55b1bc7fe0fBobby Georgescuimport com.android.camera.CameraActivity; 41f85d974363a40b8ce588ba3fe902eec38de603d9John Reckimport com.android.camera.ProxyLauncher; 42f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.R; 43fc86994f86f8cfb31e151c9e730dc1e9dc7b3349Yuli Huangimport com.android.gallery3d.common.ApiHelper; 44ee899c09c88e5b054397ac44ad20e5055cd24f39Bobby Georgescuimport com.android.gallery3d.data.ComboAlbum; 45f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.data.DataManager; 466b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Changimport com.android.gallery3d.data.FilterDeleteSet; 4745f089d69141e3fb0dfaad9bc34d275b61eb2aeeBobby Georgescuimport com.android.gallery3d.data.FilterSource; 484e091eb758a3ac1016b373419cea1ada1b977bc5George Mountimport com.android.gallery3d.data.LocalImage; 49f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.data.MediaDetails; 50f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.data.MediaItem; 51f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.data.MediaObject; 524b4dbd225685502f4249c2bf25bf74f7ce526645George Mountimport com.android.gallery3d.data.MediaObject.PanoramaSupportCallback; 53f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.data.MediaSet; 546b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Changimport com.android.gallery3d.data.MtpSource; 55f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.data.Path; 56a0ce682e40c39ce046c48d8a7f989fff01bb9f2cWu-cheng Liimport com.android.gallery3d.data.SecureAlbum; 57a0ce682e40c39ce046c48d8a7f989fff01bb9f2cWu-cheng Liimport com.android.gallery3d.data.SecureSource; 583b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Changimport com.android.gallery3d.data.SnailAlbum; 593b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Changimport com.android.gallery3d.data.SnailItem; 6015b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Changimport com.android.gallery3d.data.SnailSource; 6163926d2ed2ca2921de8dca9b3a52c1d64d8afc46Ruben Brunkimport com.android.gallery3d.filtershow.FilterShowActivity; 62f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.picasasource.PicasaSource; 634105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chenimport com.android.gallery3d.ui.DetailsHelper; 644105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chenimport com.android.gallery3d.ui.DetailsHelper.CloseListener; 654105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chenimport com.android.gallery3d.ui.DetailsHelper.DetailsSource; 66f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.ui.GLView; 67f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.ui.ImportCompleteListener; 68f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.ui.MenuExecutor; 6921a412c93c9b0401b039f4eb86d4950752e5bb84Owen Linimport com.android.gallery3d.ui.PhotoView; 70f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.ui.SelectionManager; 71f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.ui.SynchronizedHandler; 72f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.util.GalleryUtils; 73f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 74bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Changpublic class PhotoPage extends ActivityState implements 753c6a0610d50a866e520485163011c79d9ee62457Your Name PhotoView.Listener, AppBridge.Server, 763cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu PhotoPageBottomControls.Delegate, GalleryActionBar.OnAlbumModeSelectedListener { 77f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private static final String TAG = "PhotoPage"; 78f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 79f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private static final int MSG_HIDE_BARS = 1; 80bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang private static final int MSG_ON_FULL_SCREEN_CHANGED = 4; 8161f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang private static final int MSG_UPDATE_ACTION_BAR = 5; 82bd7c016d728853d38f98a3c6077b7bd9b08858b9Yuli Huang private static final int MSG_UNFREEZE_GLROOT = 6; 83e6251df06f0b3c8f556043f8b725b4b19be7474dChih-Chung Chang private static final int MSG_WANT_BARS = 7; 843cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu private static final int MSG_REFRESH_BOTTOM_CONTROLS = 8; 853cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu private static final int MSG_ON_CAMERA_CENTER = 9; 86f4e22eb44bfae0c2a3b6570f19480c8c3535d808Bobby Georgescu private static final int MSG_ON_PICTURE_CENTER = 10; 87f122d56e15e00928d731751796b0509ae47c6799George Mount private static final int MSG_REFRESH_IMAGE = 11; 88423e45e492d4ebdc41ecfeba73299de23b1463c4Mangesh Ghiware private static final int MSG_UPDATE_PHOTO_UI = 12; 89825afb1b3e7d15b5c258d664ee008dc68da1c407Mangesh Ghiware private static final int MSG_UPDATE_PROGRESS = 13; 90423e45e492d4ebdc41ecfeba73299de23b1463c4Mangesh Ghiware private static final int MSG_UPDATE_DEFERRED = 14; 914b4dbd225685502f4249c2bf25bf74f7ce526645George Mount private static final int MSG_UPDATE_SHARE_URI = 15; 924b4dbd225685502f4249c2bf25bf74f7ce526645George Mount private static final int MSG_UPDATE_PANORAMA_UI = 16; 936cf807453fb58ccd4cc513ff187b306c7090e67cOwen Lin 94f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private static final int HIDE_BARS_TIMEOUT = 3500; 95bd7c016d728853d38f98a3c6077b7bd9b08858b9Yuli Huang private static final int UNFREEZE_GLROOT_TIMEOUT = 250; 96f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 97f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private static final int REQUEST_SLIDESHOW = 1; 98f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private static final int REQUEST_CROP = 2; 99f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private static final int REQUEST_CROP_PICASA = 3; 100f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang private static final int REQUEST_EDIT = 4; 10171cd89a38752bc22ae0ec2df965e4280b776623cChih-Chung Chang private static final int REQUEST_PLAY_VIDEO = 5; 1023f1f1baf3a674927e25cd5cd885fb372796bd3a0Teng-Hui Zhu private static final int REQUEST_TRIM = 6; 103f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 104f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public static final String KEY_MEDIA_SET_PATH = "media-set-path"; 105f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public static final String KEY_MEDIA_ITEM_PATH = "media-item-path"; 106f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public static final String KEY_INDEX_HINT = "index-hint"; 10704ac045bf8da5082bbb0bdc9ea5f9c9b5b796ad0Yuli Huang public static final String KEY_OPEN_ANIMATION_RECT = "open-animation-rect"; 108bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang public static final String KEY_APP_BRIDGE = "app-bridge"; 10954fe6202b6f7d233e7645c121321fe0f3d20fc8bYuli Huang public static final String KEY_TREAT_BACK_AS_UP = "treat-back-as-up"; 1107eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu public static final String KEY_START_IN_FILMSTRIP = "start-in-filmstrip"; 111bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang public static final String KEY_RETURN_INDEX_HINT = "return-index-hint"; 11223e595f0c656ebaeb63f78e3018b5830628c5afeWu-cheng Li public static final String KEY_SHOW_WHEN_LOCKED = "show_when_locked"; 11345f089d69141e3fb0dfaad9bc34d275b61eb2aeeBobby Georgescu public static final String KEY_IN_CAMERA_ROLL = "in_camera_roll"; 114f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 1157eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu public static final String KEY_ALBUMPAGE_TRANSITION = "albumpage-transition"; 1167eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu public static final int MSG_ALBUMPAGE_NONE = 0; 1177eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu public static final int MSG_ALBUMPAGE_STARTED = 1; 1187eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu public static final int MSG_ALBUMPAGE_RESUMED = 2; 1197eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu public static final int MSG_ALBUMPAGE_PICKED = 4; 1207eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu 121a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu public static final String ACTION_NEXTGEN_EDIT = "action_nextgen_edit"; 122a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu 123f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private GalleryApp mApplication; 124f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private SelectionManager mSelectionManager; 125f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 126f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private PhotoView mPhotoView; 127f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private PhotoPage.Model mModel; 1284105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen private DetailsHelper mDetailsHelper; 129f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private boolean mShowDetails; 130f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 131f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin // mMediaSet could be null if there is no KEY_MEDIA_SET_PATH supplied. 132f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin // E.g., viewing a photo in gmail attachment 1336b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang private FilterDeleteSet mMediaSet; 134f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 135a0ce682e40c39ce046c48d8a7f989fff01bb9f2cWu-cheng Li // The mediaset used by camera launched from secure lock screen. 136a0ce682e40c39ce046c48d8a7f989fff01bb9f2cWu-cheng Li private SecureAlbum mSecureAlbum; 137a0ce682e40c39ce046c48d8a7f989fff01bb9f2cWu-cheng Li 138f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private int mCurrentIndex = 0; 139f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private Handler mHandler; 140113bfc77c4468411da9ae1290553c3be89f8df9aOwen Lin private boolean mShowBars = true; 14161f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang private volatile boolean mActionBarAllowed = true; 1428cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen private GalleryActionBar mActionBar; 143f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private boolean mIsMenuVisible; 1448fe22ecb8e744a09a2e0d867f876ecbf74c82298John Reck private boolean mHaveImageEditor; 145f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu private PhotoPageBottomControls mBottomControls; 146f122d56e15e00928d731751796b0509ae47c6799George Mount private PhotoPageProgressBar mProgressBar; 147f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private MediaItem mCurrentPhoto = null; 148f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private MenuExecutor mMenuExecutor; 149f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private boolean mIsActive; 150ba65c373f244f6de0b45afa6b7cd711866f1bfe4Bobby Georgescu private boolean mShowSpinner; 15184c220f10a643927c8a2126de8a755d8d7f7ec9eRay Chen private String mSetPathString; 152b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang // This is the original mSetPathString before adding the camera preview item. 153b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang private String mOriginalSetPathString; 154bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang private AppBridge mAppBridge; 1553b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang private SnailItem mScreenNailItem; 1563b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang private SnailAlbum mScreenNailSet; 157bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang private OrientationManager mOrientationManager; 15854fe6202b6f7d233e7645c121321fe0f3d20fc8bYuli Huang private boolean mTreatBackAsUp; 1597eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu private boolean mStartInFilmstrip; 1603ad7bbc55d7aaa0f36a7242fdd0f612d877adc19Bobby Georgescu private boolean mHasCameraScreennailOrPlaceholder = false; 161d81b264931cfa3b34096efd46659b81f9a628fb5Bobby Georgescu private boolean mRecenterCameraOnResume = true; 16215b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang 163a680a0c32ae3321c632288b36083f2782af2c55bDoris Liu // These are only valid after the panorama callback 164a680a0c32ae3321c632288b36083f2782af2c55bDoris Liu private boolean mIsPanorama; 165a680a0c32ae3321c632288b36083f2782af2c55bDoris Liu private boolean mIsPanorama360; 166a680a0c32ae3321c632288b36083f2782af2c55bDoris Liu 167b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu private long mCameraSwitchCutoff = 0; 168b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu private boolean mSkipUpdateCurrentPhoto = false; 169b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu private static final long CAMERA_SWITCH_CUTOFF_THRESHOLD_MS = 300; 170b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu 1714b4dbd225685502f4249c2bf25bf74f7ce526645George Mount private static final long DEFERRED_UPDATE_MS = 250; 172e23a9d412cba5a202405e1c99c0cf080949db2c7Bobby Georgescu private boolean mDeferredUpdateWaiting = false; 173e23a9d412cba5a202405e1c99c0cf080949db2c7Bobby Georgescu private long mDeferUpdateUntil = Long.MAX_VALUE; 174e23a9d412cba5a202405e1c99c0cf080949db2c7Bobby Georgescu 1756b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang // The item that is deleted (but it can still be undeleted before commiting) 1766b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang private Path mDeletePath; 1776b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang private boolean mDeleteIsFocus; // whether the deleted item was in focus 1786b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang 179ddf0225a5192a589fc578945f56440b09bf74d12John Reck private Uri[] mNfcPushUris = new Uri[1]; 18033ef03776b7734717b16f6fc861b831fb1b1dfacMartijn Coenen 1812bb717f1ea38e2ce33dd102a23afe6bfacb5675cOwen Lin private final MyMenuVisibilityListener mMenuVisibilityListener = 1822bb717f1ea38e2ce33dd102a23afe6bfacb5675cOwen Lin new MyMenuVisibilityListener(); 183f122d56e15e00928d731751796b0509ae47c6799George Mount private UpdateProgressListener mProgressListener; 1842bb717f1ea38e2ce33dd102a23afe6bfacb5675cOwen Lin 1854b4dbd225685502f4249c2bf25bf74f7ce526645George Mount private final PanoramaSupportCallback mUpdatePanoramaMenuItemsCallback = new PanoramaSupportCallback() { 1864b4dbd225685502f4249c2bf25bf74f7ce526645George Mount @Override 1874b4dbd225685502f4249c2bf25bf74f7ce526645George Mount public void panoramaInfoAvailable(MediaObject mediaObject, boolean isPanorama, 1884b4dbd225685502f4249c2bf25bf74f7ce526645George Mount boolean isPanorama360) { 1894b4dbd225685502f4249c2bf25bf74f7ce526645George Mount if (mediaObject == mCurrentPhoto) { 1904b4dbd225685502f4249c2bf25bf74f7ce526645George Mount mHandler.obtainMessage(MSG_UPDATE_PANORAMA_UI, isPanorama360 ? 1 : 0, 0, 1914b4dbd225685502f4249c2bf25bf74f7ce526645George Mount mediaObject).sendToTarget(); 192825afb1b3e7d15b5c258d664ee008dc68da1c407Mangesh Ghiware } 1934b4dbd225685502f4249c2bf25bf74f7ce526645George Mount } 1944b4dbd225685502f4249c2bf25bf74f7ce526645George Mount }; 1954b4dbd225685502f4249c2bf25bf74f7ce526645George Mount 1964b4dbd225685502f4249c2bf25bf74f7ce526645George Mount private final PanoramaSupportCallback mRefreshBottomControlsCallback = new PanoramaSupportCallback() { 1974b4dbd225685502f4249c2bf25bf74f7ce526645George Mount @Override 1984b4dbd225685502f4249c2bf25bf74f7ce526645George Mount public void panoramaInfoAvailable(MediaObject mediaObject, boolean isPanorama, 1994b4dbd225685502f4249c2bf25bf74f7ce526645George Mount boolean isPanorama360) { 2004b4dbd225685502f4249c2bf25bf74f7ce526645George Mount if (mediaObject == mCurrentPhoto) { 201a680a0c32ae3321c632288b36083f2782af2c55bDoris Liu mHandler.obtainMessage(MSG_REFRESH_BOTTOM_CONTROLS, isPanorama ? 1 : 0, isPanorama360 ? 1 : 0, 202a680a0c32ae3321c632288b36083f2782af2c55bDoris Liu mediaObject).sendToTarget(); 2034b4dbd225685502f4249c2bf25bf74f7ce526645George Mount } 2044b4dbd225685502f4249c2bf25bf74f7ce526645George Mount } 2054b4dbd225685502f4249c2bf25bf74f7ce526645George Mount }; 2064b4dbd225685502f4249c2bf25bf74f7ce526645George Mount 2074b4dbd225685502f4249c2bf25bf74f7ce526645George Mount private final PanoramaSupportCallback mUpdateShareURICallback = new PanoramaSupportCallback() { 2084b4dbd225685502f4249c2bf25bf74f7ce526645George Mount @Override 2094b4dbd225685502f4249c2bf25bf74f7ce526645George Mount public void panoramaInfoAvailable(MediaObject mediaObject, boolean isPanorama, 2104b4dbd225685502f4249c2bf25bf74f7ce526645George Mount boolean isPanorama360) { 2114b4dbd225685502f4249c2bf25bf74f7ce526645George Mount if (mediaObject == mCurrentPhoto) { 2124b4dbd225685502f4249c2bf25bf74f7ce526645George Mount mHandler.obtainMessage(MSG_UPDATE_SHARE_URI, isPanorama360 ? 1 : 0, 0, mediaObject) 2134b4dbd225685502f4249c2bf25bf74f7ce526645George Mount .sendToTarget(); 2144b4dbd225685502f4249c2bf25bf74f7ce526645George Mount } 2154b4dbd225685502f4249c2bf25bf74f7ce526645George Mount } 2164b4dbd225685502f4249c2bf25bf74f7ce526645George Mount }; 217825afb1b3e7d15b5c258d664ee008dc68da1c407Mangesh Ghiware 218f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public static interface Model extends PhotoView.Model { 219f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void resume(); 220f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void pause(); 221f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public boolean isEmpty(); 222f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void setCurrentPhoto(Path path, int indexHint); 223f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 224f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 225f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private class MyMenuVisibilityListener implements OnMenuVisibilityListener { 22606c6401eededc2ec842ba4994a838c2ded0a666cPin Ting @Override 227f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void onMenuVisibilityChanged(boolean isVisible) { 228f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mIsMenuVisible = isVisible; 229f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin refreshHidingMessage(); 230f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 231f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 232f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 233f122d56e15e00928d731751796b0509ae47c6799George Mount private class UpdateProgressListener implements StitchingChangeListener { 234f122d56e15e00928d731751796b0509ae47c6799George Mount 235f122d56e15e00928d731751796b0509ae47c6799George Mount @Override 2364e091eb758a3ac1016b373419cea1ada1b977bc5George Mount public void onStitchingResult(Uri uri) { 237825afb1b3e7d15b5c258d664ee008dc68da1c407Mangesh Ghiware sendUpdate(uri, MSG_REFRESH_IMAGE); 238f122d56e15e00928d731751796b0509ae47c6799George Mount } 239f122d56e15e00928d731751796b0509ae47c6799George Mount 240f122d56e15e00928d731751796b0509ae47c6799George Mount @Override 2414e091eb758a3ac1016b373419cea1ada1b977bc5George Mount public void onStitchingQueued(Uri uri) { 242825afb1b3e7d15b5c258d664ee008dc68da1c407Mangesh Ghiware sendUpdate(uri, MSG_UPDATE_PROGRESS); 243f122d56e15e00928d731751796b0509ae47c6799George Mount } 244f122d56e15e00928d731751796b0509ae47c6799George Mount 245f122d56e15e00928d731751796b0509ae47c6799George Mount @Override 2464e091eb758a3ac1016b373419cea1ada1b977bc5George Mount public void onStitchingProgress(Uri uri, final int progress) { 247825afb1b3e7d15b5c258d664ee008dc68da1c407Mangesh Ghiware sendUpdate(uri, MSG_UPDATE_PROGRESS); 248f122d56e15e00928d731751796b0509ae47c6799George Mount } 249f122d56e15e00928d731751796b0509ae47c6799George Mount 250825afb1b3e7d15b5c258d664ee008dc68da1c407Mangesh Ghiware private void sendUpdate(Uri uri, int message) { 2514b4dbd225685502f4249c2bf25bf74f7ce526645George Mount MediaObject currentPhoto = mCurrentPhoto; 2524b4dbd225685502f4249c2bf25bf74f7ce526645George Mount boolean isCurrentPhoto = currentPhoto instanceof LocalImage 2534b4dbd225685502f4249c2bf25bf74f7ce526645George Mount && currentPhoto.getContentUri().equals(uri); 254f122d56e15e00928d731751796b0509ae47c6799George Mount if (isCurrentPhoto) { 255825afb1b3e7d15b5c258d664ee008dc68da1c407Mangesh Ghiware mHandler.sendEmptyMessage(message); 256f122d56e15e00928d731751796b0509ae47c6799George Mount } 257f122d56e15e00928d731751796b0509ae47c6799George Mount } 258f122d56e15e00928d731751796b0509ae47c6799George Mount }; 259f122d56e15e00928d731751796b0509ae47c6799George Mount 260915c2c5b2c367df71599370613af0924bd7c4887Bobby Georgescu @Override 261915c2c5b2c367df71599370613af0924bd7c4887Bobby Georgescu protected int getBackgroundColorId() { 262915c2c5b2c367df71599370613af0924bd7c4887Bobby Georgescu return R.color.photo_background; 263915c2c5b2c367df71599370613af0924bd7c4887Bobby Georgescu } 264915c2c5b2c367df71599370613af0924bd7c4887Bobby Georgescu 265f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu private final GLView mRootPane = new GLView() { 266f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 267f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin protected void onLayout( 268f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin boolean changed, int left, int top, int right, int bottom) { 269f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mPhotoView.layout(0, 0, right - left, bottom - top); 270f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (mShowDetails) { 2718cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen mDetailsHelper.layout(left, mActionBar.getHeight(), right, bottom); 272f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 273f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 274f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin }; 275f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 276f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 277f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void onCreate(Bundle data, Bundle restoreState) { 27845c56f2d34c71d0bc9b84ebeef6d1314738d0fc0Bobby Georgescu super.onCreate(data, restoreState); 2798cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen mActionBar = mActivity.getGalleryActionBar(); 280f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mSelectionManager = new SelectionManager(mActivity, false); 281f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mMenuExecutor = new MenuExecutor(mActivity, mSelectionManager); 282f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 283f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mPhotoView = new PhotoView(mActivity); 284bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang mPhotoView.setListener(this); 285f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mRootPane.addComponent(mPhotoView); 28683be4e0c9b8e3372eff8f9b1a396afd961b72921Angus Kong mApplication = (GalleryApp) ((Activity) mActivity).getApplication(); 287bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang mOrientationManager = mActivity.getOrientationManager(); 2882ef46ed28b28b355d7f3f1432c7b1196b832a859Chih-Chung Chang mActivity.getGLRoot().setOrientationSource(mOrientationManager); 289f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 290d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu mHandler = new SynchronizedHandler(mActivity.getGLRoot()) { 291d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu @Override 292d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu public void handleMessage(Message message) { 293d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu switch (message.what) { 294d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu case MSG_HIDE_BARS: { 295d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu hideBars(); 296d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu break; 297d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu } 298f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu case MSG_REFRESH_BOTTOM_CONTROLS: { 2994b4dbd225685502f4249c2bf25bf74f7ce526645George Mount if (mCurrentPhoto == message.obj && mBottomControls != null) { 300a680a0c32ae3321c632288b36083f2782af2c55bDoris Liu mIsPanorama = message.arg1 == 1; 301a680a0c32ae3321c632288b36083f2782af2c55bDoris Liu mIsPanorama360 = message.arg2 == 1; 302a680a0c32ae3321c632288b36083f2782af2c55bDoris Liu mBottomControls.refresh(); 3034b4dbd225685502f4249c2bf25bf74f7ce526645George Mount } 304d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu break; 305d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu } 306d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu case MSG_ON_FULL_SCREEN_CHANGED: { 307db99a10b6ac9296d612db8ba51e37f141fee4170Bobby Georgescu if (mAppBridge != null) { 308db99a10b6ac9296d612db8ba51e37f141fee4170Bobby Georgescu mAppBridge.onFullScreenChanged(message.arg1 == 1); 309db99a10b6ac9296d612db8ba51e37f141fee4170Bobby Georgescu } 310d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu break; 311d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu } 312d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu case MSG_UPDATE_ACTION_BAR: { 313d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu updateBars(); 314d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu break; 315d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu } 316d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu case MSG_WANT_BARS: { 317d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu wantBars(); 318d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu break; 319d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu } 320d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu case MSG_UNFREEZE_GLROOT: { 321d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu mActivity.getGLRoot().unfreeze(); 322d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu break; 323d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu } 324e23a9d412cba5a202405e1c99c0cf080949db2c7Bobby Georgescu case MSG_UPDATE_DEFERRED: { 325e23a9d412cba5a202405e1c99c0cf080949db2c7Bobby Georgescu long nextUpdate = mDeferUpdateUntil - SystemClock.uptimeMillis(); 326e23a9d412cba5a202405e1c99c0cf080949db2c7Bobby Georgescu if (nextUpdate <= 0) { 327e23a9d412cba5a202405e1c99c0cf080949db2c7Bobby Georgescu mDeferredUpdateWaiting = false; 328e23a9d412cba5a202405e1c99c0cf080949db2c7Bobby Georgescu updateUIForCurrentPhoto(); 329e23a9d412cba5a202405e1c99c0cf080949db2c7Bobby Georgescu } else { 330e23a9d412cba5a202405e1c99c0cf080949db2c7Bobby Georgescu mHandler.sendEmptyMessageDelayed(MSG_UPDATE_DEFERRED, nextUpdate); 331e23a9d412cba5a202405e1c99c0cf080949db2c7Bobby Georgescu } 332e23a9d412cba5a202405e1c99c0cf080949db2c7Bobby Georgescu break; 333e23a9d412cba5a202405e1c99c0cf080949db2c7Bobby Georgescu } 334b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu case MSG_ON_CAMERA_CENTER: { 335b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu mSkipUpdateCurrentPhoto = false; 336bbc993162d687df20e2ff9a329bb9b6e04926ba8Bobby Georgescu boolean stayedOnCamera = false; 337b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu if (!mPhotoView.getFilmMode()) { 338bbc993162d687df20e2ff9a329bb9b6e04926ba8Bobby Georgescu stayedOnCamera = true; 339b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu } else if (SystemClock.uptimeMillis() < mCameraSwitchCutoff && 340b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu mMediaSet.getMediaItemCount() > 1) { 341b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu mPhotoView.switchToImage(1); 342b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu } else { 343cc6ad8217cb09b778d400c9c5e5928170ca53737Bobby Georgescu if (mAppBridge != null) mPhotoView.setFilmMode(false); 344bbc993162d687df20e2ff9a329bb9b6e04926ba8Bobby Georgescu stayedOnCamera = true; 345b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu } 346b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu 347bbc993162d687df20e2ff9a329bb9b6e04926ba8Bobby Georgescu if (stayedOnCamera) { 348cc6ad8217cb09b778d400c9c5e5928170ca53737Bobby Georgescu if (mAppBridge == null) { 3495bd00332556b20c141b5c7f16433d55b1bc7fe0fBobby Georgescu launchCamera(); 350cc6ad8217cb09b778d400c9c5e5928170ca53737Bobby Georgescu /* We got here by swiping from photo 1 to the 351cc6ad8217cb09b778d400c9c5e5928170ca53737Bobby Georgescu placeholder, so make it be the thing that 352cc6ad8217cb09b778d400c9c5e5928170ca53737Bobby Georgescu is in focus when the user presses back from 353cc6ad8217cb09b778d400c9c5e5928170ca53737Bobby Georgescu the camera app */ 354cc6ad8217cb09b778d400c9c5e5928170ca53737Bobby Georgescu mPhotoView.switchToImage(1); 355cc6ad8217cb09b778d400c9c5e5928170ca53737Bobby Georgescu } else { 356cc6ad8217cb09b778d400c9c5e5928170ca53737Bobby Georgescu updateBars(); 357cc6ad8217cb09b778d400c9c5e5928170ca53737Bobby Georgescu updateCurrentPhoto(mModel.getMediaItem(0)); 358cc6ad8217cb09b778d400c9c5e5928170ca53737Bobby Georgescu } 359b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu } 360b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu break; 361b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu } 362f4e22eb44bfae0c2a3b6570f19480c8c3535d808Bobby Georgescu case MSG_ON_PICTURE_CENTER: { 363e23a9d412cba5a202405e1c99c0cf080949db2c7Bobby Georgescu if (!mPhotoView.getFilmMode() && mCurrentPhoto != null 364f4e22eb44bfae0c2a3b6570f19480c8c3535d808Bobby Georgescu && (mCurrentPhoto.getSupportedOperations() & MediaObject.SUPPORT_ACTION) != 0) { 365f4e22eb44bfae0c2a3b6570f19480c8c3535d808Bobby Georgescu mPhotoView.setFilmMode(true); 366f4e22eb44bfae0c2a3b6570f19480c8c3535d808Bobby Georgescu } 367f4e22eb44bfae0c2a3b6570f19480c8c3535d808Bobby Georgescu break; 368f4e22eb44bfae0c2a3b6570f19480c8c3535d808Bobby Georgescu } 369f122d56e15e00928d731751796b0509ae47c6799George Mount case MSG_REFRESH_IMAGE: { 370423e45e492d4ebdc41ecfeba73299de23b1463c4Mangesh Ghiware final MediaItem photo = mCurrentPhoto; 371423e45e492d4ebdc41ecfeba73299de23b1463c4Mangesh Ghiware mCurrentPhoto = null; 372423e45e492d4ebdc41ecfeba73299de23b1463c4Mangesh Ghiware updateCurrentPhoto(photo); 373423e45e492d4ebdc41ecfeba73299de23b1463c4Mangesh Ghiware break; 374423e45e492d4ebdc41ecfeba73299de23b1463c4Mangesh Ghiware } 375423e45e492d4ebdc41ecfeba73299de23b1463c4Mangesh Ghiware case MSG_UPDATE_PHOTO_UI: { 376825afb1b3e7d15b5c258d664ee008dc68da1c407Mangesh Ghiware updateUIForCurrentPhoto(); 377825afb1b3e7d15b5c258d664ee008dc68da1c407Mangesh Ghiware break; 378825afb1b3e7d15b5c258d664ee008dc68da1c407Mangesh Ghiware } 379825afb1b3e7d15b5c258d664ee008dc68da1c407Mangesh Ghiware case MSG_UPDATE_PROGRESS: { 380825afb1b3e7d15b5c258d664ee008dc68da1c407Mangesh Ghiware updateProgressBar(); 381f122d56e15e00928d731751796b0509ae47c6799George Mount break; 382f122d56e15e00928d731751796b0509ae47c6799George Mount } 3834b4dbd225685502f4249c2bf25bf74f7ce526645George Mount case MSG_UPDATE_SHARE_URI: { 3844b4dbd225685502f4249c2bf25bf74f7ce526645George Mount if (mCurrentPhoto == message.obj) { 3854b4dbd225685502f4249c2bf25bf74f7ce526645George Mount boolean isPanorama360 = message.arg1 != 0; 3864b4dbd225685502f4249c2bf25bf74f7ce526645George Mount Uri contentUri = mCurrentPhoto.getContentUri(); 3874b4dbd225685502f4249c2bf25bf74f7ce526645George Mount Intent panoramaIntent = null; 3884b4dbd225685502f4249c2bf25bf74f7ce526645George Mount if (isPanorama360) { 3894b4dbd225685502f4249c2bf25bf74f7ce526645George Mount panoramaIntent = createSharePanoramaIntent(contentUri); 3904b4dbd225685502f4249c2bf25bf74f7ce526645George Mount } 3914b4dbd225685502f4249c2bf25bf74f7ce526645George Mount Intent shareIntent = createShareIntent(mCurrentPhoto); 3924b4dbd225685502f4249c2bf25bf74f7ce526645George Mount 3934b4dbd225685502f4249c2bf25bf74f7ce526645George Mount mActionBar.setShareIntents(panoramaIntent, shareIntent); 3944b4dbd225685502f4249c2bf25bf74f7ce526645George Mount setNfcBeamPushUri(contentUri); 3954b4dbd225685502f4249c2bf25bf74f7ce526645George Mount } 3964b4dbd225685502f4249c2bf25bf74f7ce526645George Mount break; 3974b4dbd225685502f4249c2bf25bf74f7ce526645George Mount } 3984b4dbd225685502f4249c2bf25bf74f7ce526645George Mount case MSG_UPDATE_PANORAMA_UI: { 3994b4dbd225685502f4249c2bf25bf74f7ce526645George Mount if (mCurrentPhoto == message.obj) { 4004b4dbd225685502f4249c2bf25bf74f7ce526645George Mount boolean isPanorama360 = message.arg1 != 0; 4014b4dbd225685502f4249c2bf25bf74f7ce526645George Mount updatePanoramaUI(isPanorama360); 4024b4dbd225685502f4249c2bf25bf74f7ce526645George Mount } 4034b4dbd225685502f4249c2bf25bf74f7ce526645George Mount break; 4044b4dbd225685502f4249c2bf25bf74f7ce526645George Mount } 405d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu default: throw new AssertionError(message.what); 406d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu } 407d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu } 408d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu }; 409d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu 41084c220f10a643927c8a2126de8a755d8d7f7ec9eRay Chen mSetPathString = data.getString(KEY_MEDIA_SET_PATH); 411b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang mOriginalSetPathString = mSetPathString; 412ddf0225a5192a589fc578945f56440b09bf74d12John Reck setupNfcBeamPush(); 4137eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu String itemPathString = data.getString(KEY_MEDIA_ITEM_PATH); 4147eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu Path itemPath = itemPathString != null ? 4157eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu Path.fromString(data.getString(KEY_MEDIA_ITEM_PATH)) : 4167eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu null; 41754fe6202b6f7d233e7645c121321fe0f3d20fc8bYuli Huang mTreatBackAsUp = data.getBoolean(KEY_TREAT_BACK_AS_UP, false); 41845f089d69141e3fb0dfaad9bc34d275b61eb2aeeBobby Georgescu mStartInFilmstrip = data.getBoolean(KEY_START_IN_FILMSTRIP, false); 4193ad7bbc55d7aaa0f36a7242fdd0f612d877adc19Bobby Georgescu boolean inCameraRoll = data.getBoolean(KEY_IN_CAMERA_ROLL, false); 42045f089d69141e3fb0dfaad9bc34d275b61eb2aeeBobby Georgescu mCurrentIndex = data.getInt(KEY_INDEX_HINT, 0); 42184c220f10a643927c8a2126de8a755d8d7f7ec9eRay Chen if (mSetPathString != null) { 422ba65c373f244f6de0b45afa6b7cd711866f1bfe4Bobby Georgescu mShowSpinner = true; 423bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang mAppBridge = (AppBridge) data.getParcelable(KEY_APP_BRIDGE); 424bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang if (mAppBridge != null) { 4257eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu mShowBars = false; 4263ad7bbc55d7aaa0f36a7242fdd0f612d877adc19Bobby Georgescu mHasCameraScreennailOrPlaceholder = true; 427253c5aec7692afdd7880fbd169d4b44d5679cbc0Chih-Chung Chang mAppBridge.setServer(this); 428b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang 429bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang // Get the ScreenNail from AppBridge and register it. 4303b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang int id = SnailSource.newId(); 431b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang Path screenNailSetPath = SnailSource.getSetPath(id); 432bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang Path screenNailItemPath = SnailSource.getItemPath(id); 4333b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang mScreenNailSet = (SnailAlbum) mActivity.getDataManager() 4343b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang .getMediaObject(screenNailSetPath); 4353b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang mScreenNailItem = (SnailItem) mActivity.getDataManager() 436bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang .getMediaObject(screenNailItemPath); 4373b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang mScreenNailItem.setScreenNail(mAppBridge.attachScreenNail()); 438b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang 43923e595f0c656ebaeb63f78e3018b5830628c5afeWu-cheng Li if (data.getBoolean(KEY_SHOW_WHEN_LOCKED, false)) { 440efd480e85dc5bd0d2ca0ac82d03e141212388830Wu-cheng Li // Set the flag to be on top of the lock screen. 441efd480e85dc5bd0d2ca0ac82d03e141212388830Wu-cheng Li mFlags |= FLAG_SHOW_WHEN_LOCKED; 442a0ce682e40c39ce046c48d8a7f989fff01bb9f2cWu-cheng Li } 443a0ce682e40c39ce046c48d8a7f989fff01bb9f2cWu-cheng Li 4444e091eb758a3ac1016b373419cea1ada1b977bc5George Mount // Don't display "empty album" action item for capture intents. 4452c83c5f09aa79d81ee11da517fd62222f8c3337dWu-cheng Li if (!mSetPathString.equals("/local/all/0")) { 4462c83c5f09aa79d81ee11da517fd62222f8c3337dWu-cheng Li // Check if the path is a secure album. 4472c83c5f09aa79d81ee11da517fd62222f8c3337dWu-cheng Li if (SecureSource.isSecurePath(mSetPathString)) { 4482c83c5f09aa79d81ee11da517fd62222f8c3337dWu-cheng Li mSecureAlbum = (SecureAlbum) mActivity.getDataManager() 4492c83c5f09aa79d81ee11da517fd62222f8c3337dWu-cheng Li .getMediaSet(mSetPathString); 4502c83c5f09aa79d81ee11da517fd62222f8c3337dWu-cheng Li mShowSpinner = false; 4512c83c5f09aa79d81ee11da517fd62222f8c3337dWu-cheng Li } 452c7e3c76d6965f520a9651d309052c5f01726cd58Bobby Georgescu mSetPathString = "/filter/empty/{"+mSetPathString+"}"; 453c7e3c76d6965f520a9651d309052c5f01726cd58Bobby Georgescu } 454c7e3c76d6965f520a9651d309052c5f01726cd58Bobby Georgescu 4553b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang // Combine the original MediaSet with the one for ScreenNail 4563b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang // from AppBridge. 457b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang mSetPathString = "/combo/item/{" + screenNailSetPath + 458b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang "," + mSetPathString + "}"; 459b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang 460b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang // Start from the screen nail. 461bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang itemPath = screenNailItemPath; 4623ad7bbc55d7aaa0f36a7242fdd0f612d877adc19Bobby Georgescu } else if (inCameraRoll && GalleryUtils.isCameraAvailable(mActivity)) { 46345f089d69141e3fb0dfaad9bc34d275b61eb2aeeBobby Georgescu mSetPathString = "/combo/item/{" + FilterSource.FILTER_CAMERA_SHORTCUT + 46445f089d69141e3fb0dfaad9bc34d275b61eb2aeeBobby Georgescu "," + mSetPathString + "}"; 46545f089d69141e3fb0dfaad9bc34d275b61eb2aeeBobby Georgescu mCurrentIndex++; 4663ad7bbc55d7aaa0f36a7242fdd0f612d877adc19Bobby Georgescu mHasCameraScreennailOrPlaceholder = true; 467b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang } 468b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang 4696118af9ddad8acc050133154f8f60c842c7f9bfaChih-Chung Chang MediaSet originalSet = mActivity.getDataManager() 4706118af9ddad8acc050133154f8f60c842c7f9bfaChih-Chung Chang .getMediaSet(mSetPathString); 4713ad7bbc55d7aaa0f36a7242fdd0f612d877adc19Bobby Georgescu if (mHasCameraScreennailOrPlaceholder && originalSet instanceof ComboAlbum) { 472ee899c09c88e5b054397ac44ad20e5055cd24f39Bobby Georgescu // Use the name of the camera album rather than the default 473ee899c09c88e5b054397ac44ad20e5055cd24f39Bobby Georgescu // ComboAlbum behavior 474ee899c09c88e5b054397ac44ad20e5055cd24f39Bobby Georgescu ((ComboAlbum) originalSet).useNameOfChild(1); 475ee899c09c88e5b054397ac44ad20e5055cd24f39Bobby Georgescu } 4766118af9ddad8acc050133154f8f60c842c7f9bfaChih-Chung Chang mSelectionManager.setSourceMediaSet(originalSet); 4776b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang mSetPathString = "/filter/delete/{" + mSetPathString + "}"; 4786b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang mMediaSet = (FilterDeleteSet) mActivity.getDataManager() 4796b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang .getMediaSet(mSetPathString); 480f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (mMediaSet == null) { 48184c220f10a643927c8a2126de8a755d8d7f7ec9eRay Chen Log.w(TAG, "failed to restore " + mSetPathString); 482f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 4837eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu if (itemPath == null) { 4843eb2e643a40d1be77998373343cdf8b14764f58cBobby Georgescu int mediaItemCount = mMediaSet.getMediaItemCount(); 4853eb2e643a40d1be77998373343cdf8b14764f58cBobby Georgescu if (mediaItemCount > 0) { 4863eb2e643a40d1be77998373343cdf8b14764f58cBobby Georgescu if (mCurrentIndex >= mediaItemCount) mCurrentIndex = 0; 487d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu itemPath = mMediaSet.getMediaItem(mCurrentIndex, 1) 488d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu .get(0).getPath(); 489d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu } else { 4903eb2e643a40d1be77998373343cdf8b14764f58cBobby Georgescu // Bail out, PhotoPage can't load on an empty album 491d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu return; 492d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu } 4937eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu } 494f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin PhotoDataAdapter pda = new PhotoDataAdapter( 495bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang mActivity, mPhotoView, mMediaSet, itemPath, mCurrentIndex, 49643a80fd806247cb50e81bacda3ad21d210e9ae88Angus Kong mAppBridge == null ? -1 : 0, 497dbb6acc204ba6f095eb0e49e1298e9ceda2c3096Wu-cheng Li mAppBridge == null ? false : mAppBridge.isPanorama(), 498dbb6acc204ba6f095eb0e49e1298e9ceda2c3096Wu-cheng Li mAppBridge == null ? false : mAppBridge.isStaticCamera()); 499f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mModel = pda; 500f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mPhotoView.setModel(mModel); 501f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 502f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin pda.setDataListener(new PhotoDataAdapter.DataListener() { 503f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 504113bfc77c4468411da9ae1290553c3be89f8df9aOwen Lin @Override 505f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void onPhotoChanged(int index, Path item) { 50600ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu int oldIndex = mCurrentIndex; 507f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mCurrentIndex = index; 508b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu 5093ad7bbc55d7aaa0f36a7242fdd0f612d877adc19Bobby Georgescu if (mHasCameraScreennailOrPlaceholder) { 510b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu if (mCurrentIndex > 0) { 511b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu mSkipUpdateCurrentPhoto = false; 512b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu } 513b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu 51400ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu if (oldIndex == 0 && mCurrentIndex > 0 51500ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu && !mPhotoView.getFilmMode()) { 51600ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu mPhotoView.setFilmMode(true); 517b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu } else if (oldIndex == 2 && mCurrentIndex == 1) { 518b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu mCameraSwitchCutoff = SystemClock.uptimeMillis() + 519b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu CAMERA_SWITCH_CUTOFF_THRESHOLD_MS; 520b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu mPhotoView.stopScrolling(); 521bbc993162d687df20e2ff9a329bb9b6e04926ba8Bobby Georgescu } else if (oldIndex >= 1 && mCurrentIndex == 0) { 522f4e22eb44bfae0c2a3b6570f19480c8c3535d808Bobby Georgescu mPhotoView.setWantPictureCenterCallbacks(true); 523b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu mSkipUpdateCurrentPhoto = true; 52400ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu } 52500ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu } 526b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu if (!mSkipUpdateCurrentPhoto) { 527b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu if (item != null) { 528b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu MediaItem photo = mModel.getMediaItem(0); 529b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu if (photo != null) updateCurrentPhoto(photo); 530b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu } 531b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu updateBars(); 532b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu } 53300ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu // Reset the timeout for the bars after a swipe 53400ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu refreshHidingMessage(); 535f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 536f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 537f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 53805da3f520eacb9219964b6ed57ef37846d889fd7Hung-ying Tyan public void onLoadingFinished(boolean loadingFailed) { 539f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (!mModel.isEmpty()) { 540616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin MediaItem photo = mModel.getMediaItem(0); 541f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (photo != null) updateCurrentPhoto(photo); 542f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } else if (mIsActive) { 543c370476adcf29f311ceec70a119792a0168781e9Chih-Chung Chang // We only want to finish the PhotoPage if there is no 544c370476adcf29f311ceec70a119792a0168781e9Chih-Chung Chang // deletion that the user can undo. 545c370476adcf29f311ceec70a119792a0168781e9Chih-Chung Chang if (mMediaSet.getNumberOfDeletions() == 0) { 546c370476adcf29f311ceec70a119792a0168781e9Chih-Chung Chang mActivity.getStateManager().finishState( 547c370476adcf29f311ceec70a119792a0168781e9Chih-Chung Chang PhotoPage.this); 548c370476adcf29f311ceec70a119792a0168781e9Chih-Chung Chang } 549f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 550f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 551f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 552f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 553f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void onLoadingStarted() { 554f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 555f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin }); 556f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } else { 557f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin // Get default media set by the URI 558f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin MediaItem mediaItem = (MediaItem) 559f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mActivity.getDataManager().getMediaObject(itemPath); 560f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mModel = new SinglePhotoDataAdapter(mActivity, mPhotoView, mediaItem); 561f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mPhotoView.setModel(mModel); 562f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin updateCurrentPhoto(mediaItem); 563ba65c373f244f6de0b45afa6b7cd711866f1bfe4Bobby Georgescu mShowSpinner = false; 564f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 565cf46a3abc26aac7cdb6b6993aeade053304b71d9Ray Chen 566b265ebb01cc046b74329eeb28dbecb24e0f953d2Bobby Georgescu mPhotoView.setFilmMode(mStartInFilmstrip && mMediaSet.getMediaItemCount() > 1); 567f122d56e15e00928d731751796b0509ae47c6799George Mount RelativeLayout galleryRoot = (RelativeLayout) ((Activity) mActivity) 568f122d56e15e00928d731751796b0509ae47c6799George Mount .findViewById(mAppBridge != null ? R.id.content : R.id.gallery_root); 569f122d56e15e00928d731751796b0509ae47c6799George Mount if (galleryRoot != null) { 570f122d56e15e00928d731751796b0509ae47c6799George Mount if (mSecureAlbum == null) { 571f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu mBottomControls = new PhotoPageBottomControls(this, mActivity, galleryRoot); 572f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu } 573f122d56e15e00928d731751796b0509ae47c6799George Mount StitchingProgressManager progressManager = mApplication.getStitchingProgressManager(); 574f122d56e15e00928d731751796b0509ae47c6799George Mount if (progressManager != null) { 575f122d56e15e00928d731751796b0509ae47c6799George Mount mProgressBar = new PhotoPageProgressBar(mActivity, galleryRoot); 576f122d56e15e00928d731751796b0509ae47c6799George Mount mProgressListener = new UpdateProgressListener(); 577f122d56e15e00928d731751796b0509ae47c6799George Mount progressManager.addChangeListener(mProgressListener); 578294b9945e01ec41c1e9e58dfcd5d6e106ee2d538Wu-cheng Li if (mSecureAlbum != null) { 579294b9945e01ec41c1e9e58dfcd5d6e106ee2d538Wu-cheng Li progressManager.addChangeListener(mSecureAlbum); 580294b9945e01ec41c1e9e58dfcd5d6e106ee2d538Wu-cheng Li } 581f122d56e15e00928d731751796b0509ae47c6799George Mount } 582f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu } 583a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu } 584a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu 585e3b50f1bfcfa5c8729f31788eac1a6109a88988bSascha Haeberling @Override 586f4e22eb44bfae0c2a3b6570f19480c8c3535d808Bobby Georgescu public void onPictureCenter(boolean isCamera) { 5873ad7bbc55d7aaa0f36a7242fdd0f612d877adc19Bobby Georgescu isCamera = isCamera || (mHasCameraScreennailOrPlaceholder && mAppBridge == null); 588f4e22eb44bfae0c2a3b6570f19480c8c3535d808Bobby Georgescu mPhotoView.setWantPictureCenterCallbacks(false); 589f4e22eb44bfae0c2a3b6570f19480c8c3535d808Bobby Georgescu mHandler.removeMessages(MSG_ON_CAMERA_CENTER); 590f4e22eb44bfae0c2a3b6570f19480c8c3535d808Bobby Georgescu mHandler.removeMessages(MSG_ON_PICTURE_CENTER); 591f4e22eb44bfae0c2a3b6570f19480c8c3535d808Bobby Georgescu mHandler.sendEmptyMessage(isCamera ? MSG_ON_CAMERA_CENTER : MSG_ON_PICTURE_CENTER); 592b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu } 593b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu 594e3b50f1bfcfa5c8729f31788eac1a6109a88988bSascha Haeberling @Override 595f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu public boolean canDisplayBottomControls() { 596949584340c9f5f41a6133ba06058af280490f0c8Bobby Georgescu return mIsActive && !mPhotoView.canUndo(); 597a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu } 598a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu 599e3b50f1bfcfa5c8729f31788eac1a6109a88988bSascha Haeberling @Override 600a680a0c32ae3321c632288b36083f2782af2c55bDoris Liu public boolean canDisplayBottomControl(int control) { 6014b4dbd225685502f4249c2bf25bf74f7ce526645George Mount if (mCurrentPhoto == null) { 6024b4dbd225685502f4249c2bf25bf74f7ce526645George Mount return false; 6034b4dbd225685502f4249c2bf25bf74f7ce526645George Mount } 604f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu switch(control) { 605f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu case R.id.photopage_bottom_control_edit: 606d2724f69edf39cf2019eac1b49f316d22ab70d0aBobby Georgescu return mHaveImageEditor && mShowBars 607c02be7d6224c0b4e81c86e19c3d101ea070c7e1dBobby Georgescu && !mPhotoView.getFilmMode() 6084b4dbd225685502f4249c2bf25bf74f7ce526645George Mount && (mCurrentPhoto.getSupportedOperations() & MediaItem.SUPPORT_EDIT) != 0 6094b4dbd225685502f4249c2bf25bf74f7ce526645George Mount && mCurrentPhoto.getMediaType() == MediaObject.MEDIA_TYPE_IMAGE; 610f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu case R.id.photopage_bottom_control_panorama: 611a680a0c32ae3321c632288b36083f2782af2c55bDoris Liu return mIsPanorama; 612a680a0c32ae3321c632288b36083f2782af2c55bDoris Liu case R.id.photopage_bottom_control_tiny_planet: 613a680a0c32ae3321c632288b36083f2782af2c55bDoris Liu return mHaveImageEditor && mShowBars 614c02be7d6224c0b4e81c86e19c3d101ea070c7e1dBobby Georgescu && mIsPanorama360 && !mPhotoView.getFilmMode(); 615f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu default: 616f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu return false; 617f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu } 618a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu } 619a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu 620e3b50f1bfcfa5c8729f31788eac1a6109a88988bSascha Haeberling @Override 621f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu public void onBottomControlClicked(int control) { 622f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu switch(control) { 623f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu case R.id.photopage_bottom_control_edit: 624f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu launchPhotoEditor(); 625f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu return; 626f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu case R.id.photopage_bottom_control_panorama: 627e3b50f1bfcfa5c8729f31788eac1a6109a88988bSascha Haeberling mActivity.getPanoramaViewHelper() 628e3b50f1bfcfa5c8729f31788eac1a6109a88988bSascha Haeberling .showPanorama(mCurrentPhoto.getContentUri()); 629f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu return; 630a680a0c32ae3321c632288b36083f2782af2c55bDoris Liu case R.id.photopage_bottom_control_tiny_planet: 631a680a0c32ae3321c632288b36083f2782af2c55bDoris Liu launchTinyPlanet(); 632a680a0c32ae3321c632288b36083f2782af2c55bDoris Liu return; 633f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu default: 634f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu return; 635a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu } 636f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 637f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 6386772173d2a49b87a1d209f42fe52b5f830596f99Chih-Chung Chang @TargetApi(ApiHelper.VERSION_CODES.JELLY_BEAN) 639ddf0225a5192a589fc578945f56440b09bf74d12John Reck private void setupNfcBeamPush() { 640ddf0225a5192a589fc578945f56440b09bf74d12John Reck if (!ApiHelper.HAS_SET_BEAM_PUSH_URIS) return; 641ddf0225a5192a589fc578945f56440b09bf74d12John Reck 642ddf0225a5192a589fc578945f56440b09bf74d12John Reck NfcAdapter adapter = NfcAdapter.getDefaultAdapter(mActivity); 643ddf0225a5192a589fc578945f56440b09bf74d12John Reck if (adapter != null) { 6442619f20d30123a391cc6d37515fe8eb9d81d5029John Reck adapter.setBeamPushUris(null, mActivity); 645ddf0225a5192a589fc578945f56440b09bf74d12John Reck adapter.setBeamPushUrisCallback(new CreateBeamUrisCallback() { 646ddf0225a5192a589fc578945f56440b09bf74d12John Reck @Override 647ddf0225a5192a589fc578945f56440b09bf74d12John Reck public Uri[] createBeamUris(NfcEvent event) { 648ddf0225a5192a589fc578945f56440b09bf74d12John Reck return mNfcPushUris; 649ddf0225a5192a589fc578945f56440b09bf74d12John Reck } 650ddf0225a5192a589fc578945f56440b09bf74d12John Reck }, mActivity); 651fc86994f86f8cfb31e151c9e730dc1e9dc7b3349Yuli Huang } 652fc86994f86f8cfb31e151c9e730dc1e9dc7b3349Yuli Huang } 653fc86994f86f8cfb31e151c9e730dc1e9dc7b3349Yuli Huang 654ddf0225a5192a589fc578945f56440b09bf74d12John Reck private void setNfcBeamPushUri(Uri uri) { 655ddf0225a5192a589fc578945f56440b09bf74d12John Reck mNfcPushUris[0] = uri; 656ddf0225a5192a589fc578945f56440b09bf74d12John Reck } 657ddf0225a5192a589fc578945f56440b09bf74d12John Reck 6584b4dbd225685502f4249c2bf25bf74f7ce526645George Mount private static Intent createShareIntent(MediaObject mediaObject) { 6594b4dbd225685502f4249c2bf25bf74f7ce526645George Mount int type = mediaObject.getMediaType(); 660ca181a68a30ad830d55eb8886f62a323c64e1ba3Owen Lin return new Intent(Intent.ACTION_SEND) 661ca181a68a30ad830d55eb8886f62a323c64e1ba3Owen Lin .setType(MenuExecutor.getMimeType(type)) 6624b4dbd225685502f4249c2bf25bf74f7ce526645George Mount .putExtra(Intent.EXTRA_STREAM, mediaObject.getContentUri()) 663ca181a68a30ad830d55eb8886f62a323c64e1ba3Owen Lin .addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); 6645172dee697c05235ddf932827d75e6fa0b81d382Mangesh Ghiware } 665fb5571987f2555b04731b6f3e1c479efc16d542aWu-cheng Li 6664b4dbd225685502f4249c2bf25bf74f7ce526645George Mount private static Intent createSharePanoramaIntent(Uri contentUri) { 667ca181a68a30ad830d55eb8886f62a323c64e1ba3Owen Lin return new Intent(Intent.ACTION_SEND) 668ca181a68a30ad830d55eb8886f62a323c64e1ba3Owen Lin .setType(GalleryUtils.MIME_TYPE_PANORAMA360) 6694b4dbd225685502f4249c2bf25bf74f7ce526645George Mount .putExtra(Intent.EXTRA_STREAM, contentUri) 670ca181a68a30ad830d55eb8886f62a323c64e1ba3Owen Lin .addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); 671fb5571987f2555b04731b6f3e1c479efc16d542aWu-cheng Li } 672fb5571987f2555b04731b6f3e1c479efc16d542aWu-cheng Li 67348129f36b96928b34e657cdc976c1ac19f7b5ad2Bobby Georgescu private void overrideTransitionToEditor() { 67448129f36b96928b34e657cdc976c1ac19f7b5ad2Bobby Georgescu ((Activity) mActivity).overridePendingTransition(android.R.anim.slide_in_left, 67548129f36b96928b34e657cdc976c1ac19f7b5ad2Bobby Georgescu android.R.anim.fade_out); 67648129f36b96928b34e657cdc976c1ac19f7b5ad2Bobby Georgescu } 67748129f36b96928b34e657cdc976c1ac19f7b5ad2Bobby Georgescu 678a680a0c32ae3321c632288b36083f2782af2c55bDoris Liu private void launchTinyPlanet() { 679a680a0c32ae3321c632288b36083f2782af2c55bDoris Liu // Deep link into tiny planet 680a680a0c32ae3321c632288b36083f2782af2c55bDoris Liu MediaItem current = mModel.getMediaItem(0); 681a680a0c32ae3321c632288b36083f2782af2c55bDoris Liu Intent intent = new Intent(FilterShowActivity.TINY_PLANET_ACTION); 682a680a0c32ae3321c632288b36083f2782af2c55bDoris Liu intent.setClass(mActivity, FilterShowActivity.class); 683a680a0c32ae3321c632288b36083f2782af2c55bDoris Liu intent.setDataAndType(current.getContentUri(), current.getMimeType()) 684a680a0c32ae3321c632288b36083f2782af2c55bDoris Liu .setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); 685a850a543225e9f7a72c5a49bb6099573c7efda13Bobby Georgescu intent.putExtra(FilterShowActivity.LAUNCH_FULLSCREEN, 686a850a543225e9f7a72c5a49bb6099573c7efda13Bobby Georgescu mActivity.isFullscreen()); 687a680a0c32ae3321c632288b36083f2782af2c55bDoris Liu mActivity.startActivityForResult(intent, REQUEST_EDIT); 68848129f36b96928b34e657cdc976c1ac19f7b5ad2Bobby Georgescu overrideTransitionToEditor(); 689a680a0c32ae3321c632288b36083f2782af2c55bDoris Liu } 690a680a0c32ae3321c632288b36083f2782af2c55bDoris Liu 6915bd00332556b20c141b5c7f16433d55b1bc7fe0fBobby Georgescu private void launchCamera() { 6929ec5de9dbf46caecd2f0b38a72d31fa37ecb0466Bobby Georgescu Intent intent = new Intent(mActivity, CameraActivity.class) 6939ec5de9dbf46caecd2f0b38a72d31fa37ecb0466Bobby Georgescu .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 6945bd00332556b20c141b5c7f16433d55b1bc7fe0fBobby Georgescu mRecenterCameraOnResume = false; 6955bd00332556b20c141b5c7f16433d55b1bc7fe0fBobby Georgescu mActivity.startActivity(intent); 6965bd00332556b20c141b5c7f16433d55b1bc7fe0fBobby Georgescu } 6975bd00332556b20c141b5c7f16433d55b1bc7fe0fBobby Georgescu 698a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu private void launchPhotoEditor() { 699a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu MediaItem current = mModel.getMediaItem(0); 700462923e5800e151ab5ec450063334ba430c1da3aBobby Georgescu if (current == null || (current.getSupportedOperations() 701462923e5800e151ab5ec450063334ba430c1da3aBobby Georgescu & MediaObject.SUPPORT_EDIT) == 0) { 702462923e5800e151ab5ec450063334ba430c1da3aBobby Georgescu return; 703462923e5800e151ab5ec450063334ba430c1da3aBobby Georgescu } 704a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu 705a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu Intent intent = new Intent(ACTION_NEXTGEN_EDIT); 706b6692653af5dbce477f33df721aa6177fabeda4bOwen Lin 707b6692653af5dbce477f33df721aa6177fabeda4bOwen Lin intent.setDataAndType(current.getContentUri(), current.getMimeType()) 708b6692653af5dbce477f33df721aa6177fabeda4bOwen Lin .setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); 709a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu if (mActivity.getPackageManager() 710a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu .queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY).size() == 0) { 711a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu intent.setAction(Intent.ACTION_EDIT); 712a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu } 713a850a543225e9f7a72c5a49bb6099573c7efda13Bobby Georgescu intent.putExtra(FilterShowActivity.LAUNCH_FULLSCREEN, 714a850a543225e9f7a72c5a49bb6099573c7efda13Bobby Georgescu mActivity.isFullscreen()); 715a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu ((Activity) mActivity).startActivityForResult(Intent.createChooser(intent, null), 716a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu REQUEST_EDIT); 71748129f36b96928b34e657cdc976c1ac19f7b5ad2Bobby Georgescu overrideTransitionToEditor(); 718a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu } 719a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu 720e23a9d412cba5a202405e1c99c0cf080949db2c7Bobby Georgescu private void requestDeferredUpdate() { 721e23a9d412cba5a202405e1c99c0cf080949db2c7Bobby Georgescu mDeferUpdateUntil = SystemClock.uptimeMillis() + DEFERRED_UPDATE_MS; 722e23a9d412cba5a202405e1c99c0cf080949db2c7Bobby Georgescu if (!mDeferredUpdateWaiting) { 723e23a9d412cba5a202405e1c99c0cf080949db2c7Bobby Georgescu mDeferredUpdateWaiting = true; 724e23a9d412cba5a202405e1c99c0cf080949db2c7Bobby Georgescu mHandler.sendEmptyMessageDelayed(MSG_UPDATE_DEFERRED, DEFERRED_UPDATE_MS); 725e23a9d412cba5a202405e1c99c0cf080949db2c7Bobby Georgescu } 726e23a9d412cba5a202405e1c99c0cf080949db2c7Bobby Georgescu } 727e23a9d412cba5a202405e1c99c0cf080949db2c7Bobby Georgescu 728e23a9d412cba5a202405e1c99c0cf080949db2c7Bobby Georgescu private void updateUIForCurrentPhoto() { 729f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (mCurrentPhoto == null) return; 730c7e3c76d6965f520a9651d309052c5f01726cd58Bobby Georgescu 731c7e3c76d6965f520a9651d309052c5f01726cd58Bobby Georgescu // If by swiping or deletion the user ends up on an action item 732c7e3c76d6965f520a9651d309052c5f01726cd58Bobby Georgescu // and zoomed in, zoom out so that the context of the action is 733c7e3c76d6965f520a9651d309052c5f01726cd58Bobby Georgescu // more clear 734e23a9d412cba5a202405e1c99c0cf080949db2c7Bobby Georgescu if ((mCurrentPhoto.getSupportedOperations() & MediaObject.SUPPORT_ACTION) != 0 735c7e3c76d6965f520a9651d309052c5f01726cd58Bobby Georgescu && !mPhotoView.getFilmMode()) { 736f4e22eb44bfae0c2a3b6570f19480c8c3535d808Bobby Georgescu mPhotoView.setWantPictureCenterCallbacks(true); 737c7e3c76d6965f520a9651d309052c5f01726cd58Bobby Georgescu } 738c7e3c76d6965f520a9651d309052c5f01726cd58Bobby Georgescu 739f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin updateMenuOperations(); 7404b4dbd225685502f4249c2bf25bf74f7ce526645George Mount refreshBottomControlsWhenReady(); 741f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (mShowDetails) { 742995c4566bed7df1aa48ba7e1351f964efa73880bMichael Kolb mDetailsHelper.reloadDetails(); 743f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 744898a2f4540635528a0916b0a6b0a177869854ae9Wu-cheng Li if ((mSecureAlbum == null) 745e23a9d412cba5a202405e1c99c0cf080949db2c7Bobby Georgescu && (mCurrentPhoto.getSupportedOperations() & MediaItem.SUPPORT_SHARE) != 0) { 7464b4dbd225685502f4249c2bf25bf74f7ce526645George Mount mCurrentPhoto.getPanoramaSupport(mUpdateShareURICallback); 747e23a9d412cba5a202405e1c99c0cf080949db2c7Bobby Georgescu } 748825afb1b3e7d15b5c258d664ee008dc68da1c407Mangesh Ghiware updateProgressBar(); 749e23a9d412cba5a202405e1c99c0cf080949db2c7Bobby Georgescu } 750e23a9d412cba5a202405e1c99c0cf080949db2c7Bobby Georgescu 751e23a9d412cba5a202405e1c99c0cf080949db2c7Bobby Georgescu private void updateCurrentPhoto(MediaItem photo) { 752e23a9d412cba5a202405e1c99c0cf080949db2c7Bobby Georgescu if (mCurrentPhoto == photo) return; 753e23a9d412cba5a202405e1c99c0cf080949db2c7Bobby Georgescu mCurrentPhoto = photo; 754e23a9d412cba5a202405e1c99c0cf080949db2c7Bobby Georgescu if (mPhotoView.getFilmMode()) { 755e23a9d412cba5a202405e1c99c0cf080949db2c7Bobby Georgescu requestDeferredUpdate(); 756e23a9d412cba5a202405e1c99c0cf080949db2c7Bobby Georgescu } else { 757e23a9d412cba5a202405e1c99c0cf080949db2c7Bobby Georgescu updateUIForCurrentPhoto(); 75815b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang } 759825afb1b3e7d15b5c258d664ee008dc68da1c407Mangesh Ghiware } 760825afb1b3e7d15b5c258d664ee008dc68da1c407Mangesh Ghiware 761825afb1b3e7d15b5c258d664ee008dc68da1c407Mangesh Ghiware private void updateProgressBar() { 762785a1f8a5856b199f6553a92020e77621516c608George Mount if (mProgressBar != null) { 763785a1f8a5856b199f6553a92020e77621516c608George Mount mProgressBar.hideProgress(); 764785a1f8a5856b199f6553a92020e77621516c608George Mount StitchingProgressManager progressManager = mApplication.getStitchingProgressManager(); 765785a1f8a5856b199f6553a92020e77621516c608George Mount if (progressManager != null && mCurrentPhoto instanceof LocalImage) { 766825afb1b3e7d15b5c258d664ee008dc68da1c407Mangesh Ghiware Integer progress = progressManager.getProgress(mCurrentPhoto.getContentUri()); 767785a1f8a5856b199f6553a92020e77621516c608George Mount if (progress != null) { 768785a1f8a5856b199f6553a92020e77621516c608George Mount mProgressBar.setProgress(progress); 769785a1f8a5856b199f6553a92020e77621516c608George Mount } 770f122d56e15e00928d731751796b0509ae47c6799George Mount } 771f122d56e15e00928d731751796b0509ae47c6799George Mount } 772f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 773f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 774f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private void updateMenuOperations() { 77524081fe26ca25448ddb9c8f9cc7f406d26344decOwen Lin Menu menu = mActionBar.getMenu(); 77624081fe26ca25448ddb9c8f9cc7f406d26344decOwen Lin 77724081fe26ca25448ddb9c8f9cc7f406d26344decOwen Lin // it could be null if onCreateActionBar has not been called yet 77824081fe26ca25448ddb9c8f9cc7f406d26344decOwen Lin if (menu == null) return; 77924081fe26ca25448ddb9c8f9cc7f406d26344decOwen Lin 78024081fe26ca25448ddb9c8f9cc7f406d26344decOwen Lin MenuItem item = menu.findItem(R.id.action_slideshow); 78153fe9f72433f2fdae30e1708c5933390202cbcf5John Reck if (item != null) { 78253fe9f72433f2fdae30e1708c5933390202cbcf5John Reck item.setVisible((mSecureAlbum == null) && canDoSlideShow()); 78353fe9f72433f2fdae30e1708c5933390202cbcf5John Reck } 7842066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang if (mCurrentPhoto == null) return; 78524081fe26ca25448ddb9c8f9cc7f406d26344decOwen Lin 786f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin int supportedOperations = mCurrentPhoto.getSupportedOperations(); 787898a2f4540635528a0916b0a6b0a177869854ae9Wu-cheng Li if (mSecureAlbum != null) { 78824081fe26ca25448ddb9c8f9cc7f406d26344decOwen Lin supportedOperations &= MediaObject.SUPPORT_DELETE; 7898fe22ecb8e744a09a2e0d867f876ecbf74c82298John Reck } else if (!mHaveImageEditor) { 790f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin supportedOperations &= ~MediaObject.SUPPORT_EDIT; 791f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 79224081fe26ca25448ddb9c8f9cc7f406d26344decOwen Lin MenuExecutor.updateMenuOperation(menu, supportedOperations); 7934b4dbd225685502f4249c2bf25bf74f7ce526645George Mount mCurrentPhoto.getPanoramaSupport(mUpdatePanoramaMenuItemsCallback); 794f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 795f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 7962066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang private boolean canDoSlideShow() { 7972066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang if (mMediaSet == null || mCurrentPhoto == null) { 7982066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang return false; 7992066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang } 8002066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang if (mCurrentPhoto.getMediaType() != MediaObject.MEDIA_TYPE_IMAGE) { 8012066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang return false; 8022066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang } 8036b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang if (MtpSource.isMtpPath(mOriginalSetPathString)) { 8042066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang return false; 8052066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang } 8062066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang return true; 8072066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang } 8082066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang 80961f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang ////////////////////////////////////////////////////////////////////////// 81061f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang // Action Bar show/hide management 81161f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang ////////////////////////////////////////////////////////////////////////// 81261f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang 813f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private void showBars() { 814f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (mShowBars) return; 815f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mShowBars = true; 816e6251df06f0b3c8f556043f8b725b4b19be7474dChih-Chung Chang mOrientationManager.unlockOrientation(); 817f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mActionBar.show(); 8180b2486cff0c1b951c54325596256b986307f7f3aChih-Chung Chang mActivity.getGLRoot().setLightsOutMode(false); 81961f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang refreshHidingMessage(); 8204b4dbd225685502f4249c2bf25bf74f7ce526645George Mount refreshBottomControlsWhenReady(); 821f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 822f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 823f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private void hideBars() { 824f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (!mShowBars) return; 825f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mShowBars = false; 826f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mActionBar.hide(); 8270b2486cff0c1b951c54325596256b986307f7f3aChih-Chung Chang mActivity.getGLRoot().setLightsOutMode(true); 82861f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang mHandler.removeMessages(MSG_HIDE_BARS); 8294b4dbd225685502f4249c2bf25bf74f7ce526645George Mount refreshBottomControlsWhenReady(); 830f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 831f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 832f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private void refreshHidingMessage() { 833f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mHandler.removeMessages(MSG_HIDE_BARS); 8347eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu if (!mIsMenuVisible && !mPhotoView.getFilmMode()) { 835f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mHandler.sendEmptyMessageDelayed(MSG_HIDE_BARS, HIDE_BARS_TIMEOUT); 836f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 837f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 838f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 839aeb3062e84ed28f0e25a73f511f287ae0a3e4294Chih-Chung Chang private boolean canShowBars() { 840aeb3062e84ed28f0e25a73f511f287ae0a3e4294Chih-Chung Chang // No bars if we are showing camera preview. 84156bdcb7272f222fde5e4c6fc133cb490b31c7667Bobby Georgescu if (mAppBridge != null && mCurrentIndex == 0 84256bdcb7272f222fde5e4c6fc133cb490b31c7667Bobby Georgescu && !mPhotoView.getFilmMode()) return false; 84356bdcb7272f222fde5e4c6fc133cb490b31c7667Bobby Georgescu 844aeb3062e84ed28f0e25a73f511f287ae0a3e4294Chih-Chung Chang // No bars if it's not allowed. 845aeb3062e84ed28f0e25a73f511f287ae0a3e4294Chih-Chung Chang if (!mActionBarAllowed) return false; 846aeb3062e84ed28f0e25a73f511f287ae0a3e4294Chih-Chung Chang 847aeb3062e84ed28f0e25a73f511f287ae0a3e4294Chih-Chung Chang return true; 848aeb3062e84ed28f0e25a73f511f287ae0a3e4294Chih-Chung Chang } 849aeb3062e84ed28f0e25a73f511f287ae0a3e4294Chih-Chung Chang 850e6251df06f0b3c8f556043f8b725b4b19be7474dChih-Chung Chang private void wantBars() { 851e6251df06f0b3c8f556043f8b725b4b19be7474dChih-Chung Chang if (canShowBars()) showBars(); 852e6251df06f0b3c8f556043f8b725b4b19be7474dChih-Chung Chang } 853e6251df06f0b3c8f556043f8b725b4b19be7474dChih-Chung Chang 85461f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang private void toggleBars() { 855f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (mShowBars) { 856f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin hideBars(); 857aeb3062e84ed28f0e25a73f511f287ae0a3e4294Chih-Chung Chang } else { 858e6251df06f0b3c8f556043f8b725b4b19be7474dChih-Chung Chang if (canShowBars()) showBars(); 859f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 860f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 861f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 86261f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang private void updateBars() { 863e6251df06f0b3c8f556043f8b725b4b19be7474dChih-Chung Chang if (!canShowBars()) { 86461f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang hideBars(); 86561f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang } 866f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 867f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 868f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 869f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin protected void onBackPressed() { 870f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (mShowDetails) { 871f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin hideDetails(); 8723b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang } else if (mAppBridge == null || !switchWithCaptureAnimation(-1)) { 873bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang // We are leaving this page. Set the result now. 874bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang setResult(); 8757eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu if (mStartInFilmstrip && !mPhotoView.getFilmMode()) { 8767eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu mPhotoView.setFilmMode(true); 8777eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu } else if (mTreatBackAsUp) { 87854fe6202b6f7d233e7645c121321fe0f3d20fc8bYuli Huang onUpPressed(); 87954fe6202b6f7d233e7645c121321fe0f3d20fc8bYuli Huang } else { 88054fe6202b6f7d233e7645c121321fe0f3d20fc8bYuli Huang super.onBackPressed(); 88154fe6202b6f7d233e7645c121321fe0f3d20fc8bYuli Huang } 882f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 883f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 884f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 885b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang private void onUpPressed() { 886833f775afc9515567dc5aaf0cafe20e006e77545Bobby Georgescu if ((mStartInFilmstrip || mAppBridge != null) 887833f775afc9515567dc5aaf0cafe20e006e77545Bobby Georgescu && !mPhotoView.getFilmMode()) { 8887eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu mPhotoView.setFilmMode(true); 8897eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu return; 8907eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu } 8917eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu 892b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang if (mActivity.getStateManager().getStateCount() > 1) { 8937eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu setResult(); 894b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang super.onBackPressed(); 895ba12eae90b5b1a80ee002aa0df8c5c5189c4faa3Chih-Chung Chang return; 89666ca848b2f58b813d366642088d274a1b7c4a90cChih-Chung Chang } 89766ca848b2f58b813d366642088d274a1b7c4a90cChih-Chung Chang 89866ca848b2f58b813d366642088d274a1b7c4a90cChih-Chung Chang if (mOriginalSetPathString == null) return; 89966ca848b2f58b813d366642088d274a1b7c4a90cChih-Chung Chang 90066ca848b2f58b813d366642088d274a1b7c4a90cChih-Chung Chang if (mAppBridge == null) { 901b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang // We're in view mode so set up the stacks on our own. 902b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang Bundle data = new Bundle(getData()); 903b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang data.putString(AlbumPage.KEY_MEDIA_PATH, mOriginalSetPathString); 904b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang data.putString(AlbumPage.KEY_PARENT_MEDIA_PATH, 905b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang mActivity.getDataManager().getTopSetPath( 906b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang DataManager.INCLUDE_ALL)); 907b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang mActivity.getStateManager().switchState(this, AlbumPage.class, data); 90866ca848b2f58b813d366642088d274a1b7c4a90cChih-Chung Chang } else { 909833f775afc9515567dc5aaf0cafe20e006e77545Bobby Georgescu GalleryUtils.startGalleryActivity(mActivity); 910b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang } 911b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang } 912b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang 913bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang private void setResult() { 914bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang Intent result = null; 9157eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu result = new Intent(); 9167eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu result.putExtra(KEY_RETURN_INDEX_HINT, mCurrentIndex); 917bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang setStateResult(Activity.RESULT_OK, result); 918bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang } 919bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang 920bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang ////////////////////////////////////////////////////////////////////////// 921bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang // AppBridge.Server interface 922bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang ////////////////////////////////////////////////////////////////////////// 923bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang 924bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang @Override 9252ef46ed28b28b355d7f3f1432c7b1196b832a859Chih-Chung Chang public void setCameraRelativeFrame(Rect frame) { 9262ef46ed28b28b355d7f3f1432c7b1196b832a859Chih-Chung Chang mPhotoView.setCameraRelativeFrame(frame); 927bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang } 928bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang 929bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang @Override 9302c6173822a612597c79be41b126367ddfbb5d518Chih-Chung Chang public boolean switchWithCaptureAnimation(int offset) { 9312c6173822a612597c79be41b126367ddfbb5d518Chih-Chung Chang return mPhotoView.switchWithCaptureAnimation(offset); 9322c6173822a612597c79be41b126367ddfbb5d518Chih-Chung Chang } 9332c6173822a612597c79be41b126367ddfbb5d518Chih-Chung Chang 934f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 9356575794a9c09f22d5721e212c093e0a2df376d0cChih-Chung Chang public void setSwipingEnabled(boolean enabled) { 9366575794a9c09f22d5721e212c093e0a2df376d0cChih-Chung Chang mPhotoView.setSwipingEnabled(enabled); 9376575794a9c09f22d5721e212c093e0a2df376d0cChih-Chung Chang } 9386575794a9c09f22d5721e212c093e0a2df376d0cChih-Chung Chang 9396575794a9c09f22d5721e212c093e0a2df376d0cChih-Chung Chang @Override 9403b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang public void notifyScreenNailChanged() { 9413b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang mScreenNailItem.setScreenNail(mAppBridge.attachScreenNail()); 9423b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang mScreenNailSet.notifyChange(); 9433b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang } 9443b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang 9453b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang @Override 946a0ce682e40c39ce046c48d8a7f989fff01bb9f2cWu-cheng Li public void addSecureAlbumItem(boolean isVideo, int id) { 947a0ce682e40c39ce046c48d8a7f989fff01bb9f2cWu-cheng Li mSecureAlbum.addMediaItem(isVideo, id); 948a0ce682e40c39ce046c48d8a7f989fff01bb9f2cWu-cheng Li } 949a0ce682e40c39ce046c48d8a7f989fff01bb9f2cWu-cheng Li 950a0ce682e40c39ce046c48d8a7f989fff01bb9f2cWu-cheng Li @Override 951f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin protected boolean onCreateActionBar(Menu menu) { 952b21b8e58a604f6c701245d84b141b5b87663192bOwen Lin mActionBar.createActionBarMenu(R.menu.photo, menu); 9538fe22ecb8e744a09a2e0d867f876ecbf74c82298John Reck mHaveImageEditor = GalleryUtils.isEditorAvailable(mActivity, "image/*"); 954f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin updateMenuOperations(); 9553cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu mActionBar.setTitle(mMediaSet != null ? mMediaSet.getName() : ""); 956b21b8e58a604f6c701245d84b141b5b87663192bOwen Lin return true; 957f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 958f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 959d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin private MenuExecutor.ProgressListener mConfirmDialogListener = 960d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin new MenuExecutor.ProgressListener() { 961d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin @Override 962d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin public void onProgressUpdate(int index) {} 963d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin 964d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin @Override 965d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin public void onProgressComplete(int result) {} 966d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin 967d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin @Override 968d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin public void onConfirmDialogShown() { 969d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin mHandler.removeMessages(MSG_HIDE_BARS); 970d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin } 971d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin 972d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin @Override 973d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin public void onConfirmDialogDismissed(boolean confirmed) { 974d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin refreshHidingMessage(); 975d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin } 976ba50b9420e64731fd5aa8b1410e1f36457a1635aBobby Georgescu 977ba50b9420e64731fd5aa8b1410e1f36457a1635aBobby Georgescu @Override 978ba50b9420e64731fd5aa8b1410e1f36457a1635aBobby Georgescu public void onProgressStart() {} 979d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin }; 980d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin 9813cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu private void switchToGrid() { 9825585826e68c62c3719fb346d40fd1999438c6c6bBobby Georgescu if (mActivity.getStateManager().hasStateClass(AlbumPage.class)) { 9833cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu onUpPressed(); 9843cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu } else { 9853cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu if (mOriginalSetPathString == null) return; 9864dd4d80af4cd3ba7555c12d1c1ba775e048b6c57George Mount if (mProgressBar != null) { 9874dd4d80af4cd3ba7555c12d1c1ba775e048b6c57George Mount updateCurrentPhoto(null); 9884dd4d80af4cd3ba7555c12d1c1ba775e048b6c57George Mount mProgressBar.hideProgress(); 9894dd4d80af4cd3ba7555c12d1c1ba775e048b6c57George Mount } 9903cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu Bundle data = new Bundle(getData()); 9913cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu data.putString(AlbumPage.KEY_MEDIA_PATH, mOriginalSetPathString); 9923cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu data.putString(AlbumPage.KEY_PARENT_MEDIA_PATH, 9933cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu mActivity.getDataManager().getTopSetPath( 9943cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu DataManager.INCLUDE_ALL)); 9953cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu 9963cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu // We only show cluster menu in the first AlbumPage in stack 9973cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu // TODO: Enable this when running from the camera app 9983cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu boolean inAlbum = mActivity.getStateManager().hasStateClass(AlbumPage.class); 9993cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu data.putBoolean(AlbumPage.KEY_SHOW_CLUSTER_MENU, !inAlbum 10003cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu && mAppBridge == null); 10013cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu 10023cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu data.putBoolean(PhotoPage.KEY_APP_BRIDGE, mAppBridge != null); 10033cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu 10043cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu // Account for live preview being first item 10053cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu mActivity.getTransitionStore().put(KEY_RETURN_INDEX_HINT, 10063cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu mAppBridge != null ? mCurrentIndex - 1 : mCurrentIndex); 10073cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu 10083ad7bbc55d7aaa0f36a7242fdd0f612d877adc19Bobby Georgescu if (mHasCameraScreennailOrPlaceholder && mAppBridge != null) { 10095585826e68c62c3719fb346d40fd1999438c6c6bBobby Georgescu mActivity.getStateManager().startState(AlbumPage.class, data); 10105585826e68c62c3719fb346d40fd1999438c6c6bBobby Georgescu } else { 10115585826e68c62c3719fb346d40fd1999438c6c6bBobby Georgescu mActivity.getStateManager().switchState(this, AlbumPage.class, data); 10125585826e68c62c3719fb346d40fd1999438c6c6bBobby Georgescu } 10133cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu } 10143cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu } 10153cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu 1016f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 1017f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin protected boolean onItemSelected(MenuItem item) { 1018d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu if (mModel == null) return true; 1019d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin refreshHidingMessage(); 1020616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin MediaItem current = mModel.getMediaItem(0); 1021f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 1022f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (current == null) { 1023f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin // item is not ready, ignore 1024f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return true; 1025f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 1026f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 1027f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin int currentIndex = mModel.getCurrentIndex(); 1028f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin Path path = current.getPath(); 1029f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 1030f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin DataManager manager = mActivity.getDataManager(); 1031f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin int action = item.getItemId(); 10329a033b07b8e0d9fe7419b7a0d876e9c7febf43c8Ray Chen String confirmMsg = null; 1033f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin switch (action) { 103484c220f10a643927c8a2126de8a755d8d7f7ec9eRay Chen case android.R.id.home: { 1035b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang onUpPressed(); 103684c220f10a643927c8a2126de8a755d8d7f7ec9eRay Chen return true; 103784c220f10a643927c8a2126de8a755d8d7f7ec9eRay Chen } 1038f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin case R.id.action_slideshow: { 1039f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin Bundle data = new Bundle(); 10406cf807453fb58ccd4cc513ff187b306c7090e67cOwen Lin data.putString(SlideshowPage.KEY_SET_PATH, mMediaSet.getPath().toString()); 1041604f053d040782159b61d3b74ee533bc2c0ccdd0Ray Chen data.putString(SlideshowPage.KEY_ITEM_PATH, path.toString()); 1042f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin data.putInt(SlideshowPage.KEY_PHOTO_INDEX, currentIndex); 1043f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin data.putBoolean(SlideshowPage.KEY_REPEAT, true); 1044f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mActivity.getStateManager().startStateForResult( 1045f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin SlideshowPage.class, REQUEST_SLIDESHOW, data); 1046f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return true; 1047f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 1048f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin case R.id.action_crop: { 1049898a2f4540635528a0916b0a6b0a177869854ae9Wu-cheng Li Activity activity = mActivity; 105063926d2ed2ca2921de8dca9b3a52c1d64d8afc46Ruben Brunk Intent intent = new Intent(FilterShowActivity.CROP_ACTION); 105163926d2ed2ca2921de8dca9b3a52c1d64d8afc46Ruben Brunk intent.setClass(activity, FilterShowActivity.class); 105263926d2ed2ca2921de8dca9b3a52c1d64d8afc46Ruben Brunk intent.setDataAndType(manager.getContentUri(path), current.getMimeType()) 105363926d2ed2ca2921de8dca9b3a52c1d64d8afc46Ruben Brunk .setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); 1054f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin activity.startActivityForResult(intent, PicasaSource.isPicasaImage(current) 1055f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin ? REQUEST_CROP_PICASA 1056f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin : REQUEST_CROP); 1057f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return true; 1058f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 105950ea2d2938218ac6b2039f0e42998cfbbc45d1f1Teng-Hui Zhu case R.id.action_trim: { 10603f1f1baf3a674927e25cd5cd885fb372796bd3a0Teng-Hui Zhu Intent intent = new Intent(mActivity, TrimVideo.class); 10613f1f1baf3a674927e25cd5cd885fb372796bd3a0Teng-Hui Zhu intent.setData(manager.getContentUri(path)); 106215ff1b1ca52bea348b8a490b5b5abe53fa43eaf2Teng-Hui Zhu // We need the file path to wrap this into a RandomAccessFile. 106315ff1b1ca52bea348b8a490b5b5abe53fa43eaf2Teng-Hui Zhu intent.putExtra(KEY_MEDIA_ITEM_PATH, current.getFilePath()); 10643f1f1baf3a674927e25cd5cd885fb372796bd3a0Teng-Hui Zhu mActivity.startActivityForResult(intent, REQUEST_TRIM); 106550ea2d2938218ac6b2039f0e42998cfbbc45d1f1Teng-Hui Zhu return true; 106650ea2d2938218ac6b2039f0e42998cfbbc45d1f1Teng-Hui Zhu } 1067f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang case R.id.action_edit: { 1068a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu launchPhotoEditor(); 1069f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang return true; 1070f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang } 1071f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin case R.id.action_details: { 1072f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (mShowDetails) { 1073f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin hideDetails(); 1074f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } else { 1075995c4566bed7df1aa48ba7e1351f964efa73880bMichael Kolb showDetails(); 1076f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 1077f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return true; 1078f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 107967098d1a72fd04e2af06d3a5939cde28c65f70d9Ray Chen case R.id.action_delete: 10809a033b07b8e0d9fe7419b7a0d876e9c7febf43c8Ray Chen confirmMsg = mActivity.getResources().getQuantityString( 10819a033b07b8e0d9fe7419b7a0d876e9c7febf43c8Ray Chen R.plurals.delete_selection, 1); 1082f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin case R.id.action_setas: 1083f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin case R.id.action_rotate_ccw: 1084f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin case R.id.action_rotate_cw: 1085f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin case R.id.action_show_on_map: 1086f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mSelectionManager.deSelectAll(); 1087f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mSelectionManager.toggle(path); 1088d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin mMenuExecutor.onMenuClicked(item, confirmMsg, mConfirmDialogListener); 1089f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return true; 1090f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin case R.id.action_import: 1091f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mSelectionManager.deSelectAll(); 1092f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mSelectionManager.toggle(path); 10939a033b07b8e0d9fe7419b7a0d876e9c7febf43c8Ray Chen mMenuExecutor.onMenuClicked(item, confirmMsg, 1094f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin new ImportCompleteListener(mActivity)); 1095f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return true; 1096f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin default : 1097f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return false; 1098f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 1099f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 1100f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 1101f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private void hideDetails() { 1102f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mShowDetails = false; 11034105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen mDetailsHelper.hide(); 1104f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 1105f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 1106995c4566bed7df1aa48ba7e1351f964efa73880bMichael Kolb private void showDetails() { 1107f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mShowDetails = true; 11084105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen if (mDetailsHelper == null) { 11094105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen mDetailsHelper = new DetailsHelper(mActivity, mRootPane, new MyDetailsSource()); 11104105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen mDetailsHelper.setCloseListener(new CloseListener() { 111106c6401eededc2ec842ba4994a838c2ded0a666cPin Ting @Override 1112f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void onClose() { 1113f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin hideDetails(); 1114f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 1115f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin }); 1116f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 11174105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen mDetailsHelper.show(); 1118f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 1119f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 1120bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang //////////////////////////////////////////////////////////////////////////// 1121bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang // Callbacks from PhotoView 1122bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang //////////////////////////////////////////////////////////////////////////// 1123bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang @Override 1124f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void onSingleTapUp(int x, int y) { 1125bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang if (mAppBridge != null) { 1126bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang if (mAppBridge.onSingleTapUp(x, y)) return; 1127014d9586d8145a33f4e99eaad570587f6d650026Wu-cheng Li } 1128014d9586d8145a33f4e99eaad570587f6d650026Wu-cheng Li 1129616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin MediaItem item = mModel.getMediaItem(0); 1130b5dc542fbaeaf99bebdcf775ef0e034e89e88eaeWu-cheng Li if (item == null || item == mScreenNailItem) { 1131b5dc542fbaeaf99bebdcf775ef0e034e89e88eaeWu-cheng Li // item is not ready or it is camera preview, ignore 1132f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return; 1133f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 1134f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 11358868aa1b2d199e7fa869c9c5fad3079175621002Wu-cheng Li int supported = item.getSupportedOperations(); 11363935ca3762344c5f8a306596d70c0d4d4a2fda4bAngus Kong boolean playVideo = ((supported & MediaItem.SUPPORT_PLAY) != 0); 11378868aa1b2d199e7fa869c9c5fad3079175621002Wu-cheng Li boolean unlock = ((supported & MediaItem.SUPPORT_UNLOCK) != 0); 1138c7e3c76d6965f520a9651d309052c5f01726cd58Bobby Georgescu boolean goBack = ((supported & MediaItem.SUPPORT_BACK) != 0); 113945f089d69141e3fb0dfaad9bc34d275b61eb2aeeBobby Georgescu boolean launchCamera = ((supported & MediaItem.SUPPORT_CAMERA_SHORTCUT) != 0); 1140f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 1141f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (playVideo) { 1142f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin // determine if the point is at center (1/6) of the photo view. 1143f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin // (The position of the "play" icon is at center (1/6) of the photo) 1144f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin int w = mPhotoView.getWidth(); 1145f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin int h = mPhotoView.getHeight(); 1146f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin playVideo = (Math.abs(x - w / 2) * 12 <= w) 1147f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin && (Math.abs(y - h / 2) * 12 <= h); 1148f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 1149f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 1150f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (playVideo) { 11513935ca3762344c5f8a306596d70c0d4d4a2fda4bAngus Kong if (mSecureAlbum == null) { 11523935ca3762344c5f8a306596d70c0d4d4a2fda4bAngus Kong playVideo(mActivity, item.getPlayUri(), item.getName()); 11533935ca3762344c5f8a306596d70c0d4d4a2fda4bAngus Kong } else { 11543935ca3762344c5f8a306596d70c0d4d4a2fda4bAngus Kong mActivity.getStateManager().finishState(this); 11553935ca3762344c5f8a306596d70c0d4d4a2fda4bAngus Kong } 1156c7e3c76d6965f520a9651d309052c5f01726cd58Bobby Georgescu } else if (goBack) { 1157c7e3c76d6965f520a9651d309052c5f01726cd58Bobby Georgescu onBackPressed(); 11588868aa1b2d199e7fa869c9c5fad3079175621002Wu-cheng Li } else if (unlock) { 115919ded6d4283a887c579a29da3832dde286e97688Wu-cheng Li Intent intent = new Intent(mActivity, Gallery.class); 116019ded6d4283a887c579a29da3832dde286e97688Wu-cheng Li intent.putExtra(Gallery.KEY_DISMISS_KEYGUARD, true); 116119ded6d4283a887c579a29da3832dde286e97688Wu-cheng Li mActivity.startActivity(intent); 116245f089d69141e3fb0dfaad9bc34d275b61eb2aeeBobby Georgescu } else if (launchCamera) { 11635bd00332556b20c141b5c7f16433d55b1bc7fe0fBobby Georgescu launchCamera(); 1164f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } else { 116561f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang toggleBars(); 1166f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 1167f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 1168f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 1169bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang @Override 117061f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang public void onActionBarAllowed(boolean allowed) { 117161f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang mActionBarAllowed = allowed; 117261f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang mHandler.sendEmptyMessage(MSG_UPDATE_ACTION_BAR); 117361f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang } 117461f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang 117561f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang @Override 1176e6251df06f0b3c8f556043f8b725b4b19be7474dChih-Chung Chang public void onActionBarWanted() { 1177e6251df06f0b3c8f556043f8b725b4b19be7474dChih-Chung Chang mHandler.sendEmptyMessage(MSG_WANT_BARS); 1178e6251df06f0b3c8f556043f8b725b4b19be7474dChih-Chung Chang } 1179e6251df06f0b3c8f556043f8b725b4b19be7474dChih-Chung Chang 1180e6251df06f0b3c8f556043f8b725b4b19be7474dChih-Chung Chang @Override 1181bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang public void onFullScreenChanged(boolean full) { 1182bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang Message m = mHandler.obtainMessage( 1183bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang MSG_ON_FULL_SCREEN_CHANGED, full ? 1 : 0, 0); 1184bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang m.sendToTarget(); 1185bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang } 1186bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang 11876b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang // How we do delete/undo: 11886b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang // 11896b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang // When the user choose to delete a media item, we just tell the 11906b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang // FilterDeleteSet to hide that item. If the user choose to undo it, we 11916b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang // again tell FilterDeleteSet not to hide it. If the user choose to commit 11926b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang // the deletion, we then actually delete the media item. 11936b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang @Override 11946b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang public void onDeleteImage(Path path, int offset) { 11956118af9ddad8acc050133154f8f60c842c7f9bfaChih-Chung Chang onCommitDeleteImage(); // commit the previous deletion 11966b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang mDeletePath = path; 11976b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang mDeleteIsFocus = (offset == 0); 11986118af9ddad8acc050133154f8f60c842c7f9bfaChih-Chung Chang mMediaSet.addDeletion(path, mCurrentIndex + offset); 11996b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang } 12006b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang 12016b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang @Override 12026b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang public void onUndoDeleteImage() { 12036118af9ddad8acc050133154f8f60c842c7f9bfaChih-Chung Chang if (mDeletePath == null) return; 12046b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang // If the deletion was done on the focused item, we want the model to 12056b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang // focus on it when it is undeleted. 12066b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang if (mDeleteIsFocus) mModel.setFocusHintPath(mDeletePath); 12076118af9ddad8acc050133154f8f60c842c7f9bfaChih-Chung Chang mMediaSet.removeDeletion(mDeletePath); 12086b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang mDeletePath = null; 12096b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang } 12106b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang 12116b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang @Override 12126b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang public void onCommitDeleteImage() { 12136b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang if (mDeletePath == null) return; 12146b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang mSelectionManager.deSelectAll(); 12156b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang mSelectionManager.toggle(mDeletePath); 12166b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang mMenuExecutor.onMenuClicked(R.id.action_delete, null, true, false); 12176b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang mDeletePath = null; 12186b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang } 12196b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang 1220d81b264931cfa3b34096efd46659b81f9a628fb5Bobby Georgescu public void playVideo(Activity activity, Uri uri, String title) { 1221f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin try { 1222f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin Intent intent = new Intent(Intent.ACTION_VIEW) 1223a3871050845b4921379add2b126add3cfbab1109Ray Chen .setDataAndType(uri, "video/*") 1224a3871050845b4921379add2b126add3cfbab1109Ray Chen .putExtra(Intent.EXTRA_TITLE, title) 1225a3871050845b4921379add2b126add3cfbab1109Ray Chen .putExtra(MovieActivity.KEY_TREAT_UP_AS_BACK, true); 122671cd89a38752bc22ae0ec2df965e4280b776623cChih-Chung Chang activity.startActivityForResult(intent, REQUEST_PLAY_VIDEO); 1227f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } catch (ActivityNotFoundException e) { 1228f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin Toast.makeText(activity, activity.getString(R.string.video_err), 1229f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin Toast.LENGTH_SHORT).show(); 1230f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 1231f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 1232f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 1233f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang private void setCurrentPhotoByIntent(Intent intent) { 1234f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang if (intent == null) return; 1235f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang Path path = mApplication.getDataManager() 1236f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang .findPathByUri(intent.getData(), intent.getType()); 1237f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang if (path != null) { 12380addfc7f6342184a67cdd8b5cc3872c6a5c87e55Doris Liu Path albumPath = mApplication.getDataManager().getDefaultSetOf(path); 12390addfc7f6342184a67cdd8b5cc3872c6a5c87e55Doris Liu if (!albumPath.equalsIgnoreCase(mOriginalSetPathString)) { 12400addfc7f6342184a67cdd8b5cc3872c6a5c87e55Doris Liu // If the edited image is stored in a different album, we need 12410addfc7f6342184a67cdd8b5cc3872c6a5c87e55Doris Liu // to start a new activity state to show the new image 12420addfc7f6342184a67cdd8b5cc3872c6a5c87e55Doris Liu Bundle data = new Bundle(getData()); 12430addfc7f6342184a67cdd8b5cc3872c6a5c87e55Doris Liu data.putString(KEY_MEDIA_SET_PATH, albumPath.toString()); 12440addfc7f6342184a67cdd8b5cc3872c6a5c87e55Doris Liu data.putString(PhotoPage.KEY_MEDIA_ITEM_PATH, path.toString()); 12450addfc7f6342184a67cdd8b5cc3872c6a5c87e55Doris Liu mActivity.getStateManager().startState(PhotoPage.class, data); 12460addfc7f6342184a67cdd8b5cc3872c6a5c87e55Doris Liu return; 12470addfc7f6342184a67cdd8b5cc3872c6a5c87e55Doris Liu } 1248f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang mModel.setCurrentPhoto(path, mCurrentIndex); 1249f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang } 1250f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang } 1251f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang 1252f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 1253f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin protected void onStateResult(int requestCode, int resultCode, Intent data) { 1254f85d974363a40b8ce588ba3fe902eec38de603d9John Reck if (resultCode == Activity.RESULT_CANCELED) { 1255f85d974363a40b8ce588ba3fe902eec38de603d9John Reck // This is a reset, not a canceled 1256f85d974363a40b8ce588ba3fe902eec38de603d9John Reck return; 1257f85d974363a40b8ce588ba3fe902eec38de603d9John Reck } 1258f85d974363a40b8ce588ba3fe902eec38de603d9John Reck if (resultCode == ProxyLauncher.RESULT_USER_CANCELED) { 1259f85d974363a40b8ce588ba3fe902eec38de603d9John Reck // Unmap reset vs. canceled 1260f85d974363a40b8ce588ba3fe902eec38de603d9John Reck resultCode = Activity.RESULT_CANCELED; 1261f85d974363a40b8ce588ba3fe902eec38de603d9John Reck } 1262f85d974363a40b8ce588ba3fe902eec38de603d9John Reck mRecenterCameraOnResume = false; 1263f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin switch (requestCode) { 1264f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang case REQUEST_EDIT: 1265f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang setCurrentPhotoByIntent(data); 1266f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang break; 1267f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin case REQUEST_CROP: 1268f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (resultCode == Activity.RESULT_OK) { 1269f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang setCurrentPhotoByIntent(data); 1270f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 1271f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin break; 1272f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin case REQUEST_CROP_PICASA: { 1273f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang if (resultCode == Activity.RESULT_OK) { 1274f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang Context context = mActivity.getAndroidContext(); 127588cc2ca5f5596762a5546ec7426756f2036be455Yuli Huang String message = context.getString(R.string.crop_saved, 127600d64dd584c6d08310a32a28e75aebc6eb8238eaRuben Brunk context.getString(R.string.folder_edited_online_photos)); 1277f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang Toast.makeText(context, message, Toast.LENGTH_SHORT).show(); 1278f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang } 1279f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin break; 1280f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 1281f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin case REQUEST_SLIDESHOW: { 1282f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (data == null) break; 1283f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin String path = data.getStringExtra(SlideshowPage.KEY_ITEM_PATH); 1284f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin int index = data.getIntExtra(SlideshowPage.KEY_PHOTO_INDEX, 0); 1285f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (path != null) { 1286f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mModel.setCurrentPhoto(Path.fromString(path), index); 1287f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 1288f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 1289f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 1290f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 1291f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 129214d3289b4867c21da93ec4032119c0091bc78c30George Mount @Override 1293f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void onPause() { 1294d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin super.onPause(); 1295d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin mIsActive = false; 1296d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin 1297bd7c016d728853d38f98a3c6077b7bd9b08858b9Yuli Huang mActivity.getGLRoot().unfreeze(); 1298bd7c016d728853d38f98a3c6077b7bd9b08858b9Yuli Huang mHandler.removeMessages(MSG_UNFREEZE_GLROOT); 1299253c5aec7692afdd7880fbd169d4b44d5679cbc0Chih-Chung Chang 13004105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen DetailsHelper.pause(); 13014438a7cce00cb19cb35cfc3cc149533f40043c00Doris Liu // Hide the detail dialog on exit 13024438a7cce00cb19cb35cfc3cc149533f40043c00Doris Liu if (mShowDetails) hideDetails(); 1303d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu if (mModel != null) { 1304d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu mModel.pause(); 1305d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu } 1306f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mPhotoView.pause(); 1307f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mHandler.removeMessages(MSG_HIDE_BARS); 1308d2724f69edf39cf2019eac1b49f316d22ab70d0aBobby Georgescu mHandler.removeMessages(MSG_REFRESH_BOTTOM_CONTROLS); 13094b4dbd225685502f4249c2bf25bf74f7ce526645George Mount refreshBottomControlsWhenReady(); 1310f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mActionBar.removeOnMenuVisibilityListener(mMenuVisibilityListener); 1311ba65c373f244f6de0b45afa6b7cd711866f1bfe4Bobby Georgescu if (mShowSpinner) { 13129481d05b0782dccd495c66d2e3240cd7448bbd4aBobby Georgescu mActionBar.disableAlbumModeMenu(true); 13139481d05b0782dccd495c66d2e3240cd7448bbd4aBobby Georgescu } 13146b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang onCommitDeleteImage(); 13152785956f8f5654966a41e20f482f4af3057eea3fChih-Chung Chang mMenuExecutor.pause(); 13166118af9ddad8acc050133154f8f60c842c7f9bfaChih-Chung Chang if (mMediaSet != null) mMediaSet.clearDeletion(); 1317f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 1318f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 1319f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 1320bd7c016d728853d38f98a3c6077b7bd9b08858b9Yuli Huang public void onCurrentImageUpdated() { 1321bd7c016d728853d38f98a3c6077b7bd9b08858b9Yuli Huang mActivity.getGLRoot().unfreeze(); 1322bd7c016d728853d38f98a3c6077b7bd9b08858b9Yuli Huang } 1323bd7c016d728853d38f98a3c6077b7bd9b08858b9Yuli Huang 1324f122d56e15e00928d731751796b0509ae47c6799George Mount @Override 13257eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu public void onFilmModeChanged(boolean enabled) { 13264b4dbd225685502f4249c2bf25bf74f7ce526645George Mount refreshBottomControlsWhenReady(); 1327c29588d7cc9fc3d2eef61af433fc0a8859e16ef4Bobby Georgescu if (mShowSpinner) { 1328c29588d7cc9fc3d2eef61af433fc0a8859e16ef4Bobby Georgescu if (enabled) { 1329c29588d7cc9fc3d2eef61af433fc0a8859e16ef4Bobby Georgescu mActionBar.enableAlbumModeMenu( 1330c29588d7cc9fc3d2eef61af433fc0a8859e16ef4Bobby Georgescu GalleryActionBar.ALBUM_FILMSTRIP_MODE_SELECTED, this); 1331c29588d7cc9fc3d2eef61af433fc0a8859e16ef4Bobby Georgescu } else { 1332c29588d7cc9fc3d2eef61af433fc0a8859e16ef4Bobby Georgescu mActionBar.disableAlbumModeMenu(true); 1333c29588d7cc9fc3d2eef61af433fc0a8859e16ef4Bobby Georgescu } 1334c29588d7cc9fc3d2eef61af433fc0a8859e16ef4Bobby Georgescu } 13357eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu if (enabled) { 13367eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu mHandler.removeMessages(MSG_HIDE_BARS); 13377eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu } else { 13387eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu refreshHidingMessage(); 13397eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu } 13407eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu } 13417eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu 13427eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu private void transitionFromAlbumPageIfNeeded() { 13437eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu TransitionStore transitions = mActivity.getTransitionStore(); 13447eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu 13457eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu int albumPageTransition = transitions.get( 13467eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu KEY_ALBUMPAGE_TRANSITION, MSG_ALBUMPAGE_NONE); 13477eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu 1348d81b264931cfa3b34096efd46659b81f9a628fb5Bobby Georgescu if (albumPageTransition == MSG_ALBUMPAGE_NONE && mAppBridge != null 1349d81b264931cfa3b34096efd46659b81f9a628fb5Bobby Georgescu && mRecenterCameraOnResume) { 135000ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu // Generally, resuming the PhotoPage when in Camera should 135100ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu // reset to the capture mode to allow quick photo taking 135200ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu mCurrentIndex = 0; 135300ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu mPhotoView.resetToFirstPicture(); 135400ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu } else { 135500ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu int resumeIndex = transitions.get(KEY_INDEX_HINT, -1); 135600ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu if (resumeIndex >= 0) { 13573ad7bbc55d7aaa0f36a7242fdd0f612d877adc19Bobby Georgescu if (mHasCameraScreennailOrPlaceholder) { 135876f1881067d7ca4eda6d3e398567473d2913c5d1Bobby Georgescu // Account for preview/placeholder being the first item 135900ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu resumeIndex++; 136000ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu } 136100ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu if (resumeIndex < mMediaSet.getMediaItemCount()) { 136200ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu mCurrentIndex = resumeIndex; 136300ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu mModel.moveTo(mCurrentIndex); 136400ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu } 136500ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu } 136600ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu } 136700ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu 136800ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu if (albumPageTransition == MSG_ALBUMPAGE_RESUMED) { 136900ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu mPhotoView.setFilmMode(mStartInFilmstrip || mAppBridge != null); 137000ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu } else if (albumPageTransition == MSG_ALBUMPAGE_PICKED) { 137100ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu mPhotoView.setFilmMode(false); 13727eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu } 13737eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu } 13747eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu 1375bd7c016d728853d38f98a3c6077b7bd9b08858b9Yuli Huang @Override 1376f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin protected void onResume() { 1377f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin super.onResume(); 13787eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu 1379d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu if (mModel == null) { 1380d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu mActivity.getStateManager().finishState(this); 1381d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu return; 1382d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu } 13837eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu transitionFromAlbumPageIfNeeded(); 13847eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu 1385d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin mActivity.getGLRoot().freeze(); 1386f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mIsActive = true; 1387f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin setContentPane(mRootPane); 138804ac045bf8da5082bbb0bdc9ea5f9c9b5b796ad0Yuli Huang 1389f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mModel.resume(); 1390f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mPhotoView.resume(); 1391898a2f4540635528a0916b0a6b0a177869854ae9Wu-cheng Li mActionBar.setDisplayOptions( 13923cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu ((mSecureAlbum == null) && (mSetPathString != null)), false); 1393f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mActionBar.addOnMenuVisibilityListener(mMenuVisibilityListener); 13944b4dbd225685502f4249c2bf25bf74f7ce526645George Mount refreshBottomControlsWhenReady(); 1395c29588d7cc9fc3d2eef61af433fc0a8859e16ef4Bobby Georgescu if (mShowSpinner && mPhotoView.getFilmMode()) { 13969481d05b0782dccd495c66d2e3240cd7448bbd4aBobby Georgescu mActionBar.enableAlbumModeMenu( 13979481d05b0782dccd495c66d2e3240cd7448bbd4aBobby Georgescu GalleryActionBar.ALBUM_FILMSTRIP_MODE_SELECTED, this); 13989481d05b0782dccd495c66d2e3240cd7448bbd4aBobby Georgescu } 139900ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu if (!mShowBars) { 140000ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu mActionBar.hide(); 140100ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu mActivity.getGLRoot().setLightsOutMode(true); 1402bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang } 14038fe22ecb8e744a09a2e0d867f876ecbf74c82298John Reck boolean haveImageEditor = GalleryUtils.isEditorAvailable(mActivity, "image/*"); 14048fe22ecb8e744a09a2e0d867f876ecbf74c82298John Reck if (haveImageEditor != mHaveImageEditor) { 14058fe22ecb8e744a09a2e0d867f876ecbf74c82298John Reck mHaveImageEditor = haveImageEditor; 14068fe22ecb8e744a09a2e0d867f876ecbf74c82298John Reck updateMenuOperations(); 14078fe22ecb8e744a09a2e0d867f876ecbf74c82298John Reck } 140800ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu 1409d81b264931cfa3b34096efd46659b81f9a628fb5Bobby Georgescu mRecenterCameraOnResume = true; 1410bd7c016d728853d38f98a3c6077b7bd9b08858b9Yuli Huang mHandler.sendEmptyMessageDelayed(MSG_UNFREEZE_GLROOT, UNFREEZE_GLROOT_TIMEOUT); 1411f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 1412f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 141315b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang @Override 141415b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang protected void onDestroy() { 1415bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang if (mAppBridge != null) { 1416253c5aec7692afdd7880fbd169d4b44d5679cbc0Chih-Chung Chang mAppBridge.setServer(null); 14173b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang mScreenNailItem.setScreenNail(null); 1418bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang mAppBridge.detachScreenNail(); 1419bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang mAppBridge = null; 14203b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang mScreenNailSet = null; 14213b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang mScreenNailItem = null; 1422b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang } 14232ef46ed28b28b355d7f3f1432c7b1196b832a859Chih-Chung Chang mActivity.getGLRoot().setOrientationSource(null); 1424f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu if (mBottomControls != null) mBottomControls.cleanup(); 1425aeb3062e84ed28f0e25a73f511f287ae0a3e4294Chih-Chung Chang 1426aeb3062e84ed28f0e25a73f511f287ae0a3e4294Chih-Chung Chang // Remove all pending messages. 1427aeb3062e84ed28f0e25a73f511f287ae0a3e4294Chih-Chung Chang mHandler.removeCallbacksAndMessages(null); 142815b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang super.onDestroy(); 142915b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang } 143015b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang 1431f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private class MyDetailsSource implements DetailsSource { 14326cf807453fb58ccd4cc513ff187b306c7090e67cOwen Lin 14336cf807453fb58ccd4cc513ff187b306c7090e67cOwen Lin @Override 1434f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public MediaDetails getDetails() { 1435616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin return mModel.getMediaItem(0).getDetails(); 1436f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 14376cf807453fb58ccd4cc513ff187b306c7090e67cOwen Lin 14386cf807453fb58ccd4cc513ff187b306c7090e67cOwen Lin @Override 1439f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public int size() { 1440f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return mMediaSet != null ? mMediaSet.getMediaItemCount() : 1; 1441f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 14426cf807453fb58ccd4cc513ff187b306c7090e67cOwen Lin 14436cf807453fb58ccd4cc513ff187b306c7090e67cOwen Lin @Override 1444995c4566bed7df1aa48ba7e1351f964efa73880bMichael Kolb public int setIndex() { 1445995c4566bed7df1aa48ba7e1351f964efa73880bMichael Kolb return mModel.getCurrentIndex(); 14464105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen } 1447f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 14483cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu 14493cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu @Override 14503cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu public void onAlbumModeSelected(int mode) { 14513cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu if (mode == GalleryActionBar.ALBUM_GRID_MODE_SELECTED) { 14523cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu switchToGrid(); 14533cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu } 14543cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu } 14554b4dbd225685502f4249c2bf25bf74f7ce526645George Mount 14564b4dbd225685502f4249c2bf25bf74f7ce526645George Mount @Override 14574b4dbd225685502f4249c2bf25bf74f7ce526645George Mount public void refreshBottomControlsWhenReady() { 14584b4dbd225685502f4249c2bf25bf74f7ce526645George Mount if (mBottomControls == null) { 14594b4dbd225685502f4249c2bf25bf74f7ce526645George Mount return; 14604b4dbd225685502f4249c2bf25bf74f7ce526645George Mount } 14614b4dbd225685502f4249c2bf25bf74f7ce526645George Mount MediaObject currentPhoto = mCurrentPhoto; 14624b4dbd225685502f4249c2bf25bf74f7ce526645George Mount if (currentPhoto == null) { 14634b4dbd225685502f4249c2bf25bf74f7ce526645George Mount mHandler.obtainMessage(MSG_REFRESH_BOTTOM_CONTROLS, 0, 0, currentPhoto).sendToTarget(); 14644b4dbd225685502f4249c2bf25bf74f7ce526645George Mount } else { 14654b4dbd225685502f4249c2bf25bf74f7ce526645George Mount currentPhoto.getPanoramaSupport(mRefreshBottomControlsCallback); 14664b4dbd225685502f4249c2bf25bf74f7ce526645George Mount } 14674b4dbd225685502f4249c2bf25bf74f7ce526645George Mount } 14684b4dbd225685502f4249c2bf25bf74f7ce526645George Mount 14694b4dbd225685502f4249c2bf25bf74f7ce526645George Mount private void updatePanoramaUI(boolean isPanorama360) { 14704b4dbd225685502f4249c2bf25bf74f7ce526645George Mount Menu menu = mActionBar.getMenu(); 14714b4dbd225685502f4249c2bf25bf74f7ce526645George Mount 14724b4dbd225685502f4249c2bf25bf74f7ce526645George Mount // it could be null if onCreateActionBar has not been called yet 14734b4dbd225685502f4249c2bf25bf74f7ce526645George Mount if (menu == null) { 14744b4dbd225685502f4249c2bf25bf74f7ce526645George Mount return; 14754b4dbd225685502f4249c2bf25bf74f7ce526645George Mount } 14764b4dbd225685502f4249c2bf25bf74f7ce526645George Mount 14774b4dbd225685502f4249c2bf25bf74f7ce526645George Mount MenuExecutor.updateMenuForPanorama(menu, isPanorama360, isPanorama360); 14784b4dbd225685502f4249c2bf25bf74f7ce526645George Mount 14794b4dbd225685502f4249c2bf25bf74f7ce526645George Mount if (isPanorama360) { 14804b4dbd225685502f4249c2bf25bf74f7ce526645George Mount MenuItem item = menu.findItem(R.id.action_share); 14814b4dbd225685502f4249c2bf25bf74f7ce526645George Mount if (item != null) { 14824b4dbd225685502f4249c2bf25bf74f7ce526645George Mount item.setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER); 14834b4dbd225685502f4249c2bf25bf74f7ce526645George Mount item.setTitle(mActivity.getResources().getString(R.string.share_as_photo)); 14844b4dbd225685502f4249c2bf25bf74f7ce526645George Mount } 14854b4dbd225685502f4249c2bf25bf74f7ce526645George Mount } else if ((mCurrentPhoto.getSupportedOperations() & MediaObject.SUPPORT_SHARE) != 0) { 14864b4dbd225685502f4249c2bf25bf74f7ce526645George Mount MenuItem item = menu.findItem(R.id.action_share); 14874b4dbd225685502f4249c2bf25bf74f7ce526645George Mount if (item != null) { 14884b4dbd225685502f4249c2bf25bf74f7ce526645George Mount item.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM); 14894b4dbd225685502f4249c2bf25bf74f7ce526645George Mount item.setTitle(mActivity.getResources().getString(R.string.share)); 14904b4dbd225685502f4249c2bf25bf74f7ce526645George Mount } 14914b4dbd225685502f4249c2bf25bf74f7ce526645George Mount } 14924b4dbd225685502f4249c2bf25bf74f7ce526645George Mount } 1493949584340c9f5f41a6133ba06058af280490f0c8Bobby Georgescu 1494949584340c9f5f41a6133ba06058af280490f0c8Bobby Georgescu @Override 1495949584340c9f5f41a6133ba06058af280490f0c8Bobby Georgescu public void onUndoBarVisibilityChanged(boolean visible) { 1496949584340c9f5f41a6133ba06058af280490f0c8Bobby Georgescu refreshBottomControlsWhenReady(); 1497949584340c9f5f41a6133ba06058af280490f0c8Bobby Georgescu } 1498f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin} 1499