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; 202abaaf7caa9a83ba1ea759868aabde7f21387184John Reckimport 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; 264ea5c27007e38fa8583add4bacf268ba67b9f0adJohn Reckimport android.content.res.Configuration; 2704ac045bf8da5082bbb0bdc9ea5f9c9b5b796ad0Yuli Huangimport android.graphics.Rect; 28604f053d040782159b61d3b74ee533bc2c0ccdd0Ray Chenimport android.net.Uri; 2933ef03776b7734717b16f6fc861b831fb1b1dfacMartijn Coenenimport android.nfc.NfcAdapter; 30ddf0225a5192a589fc578945f56440b09bf74d12John Reckimport android.nfc.NfcAdapter.CreateBeamUrisCallback; 31ddf0225a5192a589fc578945f56440b09bf74d12John Reckimport android.nfc.NfcEvent; 32604f053d040782159b61d3b74ee533bc2c0ccdd0Ray Chenimport android.os.Bundle; 33604f053d040782159b61d3b74ee533bc2c0ccdd0Ray Chenimport android.os.Handler; 34604f053d040782159b61d3b74ee533bc2c0ccdd0Ray Chenimport android.os.Message; 35b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescuimport android.os.SystemClock; 362abaaf7caa9a83ba1ea759868aabde7f21387184John Reckimport android.view.Menu; 372abaaf7caa9a83ba1ea759868aabde7f21387184John Reckimport android.view.MenuItem; 3802f459f8e1ef6d6765c9a57ee1866fc5af2f9eb5ztenghuiimport android.view.View; 39a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescuimport android.widget.RelativeLayout; 402251386437163898eb4b6f7546705d1365744fd1Flavio Lerdaimport android.widget.ShareActionProvider; 41604f053d040782159b61d3b74ee533bc2c0ccdd0Ray Chenimport android.widget.Toast; 42604f053d040782159b61d3b74ee533bc2c0ccdd0Ray Chen 43f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.R; 44fc86994f86f8cfb31e151c9e730dc1e9dc7b3349Yuli Huangimport com.android.gallery3d.common.ApiHelper; 45ee899c09c88e5b054397ac44ad20e5055cd24f39Bobby Georgescuimport com.android.gallery3d.data.ComboAlbum; 46f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.data.DataManager; 476b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Changimport com.android.gallery3d.data.FilterDeleteSet; 4845f089d69141e3fb0dfaad9bc34d275b61eb2aeeBobby Georgescuimport com.android.gallery3d.data.FilterSource; 494e091eb758a3ac1016b373419cea1ada1b977bc5George Mountimport com.android.gallery3d.data.LocalImage; 50f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.data.MediaDetails; 51f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.data.MediaItem; 52f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.data.MediaObject; 534b4dbd225685502f4249c2bf25bf74f7ce526645George Mountimport com.android.gallery3d.data.MediaObject.PanoramaSupportCallback; 54f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.data.MediaSet; 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; 62c3178ca4daf7ed570f3432f3433959c208ecc105Ruben Brunkimport com.android.gallery3d.filtershow.crop.CropActivity; 63f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.picasasource.PicasaSource; 644105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chenimport com.android.gallery3d.ui.DetailsHelper; 654105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chenimport com.android.gallery3d.ui.DetailsHelper.CloseListener; 664105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chenimport com.android.gallery3d.ui.DetailsHelper.DetailsSource; 6702f459f8e1ef6d6765c9a57ee1866fc5af2f9eb5ztenghuiimport com.android.gallery3d.ui.GLRootView; 68f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.ui.GLView; 69f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.ui.MenuExecutor; 7021a412c93c9b0401b039f4eb86d4950752e5bb84Owen Linimport com.android.gallery3d.ui.PhotoView; 71f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.ui.SelectionManager; 72f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.ui.SynchronizedHandler; 73f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.util.GalleryUtils; 74f37648b877bf6029d7afead31e965b473114c89cBobby Georgescuimport com.android.gallery3d.util.UsageStatistics; 75f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 76cfa7fde1a336a3200b2ad9091b27ba7bfd8f5c9aBobby Georgescupublic abstract class PhotoPage extends ActivityState implements 772251386437163898eb4b6f7546705d1365744fd1Flavio Lerda PhotoView.Listener, AppBridge.Server, ShareActionProvider.OnShareTargetSelectedListener, 783cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu PhotoPageBottomControls.Delegate, GalleryActionBar.OnAlbumModeSelectedListener { 79f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private static final String TAG = "PhotoPage"; 80f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 81f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private static final int MSG_HIDE_BARS = 1; 82bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang private static final int MSG_ON_FULL_SCREEN_CHANGED = 4; 8361f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang private static final int MSG_UPDATE_ACTION_BAR = 5; 84bd7c016d728853d38f98a3c6077b7bd9b08858b9Yuli Huang private static final int MSG_UNFREEZE_GLROOT = 6; 85e6251df06f0b3c8f556043f8b725b4b19be7474dChih-Chung Chang private static final int MSG_WANT_BARS = 7; 863cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu private static final int MSG_REFRESH_BOTTOM_CONTROLS = 8; 873cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu private static final int MSG_ON_CAMERA_CENTER = 9; 88f4e22eb44bfae0c2a3b6570f19480c8c3535d808Bobby Georgescu private static final int MSG_ON_PICTURE_CENTER = 10; 89f122d56e15e00928d731751796b0509ae47c6799George Mount private static final int MSG_REFRESH_IMAGE = 11; 90423e45e492d4ebdc41ecfeba73299de23b1463c4Mangesh Ghiware private static final int MSG_UPDATE_PHOTO_UI = 12; 91423e45e492d4ebdc41ecfeba73299de23b1463c4Mangesh Ghiware private static final int MSG_UPDATE_DEFERRED = 14; 924b4dbd225685502f4249c2bf25bf74f7ce526645George Mount private static final int MSG_UPDATE_SHARE_URI = 15; 934b4dbd225685502f4249c2bf25bf74f7ce526645George Mount private static final int MSG_UPDATE_PANORAMA_UI = 16; 946cf807453fb58ccd4cc513ff187b306c7090e67cOwen Lin 95f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private static final int HIDE_BARS_TIMEOUT = 3500; 96bd7c016d728853d38f98a3c6077b7bd9b08858b9Yuli Huang private static final int UNFREEZE_GLROOT_TIMEOUT = 250; 97f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 98f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private static final int REQUEST_SLIDESHOW = 1; 99f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private static final int REQUEST_CROP = 2; 100f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private static final int REQUEST_CROP_PICASA = 3; 101f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang private static final int REQUEST_EDIT = 4; 10271cd89a38752bc22ae0ec2df965e4280b776623cChih-Chung Chang private static final int REQUEST_PLAY_VIDEO = 5; 1033f1f1baf3a674927e25cd5cd885fb372796bd3a0Teng-Hui Zhu private static final int REQUEST_TRIM = 6; 104f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 105f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public static final String KEY_MEDIA_SET_PATH = "media-set-path"; 106f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public static final String KEY_MEDIA_ITEM_PATH = "media-item-path"; 107f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public static final String KEY_INDEX_HINT = "index-hint"; 10804ac045bf8da5082bbb0bdc9ea5f9c9b5b796ad0Yuli Huang public static final String KEY_OPEN_ANIMATION_RECT = "open-animation-rect"; 109bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang public static final String KEY_APP_BRIDGE = "app-bridge"; 11054fe6202b6f7d233e7645c121321fe0f3d20fc8bYuli Huang public static final String KEY_TREAT_BACK_AS_UP = "treat-back-as-up"; 1117eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu public static final String KEY_START_IN_FILMSTRIP = "start-in-filmstrip"; 112bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang public static final String KEY_RETURN_INDEX_HINT = "return-index-hint"; 11323e595f0c656ebaeb63f78e3018b5830628c5afeWu-cheng Li public static final String KEY_SHOW_WHEN_LOCKED = "show_when_locked"; 11445f089d69141e3fb0dfaad9bc34d275b61eb2aeeBobby Georgescu public static final String KEY_IN_CAMERA_ROLL = "in_camera_roll"; 115463b918edda204f1563dc2e27976cafa6af9a769John Hoford public static final String KEY_READONLY = "read-only"; 116f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 1177eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu public static final String KEY_ALBUMPAGE_TRANSITION = "albumpage-transition"; 1187eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu public static final int MSG_ALBUMPAGE_NONE = 0; 1197eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu public static final int MSG_ALBUMPAGE_STARTED = 1; 1207eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu public static final int MSG_ALBUMPAGE_RESUMED = 2; 1217eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu public static final int MSG_ALBUMPAGE_PICKED = 4; 1227eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu 123a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu public static final String ACTION_NEXTGEN_EDIT = "action_nextgen_edit"; 1248c4e95f4380a4104c9968963a363b62746e6c967nicolasroard public static final String ACTION_SIMPLE_EDIT = "action_simple_edit"; 125a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu 126f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private GalleryApp mApplication; 127f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private SelectionManager mSelectionManager; 128f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 129f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private PhotoView mPhotoView; 130f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private PhotoPage.Model mModel; 1314105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen private DetailsHelper mDetailsHelper; 132f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private boolean mShowDetails; 133f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 134f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin // mMediaSet could be null if there is no KEY_MEDIA_SET_PATH supplied. 135f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin // E.g., viewing a photo in gmail attachment 1366b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang private FilterDeleteSet mMediaSet; 137f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 138a0ce682e40c39ce046c48d8a7f989fff01bb9f2cWu-cheng Li // The mediaset used by camera launched from secure lock screen. 139a0ce682e40c39ce046c48d8a7f989fff01bb9f2cWu-cheng Li private SecureAlbum mSecureAlbum; 140a0ce682e40c39ce046c48d8a7f989fff01bb9f2cWu-cheng Li 141f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private int mCurrentIndex = 0; 142f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private Handler mHandler; 143113bfc77c4468411da9ae1290553c3be89f8df9aOwen Lin private boolean mShowBars = true; 14461f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang private volatile boolean mActionBarAllowed = true; 1458cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen private GalleryActionBar mActionBar; 146f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private boolean mIsMenuVisible; 1478fe22ecb8e744a09a2e0d867f876ecbf74c82298John Reck private boolean mHaveImageEditor; 148f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu private PhotoPageBottomControls mBottomControls; 149f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private MediaItem mCurrentPhoto = null; 150f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private MenuExecutor mMenuExecutor; 151f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private boolean mIsActive; 152ba65c373f244f6de0b45afa6b7cd711866f1bfe4Bobby Georgescu private boolean mShowSpinner; 15384c220f10a643927c8a2126de8a755d8d7f7ec9eRay Chen private String mSetPathString; 154b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang // This is the original mSetPathString before adding the camera preview item. 155463b918edda204f1563dc2e27976cafa6af9a769John Hoford private boolean mReadOnlyView = false; 156b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang private String mOriginalSetPathString; 157bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang private AppBridge mAppBridge; 1583b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang private SnailItem mScreenNailItem; 1593b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang private SnailAlbum mScreenNailSet; 160bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang private OrientationManager mOrientationManager; 16154fe6202b6f7d233e7645c121321fe0f3d20fc8bYuli Huang private boolean mTreatBackAsUp; 1627eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu private boolean mStartInFilmstrip; 1633ad7bbc55d7aaa0f36a7242fdd0f612d877adc19Bobby Georgescu private boolean mHasCameraScreennailOrPlaceholder = false; 164d81b264931cfa3b34096efd46659b81f9a628fb5Bobby Georgescu private boolean mRecenterCameraOnResume = true; 16515b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang 166a680a0c32ae3321c632288b36083f2782af2c55bDoris Liu // These are only valid after the panorama callback 167a680a0c32ae3321c632288b36083f2782af2c55bDoris Liu private boolean mIsPanorama; 168a680a0c32ae3321c632288b36083f2782af2c55bDoris Liu private boolean mIsPanorama360; 169a680a0c32ae3321c632288b36083f2782af2c55bDoris Liu 170b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu private long mCameraSwitchCutoff = 0; 171b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu private boolean mSkipUpdateCurrentPhoto = false; 172b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu private static final long CAMERA_SWITCH_CUTOFF_THRESHOLD_MS = 300; 173b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu 1744b4dbd225685502f4249c2bf25bf74f7ce526645George Mount private static final long DEFERRED_UPDATE_MS = 250; 175e23a9d412cba5a202405e1c99c0cf080949db2c7Bobby Georgescu private boolean mDeferredUpdateWaiting = false; 176e23a9d412cba5a202405e1c99c0cf080949db2c7Bobby Georgescu private long mDeferUpdateUntil = Long.MAX_VALUE; 177e23a9d412cba5a202405e1c99c0cf080949db2c7Bobby Georgescu 1786b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang // The item that is deleted (but it can still be undeleted before commiting) 1796b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang private Path mDeletePath; 1806b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang private boolean mDeleteIsFocus; // whether the deleted item was in focus 1816b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang 182ddf0225a5192a589fc578945f56440b09bf74d12John Reck private Uri[] mNfcPushUris = new Uri[1]; 18333ef03776b7734717b16f6fc861b831fb1b1dfacMartijn Coenen 1842bb717f1ea38e2ce33dd102a23afe6bfacb5675cOwen Lin private final MyMenuVisibilityListener mMenuVisibilityListener = 1852bb717f1ea38e2ce33dd102a23afe6bfacb5675cOwen Lin new MyMenuVisibilityListener(); 1862bb717f1ea38e2ce33dd102a23afe6bfacb5675cOwen Lin 18702f459f8e1ef6d6765c9a57ee1866fc5af2f9eb5ztenghui private int mLastSystemUiVis = 0; 18802f459f8e1ef6d6765c9a57ee1866fc5af2f9eb5ztenghui 1894b4dbd225685502f4249c2bf25bf74f7ce526645George Mount private final PanoramaSupportCallback mUpdatePanoramaMenuItemsCallback = new PanoramaSupportCallback() { 1904b4dbd225685502f4249c2bf25bf74f7ce526645George Mount @Override 1914b4dbd225685502f4249c2bf25bf74f7ce526645George Mount public void panoramaInfoAvailable(MediaObject mediaObject, boolean isPanorama, 1924b4dbd225685502f4249c2bf25bf74f7ce526645George Mount boolean isPanorama360) { 1934b4dbd225685502f4249c2bf25bf74f7ce526645George Mount if (mediaObject == mCurrentPhoto) { 1944b4dbd225685502f4249c2bf25bf74f7ce526645George Mount mHandler.obtainMessage(MSG_UPDATE_PANORAMA_UI, isPanorama360 ? 1 : 0, 0, 1954b4dbd225685502f4249c2bf25bf74f7ce526645George Mount mediaObject).sendToTarget(); 196825afb1b3e7d15b5c258d664ee008dc68da1c407Mangesh Ghiware } 1974b4dbd225685502f4249c2bf25bf74f7ce526645George Mount } 1984b4dbd225685502f4249c2bf25bf74f7ce526645George Mount }; 1994b4dbd225685502f4249c2bf25bf74f7ce526645George Mount 2004b4dbd225685502f4249c2bf25bf74f7ce526645George Mount private final PanoramaSupportCallback mRefreshBottomControlsCallback = new PanoramaSupportCallback() { 2014b4dbd225685502f4249c2bf25bf74f7ce526645George Mount @Override 2024b4dbd225685502f4249c2bf25bf74f7ce526645George Mount public void panoramaInfoAvailable(MediaObject mediaObject, boolean isPanorama, 2034b4dbd225685502f4249c2bf25bf74f7ce526645George Mount boolean isPanorama360) { 2044b4dbd225685502f4249c2bf25bf74f7ce526645George Mount if (mediaObject == mCurrentPhoto) { 205a680a0c32ae3321c632288b36083f2782af2c55bDoris Liu mHandler.obtainMessage(MSG_REFRESH_BOTTOM_CONTROLS, isPanorama ? 1 : 0, isPanorama360 ? 1 : 0, 206a680a0c32ae3321c632288b36083f2782af2c55bDoris Liu mediaObject).sendToTarget(); 2074b4dbd225685502f4249c2bf25bf74f7ce526645George Mount } 2084b4dbd225685502f4249c2bf25bf74f7ce526645George Mount } 2094b4dbd225685502f4249c2bf25bf74f7ce526645George Mount }; 2104b4dbd225685502f4249c2bf25bf74f7ce526645George Mount 2114b4dbd225685502f4249c2bf25bf74f7ce526645George Mount private final PanoramaSupportCallback mUpdateShareURICallback = new PanoramaSupportCallback() { 2124b4dbd225685502f4249c2bf25bf74f7ce526645George Mount @Override 2134b4dbd225685502f4249c2bf25bf74f7ce526645George Mount public void panoramaInfoAvailable(MediaObject mediaObject, boolean isPanorama, 2144b4dbd225685502f4249c2bf25bf74f7ce526645George Mount boolean isPanorama360) { 2154b4dbd225685502f4249c2bf25bf74f7ce526645George Mount if (mediaObject == mCurrentPhoto) { 2164b4dbd225685502f4249c2bf25bf74f7ce526645George Mount mHandler.obtainMessage(MSG_UPDATE_SHARE_URI, isPanorama360 ? 1 : 0, 0, mediaObject) 2174b4dbd225685502f4249c2bf25bf74f7ce526645George Mount .sendToTarget(); 2184b4dbd225685502f4249c2bf25bf74f7ce526645George Mount } 2194b4dbd225685502f4249c2bf25bf74f7ce526645George Mount } 2204b4dbd225685502f4249c2bf25bf74f7ce526645George Mount }; 221825afb1b3e7d15b5c258d664ee008dc68da1c407Mangesh Ghiware 222f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public static interface Model extends PhotoView.Model { 223f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void resume(); 224f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void pause(); 225f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public boolean isEmpty(); 226f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void setCurrentPhoto(Path path, int indexHint); 227f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 228f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 229f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private class MyMenuVisibilityListener implements OnMenuVisibilityListener { 23006c6401eededc2ec842ba4994a838c2ded0a666cPin Ting @Override 231f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void onMenuVisibilityChanged(boolean isVisible) { 232f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mIsMenuVisible = isVisible; 233f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin refreshHidingMessage(); 234f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 235f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 236f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 237915c2c5b2c367df71599370613af0924bd7c4887Bobby Georgescu @Override 238915c2c5b2c367df71599370613af0924bd7c4887Bobby Georgescu protected int getBackgroundColorId() { 239915c2c5b2c367df71599370613af0924bd7c4887Bobby Georgescu return R.color.photo_background; 240915c2c5b2c367df71599370613af0924bd7c4887Bobby Georgescu } 241915c2c5b2c367df71599370613af0924bd7c4887Bobby Georgescu 242f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu private final GLView mRootPane = new GLView() { 243f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 244f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin protected void onLayout( 245f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin boolean changed, int left, int top, int right, int bottom) { 246f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mPhotoView.layout(0, 0, right - left, bottom - top); 247f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (mShowDetails) { 2488cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen mDetailsHelper.layout(left, mActionBar.getHeight(), right, bottom); 249f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 250f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 251f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin }; 252f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 253f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 254f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void onCreate(Bundle data, Bundle restoreState) { 25545c56f2d34c71d0bc9b84ebeef6d1314738d0fc0Bobby Georgescu super.onCreate(data, restoreState); 2568cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen mActionBar = mActivity.getGalleryActionBar(); 257f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mSelectionManager = new SelectionManager(mActivity, false); 258f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mMenuExecutor = new MenuExecutor(mActivity, mSelectionManager); 259f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 260f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mPhotoView = new PhotoView(mActivity); 261bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang mPhotoView.setListener(this); 262f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mRootPane.addComponent(mPhotoView); 26383be4e0c9b8e3372eff8f9b1a396afd961b72921Angus Kong mApplication = (GalleryApp) ((Activity) mActivity).getApplication(); 264bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang mOrientationManager = mActivity.getOrientationManager(); 2652ef46ed28b28b355d7f3f1432c7b1196b832a859Chih-Chung Chang mActivity.getGLRoot().setOrientationSource(mOrientationManager); 266f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 267d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu mHandler = new SynchronizedHandler(mActivity.getGLRoot()) { 268d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu @Override 269d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu public void handleMessage(Message message) { 270d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu switch (message.what) { 271d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu case MSG_HIDE_BARS: { 272d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu hideBars(); 273d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu break; 274d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu } 275f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu case MSG_REFRESH_BOTTOM_CONTROLS: { 2764b4dbd225685502f4249c2bf25bf74f7ce526645George Mount if (mCurrentPhoto == message.obj && mBottomControls != null) { 277a680a0c32ae3321c632288b36083f2782af2c55bDoris Liu mIsPanorama = message.arg1 == 1; 278a680a0c32ae3321c632288b36083f2782af2c55bDoris Liu mIsPanorama360 = message.arg2 == 1; 279a680a0c32ae3321c632288b36083f2782af2c55bDoris Liu mBottomControls.refresh(); 2804b4dbd225685502f4249c2bf25bf74f7ce526645George Mount } 281d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu break; 282d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu } 283d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu case MSG_ON_FULL_SCREEN_CHANGED: { 284db99a10b6ac9296d612db8ba51e37f141fee4170Bobby Georgescu if (mAppBridge != null) { 285db99a10b6ac9296d612db8ba51e37f141fee4170Bobby Georgescu mAppBridge.onFullScreenChanged(message.arg1 == 1); 286db99a10b6ac9296d612db8ba51e37f141fee4170Bobby Georgescu } 287d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu break; 288d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu } 289d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu case MSG_UPDATE_ACTION_BAR: { 290d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu updateBars(); 291d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu break; 292d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu } 293d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu case MSG_WANT_BARS: { 294d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu wantBars(); 295d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu break; 296d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu } 297d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu case MSG_UNFREEZE_GLROOT: { 298d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu mActivity.getGLRoot().unfreeze(); 299d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu break; 300d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu } 301e23a9d412cba5a202405e1c99c0cf080949db2c7Bobby Georgescu case MSG_UPDATE_DEFERRED: { 302e23a9d412cba5a202405e1c99c0cf080949db2c7Bobby Georgescu long nextUpdate = mDeferUpdateUntil - SystemClock.uptimeMillis(); 303e23a9d412cba5a202405e1c99c0cf080949db2c7Bobby Georgescu if (nextUpdate <= 0) { 304e23a9d412cba5a202405e1c99c0cf080949db2c7Bobby Georgescu mDeferredUpdateWaiting = false; 305e23a9d412cba5a202405e1c99c0cf080949db2c7Bobby Georgescu updateUIForCurrentPhoto(); 306e23a9d412cba5a202405e1c99c0cf080949db2c7Bobby Georgescu } else { 307e23a9d412cba5a202405e1c99c0cf080949db2c7Bobby Georgescu mHandler.sendEmptyMessageDelayed(MSG_UPDATE_DEFERRED, nextUpdate); 308e23a9d412cba5a202405e1c99c0cf080949db2c7Bobby Georgescu } 309e23a9d412cba5a202405e1c99c0cf080949db2c7Bobby Georgescu break; 310e23a9d412cba5a202405e1c99c0cf080949db2c7Bobby Georgescu } 311b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu case MSG_ON_CAMERA_CENTER: { 312b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu mSkipUpdateCurrentPhoto = false; 313bbc993162d687df20e2ff9a329bb9b6e04926ba8Bobby Georgescu boolean stayedOnCamera = false; 314b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu if (!mPhotoView.getFilmMode()) { 315bbc993162d687df20e2ff9a329bb9b6e04926ba8Bobby Georgescu stayedOnCamera = true; 316b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu } else if (SystemClock.uptimeMillis() < mCameraSwitchCutoff && 317b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu mMediaSet.getMediaItemCount() > 1) { 318b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu mPhotoView.switchToImage(1); 319b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu } else { 320cc6ad8217cb09b778d400c9c5e5928170ca53737Bobby Georgescu if (mAppBridge != null) mPhotoView.setFilmMode(false); 321bbc993162d687df20e2ff9a329bb9b6e04926ba8Bobby Georgescu stayedOnCamera = true; 322b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu } 323b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu 324bbc993162d687df20e2ff9a329bb9b6e04926ba8Bobby Georgescu if (stayedOnCamera) { 325617551e3e0016dc5ea9f3f1c4d1c9d8c0eab3f25Bobby Georgescu if (mAppBridge == null && mMediaSet.getTotalMediaItemCount() > 1) { 3265bd00332556b20c141b5c7f16433d55b1bc7fe0fBobby Georgescu launchCamera(); 327cc6ad8217cb09b778d400c9c5e5928170ca53737Bobby Georgescu /* We got here by swiping from photo 1 to the 328cc6ad8217cb09b778d400c9c5e5928170ca53737Bobby Georgescu placeholder, so make it be the thing that 329cc6ad8217cb09b778d400c9c5e5928170ca53737Bobby Georgescu is in focus when the user presses back from 330cc6ad8217cb09b778d400c9c5e5928170ca53737Bobby Georgescu the camera app */ 331cc6ad8217cb09b778d400c9c5e5928170ca53737Bobby Georgescu mPhotoView.switchToImage(1); 332cc6ad8217cb09b778d400c9c5e5928170ca53737Bobby Georgescu } else { 333cc6ad8217cb09b778d400c9c5e5928170ca53737Bobby Georgescu updateBars(); 334cc6ad8217cb09b778d400c9c5e5928170ca53737Bobby Georgescu updateCurrentPhoto(mModel.getMediaItem(0)); 335cc6ad8217cb09b778d400c9c5e5928170ca53737Bobby Georgescu } 336b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu } 337b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu break; 338b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu } 339f4e22eb44bfae0c2a3b6570f19480c8c3535d808Bobby Georgescu case MSG_ON_PICTURE_CENTER: { 340e23a9d412cba5a202405e1c99c0cf080949db2c7Bobby Georgescu if (!mPhotoView.getFilmMode() && mCurrentPhoto != null 341f4e22eb44bfae0c2a3b6570f19480c8c3535d808Bobby Georgescu && (mCurrentPhoto.getSupportedOperations() & MediaObject.SUPPORT_ACTION) != 0) { 342f4e22eb44bfae0c2a3b6570f19480c8c3535d808Bobby Georgescu mPhotoView.setFilmMode(true); 343f4e22eb44bfae0c2a3b6570f19480c8c3535d808Bobby Georgescu } 344f4e22eb44bfae0c2a3b6570f19480c8c3535d808Bobby Georgescu break; 345f4e22eb44bfae0c2a3b6570f19480c8c3535d808Bobby Georgescu } 346f122d56e15e00928d731751796b0509ae47c6799George Mount case MSG_REFRESH_IMAGE: { 347423e45e492d4ebdc41ecfeba73299de23b1463c4Mangesh Ghiware final MediaItem photo = mCurrentPhoto; 348423e45e492d4ebdc41ecfeba73299de23b1463c4Mangesh Ghiware mCurrentPhoto = null; 349423e45e492d4ebdc41ecfeba73299de23b1463c4Mangesh Ghiware updateCurrentPhoto(photo); 350423e45e492d4ebdc41ecfeba73299de23b1463c4Mangesh Ghiware break; 351423e45e492d4ebdc41ecfeba73299de23b1463c4Mangesh Ghiware } 352423e45e492d4ebdc41ecfeba73299de23b1463c4Mangesh Ghiware case MSG_UPDATE_PHOTO_UI: { 353825afb1b3e7d15b5c258d664ee008dc68da1c407Mangesh Ghiware updateUIForCurrentPhoto(); 354825afb1b3e7d15b5c258d664ee008dc68da1c407Mangesh Ghiware break; 355825afb1b3e7d15b5c258d664ee008dc68da1c407Mangesh Ghiware } 3564b4dbd225685502f4249c2bf25bf74f7ce526645George Mount case MSG_UPDATE_SHARE_URI: { 3574b4dbd225685502f4249c2bf25bf74f7ce526645George Mount if (mCurrentPhoto == message.obj) { 3584b4dbd225685502f4249c2bf25bf74f7ce526645George Mount boolean isPanorama360 = message.arg1 != 0; 3594b4dbd225685502f4249c2bf25bf74f7ce526645George Mount Uri contentUri = mCurrentPhoto.getContentUri(); 3604b4dbd225685502f4249c2bf25bf74f7ce526645George Mount Intent panoramaIntent = null; 3614b4dbd225685502f4249c2bf25bf74f7ce526645George Mount if (isPanorama360) { 3624b4dbd225685502f4249c2bf25bf74f7ce526645George Mount panoramaIntent = createSharePanoramaIntent(contentUri); 3634b4dbd225685502f4249c2bf25bf74f7ce526645George Mount } 3644b4dbd225685502f4249c2bf25bf74f7ce526645George Mount Intent shareIntent = createShareIntent(mCurrentPhoto); 3654b4dbd225685502f4249c2bf25bf74f7ce526645George Mount 3662251386437163898eb4b6f7546705d1365744fd1Flavio Lerda mActionBar.setShareIntents(panoramaIntent, shareIntent, PhotoPage.this); 3674b4dbd225685502f4249c2bf25bf74f7ce526645George Mount setNfcBeamPushUri(contentUri); 3684b4dbd225685502f4249c2bf25bf74f7ce526645George Mount } 3694b4dbd225685502f4249c2bf25bf74f7ce526645George Mount break; 3704b4dbd225685502f4249c2bf25bf74f7ce526645George Mount } 3714b4dbd225685502f4249c2bf25bf74f7ce526645George Mount case MSG_UPDATE_PANORAMA_UI: { 3724b4dbd225685502f4249c2bf25bf74f7ce526645George Mount if (mCurrentPhoto == message.obj) { 3734b4dbd225685502f4249c2bf25bf74f7ce526645George Mount boolean isPanorama360 = message.arg1 != 0; 3744b4dbd225685502f4249c2bf25bf74f7ce526645George Mount updatePanoramaUI(isPanorama360); 3754b4dbd225685502f4249c2bf25bf74f7ce526645George Mount } 3764b4dbd225685502f4249c2bf25bf74f7ce526645George Mount break; 3774b4dbd225685502f4249c2bf25bf74f7ce526645George Mount } 378d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu default: throw new AssertionError(message.what); 379d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu } 380d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu } 381d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu }; 382d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu 38384c220f10a643927c8a2126de8a755d8d7f7ec9eRay Chen mSetPathString = data.getString(KEY_MEDIA_SET_PATH); 384463b918edda204f1563dc2e27976cafa6af9a769John Hoford mReadOnlyView = data.getBoolean(KEY_READONLY); 385b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang mOriginalSetPathString = mSetPathString; 386ddf0225a5192a589fc578945f56440b09bf74d12John Reck setupNfcBeamPush(); 3877eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu String itemPathString = data.getString(KEY_MEDIA_ITEM_PATH); 3887eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu Path itemPath = itemPathString != null ? 3897eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu Path.fromString(data.getString(KEY_MEDIA_ITEM_PATH)) : 3907eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu null; 39154fe6202b6f7d233e7645c121321fe0f3d20fc8bYuli Huang mTreatBackAsUp = data.getBoolean(KEY_TREAT_BACK_AS_UP, false); 39245f089d69141e3fb0dfaad9bc34d275b61eb2aeeBobby Georgescu mStartInFilmstrip = data.getBoolean(KEY_START_IN_FILMSTRIP, false); 3933ad7bbc55d7aaa0f36a7242fdd0f612d877adc19Bobby Georgescu boolean inCameraRoll = data.getBoolean(KEY_IN_CAMERA_ROLL, false); 39445f089d69141e3fb0dfaad9bc34d275b61eb2aeeBobby Georgescu mCurrentIndex = data.getInt(KEY_INDEX_HINT, 0); 39584c220f10a643927c8a2126de8a755d8d7f7ec9eRay Chen if (mSetPathString != null) { 396ba65c373f244f6de0b45afa6b7cd711866f1bfe4Bobby Georgescu mShowSpinner = true; 397bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang mAppBridge = (AppBridge) data.getParcelable(KEY_APP_BRIDGE); 398bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang if (mAppBridge != null) { 3997eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu mShowBars = false; 4003ad7bbc55d7aaa0f36a7242fdd0f612d877adc19Bobby Georgescu mHasCameraScreennailOrPlaceholder = true; 401253c5aec7692afdd7880fbd169d4b44d5679cbc0Chih-Chung Chang mAppBridge.setServer(this); 402b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang 403bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang // Get the ScreenNail from AppBridge and register it. 4043b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang int id = SnailSource.newId(); 405b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang Path screenNailSetPath = SnailSource.getSetPath(id); 406bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang Path screenNailItemPath = SnailSource.getItemPath(id); 4073b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang mScreenNailSet = (SnailAlbum) mActivity.getDataManager() 4083b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang .getMediaObject(screenNailSetPath); 4093b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang mScreenNailItem = (SnailItem) mActivity.getDataManager() 410bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang .getMediaObject(screenNailItemPath); 4113b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang mScreenNailItem.setScreenNail(mAppBridge.attachScreenNail()); 412b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang 41323e595f0c656ebaeb63f78e3018b5830628c5afeWu-cheng Li if (data.getBoolean(KEY_SHOW_WHEN_LOCKED, false)) { 414efd480e85dc5bd0d2ca0ac82d03e141212388830Wu-cheng Li // Set the flag to be on top of the lock screen. 415efd480e85dc5bd0d2ca0ac82d03e141212388830Wu-cheng Li mFlags |= FLAG_SHOW_WHEN_LOCKED; 416a0ce682e40c39ce046c48d8a7f989fff01bb9f2cWu-cheng Li } 417a0ce682e40c39ce046c48d8a7f989fff01bb9f2cWu-cheng Li 4184e091eb758a3ac1016b373419cea1ada1b977bc5George Mount // Don't display "empty album" action item for capture intents. 4192c83c5f09aa79d81ee11da517fd62222f8c3337dWu-cheng Li if (!mSetPathString.equals("/local/all/0")) { 4202c83c5f09aa79d81ee11da517fd62222f8c3337dWu-cheng Li // Check if the path is a secure album. 4212c83c5f09aa79d81ee11da517fd62222f8c3337dWu-cheng Li if (SecureSource.isSecurePath(mSetPathString)) { 4222c83c5f09aa79d81ee11da517fd62222f8c3337dWu-cheng Li mSecureAlbum = (SecureAlbum) mActivity.getDataManager() 4232c83c5f09aa79d81ee11da517fd62222f8c3337dWu-cheng Li .getMediaSet(mSetPathString); 4242c83c5f09aa79d81ee11da517fd62222f8c3337dWu-cheng Li mShowSpinner = false; 4252c83c5f09aa79d81ee11da517fd62222f8c3337dWu-cheng Li } 426c7e3c76d6965f520a9651d309052c5f01726cd58Bobby Georgescu mSetPathString = "/filter/empty/{"+mSetPathString+"}"; 427c7e3c76d6965f520a9651d309052c5f01726cd58Bobby Georgescu } 428c7e3c76d6965f520a9651d309052c5f01726cd58Bobby Georgescu 4293b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang // Combine the original MediaSet with the one for ScreenNail 4303b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang // from AppBridge. 431b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang mSetPathString = "/combo/item/{" + screenNailSetPath + 432b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang "," + mSetPathString + "}"; 433b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang 434b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang // Start from the screen nail. 435bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang itemPath = screenNailItemPath; 4363ad7bbc55d7aaa0f36a7242fdd0f612d877adc19Bobby Georgescu } else if (inCameraRoll && GalleryUtils.isCameraAvailable(mActivity)) { 43745f089d69141e3fb0dfaad9bc34d275b61eb2aeeBobby Georgescu mSetPathString = "/combo/item/{" + FilterSource.FILTER_CAMERA_SHORTCUT + 43845f089d69141e3fb0dfaad9bc34d275b61eb2aeeBobby Georgescu "," + mSetPathString + "}"; 43945f089d69141e3fb0dfaad9bc34d275b61eb2aeeBobby Georgescu mCurrentIndex++; 4403ad7bbc55d7aaa0f36a7242fdd0f612d877adc19Bobby Georgescu mHasCameraScreennailOrPlaceholder = true; 441b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang } 442b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang 4436118af9ddad8acc050133154f8f60c842c7f9bfaChih-Chung Chang MediaSet originalSet = mActivity.getDataManager() 4446118af9ddad8acc050133154f8f60c842c7f9bfaChih-Chung Chang .getMediaSet(mSetPathString); 4453ad7bbc55d7aaa0f36a7242fdd0f612d877adc19Bobby Georgescu if (mHasCameraScreennailOrPlaceholder && originalSet instanceof ComboAlbum) { 446ee899c09c88e5b054397ac44ad20e5055cd24f39Bobby Georgescu // Use the name of the camera album rather than the default 447ee899c09c88e5b054397ac44ad20e5055cd24f39Bobby Georgescu // ComboAlbum behavior 448ee899c09c88e5b054397ac44ad20e5055cd24f39Bobby Georgescu ((ComboAlbum) originalSet).useNameOfChild(1); 449ee899c09c88e5b054397ac44ad20e5055cd24f39Bobby Georgescu } 4506118af9ddad8acc050133154f8f60c842c7f9bfaChih-Chung Chang mSelectionManager.setSourceMediaSet(originalSet); 4516b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang mSetPathString = "/filter/delete/{" + mSetPathString + "}"; 4526b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang mMediaSet = (FilterDeleteSet) mActivity.getDataManager() 4536b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang .getMediaSet(mSetPathString); 454f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (mMediaSet == null) { 45584c220f10a643927c8a2126de8a755d8d7f7ec9eRay Chen Log.w(TAG, "failed to restore " + mSetPathString); 456f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 4577eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu if (itemPath == null) { 4583eb2e643a40d1be77998373343cdf8b14764f58cBobby Georgescu int mediaItemCount = mMediaSet.getMediaItemCount(); 4593eb2e643a40d1be77998373343cdf8b14764f58cBobby Georgescu if (mediaItemCount > 0) { 4603eb2e643a40d1be77998373343cdf8b14764f58cBobby Georgescu if (mCurrentIndex >= mediaItemCount) mCurrentIndex = 0; 461d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu itemPath = mMediaSet.getMediaItem(mCurrentIndex, 1) 462d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu .get(0).getPath(); 463d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu } else { 4643eb2e643a40d1be77998373343cdf8b14764f58cBobby Georgescu // Bail out, PhotoPage can't load on an empty album 465d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu return; 466d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu } 4677eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu } 468f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin PhotoDataAdapter pda = new PhotoDataAdapter( 469bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang mActivity, mPhotoView, mMediaSet, itemPath, mCurrentIndex, 47043a80fd806247cb50e81bacda3ad21d210e9ae88Angus Kong mAppBridge == null ? -1 : 0, 471dbb6acc204ba6f095eb0e49e1298e9ceda2c3096Wu-cheng Li mAppBridge == null ? false : mAppBridge.isPanorama(), 472dbb6acc204ba6f095eb0e49e1298e9ceda2c3096Wu-cheng Li mAppBridge == null ? false : mAppBridge.isStaticCamera()); 473f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mModel = pda; 474f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mPhotoView.setModel(mModel); 475f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 476f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin pda.setDataListener(new PhotoDataAdapter.DataListener() { 477f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 478113bfc77c4468411da9ae1290553c3be89f8df9aOwen Lin @Override 479f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void onPhotoChanged(int index, Path item) { 48000ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu int oldIndex = mCurrentIndex; 481f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mCurrentIndex = index; 482b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu 4833ad7bbc55d7aaa0f36a7242fdd0f612d877adc19Bobby Georgescu if (mHasCameraScreennailOrPlaceholder) { 484b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu if (mCurrentIndex > 0) { 485b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu mSkipUpdateCurrentPhoto = false; 486b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu } 487b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu 48800ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu if (oldIndex == 0 && mCurrentIndex > 0 48900ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu && !mPhotoView.getFilmMode()) { 49000ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu mPhotoView.setFilmMode(true); 4919b4c3e9fa3f921e40f4abc549983fd35fb0a0a85Bobby Georgescu if (mAppBridge != null) { 4929b4c3e9fa3f921e40f4abc549983fd35fb0a0a85Bobby Georgescu UsageStatistics.onEvent("CameraToFilmstrip", 4939b4c3e9fa3f921e40f4abc549983fd35fb0a0a85Bobby Georgescu UsageStatistics.TRANSITION_SWIPE, null); 4949b4c3e9fa3f921e40f4abc549983fd35fb0a0a85Bobby Georgescu } 495b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu } else if (oldIndex == 2 && mCurrentIndex == 1) { 496b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu mCameraSwitchCutoff = SystemClock.uptimeMillis() + 497b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu CAMERA_SWITCH_CUTOFF_THRESHOLD_MS; 498b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu mPhotoView.stopScrolling(); 499bbc993162d687df20e2ff9a329bb9b6e04926ba8Bobby Georgescu } else if (oldIndex >= 1 && mCurrentIndex == 0) { 500f4e22eb44bfae0c2a3b6570f19480c8c3535d808Bobby Georgescu mPhotoView.setWantPictureCenterCallbacks(true); 501b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu mSkipUpdateCurrentPhoto = true; 50200ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu } 50300ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu } 504b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu if (!mSkipUpdateCurrentPhoto) { 505b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu if (item != null) { 506b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu MediaItem photo = mModel.getMediaItem(0); 507b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu if (photo != null) updateCurrentPhoto(photo); 508b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu } 509b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu updateBars(); 510b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu } 51100ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu // Reset the timeout for the bars after a swipe 51200ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu refreshHidingMessage(); 513f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 514f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 515f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 51605da3f520eacb9219964b6ed57ef37846d889fd7Hung-ying Tyan public void onLoadingFinished(boolean loadingFailed) { 517f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (!mModel.isEmpty()) { 518616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin MediaItem photo = mModel.getMediaItem(0); 519f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (photo != null) updateCurrentPhoto(photo); 520f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } else if (mIsActive) { 521c370476adcf29f311ceec70a119792a0168781e9Chih-Chung Chang // We only want to finish the PhotoPage if there is no 522c370476adcf29f311ceec70a119792a0168781e9Chih-Chung Chang // deletion that the user can undo. 523c370476adcf29f311ceec70a119792a0168781e9Chih-Chung Chang if (mMediaSet.getNumberOfDeletions() == 0) { 524c370476adcf29f311ceec70a119792a0168781e9Chih-Chung Chang mActivity.getStateManager().finishState( 525c370476adcf29f311ceec70a119792a0168781e9Chih-Chung Chang PhotoPage.this); 526c370476adcf29f311ceec70a119792a0168781e9Chih-Chung Chang } 527f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 528f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 529f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 530f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 531f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void onLoadingStarted() { 532f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 533f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin }); 534f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } else { 535f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin // Get default media set by the URI 536f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin MediaItem mediaItem = (MediaItem) 537f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mActivity.getDataManager().getMediaObject(itemPath); 538f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mModel = new SinglePhotoDataAdapter(mActivity, mPhotoView, mediaItem); 539f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mPhotoView.setModel(mModel); 540f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin updateCurrentPhoto(mediaItem); 541ba65c373f244f6de0b45afa6b7cd711866f1bfe4Bobby Georgescu mShowSpinner = false; 542f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 543cf46a3abc26aac7cdb6b6993aeade053304b71d9Ray Chen 544b265ebb01cc046b74329eeb28dbecb24e0f953d2Bobby Georgescu mPhotoView.setFilmMode(mStartInFilmstrip && mMediaSet.getMediaItemCount() > 1); 545f122d56e15e00928d731751796b0509ae47c6799George Mount RelativeLayout galleryRoot = (RelativeLayout) ((Activity) mActivity) 546f122d56e15e00928d731751796b0509ae47c6799George Mount .findViewById(mAppBridge != null ? R.id.content : R.id.gallery_root); 547f122d56e15e00928d731751796b0509ae47c6799George Mount if (galleryRoot != null) { 548f122d56e15e00928d731751796b0509ae47c6799George Mount if (mSecureAlbum == null) { 549f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu mBottomControls = new PhotoPageBottomControls(this, mActivity, galleryRoot); 550f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu } 551f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu } 55202f459f8e1ef6d6765c9a57ee1866fc5af2f9eb5ztenghui 55302f459f8e1ef6d6765c9a57ee1866fc5af2f9eb5ztenghui ((GLRootView) mActivity.getGLRoot()).setOnSystemUiVisibilityChangeListener( 55402f459f8e1ef6d6765c9a57ee1866fc5af2f9eb5ztenghui new View.OnSystemUiVisibilityChangeListener() { 55502f459f8e1ef6d6765c9a57ee1866fc5af2f9eb5ztenghui @Override 55602f459f8e1ef6d6765c9a57ee1866fc5af2f9eb5ztenghui public void onSystemUiVisibilityChange(int visibility) { 55702f459f8e1ef6d6765c9a57ee1866fc5af2f9eb5ztenghui int diff = mLastSystemUiVis ^ visibility; 55802f459f8e1ef6d6765c9a57ee1866fc5af2f9eb5ztenghui mLastSystemUiVis = visibility; 55902f459f8e1ef6d6765c9a57ee1866fc5af2f9eb5ztenghui if ((diff & View.SYSTEM_UI_FLAG_FULLSCREEN) != 0 56002f459f8e1ef6d6765c9a57ee1866fc5af2f9eb5ztenghui && (visibility & View.SYSTEM_UI_FLAG_FULLSCREEN) == 0) { 56102f459f8e1ef6d6765c9a57ee1866fc5af2f9eb5ztenghui showBars(); 56202f459f8e1ef6d6765c9a57ee1866fc5af2f9eb5ztenghui } 56302f459f8e1ef6d6765c9a57ee1866fc5af2f9eb5ztenghui } 56402f459f8e1ef6d6765c9a57ee1866fc5af2f9eb5ztenghui }); 565a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu } 566a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu 567e3b50f1bfcfa5c8729f31788eac1a6109a88988bSascha Haeberling @Override 568f4e22eb44bfae0c2a3b6570f19480c8c3535d808Bobby Georgescu public void onPictureCenter(boolean isCamera) { 5693ad7bbc55d7aaa0f36a7242fdd0f612d877adc19Bobby Georgescu isCamera = isCamera || (mHasCameraScreennailOrPlaceholder && mAppBridge == null); 570f4e22eb44bfae0c2a3b6570f19480c8c3535d808Bobby Georgescu mPhotoView.setWantPictureCenterCallbacks(false); 571f4e22eb44bfae0c2a3b6570f19480c8c3535d808Bobby Georgescu mHandler.removeMessages(MSG_ON_CAMERA_CENTER); 572f4e22eb44bfae0c2a3b6570f19480c8c3535d808Bobby Georgescu mHandler.removeMessages(MSG_ON_PICTURE_CENTER); 573f4e22eb44bfae0c2a3b6570f19480c8c3535d808Bobby Georgescu mHandler.sendEmptyMessage(isCamera ? MSG_ON_CAMERA_CENTER : MSG_ON_PICTURE_CENTER); 574b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu } 575b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu 576e3b50f1bfcfa5c8729f31788eac1a6109a88988bSascha Haeberling @Override 577f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu public boolean canDisplayBottomControls() { 578949584340c9f5f41a6133ba06058af280490f0c8Bobby Georgescu return mIsActive && !mPhotoView.canUndo(); 579a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu } 580a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu 581e3b50f1bfcfa5c8729f31788eac1a6109a88988bSascha Haeberling @Override 582a680a0c32ae3321c632288b36083f2782af2c55bDoris Liu public boolean canDisplayBottomControl(int control) { 5834b4dbd225685502f4249c2bf25bf74f7ce526645George Mount if (mCurrentPhoto == null) { 5844b4dbd225685502f4249c2bf25bf74f7ce526645George Mount return false; 5854b4dbd225685502f4249c2bf25bf74f7ce526645George Mount } 586f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu switch(control) { 587f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu case R.id.photopage_bottom_control_edit: 588463b918edda204f1563dc2e27976cafa6af9a769John Hoford return mHaveImageEditor && mShowBars && !mReadOnlyView 589c02be7d6224c0b4e81c86e19c3d101ea070c7e1dBobby Georgescu && !mPhotoView.getFilmMode() 5904b4dbd225685502f4249c2bf25bf74f7ce526645George Mount && (mCurrentPhoto.getSupportedOperations() & MediaItem.SUPPORT_EDIT) != 0 5914b4dbd225685502f4249c2bf25bf74f7ce526645George Mount && mCurrentPhoto.getMediaType() == MediaObject.MEDIA_TYPE_IMAGE; 592f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu case R.id.photopage_bottom_control_panorama: 593a680a0c32ae3321c632288b36083f2782af2c55bDoris Liu return mIsPanorama; 594a680a0c32ae3321c632288b36083f2782af2c55bDoris Liu case R.id.photopage_bottom_control_tiny_planet: 595a680a0c32ae3321c632288b36083f2782af2c55bDoris Liu return mHaveImageEditor && mShowBars 596c02be7d6224c0b4e81c86e19c3d101ea070c7e1dBobby Georgescu && mIsPanorama360 && !mPhotoView.getFilmMode(); 597f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu default: 598f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu return false; 599f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu } 600a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu } 601a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu 602e3b50f1bfcfa5c8729f31788eac1a6109a88988bSascha Haeberling @Override 603f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu public void onBottomControlClicked(int control) { 604f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu switch(control) { 605f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu case R.id.photopage_bottom_control_edit: 606f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu launchPhotoEditor(); 607f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu return; 608f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu case R.id.photopage_bottom_control_panorama: 609e3b50f1bfcfa5c8729f31788eac1a6109a88988bSascha Haeberling mActivity.getPanoramaViewHelper() 610e3b50f1bfcfa5c8729f31788eac1a6109a88988bSascha Haeberling .showPanorama(mCurrentPhoto.getContentUri()); 611f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu return; 612a680a0c32ae3321c632288b36083f2782af2c55bDoris Liu case R.id.photopage_bottom_control_tiny_planet: 613a680a0c32ae3321c632288b36083f2782af2c55bDoris Liu launchTinyPlanet(); 614a680a0c32ae3321c632288b36083f2782af2c55bDoris Liu return; 615f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu default: 616f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu return; 617a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu } 618f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 619f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 6206772173d2a49b87a1d209f42fe52b5f830596f99Chih-Chung Chang @TargetApi(ApiHelper.VERSION_CODES.JELLY_BEAN) 621ddf0225a5192a589fc578945f56440b09bf74d12John Reck private void setupNfcBeamPush() { 622ddf0225a5192a589fc578945f56440b09bf74d12John Reck if (!ApiHelper.HAS_SET_BEAM_PUSH_URIS) return; 623ddf0225a5192a589fc578945f56440b09bf74d12John Reck 624ddf0225a5192a589fc578945f56440b09bf74d12John Reck NfcAdapter adapter = NfcAdapter.getDefaultAdapter(mActivity); 625ddf0225a5192a589fc578945f56440b09bf74d12John Reck if (adapter != null) { 6262619f20d30123a391cc6d37515fe8eb9d81d5029John Reck adapter.setBeamPushUris(null, mActivity); 627ddf0225a5192a589fc578945f56440b09bf74d12John Reck adapter.setBeamPushUrisCallback(new CreateBeamUrisCallback() { 628ddf0225a5192a589fc578945f56440b09bf74d12John Reck @Override 629ddf0225a5192a589fc578945f56440b09bf74d12John Reck public Uri[] createBeamUris(NfcEvent event) { 630ddf0225a5192a589fc578945f56440b09bf74d12John Reck return mNfcPushUris; 631ddf0225a5192a589fc578945f56440b09bf74d12John Reck } 632ddf0225a5192a589fc578945f56440b09bf74d12John Reck }, mActivity); 633fc86994f86f8cfb31e151c9e730dc1e9dc7b3349Yuli Huang } 634fc86994f86f8cfb31e151c9e730dc1e9dc7b3349Yuli Huang } 635fc86994f86f8cfb31e151c9e730dc1e9dc7b3349Yuli Huang 636ddf0225a5192a589fc578945f56440b09bf74d12John Reck private void setNfcBeamPushUri(Uri uri) { 637ddf0225a5192a589fc578945f56440b09bf74d12John Reck mNfcPushUris[0] = uri; 638ddf0225a5192a589fc578945f56440b09bf74d12John Reck } 639ddf0225a5192a589fc578945f56440b09bf74d12John Reck 6404b4dbd225685502f4249c2bf25bf74f7ce526645George Mount private static Intent createShareIntent(MediaObject mediaObject) { 6414b4dbd225685502f4249c2bf25bf74f7ce526645George Mount int type = mediaObject.getMediaType(); 642ca181a68a30ad830d55eb8886f62a323c64e1ba3Owen Lin return new Intent(Intent.ACTION_SEND) 643ca181a68a30ad830d55eb8886f62a323c64e1ba3Owen Lin .setType(MenuExecutor.getMimeType(type)) 6444b4dbd225685502f4249c2bf25bf74f7ce526645George Mount .putExtra(Intent.EXTRA_STREAM, mediaObject.getContentUri()) 645ca181a68a30ad830d55eb8886f62a323c64e1ba3Owen Lin .addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); 6465172dee697c05235ddf932827d75e6fa0b81d382Mangesh Ghiware } 647fb5571987f2555b04731b6f3e1c479efc16d542aWu-cheng Li 6484b4dbd225685502f4249c2bf25bf74f7ce526645George Mount private static Intent createSharePanoramaIntent(Uri contentUri) { 649ca181a68a30ad830d55eb8886f62a323c64e1ba3Owen Lin return new Intent(Intent.ACTION_SEND) 650ca181a68a30ad830d55eb8886f62a323c64e1ba3Owen Lin .setType(GalleryUtils.MIME_TYPE_PANORAMA360) 6514b4dbd225685502f4249c2bf25bf74f7ce526645George Mount .putExtra(Intent.EXTRA_STREAM, contentUri) 652ca181a68a30ad830d55eb8886f62a323c64e1ba3Owen Lin .addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); 653fb5571987f2555b04731b6f3e1c479efc16d542aWu-cheng Li } 654fb5571987f2555b04731b6f3e1c479efc16d542aWu-cheng Li 65548129f36b96928b34e657cdc976c1ac19f7b5ad2Bobby Georgescu private void overrideTransitionToEditor() { 6562db8b143cdcdecd81916c09e19e4c65e582dccf5Bobby Georgescu ((Activity) mActivity).overridePendingTransition(android.R.anim.fade_in, 65748129f36b96928b34e657cdc976c1ac19f7b5ad2Bobby Georgescu android.R.anim.fade_out); 65848129f36b96928b34e657cdc976c1ac19f7b5ad2Bobby Georgescu } 65948129f36b96928b34e657cdc976c1ac19f7b5ad2Bobby Georgescu 660a680a0c32ae3321c632288b36083f2782af2c55bDoris Liu private void launchTinyPlanet() { 661a680a0c32ae3321c632288b36083f2782af2c55bDoris Liu // Deep link into tiny planet 662a680a0c32ae3321c632288b36083f2782af2c55bDoris Liu MediaItem current = mModel.getMediaItem(0); 663a680a0c32ae3321c632288b36083f2782af2c55bDoris Liu Intent intent = new Intent(FilterShowActivity.TINY_PLANET_ACTION); 664a680a0c32ae3321c632288b36083f2782af2c55bDoris Liu intent.setClass(mActivity, FilterShowActivity.class); 665a680a0c32ae3321c632288b36083f2782af2c55bDoris Liu intent.setDataAndType(current.getContentUri(), current.getMimeType()) 666a680a0c32ae3321c632288b36083f2782af2c55bDoris Liu .setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); 667a850a543225e9f7a72c5a49bb6099573c7efda13Bobby Georgescu intent.putExtra(FilterShowActivity.LAUNCH_FULLSCREEN, 668a850a543225e9f7a72c5a49bb6099573c7efda13Bobby Georgescu mActivity.isFullscreen()); 669a680a0c32ae3321c632288b36083f2782af2c55bDoris Liu mActivity.startActivityForResult(intent, REQUEST_EDIT); 67048129f36b96928b34e657cdc976c1ac19f7b5ad2Bobby Georgescu overrideTransitionToEditor(); 671a680a0c32ae3321c632288b36083f2782af2c55bDoris Liu } 672a680a0c32ae3321c632288b36083f2782af2c55bDoris Liu 6735bd00332556b20c141b5c7f16433d55b1bc7fe0fBobby Georgescu private void launchCamera() { 67455705d5a9baadfe0e19170b2075e4a273033c260Mangesh Ghiware mRecenterCameraOnResume = false; 67555705d5a9baadfe0e19170b2075e4a273033c260Mangesh Ghiware GalleryUtils.startCameraActivity(mActivity); 6765bd00332556b20c141b5c7f16433d55b1bc7fe0fBobby Georgescu } 6775bd00332556b20c141b5c7f16433d55b1bc7fe0fBobby Georgescu 678a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu private void launchPhotoEditor() { 679a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu MediaItem current = mModel.getMediaItem(0); 680462923e5800e151ab5ec450063334ba430c1da3aBobby Georgescu if (current == null || (current.getSupportedOperations() 681462923e5800e151ab5ec450063334ba430c1da3aBobby Georgescu & MediaObject.SUPPORT_EDIT) == 0) { 682462923e5800e151ab5ec450063334ba430c1da3aBobby Georgescu return; 683462923e5800e151ab5ec450063334ba430c1da3aBobby Georgescu } 684a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu 685a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu Intent intent = new Intent(ACTION_NEXTGEN_EDIT); 686b6692653af5dbce477f33df721aa6177fabeda4bOwen Lin 687b6692653af5dbce477f33df721aa6177fabeda4bOwen Lin intent.setDataAndType(current.getContentUri(), current.getMimeType()) 688b6692653af5dbce477f33df721aa6177fabeda4bOwen Lin .setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); 689a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu if (mActivity.getPackageManager() 690a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu .queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY).size() == 0) { 691a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu intent.setAction(Intent.ACTION_EDIT); 692a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu } 693a850a543225e9f7a72c5a49bb6099573c7efda13Bobby Georgescu intent.putExtra(FilterShowActivity.LAUNCH_FULLSCREEN, 694a850a543225e9f7a72c5a49bb6099573c7efda13Bobby Georgescu mActivity.isFullscreen()); 695a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu ((Activity) mActivity).startActivityForResult(Intent.createChooser(intent, null), 696a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu REQUEST_EDIT); 69748129f36b96928b34e657cdc976c1ac19f7b5ad2Bobby Georgescu overrideTransitionToEditor(); 698a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu } 699a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu 7008c4e95f4380a4104c9968963a363b62746e6c967nicolasroard private void launchSimpleEditor() { 7018c4e95f4380a4104c9968963a363b62746e6c967nicolasroard MediaItem current = mModel.getMediaItem(0); 7028c4e95f4380a4104c9968963a363b62746e6c967nicolasroard if (current == null || (current.getSupportedOperations() 7038c4e95f4380a4104c9968963a363b62746e6c967nicolasroard & MediaObject.SUPPORT_EDIT) == 0) { 7048c4e95f4380a4104c9968963a363b62746e6c967nicolasroard return; 7058c4e95f4380a4104c9968963a363b62746e6c967nicolasroard } 7068c4e95f4380a4104c9968963a363b62746e6c967nicolasroard 7078c4e95f4380a4104c9968963a363b62746e6c967nicolasroard Intent intent = new Intent(ACTION_SIMPLE_EDIT); 7088c4e95f4380a4104c9968963a363b62746e6c967nicolasroard 7098c4e95f4380a4104c9968963a363b62746e6c967nicolasroard intent.setDataAndType(current.getContentUri(), current.getMimeType()) 7108c4e95f4380a4104c9968963a363b62746e6c967nicolasroard .setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); 7118c4e95f4380a4104c9968963a363b62746e6c967nicolasroard if (mActivity.getPackageManager() 7128c4e95f4380a4104c9968963a363b62746e6c967nicolasroard .queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY).size() == 0) { 7138c4e95f4380a4104c9968963a363b62746e6c967nicolasroard intent.setAction(Intent.ACTION_EDIT); 7148c4e95f4380a4104c9968963a363b62746e6c967nicolasroard } 7158c4e95f4380a4104c9968963a363b62746e6c967nicolasroard intent.putExtra(FilterShowActivity.LAUNCH_FULLSCREEN, 7168c4e95f4380a4104c9968963a363b62746e6c967nicolasroard mActivity.isFullscreen()); 7178c4e95f4380a4104c9968963a363b62746e6c967nicolasroard ((Activity) mActivity).startActivityForResult(Intent.createChooser(intent, null), 7188c4e95f4380a4104c9968963a363b62746e6c967nicolasroard REQUEST_EDIT); 7198c4e95f4380a4104c9968963a363b62746e6c967nicolasroard overrideTransitionToEditor(); 7208c4e95f4380a4104c9968963a363b62746e6c967nicolasroard } 7218c4e95f4380a4104c9968963a363b62746e6c967nicolasroard 722e23a9d412cba5a202405e1c99c0cf080949db2c7Bobby Georgescu private void requestDeferredUpdate() { 723e23a9d412cba5a202405e1c99c0cf080949db2c7Bobby Georgescu mDeferUpdateUntil = SystemClock.uptimeMillis() + DEFERRED_UPDATE_MS; 724e23a9d412cba5a202405e1c99c0cf080949db2c7Bobby Georgescu if (!mDeferredUpdateWaiting) { 725e23a9d412cba5a202405e1c99c0cf080949db2c7Bobby Georgescu mDeferredUpdateWaiting = true; 726e23a9d412cba5a202405e1c99c0cf080949db2c7Bobby Georgescu mHandler.sendEmptyMessageDelayed(MSG_UPDATE_DEFERRED, DEFERRED_UPDATE_MS); 727e23a9d412cba5a202405e1c99c0cf080949db2c7Bobby Georgescu } 728e23a9d412cba5a202405e1c99c0cf080949db2c7Bobby Georgescu } 729e23a9d412cba5a202405e1c99c0cf080949db2c7Bobby Georgescu 730e23a9d412cba5a202405e1c99c0cf080949db2c7Bobby Georgescu private void updateUIForCurrentPhoto() { 731f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (mCurrentPhoto == null) return; 732c7e3c76d6965f520a9651d309052c5f01726cd58Bobby Georgescu 733c7e3c76d6965f520a9651d309052c5f01726cd58Bobby Georgescu // If by swiping or deletion the user ends up on an action item 734c7e3c76d6965f520a9651d309052c5f01726cd58Bobby Georgescu // and zoomed in, zoom out so that the context of the action is 735c7e3c76d6965f520a9651d309052c5f01726cd58Bobby Georgescu // more clear 736e23a9d412cba5a202405e1c99c0cf080949db2c7Bobby Georgescu if ((mCurrentPhoto.getSupportedOperations() & MediaObject.SUPPORT_ACTION) != 0 737c7e3c76d6965f520a9651d309052c5f01726cd58Bobby Georgescu && !mPhotoView.getFilmMode()) { 738f4e22eb44bfae0c2a3b6570f19480c8c3535d808Bobby Georgescu mPhotoView.setWantPictureCenterCallbacks(true); 739c7e3c76d6965f520a9651d309052c5f01726cd58Bobby Georgescu } 740c7e3c76d6965f520a9651d309052c5f01726cd58Bobby Georgescu 741f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin updateMenuOperations(); 7424b4dbd225685502f4249c2bf25bf74f7ce526645George Mount refreshBottomControlsWhenReady(); 743f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (mShowDetails) { 744995c4566bed7df1aa48ba7e1351f964efa73880bMichael Kolb mDetailsHelper.reloadDetails(); 745f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 746898a2f4540635528a0916b0a6b0a177869854ae9Wu-cheng Li if ((mSecureAlbum == null) 747e23a9d412cba5a202405e1c99c0cf080949db2c7Bobby Georgescu && (mCurrentPhoto.getSupportedOperations() & MediaItem.SUPPORT_SHARE) != 0) { 7484b4dbd225685502f4249c2bf25bf74f7ce526645George Mount mCurrentPhoto.getPanoramaSupport(mUpdateShareURICallback); 749e23a9d412cba5a202405e1c99c0cf080949db2c7Bobby Georgescu } 750e23a9d412cba5a202405e1c99c0cf080949db2c7Bobby Georgescu } 751e23a9d412cba5a202405e1c99c0cf080949db2c7Bobby Georgescu 752e23a9d412cba5a202405e1c99c0cf080949db2c7Bobby Georgescu private void updateCurrentPhoto(MediaItem photo) { 753e23a9d412cba5a202405e1c99c0cf080949db2c7Bobby Georgescu if (mCurrentPhoto == photo) return; 754e23a9d412cba5a202405e1c99c0cf080949db2c7Bobby Georgescu mCurrentPhoto = photo; 755e23a9d412cba5a202405e1c99c0cf080949db2c7Bobby Georgescu if (mPhotoView.getFilmMode()) { 756e23a9d412cba5a202405e1c99c0cf080949db2c7Bobby Georgescu requestDeferredUpdate(); 757e23a9d412cba5a202405e1c99c0cf080949db2c7Bobby Georgescu } else { 758e23a9d412cba5a202405e1c99c0cf080949db2c7Bobby Georgescu updateUIForCurrentPhoto(); 75915b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang } 760825afb1b3e7d15b5c258d664ee008dc68da1c407Mangesh Ghiware } 761825afb1b3e7d15b5c258d664ee008dc68da1c407Mangesh Ghiware 762f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private void updateMenuOperations() { 76324081fe26ca25448ddb9c8f9cc7f406d26344decOwen Lin Menu menu = mActionBar.getMenu(); 76424081fe26ca25448ddb9c8f9cc7f406d26344decOwen Lin 76524081fe26ca25448ddb9c8f9cc7f406d26344decOwen Lin // it could be null if onCreateActionBar has not been called yet 76624081fe26ca25448ddb9c8f9cc7f406d26344decOwen Lin if (menu == null) return; 76724081fe26ca25448ddb9c8f9cc7f406d26344decOwen Lin 76824081fe26ca25448ddb9c8f9cc7f406d26344decOwen Lin MenuItem item = menu.findItem(R.id.action_slideshow); 76953fe9f72433f2fdae30e1708c5933390202cbcf5John Reck if (item != null) { 77053fe9f72433f2fdae30e1708c5933390202cbcf5John Reck item.setVisible((mSecureAlbum == null) && canDoSlideShow()); 77153fe9f72433f2fdae30e1708c5933390202cbcf5John Reck } 7722066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang if (mCurrentPhoto == null) return; 77324081fe26ca25448ddb9c8f9cc7f406d26344decOwen Lin 774f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin int supportedOperations = mCurrentPhoto.getSupportedOperations(); 775463b918edda204f1563dc2e27976cafa6af9a769John Hoford if (mReadOnlyView) { 776463b918edda204f1563dc2e27976cafa6af9a769John Hoford supportedOperations ^= MediaObject.SUPPORT_EDIT; 777463b918edda204f1563dc2e27976cafa6af9a769John Hoford } 778898a2f4540635528a0916b0a6b0a177869854ae9Wu-cheng Li if (mSecureAlbum != null) { 77924081fe26ca25448ddb9c8f9cc7f406d26344decOwen Lin supportedOperations &= MediaObject.SUPPORT_DELETE; 7808e5828374ffd5d96e7d1efeb36db1b940972b818Sascha Haeberling } else { 7818e5828374ffd5d96e7d1efeb36db1b940972b818Sascha Haeberling mCurrentPhoto.getPanoramaSupport(mUpdatePanoramaMenuItemsCallback); 7828e5828374ffd5d96e7d1efeb36db1b940972b818Sascha Haeberling if (!mHaveImageEditor) { 7838e5828374ffd5d96e7d1efeb36db1b940972b818Sascha Haeberling supportedOperations &= ~MediaObject.SUPPORT_EDIT; 7848e5828374ffd5d96e7d1efeb36db1b940972b818Sascha Haeberling } 785f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 78624081fe26ca25448ddb9c8f9cc7f406d26344decOwen Lin MenuExecutor.updateMenuOperation(menu, supportedOperations); 787f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 788f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 7892066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang private boolean canDoSlideShow() { 7902066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang if (mMediaSet == null || mCurrentPhoto == null) { 7912066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang return false; 7922066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang } 7932066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang if (mCurrentPhoto.getMediaType() != MediaObject.MEDIA_TYPE_IMAGE) { 7942066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang return false; 7952066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang } 7962066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang return true; 7972066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang } 7982066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang 79961f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang ////////////////////////////////////////////////////////////////////////// 80061f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang // Action Bar show/hide management 80161f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang ////////////////////////////////////////////////////////////////////////// 80261f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang 803f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private void showBars() { 804f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (mShowBars) return; 805f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mShowBars = true; 806e6251df06f0b3c8f556043f8b725b4b19be7474dChih-Chung Chang mOrientationManager.unlockOrientation(); 807f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mActionBar.show(); 8080b2486cff0c1b951c54325596256b986307f7f3aChih-Chung Chang mActivity.getGLRoot().setLightsOutMode(false); 80961f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang refreshHidingMessage(); 8104b4dbd225685502f4249c2bf25bf74f7ce526645George Mount refreshBottomControlsWhenReady(); 811f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 812f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 813f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private void hideBars() { 814f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (!mShowBars) return; 815f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mShowBars = false; 816f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mActionBar.hide(); 8170b2486cff0c1b951c54325596256b986307f7f3aChih-Chung Chang mActivity.getGLRoot().setLightsOutMode(true); 81861f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang mHandler.removeMessages(MSG_HIDE_BARS); 8194b4dbd225685502f4249c2bf25bf74f7ce526645George Mount refreshBottomControlsWhenReady(); 820f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 821f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 822f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private void refreshHidingMessage() { 823f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mHandler.removeMessages(MSG_HIDE_BARS); 8247eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu if (!mIsMenuVisible && !mPhotoView.getFilmMode()) { 825f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mHandler.sendEmptyMessageDelayed(MSG_HIDE_BARS, HIDE_BARS_TIMEOUT); 826f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 827f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 828f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 829aeb3062e84ed28f0e25a73f511f287ae0a3e4294Chih-Chung Chang private boolean canShowBars() { 830aeb3062e84ed28f0e25a73f511f287ae0a3e4294Chih-Chung Chang // No bars if we are showing camera preview. 83156bdcb7272f222fde5e4c6fc133cb490b31c7667Bobby Georgescu if (mAppBridge != null && mCurrentIndex == 0 83256bdcb7272f222fde5e4c6fc133cb490b31c7667Bobby Georgescu && !mPhotoView.getFilmMode()) return false; 83356bdcb7272f222fde5e4c6fc133cb490b31c7667Bobby Georgescu 834aeb3062e84ed28f0e25a73f511f287ae0a3e4294Chih-Chung Chang // No bars if it's not allowed. 835aeb3062e84ed28f0e25a73f511f287ae0a3e4294Chih-Chung Chang if (!mActionBarAllowed) return false; 836aeb3062e84ed28f0e25a73f511f287ae0a3e4294Chih-Chung Chang 8374ea5c27007e38fa8583add4bacf268ba67b9f0adJohn Reck Configuration config = mActivity.getResources().getConfiguration(); 8384ea5c27007e38fa8583add4bacf268ba67b9f0adJohn Reck if (config.touchscreen == Configuration.TOUCHSCREEN_NOTOUCH) { 8394ea5c27007e38fa8583add4bacf268ba67b9f0adJohn Reck return false; 8404ea5c27007e38fa8583add4bacf268ba67b9f0adJohn Reck } 8414ea5c27007e38fa8583add4bacf268ba67b9f0adJohn Reck 842aeb3062e84ed28f0e25a73f511f287ae0a3e4294Chih-Chung Chang return true; 843aeb3062e84ed28f0e25a73f511f287ae0a3e4294Chih-Chung Chang } 844aeb3062e84ed28f0e25a73f511f287ae0a3e4294Chih-Chung Chang 845e6251df06f0b3c8f556043f8b725b4b19be7474dChih-Chung Chang private void wantBars() { 846e6251df06f0b3c8f556043f8b725b4b19be7474dChih-Chung Chang if (canShowBars()) showBars(); 847e6251df06f0b3c8f556043f8b725b4b19be7474dChih-Chung Chang } 848e6251df06f0b3c8f556043f8b725b4b19be7474dChih-Chung Chang 84961f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang private void toggleBars() { 850f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (mShowBars) { 851f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin hideBars(); 852aeb3062e84ed28f0e25a73f511f287ae0a3e4294Chih-Chung Chang } else { 853e6251df06f0b3c8f556043f8b725b4b19be7474dChih-Chung Chang if (canShowBars()) showBars(); 854f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 855f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 856f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 85761f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang private void updateBars() { 858e6251df06f0b3c8f556043f8b725b4b19be7474dChih-Chung Chang if (!canShowBars()) { 85961f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang hideBars(); 86061f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang } 861f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 862f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 863f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 864f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin protected void onBackPressed() { 8654d7efab8c893b436e6e05cda486d6fd80baacb45nicolasroard showBars(); 866f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (mShowDetails) { 867f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin hideDetails(); 8683b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang } else if (mAppBridge == null || !switchWithCaptureAnimation(-1)) { 869bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang // We are leaving this page. Set the result now. 870bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang setResult(); 8717eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu if (mStartInFilmstrip && !mPhotoView.getFilmMode()) { 8727eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu mPhotoView.setFilmMode(true); 8737eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu } else if (mTreatBackAsUp) { 87454fe6202b6f7d233e7645c121321fe0f3d20fc8bYuli Huang onUpPressed(); 87554fe6202b6f7d233e7645c121321fe0f3d20fc8bYuli Huang } else { 87654fe6202b6f7d233e7645c121321fe0f3d20fc8bYuli Huang super.onBackPressed(); 87754fe6202b6f7d233e7645c121321fe0f3d20fc8bYuli Huang } 878f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 879f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 880f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 881b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang private void onUpPressed() { 882833f775afc9515567dc5aaf0cafe20e006e77545Bobby Georgescu if ((mStartInFilmstrip || mAppBridge != null) 883833f775afc9515567dc5aaf0cafe20e006e77545Bobby Georgescu && !mPhotoView.getFilmMode()) { 8847eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu mPhotoView.setFilmMode(true); 8857eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu return; 8867eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu } 8877eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu 888b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang if (mActivity.getStateManager().getStateCount() > 1) { 8897eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu setResult(); 890b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang super.onBackPressed(); 891ba12eae90b5b1a80ee002aa0df8c5c5189c4faa3Chih-Chung Chang return; 89266ca848b2f58b813d366642088d274a1b7c4a90cChih-Chung Chang } 89366ca848b2f58b813d366642088d274a1b7c4a90cChih-Chung Chang 89466ca848b2f58b813d366642088d274a1b7c4a90cChih-Chung Chang if (mOriginalSetPathString == null) return; 89566ca848b2f58b813d366642088d274a1b7c4a90cChih-Chung Chang 89666ca848b2f58b813d366642088d274a1b7c4a90cChih-Chung Chang if (mAppBridge == null) { 897b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang // We're in view mode so set up the stacks on our own. 898b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang Bundle data = new Bundle(getData()); 899b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang data.putString(AlbumPage.KEY_MEDIA_PATH, mOriginalSetPathString); 900b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang data.putString(AlbumPage.KEY_PARENT_MEDIA_PATH, 901b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang mActivity.getDataManager().getTopSetPath( 902b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang DataManager.INCLUDE_ALL)); 903b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang mActivity.getStateManager().switchState(this, AlbumPage.class, data); 90466ca848b2f58b813d366642088d274a1b7c4a90cChih-Chung Chang } else { 905833f775afc9515567dc5aaf0cafe20e006e77545Bobby Georgescu GalleryUtils.startGalleryActivity(mActivity); 906b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang } 907b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang } 908b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang 909bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang private void setResult() { 910bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang Intent result = null; 9117eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu result = new Intent(); 9127eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu result.putExtra(KEY_RETURN_INDEX_HINT, mCurrentIndex); 913bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang setStateResult(Activity.RESULT_OK, result); 914bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang } 915bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang 916bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang ////////////////////////////////////////////////////////////////////////// 917bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang // AppBridge.Server interface 918bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang ////////////////////////////////////////////////////////////////////////// 919bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang 920bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang @Override 9212ef46ed28b28b355d7f3f1432c7b1196b832a859Chih-Chung Chang public void setCameraRelativeFrame(Rect frame) { 9222ef46ed28b28b355d7f3f1432c7b1196b832a859Chih-Chung Chang mPhotoView.setCameraRelativeFrame(frame); 923bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang } 924bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang 925bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang @Override 9262c6173822a612597c79be41b126367ddfbb5d518Chih-Chung Chang public boolean switchWithCaptureAnimation(int offset) { 9272c6173822a612597c79be41b126367ddfbb5d518Chih-Chung Chang return mPhotoView.switchWithCaptureAnimation(offset); 9282c6173822a612597c79be41b126367ddfbb5d518Chih-Chung Chang } 9292c6173822a612597c79be41b126367ddfbb5d518Chih-Chung Chang 930f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 9316575794a9c09f22d5721e212c093e0a2df376d0cChih-Chung Chang public void setSwipingEnabled(boolean enabled) { 9326575794a9c09f22d5721e212c093e0a2df376d0cChih-Chung Chang mPhotoView.setSwipingEnabled(enabled); 9336575794a9c09f22d5721e212c093e0a2df376d0cChih-Chung Chang } 9346575794a9c09f22d5721e212c093e0a2df376d0cChih-Chung Chang 9356575794a9c09f22d5721e212c093e0a2df376d0cChih-Chung Chang @Override 9363b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang public void notifyScreenNailChanged() { 9373b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang mScreenNailItem.setScreenNail(mAppBridge.attachScreenNail()); 9383b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang mScreenNailSet.notifyChange(); 9393b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang } 9403b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang 9413b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang @Override 942a0ce682e40c39ce046c48d8a7f989fff01bb9f2cWu-cheng Li public void addSecureAlbumItem(boolean isVideo, int id) { 943a0ce682e40c39ce046c48d8a7f989fff01bb9f2cWu-cheng Li mSecureAlbum.addMediaItem(isVideo, id); 944a0ce682e40c39ce046c48d8a7f989fff01bb9f2cWu-cheng Li } 945a0ce682e40c39ce046c48d8a7f989fff01bb9f2cWu-cheng Li 946a0ce682e40c39ce046c48d8a7f989fff01bb9f2cWu-cheng Li @Override 947f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin protected boolean onCreateActionBar(Menu menu) { 948b21b8e58a604f6c701245d84b141b5b87663192bOwen Lin mActionBar.createActionBarMenu(R.menu.photo, menu); 9498fe22ecb8e744a09a2e0d867f876ecbf74c82298John Reck mHaveImageEditor = GalleryUtils.isEditorAvailable(mActivity, "image/*"); 950f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin updateMenuOperations(); 9513cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu mActionBar.setTitle(mMediaSet != null ? mMediaSet.getName() : ""); 952b21b8e58a604f6c701245d84b141b5b87663192bOwen Lin return true; 953f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 954f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 955d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin private MenuExecutor.ProgressListener mConfirmDialogListener = 956d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin new MenuExecutor.ProgressListener() { 957d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin @Override 958d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin public void onProgressUpdate(int index) {} 959d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin 960d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin @Override 961d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin public void onProgressComplete(int result) {} 962d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin 963d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin @Override 964d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin public void onConfirmDialogShown() { 965d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin mHandler.removeMessages(MSG_HIDE_BARS); 966d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin } 967d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin 968d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin @Override 969d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin public void onConfirmDialogDismissed(boolean confirmed) { 970d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin refreshHidingMessage(); 971d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin } 972ba50b9420e64731fd5aa8b1410e1f36457a1635aBobby Georgescu 973ba50b9420e64731fd5aa8b1410e1f36457a1635aBobby Georgescu @Override 974ba50b9420e64731fd5aa8b1410e1f36457a1635aBobby Georgescu public void onProgressStart() {} 975d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin }; 976d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin 9773cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu private void switchToGrid() { 9785585826e68c62c3719fb346d40fd1999438c6c6bBobby Georgescu if (mActivity.getStateManager().hasStateClass(AlbumPage.class)) { 9793cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu onUpPressed(); 9803cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu } else { 9813cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu if (mOriginalSetPathString == null) return; 9823cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu Bundle data = new Bundle(getData()); 9833cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu data.putString(AlbumPage.KEY_MEDIA_PATH, mOriginalSetPathString); 9843cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu data.putString(AlbumPage.KEY_PARENT_MEDIA_PATH, 9853cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu mActivity.getDataManager().getTopSetPath( 9863cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu DataManager.INCLUDE_ALL)); 9873cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu 9883cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu // We only show cluster menu in the first AlbumPage in stack 9893cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu // TODO: Enable this when running from the camera app 9903cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu boolean inAlbum = mActivity.getStateManager().hasStateClass(AlbumPage.class); 9913cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu data.putBoolean(AlbumPage.KEY_SHOW_CLUSTER_MENU, !inAlbum 9923cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu && mAppBridge == null); 9933cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu 9943cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu data.putBoolean(PhotoPage.KEY_APP_BRIDGE, mAppBridge != null); 9953cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu 9963cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu // Account for live preview being first item 9973cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu mActivity.getTransitionStore().put(KEY_RETURN_INDEX_HINT, 9983cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu mAppBridge != null ? mCurrentIndex - 1 : mCurrentIndex); 9993cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu 10003ad7bbc55d7aaa0f36a7242fdd0f612d877adc19Bobby Georgescu if (mHasCameraScreennailOrPlaceholder && mAppBridge != null) { 10015585826e68c62c3719fb346d40fd1999438c6c6bBobby Georgescu mActivity.getStateManager().startState(AlbumPage.class, data); 10025585826e68c62c3719fb346d40fd1999438c6c6bBobby Georgescu } else { 10035585826e68c62c3719fb346d40fd1999438c6c6bBobby Georgescu mActivity.getStateManager().switchState(this, AlbumPage.class, data); 10045585826e68c62c3719fb346d40fd1999438c6c6bBobby Georgescu } 10053cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu } 10063cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu } 10073cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu 1008f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 1009f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin protected boolean onItemSelected(MenuItem item) { 1010d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu if (mModel == null) return true; 1011d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin refreshHidingMessage(); 1012616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin MediaItem current = mModel.getMediaItem(0); 1013f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 1014599bdd6d7de2adfc066b06e9899d860ae2697472Doris Liu // This is a shield for monkey when it clicks the action bar 1015599bdd6d7de2adfc066b06e9899d860ae2697472Doris Liu // menu when transitioning from filmstrip to camera 1016599bdd6d7de2adfc066b06e9899d860ae2697472Doris Liu if (current instanceof SnailItem) return true; 1017599bdd6d7de2adfc066b06e9899d860ae2697472Doris Liu // TODO: We should check the current photo against the MediaItem 1018599bdd6d7de2adfc066b06e9899d860ae2697472Doris Liu // that the menu was initially created for. We need to fix this 1019599bdd6d7de2adfc066b06e9899d860ae2697472Doris Liu // after PhotoPage being refactored. 1020f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (current == null) { 1021f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin // item is not ready, ignore 1022f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return true; 1023f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 1024f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin int currentIndex = mModel.getCurrentIndex(); 1025f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin Path path = current.getPath(); 1026f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 1027f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin DataManager manager = mActivity.getDataManager(); 1028f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin int action = item.getItemId(); 10299a033b07b8e0d9fe7419b7a0d876e9c7febf43c8Ray Chen String confirmMsg = null; 1030f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin switch (action) { 103184c220f10a643927c8a2126de8a755d8d7f7ec9eRay Chen case android.R.id.home: { 1032b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang onUpPressed(); 103384c220f10a643927c8a2126de8a755d8d7f7ec9eRay Chen return true; 103484c220f10a643927c8a2126de8a755d8d7f7ec9eRay Chen } 1035f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin case R.id.action_slideshow: { 1036f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin Bundle data = new Bundle(); 10376cf807453fb58ccd4cc513ff187b306c7090e67cOwen Lin data.putString(SlideshowPage.KEY_SET_PATH, mMediaSet.getPath().toString()); 1038604f053d040782159b61d3b74ee533bc2c0ccdd0Ray Chen data.putString(SlideshowPage.KEY_ITEM_PATH, path.toString()); 1039f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin data.putInt(SlideshowPage.KEY_PHOTO_INDEX, currentIndex); 1040f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin data.putBoolean(SlideshowPage.KEY_REPEAT, true); 1041f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mActivity.getStateManager().startStateForResult( 1042f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin SlideshowPage.class, REQUEST_SLIDESHOW, data); 1043f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return true; 1044f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 1045f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin case R.id.action_crop: { 1046898a2f4540635528a0916b0a6b0a177869854ae9Wu-cheng Li Activity activity = mActivity; 1047c3178ca4daf7ed570f3432f3433959c208ecc105Ruben Brunk Intent intent = new Intent(CropActivity.CROP_ACTION); 1048c3178ca4daf7ed570f3432f3433959c208ecc105Ruben Brunk intent.setClass(activity, CropActivity.class); 104963926d2ed2ca2921de8dca9b3a52c1d64d8afc46Ruben Brunk intent.setDataAndType(manager.getContentUri(path), current.getMimeType()) 105063926d2ed2ca2921de8dca9b3a52c1d64d8afc46Ruben Brunk .setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); 1051f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin activity.startActivityForResult(intent, PicasaSource.isPicasaImage(current) 1052f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin ? REQUEST_CROP_PICASA 1053f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin : REQUEST_CROP); 1054f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return true; 1055f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 105650ea2d2938218ac6b2039f0e42998cfbbc45d1f1Teng-Hui Zhu case R.id.action_trim: { 10573f1f1baf3a674927e25cd5cd885fb372796bd3a0Teng-Hui Zhu Intent intent = new Intent(mActivity, TrimVideo.class); 10583f1f1baf3a674927e25cd5cd885fb372796bd3a0Teng-Hui Zhu intent.setData(manager.getContentUri(path)); 105915ff1b1ca52bea348b8a490b5b5abe53fa43eaf2Teng-Hui Zhu // We need the file path to wrap this into a RandomAccessFile. 106015ff1b1ca52bea348b8a490b5b5abe53fa43eaf2Teng-Hui Zhu intent.putExtra(KEY_MEDIA_ITEM_PATH, current.getFilePath()); 10613f1f1baf3a674927e25cd5cd885fb372796bd3a0Teng-Hui Zhu mActivity.startActivityForResult(intent, REQUEST_TRIM); 106250ea2d2938218ac6b2039f0e42998cfbbc45d1f1Teng-Hui Zhu return true; 106350ea2d2938218ac6b2039f0e42998cfbbc45d1f1Teng-Hui Zhu } 1064648b339c74da2b863304ffc61c8528cc74c2afb3Teng-Hui Zhu case R.id.action_mute: { 10651a719804ddd5c6fc9a6914ef5a2b6e914834d1f9Bobby Georgescu MuteVideo muteVideo = new MuteVideo(current.getFilePath(), 1066648b339c74da2b863304ffc61c8528cc74c2afb3Teng-Hui Zhu manager.getContentUri(path), mActivity); 1067648b339c74da2b863304ffc61c8528cc74c2afb3Teng-Hui Zhu muteVideo.muteInBackground(); 1068648b339c74da2b863304ffc61c8528cc74c2afb3Teng-Hui Zhu return true; 1069648b339c74da2b863304ffc61c8528cc74c2afb3Teng-Hui Zhu } 1070f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang case R.id.action_edit: { 1071a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu launchPhotoEditor(); 1072f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang return true; 1073f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang } 10748c4e95f4380a4104c9968963a363b62746e6c967nicolasroard case R.id.action_simple_edit: { 10758c4e95f4380a4104c9968963a363b62746e6c967nicolasroard launchSimpleEditor(); 10768c4e95f4380a4104c9968963a363b62746e6c967nicolasroard return true; 10778c4e95f4380a4104c9968963a363b62746e6c967nicolasroard } 1078f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin case R.id.action_details: { 1079f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (mShowDetails) { 1080f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin hideDetails(); 1081f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } else { 1082995c4566bed7df1aa48ba7e1351f964efa73880bMichael Kolb showDetails(); 1083f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 1084f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return true; 1085f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 1086513eb24fe6b9376ce41bff0abc53d6d14daf8325nicolasroard case R.id.print: { 1087513eb24fe6b9376ce41bff0abc53d6d14daf8325nicolasroard mActivity.printSelectedImage(manager.getContentUri(path)); 1088513eb24fe6b9376ce41bff0abc53d6d14daf8325nicolasroard return true; 1089513eb24fe6b9376ce41bff0abc53d6d14daf8325nicolasroard } 109067098d1a72fd04e2af06d3a5939cde28c65f70d9Ray Chen case R.id.action_delete: 10919a033b07b8e0d9fe7419b7a0d876e9c7febf43c8Ray Chen confirmMsg = mActivity.getResources().getQuantityString( 10929a033b07b8e0d9fe7419b7a0d876e9c7febf43c8Ray Chen R.plurals.delete_selection, 1); 1093f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin case R.id.action_setas: 1094f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin case R.id.action_rotate_ccw: 1095f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin case R.id.action_rotate_cw: 1096f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin case R.id.action_show_on_map: 1097f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mSelectionManager.deSelectAll(); 1098f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mSelectionManager.toggle(path); 1099d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin mMenuExecutor.onMenuClicked(item, confirmMsg, mConfirmDialogListener); 1100f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return true; 1101f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin default : 1102f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return false; 1103f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 1104f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 1105f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 1106f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private void hideDetails() { 1107f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mShowDetails = false; 11084105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen mDetailsHelper.hide(); 1109f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 1110f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 1111995c4566bed7df1aa48ba7e1351f964efa73880bMichael Kolb private void showDetails() { 1112f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mShowDetails = true; 11134105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen if (mDetailsHelper == null) { 11144105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen mDetailsHelper = new DetailsHelper(mActivity, mRootPane, new MyDetailsSource()); 11154105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen mDetailsHelper.setCloseListener(new CloseListener() { 111606c6401eededc2ec842ba4994a838c2ded0a666cPin Ting @Override 1117f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void onClose() { 1118f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin hideDetails(); 1119f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 1120f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin }); 1121f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 11224105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen mDetailsHelper.show(); 1123f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 1124f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 1125bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang //////////////////////////////////////////////////////////////////////////// 1126bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang // Callbacks from PhotoView 1127bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang //////////////////////////////////////////////////////////////////////////// 1128bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang @Override 1129f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void onSingleTapUp(int x, int y) { 1130bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang if (mAppBridge != null) { 1131bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang if (mAppBridge.onSingleTapUp(x, y)) return; 1132014d9586d8145a33f4e99eaad570587f6d650026Wu-cheng Li } 1133014d9586d8145a33f4e99eaad570587f6d650026Wu-cheng Li 1134616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin MediaItem item = mModel.getMediaItem(0); 1135b5dc542fbaeaf99bebdcf775ef0e034e89e88eaeWu-cheng Li if (item == null || item == mScreenNailItem) { 1136b5dc542fbaeaf99bebdcf775ef0e034e89e88eaeWu-cheng Li // item is not ready or it is camera preview, ignore 1137f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return; 1138f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 1139f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 11408868aa1b2d199e7fa869c9c5fad3079175621002Wu-cheng Li int supported = item.getSupportedOperations(); 11413935ca3762344c5f8a306596d70c0d4d4a2fda4bAngus Kong boolean playVideo = ((supported & MediaItem.SUPPORT_PLAY) != 0); 11428868aa1b2d199e7fa869c9c5fad3079175621002Wu-cheng Li boolean unlock = ((supported & MediaItem.SUPPORT_UNLOCK) != 0); 1143c7e3c76d6965f520a9651d309052c5f01726cd58Bobby Georgescu boolean goBack = ((supported & MediaItem.SUPPORT_BACK) != 0); 114445f089d69141e3fb0dfaad9bc34d275b61eb2aeeBobby Georgescu boolean launchCamera = ((supported & MediaItem.SUPPORT_CAMERA_SHORTCUT) != 0); 1145f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 1146f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (playVideo) { 1147f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin // determine if the point is at center (1/6) of the photo view. 1148f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin // (The position of the "play" icon is at center (1/6) of the photo) 1149f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin int w = mPhotoView.getWidth(); 1150f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin int h = mPhotoView.getHeight(); 1151f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin playVideo = (Math.abs(x - w / 2) * 12 <= w) 1152f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin && (Math.abs(y - h / 2) * 12 <= h); 1153f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 1154f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 1155f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (playVideo) { 11563935ca3762344c5f8a306596d70c0d4d4a2fda4bAngus Kong if (mSecureAlbum == null) { 11573935ca3762344c5f8a306596d70c0d4d4a2fda4bAngus Kong playVideo(mActivity, item.getPlayUri(), item.getName()); 11583935ca3762344c5f8a306596d70c0d4d4a2fda4bAngus Kong } else { 11593935ca3762344c5f8a306596d70c0d4d4a2fda4bAngus Kong mActivity.getStateManager().finishState(this); 11603935ca3762344c5f8a306596d70c0d4d4a2fda4bAngus Kong } 1161c7e3c76d6965f520a9651d309052c5f01726cd58Bobby Georgescu } else if (goBack) { 1162c7e3c76d6965f520a9651d309052c5f01726cd58Bobby Georgescu onBackPressed(); 11638868aa1b2d199e7fa869c9c5fad3079175621002Wu-cheng Li } else if (unlock) { 116406c027675948259368a902fd6f8c2ecac5db5167Mangesh Ghiware Intent intent = new Intent(mActivity, GalleryActivity.class); 116506c027675948259368a902fd6f8c2ecac5db5167Mangesh Ghiware intent.putExtra(GalleryActivity.KEY_DISMISS_KEYGUARD, true); 11666455ba954daa6dd0a8e114c7db97a8361d064e5aWu-cheng Li mActivity.startActivity(intent); 116745f089d69141e3fb0dfaad9bc34d275b61eb2aeeBobby Georgescu } else if (launchCamera) { 11685bd00332556b20c141b5c7f16433d55b1bc7fe0fBobby Georgescu launchCamera(); 1169f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } else { 117061f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang toggleBars(); 1171f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 1172f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 1173f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 1174bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang @Override 117561f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang public void onActionBarAllowed(boolean allowed) { 117661f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang mActionBarAllowed = allowed; 117761f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang mHandler.sendEmptyMessage(MSG_UPDATE_ACTION_BAR); 117861f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang } 117961f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang 118061f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang @Override 1181e6251df06f0b3c8f556043f8b725b4b19be7474dChih-Chung Chang public void onActionBarWanted() { 1182e6251df06f0b3c8f556043f8b725b4b19be7474dChih-Chung Chang mHandler.sendEmptyMessage(MSG_WANT_BARS); 1183e6251df06f0b3c8f556043f8b725b4b19be7474dChih-Chung Chang } 1184e6251df06f0b3c8f556043f8b725b4b19be7474dChih-Chung Chang 1185e6251df06f0b3c8f556043f8b725b4b19be7474dChih-Chung Chang @Override 1186bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang public void onFullScreenChanged(boolean full) { 1187bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang Message m = mHandler.obtainMessage( 1188bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang MSG_ON_FULL_SCREEN_CHANGED, full ? 1 : 0, 0); 1189bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang m.sendToTarget(); 1190bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang } 1191bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang 11926b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang // How we do delete/undo: 11936b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang // 11946b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang // When the user choose to delete a media item, we just tell the 11956b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang // FilterDeleteSet to hide that item. If the user choose to undo it, we 11966b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang // again tell FilterDeleteSet not to hide it. If the user choose to commit 11976b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang // the deletion, we then actually delete the media item. 11986b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang @Override 11996b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang public void onDeleteImage(Path path, int offset) { 12006118af9ddad8acc050133154f8f60c842c7f9bfaChih-Chung Chang onCommitDeleteImage(); // commit the previous deletion 12016b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang mDeletePath = path; 12026b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang mDeleteIsFocus = (offset == 0); 12036118af9ddad8acc050133154f8f60c842c7f9bfaChih-Chung Chang mMediaSet.addDeletion(path, mCurrentIndex + offset); 12046b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang } 12056b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang 12066b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang @Override 12076b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang public void onUndoDeleteImage() { 12086118af9ddad8acc050133154f8f60c842c7f9bfaChih-Chung Chang if (mDeletePath == null) return; 12096b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang // If the deletion was done on the focused item, we want the model to 12106b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang // focus on it when it is undeleted. 12116b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang if (mDeleteIsFocus) mModel.setFocusHintPath(mDeletePath); 12126118af9ddad8acc050133154f8f60c842c7f9bfaChih-Chung Chang mMediaSet.removeDeletion(mDeletePath); 12136b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang mDeletePath = null; 12146b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang } 12156b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang 12166b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang @Override 12176b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang public void onCommitDeleteImage() { 12186b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang if (mDeletePath == null) return; 1219d00f521a3138a8f244c91748b0277290edbf61f6Bobby Georgescu mMenuExecutor.startSingleItemAction(R.id.action_delete, mDeletePath); 12206b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang mDeletePath = null; 12216b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang } 12226b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang 1223d81b264931cfa3b34096efd46659b81f9a628fb5Bobby Georgescu public void playVideo(Activity activity, Uri uri, String title) { 1224f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin try { 1225f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin Intent intent = new Intent(Intent.ACTION_VIEW) 1226a3871050845b4921379add2b126add3cfbab1109Ray Chen .setDataAndType(uri, "video/*") 1227a3871050845b4921379add2b126add3cfbab1109Ray Chen .putExtra(Intent.EXTRA_TITLE, title) 1228a3871050845b4921379add2b126add3cfbab1109Ray Chen .putExtra(MovieActivity.KEY_TREAT_UP_AS_BACK, true); 122971cd89a38752bc22ae0ec2df965e4280b776623cChih-Chung Chang activity.startActivityForResult(intent, REQUEST_PLAY_VIDEO); 1230f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } catch (ActivityNotFoundException e) { 1231f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin Toast.makeText(activity, activity.getString(R.string.video_err), 1232f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin Toast.LENGTH_SHORT).show(); 1233f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 1234f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 1235f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 1236f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang private void setCurrentPhotoByIntent(Intent intent) { 1237f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang if (intent == null) return; 1238f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang Path path = mApplication.getDataManager() 1239f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang .findPathByUri(intent.getData(), intent.getType()); 1240f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang if (path != null) { 12410addfc7f6342184a67cdd8b5cc3872c6a5c87e55Doris Liu Path albumPath = mApplication.getDataManager().getDefaultSetOf(path); 1242eb2950384846a3797e13b04765f65df70d80982eztenghui if (albumPath == null) { 1243eb2950384846a3797e13b04765f65df70d80982eztenghui return; 1244eb2950384846a3797e13b04765f65df70d80982eztenghui } 12450addfc7f6342184a67cdd8b5cc3872c6a5c87e55Doris Liu if (!albumPath.equalsIgnoreCase(mOriginalSetPathString)) { 12460addfc7f6342184a67cdd8b5cc3872c6a5c87e55Doris Liu // If the edited image is stored in a different album, we need 12470addfc7f6342184a67cdd8b5cc3872c6a5c87e55Doris Liu // to start a new activity state to show the new image 12480addfc7f6342184a67cdd8b5cc3872c6a5c87e55Doris Liu Bundle data = new Bundle(getData()); 12490addfc7f6342184a67cdd8b5cc3872c6a5c87e55Doris Liu data.putString(KEY_MEDIA_SET_PATH, albumPath.toString()); 12500addfc7f6342184a67cdd8b5cc3872c6a5c87e55Doris Liu data.putString(PhotoPage.KEY_MEDIA_ITEM_PATH, path.toString()); 1251cfa7fde1a336a3200b2ad9091b27ba7bfd8f5c9aBobby Georgescu mActivity.getStateManager().startState(SinglePhotoPage.class, data); 12520addfc7f6342184a67cdd8b5cc3872c6a5c87e55Doris Liu return; 12530addfc7f6342184a67cdd8b5cc3872c6a5c87e55Doris Liu } 1254f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang mModel.setCurrentPhoto(path, mCurrentIndex); 1255f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang } 1256f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang } 1257f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang 1258f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 1259f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin protected void onStateResult(int requestCode, int resultCode, Intent data) { 1260f85d974363a40b8ce588ba3fe902eec38de603d9John Reck if (resultCode == Activity.RESULT_CANCELED) { 1261f85d974363a40b8ce588ba3fe902eec38de603d9John Reck // This is a reset, not a canceled 1262f85d974363a40b8ce588ba3fe902eec38de603d9John Reck return; 1263f85d974363a40b8ce588ba3fe902eec38de603d9John Reck } 1264f85d974363a40b8ce588ba3fe902eec38de603d9John Reck mRecenterCameraOnResume = false; 1265f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin switch (requestCode) { 1266f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang case REQUEST_EDIT: 1267f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang setCurrentPhotoByIntent(data); 1268f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang break; 1269f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin case REQUEST_CROP: 1270f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (resultCode == Activity.RESULT_OK) { 1271f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang setCurrentPhotoByIntent(data); 1272f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 1273f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin break; 1274f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin case REQUEST_CROP_PICASA: { 1275f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang if (resultCode == Activity.RESULT_OK) { 1276f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang Context context = mActivity.getAndroidContext(); 127788cc2ca5f5596762a5546ec7426756f2036be455Yuli Huang String message = context.getString(R.string.crop_saved, 127800d64dd584c6d08310a32a28e75aebc6eb8238eaRuben Brunk context.getString(R.string.folder_edited_online_photos)); 1279f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang Toast.makeText(context, message, Toast.LENGTH_SHORT).show(); 1280f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang } 1281f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin break; 1282f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 1283f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin case REQUEST_SLIDESHOW: { 1284f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (data == null) break; 1285f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin String path = data.getStringExtra(SlideshowPage.KEY_ITEM_PATH); 1286f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin int index = data.getIntExtra(SlideshowPage.KEY_PHOTO_INDEX, 0); 1287f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (path != null) { 1288f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mModel.setCurrentPhoto(Path.fromString(path), index); 1289f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 1290f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 1291f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 1292f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 1293f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 129414d3289b4867c21da93ec4032119c0091bc78c30George Mount @Override 1295f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void onPause() { 1296d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin super.onPause(); 1297d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin mIsActive = false; 1298d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin 1299bd7c016d728853d38f98a3c6077b7bd9b08858b9Yuli Huang mActivity.getGLRoot().unfreeze(); 1300bd7c016d728853d38f98a3c6077b7bd9b08858b9Yuli Huang mHandler.removeMessages(MSG_UNFREEZE_GLROOT); 1301253c5aec7692afdd7880fbd169d4b44d5679cbc0Chih-Chung Chang 13024105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen DetailsHelper.pause(); 13034438a7cce00cb19cb35cfc3cc149533f40043c00Doris Liu // Hide the detail dialog on exit 13044438a7cce00cb19cb35cfc3cc149533f40043c00Doris Liu if (mShowDetails) hideDetails(); 1305d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu if (mModel != null) { 1306d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu mModel.pause(); 1307d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu } 1308f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mPhotoView.pause(); 1309f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mHandler.removeMessages(MSG_HIDE_BARS); 1310d2724f69edf39cf2019eac1b49f316d22ab70d0aBobby Georgescu mHandler.removeMessages(MSG_REFRESH_BOTTOM_CONTROLS); 13114b4dbd225685502f4249c2bf25bf74f7ce526645George Mount refreshBottomControlsWhenReady(); 1312f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mActionBar.removeOnMenuVisibilityListener(mMenuVisibilityListener); 1313ba65c373f244f6de0b45afa6b7cd711866f1bfe4Bobby Georgescu if (mShowSpinner) { 13149481d05b0782dccd495c66d2e3240cd7448bbd4aBobby Georgescu mActionBar.disableAlbumModeMenu(true); 13159481d05b0782dccd495c66d2e3240cd7448bbd4aBobby Georgescu } 13166b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang onCommitDeleteImage(); 13172785956f8f5654966a41e20f482f4af3057eea3fChih-Chung Chang mMenuExecutor.pause(); 13186118af9ddad8acc050133154f8f60c842c7f9bfaChih-Chung Chang if (mMediaSet != null) mMediaSet.clearDeletion(); 1319f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 1320f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 1321f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 1322bd7c016d728853d38f98a3c6077b7bd9b08858b9Yuli Huang public void onCurrentImageUpdated() { 1323bd7c016d728853d38f98a3c6077b7bd9b08858b9Yuli Huang mActivity.getGLRoot().unfreeze(); 1324bd7c016d728853d38f98a3c6077b7bd9b08858b9Yuli Huang } 1325bd7c016d728853d38f98a3c6077b7bd9b08858b9Yuli Huang 1326f122d56e15e00928d731751796b0509ae47c6799George Mount @Override 13277eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu public void onFilmModeChanged(boolean enabled) { 13284b4dbd225685502f4249c2bf25bf74f7ce526645George Mount refreshBottomControlsWhenReady(); 1329c29588d7cc9fc3d2eef61af433fc0a8859e16ef4Bobby Georgescu if (mShowSpinner) { 1330c29588d7cc9fc3d2eef61af433fc0a8859e16ef4Bobby Georgescu if (enabled) { 1331c29588d7cc9fc3d2eef61af433fc0a8859e16ef4Bobby Georgescu mActionBar.enableAlbumModeMenu( 1332c29588d7cc9fc3d2eef61af433fc0a8859e16ef4Bobby Georgescu GalleryActionBar.ALBUM_FILMSTRIP_MODE_SELECTED, this); 1333c29588d7cc9fc3d2eef61af433fc0a8859e16ef4Bobby Georgescu } else { 1334c29588d7cc9fc3d2eef61af433fc0a8859e16ef4Bobby Georgescu mActionBar.disableAlbumModeMenu(true); 1335c29588d7cc9fc3d2eef61af433fc0a8859e16ef4Bobby Georgescu } 1336c29588d7cc9fc3d2eef61af433fc0a8859e16ef4Bobby Georgescu } 13377eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu if (enabled) { 13387eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu mHandler.removeMessages(MSG_HIDE_BARS); 1339f37648b877bf6029d7afead31e965b473114c89cBobby Georgescu UsageStatistics.onContentViewChanged( 1340f37648b877bf6029d7afead31e965b473114c89cBobby Georgescu UsageStatistics.COMPONENT_GALLERY, "FilmstripPage"); 13417eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu } else { 13427eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu refreshHidingMessage(); 1343f37648b877bf6029d7afead31e965b473114c89cBobby Georgescu if (mAppBridge == null || mCurrentIndex > 0) { 1344f37648b877bf6029d7afead31e965b473114c89cBobby Georgescu UsageStatistics.onContentViewChanged( 1345f37648b877bf6029d7afead31e965b473114c89cBobby Georgescu UsageStatistics.COMPONENT_GALLERY, "SinglePhotoPage"); 1346f37648b877bf6029d7afead31e965b473114c89cBobby Georgescu } else { 1347f37648b877bf6029d7afead31e965b473114c89cBobby Georgescu UsageStatistics.onContentViewChanged( 1348f37648b877bf6029d7afead31e965b473114c89cBobby Georgescu UsageStatistics.COMPONENT_CAMERA, "Unknown"); // TODO 1349f37648b877bf6029d7afead31e965b473114c89cBobby Georgescu } 13507eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu } 13517eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu } 13527eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu 13537eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu private void transitionFromAlbumPageIfNeeded() { 13547eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu TransitionStore transitions = mActivity.getTransitionStore(); 13557eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu 13567eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu int albumPageTransition = transitions.get( 13577eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu KEY_ALBUMPAGE_TRANSITION, MSG_ALBUMPAGE_NONE); 13587eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu 1359d81b264931cfa3b34096efd46659b81f9a628fb5Bobby Georgescu if (albumPageTransition == MSG_ALBUMPAGE_NONE && mAppBridge != null 1360d81b264931cfa3b34096efd46659b81f9a628fb5Bobby Georgescu && mRecenterCameraOnResume) { 136100ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu // Generally, resuming the PhotoPage when in Camera should 136200ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu // reset to the capture mode to allow quick photo taking 136300ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu mCurrentIndex = 0; 136400ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu mPhotoView.resetToFirstPicture(); 136500ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu } else { 136600ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu int resumeIndex = transitions.get(KEY_INDEX_HINT, -1); 136700ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu if (resumeIndex >= 0) { 13683ad7bbc55d7aaa0f36a7242fdd0f612d877adc19Bobby Georgescu if (mHasCameraScreennailOrPlaceholder) { 136976f1881067d7ca4eda6d3e398567473d2913c5d1Bobby Georgescu // Account for preview/placeholder being the first item 137000ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu resumeIndex++; 137100ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu } 137200ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu if (resumeIndex < mMediaSet.getMediaItemCount()) { 137300ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu mCurrentIndex = resumeIndex; 137400ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu mModel.moveTo(mCurrentIndex); 137500ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu } 137600ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu } 137700ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu } 137800ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu 137900ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu if (albumPageTransition == MSG_ALBUMPAGE_RESUMED) { 138000ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu mPhotoView.setFilmMode(mStartInFilmstrip || mAppBridge != null); 138100ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu } else if (albumPageTransition == MSG_ALBUMPAGE_PICKED) { 138200ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu mPhotoView.setFilmMode(false); 13837eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu } 13847eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu } 13857eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu 1386bd7c016d728853d38f98a3c6077b7bd9b08858b9Yuli Huang @Override 1387f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin protected void onResume() { 1388f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin super.onResume(); 13897eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu 1390d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu if (mModel == null) { 1391d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu mActivity.getStateManager().finishState(this); 1392d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu return; 1393d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu } 13947eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu transitionFromAlbumPageIfNeeded(); 13957eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu 1396d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin mActivity.getGLRoot().freeze(); 1397f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mIsActive = true; 1398f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin setContentPane(mRootPane); 139904ac045bf8da5082bbb0bdc9ea5f9c9b5b796ad0Yuli Huang 1400f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mModel.resume(); 1401f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mPhotoView.resume(); 1402898a2f4540635528a0916b0a6b0a177869854ae9Wu-cheng Li mActionBar.setDisplayOptions( 14033cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu ((mSecureAlbum == null) && (mSetPathString != null)), false); 1404f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mActionBar.addOnMenuVisibilityListener(mMenuVisibilityListener); 14054b4dbd225685502f4249c2bf25bf74f7ce526645George Mount refreshBottomControlsWhenReady(); 1406c29588d7cc9fc3d2eef61af433fc0a8859e16ef4Bobby Georgescu if (mShowSpinner && mPhotoView.getFilmMode()) { 14079481d05b0782dccd495c66d2e3240cd7448bbd4aBobby Georgescu mActionBar.enableAlbumModeMenu( 14089481d05b0782dccd495c66d2e3240cd7448bbd4aBobby Georgescu GalleryActionBar.ALBUM_FILMSTRIP_MODE_SELECTED, this); 14099481d05b0782dccd495c66d2e3240cd7448bbd4aBobby Georgescu } 141000ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu if (!mShowBars) { 141100ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu mActionBar.hide(); 141200ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu mActivity.getGLRoot().setLightsOutMode(true); 1413bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang } 14148fe22ecb8e744a09a2e0d867f876ecbf74c82298John Reck boolean haveImageEditor = GalleryUtils.isEditorAvailable(mActivity, "image/*"); 14158fe22ecb8e744a09a2e0d867f876ecbf74c82298John Reck if (haveImageEditor != mHaveImageEditor) { 14168fe22ecb8e744a09a2e0d867f876ecbf74c82298John Reck mHaveImageEditor = haveImageEditor; 14178fe22ecb8e744a09a2e0d867f876ecbf74c82298John Reck updateMenuOperations(); 14188fe22ecb8e744a09a2e0d867f876ecbf74c82298John Reck } 141900ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu 1420d81b264931cfa3b34096efd46659b81f9a628fb5Bobby Georgescu mRecenterCameraOnResume = true; 1421bd7c016d728853d38f98a3c6077b7bd9b08858b9Yuli Huang mHandler.sendEmptyMessageDelayed(MSG_UNFREEZE_GLROOT, UNFREEZE_GLROOT_TIMEOUT); 1422f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 1423f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 142415b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang @Override 142515b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang protected void onDestroy() { 1426bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang if (mAppBridge != null) { 1427253c5aec7692afdd7880fbd169d4b44d5679cbc0Chih-Chung Chang mAppBridge.setServer(null); 14283b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang mScreenNailItem.setScreenNail(null); 1429bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang mAppBridge.detachScreenNail(); 1430bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang mAppBridge = null; 14313b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang mScreenNailSet = null; 14323b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang mScreenNailItem = null; 1433b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang } 14342ef46ed28b28b355d7f3f1432c7b1196b832a859Chih-Chung Chang mActivity.getGLRoot().setOrientationSource(null); 1435f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu if (mBottomControls != null) mBottomControls.cleanup(); 1436aeb3062e84ed28f0e25a73f511f287ae0a3e4294Chih-Chung Chang 1437aeb3062e84ed28f0e25a73f511f287ae0a3e4294Chih-Chung Chang // Remove all pending messages. 1438aeb3062e84ed28f0e25a73f511f287ae0a3e4294Chih-Chung Chang mHandler.removeCallbacksAndMessages(null); 143915b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang super.onDestroy(); 144015b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang } 144115b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang 1442f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private class MyDetailsSource implements DetailsSource { 14436cf807453fb58ccd4cc513ff187b306c7090e67cOwen Lin 14446cf807453fb58ccd4cc513ff187b306c7090e67cOwen Lin @Override 1445f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public MediaDetails getDetails() { 1446616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin return mModel.getMediaItem(0).getDetails(); 1447f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 14486cf807453fb58ccd4cc513ff187b306c7090e67cOwen Lin 14496cf807453fb58ccd4cc513ff187b306c7090e67cOwen Lin @Override 1450f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public int size() { 1451f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return mMediaSet != null ? mMediaSet.getMediaItemCount() : 1; 1452f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 14536cf807453fb58ccd4cc513ff187b306c7090e67cOwen Lin 14546cf807453fb58ccd4cc513ff187b306c7090e67cOwen Lin @Override 1455995c4566bed7df1aa48ba7e1351f964efa73880bMichael Kolb public int setIndex() { 1456995c4566bed7df1aa48ba7e1351f964efa73880bMichael Kolb return mModel.getCurrentIndex(); 14574105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen } 1458f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 14593cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu 14603cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu @Override 14613cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu public void onAlbumModeSelected(int mode) { 14623cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu if (mode == GalleryActionBar.ALBUM_GRID_MODE_SELECTED) { 14633cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu switchToGrid(); 14643cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu } 14653cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu } 14664b4dbd225685502f4249c2bf25bf74f7ce526645George Mount 14674b4dbd225685502f4249c2bf25bf74f7ce526645George Mount @Override 14684b4dbd225685502f4249c2bf25bf74f7ce526645George Mount public void refreshBottomControlsWhenReady() { 14694b4dbd225685502f4249c2bf25bf74f7ce526645George Mount if (mBottomControls == null) { 14704b4dbd225685502f4249c2bf25bf74f7ce526645George Mount return; 14714b4dbd225685502f4249c2bf25bf74f7ce526645George Mount } 14724b4dbd225685502f4249c2bf25bf74f7ce526645George Mount MediaObject currentPhoto = mCurrentPhoto; 14734b4dbd225685502f4249c2bf25bf74f7ce526645George Mount if (currentPhoto == null) { 14744b4dbd225685502f4249c2bf25bf74f7ce526645George Mount mHandler.obtainMessage(MSG_REFRESH_BOTTOM_CONTROLS, 0, 0, currentPhoto).sendToTarget(); 14754b4dbd225685502f4249c2bf25bf74f7ce526645George Mount } else { 14764b4dbd225685502f4249c2bf25bf74f7ce526645George Mount currentPhoto.getPanoramaSupport(mRefreshBottomControlsCallback); 14774b4dbd225685502f4249c2bf25bf74f7ce526645George Mount } 14784b4dbd225685502f4249c2bf25bf74f7ce526645George Mount } 14794b4dbd225685502f4249c2bf25bf74f7ce526645George Mount 14804b4dbd225685502f4249c2bf25bf74f7ce526645George Mount private void updatePanoramaUI(boolean isPanorama360) { 14814b4dbd225685502f4249c2bf25bf74f7ce526645George Mount Menu menu = mActionBar.getMenu(); 14824b4dbd225685502f4249c2bf25bf74f7ce526645George Mount 14834b4dbd225685502f4249c2bf25bf74f7ce526645George Mount // it could be null if onCreateActionBar has not been called yet 14844b4dbd225685502f4249c2bf25bf74f7ce526645George Mount if (menu == null) { 14854b4dbd225685502f4249c2bf25bf74f7ce526645George Mount return; 14864b4dbd225685502f4249c2bf25bf74f7ce526645George Mount } 14874b4dbd225685502f4249c2bf25bf74f7ce526645George Mount 14884b4dbd225685502f4249c2bf25bf74f7ce526645George Mount MenuExecutor.updateMenuForPanorama(menu, isPanorama360, isPanorama360); 14894b4dbd225685502f4249c2bf25bf74f7ce526645George Mount 14904b4dbd225685502f4249c2bf25bf74f7ce526645George Mount if (isPanorama360) { 14914b4dbd225685502f4249c2bf25bf74f7ce526645George Mount MenuItem item = menu.findItem(R.id.action_share); 14924b4dbd225685502f4249c2bf25bf74f7ce526645George Mount if (item != null) { 14934b4dbd225685502f4249c2bf25bf74f7ce526645George Mount item.setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER); 14944b4dbd225685502f4249c2bf25bf74f7ce526645George Mount item.setTitle(mActivity.getResources().getString(R.string.share_as_photo)); 14954b4dbd225685502f4249c2bf25bf74f7ce526645George Mount } 14964b4dbd225685502f4249c2bf25bf74f7ce526645George Mount } else if ((mCurrentPhoto.getSupportedOperations() & MediaObject.SUPPORT_SHARE) != 0) { 14974b4dbd225685502f4249c2bf25bf74f7ce526645George Mount MenuItem item = menu.findItem(R.id.action_share); 14984b4dbd225685502f4249c2bf25bf74f7ce526645George Mount if (item != null) { 14994b4dbd225685502f4249c2bf25bf74f7ce526645George Mount item.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM); 15004b4dbd225685502f4249c2bf25bf74f7ce526645George Mount item.setTitle(mActivity.getResources().getString(R.string.share)); 15014b4dbd225685502f4249c2bf25bf74f7ce526645George Mount } 15024b4dbd225685502f4249c2bf25bf74f7ce526645George Mount } 15034b4dbd225685502f4249c2bf25bf74f7ce526645George Mount } 1504949584340c9f5f41a6133ba06058af280490f0c8Bobby Georgescu 1505949584340c9f5f41a6133ba06058af280490f0c8Bobby Georgescu @Override 1506949584340c9f5f41a6133ba06058af280490f0c8Bobby Georgescu public void onUndoBarVisibilityChanged(boolean visible) { 1507949584340c9f5f41a6133ba06058af280490f0c8Bobby Georgescu refreshBottomControlsWhenReady(); 1508949584340c9f5f41a6133ba06058af280490f0c8Bobby Georgescu } 15092251386437163898eb4b6f7546705d1365744fd1Flavio Lerda 15102251386437163898eb4b6f7546705d1365744fd1Flavio Lerda @Override 15112251386437163898eb4b6f7546705d1365744fd1Flavio Lerda public boolean onShareTargetSelected(ShareActionProvider source, Intent intent) { 15122251386437163898eb4b6f7546705d1365744fd1Flavio Lerda final long timestampMillis = mCurrentPhoto.getDateInMs(); 15132251386437163898eb4b6f7546705d1365744fd1Flavio Lerda final String mediaType = getMediaTypeString(mCurrentPhoto); 15142251386437163898eb4b6f7546705d1365744fd1Flavio Lerda UsageStatistics.onEvent(UsageStatistics.COMPONENT_GALLERY, 15152251386437163898eb4b6f7546705d1365744fd1Flavio Lerda UsageStatistics.ACTION_SHARE, 15162251386437163898eb4b6f7546705d1365744fd1Flavio Lerda mediaType, 15172251386437163898eb4b6f7546705d1365744fd1Flavio Lerda timestampMillis > 0 15182251386437163898eb4b6f7546705d1365744fd1Flavio Lerda ? System.currentTimeMillis() - timestampMillis 15192251386437163898eb4b6f7546705d1365744fd1Flavio Lerda : -1); 15202251386437163898eb4b6f7546705d1365744fd1Flavio Lerda return false; 15212251386437163898eb4b6f7546705d1365744fd1Flavio Lerda } 15222251386437163898eb4b6f7546705d1365744fd1Flavio Lerda 15232251386437163898eb4b6f7546705d1365744fd1Flavio Lerda private static String getMediaTypeString(MediaItem item) { 15242251386437163898eb4b6f7546705d1365744fd1Flavio Lerda if (item.getMediaType() == MediaObject.MEDIA_TYPE_VIDEO) { 15252251386437163898eb4b6f7546705d1365744fd1Flavio Lerda return "Video"; 15262251386437163898eb4b6f7546705d1365744fd1Flavio Lerda } else if (item.getMediaType() == MediaObject.MEDIA_TYPE_IMAGE) { 15272251386437163898eb4b6f7546705d1365744fd1Flavio Lerda return "Photo"; 15282251386437163898eb4b6f7546705d1365744fd1Flavio Lerda } else { 15292251386437163898eb4b6f7546705d1365744fd1Flavio Lerda return "Unknown:" + item.getMediaType(); 15302251386437163898eb4b6f7546705d1365744fd1Flavio Lerda } 15312251386437163898eb4b6f7546705d1365744fd1Flavio Lerda } 15322251386437163898eb4b6f7546705d1365744fd1Flavio Lerda 1533f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin} 1534