PhotoPage.java revision 833f775afc9515567dc5aaf0cafe20e006e77545
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; 2266ca848b2f58b813d366642088d274a1b7c4a90cChih-Chung Changimport android.content.ContentResolver; 23604f053d040782159b61d3b74ee533bc2c0ccdd0Ray Chenimport android.content.Context; 24604f053d040782159b61d3b74ee533bc2c0ccdd0Ray Chenimport android.content.Intent; 25a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescuimport android.content.pm.PackageManager; 2604ac045bf8da5082bbb0bdc9ea5f9c9b5b796ad0Yuli Huangimport android.graphics.Rect; 27604f053d040782159b61d3b74ee533bc2c0ccdd0Ray Chenimport android.net.Uri; 2833ef03776b7734717b16f6fc861b831fb1b1dfacMartijn Coenenimport android.nfc.NfcAdapter; 29ddf0225a5192a589fc578945f56440b09bf74d12John Reckimport android.nfc.NfcAdapter.CreateBeamUrisCallback; 30ddf0225a5192a589fc578945f56440b09bf74d12John Reckimport android.nfc.NfcEvent; 31604f053d040782159b61d3b74ee533bc2c0ccdd0Ray Chenimport android.os.Bundle; 32604f053d040782159b61d3b74ee533bc2c0ccdd0Ray Chenimport android.os.Handler; 33604f053d040782159b61d3b74ee533bc2c0ccdd0Ray Chenimport android.os.Message; 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; 7866ca848b2f58b813d366642088d274a1b7c4a90cChih-Chung Changimport com.android.gallery3d.util.MediaSetUtils; 79f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 80bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Changpublic class PhotoPage extends ActivityState implements 81f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu PhotoView.Listener, OrientationManager.Listener, AppBridge.Server, 82f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu PhotoPageBottomControls.Delegate { 83f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private static final String TAG = "PhotoPage"; 84f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 85f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private static final int MSG_HIDE_BARS = 1; 86bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang private static final int MSG_LOCK_ORIENTATION = 2; 87bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang private static final int MSG_UNLOCK_ORIENTATION = 3; 88bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang private static final int MSG_ON_FULL_SCREEN_CHANGED = 4; 8961f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang private static final int MSG_UPDATE_ACTION_BAR = 5; 90bd7c016d728853d38f98a3c6077b7bd9b08858b9Yuli Huang private static final int MSG_UNFREEZE_GLROOT = 6; 91e6251df06f0b3c8f556043f8b725b4b19be7474dChih-Chung Chang private static final int MSG_WANT_BARS = 7; 927eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu private static final int MSG_REFRESH_GRID_BUTTON = 8; 93f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu private static final int MSG_REFRESH_BOTTOM_CONTROLS = 9; 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; 144f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu private PhotoPageBottomControls mBottomControls; 145f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private MediaItem mCurrentPhoto = null; 146f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private MenuExecutor mMenuExecutor; 147f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private boolean mIsActive; 14884c220f10a643927c8a2126de8a755d8d7f7ec9eRay Chen private String mSetPathString; 149b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang // This is the original mSetPathString before adding the camera preview item. 150b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang private String mOriginalSetPathString; 151bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang private AppBridge mAppBridge; 1523b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang private SnailItem mScreenNailItem; 1533b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang private SnailAlbum mScreenNailSet; 154bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang private OrientationManager mOrientationManager; 15571cd89a38752bc22ae0ec2df965e4280b776623cChih-Chung Chang private boolean mHasActivityResult; 15654fe6202b6f7d233e7645c121321fe0f3d20fc8bYuli Huang private boolean mTreatBackAsUp; 1577eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu private boolean mStartInFilmstrip; 1587eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu private boolean mStartedFromAlbumPage; 15915b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang 160f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu private RawTexture mFadeOutTexture; 161f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu private Rect mOpenAnimationRect; 1627eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu public static final int ANIM_TIME_OPENING = 300; 163f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu 1646b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang // The item that is deleted (but it can still be undeleted before commiting) 1656b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang private Path mDeletePath; 1666b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang private boolean mDeleteIsFocus; // whether the deleted item was in focus 1676b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang 168ddf0225a5192a589fc578945f56440b09bf74d12John Reck private Uri[] mNfcPushUris = new Uri[1]; 16933ef03776b7734717b16f6fc861b831fb1b1dfacMartijn Coenen 1702bb717f1ea38e2ce33dd102a23afe6bfacb5675cOwen Lin private final MyMenuVisibilityListener mMenuVisibilityListener = 1712bb717f1ea38e2ce33dd102a23afe6bfacb5675cOwen Lin new MyMenuVisibilityListener(); 1722bb717f1ea38e2ce33dd102a23afe6bfacb5675cOwen Lin 173f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public static interface Model extends PhotoView.Model { 174f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void resume(); 175f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void pause(); 176f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public boolean isEmpty(); 177f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void setCurrentPhoto(Path path, int indexHint); 178f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 179f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 180f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private class MyMenuVisibilityListener implements OnMenuVisibilityListener { 18106c6401eededc2ec842ba4994a838c2ded0a666cPin Ting @Override 182f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void onMenuVisibilityChanged(boolean isVisible) { 183f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mIsMenuVisible = isVisible; 184f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin refreshHidingMessage(); 185f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 186f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 187f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 188f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu private static class BackgroundFadeOut extends FloatAnimation { 189f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu public BackgroundFadeOut() { 190f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu super(1f, 0f, ANIM_TIME_OPENING); 191f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu setInterpolator(new AccelerateInterpolator(2f)); 192f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu } 193f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu } 194f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu 195f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu private final FloatAnimation mBackgroundFade = new BackgroundFadeOut(); 196f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 197915c2c5b2c367df71599370613af0924bd7c4887Bobby Georgescu @Override 198915c2c5b2c367df71599370613af0924bd7c4887Bobby Georgescu protected int getBackgroundColorId() { 199915c2c5b2c367df71599370613af0924bd7c4887Bobby Georgescu return R.color.photo_background; 200915c2c5b2c367df71599370613af0924bd7c4887Bobby Georgescu } 201915c2c5b2c367df71599370613af0924bd7c4887Bobby Georgescu 202f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu private final GLView mRootPane = new GLView() { 203f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 204f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin protected void renderBackground(GLCanvas view) { 20583be4e0c9b8e3372eff8f9b1a396afd961b72921Angus Kong if (mFadeOutTexture != null) { 20683be4e0c9b8e3372eff8f9b1a396afd961b72921Angus Kong if (mBackgroundFade.calculate(AnimationTime.get())) invalidate(); 20783be4e0c9b8e3372eff8f9b1a396afd961b72921Angus Kong if (!mBackgroundFade.isActive()) { 208f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu mFadeOutTexture = null; 209f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu mOpenAnimationRect = null; 210f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu BitmapScreenNail.enableDrawPlaceholder(); 211f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu } else { 212f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu float fadeAlpha = mBackgroundFade.get(); 21383be4e0c9b8e3372eff8f9b1a396afd961b72921Angus Kong if (fadeAlpha < 1f) { 214915c2c5b2c367df71599370613af0924bd7c4887Bobby Georgescu view.clearBuffer(getBackgroundColor()); 215f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu view.setAlpha(fadeAlpha); 216f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu } 217f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu mFadeOutTexture.draw(view, 0, 0); 21802ef48574ef7099ebaa0386bd6fd676bd2fd5489Bobby Georgescu view.setAlpha(1f - fadeAlpha); 219f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu return; 220f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu } 221f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu } 222915c2c5b2c367df71599370613af0924bd7c4887Bobby Georgescu view.clearBuffer(getBackgroundColor()); 223f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 224f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 225f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 226f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin protected void onLayout( 227f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin boolean changed, int left, int top, int right, int bottom) { 228f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mPhotoView.layout(0, 0, right - left, bottom - top); 229f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (mShowDetails) { 2308cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen mDetailsHelper.layout(left, mActionBar.getHeight(), right, bottom); 231f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 232f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 233f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin }; 234f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 235f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 236f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void onCreate(Bundle data, Bundle restoreState) { 23745c56f2d34c71d0bc9b84ebeef6d1314738d0fc0Bobby Georgescu super.onCreate(data, restoreState); 2388cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen mActionBar = mActivity.getGalleryActionBar(); 239f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mSelectionManager = new SelectionManager(mActivity, false); 240f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mMenuExecutor = new MenuExecutor(mActivity, mSelectionManager); 241f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 242f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mPhotoView = new PhotoView(mActivity); 243bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang mPhotoView.setListener(this); 244f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mRootPane.addComponent(mPhotoView); 24583be4e0c9b8e3372eff8f9b1a396afd961b72921Angus Kong mApplication = (GalleryApp) ((Activity) mActivity).getApplication(); 246bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang mOrientationManager = mActivity.getOrientationManager(); 247bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang mOrientationManager.addListener(this); 2482ef46ed28b28b355d7f3f1432c7b1196b832a859Chih-Chung Chang mActivity.getGLRoot().setOrientationSource(mOrientationManager); 249f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 250d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu mHandler = new SynchronizedHandler(mActivity.getGLRoot()) { 251d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu @Override 252d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu public void handleMessage(Message message) { 253d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu switch (message.what) { 254d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu case MSG_HIDE_BARS: { 255d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu hideBars(); 256d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu break; 257d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu } 258d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu case MSG_REFRESH_GRID_BUTTON: { 259d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu setGridButtonVisibility(mPhotoView.getFilmMode()); 260d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu break; 261d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu } 262f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu case MSG_REFRESH_BOTTOM_CONTROLS: { 263f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu if (mBottomControls != null) mBottomControls.refresh(); 264d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu break; 265d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu } 266d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu case MSG_LOCK_ORIENTATION: { 267d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu mOrientationManager.lockOrientation(); 268d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu break; 269d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu } 270d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu case MSG_UNLOCK_ORIENTATION: { 271d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu mOrientationManager.unlockOrientation(); 272d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu break; 273d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu } 274d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu case MSG_ON_FULL_SCREEN_CHANGED: { 275d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu mAppBridge.onFullScreenChanged(message.arg1 == 1); 276d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu break; 277d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu } 278d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu case MSG_UPDATE_ACTION_BAR: { 279d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu updateBars(); 280d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu break; 281d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu } 282d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu case MSG_WANT_BARS: { 283d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu wantBars(); 284d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu break; 285d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu } 286d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu case MSG_UNFREEZE_GLROOT: { 287d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu mActivity.getGLRoot().unfreeze(); 288d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu break; 289d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu } 290d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu default: throw new AssertionError(message.what); 291d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu } 292d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu } 293d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu }; 294d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu 29584c220f10a643927c8a2126de8a755d8d7f7ec9eRay Chen mSetPathString = data.getString(KEY_MEDIA_SET_PATH); 296b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang mOriginalSetPathString = mSetPathString; 297ddf0225a5192a589fc578945f56440b09bf74d12John Reck setupNfcBeamPush(); 2987eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu String itemPathString = data.getString(KEY_MEDIA_ITEM_PATH); 2997eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu Path itemPath = itemPathString != null ? 3007eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu Path.fromString(data.getString(KEY_MEDIA_ITEM_PATH)) : 3017eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu null; 30254fe6202b6f7d233e7645c121321fe0f3d20fc8bYuli Huang mTreatBackAsUp = data.getBoolean(KEY_TREAT_BACK_AS_UP, false); 3037eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu mStartInFilmstrip = 3047eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu data.getBoolean(KEY_START_IN_FILMSTRIP, false); 3057eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu mStartedFromAlbumPage = 3067eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu data.getInt(KEY_ALBUMPAGE_TRANSITION, 3077eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu MSG_ALBUMPAGE_NONE) == MSG_ALBUMPAGE_STARTED; 3087eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu setGridButtonVisibility(!mStartedFromAlbumPage); 30984c220f10a643927c8a2126de8a755d8d7f7ec9eRay Chen if (mSetPathString != null) { 310bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang mAppBridge = (AppBridge) data.getParcelable(KEY_APP_BRIDGE); 311bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang if (mAppBridge != null) { 3127eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu mShowBars = false; 3137eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu 314253c5aec7692afdd7880fbd169d4b44d5679cbc0Chih-Chung Chang mAppBridge.setServer(this); 315bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang mOrientationManager.lockOrientation(); 316b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang 317bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang // Get the ScreenNail from AppBridge and register it. 3183b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang int id = SnailSource.newId(); 319b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang Path screenNailSetPath = SnailSource.getSetPath(id); 320bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang Path screenNailItemPath = SnailSource.getItemPath(id); 3213b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang mScreenNailSet = (SnailAlbum) mActivity.getDataManager() 3223b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang .getMediaObject(screenNailSetPath); 3233b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang mScreenNailItem = (SnailItem) mActivity.getDataManager() 324bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang .getMediaObject(screenNailItemPath); 3253b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang mScreenNailItem.setScreenNail(mAppBridge.attachScreenNail()); 326b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang 327a0ce682e40c39ce046c48d8a7f989fff01bb9f2cWu-cheng Li // Check if the path is a secure album. 328a0ce682e40c39ce046c48d8a7f989fff01bb9f2cWu-cheng Li if (SecureSource.isSecurePath(mSetPathString)) { 329a0ce682e40c39ce046c48d8a7f989fff01bb9f2cWu-cheng Li mSecureAlbum = (SecureAlbum) mActivity.getDataManager() 330a0ce682e40c39ce046c48d8a7f989fff01bb9f2cWu-cheng Li .getMediaSet(mSetPathString); 33123e595f0c656ebaeb63f78e3018b5830628c5afeWu-cheng Li } 33223e595f0c656ebaeb63f78e3018b5830628c5afeWu-cheng Li if (data.getBoolean(KEY_SHOW_WHEN_LOCKED, false)) { 333efd480e85dc5bd0d2ca0ac82d03e141212388830Wu-cheng Li // Set the flag to be on top of the lock screen. 334efd480e85dc5bd0d2ca0ac82d03e141212388830Wu-cheng Li mFlags |= FLAG_SHOW_WHEN_LOCKED; 335a0ce682e40c39ce046c48d8a7f989fff01bb9f2cWu-cheng Li } 336a0ce682e40c39ce046c48d8a7f989fff01bb9f2cWu-cheng Li 3373b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang // Combine the original MediaSet with the one for ScreenNail 3383b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang // from AppBridge. 339b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang mSetPathString = "/combo/item/{" + screenNailSetPath + 340b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang "," + mSetPathString + "}"; 341b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang 342b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang // Start from the screen nail. 343bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang itemPath = screenNailItemPath; 344b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang } 345b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang 3466118af9ddad8acc050133154f8f60c842c7f9bfaChih-Chung Chang MediaSet originalSet = mActivity.getDataManager() 3476118af9ddad8acc050133154f8f60c842c7f9bfaChih-Chung Chang .getMediaSet(mSetPathString); 3486118af9ddad8acc050133154f8f60c842c7f9bfaChih-Chung Chang mSelectionManager.setSourceMediaSet(originalSet); 3496b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang mSetPathString = "/filter/delete/{" + mSetPathString + "}"; 3506b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang mMediaSet = (FilterDeleteSet) mActivity.getDataManager() 3516b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang .getMediaSet(mSetPathString); 352f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mCurrentIndex = data.getInt(KEY_INDEX_HINT, 0); 353f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (mMediaSet == null) { 35484c220f10a643927c8a2126de8a755d8d7f7ec9eRay Chen Log.w(TAG, "failed to restore " + mSetPathString); 355f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 3567eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu if (itemPath == null) { 3573eb2e643a40d1be77998373343cdf8b14764f58cBobby Georgescu int mediaItemCount = mMediaSet.getMediaItemCount(); 3583eb2e643a40d1be77998373343cdf8b14764f58cBobby Georgescu if (mediaItemCount > 0) { 3593eb2e643a40d1be77998373343cdf8b14764f58cBobby Georgescu if (mCurrentIndex >= mediaItemCount) mCurrentIndex = 0; 360d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu itemPath = mMediaSet.getMediaItem(mCurrentIndex, 1) 361d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu .get(0).getPath(); 362d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu } else { 3633eb2e643a40d1be77998373343cdf8b14764f58cBobby Georgescu // Bail out, PhotoPage can't load on an empty album 364d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu return; 365d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu } 3667eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu } 367f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin PhotoDataAdapter pda = new PhotoDataAdapter( 368bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang mActivity, mPhotoView, mMediaSet, itemPath, mCurrentIndex, 36943a80fd806247cb50e81bacda3ad21d210e9ae88Angus Kong mAppBridge == null ? -1 : 0, 370dbb6acc204ba6f095eb0e49e1298e9ceda2c3096Wu-cheng Li mAppBridge == null ? false : mAppBridge.isPanorama(), 371dbb6acc204ba6f095eb0e49e1298e9ceda2c3096Wu-cheng Li mAppBridge == null ? false : mAppBridge.isStaticCamera()); 372f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mModel = pda; 373f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mPhotoView.setModel(mModel); 374f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 375f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin pda.setDataListener(new PhotoDataAdapter.DataListener() { 376f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 377113bfc77c4468411da9ae1290553c3be89f8df9aOwen Lin @Override 378f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void onPhotoChanged(int index, Path item) { 37900ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu int oldIndex = mCurrentIndex; 380f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mCurrentIndex = index; 381f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (item != null) { 382616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin MediaItem photo = mModel.getMediaItem(0); 383f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (photo != null) updateCurrentPhoto(photo); 384f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 38500ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu if (mAppBridge != null) { 38600ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu if (oldIndex == 0 && mCurrentIndex > 0 38700ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu && !mPhotoView.getFilmMode()) { 38800ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu mPhotoView.setFilmMode(true); 38900ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu } 39000ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu } 39161f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang updateBars(); 39200ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu 39300ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu // Reset the timeout for the bars after a swipe 39400ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu refreshHidingMessage(); 395f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 396f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 397f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 398f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void onLoadingFinished() { 399f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (!mModel.isEmpty()) { 400616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin MediaItem photo = mModel.getMediaItem(0); 401f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (photo != null) updateCurrentPhoto(photo); 402f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } else if (mIsActive) { 403c370476adcf29f311ceec70a119792a0168781e9Chih-Chung Chang // We only want to finish the PhotoPage if there is no 404c370476adcf29f311ceec70a119792a0168781e9Chih-Chung Chang // deletion that the user can undo. 405c370476adcf29f311ceec70a119792a0168781e9Chih-Chung Chang if (mMediaSet.getNumberOfDeletions() == 0) { 406c370476adcf29f311ceec70a119792a0168781e9Chih-Chung Chang mActivity.getStateManager().finishState( 407c370476adcf29f311ceec70a119792a0168781e9Chih-Chung Chang PhotoPage.this); 408c370476adcf29f311ceec70a119792a0168781e9Chih-Chung Chang } 409f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 410f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 411f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 412f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 413f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void onLoadingStarted() { 414f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 415f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin }); 416f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } else { 417f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin // Get default media set by the URI 418f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin MediaItem mediaItem = (MediaItem) 419f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mActivity.getDataManager().getMediaObject(itemPath); 420f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mModel = new SinglePhotoDataAdapter(mActivity, mPhotoView, mediaItem); 421f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mPhotoView.setModel(mModel); 422f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin updateCurrentPhoto(mediaItem); 423f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 424cf46a3abc26aac7cdb6b6993aeade053304b71d9Ray Chen 425b265ebb01cc046b74329eeb28dbecb24e0f953d2Bobby Georgescu mPhotoView.setFilmMode(mStartInFilmstrip && mMediaSet.getMediaItemCount() > 1); 426f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu if (mSecureAlbum == null) { 427f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu RelativeLayout galleryRoot = (RelativeLayout) ((Activity) mActivity) 428f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu .findViewById(mAppBridge != null ? R.id.content : R.id.gallery_root); 429f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu if (galleryRoot != null) { 430f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu mBottomControls = new PhotoPageBottomControls(this, mActivity, galleryRoot); 431f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu } 432f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu } 433a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu } 434a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu 435f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu public boolean canDisplayBottomControls() { 436f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu return mShowBars && !mPhotoView.getFilmMode(); 437a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu } 438a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu 439f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu public boolean canDisplayBottomControl(int control) { 440f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu if (mCurrentPhoto == null) return false; 441f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu switch(control) { 442f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu case R.id.photopage_bottom_control_edit: 443f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu return mCurrentPhoto.getMediaType() == MediaObject.MEDIA_TYPE_IMAGE; 444f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu case R.id.photopage_bottom_control_panorama: 445f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu return (mCurrentPhoto.getSupportedOperations() 4464f32d514ee7474d867d04bf3934f9e11e9e92783Mangesh Ghiware & MediaItem.SUPPORT_PANORAMA) != 0; 447f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu default: 448f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu return false; 449f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu } 450a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu } 451a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu 452f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu public void onBottomControlClicked(int control) { 453f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu switch(control) { 454f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu case R.id.photopage_bottom_control_edit: 455f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu launchPhotoEditor(); 456f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu return; 457f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu case R.id.photopage_bottom_control_panorama: 458f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu LightCycleHelper.viewPanorama(mActivity, mCurrentPhoto.getContentUri()); 459f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu return; 460f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu default: 461f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu return; 462a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu } 463f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 464f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 4656772173d2a49b87a1d209f42fe52b5f830596f99Chih-Chung Chang @TargetApi(ApiHelper.VERSION_CODES.JELLY_BEAN) 466ddf0225a5192a589fc578945f56440b09bf74d12John Reck private void setupNfcBeamPush() { 467ddf0225a5192a589fc578945f56440b09bf74d12John Reck if (!ApiHelper.HAS_SET_BEAM_PUSH_URIS) return; 468ddf0225a5192a589fc578945f56440b09bf74d12John Reck 469ddf0225a5192a589fc578945f56440b09bf74d12John Reck NfcAdapter adapter = NfcAdapter.getDefaultAdapter(mActivity); 470ddf0225a5192a589fc578945f56440b09bf74d12John Reck if (adapter != null) { 471ddf0225a5192a589fc578945f56440b09bf74d12John Reck adapter.setBeamPushUrisCallback(new CreateBeamUrisCallback() { 472ddf0225a5192a589fc578945f56440b09bf74d12John Reck @Override 473ddf0225a5192a589fc578945f56440b09bf74d12John Reck public Uri[] createBeamUris(NfcEvent event) { 474ddf0225a5192a589fc578945f56440b09bf74d12John Reck return mNfcPushUris; 475ddf0225a5192a589fc578945f56440b09bf74d12John Reck } 476ddf0225a5192a589fc578945f56440b09bf74d12John Reck }, mActivity); 477fc86994f86f8cfb31e151c9e730dc1e9dc7b3349Yuli Huang } 478fc86994f86f8cfb31e151c9e730dc1e9dc7b3349Yuli Huang } 479fc86994f86f8cfb31e151c9e730dc1e9dc7b3349Yuli Huang 480ddf0225a5192a589fc578945f56440b09bf74d12John Reck private void setNfcBeamPushUri(Uri uri) { 481ddf0225a5192a589fc578945f56440b09bf74d12John Reck mNfcPushUris[0] = uri; 482ddf0225a5192a589fc578945f56440b09bf74d12John Reck } 483ddf0225a5192a589fc578945f56440b09bf74d12John Reck 484fb5571987f2555b04731b6f3e1c479efc16d542aWu-cheng Li private Intent createShareIntent(Path path) { 485fb5571987f2555b04731b6f3e1c479efc16d542aWu-cheng Li DataManager manager = mActivity.getDataManager(); 486fb5571987f2555b04731b6f3e1c479efc16d542aWu-cheng Li int type = manager.getMediaType(path); 4874f32d514ee7474d867d04bf3934f9e11e9e92783Mangesh Ghiware int support = manager.getSupportedOperations(path); 4884f32d514ee7474d867d04bf3934f9e11e9e92783Mangesh Ghiware boolean isPanorama = (support & MediaObject.SUPPORT_PANORAMA) != 0; 489fb5571987f2555b04731b6f3e1c479efc16d542aWu-cheng Li Intent intent = new Intent(Intent.ACTION_SEND); 4904f32d514ee7474d867d04bf3934f9e11e9e92783Mangesh Ghiware intent.setType(MenuExecutor.getMimeType(type, isPanorama)); 4912bb717f1ea38e2ce33dd102a23afe6bfacb5675cOwen Lin Uri uri = manager.getContentUri(path); 492fb5571987f2555b04731b6f3e1c479efc16d542aWu-cheng Li intent.putExtra(Intent.EXTRA_STREAM, uri); 493fb5571987f2555b04731b6f3e1c479efc16d542aWu-cheng Li return intent; 494fb5571987f2555b04731b6f3e1c479efc16d542aWu-cheng Li 495fb5571987f2555b04731b6f3e1c479efc16d542aWu-cheng Li } 496fb5571987f2555b04731b6f3e1c479efc16d542aWu-cheng Li 497a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu private void launchPhotoEditor() { 498a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu MediaItem current = mModel.getMediaItem(0); 499a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu if (current == null) return; 500a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu 501a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu Intent intent = new Intent(ACTION_NEXTGEN_EDIT); 502a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu intent.setData(mActivity.getDataManager().getContentUri(current.getPath())).setFlags( 503a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu Intent.FLAG_GRANT_READ_URI_PERMISSION); 504a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu if (mActivity.getPackageManager() 505a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu .queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY).size() == 0) { 506a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu intent.setAction(Intent.ACTION_EDIT); 507a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu } 508a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu ((Activity) mActivity).startActivityForResult(Intent.createChooser(intent, null), 509a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu REQUEST_EDIT); 510a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu } 511a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu 5122bb717f1ea38e2ce33dd102a23afe6bfacb5675cOwen Lin private void updateShareURI(Path path) { 51324081fe26ca25448ddb9c8f9cc7f406d26344decOwen Lin DataManager manager = mActivity.getDataManager(); 51424081fe26ca25448ddb9c8f9cc7f406d26344decOwen Lin Uri uri = manager.getContentUri(path); 51524081fe26ca25448ddb9c8f9cc7f406d26344decOwen Lin mActionBar.setShareIntent(createShareIntent(path)); 516ddf0225a5192a589fc578945f56440b09bf74d12John Reck setNfcBeamPushUri(uri); 517cf46a3abc26aac7cdb6b6993aeade053304b71d9Ray Chen } 518cf46a3abc26aac7cdb6b6993aeade053304b71d9Ray Chen 519f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private void updateCurrentPhoto(MediaItem photo) { 520f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (mCurrentPhoto == photo) return; 521f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mCurrentPhoto = photo; 522f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (mCurrentPhoto == null) return; 523f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin updateMenuOperations(); 524ed46d77c16cd80357f4a0feada2435dfba8104a6Yuli Huang updateTitle(); 525f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu if (mBottomControls != null) mBottomControls.refresh(); 526f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (mShowDetails) { 527995c4566bed7df1aa48ba7e1351f964efa73880bMichael Kolb mDetailsHelper.reloadDetails(); 528f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 529898a2f4540635528a0916b0a6b0a177869854ae9Wu-cheng Li if ((mSecureAlbum == null) 530898a2f4540635528a0916b0a6b0a177869854ae9Wu-cheng Li && (photo.getSupportedOperations() & MediaItem.SUPPORT_SHARE) != 0) { 53115b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang updateShareURI(photo.getPath()); 53215b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang } 533f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 534f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 535ed46d77c16cd80357f4a0feada2435dfba8104a6Yuli Huang private void updateTitle() { 536ed46d77c16cd80357f4a0feada2435dfba8104a6Yuli Huang if (mCurrentPhoto == null) return; 537ed46d77c16cd80357f4a0feada2435dfba8104a6Yuli Huang boolean showTitle = mActivity.getAndroidContext().getResources().getBoolean( 538ed46d77c16cd80357f4a0feada2435dfba8104a6Yuli Huang R.bool.show_action_bar_title); 5392bb717f1ea38e2ce33dd102a23afe6bfacb5675cOwen Lin if (showTitle && mCurrentPhoto.getName() != null) { 540ed46d77c16cd80357f4a0feada2435dfba8104a6Yuli Huang mActionBar.setTitle(mCurrentPhoto.getName()); 5412bb717f1ea38e2ce33dd102a23afe6bfacb5675cOwen Lin } else { 542ed46d77c16cd80357f4a0feada2435dfba8104a6Yuli Huang mActionBar.setTitle(""); 5432bb717f1ea38e2ce33dd102a23afe6bfacb5675cOwen Lin } 544ed46d77c16cd80357f4a0feada2435dfba8104a6Yuli Huang } 545ed46d77c16cd80357f4a0feada2435dfba8104a6Yuli Huang 546f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private void updateMenuOperations() { 54724081fe26ca25448ddb9c8f9cc7f406d26344decOwen Lin Menu menu = mActionBar.getMenu(); 54824081fe26ca25448ddb9c8f9cc7f406d26344decOwen Lin 54924081fe26ca25448ddb9c8f9cc7f406d26344decOwen Lin // it could be null if onCreateActionBar has not been called yet 55024081fe26ca25448ddb9c8f9cc7f406d26344decOwen Lin if (menu == null) return; 55124081fe26ca25448ddb9c8f9cc7f406d26344decOwen Lin 5527eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu setGridButtonVisibility(mPhotoView.getFilmMode()); 5537eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu 55424081fe26ca25448ddb9c8f9cc7f406d26344decOwen Lin MenuItem item = menu.findItem(R.id.action_slideshow); 555898a2f4540635528a0916b0a6b0a177869854ae9Wu-cheng Li item.setVisible((mSecureAlbum == null) && canDoSlideShow()); 5562066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang if (mCurrentPhoto == null) return; 55724081fe26ca25448ddb9c8f9cc7f406d26344decOwen Lin 558f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin int supportedOperations = mCurrentPhoto.getSupportedOperations(); 559898a2f4540635528a0916b0a6b0a177869854ae9Wu-cheng Li if (mSecureAlbum != null) { 56024081fe26ca25448ddb9c8f9cc7f406d26344decOwen Lin supportedOperations &= MediaObject.SUPPORT_DELETE; 561898a2f4540635528a0916b0a6b0a177869854ae9Wu-cheng Li } else if (!GalleryUtils.isEditorAvailable(mActivity, "image/*")) { 562f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin supportedOperations &= ~MediaObject.SUPPORT_EDIT; 563f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 56424081fe26ca25448ddb9c8f9cc7f406d26344decOwen Lin MenuExecutor.updateMenuOperation(menu, supportedOperations); 565f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 566f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 5672066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang private boolean canDoSlideShow() { 5682066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang if (mMediaSet == null || mCurrentPhoto == null) { 5692066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang return false; 5702066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang } 5712066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang if (mCurrentPhoto.getMediaType() != MediaObject.MEDIA_TYPE_IMAGE) { 5722066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang return false; 5732066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang } 5746b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang if (MtpSource.isMtpPath(mOriginalSetPathString)) { 5752066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang return false; 5762066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang } 5772066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang return true; 5782066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang } 5792066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang 58061f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang ////////////////////////////////////////////////////////////////////////// 58161f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang // Action Bar show/hide management 58261f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang ////////////////////////////////////////////////////////////////////////// 58361f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang 584f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private void showBars() { 585f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (mShowBars) return; 586f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mShowBars = true; 587e6251df06f0b3c8f556043f8b725b4b19be7474dChih-Chung Chang mOrientationManager.unlockOrientation(); 588f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mActionBar.show(); 5890b2486cff0c1b951c54325596256b986307f7f3aChih-Chung Chang mActivity.getGLRoot().setLightsOutMode(false); 59061f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang refreshHidingMessage(); 591f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu if (mBottomControls != null) mBottomControls.refresh(); 592f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 593f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 594f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private void hideBars() { 595f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (!mShowBars) return; 596f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mShowBars = false; 597f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mActionBar.hide(); 5980b2486cff0c1b951c54325596256b986307f7f3aChih-Chung Chang mActivity.getGLRoot().setLightsOutMode(true); 59961f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang mHandler.removeMessages(MSG_HIDE_BARS); 600f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu if (mBottomControls != null) mBottomControls.refresh(); 601f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 602f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 603f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private void refreshHidingMessage() { 604f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mHandler.removeMessages(MSG_HIDE_BARS); 6057eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu if (!mIsMenuVisible && !mPhotoView.getFilmMode()) { 606f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mHandler.sendEmptyMessageDelayed(MSG_HIDE_BARS, HIDE_BARS_TIMEOUT); 607f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 608f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 609f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 610aeb3062e84ed28f0e25a73f511f287ae0a3e4294Chih-Chung Chang private boolean canShowBars() { 611aeb3062e84ed28f0e25a73f511f287ae0a3e4294Chih-Chung Chang // No bars if we are showing camera preview. 61256bdcb7272f222fde5e4c6fc133cb490b31c7667Bobby Georgescu if (mAppBridge != null && mCurrentIndex == 0 61356bdcb7272f222fde5e4c6fc133cb490b31c7667Bobby Georgescu && !mPhotoView.getFilmMode()) return false; 61456bdcb7272f222fde5e4c6fc133cb490b31c7667Bobby Georgescu 615aeb3062e84ed28f0e25a73f511f287ae0a3e4294Chih-Chung Chang // No bars if it's not allowed. 616aeb3062e84ed28f0e25a73f511f287ae0a3e4294Chih-Chung Chang if (!mActionBarAllowed) return false; 617aeb3062e84ed28f0e25a73f511f287ae0a3e4294Chih-Chung Chang 618aeb3062e84ed28f0e25a73f511f287ae0a3e4294Chih-Chung Chang return true; 619aeb3062e84ed28f0e25a73f511f287ae0a3e4294Chih-Chung Chang } 620aeb3062e84ed28f0e25a73f511f287ae0a3e4294Chih-Chung Chang 621e6251df06f0b3c8f556043f8b725b4b19be7474dChih-Chung Chang private void wantBars() { 622e6251df06f0b3c8f556043f8b725b4b19be7474dChih-Chung Chang if (canShowBars()) showBars(); 623e6251df06f0b3c8f556043f8b725b4b19be7474dChih-Chung Chang } 624e6251df06f0b3c8f556043f8b725b4b19be7474dChih-Chung Chang 62561f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang private void toggleBars() { 626f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (mShowBars) { 627f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin hideBars(); 628aeb3062e84ed28f0e25a73f511f287ae0a3e4294Chih-Chung Chang } else { 629e6251df06f0b3c8f556043f8b725b4b19be7474dChih-Chung Chang if (canShowBars()) showBars(); 630f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 631f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 632f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 63361f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang private void updateBars() { 634e6251df06f0b3c8f556043f8b725b4b19be7474dChih-Chung Chang if (!canShowBars()) { 63561f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang hideBars(); 63661f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang } 637f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 638f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 639f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 6402ef46ed28b28b355d7f3f1432c7b1196b832a859Chih-Chung Chang public void onOrientationCompensationChanged() { 6412ef46ed28b28b355d7f3f1432c7b1196b832a859Chih-Chung Chang mActivity.getGLRoot().requestLayoutContentPane(); 642bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang } 643bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang 644bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang @Override 645f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin protected void onBackPressed() { 646f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (mShowDetails) { 647f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin hideDetails(); 6483b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang } else if (mAppBridge == null || !switchWithCaptureAnimation(-1)) { 649bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang // We are leaving this page. Set the result now. 650bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang setResult(); 6517eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu if (mStartInFilmstrip && !mPhotoView.getFilmMode()) { 6527eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu mPhotoView.setFilmMode(true); 6537eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu } else if (mTreatBackAsUp) { 65454fe6202b6f7d233e7645c121321fe0f3d20fc8bYuli Huang onUpPressed(); 65554fe6202b6f7d233e7645c121321fe0f3d20fc8bYuli Huang } else { 65654fe6202b6f7d233e7645c121321fe0f3d20fc8bYuli Huang super.onBackPressed(); 65754fe6202b6f7d233e7645c121321fe0f3d20fc8bYuli Huang } 658f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 659f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 660f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 661b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang private void onUpPressed() { 662833f775afc9515567dc5aaf0cafe20e006e77545Bobby Georgescu if ((mStartInFilmstrip || mAppBridge != null) 663833f775afc9515567dc5aaf0cafe20e006e77545Bobby Georgescu && !mPhotoView.getFilmMode()) { 6647eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu mPhotoView.setFilmMode(true); 6657eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu return; 6667eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu } 6677eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu 668b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang if (mActivity.getStateManager().getStateCount() > 1) { 6697eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu setResult(); 670b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang super.onBackPressed(); 671ba12eae90b5b1a80ee002aa0df8c5c5189c4faa3Chih-Chung Chang return; 67266ca848b2f58b813d366642088d274a1b7c4a90cChih-Chung Chang } 67366ca848b2f58b813d366642088d274a1b7c4a90cChih-Chung Chang 67466ca848b2f58b813d366642088d274a1b7c4a90cChih-Chung Chang if (mOriginalSetPathString == null) return; 67566ca848b2f58b813d366642088d274a1b7c4a90cChih-Chung Chang 67666ca848b2f58b813d366642088d274a1b7c4a90cChih-Chung Chang if (mAppBridge == null) { 677b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang // We're in view mode so set up the stacks on our own. 678b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang Bundle data = new Bundle(getData()); 679b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang data.putString(AlbumPage.KEY_MEDIA_PATH, mOriginalSetPathString); 680b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang data.putString(AlbumPage.KEY_PARENT_MEDIA_PATH, 681b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang mActivity.getDataManager().getTopSetPath( 682b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang DataManager.INCLUDE_ALL)); 683b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang mActivity.getStateManager().switchState(this, AlbumPage.class, data); 68466ca848b2f58b813d366642088d274a1b7c4a90cChih-Chung Chang } else { 685833f775afc9515567dc5aaf0cafe20e006e77545Bobby Georgescu GalleryUtils.startGalleryActivity(mActivity); 686b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang } 687b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang } 688b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang 689bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang private void setResult() { 690bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang Intent result = null; 6917eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu result = new Intent(); 6927eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu result.putExtra(KEY_RETURN_INDEX_HINT, mCurrentIndex); 693bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang setStateResult(Activity.RESULT_OK, result); 694bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang } 695bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang 696bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang ////////////////////////////////////////////////////////////////////////// 697bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang // AppBridge.Server interface 698bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang ////////////////////////////////////////////////////////////////////////// 699bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang 700bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang @Override 7012ef46ed28b28b355d7f3f1432c7b1196b832a859Chih-Chung Chang public void setCameraRelativeFrame(Rect frame) { 7022ef46ed28b28b355d7f3f1432c7b1196b832a859Chih-Chung Chang mPhotoView.setCameraRelativeFrame(frame); 703bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang } 704bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang 705bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang @Override 7062c6173822a612597c79be41b126367ddfbb5d518Chih-Chung Chang public boolean switchWithCaptureAnimation(int offset) { 7072c6173822a612597c79be41b126367ddfbb5d518Chih-Chung Chang return mPhotoView.switchWithCaptureAnimation(offset); 7082c6173822a612597c79be41b126367ddfbb5d518Chih-Chung Chang } 7092c6173822a612597c79be41b126367ddfbb5d518Chih-Chung Chang 710f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 7116575794a9c09f22d5721e212c093e0a2df376d0cChih-Chung Chang public void setSwipingEnabled(boolean enabled) { 7126575794a9c09f22d5721e212c093e0a2df376d0cChih-Chung Chang mPhotoView.setSwipingEnabled(enabled); 7136575794a9c09f22d5721e212c093e0a2df376d0cChih-Chung Chang } 7146575794a9c09f22d5721e212c093e0a2df376d0cChih-Chung Chang 7156575794a9c09f22d5721e212c093e0a2df376d0cChih-Chung Chang @Override 7163b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang public void notifyScreenNailChanged() { 7173b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang mScreenNailItem.setScreenNail(mAppBridge.attachScreenNail()); 7183b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang mScreenNailSet.notifyChange(); 7193b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang } 7203b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang 7213b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang @Override 722a0ce682e40c39ce046c48d8a7f989fff01bb9f2cWu-cheng Li public void addSecureAlbumItem(boolean isVideo, int id) { 723a0ce682e40c39ce046c48d8a7f989fff01bb9f2cWu-cheng Li mSecureAlbum.addMediaItem(isVideo, id); 724a0ce682e40c39ce046c48d8a7f989fff01bb9f2cWu-cheng Li } 725a0ce682e40c39ce046c48d8a7f989fff01bb9f2cWu-cheng Li 726a0ce682e40c39ce046c48d8a7f989fff01bb9f2cWu-cheng Li @Override 727f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin protected boolean onCreateActionBar(Menu menu) { 728b21b8e58a604f6c701245d84b141b5b87663192bOwen Lin mActionBar.createActionBarMenu(R.menu.photo, menu); 729f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin updateMenuOperations(); 730ed46d77c16cd80357f4a0feada2435dfba8104a6Yuli Huang updateTitle(); 731b21b8e58a604f6c701245d84b141b5b87663192bOwen Lin return true; 732f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 733f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 734d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin private MenuExecutor.ProgressListener mConfirmDialogListener = 735d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin new MenuExecutor.ProgressListener() { 736d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin @Override 737d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin public void onProgressUpdate(int index) {} 738d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin 739d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin @Override 740d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin public void onProgressComplete(int result) {} 741d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin 742d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin @Override 743d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin public void onConfirmDialogShown() { 744d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin mHandler.removeMessages(MSG_HIDE_BARS); 745d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin } 746d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin 747d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin @Override 748d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin public void onConfirmDialogDismissed(boolean confirmed) { 749d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin refreshHidingMessage(); 750d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin } 751ba50b9420e64731fd5aa8b1410e1f36457a1635aBobby Georgescu 752ba50b9420e64731fd5aa8b1410e1f36457a1635aBobby Georgescu @Override 753ba50b9420e64731fd5aa8b1410e1f36457a1635aBobby Georgescu public void onProgressStart() {} 754d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin }; 755d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin 756f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 757f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin protected boolean onItemSelected(MenuItem item) { 758d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu if (mModel == null) return true; 759d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin refreshHidingMessage(); 760616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin MediaItem current = mModel.getMediaItem(0); 761f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 762f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (current == null) { 763f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin // item is not ready, ignore 764f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return true; 765f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 766f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 767f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin int currentIndex = mModel.getCurrentIndex(); 768f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin Path path = current.getPath(); 769f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 770f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin DataManager manager = mActivity.getDataManager(); 771f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin int action = item.getItemId(); 7729a033b07b8e0d9fe7419b7a0d876e9c7febf43c8Ray Chen String confirmMsg = null; 773f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin switch (action) { 77484c220f10a643927c8a2126de8a755d8d7f7ec9eRay Chen case android.R.id.home: { 775b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang onUpPressed(); 77684c220f10a643927c8a2126de8a755d8d7f7ec9eRay Chen return true; 77784c220f10a643927c8a2126de8a755d8d7f7ec9eRay Chen } 7787eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu case R.id.action_grid: { 7797eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu if (mStartedFromAlbumPage) { 7807eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu onUpPressed(); 7817eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu } else { 7827eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu preparePhotoFallbackView(); 7837eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu Bundle data = new Bundle(getData()); 7847eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu data.putString(AlbumPage.KEY_MEDIA_PATH, mOriginalSetPathString); 7857eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu data.putString(AlbumPage.KEY_PARENT_MEDIA_PATH, 7867eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu mActivity.getDataManager().getTopSetPath( 7877eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu DataManager.INCLUDE_ALL)); 78800ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu 789e06c9f109f06813ca1f8a0abb549d51aefd4973dBobby Georgescu // We only show cluster menu in the first AlbumPage in stack 79000ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu // TODO: Enable this when running from the camera app 791e06c9f109f06813ca1f8a0abb549d51aefd4973dBobby Georgescu boolean inAlbum = mActivity.getStateManager().hasStateClass(AlbumPage.class); 79200ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu data.putBoolean(AlbumPage.KEY_SHOW_CLUSTER_MENU, !inAlbum 79300ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu && mAppBridge == null); 79400ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu 79500ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu data.putBoolean(PhotoPage.KEY_APP_BRIDGE, mAppBridge != null); 79600ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu 79700ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu // Account for live preview being first item 79800ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu mActivity.getTransitionStore().put(KEY_RETURN_INDEX_HINT, 79900ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu mAppBridge != null ? mCurrentIndex - 1 : mCurrentIndex); 80000ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu 8017eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu mActivity.getStateManager().startState(AlbumPage.class, data); 8027eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu } 8037eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu return true; 8047eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu } 805f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin case R.id.action_slideshow: { 806f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin Bundle data = new Bundle(); 8076cf807453fb58ccd4cc513ff187b306c7090e67cOwen Lin data.putString(SlideshowPage.KEY_SET_PATH, mMediaSet.getPath().toString()); 808604f053d040782159b61d3b74ee533bc2c0ccdd0Ray Chen data.putString(SlideshowPage.KEY_ITEM_PATH, path.toString()); 809f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin data.putInt(SlideshowPage.KEY_PHOTO_INDEX, currentIndex); 810f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin data.putBoolean(SlideshowPage.KEY_REPEAT, true); 811f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mActivity.getStateManager().startStateForResult( 812f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin SlideshowPage.class, REQUEST_SLIDESHOW, data); 813f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return true; 814f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 815f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin case R.id.action_crop: { 816898a2f4540635528a0916b0a6b0a177869854ae9Wu-cheng Li Activity activity = mActivity; 817f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin Intent intent = new Intent(CropImage.CROP_ACTION); 818f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin intent.setClass(activity, CropImage.class); 819f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin intent.setData(manager.getContentUri(path)); 820f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin activity.startActivityForResult(intent, PicasaSource.isPicasaImage(current) 821f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin ? REQUEST_CROP_PICASA 822f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin : REQUEST_CROP); 823f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return true; 824f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 82550ea2d2938218ac6b2039f0e42998cfbbc45d1f1Teng-Hui Zhu case R.id.action_trim: { 8263f1f1baf3a674927e25cd5cd885fb372796bd3a0Teng-Hui Zhu Intent intent = new Intent(mActivity, TrimVideo.class); 8273f1f1baf3a674927e25cd5cd885fb372796bd3a0Teng-Hui Zhu intent.setData(manager.getContentUri(path)); 82815ff1b1ca52bea348b8a490b5b5abe53fa43eaf2Teng-Hui Zhu // We need the file path to wrap this into a RandomAccessFile. 82915ff1b1ca52bea348b8a490b5b5abe53fa43eaf2Teng-Hui Zhu intent.putExtra(KEY_MEDIA_ITEM_PATH, current.getFilePath()); 8303f1f1baf3a674927e25cd5cd885fb372796bd3a0Teng-Hui Zhu mActivity.startActivityForResult(intent, REQUEST_TRIM); 83150ea2d2938218ac6b2039f0e42998cfbbc45d1f1Teng-Hui Zhu return true; 83250ea2d2938218ac6b2039f0e42998cfbbc45d1f1Teng-Hui Zhu } 833f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang case R.id.action_edit: { 834a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu launchPhotoEditor(); 835f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang return true; 836f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang } 837f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin case R.id.action_details: { 838f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (mShowDetails) { 839f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin hideDetails(); 840f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } else { 841995c4566bed7df1aa48ba7e1351f964efa73880bMichael Kolb showDetails(); 842f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 843f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return true; 844f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 84567098d1a72fd04e2af06d3a5939cde28c65f70d9Ray Chen case R.id.action_delete: 8469a033b07b8e0d9fe7419b7a0d876e9c7febf43c8Ray Chen confirmMsg = mActivity.getResources().getQuantityString( 8479a033b07b8e0d9fe7419b7a0d876e9c7febf43c8Ray Chen R.plurals.delete_selection, 1); 848f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin case R.id.action_setas: 849f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin case R.id.action_rotate_ccw: 850f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin case R.id.action_rotate_cw: 851f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin case R.id.action_show_on_map: 852f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mSelectionManager.deSelectAll(); 853f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mSelectionManager.toggle(path); 854d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin mMenuExecutor.onMenuClicked(item, confirmMsg, mConfirmDialogListener); 855f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return true; 856f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin case R.id.action_import: 857f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mSelectionManager.deSelectAll(); 858f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mSelectionManager.toggle(path); 8599a033b07b8e0d9fe7419b7a0d876e9c7febf43c8Ray Chen mMenuExecutor.onMenuClicked(item, confirmMsg, 860f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin new ImportCompleteListener(mActivity)); 861f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return true; 862fb5571987f2555b04731b6f3e1c479efc16d542aWu-cheng Li case R.id.action_share: 863898a2f4540635528a0916b0a6b0a177869854ae9Wu-cheng Li Activity activity = mActivity; 864fb5571987f2555b04731b6f3e1c479efc16d542aWu-cheng Li Intent intent = createShareIntent(mCurrentPhoto.getPath()); 865fb5571987f2555b04731b6f3e1c479efc16d542aWu-cheng Li activity.startActivity(Intent.createChooser(intent, 866fb5571987f2555b04731b6f3e1c479efc16d542aWu-cheng Li activity.getString(R.string.share))); 867fb5571987f2555b04731b6f3e1c479efc16d542aWu-cheng Li return true; 868f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin default : 869f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return false; 870f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 871f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 872f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 873f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private void hideDetails() { 874f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mShowDetails = false; 8754105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen mDetailsHelper.hide(); 876f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 877f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 878995c4566bed7df1aa48ba7e1351f964efa73880bMichael Kolb private void showDetails() { 879f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mShowDetails = true; 8804105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen if (mDetailsHelper == null) { 8814105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen mDetailsHelper = new DetailsHelper(mActivity, mRootPane, new MyDetailsSource()); 8824105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen mDetailsHelper.setCloseListener(new CloseListener() { 88306c6401eededc2ec842ba4994a838c2ded0a666cPin Ting @Override 884f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void onClose() { 885f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin hideDetails(); 886f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 887f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin }); 888f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 8894105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen mDetailsHelper.show(); 890f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 891f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 892bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang //////////////////////////////////////////////////////////////////////////// 893bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang // Callbacks from PhotoView 894bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang //////////////////////////////////////////////////////////////////////////// 895bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang @Override 896f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void onSingleTapUp(int x, int y) { 897bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang if (mAppBridge != null) { 898bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang if (mAppBridge.onSingleTapUp(x, y)) return; 899014d9586d8145a33f4e99eaad570587f6d650026Wu-cheng Li } 900014d9586d8145a33f4e99eaad570587f6d650026Wu-cheng Li 901616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin MediaItem item = mModel.getMediaItem(0); 902b5dc542fbaeaf99bebdcf775ef0e034e89e88eaeWu-cheng Li if (item == null || item == mScreenNailItem) { 903b5dc542fbaeaf99bebdcf775ef0e034e89e88eaeWu-cheng Li // item is not ready or it is camera preview, ignore 904f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return; 905f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 906f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 9078868aa1b2d199e7fa869c9c5fad3079175621002Wu-cheng Li int supported = item.getSupportedOperations(); 908898a2f4540635528a0916b0a6b0a177869854ae9Wu-cheng Li boolean playVideo = (mSecureAlbum == null) && 9098868aa1b2d199e7fa869c9c5fad3079175621002Wu-cheng Li ((supported & MediaItem.SUPPORT_PLAY) != 0); 910bef18c1e167f5835c8f854e76a91da63b700f93bWu-cheng Li boolean viewPanorama = (mSecureAlbum == null) && 9118868aa1b2d199e7fa869c9c5fad3079175621002Wu-cheng Li ((supported & MediaItem.SUPPORT_PANORAMA) != 0); 9128868aa1b2d199e7fa869c9c5fad3079175621002Wu-cheng Li boolean unlock = ((supported & MediaItem.SUPPORT_UNLOCK) != 0); 913f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 914f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (playVideo) { 915f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin // determine if the point is at center (1/6) of the photo view. 916f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin // (The position of the "play" icon is at center (1/6) of the photo) 917f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin int w = mPhotoView.getWidth(); 918f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin int h = mPhotoView.getHeight(); 919f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin playVideo = (Math.abs(x - w / 2) * 12 <= w) 920f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin && (Math.abs(y - h / 2) * 12 <= h); 921f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 922f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 923f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (playVideo) { 924898a2f4540635528a0916b0a6b0a177869854ae9Wu-cheng Li playVideo(mActivity, item.getPlayUri(), item.getName()); 92583be4e0c9b8e3372eff8f9b1a396afd961b72921Angus Kong } else if (viewPanorama) { 926f8a39c644637a15b9291eb9299762b8cf91cd76aGeorge Mount LightCycleHelper.viewPanorama(mActivity, item.getContentUri()); 9278868aa1b2d199e7fa869c9c5fad3079175621002Wu-cheng Li } else if (unlock) { 9288868aa1b2d199e7fa869c9c5fad3079175621002Wu-cheng Li mActivity.getStateManager().finishState(this); 929f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } else { 93061f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang toggleBars(); 931f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 932f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 933f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 934bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang @Override 935bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang public void lockOrientation() { 936bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang mHandler.sendEmptyMessage(MSG_LOCK_ORIENTATION); 937bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang } 938bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang 939bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang @Override 940bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang public void unlockOrientation() { 94106c6401eededc2ec842ba4994a838c2ded0a666cPin Ting mHandler.sendEmptyMessage(MSG_UNLOCK_ORIENTATION); 942bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang } 943bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang 944bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang @Override 94561f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang public void onActionBarAllowed(boolean allowed) { 94661f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang mActionBarAllowed = allowed; 94761f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang mHandler.sendEmptyMessage(MSG_UPDATE_ACTION_BAR); 94861f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang } 94961f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang 95061f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang @Override 951e6251df06f0b3c8f556043f8b725b4b19be7474dChih-Chung Chang public void onActionBarWanted() { 952e6251df06f0b3c8f556043f8b725b4b19be7474dChih-Chung Chang mHandler.sendEmptyMessage(MSG_WANT_BARS); 953e6251df06f0b3c8f556043f8b725b4b19be7474dChih-Chung Chang } 954e6251df06f0b3c8f556043f8b725b4b19be7474dChih-Chung Chang 955e6251df06f0b3c8f556043f8b725b4b19be7474dChih-Chung Chang @Override 956bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang public void onFullScreenChanged(boolean full) { 957bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang Message m = mHandler.obtainMessage( 958bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang MSG_ON_FULL_SCREEN_CHANGED, full ? 1 : 0, 0); 959bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang m.sendToTarget(); 960bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang } 961bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang 9626b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang // How we do delete/undo: 9636b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang // 9646b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang // When the user choose to delete a media item, we just tell the 9656b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang // FilterDeleteSet to hide that item. If the user choose to undo it, we 9666b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang // again tell FilterDeleteSet not to hide it. If the user choose to commit 9676b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang // the deletion, we then actually delete the media item. 9686b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang @Override 9696b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang public void onDeleteImage(Path path, int offset) { 9706118af9ddad8acc050133154f8f60c842c7f9bfaChih-Chung Chang onCommitDeleteImage(); // commit the previous deletion 9716b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang mDeletePath = path; 9726b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang mDeleteIsFocus = (offset == 0); 9736118af9ddad8acc050133154f8f60c842c7f9bfaChih-Chung Chang mMediaSet.addDeletion(path, mCurrentIndex + offset); 9746b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang } 9756b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang 9766b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang @Override 9776b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang public void onUndoDeleteImage() { 9786118af9ddad8acc050133154f8f60c842c7f9bfaChih-Chung Chang if (mDeletePath == null) return; 9796b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang // If the deletion was done on the focused item, we want the model to 9806b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang // focus on it when it is undeleted. 9816b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang if (mDeleteIsFocus) mModel.setFocusHintPath(mDeletePath); 9826118af9ddad8acc050133154f8f60c842c7f9bfaChih-Chung Chang mMediaSet.removeDeletion(mDeletePath); 9836b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang mDeletePath = null; 9846b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang } 9856b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang 9866b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang @Override 9876b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang public void onCommitDeleteImage() { 9886b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang if (mDeletePath == null) return; 9896b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang mSelectionManager.deSelectAll(); 9906b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang mSelectionManager.toggle(mDeletePath); 9916b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang mMenuExecutor.onMenuClicked(R.id.action_delete, null, true, false); 9926b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang mDeletePath = null; 9936b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang } 9946b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang 995f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public static void playVideo(Activity activity, Uri uri, String title) { 996f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin try { 997f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin Intent intent = new Intent(Intent.ACTION_VIEW) 998a3871050845b4921379add2b126add3cfbab1109Ray Chen .setDataAndType(uri, "video/*") 999a3871050845b4921379add2b126add3cfbab1109Ray Chen .putExtra(Intent.EXTRA_TITLE, title) 1000a3871050845b4921379add2b126add3cfbab1109Ray Chen .putExtra(MovieActivity.KEY_TREAT_UP_AS_BACK, true); 100171cd89a38752bc22ae0ec2df965e4280b776623cChih-Chung Chang activity.startActivityForResult(intent, REQUEST_PLAY_VIDEO); 1002f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } catch (ActivityNotFoundException e) { 1003f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin Toast.makeText(activity, activity.getString(R.string.video_err), 1004f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin Toast.LENGTH_SHORT).show(); 1005f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 1006f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 1007f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 1008f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang private void setCurrentPhotoByIntent(Intent intent) { 1009f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang if (intent == null) return; 1010f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang Path path = mApplication.getDataManager() 1011f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang .findPathByUri(intent.getData(), intent.getType()); 1012f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang if (path != null) { 1013f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang mModel.setCurrentPhoto(path, mCurrentIndex); 1014f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang } 1015f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang } 1016f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang 1017f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 1018f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin protected void onStateResult(int requestCode, int resultCode, Intent data) { 101971cd89a38752bc22ae0ec2df965e4280b776623cChih-Chung Chang mHasActivityResult = true; 1020f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin switch (requestCode) { 1021f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang case REQUEST_EDIT: 1022f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang setCurrentPhotoByIntent(data); 1023f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang break; 1024f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin case REQUEST_CROP: 1025f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (resultCode == Activity.RESULT_OK) { 1026f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang setCurrentPhotoByIntent(data); 1027f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 1028f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin break; 1029f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin case REQUEST_CROP_PICASA: { 1030f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang if (resultCode == Activity.RESULT_OK) { 1031f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang Context context = mActivity.getAndroidContext(); 103288cc2ca5f5596762a5546ec7426756f2036be455Yuli Huang String message = context.getString(R.string.crop_saved, 1033f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang context.getString(R.string.folder_download)); 1034f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang Toast.makeText(context, message, Toast.LENGTH_SHORT).show(); 1035f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang } 1036f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin break; 1037f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 1038f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin case REQUEST_SLIDESHOW: { 1039f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (data == null) break; 1040f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin String path = data.getStringExtra(SlideshowPage.KEY_ITEM_PATH); 1041f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin int index = data.getIntExtra(SlideshowPage.KEY_PHOTO_INDEX, 0); 1042f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (path != null) { 1043f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mModel.setCurrentPhoto(Path.fromString(path), index); 1044f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 1045f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 1046f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 1047f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 1048f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 104914d3289b4867c21da93ec4032119c0091bc78c30George Mount @Override 105014d3289b4867c21da93ec4032119c0091bc78c30George Mount protected void clearStateResult() { 105114d3289b4867c21da93ec4032119c0091bc78c30George Mount mHasActivityResult = false; 105214d3289b4867c21da93ec4032119c0091bc78c30George Mount } 105314d3289b4867c21da93ec4032119c0091bc78c30George Mount 1054616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin private class PreparePhotoFallback implements OnGLIdleListener { 1055616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin private PhotoFallbackEffect mPhotoFallback = new PhotoFallbackEffect(); 1056616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin private boolean mResultReady = false; 1057616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin 1058616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin public synchronized PhotoFallbackEffect get() { 1059616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin while (!mResultReady) { 1060616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin Utils.waitWithoutInterrupt(this); 1061616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin } 1062616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin return mPhotoFallback; 1063616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin } 1064616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin 1065616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin @Override 1066616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin public boolean onGLIdle(GLCanvas canvas, boolean renderRequested) { 1067616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin mPhotoFallback = mPhotoView.buildFallbackEffect(mRootPane, canvas); 1068616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin synchronized (this) { 1069616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin mResultReady = true; 1070616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin notifyAll(); 1071616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin } 1072616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin return false; 1073616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin } 1074616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin } 1075616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin 1076616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin private void preparePhotoFallbackView() { 1077616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin GLRoot root = mActivity.getGLRoot(); 1078616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin PreparePhotoFallback task = new PreparePhotoFallback(); 1079616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin root.unlockRenderThread(); 1080616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin PhotoFallbackEffect anim; 1081616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin try { 1082616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin root.addOnGLIdleListener(task); 1083616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin anim = task.get(); 1084616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin } finally { 1085616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin root.lockRenderThread(); 1086616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin } 1087616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin mActivity.getTransitionStore().put( 1088616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin AlbumPage.KEY_RESUME_ANIMATION, anim); 1089616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin } 1090616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin 1091f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 1092f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void onPause() { 1093d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin super.onPause(); 1094d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin mIsActive = false; 1095d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin 1096bd7c016d728853d38f98a3c6077b7bd9b08858b9Yuli Huang mActivity.getGLRoot().unfreeze(); 1097bd7c016d728853d38f98a3c6077b7bd9b08858b9Yuli Huang mHandler.removeMessages(MSG_UNFREEZE_GLROOT); 1098253c5aec7692afdd7880fbd169d4b44d5679cbc0Chih-Chung Chang 10994105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen DetailsHelper.pause(); 1100d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu if (mModel != null) { 1101d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu if (isFinishing()) preparePhotoFallbackView(); 1102d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu mModel.pause(); 1103d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu } 1104f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mPhotoView.pause(); 1105f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mHandler.removeMessages(MSG_HIDE_BARS); 1106f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mActionBar.removeOnMenuVisibilityListener(mMenuVisibilityListener); 110733ef03776b7734717b16f6fc861b831fb1b1dfacMartijn Coenen 11086b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang onCommitDeleteImage(); 11092785956f8f5654966a41e20f482f4af3057eea3fChih-Chung Chang mMenuExecutor.pause(); 11106118af9ddad8acc050133154f8f60c842c7f9bfaChih-Chung Chang if (mMediaSet != null) mMediaSet.clearDeletion(); 1111f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 1112f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 1113f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 1114bd7c016d728853d38f98a3c6077b7bd9b08858b9Yuli Huang public void onCurrentImageUpdated() { 1115bd7c016d728853d38f98a3c6077b7bd9b08858b9Yuli Huang mActivity.getGLRoot().unfreeze(); 1116bd7c016d728853d38f98a3c6077b7bd9b08858b9Yuli Huang } 1117bd7c016d728853d38f98a3c6077b7bd9b08858b9Yuli Huang 11187eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu private void setGridButtonVisibility(boolean enabled) { 11197eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu Menu menu = mActionBar.getMenu(); 11207eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu if (menu == null) return; 11217eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu MenuItem item = menu.findItem(R.id.action_grid); 1122fc3651d38708c6475b808b6fad27ee66bdd6ee04Wu-cheng Li if (item != null) item.setVisible((mSecureAlbum == null) && enabled); 11237eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu } 11247eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu 11257eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu public void onFilmModeChanged(boolean enabled) { 11267eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu mHandler.sendEmptyMessage(MSG_REFRESH_GRID_BUTTON); 1127f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu mHandler.sendEmptyMessage(MSG_REFRESH_BOTTOM_CONTROLS); 11287eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu if (enabled) { 11297eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu mHandler.removeMessages(MSG_HIDE_BARS); 11307eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu } else { 11317eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu refreshHidingMessage(); 11327eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu } 11337eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu } 11347eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu 11357eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu private void transitionFromAlbumPageIfNeeded() { 11367eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu TransitionStore transitions = mActivity.getTransitionStore(); 11377eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu 11387eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu int albumPageTransition = transitions.get( 11397eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu KEY_ALBUMPAGE_TRANSITION, MSG_ALBUMPAGE_NONE); 11407eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu 114100ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu if (albumPageTransition == MSG_ALBUMPAGE_NONE && mAppBridge != null) { 114200ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu // Generally, resuming the PhotoPage when in Camera should 114300ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu // reset to the capture mode to allow quick photo taking 114400ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu mCurrentIndex = 0; 114500ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu mPhotoView.resetToFirstPicture(); 114600ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu } else { 114700ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu int resumeIndex = transitions.get(KEY_INDEX_HINT, -1); 114800ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu if (resumeIndex >= 0) { 114900ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu if (mAppBridge != null) { 115000ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu // Account for live preview being the first item 115100ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu resumeIndex++; 115200ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu } 115300ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu if (resumeIndex < mMediaSet.getMediaItemCount()) { 115400ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu mCurrentIndex = resumeIndex; 115500ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu mModel.moveTo(mCurrentIndex); 115600ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu } 115700ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu } 115800ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu } 115900ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu 116000ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu if (albumPageTransition == MSG_ALBUMPAGE_RESUMED) { 116100ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu mPhotoView.setFilmMode(mStartInFilmstrip || mAppBridge != null); 116200ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu } else if (albumPageTransition == MSG_ALBUMPAGE_PICKED) { 116300ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu mPhotoView.setFilmMode(false); 11647eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu } 11657eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu 116651bc561e85053abfd7fda695e3cd20710acca85cBobby Georgescu mFadeOutTexture = transitions.get(PreparePageFadeoutTexture.KEY_FADE_TEXTURE); 11677eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu if (mFadeOutTexture != null) { 11687eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu mBackgroundFade.start(); 11697eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu BitmapScreenNail.disableDrawPlaceholder(); 11707eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu mOpenAnimationRect = 11717eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu albumPageTransition == MSG_ALBUMPAGE_NONE ? 11727eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu (Rect) mData.getParcelable(KEY_OPEN_ANIMATION_RECT) : 11737eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu (Rect) transitions.get(KEY_OPEN_ANIMATION_RECT); 11747eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu mPhotoView.setOpenAnimationRect(mOpenAnimationRect); 11757eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu mBackgroundFade.start(); 11767eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu } 11777eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu } 11787eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu 1179bd7c016d728853d38f98a3c6077b7bd9b08858b9Yuli Huang @Override 1180f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin protected void onResume() { 1181f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin super.onResume(); 11827eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu 1183d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu if (mModel == null) { 1184d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu mActivity.getStateManager().finishState(this); 1185d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu return; 1186d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu } 11877eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu transitionFromAlbumPageIfNeeded(); 11887eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu 1189d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin mActivity.getGLRoot().freeze(); 1190f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mIsActive = true; 1191f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin setContentPane(mRootPane); 119204ac045bf8da5082bbb0bdc9ea5f9c9b5b796ad0Yuli Huang 1193f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mModel.resume(); 1194f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mPhotoView.resume(); 1195898a2f4540635528a0916b0a6b0a177869854ae9Wu-cheng Li mActionBar.setDisplayOptions( 1196898a2f4540635528a0916b0a6b0a177869854ae9Wu-cheng Li ((mSecureAlbum == null) && (mSetPathString != null)), true); 1197f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mActionBar.addOnMenuVisibilityListener(mMenuVisibilityListener); 119800ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu if (!mShowBars) { 119900ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu mActionBar.hide(); 120000ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu mActivity.getGLRoot().setLightsOutMode(true); 1201bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang } 120200ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu 120371cd89a38752bc22ae0ec2df965e4280b776623cChih-Chung Chang mHasActivityResult = false; 1204bd7c016d728853d38f98a3c6077b7bd9b08858b9Yuli Huang mHandler.sendEmptyMessageDelayed(MSG_UNFREEZE_GLROOT, UNFREEZE_GLROOT_TIMEOUT); 1205f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 1206f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 120715b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang @Override 120815b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang protected void onDestroy() { 1209bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang if (mAppBridge != null) { 1210253c5aec7692afdd7880fbd169d4b44d5679cbc0Chih-Chung Chang mAppBridge.setServer(null); 12113b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang mScreenNailItem.setScreenNail(null); 1212bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang mAppBridge.detachScreenNail(); 1213bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang mAppBridge = null; 12143b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang mScreenNailSet = null; 12153b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang mScreenNailItem = null; 1216b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang } 1217bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang mOrientationManager.removeListener(this); 12182ef46ed28b28b355d7f3f1432c7b1196b832a859Chih-Chung Chang mActivity.getGLRoot().setOrientationSource(null); 1219f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu if (mBottomControls != null) mBottomControls.cleanup(); 1220aeb3062e84ed28f0e25a73f511f287ae0a3e4294Chih-Chung Chang 1221aeb3062e84ed28f0e25a73f511f287ae0a3e4294Chih-Chung Chang // Remove all pending messages. 1222aeb3062e84ed28f0e25a73f511f287ae0a3e4294Chih-Chung Chang mHandler.removeCallbacksAndMessages(null); 122315b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang super.onDestroy(); 122415b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang } 122515b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang 1226f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private class MyDetailsSource implements DetailsSource { 12276cf807453fb58ccd4cc513ff187b306c7090e67cOwen Lin 12286cf807453fb58ccd4cc513ff187b306c7090e67cOwen Lin @Override 1229f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public MediaDetails getDetails() { 1230616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin return mModel.getMediaItem(0).getDetails(); 1231f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 12326cf807453fb58ccd4cc513ff187b306c7090e67cOwen Lin 12336cf807453fb58ccd4cc513ff187b306c7090e67cOwen Lin @Override 1234f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public int size() { 1235f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return mMediaSet != null ? mMediaSet.getMediaItemCount() : 1; 1236f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 12376cf807453fb58ccd4cc513ff187b306c7090e67cOwen Lin 12386cf807453fb58ccd4cc513ff187b306c7090e67cOwen Lin @Override 1239995c4566bed7df1aa48ba7e1351f964efa73880bMichael Kolb public int setIndex() { 1240995c4566bed7df1aa48ba7e1351f964efa73880bMichael Kolb return mModel.getCurrentIndex(); 12414105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen } 1242f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 1243f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin} 1244