PhotoPage.java revision b27df4650459068b409924493bbadaf25bb7e191
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; 208bc5bebba780ca4a322b466b06fc909331697cf4Owen Linimport android.app.Activity; 21604f053d040782159b61d3b74ee533bc2c0ccdd0Ray Chenimport android.content.ActivityNotFoundException; 22604f053d040782159b61d3b74ee533bc2c0ccdd0Ray Chenimport android.content.Context; 23604f053d040782159b61d3b74ee533bc2c0ccdd0Ray Chenimport android.content.Intent; 24a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescuimport android.content.pm.PackageManager; 2504ac045bf8da5082bbb0bdc9ea5f9c9b5b796ad0Yuli Huangimport android.graphics.Rect; 26604f053d040782159b61d3b74ee533bc2c0ccdd0Ray Chenimport android.net.Uri; 2733ef03776b7734717b16f6fc861b831fb1b1dfacMartijn Coenenimport android.nfc.NfcAdapter; 28ddf0225a5192a589fc578945f56440b09bf74d12John Reckimport android.nfc.NfcAdapter.CreateBeamUrisCallback; 29ddf0225a5192a589fc578945f56440b09bf74d12John Reckimport android.nfc.NfcEvent; 30604f053d040782159b61d3b74ee533bc2c0ccdd0Ray Chenimport android.os.Bundle; 31604f053d040782159b61d3b74ee533bc2c0ccdd0Ray Chenimport android.os.Handler; 32604f053d040782159b61d3b74ee533bc2c0ccdd0Ray Chenimport android.os.Message; 33b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescuimport android.os.SystemClock; 34f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescuimport android.view.animation.AccelerateInterpolator; 35a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescuimport android.widget.RelativeLayout; 36604f053d040782159b61d3b74ee533bc2c0ccdd0Ray Chenimport android.widget.Toast; 37604f053d040782159b61d3b74ee533bc2c0ccdd0Ray Chen 38b21b8e58a604f6c701245d84b141b5b87663192bOwen Linimport com.actionbarsherlock.app.ActionBar.OnMenuVisibilityListener; 39b21b8e58a604f6c701245d84b141b5b87663192bOwen Linimport com.actionbarsherlock.view.Menu; 40b21b8e58a604f6c701245d84b141b5b87663192bOwen Linimport com.actionbarsherlock.view.MenuItem; 41f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.R; 42f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescuimport com.android.gallery3d.anim.FloatAnimation; 43fc86994f86f8cfb31e151c9e730dc1e9dc7b3349Yuli Huangimport com.android.gallery3d.common.ApiHelper; 44616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Linimport com.android.gallery3d.common.Utils; 45f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.data.DataManager; 466b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Changimport com.android.gallery3d.data.FilterDeleteSet; 47f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.data.MediaDetails; 48f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.data.MediaItem; 49f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.data.MediaObject; 50f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.data.MediaSet; 516b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Changimport com.android.gallery3d.data.MtpSource; 52f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.data.Path; 53a0ce682e40c39ce046c48d8a7f989fff01bb9f2cWu-cheng Liimport com.android.gallery3d.data.SecureAlbum; 54a0ce682e40c39ce046c48d8a7f989fff01bb9f2cWu-cheng Liimport com.android.gallery3d.data.SecureSource; 553b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Changimport com.android.gallery3d.data.SnailAlbum; 563b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Changimport com.android.gallery3d.data.SnailItem; 5715b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Changimport com.android.gallery3d.data.SnailSource; 58f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.picasasource.PicasaSource; 59f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescuimport com.android.gallery3d.ui.AnimationTime; 6024081fe26ca25448ddb9c8f9cc7f406d26344decOwen Linimport com.android.gallery3d.ui.BitmapScreenNail; 614105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chenimport com.android.gallery3d.ui.DetailsHelper; 624105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chenimport com.android.gallery3d.ui.DetailsHelper.CloseListener; 634105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chenimport com.android.gallery3d.ui.DetailsHelper.DetailsSource; 64f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.ui.GLCanvas; 65616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Linimport com.android.gallery3d.ui.GLRoot; 66616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Linimport com.android.gallery3d.ui.GLRoot.OnGLIdleListener; 67f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.ui.GLView; 68f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.ui.ImportCompleteListener; 69f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.ui.MenuExecutor; 70616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Linimport com.android.gallery3d.ui.PhotoFallbackEffect; 7121a412c93c9b0401b039f4eb86d4950752e5bb84Owen Linimport com.android.gallery3d.ui.PhotoView; 7251bc561e85053abfd7fda695e3cd20710acca85cBobby Georgescuimport com.android.gallery3d.ui.PreparePageFadeoutTexture; 73f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescuimport com.android.gallery3d.ui.RawTexture; 74f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.ui.SelectionManager; 75f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.ui.SynchronizedHandler; 76f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.util.GalleryUtils; 77c6781c0c0d8d193863ca09455a5bda3d542db493Bobby Georgescuimport com.android.gallery3d.util.LightCycleHelper; 78f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 79bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Changpublic class PhotoPage extends ActivityState implements 80f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu PhotoView.Listener, OrientationManager.Listener, AppBridge.Server, 81f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu PhotoPageBottomControls.Delegate { 82f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private static final String TAG = "PhotoPage"; 83f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 84f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private static final int MSG_HIDE_BARS = 1; 85bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang private static final int MSG_LOCK_ORIENTATION = 2; 86bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang private static final int MSG_UNLOCK_ORIENTATION = 3; 87bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang private static final int MSG_ON_FULL_SCREEN_CHANGED = 4; 8861f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang private static final int MSG_UPDATE_ACTION_BAR = 5; 89bd7c016d728853d38f98a3c6077b7bd9b08858b9Yuli Huang private static final int MSG_UNFREEZE_GLROOT = 6; 90e6251df06f0b3c8f556043f8b725b4b19be7474dChih-Chung Chang private static final int MSG_WANT_BARS = 7; 917eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu private static final int MSG_REFRESH_GRID_BUTTON = 8; 92f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu private static final int MSG_REFRESH_BOTTOM_CONTROLS = 9; 93b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu private static final int MSG_ON_CAMERA_CENTER = 10; 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"; 114f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 1157eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu public static final String KEY_ALBUMPAGE_TRANSITION = "albumpage-transition"; 1167eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu public static final int MSG_ALBUMPAGE_NONE = 0; 1177eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu public static final int MSG_ALBUMPAGE_STARTED = 1; 1187eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu public static final int MSG_ALBUMPAGE_RESUMED = 2; 1197eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu public static final int MSG_ALBUMPAGE_PICKED = 4; 1207eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu 121a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu public static final String ACTION_NEXTGEN_EDIT = "action_nextgen_edit"; 122a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu 123f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private GalleryApp mApplication; 124f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private SelectionManager mSelectionManager; 125f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 126f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private PhotoView mPhotoView; 127f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private PhotoPage.Model mModel; 1284105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen private DetailsHelper mDetailsHelper; 129f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private boolean mShowDetails; 130f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 131f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin // mMediaSet could be null if there is no KEY_MEDIA_SET_PATH supplied. 132f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin // E.g., viewing a photo in gmail attachment 1336b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang private FilterDeleteSet mMediaSet; 134f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 135a0ce682e40c39ce046c48d8a7f989fff01bb9f2cWu-cheng Li // The mediaset used by camera launched from secure lock screen. 136a0ce682e40c39ce046c48d8a7f989fff01bb9f2cWu-cheng Li private SecureAlbum mSecureAlbum; 137a0ce682e40c39ce046c48d8a7f989fff01bb9f2cWu-cheng Li 138f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private int mCurrentIndex = 0; 139f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private Handler mHandler; 140113bfc77c4468411da9ae1290553c3be89f8df9aOwen Lin private boolean mShowBars = true; 14161f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang private volatile boolean mActionBarAllowed = true; 1428cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen private GalleryActionBar mActionBar; 143f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private boolean mIsMenuVisible; 1448fe22ecb8e744a09a2e0d867f876ecbf74c82298John Reck private boolean mHaveImageEditor; 145f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu private PhotoPageBottomControls mBottomControls; 146f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private MediaItem mCurrentPhoto = null; 147f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private MenuExecutor mMenuExecutor; 148f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private boolean mIsActive; 14984c220f10a643927c8a2126de8a755d8d7f7ec9eRay Chen private String mSetPathString; 150b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang // This is the original mSetPathString before adding the camera preview item. 151b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang private String mOriginalSetPathString; 152bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang private AppBridge mAppBridge; 1533b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang private SnailItem mScreenNailItem; 1543b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang private SnailAlbum mScreenNailSet; 155bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang private OrientationManager mOrientationManager; 15671cd89a38752bc22ae0ec2df965e4280b776623cChih-Chung Chang private boolean mHasActivityResult; 15754fe6202b6f7d233e7645c121321fe0f3d20fc8bYuli Huang private boolean mTreatBackAsUp; 1587eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu private boolean mStartInFilmstrip; 1597eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu private boolean mStartedFromAlbumPage; 16015b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang 161b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu private long mCameraSwitchCutoff = 0; 162b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu private boolean mSkipUpdateCurrentPhoto = false; 163b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu private static final long CAMERA_SWITCH_CUTOFF_THRESHOLD_MS = 300; 164b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu 165f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu private RawTexture mFadeOutTexture; 166f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu private Rect mOpenAnimationRect; 1677eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu public static final int ANIM_TIME_OPENING = 300; 168f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu 1696b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang // The item that is deleted (but it can still be undeleted before commiting) 1706b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang private Path mDeletePath; 1716b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang private boolean mDeleteIsFocus; // whether the deleted item was in focus 1726b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang 173ddf0225a5192a589fc578945f56440b09bf74d12John Reck private Uri[] mNfcPushUris = new Uri[1]; 17433ef03776b7734717b16f6fc861b831fb1b1dfacMartijn Coenen 1752bb717f1ea38e2ce33dd102a23afe6bfacb5675cOwen Lin private final MyMenuVisibilityListener mMenuVisibilityListener = 1762bb717f1ea38e2ce33dd102a23afe6bfacb5675cOwen Lin new MyMenuVisibilityListener(); 1772bb717f1ea38e2ce33dd102a23afe6bfacb5675cOwen Lin 178f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public static interface Model extends PhotoView.Model { 179f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void resume(); 180f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void pause(); 181f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public boolean isEmpty(); 182f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void setCurrentPhoto(Path path, int indexHint); 183f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 184f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 185f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private class MyMenuVisibilityListener implements OnMenuVisibilityListener { 18606c6401eededc2ec842ba4994a838c2ded0a666cPin Ting @Override 187f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void onMenuVisibilityChanged(boolean isVisible) { 188f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mIsMenuVisible = isVisible; 189f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin refreshHidingMessage(); 190f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 191f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 192f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 193f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu private static class BackgroundFadeOut extends FloatAnimation { 194f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu public BackgroundFadeOut() { 195f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu super(1f, 0f, ANIM_TIME_OPENING); 196f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu setInterpolator(new AccelerateInterpolator(2f)); 197f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu } 198f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu } 199f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu 200f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu private final FloatAnimation mBackgroundFade = new BackgroundFadeOut(); 201f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 202915c2c5b2c367df71599370613af0924bd7c4887Bobby Georgescu @Override 203915c2c5b2c367df71599370613af0924bd7c4887Bobby Georgescu protected int getBackgroundColorId() { 204915c2c5b2c367df71599370613af0924bd7c4887Bobby Georgescu return R.color.photo_background; 205915c2c5b2c367df71599370613af0924bd7c4887Bobby Georgescu } 206915c2c5b2c367df71599370613af0924bd7c4887Bobby Georgescu 207f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu private final GLView mRootPane = new GLView() { 208f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 209f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin protected void renderBackground(GLCanvas view) { 21083be4e0c9b8e3372eff8f9b1a396afd961b72921Angus Kong if (mFadeOutTexture != null) { 21183be4e0c9b8e3372eff8f9b1a396afd961b72921Angus Kong if (mBackgroundFade.calculate(AnimationTime.get())) invalidate(); 21283be4e0c9b8e3372eff8f9b1a396afd961b72921Angus Kong if (!mBackgroundFade.isActive()) { 213f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu mFadeOutTexture = null; 214f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu mOpenAnimationRect = null; 215f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu BitmapScreenNail.enableDrawPlaceholder(); 216f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu } else { 217f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu float fadeAlpha = mBackgroundFade.get(); 21883be4e0c9b8e3372eff8f9b1a396afd961b72921Angus Kong if (fadeAlpha < 1f) { 219915c2c5b2c367df71599370613af0924bd7c4887Bobby Georgescu view.clearBuffer(getBackgroundColor()); 220f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu view.setAlpha(fadeAlpha); 221f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu } 222f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu mFadeOutTexture.draw(view, 0, 0); 22302ef48574ef7099ebaa0386bd6fd676bd2fd5489Bobby Georgescu view.setAlpha(1f - fadeAlpha); 224f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu return; 225f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu } 226f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu } 227915c2c5b2c367df71599370613af0924bd7c4887Bobby Georgescu view.clearBuffer(getBackgroundColor()); 228f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 229f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 230f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 231f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin protected void onLayout( 232f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin boolean changed, int left, int top, int right, int bottom) { 233f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mPhotoView.layout(0, 0, right - left, bottom - top); 234f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (mShowDetails) { 2358cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen mDetailsHelper.layout(left, mActionBar.getHeight(), right, bottom); 236f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 237f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 238f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin }; 239f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 240f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 241f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void onCreate(Bundle data, Bundle restoreState) { 24245c56f2d34c71d0bc9b84ebeef6d1314738d0fc0Bobby Georgescu super.onCreate(data, restoreState); 2438cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen mActionBar = mActivity.getGalleryActionBar(); 244f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mSelectionManager = new SelectionManager(mActivity, false); 245f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mMenuExecutor = new MenuExecutor(mActivity, mSelectionManager); 246f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 247f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mPhotoView = new PhotoView(mActivity); 248bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang mPhotoView.setListener(this); 249f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mRootPane.addComponent(mPhotoView); 25083be4e0c9b8e3372eff8f9b1a396afd961b72921Angus Kong mApplication = (GalleryApp) ((Activity) mActivity).getApplication(); 251bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang mOrientationManager = mActivity.getOrientationManager(); 252bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang mOrientationManager.addListener(this); 2532ef46ed28b28b355d7f3f1432c7b1196b832a859Chih-Chung Chang mActivity.getGLRoot().setOrientationSource(mOrientationManager); 254f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 255d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu mHandler = new SynchronizedHandler(mActivity.getGLRoot()) { 256d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu @Override 257d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu public void handleMessage(Message message) { 258d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu switch (message.what) { 259d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu case MSG_HIDE_BARS: { 260d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu hideBars(); 261d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu break; 262d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu } 263d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu case MSG_REFRESH_GRID_BUTTON: { 264d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu setGridButtonVisibility(mPhotoView.getFilmMode()); 265d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu break; 266d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu } 267f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu case MSG_REFRESH_BOTTOM_CONTROLS: { 268f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu if (mBottomControls != null) mBottomControls.refresh(); 269d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu break; 270d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu } 271d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu case MSG_LOCK_ORIENTATION: { 272d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu mOrientationManager.lockOrientation(); 273d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu break; 274d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu } 275d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu case MSG_UNLOCK_ORIENTATION: { 276d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu mOrientationManager.unlockOrientation(); 277d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu break; 278d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu } 279d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu case MSG_ON_FULL_SCREEN_CHANGED: { 280d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu mAppBridge.onFullScreenChanged(message.arg1 == 1); 281d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu break; 282d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu } 283d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu case MSG_UPDATE_ACTION_BAR: { 284d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu updateBars(); 285d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu break; 286d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu } 287d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu case MSG_WANT_BARS: { 288d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu wantBars(); 289d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu break; 290d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu } 291d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu case MSG_UNFREEZE_GLROOT: { 292d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu mActivity.getGLRoot().unfreeze(); 293d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu break; 294d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu } 295b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu case MSG_ON_CAMERA_CENTER: { 296b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu mSkipUpdateCurrentPhoto = false; 297b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu boolean updateNeeded = false; 298b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu if (!mPhotoView.getFilmMode()) { 299b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu lockOrientation(); 300b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu updateNeeded = true; 301b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu } else if (SystemClock.uptimeMillis() < mCameraSwitchCutoff && 302b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu mMediaSet.getMediaItemCount() > 1) { 303b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu mPhotoView.switchToImage(1); 304b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu } else { 305b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu mPhotoView.setFilmMode(false); 306b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu updateNeeded = true; 307b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu } 308b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu 309b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu if (updateNeeded) { 310b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu updateBars(); 311b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu updateCurrentPhoto(mModel.getMediaItem(0)); 312b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu } 313b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu break; 314b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu } 315d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu default: throw new AssertionError(message.what); 316d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu } 317d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu } 318d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu }; 319d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu 32084c220f10a643927c8a2126de8a755d8d7f7ec9eRay Chen mSetPathString = data.getString(KEY_MEDIA_SET_PATH); 321b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang mOriginalSetPathString = mSetPathString; 322ddf0225a5192a589fc578945f56440b09bf74d12John Reck setupNfcBeamPush(); 3237eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu String itemPathString = data.getString(KEY_MEDIA_ITEM_PATH); 3247eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu Path itemPath = itemPathString != null ? 3257eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu Path.fromString(data.getString(KEY_MEDIA_ITEM_PATH)) : 3267eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu null; 32754fe6202b6f7d233e7645c121321fe0f3d20fc8bYuli Huang mTreatBackAsUp = data.getBoolean(KEY_TREAT_BACK_AS_UP, false); 3287eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu mStartInFilmstrip = 3297eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu data.getBoolean(KEY_START_IN_FILMSTRIP, false); 3307eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu mStartedFromAlbumPage = 3317eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu data.getInt(KEY_ALBUMPAGE_TRANSITION, 3327eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu MSG_ALBUMPAGE_NONE) == MSG_ALBUMPAGE_STARTED; 3337eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu setGridButtonVisibility(!mStartedFromAlbumPage); 33484c220f10a643927c8a2126de8a755d8d7f7ec9eRay Chen if (mSetPathString != null) { 335bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang mAppBridge = (AppBridge) data.getParcelable(KEY_APP_BRIDGE); 336bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang if (mAppBridge != null) { 3377eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu mShowBars = false; 3387eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu 339253c5aec7692afdd7880fbd169d4b44d5679cbc0Chih-Chung Chang mAppBridge.setServer(this); 340bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang mOrientationManager.lockOrientation(); 341b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang 342bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang // Get the ScreenNail from AppBridge and register it. 3433b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang int id = SnailSource.newId(); 344b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang Path screenNailSetPath = SnailSource.getSetPath(id); 345bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang Path screenNailItemPath = SnailSource.getItemPath(id); 3463b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang mScreenNailSet = (SnailAlbum) mActivity.getDataManager() 3473b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang .getMediaObject(screenNailSetPath); 3483b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang mScreenNailItem = (SnailItem) mActivity.getDataManager() 349bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang .getMediaObject(screenNailItemPath); 3503b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang mScreenNailItem.setScreenNail(mAppBridge.attachScreenNail()); 351b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang 352a0ce682e40c39ce046c48d8a7f989fff01bb9f2cWu-cheng Li // Check if the path is a secure album. 353a0ce682e40c39ce046c48d8a7f989fff01bb9f2cWu-cheng Li if (SecureSource.isSecurePath(mSetPathString)) { 354a0ce682e40c39ce046c48d8a7f989fff01bb9f2cWu-cheng Li mSecureAlbum = (SecureAlbum) mActivity.getDataManager() 355a0ce682e40c39ce046c48d8a7f989fff01bb9f2cWu-cheng Li .getMediaSet(mSetPathString); 35623e595f0c656ebaeb63f78e3018b5830628c5afeWu-cheng Li } 35723e595f0c656ebaeb63f78e3018b5830628c5afeWu-cheng Li if (data.getBoolean(KEY_SHOW_WHEN_LOCKED, false)) { 358efd480e85dc5bd0d2ca0ac82d03e141212388830Wu-cheng Li // Set the flag to be on top of the lock screen. 359efd480e85dc5bd0d2ca0ac82d03e141212388830Wu-cheng Li mFlags |= FLAG_SHOW_WHEN_LOCKED; 360a0ce682e40c39ce046c48d8a7f989fff01bb9f2cWu-cheng Li } 361a0ce682e40c39ce046c48d8a7f989fff01bb9f2cWu-cheng Li 362c7e3c76d6965f520a9651d309052c5f01726cd58Bobby Georgescu // Don't display "empty album" action item for capture intents 363c7e3c76d6965f520a9651d309052c5f01726cd58Bobby Georgescu if(!mSetPathString.equals("/local/all/0")) { 364c7e3c76d6965f520a9651d309052c5f01726cd58Bobby Georgescu mSetPathString = "/filter/empty/{"+mSetPathString+"}"; 365c7e3c76d6965f520a9651d309052c5f01726cd58Bobby Georgescu } 366c7e3c76d6965f520a9651d309052c5f01726cd58Bobby Georgescu 3673b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang // Combine the original MediaSet with the one for ScreenNail 3683b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang // from AppBridge. 369b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang mSetPathString = "/combo/item/{" + screenNailSetPath + 370b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang "," + mSetPathString + "}"; 371b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang 372b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang // Start from the screen nail. 373bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang itemPath = screenNailItemPath; 374b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang } 375b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang 3766118af9ddad8acc050133154f8f60c842c7f9bfaChih-Chung Chang MediaSet originalSet = mActivity.getDataManager() 3776118af9ddad8acc050133154f8f60c842c7f9bfaChih-Chung Chang .getMediaSet(mSetPathString); 3786118af9ddad8acc050133154f8f60c842c7f9bfaChih-Chung Chang mSelectionManager.setSourceMediaSet(originalSet); 3796b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang mSetPathString = "/filter/delete/{" + mSetPathString + "}"; 3806b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang mMediaSet = (FilterDeleteSet) mActivity.getDataManager() 3816b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang .getMediaSet(mSetPathString); 382f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mCurrentIndex = data.getInt(KEY_INDEX_HINT, 0); 383f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (mMediaSet == null) { 38484c220f10a643927c8a2126de8a755d8d7f7ec9eRay Chen Log.w(TAG, "failed to restore " + mSetPathString); 385f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 3867eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu if (itemPath == null) { 3873eb2e643a40d1be77998373343cdf8b14764f58cBobby Georgescu int mediaItemCount = mMediaSet.getMediaItemCount(); 3883eb2e643a40d1be77998373343cdf8b14764f58cBobby Georgescu if (mediaItemCount > 0) { 3893eb2e643a40d1be77998373343cdf8b14764f58cBobby Georgescu if (mCurrentIndex >= mediaItemCount) mCurrentIndex = 0; 390d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu itemPath = mMediaSet.getMediaItem(mCurrentIndex, 1) 391d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu .get(0).getPath(); 392d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu } else { 3933eb2e643a40d1be77998373343cdf8b14764f58cBobby Georgescu // Bail out, PhotoPage can't load on an empty album 394d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu return; 395d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu } 3967eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu } 397f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin PhotoDataAdapter pda = new PhotoDataAdapter( 398bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang mActivity, mPhotoView, mMediaSet, itemPath, mCurrentIndex, 39943a80fd806247cb50e81bacda3ad21d210e9ae88Angus Kong mAppBridge == null ? -1 : 0, 400dbb6acc204ba6f095eb0e49e1298e9ceda2c3096Wu-cheng Li mAppBridge == null ? false : mAppBridge.isPanorama(), 401dbb6acc204ba6f095eb0e49e1298e9ceda2c3096Wu-cheng Li mAppBridge == null ? false : mAppBridge.isStaticCamera()); 402f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mModel = pda; 403f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mPhotoView.setModel(mModel); 404f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 405f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin pda.setDataListener(new PhotoDataAdapter.DataListener() { 406f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 407113bfc77c4468411da9ae1290553c3be89f8df9aOwen Lin @Override 408f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void onPhotoChanged(int index, Path item) { 40900ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu int oldIndex = mCurrentIndex; 410f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mCurrentIndex = index; 411b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu 41200ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu if (mAppBridge != null) { 413b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu mPhotoView.setWantCameraCenterCallbacks(true); 414b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu if (mCurrentIndex > 0) { 415b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu mHandler.removeMessages(MSG_ON_CAMERA_CENTER); 416b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu mSkipUpdateCurrentPhoto = false; 417b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu } 418b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu 41900ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu if (oldIndex == 0 && mCurrentIndex > 0 42000ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu && !mPhotoView.getFilmMode()) { 42100ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu mPhotoView.setFilmMode(true); 422b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu } else if (oldIndex == 2 && mCurrentIndex == 1) { 423b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu mCameraSwitchCutoff = SystemClock.uptimeMillis() + 424b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu CAMERA_SWITCH_CUTOFF_THRESHOLD_MS; 425b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu mPhotoView.stopScrolling(); 426b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu } else if (oldIndex == 1 && mCurrentIndex == 0) { 427b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu mSkipUpdateCurrentPhoto = true; 42800ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu } 42900ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu } 430b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu if (!mSkipUpdateCurrentPhoto) { 431b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu if (item != null) { 432b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu MediaItem photo = mModel.getMediaItem(0); 433b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu if (photo != null) updateCurrentPhoto(photo); 434b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu } 435b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu updateBars(); 436b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu } 43700ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu // Reset the timeout for the bars after a swipe 43800ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu refreshHidingMessage(); 439f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 440f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 441f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 442f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void onLoadingFinished() { 443f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (!mModel.isEmpty()) { 444616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin MediaItem photo = mModel.getMediaItem(0); 445f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (photo != null) updateCurrentPhoto(photo); 446f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } else if (mIsActive) { 447c370476adcf29f311ceec70a119792a0168781e9Chih-Chung Chang // We only want to finish the PhotoPage if there is no 448c370476adcf29f311ceec70a119792a0168781e9Chih-Chung Chang // deletion that the user can undo. 449c370476adcf29f311ceec70a119792a0168781e9Chih-Chung Chang if (mMediaSet.getNumberOfDeletions() == 0) { 450c370476adcf29f311ceec70a119792a0168781e9Chih-Chung Chang mActivity.getStateManager().finishState( 451c370476adcf29f311ceec70a119792a0168781e9Chih-Chung Chang PhotoPage.this); 452c370476adcf29f311ceec70a119792a0168781e9Chih-Chung Chang } 453f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 454f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 455f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 456f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 457f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void onLoadingStarted() { 458f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 459f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin }); 460f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } else { 461f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin // Get default media set by the URI 462f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin MediaItem mediaItem = (MediaItem) 463f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mActivity.getDataManager().getMediaObject(itemPath); 464f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mModel = new SinglePhotoDataAdapter(mActivity, mPhotoView, mediaItem); 465f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mPhotoView.setModel(mModel); 466f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin updateCurrentPhoto(mediaItem); 467f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 468cf46a3abc26aac7cdb6b6993aeade053304b71d9Ray Chen 469b265ebb01cc046b74329eeb28dbecb24e0f953d2Bobby Georgescu mPhotoView.setFilmMode(mStartInFilmstrip && mMediaSet.getMediaItemCount() > 1); 470f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu if (mSecureAlbum == null) { 471f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu RelativeLayout galleryRoot = (RelativeLayout) ((Activity) mActivity) 472f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu .findViewById(mAppBridge != null ? R.id.content : R.id.gallery_root); 473f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu if (galleryRoot != null) { 474f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu mBottomControls = new PhotoPageBottomControls(this, mActivity, galleryRoot); 475f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu } 476f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu } 477a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu } 478a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu 479b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu public void onCameraCenter() { 480b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu mPhotoView.setWantCameraCenterCallbacks(false); 481b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu mHandler.sendEmptyMessage(MSG_ON_CAMERA_CENTER); 482b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu } 483b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu 484f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu public boolean canDisplayBottomControls() { 485f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu return mShowBars && !mPhotoView.getFilmMode(); 486a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu } 487a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu 488f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu public boolean canDisplayBottomControl(int control) { 489f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu if (mCurrentPhoto == null) return false; 490f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu switch(control) { 491f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu case R.id.photopage_bottom_control_edit: 492f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu return mCurrentPhoto.getMediaType() == MediaObject.MEDIA_TYPE_IMAGE; 493f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu case R.id.photopage_bottom_control_panorama: 494f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu return (mCurrentPhoto.getSupportedOperations() 4954f32d514ee7474d867d04bf3934f9e11e9e92783Mangesh Ghiware & MediaItem.SUPPORT_PANORAMA) != 0; 496f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu default: 497f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu return false; 498f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu } 499a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu } 500a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu 501f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu public void onBottomControlClicked(int control) { 502f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu switch(control) { 503f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu case R.id.photopage_bottom_control_edit: 504f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu launchPhotoEditor(); 505f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu return; 506f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu case R.id.photopage_bottom_control_panorama: 507f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu LightCycleHelper.viewPanorama(mActivity, mCurrentPhoto.getContentUri()); 508f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu return; 509f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu default: 510f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu return; 511a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu } 512f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 513f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 5146772173d2a49b87a1d209f42fe52b5f830596f99Chih-Chung Chang @TargetApi(ApiHelper.VERSION_CODES.JELLY_BEAN) 515ddf0225a5192a589fc578945f56440b09bf74d12John Reck private void setupNfcBeamPush() { 516ddf0225a5192a589fc578945f56440b09bf74d12John Reck if (!ApiHelper.HAS_SET_BEAM_PUSH_URIS) return; 517ddf0225a5192a589fc578945f56440b09bf74d12John Reck 518ddf0225a5192a589fc578945f56440b09bf74d12John Reck NfcAdapter adapter = NfcAdapter.getDefaultAdapter(mActivity); 519ddf0225a5192a589fc578945f56440b09bf74d12John Reck if (adapter != null) { 520ddf0225a5192a589fc578945f56440b09bf74d12John Reck adapter.setBeamPushUrisCallback(new CreateBeamUrisCallback() { 521ddf0225a5192a589fc578945f56440b09bf74d12John Reck @Override 522ddf0225a5192a589fc578945f56440b09bf74d12John Reck public Uri[] createBeamUris(NfcEvent event) { 523ddf0225a5192a589fc578945f56440b09bf74d12John Reck return mNfcPushUris; 524ddf0225a5192a589fc578945f56440b09bf74d12John Reck } 525ddf0225a5192a589fc578945f56440b09bf74d12John Reck }, mActivity); 526fc86994f86f8cfb31e151c9e730dc1e9dc7b3349Yuli Huang } 527fc86994f86f8cfb31e151c9e730dc1e9dc7b3349Yuli Huang } 528fc86994f86f8cfb31e151c9e730dc1e9dc7b3349Yuli Huang 529ddf0225a5192a589fc578945f56440b09bf74d12John Reck private void setNfcBeamPushUri(Uri uri) { 530ddf0225a5192a589fc578945f56440b09bf74d12John Reck mNfcPushUris[0] = uri; 531ddf0225a5192a589fc578945f56440b09bf74d12John Reck } 532ddf0225a5192a589fc578945f56440b09bf74d12John Reck 533fb5571987f2555b04731b6f3e1c479efc16d542aWu-cheng Li private Intent createShareIntent(Path path) { 534fb5571987f2555b04731b6f3e1c479efc16d542aWu-cheng Li DataManager manager = mActivity.getDataManager(); 535fb5571987f2555b04731b6f3e1c479efc16d542aWu-cheng Li int type = manager.getMediaType(path); 536fb5571987f2555b04731b6f3e1c479efc16d542aWu-cheng Li Intent intent = new Intent(Intent.ACTION_SEND); 5375172dee697c05235ddf932827d75e6fa0b81d382Mangesh Ghiware intent.setType(MenuExecutor.getMimeType(type)); 5382bb717f1ea38e2ce33dd102a23afe6bfacb5675cOwen Lin Uri uri = manager.getContentUri(path); 539fb5571987f2555b04731b6f3e1c479efc16d542aWu-cheng Li intent.putExtra(Intent.EXTRA_STREAM, uri); 540fb5571987f2555b04731b6f3e1c479efc16d542aWu-cheng Li return intent; 5415172dee697c05235ddf932827d75e6fa0b81d382Mangesh Ghiware } 542fb5571987f2555b04731b6f3e1c479efc16d542aWu-cheng Li 5435172dee697c05235ddf932827d75e6fa0b81d382Mangesh Ghiware private Intent createSharePanoramaIntent(Path path) { 5445172dee697c05235ddf932827d75e6fa0b81d382Mangesh Ghiware DataManager manager = mActivity.getDataManager(); 5455172dee697c05235ddf932827d75e6fa0b81d382Mangesh Ghiware int supported = manager.getSupportedOperations(path); 5465172dee697c05235ddf932827d75e6fa0b81d382Mangesh Ghiware if ((supported & MediaObject.SUPPORT_PANORAMA) == 0) { 5475172dee697c05235ddf932827d75e6fa0b81d382Mangesh Ghiware return null; 5485172dee697c05235ddf932827d75e6fa0b81d382Mangesh Ghiware } 5495172dee697c05235ddf932827d75e6fa0b81d382Mangesh Ghiware Intent intent = new Intent(Intent.ACTION_SEND); 5505172dee697c05235ddf932827d75e6fa0b81d382Mangesh Ghiware intent.setType(GalleryUtils.MIME_TYPE_PANORAMA); 5515172dee697c05235ddf932827d75e6fa0b81d382Mangesh Ghiware Uri uri = manager.getContentUri(path); 5525172dee697c05235ddf932827d75e6fa0b81d382Mangesh Ghiware intent.putExtra(Intent.EXTRA_STREAM, uri); 5535172dee697c05235ddf932827d75e6fa0b81d382Mangesh Ghiware return intent; 554fb5571987f2555b04731b6f3e1c479efc16d542aWu-cheng Li } 555fb5571987f2555b04731b6f3e1c479efc16d542aWu-cheng Li 556a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu private void launchPhotoEditor() { 557a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu MediaItem current = mModel.getMediaItem(0); 558a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu if (current == null) return; 559a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu 560a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu Intent intent = new Intent(ACTION_NEXTGEN_EDIT); 561a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu intent.setData(mActivity.getDataManager().getContentUri(current.getPath())).setFlags( 562a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu Intent.FLAG_GRANT_READ_URI_PERMISSION); 563a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu if (mActivity.getPackageManager() 564a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu .queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY).size() == 0) { 565a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu intent.setAction(Intent.ACTION_EDIT); 566a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu } 567a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu ((Activity) mActivity).startActivityForResult(Intent.createChooser(intent, null), 568a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu REQUEST_EDIT); 569a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu } 570a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu 5712bb717f1ea38e2ce33dd102a23afe6bfacb5675cOwen Lin private void updateShareURI(Path path) { 57224081fe26ca25448ddb9c8f9cc7f406d26344decOwen Lin DataManager manager = mActivity.getDataManager(); 5735172dee697c05235ddf932827d75e6fa0b81d382Mangesh Ghiware mActionBar.setShareIntents( 5745172dee697c05235ddf932827d75e6fa0b81d382Mangesh Ghiware createSharePanoramaIntent(path), 5755172dee697c05235ddf932827d75e6fa0b81d382Mangesh Ghiware createShareIntent(path)); 57624081fe26ca25448ddb9c8f9cc7f406d26344decOwen Lin Uri uri = manager.getContentUri(path); 577ddf0225a5192a589fc578945f56440b09bf74d12John Reck setNfcBeamPushUri(uri); 578cf46a3abc26aac7cdb6b6993aeade053304b71d9Ray Chen } 579cf46a3abc26aac7cdb6b6993aeade053304b71d9Ray Chen 580f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private void updateCurrentPhoto(MediaItem photo) { 581f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (mCurrentPhoto == photo) return; 582f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mCurrentPhoto = photo; 583f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (mCurrentPhoto == null) return; 584c7e3c76d6965f520a9651d309052c5f01726cd58Bobby Georgescu 585c7e3c76d6965f520a9651d309052c5f01726cd58Bobby Georgescu // If by swiping or deletion the user ends up on an action item 586c7e3c76d6965f520a9651d309052c5f01726cd58Bobby Georgescu // and zoomed in, zoom out so that the context of the action is 587c7e3c76d6965f520a9651d309052c5f01726cd58Bobby Georgescu // more clear 588c7e3c76d6965f520a9651d309052c5f01726cd58Bobby Georgescu if ((photo.getSupportedOperations() & MediaObject.SUPPORT_ACTION) != 0 589c7e3c76d6965f520a9651d309052c5f01726cd58Bobby Georgescu && !mPhotoView.getFilmMode()) { 590c7e3c76d6965f520a9651d309052c5f01726cd58Bobby Georgescu mPhotoView.setFilmMode(true); 591c7e3c76d6965f520a9651d309052c5f01726cd58Bobby Georgescu } 592c7e3c76d6965f520a9651d309052c5f01726cd58Bobby Georgescu 593f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin updateMenuOperations(); 594ed46d77c16cd80357f4a0feada2435dfba8104a6Yuli Huang updateTitle(); 595f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu if (mBottomControls != null) mBottomControls.refresh(); 596f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (mShowDetails) { 597995c4566bed7df1aa48ba7e1351f964efa73880bMichael Kolb mDetailsHelper.reloadDetails(); 598f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 599898a2f4540635528a0916b0a6b0a177869854ae9Wu-cheng Li if ((mSecureAlbum == null) 600898a2f4540635528a0916b0a6b0a177869854ae9Wu-cheng Li && (photo.getSupportedOperations() & MediaItem.SUPPORT_SHARE) != 0) { 60115b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang updateShareURI(photo.getPath()); 60215b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang } 603f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 604f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 605ed46d77c16cd80357f4a0feada2435dfba8104a6Yuli Huang private void updateTitle() { 606ed46d77c16cd80357f4a0feada2435dfba8104a6Yuli Huang if (mCurrentPhoto == null) return; 607ed46d77c16cd80357f4a0feada2435dfba8104a6Yuli Huang boolean showTitle = mActivity.getAndroidContext().getResources().getBoolean( 608ed46d77c16cd80357f4a0feada2435dfba8104a6Yuli Huang R.bool.show_action_bar_title); 6092bb717f1ea38e2ce33dd102a23afe6bfacb5675cOwen Lin if (showTitle && mCurrentPhoto.getName() != null) { 610ed46d77c16cd80357f4a0feada2435dfba8104a6Yuli Huang mActionBar.setTitle(mCurrentPhoto.getName()); 6112bb717f1ea38e2ce33dd102a23afe6bfacb5675cOwen Lin } else { 612ed46d77c16cd80357f4a0feada2435dfba8104a6Yuli Huang mActionBar.setTitle(""); 6132bb717f1ea38e2ce33dd102a23afe6bfacb5675cOwen Lin } 614ed46d77c16cd80357f4a0feada2435dfba8104a6Yuli Huang } 615ed46d77c16cd80357f4a0feada2435dfba8104a6Yuli Huang 616f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private void updateMenuOperations() { 61724081fe26ca25448ddb9c8f9cc7f406d26344decOwen Lin Menu menu = mActionBar.getMenu(); 61824081fe26ca25448ddb9c8f9cc7f406d26344decOwen Lin 61924081fe26ca25448ddb9c8f9cc7f406d26344decOwen Lin // it could be null if onCreateActionBar has not been called yet 62024081fe26ca25448ddb9c8f9cc7f406d26344decOwen Lin if (menu == null) return; 62124081fe26ca25448ddb9c8f9cc7f406d26344decOwen Lin 6227eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu setGridButtonVisibility(mPhotoView.getFilmMode()); 6237eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu 62424081fe26ca25448ddb9c8f9cc7f406d26344decOwen Lin MenuItem item = menu.findItem(R.id.action_slideshow); 62553fe9f72433f2fdae30e1708c5933390202cbcf5John Reck if (item != null) { 62653fe9f72433f2fdae30e1708c5933390202cbcf5John Reck item.setVisible((mSecureAlbum == null) && canDoSlideShow()); 62753fe9f72433f2fdae30e1708c5933390202cbcf5John Reck } 6282066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang if (mCurrentPhoto == null) return; 62924081fe26ca25448ddb9c8f9cc7f406d26344decOwen Lin 630f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin int supportedOperations = mCurrentPhoto.getSupportedOperations(); 631898a2f4540635528a0916b0a6b0a177869854ae9Wu-cheng Li if (mSecureAlbum != null) { 63224081fe26ca25448ddb9c8f9cc7f406d26344decOwen Lin supportedOperations &= MediaObject.SUPPORT_DELETE; 6338fe22ecb8e744a09a2e0d867f876ecbf74c82298John Reck } else if (!mHaveImageEditor) { 634f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin supportedOperations &= ~MediaObject.SUPPORT_EDIT; 635f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 63624081fe26ca25448ddb9c8f9cc7f406d26344decOwen Lin MenuExecutor.updateMenuOperation(menu, supportedOperations); 637f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 638f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 6392066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang private boolean canDoSlideShow() { 6402066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang if (mMediaSet == null || mCurrentPhoto == null) { 6412066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang return false; 6422066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang } 6432066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang if (mCurrentPhoto.getMediaType() != MediaObject.MEDIA_TYPE_IMAGE) { 6442066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang return false; 6452066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang } 6466b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang if (MtpSource.isMtpPath(mOriginalSetPathString)) { 6472066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang return false; 6482066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang } 6492066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang return true; 6502066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang } 6512066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang 65261f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang ////////////////////////////////////////////////////////////////////////// 65361f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang // Action Bar show/hide management 65461f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang ////////////////////////////////////////////////////////////////////////// 65561f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang 656f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private void showBars() { 657f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (mShowBars) return; 658f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mShowBars = true; 659e6251df06f0b3c8f556043f8b725b4b19be7474dChih-Chung Chang mOrientationManager.unlockOrientation(); 660f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mActionBar.show(); 6610b2486cff0c1b951c54325596256b986307f7f3aChih-Chung Chang mActivity.getGLRoot().setLightsOutMode(false); 66261f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang refreshHidingMessage(); 663f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu if (mBottomControls != null) mBottomControls.refresh(); 664f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 665f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 666f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private void hideBars() { 667f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (!mShowBars) return; 668f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mShowBars = false; 669f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mActionBar.hide(); 6700b2486cff0c1b951c54325596256b986307f7f3aChih-Chung Chang mActivity.getGLRoot().setLightsOutMode(true); 67161f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang mHandler.removeMessages(MSG_HIDE_BARS); 672f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu if (mBottomControls != null) mBottomControls.refresh(); 673f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 674f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 675f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private void refreshHidingMessage() { 676f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mHandler.removeMessages(MSG_HIDE_BARS); 6777eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu if (!mIsMenuVisible && !mPhotoView.getFilmMode()) { 678f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mHandler.sendEmptyMessageDelayed(MSG_HIDE_BARS, HIDE_BARS_TIMEOUT); 679f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 680f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 681f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 682aeb3062e84ed28f0e25a73f511f287ae0a3e4294Chih-Chung Chang private boolean canShowBars() { 683aeb3062e84ed28f0e25a73f511f287ae0a3e4294Chih-Chung Chang // No bars if we are showing camera preview. 68456bdcb7272f222fde5e4c6fc133cb490b31c7667Bobby Georgescu if (mAppBridge != null && mCurrentIndex == 0 68556bdcb7272f222fde5e4c6fc133cb490b31c7667Bobby Georgescu && !mPhotoView.getFilmMode()) return false; 68656bdcb7272f222fde5e4c6fc133cb490b31c7667Bobby Georgescu 687aeb3062e84ed28f0e25a73f511f287ae0a3e4294Chih-Chung Chang // No bars if it's not allowed. 688aeb3062e84ed28f0e25a73f511f287ae0a3e4294Chih-Chung Chang if (!mActionBarAllowed) return false; 689aeb3062e84ed28f0e25a73f511f287ae0a3e4294Chih-Chung Chang 690aeb3062e84ed28f0e25a73f511f287ae0a3e4294Chih-Chung Chang return true; 691aeb3062e84ed28f0e25a73f511f287ae0a3e4294Chih-Chung Chang } 692aeb3062e84ed28f0e25a73f511f287ae0a3e4294Chih-Chung Chang 693e6251df06f0b3c8f556043f8b725b4b19be7474dChih-Chung Chang private void wantBars() { 694e6251df06f0b3c8f556043f8b725b4b19be7474dChih-Chung Chang if (canShowBars()) showBars(); 695e6251df06f0b3c8f556043f8b725b4b19be7474dChih-Chung Chang } 696e6251df06f0b3c8f556043f8b725b4b19be7474dChih-Chung Chang 69761f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang private void toggleBars() { 698f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (mShowBars) { 699f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin hideBars(); 700aeb3062e84ed28f0e25a73f511f287ae0a3e4294Chih-Chung Chang } else { 701e6251df06f0b3c8f556043f8b725b4b19be7474dChih-Chung Chang if (canShowBars()) showBars(); 702f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 703f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 704f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 70561f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang private void updateBars() { 706e6251df06f0b3c8f556043f8b725b4b19be7474dChih-Chung Chang if (!canShowBars()) { 70761f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang hideBars(); 70861f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang } 709f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 710f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 711f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 7122ef46ed28b28b355d7f3f1432c7b1196b832a859Chih-Chung Chang public void onOrientationCompensationChanged() { 7132ef46ed28b28b355d7f3f1432c7b1196b832a859Chih-Chung Chang mActivity.getGLRoot().requestLayoutContentPane(); 714bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang } 715bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang 716bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang @Override 717f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin protected void onBackPressed() { 718f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (mShowDetails) { 719f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin hideDetails(); 7203b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang } else if (mAppBridge == null || !switchWithCaptureAnimation(-1)) { 721bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang // We are leaving this page. Set the result now. 722bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang setResult(); 7237eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu if (mStartInFilmstrip && !mPhotoView.getFilmMode()) { 7247eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu mPhotoView.setFilmMode(true); 7257eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu } else if (mTreatBackAsUp) { 72654fe6202b6f7d233e7645c121321fe0f3d20fc8bYuli Huang onUpPressed(); 72754fe6202b6f7d233e7645c121321fe0f3d20fc8bYuli Huang } else { 72854fe6202b6f7d233e7645c121321fe0f3d20fc8bYuli Huang super.onBackPressed(); 72954fe6202b6f7d233e7645c121321fe0f3d20fc8bYuli Huang } 730f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 731f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 732f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 733b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang private void onUpPressed() { 734833f775afc9515567dc5aaf0cafe20e006e77545Bobby Georgescu if ((mStartInFilmstrip || mAppBridge != null) 735833f775afc9515567dc5aaf0cafe20e006e77545Bobby Georgescu && !mPhotoView.getFilmMode()) { 7367eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu mPhotoView.setFilmMode(true); 7377eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu return; 7387eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu } 7397eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu 740b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang if (mActivity.getStateManager().getStateCount() > 1) { 7417eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu setResult(); 742b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang super.onBackPressed(); 743ba12eae90b5b1a80ee002aa0df8c5c5189c4faa3Chih-Chung Chang return; 74466ca848b2f58b813d366642088d274a1b7c4a90cChih-Chung Chang } 74566ca848b2f58b813d366642088d274a1b7c4a90cChih-Chung Chang 74666ca848b2f58b813d366642088d274a1b7c4a90cChih-Chung Chang if (mOriginalSetPathString == null) return; 74766ca848b2f58b813d366642088d274a1b7c4a90cChih-Chung Chang 74866ca848b2f58b813d366642088d274a1b7c4a90cChih-Chung Chang if (mAppBridge == null) { 749b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang // We're in view mode so set up the stacks on our own. 750b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang Bundle data = new Bundle(getData()); 751b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang data.putString(AlbumPage.KEY_MEDIA_PATH, mOriginalSetPathString); 752b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang data.putString(AlbumPage.KEY_PARENT_MEDIA_PATH, 753b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang mActivity.getDataManager().getTopSetPath( 754b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang DataManager.INCLUDE_ALL)); 755b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang mActivity.getStateManager().switchState(this, AlbumPage.class, data); 75666ca848b2f58b813d366642088d274a1b7c4a90cChih-Chung Chang } else { 757833f775afc9515567dc5aaf0cafe20e006e77545Bobby Georgescu GalleryUtils.startGalleryActivity(mActivity); 758b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang } 759b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang } 760b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang 761bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang private void setResult() { 762bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang Intent result = null; 7637eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu result = new Intent(); 7647eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu result.putExtra(KEY_RETURN_INDEX_HINT, mCurrentIndex); 765bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang setStateResult(Activity.RESULT_OK, result); 766bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang } 767bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang 768bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang ////////////////////////////////////////////////////////////////////////// 769bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang // AppBridge.Server interface 770bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang ////////////////////////////////////////////////////////////////////////// 771bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang 772bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang @Override 7732ef46ed28b28b355d7f3f1432c7b1196b832a859Chih-Chung Chang public void setCameraRelativeFrame(Rect frame) { 7742ef46ed28b28b355d7f3f1432c7b1196b832a859Chih-Chung Chang mPhotoView.setCameraRelativeFrame(frame); 775bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang } 776bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang 777bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang @Override 7782c6173822a612597c79be41b126367ddfbb5d518Chih-Chung Chang public boolean switchWithCaptureAnimation(int offset) { 7792c6173822a612597c79be41b126367ddfbb5d518Chih-Chung Chang return mPhotoView.switchWithCaptureAnimation(offset); 7802c6173822a612597c79be41b126367ddfbb5d518Chih-Chung Chang } 7812c6173822a612597c79be41b126367ddfbb5d518Chih-Chung Chang 782f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 7836575794a9c09f22d5721e212c093e0a2df376d0cChih-Chung Chang public void setSwipingEnabled(boolean enabled) { 7846575794a9c09f22d5721e212c093e0a2df376d0cChih-Chung Chang mPhotoView.setSwipingEnabled(enabled); 7856575794a9c09f22d5721e212c093e0a2df376d0cChih-Chung Chang } 7866575794a9c09f22d5721e212c093e0a2df376d0cChih-Chung Chang 7876575794a9c09f22d5721e212c093e0a2df376d0cChih-Chung Chang @Override 7883b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang public void notifyScreenNailChanged() { 7893b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang mScreenNailItem.setScreenNail(mAppBridge.attachScreenNail()); 7903b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang mScreenNailSet.notifyChange(); 7913b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang } 7923b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang 7933b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang @Override 794a0ce682e40c39ce046c48d8a7f989fff01bb9f2cWu-cheng Li public void addSecureAlbumItem(boolean isVideo, int id) { 795a0ce682e40c39ce046c48d8a7f989fff01bb9f2cWu-cheng Li mSecureAlbum.addMediaItem(isVideo, id); 796a0ce682e40c39ce046c48d8a7f989fff01bb9f2cWu-cheng Li } 797a0ce682e40c39ce046c48d8a7f989fff01bb9f2cWu-cheng Li 798a0ce682e40c39ce046c48d8a7f989fff01bb9f2cWu-cheng Li @Override 799f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin protected boolean onCreateActionBar(Menu menu) { 800b21b8e58a604f6c701245d84b141b5b87663192bOwen Lin mActionBar.createActionBarMenu(R.menu.photo, menu); 8018fe22ecb8e744a09a2e0d867f876ecbf74c82298John Reck mHaveImageEditor = GalleryUtils.isEditorAvailable(mActivity, "image/*"); 802f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin updateMenuOperations(); 803ed46d77c16cd80357f4a0feada2435dfba8104a6Yuli Huang updateTitle(); 804b21b8e58a604f6c701245d84b141b5b87663192bOwen Lin return true; 805f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 806f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 807d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin private MenuExecutor.ProgressListener mConfirmDialogListener = 808d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin new MenuExecutor.ProgressListener() { 809d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin @Override 810d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin public void onProgressUpdate(int index) {} 811d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin 812d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin @Override 813d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin public void onProgressComplete(int result) {} 814d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin 815d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin @Override 816d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin public void onConfirmDialogShown() { 817d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin mHandler.removeMessages(MSG_HIDE_BARS); 818d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin } 819d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin 820d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin @Override 821d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin public void onConfirmDialogDismissed(boolean confirmed) { 822d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin refreshHidingMessage(); 823d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin } 824ba50b9420e64731fd5aa8b1410e1f36457a1635aBobby Georgescu 825ba50b9420e64731fd5aa8b1410e1f36457a1635aBobby Georgescu @Override 826ba50b9420e64731fd5aa8b1410e1f36457a1635aBobby Georgescu public void onProgressStart() {} 827d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin }; 828d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin 829f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 830f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin protected boolean onItemSelected(MenuItem item) { 831d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu if (mModel == null) return true; 832d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin refreshHidingMessage(); 833616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin MediaItem current = mModel.getMediaItem(0); 834f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 835f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (current == null) { 836f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin // item is not ready, ignore 837f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return true; 838f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 839f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 840f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin int currentIndex = mModel.getCurrentIndex(); 841f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin Path path = current.getPath(); 842f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 843f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin DataManager manager = mActivity.getDataManager(); 844f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin int action = item.getItemId(); 8459a033b07b8e0d9fe7419b7a0d876e9c7febf43c8Ray Chen String confirmMsg = null; 846f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin switch (action) { 84784c220f10a643927c8a2126de8a755d8d7f7ec9eRay Chen case android.R.id.home: { 848b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang onUpPressed(); 84984c220f10a643927c8a2126de8a755d8d7f7ec9eRay Chen return true; 85084c220f10a643927c8a2126de8a755d8d7f7ec9eRay Chen } 8517eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu case R.id.action_grid: { 8527eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu if (mStartedFromAlbumPage) { 8537eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu onUpPressed(); 8547eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu } else { 8557eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu preparePhotoFallbackView(); 8567eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu Bundle data = new Bundle(getData()); 8577eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu data.putString(AlbumPage.KEY_MEDIA_PATH, mOriginalSetPathString); 8587eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu data.putString(AlbumPage.KEY_PARENT_MEDIA_PATH, 8597eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu mActivity.getDataManager().getTopSetPath( 8607eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu DataManager.INCLUDE_ALL)); 86100ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu 862e06c9f109f06813ca1f8a0abb549d51aefd4973dBobby Georgescu // We only show cluster menu in the first AlbumPage in stack 86300ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu // TODO: Enable this when running from the camera app 864e06c9f109f06813ca1f8a0abb549d51aefd4973dBobby Georgescu boolean inAlbum = mActivity.getStateManager().hasStateClass(AlbumPage.class); 86500ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu data.putBoolean(AlbumPage.KEY_SHOW_CLUSTER_MENU, !inAlbum 86600ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu && mAppBridge == null); 86700ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu 86800ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu data.putBoolean(PhotoPage.KEY_APP_BRIDGE, mAppBridge != null); 86900ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu 87000ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu // Account for live preview being first item 87100ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu mActivity.getTransitionStore().put(KEY_RETURN_INDEX_HINT, 87200ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu mAppBridge != null ? mCurrentIndex - 1 : mCurrentIndex); 87300ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu 8747eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu mActivity.getStateManager().startState(AlbumPage.class, data); 8757eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu } 8767eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu return true; 8777eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu } 878f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin case R.id.action_slideshow: { 879f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin Bundle data = new Bundle(); 8806cf807453fb58ccd4cc513ff187b306c7090e67cOwen Lin data.putString(SlideshowPage.KEY_SET_PATH, mMediaSet.getPath().toString()); 881604f053d040782159b61d3b74ee533bc2c0ccdd0Ray Chen data.putString(SlideshowPage.KEY_ITEM_PATH, path.toString()); 882f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin data.putInt(SlideshowPage.KEY_PHOTO_INDEX, currentIndex); 883f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin data.putBoolean(SlideshowPage.KEY_REPEAT, true); 884f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mActivity.getStateManager().startStateForResult( 885f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin SlideshowPage.class, REQUEST_SLIDESHOW, data); 886f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return true; 887f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 888f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin case R.id.action_crop: { 889898a2f4540635528a0916b0a6b0a177869854ae9Wu-cheng Li Activity activity = mActivity; 890f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin Intent intent = new Intent(CropImage.CROP_ACTION); 891f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin intent.setClass(activity, CropImage.class); 892f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin intent.setData(manager.getContentUri(path)); 893f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin activity.startActivityForResult(intent, PicasaSource.isPicasaImage(current) 894f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin ? REQUEST_CROP_PICASA 895f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin : REQUEST_CROP); 896f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return true; 897f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 89850ea2d2938218ac6b2039f0e42998cfbbc45d1f1Teng-Hui Zhu case R.id.action_trim: { 8993f1f1baf3a674927e25cd5cd885fb372796bd3a0Teng-Hui Zhu Intent intent = new Intent(mActivity, TrimVideo.class); 9003f1f1baf3a674927e25cd5cd885fb372796bd3a0Teng-Hui Zhu intent.setData(manager.getContentUri(path)); 90115ff1b1ca52bea348b8a490b5b5abe53fa43eaf2Teng-Hui Zhu // We need the file path to wrap this into a RandomAccessFile. 90215ff1b1ca52bea348b8a490b5b5abe53fa43eaf2Teng-Hui Zhu intent.putExtra(KEY_MEDIA_ITEM_PATH, current.getFilePath()); 9033f1f1baf3a674927e25cd5cd885fb372796bd3a0Teng-Hui Zhu mActivity.startActivityForResult(intent, REQUEST_TRIM); 90450ea2d2938218ac6b2039f0e42998cfbbc45d1f1Teng-Hui Zhu return true; 90550ea2d2938218ac6b2039f0e42998cfbbc45d1f1Teng-Hui Zhu } 906f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang case R.id.action_edit: { 907a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu launchPhotoEditor(); 908f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang return true; 909f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang } 910f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin case R.id.action_details: { 911f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (mShowDetails) { 912f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin hideDetails(); 913f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } else { 914995c4566bed7df1aa48ba7e1351f964efa73880bMichael Kolb showDetails(); 915f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 916f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return true; 917f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 91867098d1a72fd04e2af06d3a5939cde28c65f70d9Ray Chen case R.id.action_delete: 9199a033b07b8e0d9fe7419b7a0d876e9c7febf43c8Ray Chen confirmMsg = mActivity.getResources().getQuantityString( 9209a033b07b8e0d9fe7419b7a0d876e9c7febf43c8Ray Chen R.plurals.delete_selection, 1); 921f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin case R.id.action_setas: 922f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin case R.id.action_rotate_ccw: 923f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin case R.id.action_rotate_cw: 924f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin case R.id.action_show_on_map: 925f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mSelectionManager.deSelectAll(); 926f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mSelectionManager.toggle(path); 927d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin mMenuExecutor.onMenuClicked(item, confirmMsg, mConfirmDialogListener); 928f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return true; 929f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin case R.id.action_import: 930f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mSelectionManager.deSelectAll(); 931f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mSelectionManager.toggle(path); 9329a033b07b8e0d9fe7419b7a0d876e9c7febf43c8Ray Chen mMenuExecutor.onMenuClicked(item, confirmMsg, 933f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin new ImportCompleteListener(mActivity)); 934f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return true; 935fb5571987f2555b04731b6f3e1c479efc16d542aWu-cheng Li case R.id.action_share: 936898a2f4540635528a0916b0a6b0a177869854ae9Wu-cheng Li Activity activity = mActivity; 937fb5571987f2555b04731b6f3e1c479efc16d542aWu-cheng Li Intent intent = createShareIntent(mCurrentPhoto.getPath()); 938fb5571987f2555b04731b6f3e1c479efc16d542aWu-cheng Li activity.startActivity(Intent.createChooser(intent, 939fb5571987f2555b04731b6f3e1c479efc16d542aWu-cheng Li activity.getString(R.string.share))); 940fb5571987f2555b04731b6f3e1c479efc16d542aWu-cheng Li return true; 941f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin default : 942f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return false; 943f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 944f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 945f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 946f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private void hideDetails() { 947f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mShowDetails = false; 9484105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen mDetailsHelper.hide(); 949f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 950f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 951995c4566bed7df1aa48ba7e1351f964efa73880bMichael Kolb private void showDetails() { 952f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mShowDetails = true; 9534105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen if (mDetailsHelper == null) { 9544105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen mDetailsHelper = new DetailsHelper(mActivity, mRootPane, new MyDetailsSource()); 9554105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen mDetailsHelper.setCloseListener(new CloseListener() { 95606c6401eededc2ec842ba4994a838c2ded0a666cPin Ting @Override 957f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void onClose() { 958f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin hideDetails(); 959f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 960f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin }); 961f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 9624105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen mDetailsHelper.show(); 963f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 964f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 965bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang //////////////////////////////////////////////////////////////////////////// 966bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang // Callbacks from PhotoView 967bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang //////////////////////////////////////////////////////////////////////////// 968bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang @Override 969f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void onSingleTapUp(int x, int y) { 970bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang if (mAppBridge != null) { 971bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang if (mAppBridge.onSingleTapUp(x, y)) return; 972014d9586d8145a33f4e99eaad570587f6d650026Wu-cheng Li } 973014d9586d8145a33f4e99eaad570587f6d650026Wu-cheng Li 974616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin MediaItem item = mModel.getMediaItem(0); 975b5dc542fbaeaf99bebdcf775ef0e034e89e88eaeWu-cheng Li if (item == null || item == mScreenNailItem) { 976b5dc542fbaeaf99bebdcf775ef0e034e89e88eaeWu-cheng Li // item is not ready or it is camera preview, ignore 977f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return; 978f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 979f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 9808868aa1b2d199e7fa869c9c5fad3079175621002Wu-cheng Li int supported = item.getSupportedOperations(); 981898a2f4540635528a0916b0a6b0a177869854ae9Wu-cheng Li boolean playVideo = (mSecureAlbum == null) && 9828868aa1b2d199e7fa869c9c5fad3079175621002Wu-cheng Li ((supported & MediaItem.SUPPORT_PLAY) != 0); 983bef18c1e167f5835c8f854e76a91da63b700f93bWu-cheng Li boolean viewPanorama = (mSecureAlbum == null) && 9848868aa1b2d199e7fa869c9c5fad3079175621002Wu-cheng Li ((supported & MediaItem.SUPPORT_PANORAMA) != 0); 9858868aa1b2d199e7fa869c9c5fad3079175621002Wu-cheng Li boolean unlock = ((supported & MediaItem.SUPPORT_UNLOCK) != 0); 986c7e3c76d6965f520a9651d309052c5f01726cd58Bobby Georgescu boolean goBack = ((supported & MediaItem.SUPPORT_BACK) != 0); 987f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 988f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (playVideo) { 989f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin // determine if the point is at center (1/6) of the photo view. 990f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin // (The position of the "play" icon is at center (1/6) of the photo) 991f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin int w = mPhotoView.getWidth(); 992f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin int h = mPhotoView.getHeight(); 993f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin playVideo = (Math.abs(x - w / 2) * 12 <= w) 994f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin && (Math.abs(y - h / 2) * 12 <= h); 995f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 996f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 997f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (playVideo) { 998898a2f4540635528a0916b0a6b0a177869854ae9Wu-cheng Li playVideo(mActivity, item.getPlayUri(), item.getName()); 99983be4e0c9b8e3372eff8f9b1a396afd961b72921Angus Kong } else if (viewPanorama) { 1000f8a39c644637a15b9291eb9299762b8cf91cd76aGeorge Mount LightCycleHelper.viewPanorama(mActivity, item.getContentUri()); 1001c7e3c76d6965f520a9651d309052c5f01726cd58Bobby Georgescu } else if (goBack) { 1002c7e3c76d6965f520a9651d309052c5f01726cd58Bobby Georgescu onBackPressed(); 10038868aa1b2d199e7fa869c9c5fad3079175621002Wu-cheng Li } else if (unlock) { 10048868aa1b2d199e7fa869c9c5fad3079175621002Wu-cheng Li mActivity.getStateManager().finishState(this); 1005f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } else { 100661f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang toggleBars(); 1007f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 1008f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 1009f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 1010bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang @Override 1011bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang public void lockOrientation() { 1012bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang mHandler.sendEmptyMessage(MSG_LOCK_ORIENTATION); 1013bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang } 1014bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang 1015bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang @Override 1016bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang public void unlockOrientation() { 101706c6401eededc2ec842ba4994a838c2ded0a666cPin Ting mHandler.sendEmptyMessage(MSG_UNLOCK_ORIENTATION); 1018bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang } 1019bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang 1020bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang @Override 102161f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang public void onActionBarAllowed(boolean allowed) { 102261f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang mActionBarAllowed = allowed; 102361f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang mHandler.sendEmptyMessage(MSG_UPDATE_ACTION_BAR); 102461f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang } 102561f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang 102661f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang @Override 1027e6251df06f0b3c8f556043f8b725b4b19be7474dChih-Chung Chang public void onActionBarWanted() { 1028e6251df06f0b3c8f556043f8b725b4b19be7474dChih-Chung Chang mHandler.sendEmptyMessage(MSG_WANT_BARS); 1029e6251df06f0b3c8f556043f8b725b4b19be7474dChih-Chung Chang } 1030e6251df06f0b3c8f556043f8b725b4b19be7474dChih-Chung Chang 1031e6251df06f0b3c8f556043f8b725b4b19be7474dChih-Chung Chang @Override 1032bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang public void onFullScreenChanged(boolean full) { 1033bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang Message m = mHandler.obtainMessage( 1034bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang MSG_ON_FULL_SCREEN_CHANGED, full ? 1 : 0, 0); 1035bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang m.sendToTarget(); 1036bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang } 1037bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang 10386b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang // How we do delete/undo: 10396b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang // 10406b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang // When the user choose to delete a media item, we just tell the 10416b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang // FilterDeleteSet to hide that item. If the user choose to undo it, we 10426b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang // again tell FilterDeleteSet not to hide it. If the user choose to commit 10436b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang // the deletion, we then actually delete the media item. 10446b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang @Override 10456b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang public void onDeleteImage(Path path, int offset) { 10466118af9ddad8acc050133154f8f60c842c7f9bfaChih-Chung Chang onCommitDeleteImage(); // commit the previous deletion 10476b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang mDeletePath = path; 10486b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang mDeleteIsFocus = (offset == 0); 10496118af9ddad8acc050133154f8f60c842c7f9bfaChih-Chung Chang mMediaSet.addDeletion(path, mCurrentIndex + offset); 10506b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang } 10516b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang 10526b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang @Override 10536b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang public void onUndoDeleteImage() { 10546118af9ddad8acc050133154f8f60c842c7f9bfaChih-Chung Chang if (mDeletePath == null) return; 10556b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang // If the deletion was done on the focused item, we want the model to 10566b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang // focus on it when it is undeleted. 10576b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang if (mDeleteIsFocus) mModel.setFocusHintPath(mDeletePath); 10586118af9ddad8acc050133154f8f60c842c7f9bfaChih-Chung Chang mMediaSet.removeDeletion(mDeletePath); 10596b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang mDeletePath = null; 10606b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang } 10616b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang 10626b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang @Override 10636b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang public void onCommitDeleteImage() { 10646b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang if (mDeletePath == null) return; 10656b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang mSelectionManager.deSelectAll(); 10666b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang mSelectionManager.toggle(mDeletePath); 10676b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang mMenuExecutor.onMenuClicked(R.id.action_delete, null, true, false); 10686b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang mDeletePath = null; 10696b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang } 10706b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang 1071f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public static void playVideo(Activity activity, Uri uri, String title) { 1072f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin try { 1073f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin Intent intent = new Intent(Intent.ACTION_VIEW) 1074a3871050845b4921379add2b126add3cfbab1109Ray Chen .setDataAndType(uri, "video/*") 1075a3871050845b4921379add2b126add3cfbab1109Ray Chen .putExtra(Intent.EXTRA_TITLE, title) 1076a3871050845b4921379add2b126add3cfbab1109Ray Chen .putExtra(MovieActivity.KEY_TREAT_UP_AS_BACK, true); 107771cd89a38752bc22ae0ec2df965e4280b776623cChih-Chung Chang activity.startActivityForResult(intent, REQUEST_PLAY_VIDEO); 1078f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } catch (ActivityNotFoundException e) { 1079f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin Toast.makeText(activity, activity.getString(R.string.video_err), 1080f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin Toast.LENGTH_SHORT).show(); 1081f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 1082f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 1083f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 1084f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang private void setCurrentPhotoByIntent(Intent intent) { 1085f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang if (intent == null) return; 1086f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang Path path = mApplication.getDataManager() 1087f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang .findPathByUri(intent.getData(), intent.getType()); 1088f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang if (path != null) { 1089f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang mModel.setCurrentPhoto(path, mCurrentIndex); 1090f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang } 1091f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang } 1092f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang 1093f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 1094f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin protected void onStateResult(int requestCode, int resultCode, Intent data) { 109571cd89a38752bc22ae0ec2df965e4280b776623cChih-Chung Chang mHasActivityResult = true; 1096f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin switch (requestCode) { 1097f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang case REQUEST_EDIT: 1098f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang setCurrentPhotoByIntent(data); 1099f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang break; 1100f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin case REQUEST_CROP: 1101f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (resultCode == Activity.RESULT_OK) { 1102f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang setCurrentPhotoByIntent(data); 1103f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 1104f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin break; 1105f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin case REQUEST_CROP_PICASA: { 1106f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang if (resultCode == Activity.RESULT_OK) { 1107f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang Context context = mActivity.getAndroidContext(); 110888cc2ca5f5596762a5546ec7426756f2036be455Yuli Huang String message = context.getString(R.string.crop_saved, 1109f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang context.getString(R.string.folder_download)); 1110f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang Toast.makeText(context, message, Toast.LENGTH_SHORT).show(); 1111f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang } 1112f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin break; 1113f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 1114f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin case REQUEST_SLIDESHOW: { 1115f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (data == null) break; 1116f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin String path = data.getStringExtra(SlideshowPage.KEY_ITEM_PATH); 1117f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin int index = data.getIntExtra(SlideshowPage.KEY_PHOTO_INDEX, 0); 1118f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (path != null) { 1119f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mModel.setCurrentPhoto(Path.fromString(path), index); 1120f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 1121f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 1122f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 1123f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 1124f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 112514d3289b4867c21da93ec4032119c0091bc78c30George Mount @Override 112614d3289b4867c21da93ec4032119c0091bc78c30George Mount protected void clearStateResult() { 112714d3289b4867c21da93ec4032119c0091bc78c30George Mount mHasActivityResult = false; 112814d3289b4867c21da93ec4032119c0091bc78c30George Mount } 112914d3289b4867c21da93ec4032119c0091bc78c30George Mount 1130616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin private class PreparePhotoFallback implements OnGLIdleListener { 1131616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin private PhotoFallbackEffect mPhotoFallback = new PhotoFallbackEffect(); 1132616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin private boolean mResultReady = false; 1133616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin 1134616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin public synchronized PhotoFallbackEffect get() { 1135616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin while (!mResultReady) { 1136616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin Utils.waitWithoutInterrupt(this); 1137616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin } 1138616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin return mPhotoFallback; 1139616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin } 1140616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin 1141616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin @Override 1142616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin public boolean onGLIdle(GLCanvas canvas, boolean renderRequested) { 1143616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin mPhotoFallback = mPhotoView.buildFallbackEffect(mRootPane, canvas); 1144616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin synchronized (this) { 1145616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin mResultReady = true; 1146616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin notifyAll(); 1147616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin } 1148616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin return false; 1149616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin } 1150616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin } 1151616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin 1152616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin private void preparePhotoFallbackView() { 1153616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin GLRoot root = mActivity.getGLRoot(); 1154616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin PreparePhotoFallback task = new PreparePhotoFallback(); 1155616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin root.unlockRenderThread(); 1156616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin PhotoFallbackEffect anim; 1157616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin try { 1158616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin root.addOnGLIdleListener(task); 1159616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin anim = task.get(); 1160616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin } finally { 1161616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin root.lockRenderThread(); 1162616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin } 1163616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin mActivity.getTransitionStore().put( 1164616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin AlbumPage.KEY_RESUME_ANIMATION, anim); 1165616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin } 1166616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin 1167f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 1168f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void onPause() { 1169d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin super.onPause(); 1170d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin mIsActive = false; 1171d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin 1172bd7c016d728853d38f98a3c6077b7bd9b08858b9Yuli Huang mActivity.getGLRoot().unfreeze(); 1173bd7c016d728853d38f98a3c6077b7bd9b08858b9Yuli Huang mHandler.removeMessages(MSG_UNFREEZE_GLROOT); 1174253c5aec7692afdd7880fbd169d4b44d5679cbc0Chih-Chung Chang 11754105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen DetailsHelper.pause(); 1176d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu if (mModel != null) { 1177d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu if (isFinishing()) preparePhotoFallbackView(); 1178d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu mModel.pause(); 1179d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu } 1180f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mPhotoView.pause(); 1181f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mHandler.removeMessages(MSG_HIDE_BARS); 1182f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mActionBar.removeOnMenuVisibilityListener(mMenuVisibilityListener); 118333ef03776b7734717b16f6fc861b831fb1b1dfacMartijn Coenen 11846b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang onCommitDeleteImage(); 11852785956f8f5654966a41e20f482f4af3057eea3fChih-Chung Chang mMenuExecutor.pause(); 11866118af9ddad8acc050133154f8f60c842c7f9bfaChih-Chung Chang if (mMediaSet != null) mMediaSet.clearDeletion(); 1187f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 1188f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 1189f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 1190bd7c016d728853d38f98a3c6077b7bd9b08858b9Yuli Huang public void onCurrentImageUpdated() { 1191bd7c016d728853d38f98a3c6077b7bd9b08858b9Yuli Huang mActivity.getGLRoot().unfreeze(); 1192bd7c016d728853d38f98a3c6077b7bd9b08858b9Yuli Huang } 1193bd7c016d728853d38f98a3c6077b7bd9b08858b9Yuli Huang 11947eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu private void setGridButtonVisibility(boolean enabled) { 11957eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu Menu menu = mActionBar.getMenu(); 11967eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu if (menu == null) return; 11977eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu MenuItem item = menu.findItem(R.id.action_grid); 1198fc3651d38708c6475b808b6fad27ee66bdd6ee04Wu-cheng Li if (item != null) item.setVisible((mSecureAlbum == null) && enabled); 11997eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu } 12007eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu 12017eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu public void onFilmModeChanged(boolean enabled) { 12027eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu mHandler.sendEmptyMessage(MSG_REFRESH_GRID_BUTTON); 1203f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu mHandler.sendEmptyMessage(MSG_REFRESH_BOTTOM_CONTROLS); 12047eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu if (enabled) { 12057eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu mHandler.removeMessages(MSG_HIDE_BARS); 12067eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu } else { 12077eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu refreshHidingMessage(); 12087eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu } 12097eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu } 12107eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu 12117eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu private void transitionFromAlbumPageIfNeeded() { 12127eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu TransitionStore transitions = mActivity.getTransitionStore(); 12137eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu 12147eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu int albumPageTransition = transitions.get( 12157eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu KEY_ALBUMPAGE_TRANSITION, MSG_ALBUMPAGE_NONE); 12167eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu 121700ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu if (albumPageTransition == MSG_ALBUMPAGE_NONE && mAppBridge != null) { 121800ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu // Generally, resuming the PhotoPage when in Camera should 121900ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu // reset to the capture mode to allow quick photo taking 122000ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu mCurrentIndex = 0; 122100ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu mPhotoView.resetToFirstPicture(); 122200ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu } else { 122300ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu int resumeIndex = transitions.get(KEY_INDEX_HINT, -1); 122400ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu if (resumeIndex >= 0) { 122500ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu if (mAppBridge != null) { 122600ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu // Account for live preview being the first item 122700ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu resumeIndex++; 122800ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu } 122900ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu if (resumeIndex < mMediaSet.getMediaItemCount()) { 123000ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu mCurrentIndex = resumeIndex; 123100ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu mModel.moveTo(mCurrentIndex); 123200ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu } 123300ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu } 123400ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu } 123500ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu 123600ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu if (albumPageTransition == MSG_ALBUMPAGE_RESUMED) { 123700ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu mPhotoView.setFilmMode(mStartInFilmstrip || mAppBridge != null); 123800ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu } else if (albumPageTransition == MSG_ALBUMPAGE_PICKED) { 123900ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu mPhotoView.setFilmMode(false); 12407eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu } 12417eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu 124251bc561e85053abfd7fda695e3cd20710acca85cBobby Georgescu mFadeOutTexture = transitions.get(PreparePageFadeoutTexture.KEY_FADE_TEXTURE); 12437eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu if (mFadeOutTexture != null) { 12447eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu mBackgroundFade.start(); 12457eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu BitmapScreenNail.disableDrawPlaceholder(); 12467eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu mOpenAnimationRect = 12477eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu albumPageTransition == MSG_ALBUMPAGE_NONE ? 12487eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu (Rect) mData.getParcelable(KEY_OPEN_ANIMATION_RECT) : 12497eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu (Rect) transitions.get(KEY_OPEN_ANIMATION_RECT); 12507eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu mPhotoView.setOpenAnimationRect(mOpenAnimationRect); 12517eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu mBackgroundFade.start(); 12527eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu } 12537eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu } 12547eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu 1255bd7c016d728853d38f98a3c6077b7bd9b08858b9Yuli Huang @Override 1256f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin protected void onResume() { 1257f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin super.onResume(); 12587eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu 1259d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu if (mModel == null) { 1260d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu mActivity.getStateManager().finishState(this); 1261d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu return; 1262d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu } 12637eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu transitionFromAlbumPageIfNeeded(); 12647eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu 1265d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin mActivity.getGLRoot().freeze(); 1266f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mIsActive = true; 1267f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin setContentPane(mRootPane); 126804ac045bf8da5082bbb0bdc9ea5f9c9b5b796ad0Yuli Huang 1269f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mModel.resume(); 1270f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mPhotoView.resume(); 1271898a2f4540635528a0916b0a6b0a177869854ae9Wu-cheng Li mActionBar.setDisplayOptions( 1272898a2f4540635528a0916b0a6b0a177869854ae9Wu-cheng Li ((mSecureAlbum == null) && (mSetPathString != null)), true); 1273f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mActionBar.addOnMenuVisibilityListener(mMenuVisibilityListener); 127400ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu if (!mShowBars) { 127500ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu mActionBar.hide(); 127600ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu mActivity.getGLRoot().setLightsOutMode(true); 1277bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang } 12788fe22ecb8e744a09a2e0d867f876ecbf74c82298John Reck boolean haveImageEditor = GalleryUtils.isEditorAvailable(mActivity, "image/*"); 12798fe22ecb8e744a09a2e0d867f876ecbf74c82298John Reck if (haveImageEditor != mHaveImageEditor) { 12808fe22ecb8e744a09a2e0d867f876ecbf74c82298John Reck mHaveImageEditor = haveImageEditor; 12818fe22ecb8e744a09a2e0d867f876ecbf74c82298John Reck updateMenuOperations(); 12828fe22ecb8e744a09a2e0d867f876ecbf74c82298John Reck } 128300ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu 128471cd89a38752bc22ae0ec2df965e4280b776623cChih-Chung Chang mHasActivityResult = false; 1285bd7c016d728853d38f98a3c6077b7bd9b08858b9Yuli Huang mHandler.sendEmptyMessageDelayed(MSG_UNFREEZE_GLROOT, UNFREEZE_GLROOT_TIMEOUT); 1286f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 1287f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 128815b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang @Override 128915b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang protected void onDestroy() { 1290bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang if (mAppBridge != null) { 1291253c5aec7692afdd7880fbd169d4b44d5679cbc0Chih-Chung Chang mAppBridge.setServer(null); 12923b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang mScreenNailItem.setScreenNail(null); 1293bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang mAppBridge.detachScreenNail(); 1294bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang mAppBridge = null; 12953b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang mScreenNailSet = null; 12963b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang mScreenNailItem = null; 1297b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang } 1298bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang mOrientationManager.removeListener(this); 12992ef46ed28b28b355d7f3f1432c7b1196b832a859Chih-Chung Chang mActivity.getGLRoot().setOrientationSource(null); 1300f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu if (mBottomControls != null) mBottomControls.cleanup(); 1301aeb3062e84ed28f0e25a73f511f287ae0a3e4294Chih-Chung Chang 1302aeb3062e84ed28f0e25a73f511f287ae0a3e4294Chih-Chung Chang // Remove all pending messages. 1303aeb3062e84ed28f0e25a73f511f287ae0a3e4294Chih-Chung Chang mHandler.removeCallbacksAndMessages(null); 130415b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang super.onDestroy(); 130515b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang } 130615b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang 1307f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private class MyDetailsSource implements DetailsSource { 13086cf807453fb58ccd4cc513ff187b306c7090e67cOwen Lin 13096cf807453fb58ccd4cc513ff187b306c7090e67cOwen Lin @Override 1310f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public MediaDetails getDetails() { 1311616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin return mModel.getMediaItem(0).getDetails(); 1312f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 13136cf807453fb58ccd4cc513ff187b306c7090e67cOwen Lin 13146cf807453fb58ccd4cc513ff187b306c7090e67cOwen Lin @Override 1315f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public int size() { 1316f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return mMediaSet != null ? mMediaSet.getMediaItemCount() : 1; 1317f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 13186cf807453fb58ccd4cc513ff187b306c7090e67cOwen Lin 13196cf807453fb58ccd4cc513ff187b306c7090e67cOwen Lin @Override 1320995c4566bed7df1aa48ba7e1351f964efa73880bMichael Kolb public int setIndex() { 1321995c4566bed7df1aa48ba7e1351f964efa73880bMichael Kolb return mModel.getCurrentIndex(); 13224105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen } 1323f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 1324f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin} 1325