PhotoPage.java revision c6781c0c0d8d193863ca09455a5bda3d542db493
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; 2504ac045bf8da5082bbb0bdc9ea5f9c9b5b796ad0Yuli Huangimport android.graphics.Rect; 26604f053d040782159b61d3b74ee533bc2c0ccdd0Ray Chenimport android.net.Uri; 2733ef03776b7734717b16f6fc861b831fb1b1dfacMartijn Coenenimport android.nfc.NfcAdapter; 28604f053d040782159b61d3b74ee533bc2c0ccdd0Ray Chenimport android.os.Bundle; 29604f053d040782159b61d3b74ee533bc2c0ccdd0Ray Chenimport android.os.Handler; 30604f053d040782159b61d3b74ee533bc2c0ccdd0Ray Chenimport android.os.Message; 31f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescuimport android.view.animation.AccelerateInterpolator; 32604f053d040782159b61d3b74ee533bc2c0ccdd0Ray Chenimport android.widget.Toast; 33604f053d040782159b61d3b74ee533bc2c0ccdd0Ray Chen 34b21b8e58a604f6c701245d84b141b5b87663192bOwen Linimport com.actionbarsherlock.app.ActionBar.OnMenuVisibilityListener; 35b21b8e58a604f6c701245d84b141b5b87663192bOwen Linimport com.actionbarsherlock.view.Menu; 36b21b8e58a604f6c701245d84b141b5b87663192bOwen Linimport com.actionbarsherlock.view.MenuItem; 37f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.R; 38f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescuimport com.android.gallery3d.anim.FloatAnimation; 39fc86994f86f8cfb31e151c9e730dc1e9dc7b3349Yuli Huangimport com.android.gallery3d.common.ApiHelper; 40616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Linimport com.android.gallery3d.common.Utils; 41f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.data.DataManager; 426b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Changimport com.android.gallery3d.data.FilterDeleteSet; 4383be4e0c9b8e3372eff8f9b1a396afd961b72921Angus Kongimport com.android.gallery3d.data.LocalImage; 44f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.data.MediaDetails; 45f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.data.MediaItem; 46f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.data.MediaObject; 47f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.data.MediaSet; 486b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Changimport com.android.gallery3d.data.MtpSource; 49f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.data.Path; 50a0ce682e40c39ce046c48d8a7f989fff01bb9f2cWu-cheng Liimport com.android.gallery3d.data.SecureAlbum; 51a0ce682e40c39ce046c48d8a7f989fff01bb9f2cWu-cheng Liimport com.android.gallery3d.data.SecureSource; 523b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Changimport com.android.gallery3d.data.SnailAlbum; 533b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Changimport com.android.gallery3d.data.SnailItem; 5415b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Changimport com.android.gallery3d.data.SnailSource; 55f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.picasasource.PicasaSource; 56f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescuimport com.android.gallery3d.ui.AnimationTime; 5724081fe26ca25448ddb9c8f9cc7f406d26344decOwen Linimport com.android.gallery3d.ui.BitmapScreenNail; 584105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chenimport com.android.gallery3d.ui.DetailsHelper; 594105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chenimport com.android.gallery3d.ui.DetailsHelper.CloseListener; 604105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chenimport com.android.gallery3d.ui.DetailsHelper.DetailsSource; 61f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.ui.GLCanvas; 62616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Linimport com.android.gallery3d.ui.GLRoot; 63616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Linimport com.android.gallery3d.ui.GLRoot.OnGLIdleListener; 64f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.ui.GLView; 65f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.ui.ImportCompleteListener; 66f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.ui.MenuExecutor; 67616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Linimport com.android.gallery3d.ui.PhotoFallbackEffect; 6821a412c93c9b0401b039f4eb86d4950752e5bb84Owen Linimport com.android.gallery3d.ui.PhotoView; 69f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescuimport com.android.gallery3d.ui.RawTexture; 70f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.ui.SelectionManager; 71f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.ui.SynchronizedHandler; 72f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.util.GalleryUtils; 73c6781c0c0d8d193863ca09455a5bda3d542db493Bobby Georgescuimport com.android.gallery3d.util.LightCycleHelper; 7466ca848b2f58b813d366642088d274a1b7c4a90cChih-Chung Changimport com.android.gallery3d.util.MediaSetUtils; 75f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 76bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Changpublic class PhotoPage extends ActivityState implements 7761f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang PhotoView.Listener, OrientationManager.Listener, AppBridge.Server { 78f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private static final String TAG = "PhotoPage"; 79f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 80f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private static final int MSG_HIDE_BARS = 1; 81bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang private static final int MSG_LOCK_ORIENTATION = 2; 82bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang private static final int MSG_UNLOCK_ORIENTATION = 3; 83bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang private static final int MSG_ON_FULL_SCREEN_CHANGED = 4; 8461f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang private static final int MSG_UPDATE_ACTION_BAR = 5; 85bd7c016d728853d38f98a3c6077b7bd9b08858b9Yuli Huang private static final int MSG_UNFREEZE_GLROOT = 6; 86e6251df06f0b3c8f556043f8b725b4b19be7474dChih-Chung Chang private static final int MSG_WANT_BARS = 7; 877eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu private static final int MSG_REFRESH_GRID_BUTTON = 8; 886cf807453fb58ccd4cc513ff187b306c7090e67cOwen Lin 89f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private static final int HIDE_BARS_TIMEOUT = 3500; 90bd7c016d728853d38f98a3c6077b7bd9b08858b9Yuli Huang private static final int UNFREEZE_GLROOT_TIMEOUT = 250; 91f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 92f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private static final int REQUEST_SLIDESHOW = 1; 93f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private static final int REQUEST_CROP = 2; 94f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private static final int REQUEST_CROP_PICASA = 3; 95f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang private static final int REQUEST_EDIT = 4; 9671cd89a38752bc22ae0ec2df965e4280b776623cChih-Chung Chang private static final int REQUEST_PLAY_VIDEO = 5; 97f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 98f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public static final String KEY_MEDIA_SET_PATH = "media-set-path"; 99f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public static final String KEY_MEDIA_ITEM_PATH = "media-item-path"; 100f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public static final String KEY_INDEX_HINT = "index-hint"; 10104ac045bf8da5082bbb0bdc9ea5f9c9b5b796ad0Yuli Huang public static final String KEY_OPEN_ANIMATION_RECT = "open-animation-rect"; 102bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang public static final String KEY_APP_BRIDGE = "app-bridge"; 10354fe6202b6f7d233e7645c121321fe0f3d20fc8bYuli Huang public static final String KEY_TREAT_BACK_AS_UP = "treat-back-as-up"; 1047eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu public static final String KEY_START_IN_FILMSTRIP = "start-in-filmstrip"; 105bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang public static final String KEY_RETURN_INDEX_HINT = "return-index-hint"; 106f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 1077eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu public static final String KEY_ALBUMPAGE_TRANSITION = "albumpage-transition"; 1087eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu public static final int MSG_ALBUMPAGE_NONE = 0; 1097eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu public static final int MSG_ALBUMPAGE_STARTED = 1; 1107eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu public static final int MSG_ALBUMPAGE_RESUMED = 2; 1117eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu public static final int MSG_ALBUMPAGE_PICKED = 4; 1127eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu 113f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private GalleryApp mApplication; 114f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private SelectionManager mSelectionManager; 115f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 116f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private PhotoView mPhotoView; 117f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private PhotoPage.Model mModel; 1184105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen private DetailsHelper mDetailsHelper; 119f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private boolean mShowDetails; 120f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 121f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin // mMediaSet could be null if there is no KEY_MEDIA_SET_PATH supplied. 122f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin // E.g., viewing a photo in gmail attachment 1236b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang private FilterDeleteSet mMediaSet; 124f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 125a0ce682e40c39ce046c48d8a7f989fff01bb9f2cWu-cheng Li // The mediaset used by camera launched from secure lock screen. 126a0ce682e40c39ce046c48d8a7f989fff01bb9f2cWu-cheng Li private SecureAlbum mSecureAlbum; 127a0ce682e40c39ce046c48d8a7f989fff01bb9f2cWu-cheng Li 128f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private int mCurrentIndex = 0; 129f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private Handler mHandler; 130113bfc77c4468411da9ae1290553c3be89f8df9aOwen Lin private boolean mShowBars = true; 13161f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang private volatile boolean mActionBarAllowed = true; 1328cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen private GalleryActionBar mActionBar; 133f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private boolean mIsMenuVisible; 134f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private MediaItem mCurrentPhoto = null; 135f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private MenuExecutor mMenuExecutor; 136f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private boolean mIsActive; 13784c220f10a643927c8a2126de8a755d8d7f7ec9eRay Chen private String mSetPathString; 138b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang // This is the original mSetPathString before adding the camera preview item. 139b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang private String mOriginalSetPathString; 140bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang private AppBridge mAppBridge; 1413b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang private SnailItem mScreenNailItem; 1423b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang private SnailAlbum mScreenNailSet; 143bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang private OrientationManager mOrientationManager; 14471cd89a38752bc22ae0ec2df965e4280b776623cChih-Chung Chang private boolean mHasActivityResult; 14554fe6202b6f7d233e7645c121321fe0f3d20fc8bYuli Huang private boolean mTreatBackAsUp; 1467eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu private boolean mStartInFilmstrip; 1477eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu private boolean mStartedFromAlbumPage; 14815b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang 149f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu private RawTexture mFadeOutTexture; 150f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu private Rect mOpenAnimationRect; 1517eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu public static final int ANIM_TIME_OPENING = 300; 152f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu 1536b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang // The item that is deleted (but it can still be undeleted before commiting) 1546b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang private Path mDeletePath; 1556b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang private boolean mDeleteIsFocus; // whether the deleted item was in focus 1566b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang 15733ef03776b7734717b16f6fc861b831fb1b1dfacMartijn Coenen private NfcAdapter mNfcAdapter; 15833ef03776b7734717b16f6fc861b831fb1b1dfacMartijn Coenen 1592bb717f1ea38e2ce33dd102a23afe6bfacb5675cOwen Lin private final MyMenuVisibilityListener mMenuVisibilityListener = 1602bb717f1ea38e2ce33dd102a23afe6bfacb5675cOwen Lin new MyMenuVisibilityListener(); 1612bb717f1ea38e2ce33dd102a23afe6bfacb5675cOwen Lin 162f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public static interface Model extends PhotoView.Model { 163f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void resume(); 164f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void pause(); 165f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public boolean isEmpty(); 166f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void setCurrentPhoto(Path path, int indexHint); 167f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 168f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 169f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private class MyMenuVisibilityListener implements OnMenuVisibilityListener { 17006c6401eededc2ec842ba4994a838c2ded0a666cPin Ting @Override 171f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void onMenuVisibilityChanged(boolean isVisible) { 172f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mIsMenuVisible = isVisible; 173f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin refreshHidingMessage(); 174f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 175f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 176f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 177f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu private static class BackgroundFadeOut extends FloatAnimation { 178f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu public BackgroundFadeOut() { 179f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu super(1f, 0f, ANIM_TIME_OPENING); 180f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu setInterpolator(new AccelerateInterpolator(2f)); 181f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu } 182f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu } 183f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu 184f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu private final FloatAnimation mBackgroundFade = new BackgroundFadeOut(); 185f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 186915c2c5b2c367df71599370613af0924bd7c4887Bobby Georgescu @Override 187915c2c5b2c367df71599370613af0924bd7c4887Bobby Georgescu protected int getBackgroundColorId() { 188915c2c5b2c367df71599370613af0924bd7c4887Bobby Georgescu return R.color.photo_background; 189915c2c5b2c367df71599370613af0924bd7c4887Bobby Georgescu } 190915c2c5b2c367df71599370613af0924bd7c4887Bobby Georgescu 191f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu private final GLView mRootPane = new GLView() { 192f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 193f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin protected void renderBackground(GLCanvas view) { 19483be4e0c9b8e3372eff8f9b1a396afd961b72921Angus Kong if (mFadeOutTexture != null) { 19583be4e0c9b8e3372eff8f9b1a396afd961b72921Angus Kong if (mBackgroundFade.calculate(AnimationTime.get())) invalidate(); 19683be4e0c9b8e3372eff8f9b1a396afd961b72921Angus Kong if (!mBackgroundFade.isActive()) { 197f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu mFadeOutTexture = null; 198f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu mOpenAnimationRect = null; 199f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu BitmapScreenNail.enableDrawPlaceholder(); 200f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu } else { 201f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu float fadeAlpha = mBackgroundFade.get(); 20283be4e0c9b8e3372eff8f9b1a396afd961b72921Angus Kong if (fadeAlpha < 1f) { 203915c2c5b2c367df71599370613af0924bd7c4887Bobby Georgescu view.clearBuffer(getBackgroundColor()); 204f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu view.setAlpha(fadeAlpha); 205f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu } 206f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu mFadeOutTexture.draw(view, 0, 0); 20702ef48574ef7099ebaa0386bd6fd676bd2fd5489Bobby Georgescu view.setAlpha(1f - fadeAlpha); 208f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu return; 209f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu } 210f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu } 211915c2c5b2c367df71599370613af0924bd7c4887Bobby Georgescu view.clearBuffer(getBackgroundColor()); 212f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 213f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 214f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 215f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin protected void onLayout( 216f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin boolean changed, int left, int top, int right, int bottom) { 217f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mPhotoView.layout(0, 0, right - left, bottom - top); 218f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (mShowDetails) { 2198cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen mDetailsHelper.layout(left, mActionBar.getHeight(), right, bottom); 220f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 221f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 222f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin }; 223f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 224f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 225f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void onCreate(Bundle data, Bundle restoreState) { 22645c56f2d34c71d0bc9b84ebeef6d1314738d0fc0Bobby Georgescu super.onCreate(data, restoreState); 2278cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen mActionBar = mActivity.getGalleryActionBar(); 228f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mSelectionManager = new SelectionManager(mActivity, false); 229f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mMenuExecutor = new MenuExecutor(mActivity, mSelectionManager); 230f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 231f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mPhotoView = new PhotoView(mActivity); 232bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang mPhotoView.setListener(this); 233f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mRootPane.addComponent(mPhotoView); 23483be4e0c9b8e3372eff8f9b1a396afd961b72921Angus Kong mApplication = (GalleryApp) ((Activity) mActivity).getApplication(); 235bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang mOrientationManager = mActivity.getOrientationManager(); 236bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang mOrientationManager.addListener(this); 2372ef46ed28b28b355d7f3f1432c7b1196b832a859Chih-Chung Chang mActivity.getGLRoot().setOrientationSource(mOrientationManager); 238f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 23984c220f10a643927c8a2126de8a755d8d7f7ec9eRay Chen mSetPathString = data.getString(KEY_MEDIA_SET_PATH); 240b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang mOriginalSetPathString = mSetPathString; 24133ef03776b7734717b16f6fc861b831fb1b1dfacMartijn Coenen mNfcAdapter = NfcAdapter.getDefaultAdapter(mActivity.getAndroidContext()); 2427eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu String itemPathString = data.getString(KEY_MEDIA_ITEM_PATH); 2437eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu Path itemPath = itemPathString != null ? 2447eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu Path.fromString(data.getString(KEY_MEDIA_ITEM_PATH)) : 2457eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu null; 24654fe6202b6f7d233e7645c121321fe0f3d20fc8bYuli Huang mTreatBackAsUp = data.getBoolean(KEY_TREAT_BACK_AS_UP, false); 2477eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu mStartInFilmstrip = 2487eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu data.getBoolean(KEY_START_IN_FILMSTRIP, false); 2497eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu mStartedFromAlbumPage = 2507eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu data.getInt(KEY_ALBUMPAGE_TRANSITION, 2517eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu MSG_ALBUMPAGE_NONE) == MSG_ALBUMPAGE_STARTED; 2527eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu setGridButtonVisibility(!mStartedFromAlbumPage); 25384c220f10a643927c8a2126de8a755d8d7f7ec9eRay Chen if (mSetPathString != null) { 254bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang mAppBridge = (AppBridge) data.getParcelable(KEY_APP_BRIDGE); 255bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang if (mAppBridge != null) { 2567eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu mFlags |= FLAG_HIDE_ACTION_BAR | FLAG_HIDE_STATUS_BAR; 2577eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu mShowBars = false; 2587eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu 259253c5aec7692afdd7880fbd169d4b44d5679cbc0Chih-Chung Chang mAppBridge.setServer(this); 260bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang mOrientationManager.lockOrientation(); 261b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang 262bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang // Get the ScreenNail from AppBridge and register it. 2633b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang int id = SnailSource.newId(); 264b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang Path screenNailSetPath = SnailSource.getSetPath(id); 265bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang Path screenNailItemPath = SnailSource.getItemPath(id); 2663b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang mScreenNailSet = (SnailAlbum) mActivity.getDataManager() 2673b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang .getMediaObject(screenNailSetPath); 2683b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang mScreenNailItem = (SnailItem) mActivity.getDataManager() 269bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang .getMediaObject(screenNailItemPath); 2703b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang mScreenNailItem.setScreenNail(mAppBridge.attachScreenNail()); 271b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang 272a0ce682e40c39ce046c48d8a7f989fff01bb9f2cWu-cheng Li // Check if the path is a secure album. 273a0ce682e40c39ce046c48d8a7f989fff01bb9f2cWu-cheng Li if (SecureSource.isSecurePath(mSetPathString)) { 274a0ce682e40c39ce046c48d8a7f989fff01bb9f2cWu-cheng Li mSecureAlbum = (SecureAlbum) mActivity.getDataManager() 275a0ce682e40c39ce046c48d8a7f989fff01bb9f2cWu-cheng Li .getMediaSet(mSetPathString); 276efd480e85dc5bd0d2ca0ac82d03e141212388830Wu-cheng Li // Set the flag to be on top of the lock screen. 277efd480e85dc5bd0d2ca0ac82d03e141212388830Wu-cheng Li mFlags |= FLAG_SHOW_WHEN_LOCKED; 278a0ce682e40c39ce046c48d8a7f989fff01bb9f2cWu-cheng Li } 279a0ce682e40c39ce046c48d8a7f989fff01bb9f2cWu-cheng Li 2803b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang // Combine the original MediaSet with the one for ScreenNail 2813b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang // from AppBridge. 282b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang mSetPathString = "/combo/item/{" + screenNailSetPath + 283b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang "," + mSetPathString + "}"; 284b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang 285b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang // Start from the screen nail. 286bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang itemPath = screenNailItemPath; 287b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang } 288b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang 2896118af9ddad8acc050133154f8f60c842c7f9bfaChih-Chung Chang MediaSet originalSet = mActivity.getDataManager() 2906118af9ddad8acc050133154f8f60c842c7f9bfaChih-Chung Chang .getMediaSet(mSetPathString); 2916118af9ddad8acc050133154f8f60c842c7f9bfaChih-Chung Chang mSelectionManager.setSourceMediaSet(originalSet); 2926b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang mSetPathString = "/filter/delete/{" + mSetPathString + "}"; 2936b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang mMediaSet = (FilterDeleteSet) mActivity.getDataManager() 2946b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang .getMediaSet(mSetPathString); 295f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mCurrentIndex = data.getInt(KEY_INDEX_HINT, 0); 296f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (mMediaSet == null) { 29784c220f10a643927c8a2126de8a755d8d7f7ec9eRay Chen Log.w(TAG, "failed to restore " + mSetPathString); 298f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 2997eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu if (itemPath == null) { 3007eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu itemPath = mMediaSet.getMediaItem(mCurrentIndex, 1) 3017eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu .get(0).getPath(); 3027eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu } 303f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin PhotoDataAdapter pda = new PhotoDataAdapter( 304bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang mActivity, mPhotoView, mMediaSet, itemPath, mCurrentIndex, 30543a80fd806247cb50e81bacda3ad21d210e9ae88Angus Kong mAppBridge == null ? -1 : 0, 306dbb6acc204ba6f095eb0e49e1298e9ceda2c3096Wu-cheng Li mAppBridge == null ? false : mAppBridge.isPanorama(), 307dbb6acc204ba6f095eb0e49e1298e9ceda2c3096Wu-cheng Li mAppBridge == null ? false : mAppBridge.isStaticCamera()); 308f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mModel = pda; 309f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mPhotoView.setModel(mModel); 310f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 311f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin pda.setDataListener(new PhotoDataAdapter.DataListener() { 312f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 313113bfc77c4468411da9ae1290553c3be89f8df9aOwen Lin @Override 314f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void onPhotoChanged(int index, Path item) { 315f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mCurrentIndex = index; 316f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (item != null) { 317616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin MediaItem photo = mModel.getMediaItem(0); 318f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (photo != null) updateCurrentPhoto(photo); 319f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 32061f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang updateBars(); 321f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 322f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 323f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 324f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void onLoadingFinished() { 325f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (!mModel.isEmpty()) { 326616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin MediaItem photo = mModel.getMediaItem(0); 327f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (photo != null) updateCurrentPhoto(photo); 328f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } else if (mIsActive) { 329c370476adcf29f311ceec70a119792a0168781e9Chih-Chung Chang // We only want to finish the PhotoPage if there is no 330c370476adcf29f311ceec70a119792a0168781e9Chih-Chung Chang // deletion that the user can undo. 331c370476adcf29f311ceec70a119792a0168781e9Chih-Chung Chang if (mMediaSet.getNumberOfDeletions() == 0) { 332c370476adcf29f311ceec70a119792a0168781e9Chih-Chung Chang mActivity.getStateManager().finishState( 333c370476adcf29f311ceec70a119792a0168781e9Chih-Chung Chang PhotoPage.this); 334c370476adcf29f311ceec70a119792a0168781e9Chih-Chung Chang } 335f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 336f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 337f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 338f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 339f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void onLoadingStarted() { 340f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 341f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin }); 342f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } else { 343f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin // Get default media set by the URI 344f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin MediaItem mediaItem = (MediaItem) 345f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mActivity.getDataManager().getMediaObject(itemPath); 346f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mModel = new SinglePhotoDataAdapter(mActivity, mPhotoView, mediaItem); 347f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mPhotoView.setModel(mModel); 348f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin updateCurrentPhoto(mediaItem); 349f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 350cf46a3abc26aac7cdb6b6993aeade053304b71d9Ray Chen 351f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mHandler = new SynchronizedHandler(mActivity.getGLRoot()) { 352f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 353f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void handleMessage(Message message) { 354f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin switch (message.what) { 355f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin case MSG_HIDE_BARS: { 356f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin hideBars(); 357f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin break; 358f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 3597eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu case MSG_REFRESH_GRID_BUTTON: { 3607eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu setGridButtonVisibility(mPhotoView.getFilmMode()); 3617eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu break; 3627eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu } 363bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang case MSG_LOCK_ORIENTATION: { 364bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang mOrientationManager.lockOrientation(); 365bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang break; 366bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang } 367bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang case MSG_UNLOCK_ORIENTATION: { 368bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang mOrientationManager.unlockOrientation(); 369bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang break; 370bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang } 371bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang case MSG_ON_FULL_SCREEN_CHANGED: { 372bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang mAppBridge.onFullScreenChanged(message.arg1 == 1); 373bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang break; 374bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang } 37561f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang case MSG_UPDATE_ACTION_BAR: { 37661f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang updateBars(); 37761f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang break; 37861f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang } 379e6251df06f0b3c8f556043f8b725b4b19be7474dChih-Chung Chang case MSG_WANT_BARS: { 380e6251df06f0b3c8f556043f8b725b4b19be7474dChih-Chung Chang wantBars(); 381e6251df06f0b3c8f556043f8b725b4b19be7474dChih-Chung Chang break; 382e6251df06f0b3c8f556043f8b725b4b19be7474dChih-Chung Chang } 383bd7c016d728853d38f98a3c6077b7bd9b08858b9Yuli Huang case MSG_UNFREEZE_GLROOT: { 384bd7c016d728853d38f98a3c6077b7bd9b08858b9Yuli Huang mActivity.getGLRoot().unfreeze(); 385bd7c016d728853d38f98a3c6077b7bd9b08858b9Yuli Huang break; 386bd7c016d728853d38f98a3c6077b7bd9b08858b9Yuli Huang } 387f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin default: throw new AssertionError(message.what); 388f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 389f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 390f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin }; 391f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 3927eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu mPhotoView.setFilmMode(mStartInFilmstrip); 393f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 394f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 3956772173d2a49b87a1d209f42fe52b5f830596f99Chih-Chung Chang @TargetApi(ApiHelper.VERSION_CODES.JELLY_BEAN) 396fc86994f86f8cfb31e151c9e730dc1e9dc7b3349Yuli Huang private void setNfcBeamPushUris(Uri[] uris) { 3976772173d2a49b87a1d209f42fe52b5f830596f99Chih-Chung Chang if (mNfcAdapter != null && ApiHelper.HAS_SET_BEAM_PUSH_URIS) { 39824081fe26ca25448ddb9c8f9cc7f406d26344decOwen Lin mNfcAdapter.setBeamPushUris(uris, mActivity); 399fc86994f86f8cfb31e151c9e730dc1e9dc7b3349Yuli Huang } 400fc86994f86f8cfb31e151c9e730dc1e9dc7b3349Yuli Huang } 401fc86994f86f8cfb31e151c9e730dc1e9dc7b3349Yuli Huang 402fb5571987f2555b04731b6f3e1c479efc16d542aWu-cheng Li private Intent createShareIntent(Path path) { 403fb5571987f2555b04731b6f3e1c479efc16d542aWu-cheng Li DataManager manager = mActivity.getDataManager(); 404fb5571987f2555b04731b6f3e1c479efc16d542aWu-cheng Li int type = manager.getMediaType(path); 405fb5571987f2555b04731b6f3e1c479efc16d542aWu-cheng Li Intent intent = new Intent(Intent.ACTION_SEND); 406fb5571987f2555b04731b6f3e1c479efc16d542aWu-cheng Li intent.setType(MenuExecutor.getMimeType(type)); 4072bb717f1ea38e2ce33dd102a23afe6bfacb5675cOwen Lin Uri uri = manager.getContentUri(path); 408fb5571987f2555b04731b6f3e1c479efc16d542aWu-cheng Li intent.putExtra(Intent.EXTRA_STREAM, uri); 409fb5571987f2555b04731b6f3e1c479efc16d542aWu-cheng Li return intent; 410fb5571987f2555b04731b6f3e1c479efc16d542aWu-cheng Li 411fb5571987f2555b04731b6f3e1c479efc16d542aWu-cheng Li } 412fb5571987f2555b04731b6f3e1c479efc16d542aWu-cheng Li 4132bb717f1ea38e2ce33dd102a23afe6bfacb5675cOwen Lin private void updateShareURI(Path path) { 41424081fe26ca25448ddb9c8f9cc7f406d26344decOwen Lin DataManager manager = mActivity.getDataManager(); 41524081fe26ca25448ddb9c8f9cc7f406d26344decOwen Lin Uri uri = manager.getContentUri(path); 41624081fe26ca25448ddb9c8f9cc7f406d26344decOwen Lin mActionBar.setShareIntent(createShareIntent(path)); 41724081fe26ca25448ddb9c8f9cc7f406d26344decOwen Lin setNfcBeamPushUris(new Uri[]{uri}); 418cf46a3abc26aac7cdb6b6993aeade053304b71d9Ray Chen } 419cf46a3abc26aac7cdb6b6993aeade053304b71d9Ray Chen 420f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private void updateCurrentPhoto(MediaItem photo) { 421f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (mCurrentPhoto == photo) return; 422f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mCurrentPhoto = photo; 423f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (mCurrentPhoto == null) return; 424f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin updateMenuOperations(); 425ed46d77c16cd80357f4a0feada2435dfba8104a6Yuli Huang updateTitle(); 426f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (mShowDetails) { 427995c4566bed7df1aa48ba7e1351f964efa73880bMichael Kolb mDetailsHelper.reloadDetails(); 428f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 429898a2f4540635528a0916b0a6b0a177869854ae9Wu-cheng Li if ((mSecureAlbum == null) 430898a2f4540635528a0916b0a6b0a177869854ae9Wu-cheng Li && (photo.getSupportedOperations() & MediaItem.SUPPORT_SHARE) != 0) { 43115b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang updateShareURI(photo.getPath()); 43215b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang } 433f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 434f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 435ed46d77c16cd80357f4a0feada2435dfba8104a6Yuli Huang private void updateTitle() { 436ed46d77c16cd80357f4a0feada2435dfba8104a6Yuli Huang if (mCurrentPhoto == null) return; 437ed46d77c16cd80357f4a0feada2435dfba8104a6Yuli Huang boolean showTitle = mActivity.getAndroidContext().getResources().getBoolean( 438ed46d77c16cd80357f4a0feada2435dfba8104a6Yuli Huang R.bool.show_action_bar_title); 4392bb717f1ea38e2ce33dd102a23afe6bfacb5675cOwen Lin if (showTitle && mCurrentPhoto.getName() != null) { 440ed46d77c16cd80357f4a0feada2435dfba8104a6Yuli Huang mActionBar.setTitle(mCurrentPhoto.getName()); 4412bb717f1ea38e2ce33dd102a23afe6bfacb5675cOwen Lin } else { 442ed46d77c16cd80357f4a0feada2435dfba8104a6Yuli Huang mActionBar.setTitle(""); 4432bb717f1ea38e2ce33dd102a23afe6bfacb5675cOwen Lin } 444ed46d77c16cd80357f4a0feada2435dfba8104a6Yuli Huang } 445ed46d77c16cd80357f4a0feada2435dfba8104a6Yuli Huang 446f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private void updateMenuOperations() { 44724081fe26ca25448ddb9c8f9cc7f406d26344decOwen Lin Menu menu = mActionBar.getMenu(); 44824081fe26ca25448ddb9c8f9cc7f406d26344decOwen Lin 44924081fe26ca25448ddb9c8f9cc7f406d26344decOwen Lin // it could be null if onCreateActionBar has not been called yet 45024081fe26ca25448ddb9c8f9cc7f406d26344decOwen Lin if (menu == null) return; 45124081fe26ca25448ddb9c8f9cc7f406d26344decOwen Lin 4527eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu setGridButtonVisibility(mPhotoView.getFilmMode()); 4537eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu 45424081fe26ca25448ddb9c8f9cc7f406d26344decOwen Lin MenuItem item = menu.findItem(R.id.action_slideshow); 455898a2f4540635528a0916b0a6b0a177869854ae9Wu-cheng Li item.setVisible((mSecureAlbum == null) && canDoSlideShow()); 4562066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang if (mCurrentPhoto == null) return; 45724081fe26ca25448ddb9c8f9cc7f406d26344decOwen Lin 458f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin int supportedOperations = mCurrentPhoto.getSupportedOperations(); 459898a2f4540635528a0916b0a6b0a177869854ae9Wu-cheng Li if (mSecureAlbum != null) { 46024081fe26ca25448ddb9c8f9cc7f406d26344decOwen Lin supportedOperations &= MediaObject.SUPPORT_DELETE; 461898a2f4540635528a0916b0a6b0a177869854ae9Wu-cheng Li } else if (!GalleryUtils.isEditorAvailable(mActivity, "image/*")) { 462f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin supportedOperations &= ~MediaObject.SUPPORT_EDIT; 463f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 46424081fe26ca25448ddb9c8f9cc7f406d26344decOwen Lin MenuExecutor.updateMenuOperation(menu, supportedOperations); 465f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 466f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 4672066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang private boolean canDoSlideShow() { 4682066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang if (mMediaSet == null || mCurrentPhoto == null) { 4692066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang return false; 4702066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang } 4712066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang if (mCurrentPhoto.getMediaType() != MediaObject.MEDIA_TYPE_IMAGE) { 4722066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang return false; 4732066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang } 4746b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang if (MtpSource.isMtpPath(mOriginalSetPathString)) { 4752066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang return false; 4762066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang } 4772066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang return true; 4782066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang } 4792066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang 48061f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang ////////////////////////////////////////////////////////////////////////// 48161f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang // Action Bar show/hide management 48261f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang ////////////////////////////////////////////////////////////////////////// 48361f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang 484f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private void showBars() { 485f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (mShowBars) return; 486f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mShowBars = true; 487e6251df06f0b3c8f556043f8b725b4b19be7474dChih-Chung Chang mOrientationManager.unlockOrientation(); 488f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mActionBar.show(); 4890b2486cff0c1b951c54325596256b986307f7f3aChih-Chung Chang mActivity.getGLRoot().setLightsOutMode(false); 49061f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang refreshHidingMessage(); 491f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 492f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 493f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private void hideBars() { 494f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (!mShowBars) return; 495f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mShowBars = false; 496f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mActionBar.hide(); 4970b2486cff0c1b951c54325596256b986307f7f3aChih-Chung Chang mActivity.getGLRoot().setLightsOutMode(true); 49861f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang mHandler.removeMessages(MSG_HIDE_BARS); 499f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 500f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 501f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private void refreshHidingMessage() { 502f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mHandler.removeMessages(MSG_HIDE_BARS); 5037eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu if (!mIsMenuVisible && !mPhotoView.getFilmMode()) { 504f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mHandler.sendEmptyMessageDelayed(MSG_HIDE_BARS, HIDE_BARS_TIMEOUT); 505f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 506f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 507f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 508aeb3062e84ed28f0e25a73f511f287ae0a3e4294Chih-Chung Chang private boolean canShowBars() { 509aeb3062e84ed28f0e25a73f511f287ae0a3e4294Chih-Chung Chang // No bars if we are showing camera preview. 510aeb3062e84ed28f0e25a73f511f287ae0a3e4294Chih-Chung Chang if (mAppBridge != null && mCurrentIndex == 0) return false; 511aeb3062e84ed28f0e25a73f511f287ae0a3e4294Chih-Chung Chang // No bars if it's not allowed. 512aeb3062e84ed28f0e25a73f511f287ae0a3e4294Chih-Chung Chang if (!mActionBarAllowed) return false; 513aeb3062e84ed28f0e25a73f511f287ae0a3e4294Chih-Chung Chang 514aeb3062e84ed28f0e25a73f511f287ae0a3e4294Chih-Chung Chang return true; 515aeb3062e84ed28f0e25a73f511f287ae0a3e4294Chih-Chung Chang } 516aeb3062e84ed28f0e25a73f511f287ae0a3e4294Chih-Chung Chang 517e6251df06f0b3c8f556043f8b725b4b19be7474dChih-Chung Chang private void wantBars() { 518e6251df06f0b3c8f556043f8b725b4b19be7474dChih-Chung Chang if (canShowBars()) showBars(); 519e6251df06f0b3c8f556043f8b725b4b19be7474dChih-Chung Chang } 520e6251df06f0b3c8f556043f8b725b4b19be7474dChih-Chung Chang 52161f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang private void toggleBars() { 522f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (mShowBars) { 523f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin hideBars(); 524aeb3062e84ed28f0e25a73f511f287ae0a3e4294Chih-Chung Chang } else { 525e6251df06f0b3c8f556043f8b725b4b19be7474dChih-Chung Chang if (canShowBars()) showBars(); 526f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 527f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 528f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 52961f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang private void updateBars() { 530e6251df06f0b3c8f556043f8b725b4b19be7474dChih-Chung Chang if (!canShowBars()) { 53161f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang hideBars(); 53261f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang } 533f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 534f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 535f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 5362ef46ed28b28b355d7f3f1432c7b1196b832a859Chih-Chung Chang public void onOrientationCompensationChanged() { 5372ef46ed28b28b355d7f3f1432c7b1196b832a859Chih-Chung Chang mActivity.getGLRoot().requestLayoutContentPane(); 538bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang } 539bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang 540bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang @Override 541f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin protected void onBackPressed() { 542f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (mShowDetails) { 543f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin hideDetails(); 5443b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang } else if (mAppBridge == null || !switchWithCaptureAnimation(-1)) { 545bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang // We are leaving this page. Set the result now. 546bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang setResult(); 5477eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu if (mStartInFilmstrip && !mPhotoView.getFilmMode()) { 5487eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu mPhotoView.setFilmMode(true); 5497eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu } else if (mTreatBackAsUp) { 55054fe6202b6f7d233e7645c121321fe0f3d20fc8bYuli Huang onUpPressed(); 55154fe6202b6f7d233e7645c121321fe0f3d20fc8bYuli Huang } else { 55254fe6202b6f7d233e7645c121321fe0f3d20fc8bYuli Huang super.onBackPressed(); 55354fe6202b6f7d233e7645c121321fe0f3d20fc8bYuli Huang } 554f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 555f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 556f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 557b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang private void onUpPressed() { 5587eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu if (mStartInFilmstrip && !mPhotoView.getFilmMode()) { 5597eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu mPhotoView.setFilmMode(true); 5607eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu return; 5617eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu } 5627eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu 563b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang if (mActivity.getStateManager().getStateCount() > 1) { 5647eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu setResult(); 565b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang super.onBackPressed(); 566ba12eae90b5b1a80ee002aa0df8c5c5189c4faa3Chih-Chung Chang return; 56766ca848b2f58b813d366642088d274a1b7c4a90cChih-Chung Chang } 56866ca848b2f58b813d366642088d274a1b7c4a90cChih-Chung Chang 56966ca848b2f58b813d366642088d274a1b7c4a90cChih-Chung Chang if (mOriginalSetPathString == null) return; 57066ca848b2f58b813d366642088d274a1b7c4a90cChih-Chung Chang 57166ca848b2f58b813d366642088d274a1b7c4a90cChih-Chung Chang if (mAppBridge == null) { 572b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang // We're in view mode so set up the stacks on our own. 573b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang Bundle data = new Bundle(getData()); 574b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang data.putString(AlbumPage.KEY_MEDIA_PATH, mOriginalSetPathString); 575b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang data.putString(AlbumPage.KEY_PARENT_MEDIA_PATH, 576b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang mActivity.getDataManager().getTopSetPath( 577b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang DataManager.INCLUDE_ALL)); 578b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang mActivity.getStateManager().switchState(this, AlbumPage.class, data); 57966ca848b2f58b813d366642088d274a1b7c4a90cChih-Chung Chang } else { 58066ca848b2f58b813d366642088d274a1b7c4a90cChih-Chung Chang // Start the real gallery activity to view the camera roll. 58166ca848b2f58b813d366642088d274a1b7c4a90cChih-Chung Chang Uri uri = Uri.parse("content://media/external/file?bucketId=" 58266ca848b2f58b813d366642088d274a1b7c4a90cChih-Chung Chang + MediaSetUtils.CAMERA_BUCKET_ID); 58366ca848b2f58b813d366642088d274a1b7c4a90cChih-Chung Chang Intent intent = new Intent(Intent.ACTION_VIEW); 58466ca848b2f58b813d366642088d274a1b7c4a90cChih-Chung Chang intent.setDataAndType(uri, ContentResolver.CURSOR_DIR_BASE_TYPE + "/image"); 58566ca848b2f58b813d366642088d274a1b7c4a90cChih-Chung Chang ((Activity) mActivity).startActivity(intent); 586b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang } 587b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang } 588b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang 589bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang private void setResult() { 590bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang Intent result = null; 5917eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu result = new Intent(); 5927eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu result.putExtra(KEY_RETURN_INDEX_HINT, mCurrentIndex); 593bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang setStateResult(Activity.RESULT_OK, result); 594bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang } 595bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang 596bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang ////////////////////////////////////////////////////////////////////////// 597bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang // AppBridge.Server interface 598bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang ////////////////////////////////////////////////////////////////////////// 599bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang 600bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang @Override 6012ef46ed28b28b355d7f3f1432c7b1196b832a859Chih-Chung Chang public void setCameraRelativeFrame(Rect frame) { 6022ef46ed28b28b355d7f3f1432c7b1196b832a859Chih-Chung Chang mPhotoView.setCameraRelativeFrame(frame); 603bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang } 604bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang 605bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang @Override 6062c6173822a612597c79be41b126367ddfbb5d518Chih-Chung Chang public boolean switchWithCaptureAnimation(int offset) { 6072c6173822a612597c79be41b126367ddfbb5d518Chih-Chung Chang return mPhotoView.switchWithCaptureAnimation(offset); 6082c6173822a612597c79be41b126367ddfbb5d518Chih-Chung Chang } 6092c6173822a612597c79be41b126367ddfbb5d518Chih-Chung Chang 610f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 6116575794a9c09f22d5721e212c093e0a2df376d0cChih-Chung Chang public void setSwipingEnabled(boolean enabled) { 6126575794a9c09f22d5721e212c093e0a2df376d0cChih-Chung Chang mPhotoView.setSwipingEnabled(enabled); 6136575794a9c09f22d5721e212c093e0a2df376d0cChih-Chung Chang } 6146575794a9c09f22d5721e212c093e0a2df376d0cChih-Chung Chang 6156575794a9c09f22d5721e212c093e0a2df376d0cChih-Chung Chang @Override 6163b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang public void notifyScreenNailChanged() { 6173b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang mScreenNailItem.setScreenNail(mAppBridge.attachScreenNail()); 6183b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang mScreenNailSet.notifyChange(); 6193b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang } 6203b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang 6213b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang @Override 622a0ce682e40c39ce046c48d8a7f989fff01bb9f2cWu-cheng Li public void addSecureAlbumItem(boolean isVideo, int id) { 623a0ce682e40c39ce046c48d8a7f989fff01bb9f2cWu-cheng Li mSecureAlbum.addMediaItem(isVideo, id); 624a0ce682e40c39ce046c48d8a7f989fff01bb9f2cWu-cheng Li } 625a0ce682e40c39ce046c48d8a7f989fff01bb9f2cWu-cheng Li 626a0ce682e40c39ce046c48d8a7f989fff01bb9f2cWu-cheng Li @Override 627f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin protected boolean onCreateActionBar(Menu menu) { 628b21b8e58a604f6c701245d84b141b5b87663192bOwen Lin mActionBar.createActionBarMenu(R.menu.photo, menu); 629f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin updateMenuOperations(); 630ed46d77c16cd80357f4a0feada2435dfba8104a6Yuli Huang updateTitle(); 631b21b8e58a604f6c701245d84b141b5b87663192bOwen Lin return true; 632f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 633f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 634d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin private MenuExecutor.ProgressListener mConfirmDialogListener = 635d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin new MenuExecutor.ProgressListener() { 636d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin @Override 637d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin public void onProgressUpdate(int index) {} 638d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin 639d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin @Override 640d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin public void onProgressComplete(int result) {} 641d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin 642d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin @Override 643d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin public void onConfirmDialogShown() { 644d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin mHandler.removeMessages(MSG_HIDE_BARS); 645d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin } 646d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin 647d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin @Override 648d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin public void onConfirmDialogDismissed(boolean confirmed) { 649d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin refreshHidingMessage(); 650d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin } 651ba50b9420e64731fd5aa8b1410e1f36457a1635aBobby Georgescu 652ba50b9420e64731fd5aa8b1410e1f36457a1635aBobby Georgescu @Override 653ba50b9420e64731fd5aa8b1410e1f36457a1635aBobby Georgescu public void onProgressStart() {} 654d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin }; 655d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin 656f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 657f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin protected boolean onItemSelected(MenuItem item) { 658d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin refreshHidingMessage(); 659616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin MediaItem current = mModel.getMediaItem(0); 660f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 661f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (current == null) { 662f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin // item is not ready, ignore 663f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return true; 664f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 665f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 666f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin int currentIndex = mModel.getCurrentIndex(); 667f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin Path path = current.getPath(); 668f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 669f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin DataManager manager = mActivity.getDataManager(); 670f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin int action = item.getItemId(); 6719a033b07b8e0d9fe7419b7a0d876e9c7febf43c8Ray Chen String confirmMsg = null; 672f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin switch (action) { 67384c220f10a643927c8a2126de8a755d8d7f7ec9eRay Chen case android.R.id.home: { 674b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang onUpPressed(); 67584c220f10a643927c8a2126de8a755d8d7f7ec9eRay Chen return true; 67684c220f10a643927c8a2126de8a755d8d7f7ec9eRay Chen } 6777eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu case R.id.action_grid: { 6787eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu if (mStartedFromAlbumPage) { 6797eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu onUpPressed(); 6807eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu } else { 6817eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu preparePhotoFallbackView(); 6827eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu Bundle data = new Bundle(getData()); 6837eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu data.putString(AlbumPage.KEY_MEDIA_PATH, mOriginalSetPathString); 6847eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu data.putString(AlbumPage.KEY_PARENT_MEDIA_PATH, 6857eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu mActivity.getDataManager().getTopSetPath( 6867eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu DataManager.INCLUDE_ALL)); 6877eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu mActivity.getTransitionStore().put( 6887eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu KEY_RETURN_INDEX_HINT, mCurrentIndex); 6897eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu mActivity.getStateManager().startState(AlbumPage.class, data); 6907eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu } 6917eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu return true; 6927eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu } 693f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin case R.id.action_slideshow: { 694f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin Bundle data = new Bundle(); 6956cf807453fb58ccd4cc513ff187b306c7090e67cOwen Lin data.putString(SlideshowPage.KEY_SET_PATH, mMediaSet.getPath().toString()); 696604f053d040782159b61d3b74ee533bc2c0ccdd0Ray Chen data.putString(SlideshowPage.KEY_ITEM_PATH, path.toString()); 697f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin data.putInt(SlideshowPage.KEY_PHOTO_INDEX, currentIndex); 698f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin data.putBoolean(SlideshowPage.KEY_REPEAT, true); 699f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mActivity.getStateManager().startStateForResult( 700f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin SlideshowPage.class, REQUEST_SLIDESHOW, data); 701f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return true; 702f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 703f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin case R.id.action_crop: { 704898a2f4540635528a0916b0a6b0a177869854ae9Wu-cheng Li Activity activity = mActivity; 705f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin Intent intent = new Intent(CropImage.CROP_ACTION); 706f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin intent.setClass(activity, CropImage.class); 707f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin intent.setData(manager.getContentUri(path)); 708f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin activity.startActivityForResult(intent, PicasaSource.isPicasaImage(current) 709f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin ? REQUEST_CROP_PICASA 710f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin : REQUEST_CROP); 711f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return true; 712f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 71350ea2d2938218ac6b2039f0e42998cfbbc45d1f1Teng-Hui Zhu case R.id.action_trim: { 71450ea2d2938218ac6b2039f0e42998cfbbc45d1f1Teng-Hui Zhu // TODO: Add trimming activity here. 71550ea2d2938218ac6b2039f0e42998cfbbc45d1f1Teng-Hui Zhu return true; 71650ea2d2938218ac6b2039f0e42998cfbbc45d1f1Teng-Hui Zhu } 717f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang case R.id.action_edit: { 718f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang Intent intent = new Intent(Intent.ACTION_EDIT) 719f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang .setData(manager.getContentUri(path)) 720f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang .setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); 721f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang ((Activity) mActivity).startActivityForResult(Intent.createChooser(intent, null), 722f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang REQUEST_EDIT); 723f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang return true; 724f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang } 725f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin case R.id.action_details: { 726f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (mShowDetails) { 727f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin hideDetails(); 728f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } else { 729995c4566bed7df1aa48ba7e1351f964efa73880bMichael Kolb showDetails(); 730f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 731f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return true; 732f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 73367098d1a72fd04e2af06d3a5939cde28c65f70d9Ray Chen case R.id.action_delete: 7349a033b07b8e0d9fe7419b7a0d876e9c7febf43c8Ray Chen confirmMsg = mActivity.getResources().getQuantityString( 7359a033b07b8e0d9fe7419b7a0d876e9c7febf43c8Ray Chen R.plurals.delete_selection, 1); 736f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin case R.id.action_setas: 737f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin case R.id.action_rotate_ccw: 738f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin case R.id.action_rotate_cw: 739f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin case R.id.action_show_on_map: 740f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mSelectionManager.deSelectAll(); 741f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mSelectionManager.toggle(path); 742d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin mMenuExecutor.onMenuClicked(item, confirmMsg, mConfirmDialogListener); 743f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return true; 744f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin case R.id.action_import: 745f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mSelectionManager.deSelectAll(); 746f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mSelectionManager.toggle(path); 7479a033b07b8e0d9fe7419b7a0d876e9c7febf43c8Ray Chen mMenuExecutor.onMenuClicked(item, confirmMsg, 748f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin new ImportCompleteListener(mActivity)); 749f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return true; 750fb5571987f2555b04731b6f3e1c479efc16d542aWu-cheng Li case R.id.action_share: 751898a2f4540635528a0916b0a6b0a177869854ae9Wu-cheng Li Activity activity = mActivity; 752fb5571987f2555b04731b6f3e1c479efc16d542aWu-cheng Li Intent intent = createShareIntent(mCurrentPhoto.getPath()); 753fb5571987f2555b04731b6f3e1c479efc16d542aWu-cheng Li activity.startActivity(Intent.createChooser(intent, 754fb5571987f2555b04731b6f3e1c479efc16d542aWu-cheng Li activity.getString(R.string.share))); 755fb5571987f2555b04731b6f3e1c479efc16d542aWu-cheng Li return true; 756f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin default : 757f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return false; 758f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 759f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 760f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 761f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private void hideDetails() { 762f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mShowDetails = false; 7634105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen mDetailsHelper.hide(); 764f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 765f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 766995c4566bed7df1aa48ba7e1351f964efa73880bMichael Kolb private void showDetails() { 767f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mShowDetails = true; 7684105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen if (mDetailsHelper == null) { 7694105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen mDetailsHelper = new DetailsHelper(mActivity, mRootPane, new MyDetailsSource()); 7704105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen mDetailsHelper.setCloseListener(new CloseListener() { 77106c6401eededc2ec842ba4994a838c2ded0a666cPin Ting @Override 772f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void onClose() { 773f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin hideDetails(); 774f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 775f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin }); 776f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 7774105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen mDetailsHelper.show(); 778f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 779f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 780bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang //////////////////////////////////////////////////////////////////////////// 781bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang // Callbacks from PhotoView 782bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang //////////////////////////////////////////////////////////////////////////// 783bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang @Override 784f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void onSingleTapUp(int x, int y) { 785bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang if (mAppBridge != null) { 786bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang if (mAppBridge.onSingleTapUp(x, y)) return; 787014d9586d8145a33f4e99eaad570587f6d650026Wu-cheng Li } 788014d9586d8145a33f4e99eaad570587f6d650026Wu-cheng Li 789616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin MediaItem item = mModel.getMediaItem(0); 790b5dc542fbaeaf99bebdcf775ef0e034e89e88eaeWu-cheng Li if (item == null || item == mScreenNailItem) { 791b5dc542fbaeaf99bebdcf775ef0e034e89e88eaeWu-cheng Li // item is not ready or it is camera preview, ignore 792f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return; 793f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 794f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 795898a2f4540635528a0916b0a6b0a177869854ae9Wu-cheng Li boolean playVideo = (mSecureAlbum == null) && 796898a2f4540635528a0916b0a6b0a177869854ae9Wu-cheng Li ((item.getSupportedOperations() & MediaItem.SUPPORT_PLAY) != 0); 79783be4e0c9b8e3372eff8f9b1a396afd961b72921Angus Kong boolean viewPanorama = 79883be4e0c9b8e3372eff8f9b1a396afd961b72921Angus Kong (item.getSupportedOperations() & MediaItem.SUPPORT_VIEW_PANORAMA) != 0; 799f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 800f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (playVideo) { 801f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin // determine if the point is at center (1/6) of the photo view. 802f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin // (The position of the "play" icon is at center (1/6) of the photo) 803f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin int w = mPhotoView.getWidth(); 804f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin int h = mPhotoView.getHeight(); 805f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin playVideo = (Math.abs(x - w / 2) * 12 <= w) 806f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin && (Math.abs(y - h / 2) * 12 <= h); 807f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 808f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 809f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (playVideo) { 810898a2f4540635528a0916b0a6b0a177869854ae9Wu-cheng Li playVideo(mActivity, item.getPlayUri(), item.getName()); 81183be4e0c9b8e3372eff8f9b1a396afd961b72921Angus Kong } else if (viewPanorama) { 81283be4e0c9b8e3372eff8f9b1a396afd961b72921Angus Kong LocalImage img = (LocalImage) item; 81383be4e0c9b8e3372eff8f9b1a396afd961b72921Angus Kong LightCycleHelper.viewPanorama( 81483be4e0c9b8e3372eff8f9b1a396afd961b72921Angus Kong mActivity, img.getContentUri(), img.getMimeType()); 815f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } else { 81661f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang toggleBars(); 817f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 818f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 819f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 820bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang @Override 821bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang public void lockOrientation() { 822bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang mHandler.sendEmptyMessage(MSG_LOCK_ORIENTATION); 823bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang } 824bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang 825bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang @Override 826bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang public void unlockOrientation() { 82706c6401eededc2ec842ba4994a838c2ded0a666cPin Ting mHandler.sendEmptyMessage(MSG_UNLOCK_ORIENTATION); 828bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang } 829bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang 830bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang @Override 83161f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang public void onActionBarAllowed(boolean allowed) { 83261f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang mActionBarAllowed = allowed; 83361f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang mHandler.sendEmptyMessage(MSG_UPDATE_ACTION_BAR); 83461f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang } 83561f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang 83661f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang @Override 837e6251df06f0b3c8f556043f8b725b4b19be7474dChih-Chung Chang public void onActionBarWanted() { 838e6251df06f0b3c8f556043f8b725b4b19be7474dChih-Chung Chang mHandler.sendEmptyMessage(MSG_WANT_BARS); 839e6251df06f0b3c8f556043f8b725b4b19be7474dChih-Chung Chang } 840e6251df06f0b3c8f556043f8b725b4b19be7474dChih-Chung Chang 841e6251df06f0b3c8f556043f8b725b4b19be7474dChih-Chung Chang @Override 842bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang public void onFullScreenChanged(boolean full) { 843bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang Message m = mHandler.obtainMessage( 844bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang MSG_ON_FULL_SCREEN_CHANGED, full ? 1 : 0, 0); 845bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang m.sendToTarget(); 846bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang } 847bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang 8486b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang // How we do delete/undo: 8496b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang // 8506b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang // When the user choose to delete a media item, we just tell the 8516b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang // FilterDeleteSet to hide that item. If the user choose to undo it, we 8526b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang // again tell FilterDeleteSet not to hide it. If the user choose to commit 8536b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang // the deletion, we then actually delete the media item. 8546b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang @Override 8556b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang public void onDeleteImage(Path path, int offset) { 8566118af9ddad8acc050133154f8f60c842c7f9bfaChih-Chung Chang onCommitDeleteImage(); // commit the previous deletion 8576b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang mDeletePath = path; 8586b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang mDeleteIsFocus = (offset == 0); 8596118af9ddad8acc050133154f8f60c842c7f9bfaChih-Chung Chang mMediaSet.addDeletion(path, mCurrentIndex + offset); 8606b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang } 8616b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang 8626b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang @Override 8636b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang public void onUndoDeleteImage() { 8646118af9ddad8acc050133154f8f60c842c7f9bfaChih-Chung Chang if (mDeletePath == null) return; 8656b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang // If the deletion was done on the focused item, we want the model to 8666b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang // focus on it when it is undeleted. 8676b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang if (mDeleteIsFocus) mModel.setFocusHintPath(mDeletePath); 8686118af9ddad8acc050133154f8f60c842c7f9bfaChih-Chung Chang mMediaSet.removeDeletion(mDeletePath); 8696b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang mDeletePath = null; 8706b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang } 8716b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang 8726b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang @Override 8736b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang public void onCommitDeleteImage() { 8746b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang if (mDeletePath == null) return; 8756b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang mSelectionManager.deSelectAll(); 8766b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang mSelectionManager.toggle(mDeletePath); 8776b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang mMenuExecutor.onMenuClicked(R.id.action_delete, null, true, false); 8786b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang mDeletePath = null; 8796b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang } 8806b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang 881f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public static void playVideo(Activity activity, Uri uri, String title) { 882f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin try { 883f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin Intent intent = new Intent(Intent.ACTION_VIEW) 884a3871050845b4921379add2b126add3cfbab1109Ray Chen .setDataAndType(uri, "video/*") 885a3871050845b4921379add2b126add3cfbab1109Ray Chen .putExtra(Intent.EXTRA_TITLE, title) 886a3871050845b4921379add2b126add3cfbab1109Ray Chen .putExtra(MovieActivity.KEY_TREAT_UP_AS_BACK, true); 88771cd89a38752bc22ae0ec2df965e4280b776623cChih-Chung Chang activity.startActivityForResult(intent, REQUEST_PLAY_VIDEO); 888f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } catch (ActivityNotFoundException e) { 889f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin Toast.makeText(activity, activity.getString(R.string.video_err), 890f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin Toast.LENGTH_SHORT).show(); 891f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 892f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 893f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 894f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang private void setCurrentPhotoByIntent(Intent intent) { 895f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang if (intent == null) return; 896f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang Path path = mApplication.getDataManager() 897f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang .findPathByUri(intent.getData(), intent.getType()); 898f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang if (path != null) { 899f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang mModel.setCurrentPhoto(path, mCurrentIndex); 900f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang } 901f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang } 902f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang 903f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 904f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin protected void onStateResult(int requestCode, int resultCode, Intent data) { 90571cd89a38752bc22ae0ec2df965e4280b776623cChih-Chung Chang mHasActivityResult = true; 906f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin switch (requestCode) { 907f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang case REQUEST_EDIT: 908f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang setCurrentPhotoByIntent(data); 909f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang break; 910f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin case REQUEST_CROP: 911f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (resultCode == Activity.RESULT_OK) { 912f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang setCurrentPhotoByIntent(data); 913f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 914f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin break; 915f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin case REQUEST_CROP_PICASA: { 916f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang if (resultCode == Activity.RESULT_OK) { 917f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang Context context = mActivity.getAndroidContext(); 91888cc2ca5f5596762a5546ec7426756f2036be455Yuli Huang String message = context.getString(R.string.crop_saved, 919f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang context.getString(R.string.folder_download)); 920f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang Toast.makeText(context, message, Toast.LENGTH_SHORT).show(); 921f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang } 922f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin break; 923f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 924f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin case REQUEST_SLIDESHOW: { 925f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (data == null) break; 926f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin String path = data.getStringExtra(SlideshowPage.KEY_ITEM_PATH); 927f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin int index = data.getIntExtra(SlideshowPage.KEY_PHOTO_INDEX, 0); 928f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (path != null) { 929f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mModel.setCurrentPhoto(Path.fromString(path), index); 930f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 931f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 932f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 933f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 934f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 93514d3289b4867c21da93ec4032119c0091bc78c30George Mount @Override 93614d3289b4867c21da93ec4032119c0091bc78c30George Mount protected void clearStateResult() { 93714d3289b4867c21da93ec4032119c0091bc78c30George Mount mHasActivityResult = false; 93814d3289b4867c21da93ec4032119c0091bc78c30George Mount } 93914d3289b4867c21da93ec4032119c0091bc78c30George Mount 940616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin private class PreparePhotoFallback implements OnGLIdleListener { 941616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin private PhotoFallbackEffect mPhotoFallback = new PhotoFallbackEffect(); 942616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin private boolean mResultReady = false; 943616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin 944616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin public synchronized PhotoFallbackEffect get() { 945616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin while (!mResultReady) { 946616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin Utils.waitWithoutInterrupt(this); 947616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin } 948616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin return mPhotoFallback; 949616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin } 950616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin 951616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin @Override 952616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin public boolean onGLIdle(GLCanvas canvas, boolean renderRequested) { 953616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin mPhotoFallback = mPhotoView.buildFallbackEffect(mRootPane, canvas); 954616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin synchronized (this) { 955616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin mResultReady = true; 956616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin notifyAll(); 957616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin } 958616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin return false; 959616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin } 960616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin } 961616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin 962616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin private void preparePhotoFallbackView() { 963616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin GLRoot root = mActivity.getGLRoot(); 964616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin PreparePhotoFallback task = new PreparePhotoFallback(); 965616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin root.unlockRenderThread(); 966616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin PhotoFallbackEffect anim; 967616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin try { 968616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin root.addOnGLIdleListener(task); 969616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin anim = task.get(); 970616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin } finally { 971616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin root.lockRenderThread(); 972616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin } 973616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin mActivity.getTransitionStore().put( 974616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin AlbumPage.KEY_RESUME_ANIMATION, anim); 975616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin } 976616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin 977f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 978f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void onPause() { 979d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin super.onPause(); 980d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin mIsActive = false; 981d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin 982bd7c016d728853d38f98a3c6077b7bd9b08858b9Yuli Huang mActivity.getGLRoot().unfreeze(); 983bd7c016d728853d38f98a3c6077b7bd9b08858b9Yuli Huang mHandler.removeMessages(MSG_UNFREEZE_GLROOT); 984616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin if (isFinishing()) preparePhotoFallbackView(); 985253c5aec7692afdd7880fbd169d4b44d5679cbc0Chih-Chung Chang 9864105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen DetailsHelper.pause(); 987f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mPhotoView.pause(); 988f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mModel.pause(); 989f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mHandler.removeMessages(MSG_HIDE_BARS); 990f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mActionBar.removeOnMenuVisibilityListener(mMenuVisibilityListener); 99133ef03776b7734717b16f6fc861b831fb1b1dfacMartijn Coenen 9926b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang onCommitDeleteImage(); 9932785956f8f5654966a41e20f482f4af3057eea3fChih-Chung Chang mMenuExecutor.pause(); 9946118af9ddad8acc050133154f8f60c842c7f9bfaChih-Chung Chang if (mMediaSet != null) mMediaSet.clearDeletion(); 995f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 996f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 997f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 998bd7c016d728853d38f98a3c6077b7bd9b08858b9Yuli Huang public void onCurrentImageUpdated() { 999bd7c016d728853d38f98a3c6077b7bd9b08858b9Yuli Huang mActivity.getGLRoot().unfreeze(); 1000bd7c016d728853d38f98a3c6077b7bd9b08858b9Yuli Huang } 1001bd7c016d728853d38f98a3c6077b7bd9b08858b9Yuli Huang 10027eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu private void setGridButtonVisibility(boolean enabled) { 10037eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu Menu menu = mActionBar.getMenu(); 10047eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu if (menu == null) return; 10057eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu MenuItem item = menu.findItem(R.id.action_grid); 10067eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu if (item != null) item.setVisible(enabled); 10077eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu } 10087eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu 10097eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu public void onFilmModeChanged(boolean enabled) { 10107eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu mHandler.sendEmptyMessage(MSG_REFRESH_GRID_BUTTON); 10117eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu if (enabled) { 10127eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu mHandler.removeMessages(MSG_HIDE_BARS); 10137eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu } else { 10147eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu refreshHidingMessage(); 10157eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu } 10167eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu } 10177eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu 10187eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu private void transitionFromAlbumPageIfNeeded() { 10197eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu TransitionStore transitions = mActivity.getTransitionStore(); 10207eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu 10217eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu int resumeIndex = transitions.get(KEY_INDEX_HINT, -1); 10227eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu if (resumeIndex >= 0) { 10237eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu mCurrentIndex = resumeIndex; 10247eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu mModel.setCurrentPhoto((Path)transitions.get(KEY_MEDIA_SET_PATH), mCurrentIndex); 10257eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu mPhotoView.switchToImage(mCurrentIndex); 10267eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu } 10277eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu 10287eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu int albumPageTransition = transitions.get( 10297eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu KEY_ALBUMPAGE_TRANSITION, MSG_ALBUMPAGE_NONE); 10307eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu 10317eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu if(albumPageTransition != MSG_ALBUMPAGE_NONE) { 10327eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu mPhotoView.setFilmMode(mStartInFilmstrip 10337eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu && albumPageTransition == MSG_ALBUMPAGE_RESUMED); 10347eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu } 10357eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu 10367eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu mFadeOutTexture = transitions.get(AlbumPage.KEY_FADE_TEXTURE); 10377eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu if (mFadeOutTexture != null) { 10387eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu mBackgroundFade.start(); 10397eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu BitmapScreenNail.disableDrawPlaceholder(); 10407eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu mOpenAnimationRect = 10417eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu albumPageTransition == MSG_ALBUMPAGE_NONE ? 10427eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu (Rect) mData.getParcelable(KEY_OPEN_ANIMATION_RECT) : 10437eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu (Rect) transitions.get(KEY_OPEN_ANIMATION_RECT); 10447eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu mPhotoView.setOpenAnimationRect(mOpenAnimationRect); 10457eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu mBackgroundFade.start(); 10467eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu } 10477eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu } 10487eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu 1049bd7c016d728853d38f98a3c6077b7bd9b08858b9Yuli Huang @Override 1050f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin protected void onResume() { 1051f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin super.onResume(); 10527eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu 10537eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu transitionFromAlbumPageIfNeeded(); 10547eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu 1055d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin mActivity.getGLRoot().freeze(); 1056f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mIsActive = true; 1057f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin setContentPane(mRootPane); 105804ac045bf8da5082bbb0bdc9ea5f9c9b5b796ad0Yuli Huang 1059f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mModel.resume(); 1060f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mPhotoView.resume(); 1061898a2f4540635528a0916b0a6b0a177869854ae9Wu-cheng Li mActionBar.setDisplayOptions( 1062898a2f4540635528a0916b0a6b0a177869854ae9Wu-cheng Li ((mSecureAlbum == null) && (mSetPathString != null)), true); 1063f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mActionBar.addOnMenuVisibilityListener(mMenuVisibilityListener); 106433ef03776b7734717b16f6fc861b831fb1b1dfacMartijn Coenen 106571cd89a38752bc22ae0ec2df965e4280b776623cChih-Chung Chang if (mAppBridge != null && !mHasActivityResult) { 106633f8567dd5003e4bb342683f3768ab7552648b02Chih-Chung Chang mPhotoView.resetToFirstPicture(); 1067bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang } 106871cd89a38752bc22ae0ec2df965e4280b776623cChih-Chung Chang mHasActivityResult = false; 1069bd7c016d728853d38f98a3c6077b7bd9b08858b9Yuli Huang mHandler.sendEmptyMessageDelayed(MSG_UNFREEZE_GLROOT, UNFREEZE_GLROOT_TIMEOUT); 1070f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 1071f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 107215b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang @Override 107315b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang protected void onDestroy() { 1074bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang if (mAppBridge != null) { 1075253c5aec7692afdd7880fbd169d4b44d5679cbc0Chih-Chung Chang mAppBridge.setServer(null); 10763b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang mScreenNailItem.setScreenNail(null); 1077bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang mAppBridge.detachScreenNail(); 1078bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang mAppBridge = null; 10793b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang mScreenNailSet = null; 10803b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang mScreenNailItem = null; 1081b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang } 1082bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang mOrientationManager.removeListener(this); 10832ef46ed28b28b355d7f3f1432c7b1196b832a859Chih-Chung Chang mActivity.getGLRoot().setOrientationSource(null); 1084aeb3062e84ed28f0e25a73f511f287ae0a3e4294Chih-Chung Chang 1085aeb3062e84ed28f0e25a73f511f287ae0a3e4294Chih-Chung Chang // Remove all pending messages. 1086aeb3062e84ed28f0e25a73f511f287ae0a3e4294Chih-Chung Chang mHandler.removeCallbacksAndMessages(null); 108715b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang super.onDestroy(); 108815b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang } 108915b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang 1090f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private class MyDetailsSource implements DetailsSource { 10916cf807453fb58ccd4cc513ff187b306c7090e67cOwen Lin 10926cf807453fb58ccd4cc513ff187b306c7090e67cOwen Lin @Override 1093f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public MediaDetails getDetails() { 1094616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin return mModel.getMediaItem(0).getDetails(); 1095f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 10966cf807453fb58ccd4cc513ff187b306c7090e67cOwen Lin 10976cf807453fb58ccd4cc513ff187b306c7090e67cOwen Lin @Override 1098f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public int size() { 1099f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return mMediaSet != null ? mMediaSet.getMediaItemCount() : 1; 1100f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 11016cf807453fb58ccd4cc513ff187b306c7090e67cOwen Lin 11026cf807453fb58ccd4cc513ff187b306c7090e67cOwen Lin @Override 1103995c4566bed7df1aa48ba7e1351f964efa73880bMichael Kolb public int setIndex() { 1104995c4566bed7df1aa48ba7e1351f964efa73880bMichael Kolb return mModel.getCurrentIndex(); 11054105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen } 1106f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 1107f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin} 1108