PhotoPage.java revision 898a2f4540635528a0916b0a6b0a177869854ae9
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; 43f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.data.MediaDetails; 44f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.data.MediaItem; 45f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.data.MediaObject; 46f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.data.MediaSet; 476b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Changimport com.android.gallery3d.data.MtpSource; 48f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.data.Path; 49a0ce682e40c39ce046c48d8a7f989fff01bb9f2cWu-cheng Liimport com.android.gallery3d.data.SecureAlbum; 50a0ce682e40c39ce046c48d8a7f989fff01bb9f2cWu-cheng Liimport com.android.gallery3d.data.SecureSource; 513b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Changimport com.android.gallery3d.data.SnailAlbum; 523b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Changimport com.android.gallery3d.data.SnailItem; 5315b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Changimport com.android.gallery3d.data.SnailSource; 54f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.picasasource.PicasaSource; 55f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescuimport com.android.gallery3d.ui.AnimationTime; 564105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chenimport com.android.gallery3d.ui.DetailsHelper; 574105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chenimport com.android.gallery3d.ui.DetailsHelper.CloseListener; 584105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chenimport com.android.gallery3d.ui.DetailsHelper.DetailsSource; 59f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.ui.GLCanvas; 60616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Linimport com.android.gallery3d.ui.GLRoot; 61616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Linimport com.android.gallery3d.ui.GLRoot.OnGLIdleListener; 62f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescuimport com.android.gallery3d.ui.BitmapScreenNail; 63f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.ui.GLView; 64f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.ui.ImportCompleteListener; 65f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.ui.MenuExecutor; 66616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Linimport com.android.gallery3d.ui.PhotoFallbackEffect; 6721a412c93c9b0401b039f4eb86d4950752e5bb84Owen Linimport com.android.gallery3d.ui.PhotoView; 68f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescuimport com.android.gallery3d.ui.RawTexture; 69f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.ui.SelectionManager; 70f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.ui.SynchronizedHandler; 71f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.util.GalleryUtils; 7266ca848b2f58b813d366642088d274a1b7c4a90cChih-Chung Changimport com.android.gallery3d.util.MediaSetUtils; 73f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 74bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Changpublic class PhotoPage extends ActivityState implements 7561f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang PhotoView.Listener, OrientationManager.Listener, AppBridge.Server { 76f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private static final String TAG = "PhotoPage"; 77f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 78f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private static final int MSG_HIDE_BARS = 1; 79bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang private static final int MSG_LOCK_ORIENTATION = 2; 80bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang private static final int MSG_UNLOCK_ORIENTATION = 3; 81bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang private static final int MSG_ON_FULL_SCREEN_CHANGED = 4; 8261f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang private static final int MSG_UPDATE_ACTION_BAR = 5; 83bd7c016d728853d38f98a3c6077b7bd9b08858b9Yuli Huang private static final int MSG_UNFREEZE_GLROOT = 6; 84e6251df06f0b3c8f556043f8b725b4b19be7474dChih-Chung Chang private static final int MSG_WANT_BARS = 7; 856cf807453fb58ccd4cc513ff187b306c7090e67cOwen Lin 86f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private static final int HIDE_BARS_TIMEOUT = 3500; 87bd7c016d728853d38f98a3c6077b7bd9b08858b9Yuli Huang private static final int UNFREEZE_GLROOT_TIMEOUT = 250; 88f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 89f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private static final int REQUEST_SLIDESHOW = 1; 90f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private static final int REQUEST_CROP = 2; 91f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private static final int REQUEST_CROP_PICASA = 3; 92f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang private static final int REQUEST_EDIT = 4; 9371cd89a38752bc22ae0ec2df965e4280b776623cChih-Chung Chang private static final int REQUEST_PLAY_VIDEO = 5; 94f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 95f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public static final String KEY_MEDIA_SET_PATH = "media-set-path"; 96f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public static final String KEY_MEDIA_ITEM_PATH = "media-item-path"; 97f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public static final String KEY_INDEX_HINT = "index-hint"; 9804ac045bf8da5082bbb0bdc9ea5f9c9b5b796ad0Yuli Huang public static final String KEY_OPEN_ANIMATION_RECT = "open-animation-rect"; 99bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang public static final String KEY_APP_BRIDGE = "app-bridge"; 10054fe6202b6f7d233e7645c121321fe0f3d20fc8bYuli Huang public static final String KEY_TREAT_BACK_AS_UP = "treat-back-as-up"; 101bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang 102bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang public static final String KEY_RETURN_INDEX_HINT = "return-index-hint"; 103f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 104f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private GalleryApp mApplication; 105f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private SelectionManager mSelectionManager; 106f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 107f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private PhotoView mPhotoView; 108f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private PhotoPage.Model mModel; 1094105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen private DetailsHelper mDetailsHelper; 110f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private boolean mShowDetails; 111cf46a3abc26aac7cdb6b6993aeade053304b71d9Ray Chen private Path mPendingSharePath; 112f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 113f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin // mMediaSet could be null if there is no KEY_MEDIA_SET_PATH supplied. 114f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin // E.g., viewing a photo in gmail attachment 1156b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang private FilterDeleteSet mMediaSet; 116f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 117a0ce682e40c39ce046c48d8a7f989fff01bb9f2cWu-cheng Li // The mediaset used by camera launched from secure lock screen. 118a0ce682e40c39ce046c48d8a7f989fff01bb9f2cWu-cheng Li private SecureAlbum mSecureAlbum; 119a0ce682e40c39ce046c48d8a7f989fff01bb9f2cWu-cheng Li 120f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private int mCurrentIndex = 0; 121f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private Handler mHandler; 122113bfc77c4468411da9ae1290553c3be89f8df9aOwen Lin private boolean mShowBars = true; 12361f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang private volatile boolean mActionBarAllowed = true; 1248cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen private GalleryActionBar mActionBar; 125f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private boolean mIsMenuVisible; 126f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private MediaItem mCurrentPhoto = null; 127f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private MenuExecutor mMenuExecutor; 128f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private boolean mIsActive; 12984c220f10a643927c8a2126de8a755d8d7f7ec9eRay Chen private String mSetPathString; 130b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang // This is the original mSetPathString before adding the camera preview item. 131b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang private String mOriginalSetPathString; 132bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang private AppBridge mAppBridge; 1333b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang private SnailItem mScreenNailItem; 1343b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang private SnailAlbum mScreenNailSet; 135bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang private OrientationManager mOrientationManager; 13671cd89a38752bc22ae0ec2df965e4280b776623cChih-Chung Chang private boolean mHasActivityResult; 13754fe6202b6f7d233e7645c121321fe0f3d20fc8bYuli Huang private boolean mTreatBackAsUp; 13815b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang 139f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu private RawTexture mFadeOutTexture; 140f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu private Rect mOpenAnimationRect; 14102ef48574ef7099ebaa0386bd6fd676bd2fd5489Bobby Georgescu public static final int ANIM_TIME_OPENING = 400; 142f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu 1436b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang // The item that is deleted (but it can still be undeleted before commiting) 1446b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang private Path mDeletePath; 1456b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang private boolean mDeleteIsFocus; // whether the deleted item was in focus 1466b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang 14733ef03776b7734717b16f6fc861b831fb1b1dfacMartijn Coenen private NfcAdapter mNfcAdapter; 14833ef03776b7734717b16f6fc861b831fb1b1dfacMartijn Coenen 149b21b8e58a604f6c701245d84b141b5b87663192bOwen Lin private Menu mActionBarMenu; 150b21b8e58a604f6c701245d84b141b5b87663192bOwen Lin 1512bb717f1ea38e2ce33dd102a23afe6bfacb5675cOwen Lin private final MyMenuVisibilityListener mMenuVisibilityListener = 1522bb717f1ea38e2ce33dd102a23afe6bfacb5675cOwen Lin new MyMenuVisibilityListener(); 1532bb717f1ea38e2ce33dd102a23afe6bfacb5675cOwen Lin 154f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public static interface Model extends PhotoView.Model { 155f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void resume(); 156f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void pause(); 157f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public boolean isEmpty(); 158f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void setCurrentPhoto(Path path, int indexHint); 159f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 160f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 161f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private class MyMenuVisibilityListener implements OnMenuVisibilityListener { 16206c6401eededc2ec842ba4994a838c2ded0a666cPin Ting @Override 163f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void onMenuVisibilityChanged(boolean isVisible) { 164f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mIsMenuVisible = isVisible; 165f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin refreshHidingMessage(); 166f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 167f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 168f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 169f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu private static class BackgroundFadeOut extends FloatAnimation { 170f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu public BackgroundFadeOut() { 171f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu super(1f, 0f, ANIM_TIME_OPENING); 172f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu setInterpolator(new AccelerateInterpolator(2f)); 173f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu } 174f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu } 175f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu 176f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu private final FloatAnimation mBackgroundFade = new BackgroundFadeOut(); 177f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 178915c2c5b2c367df71599370613af0924bd7c4887Bobby Georgescu @Override 179915c2c5b2c367df71599370613af0924bd7c4887Bobby Georgescu protected int getBackgroundColorId() { 180915c2c5b2c367df71599370613af0924bd7c4887Bobby Georgescu return R.color.photo_background; 181915c2c5b2c367df71599370613af0924bd7c4887Bobby Georgescu } 182915c2c5b2c367df71599370613af0924bd7c4887Bobby Georgescu 183f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu private final GLView mRootPane = new GLView() { 184f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 185f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin protected void renderBackground(GLCanvas view) { 186f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu if(mFadeOutTexture != null) { 187f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu if(mBackgroundFade.calculate(AnimationTime.get())) invalidate(); 188f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu if(!mBackgroundFade.isActive()) { 189f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu mFadeOutTexture = null; 190f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu mOpenAnimationRect = null; 191f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu BitmapScreenNail.enableDrawPlaceholder(); 192f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu } else { 193f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu float fadeAlpha = mBackgroundFade.get(); 194f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu if(fadeAlpha < 1f) { 195915c2c5b2c367df71599370613af0924bd7c4887Bobby Georgescu view.clearBuffer(getBackgroundColor()); 196f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu view.setAlpha(fadeAlpha); 197f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu } 198f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu mFadeOutTexture.draw(view, 0, 0); 19902ef48574ef7099ebaa0386bd6fd676bd2fd5489Bobby Georgescu view.setAlpha(1f - fadeAlpha); 200f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu return; 201f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu } 202f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu } 203915c2c5b2c367df71599370613af0924bd7c4887Bobby Georgescu view.clearBuffer(getBackgroundColor()); 204f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 205f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 206f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 207f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin protected void onLayout( 208f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin boolean changed, int left, int top, int right, int bottom) { 209f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mPhotoView.layout(0, 0, right - left, bottom - top); 210f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (mShowDetails) { 2118cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen mDetailsHelper.layout(left, mActionBar.getHeight(), right, bottom); 212f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 213f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 214f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin }; 215f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 216f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 217f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void onCreate(Bundle data, Bundle restoreState) { 21845c56f2d34c71d0bc9b84ebeef6d1314738d0fc0Bobby Georgescu super.onCreate(data, restoreState); 2198cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen mActionBar = mActivity.getGalleryActionBar(); 220f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mSelectionManager = new SelectionManager(mActivity, false); 221f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mMenuExecutor = new MenuExecutor(mActivity, mSelectionManager); 222f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 223f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mPhotoView = new PhotoView(mActivity); 224bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang mPhotoView.setListener(this); 225f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mRootPane.addComponent(mPhotoView); 226f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mApplication = (GalleryApp)((Activity) mActivity).getApplication(); 227bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang mOrientationManager = mActivity.getOrientationManager(); 228bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang mOrientationManager.addListener(this); 2292ef46ed28b28b355d7f3f1432c7b1196b832a859Chih-Chung Chang mActivity.getGLRoot().setOrientationSource(mOrientationManager); 230f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 23184c220f10a643927c8a2126de8a755d8d7f7ec9eRay Chen mSetPathString = data.getString(KEY_MEDIA_SET_PATH); 232b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang mOriginalSetPathString = mSetPathString; 23333ef03776b7734717b16f6fc861b831fb1b1dfacMartijn Coenen mNfcAdapter = NfcAdapter.getDefaultAdapter(mActivity.getAndroidContext()); 234f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin Path itemPath = Path.fromString(data.getString(KEY_MEDIA_ITEM_PATH)); 23554fe6202b6f7d233e7645c121321fe0f3d20fc8bYuli Huang mTreatBackAsUp = data.getBoolean(KEY_TREAT_BACK_AS_UP, false); 236f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 23784c220f10a643927c8a2126de8a755d8d7f7ec9eRay Chen if (mSetPathString != null) { 238bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang mAppBridge = (AppBridge) data.getParcelable(KEY_APP_BRIDGE); 239bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang if (mAppBridge != null) { 240253c5aec7692afdd7880fbd169d4b44d5679cbc0Chih-Chung Chang mAppBridge.setServer(this); 241bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang mOrientationManager.lockOrientation(); 242b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang 243bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang // Get the ScreenNail from AppBridge and register it. 2443b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang int id = SnailSource.newId(); 245b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang Path screenNailSetPath = SnailSource.getSetPath(id); 246bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang Path screenNailItemPath = SnailSource.getItemPath(id); 2473b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang mScreenNailSet = (SnailAlbum) mActivity.getDataManager() 2483b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang .getMediaObject(screenNailSetPath); 2493b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang mScreenNailItem = (SnailItem) mActivity.getDataManager() 250bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang .getMediaObject(screenNailItemPath); 2513b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang mScreenNailItem.setScreenNail(mAppBridge.attachScreenNail()); 252b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang 253a0ce682e40c39ce046c48d8a7f989fff01bb9f2cWu-cheng Li // Check if the path is a secure album. 254a0ce682e40c39ce046c48d8a7f989fff01bb9f2cWu-cheng Li if (SecureSource.isSecurePath(mSetPathString)) { 255a0ce682e40c39ce046c48d8a7f989fff01bb9f2cWu-cheng Li mSecureAlbum = (SecureAlbum) mActivity.getDataManager() 256a0ce682e40c39ce046c48d8a7f989fff01bb9f2cWu-cheng Li .getMediaSet(mSetPathString); 257a0ce682e40c39ce046c48d8a7f989fff01bb9f2cWu-cheng Li } 258a0ce682e40c39ce046c48d8a7f989fff01bb9f2cWu-cheng Li 2593b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang // Combine the original MediaSet with the one for ScreenNail 2603b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang // from AppBridge. 261b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang mSetPathString = "/combo/item/{" + screenNailSetPath + 262b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang "," + mSetPathString + "}"; 263b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang 264b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang // Start from the screen nail. 265bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang itemPath = screenNailItemPath; 266788245711658188131ae2670e44fb6ca8ad5d53aWu-cheng Li 267788245711658188131ae2670e44fb6ca8ad5d53aWu-cheng Li // Action bar should not be displayed when camera starts. 2680b2486cff0c1b951c54325596256b986307f7f3aChih-Chung Chang mFlags |= FLAG_HIDE_ACTION_BAR | FLAG_HIDE_STATUS_BAR; 26961f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang mShowBars = false; 270b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang } 271b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang 2726118af9ddad8acc050133154f8f60c842c7f9bfaChih-Chung Chang MediaSet originalSet = mActivity.getDataManager() 2736118af9ddad8acc050133154f8f60c842c7f9bfaChih-Chung Chang .getMediaSet(mSetPathString); 2746118af9ddad8acc050133154f8f60c842c7f9bfaChih-Chung Chang mSelectionManager.setSourceMediaSet(originalSet); 2756b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang mSetPathString = "/filter/delete/{" + mSetPathString + "}"; 2766b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang mMediaSet = (FilterDeleteSet) mActivity.getDataManager() 2776b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang .getMediaSet(mSetPathString); 278f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mCurrentIndex = data.getInt(KEY_INDEX_HINT, 0); 279f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (mMediaSet == null) { 28084c220f10a643927c8a2126de8a755d8d7f7ec9eRay Chen Log.w(TAG, "failed to restore " + mSetPathString); 281f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 282f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin PhotoDataAdapter pda = new PhotoDataAdapter( 283bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang mActivity, mPhotoView, mMediaSet, itemPath, mCurrentIndex, 28443a80fd806247cb50e81bacda3ad21d210e9ae88Angus Kong mAppBridge == null ? -1 : 0, 285dbb6acc204ba6f095eb0e49e1298e9ceda2c3096Wu-cheng Li mAppBridge == null ? false : mAppBridge.isPanorama(), 286dbb6acc204ba6f095eb0e49e1298e9ceda2c3096Wu-cheng Li mAppBridge == null ? false : mAppBridge.isStaticCamera()); 287f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mModel = pda; 288f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mPhotoView.setModel(mModel); 289f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 290f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin pda.setDataListener(new PhotoDataAdapter.DataListener() { 291f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 292113bfc77c4468411da9ae1290553c3be89f8df9aOwen Lin @Override 293f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void onPhotoChanged(int index, Path item) { 294f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mCurrentIndex = index; 295f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (item != null) { 296616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin MediaItem photo = mModel.getMediaItem(0); 297f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (photo != null) updateCurrentPhoto(photo); 298f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 29961f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang updateBars(); 300f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 301f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 302f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 303f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void onLoadingFinished() { 304f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (!mModel.isEmpty()) { 305616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin MediaItem photo = mModel.getMediaItem(0); 306f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (photo != null) updateCurrentPhoto(photo); 307f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } else if (mIsActive) { 308c370476adcf29f311ceec70a119792a0168781e9Chih-Chung Chang // We only want to finish the PhotoPage if there is no 309c370476adcf29f311ceec70a119792a0168781e9Chih-Chung Chang // deletion that the user can undo. 310c370476adcf29f311ceec70a119792a0168781e9Chih-Chung Chang if (mMediaSet.getNumberOfDeletions() == 0) { 311c370476adcf29f311ceec70a119792a0168781e9Chih-Chung Chang mActivity.getStateManager().finishState( 312c370476adcf29f311ceec70a119792a0168781e9Chih-Chung Chang PhotoPage.this); 313c370476adcf29f311ceec70a119792a0168781e9Chih-Chung Chang } 314f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 315f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 316f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 317f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 318f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void onLoadingStarted() { 319f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 320f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin }); 321f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } else { 322f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin // Get default media set by the URI 323f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin MediaItem mediaItem = (MediaItem) 324f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mActivity.getDataManager().getMediaObject(itemPath); 325f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mModel = new SinglePhotoDataAdapter(mActivity, mPhotoView, mediaItem); 326f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mPhotoView.setModel(mModel); 327f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin updateCurrentPhoto(mediaItem); 328f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 329cf46a3abc26aac7cdb6b6993aeade053304b71d9Ray Chen 330f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mHandler = new SynchronizedHandler(mActivity.getGLRoot()) { 331f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 332f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void handleMessage(Message message) { 333f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin switch (message.what) { 334f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin case MSG_HIDE_BARS: { 335f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin hideBars(); 336f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin break; 337f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 338bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang case MSG_LOCK_ORIENTATION: { 339bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang mOrientationManager.lockOrientation(); 340bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang break; 341bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang } 342bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang case MSG_UNLOCK_ORIENTATION: { 343bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang mOrientationManager.unlockOrientation(); 344bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang break; 345bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang } 346bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang case MSG_ON_FULL_SCREEN_CHANGED: { 347bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang mAppBridge.onFullScreenChanged(message.arg1 == 1); 348bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang break; 349bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang } 35061f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang case MSG_UPDATE_ACTION_BAR: { 35161f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang updateBars(); 35261f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang break; 35361f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang } 354e6251df06f0b3c8f556043f8b725b4b19be7474dChih-Chung Chang case MSG_WANT_BARS: { 355e6251df06f0b3c8f556043f8b725b4b19be7474dChih-Chung Chang wantBars(); 356e6251df06f0b3c8f556043f8b725b4b19be7474dChih-Chung Chang break; 357e6251df06f0b3c8f556043f8b725b4b19be7474dChih-Chung Chang } 358bd7c016d728853d38f98a3c6077b7bd9b08858b9Yuli Huang case MSG_UNFREEZE_GLROOT: { 359bd7c016d728853d38f98a3c6077b7bd9b08858b9Yuli Huang mActivity.getGLRoot().unfreeze(); 360bd7c016d728853d38f98a3c6077b7bd9b08858b9Yuli Huang break; 361bd7c016d728853d38f98a3c6077b7bd9b08858b9Yuli Huang } 362f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin default: throw new AssertionError(message.what); 363f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 364f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 365f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin }; 366f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 36704ac045bf8da5082bbb0bdc9ea5f9c9b5b796ad0Yuli Huang // start the opening animation only if it's not restored. 36804ac045bf8da5082bbb0bdc9ea5f9c9b5b796ad0Yuli Huang if (restoreState == null) { 369f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu mFadeOutTexture = mActivity.getTransitionStore().get(AlbumPage.KEY_FADE_TEXTURE); 370f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu if(mFadeOutTexture != null) { 371f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu mBackgroundFade.start(); 372f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu BitmapScreenNail.disableDrawPlaceholder(); 373f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu mOpenAnimationRect = (Rect) data.getParcelable(KEY_OPEN_ANIMATION_RECT); 374f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu mPhotoView.setOpenAnimationRect(mOpenAnimationRect); 375f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu } 37604ac045bf8da5082bbb0bdc9ea5f9c9b5b796ad0Yuli Huang } 377f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 378f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 3796772173d2a49b87a1d209f42fe52b5f830596f99Chih-Chung Chang @TargetApi(ApiHelper.VERSION_CODES.JELLY_BEAN) 380fc86994f86f8cfb31e151c9e730dc1e9dc7b3349Yuli Huang private void setNfcBeamPushUris(Uri[] uris) { 3816772173d2a49b87a1d209f42fe52b5f830596f99Chih-Chung Chang if (mNfcAdapter != null && ApiHelper.HAS_SET_BEAM_PUSH_URIS) { 382fc86994f86f8cfb31e151c9e730dc1e9dc7b3349Yuli Huang mNfcAdapter.setBeamPushUris(uris, (Activity)mActivity); 383fc86994f86f8cfb31e151c9e730dc1e9dc7b3349Yuli Huang } 384fc86994f86f8cfb31e151c9e730dc1e9dc7b3349Yuli Huang } 385fc86994f86f8cfb31e151c9e730dc1e9dc7b3349Yuli Huang 386fb5571987f2555b04731b6f3e1c479efc16d542aWu-cheng Li private Intent createShareIntent(Path path) { 387fb5571987f2555b04731b6f3e1c479efc16d542aWu-cheng Li DataManager manager = mActivity.getDataManager(); 388fb5571987f2555b04731b6f3e1c479efc16d542aWu-cheng Li int type = manager.getMediaType(path); 389fb5571987f2555b04731b6f3e1c479efc16d542aWu-cheng Li Intent intent = new Intent(Intent.ACTION_SEND); 390fb5571987f2555b04731b6f3e1c479efc16d542aWu-cheng Li intent.setType(MenuExecutor.getMimeType(type)); 3912bb717f1ea38e2ce33dd102a23afe6bfacb5675cOwen Lin Uri uri = manager.getContentUri(path); 392fb5571987f2555b04731b6f3e1c479efc16d542aWu-cheng Li intent.putExtra(Intent.EXTRA_STREAM, uri); 393fb5571987f2555b04731b6f3e1c479efc16d542aWu-cheng Li return intent; 394fb5571987f2555b04731b6f3e1c479efc16d542aWu-cheng Li 395fb5571987f2555b04731b6f3e1c479efc16d542aWu-cheng Li } 396fb5571987f2555b04731b6f3e1c479efc16d542aWu-cheng Li 3972bb717f1ea38e2ce33dd102a23afe6bfacb5675cOwen Lin private void updateShareURI(Path path) { 3982bb717f1ea38e2ce33dd102a23afe6bfacb5675cOwen Lin if (mActionBar.hasShareMenuItem()) { 3992bb717f1ea38e2ce33dd102a23afe6bfacb5675cOwen Lin DataManager manager = mActivity.getDataManager(); 4002bb717f1ea38e2ce33dd102a23afe6bfacb5675cOwen Lin Uri uri = manager.getContentUri(path); 4012bb717f1ea38e2ce33dd102a23afe6bfacb5675cOwen Lin mActionBar.setShareIntent(createShareIntent(path)); 4022bb717f1ea38e2ce33dd102a23afe6bfacb5675cOwen Lin setNfcBeamPushUris(new Uri[]{uri}); 4032bb717f1ea38e2ce33dd102a23afe6bfacb5675cOwen Lin mPendingSharePath = null; 4042bb717f1ea38e2ce33dd102a23afe6bfacb5675cOwen Lin } else { 4052bb717f1ea38e2ce33dd102a23afe6bfacb5675cOwen Lin // This happens when ActionBar is not created yet. 4062bb717f1ea38e2ce33dd102a23afe6bfacb5675cOwen Lin mPendingSharePath = path; 407cf46a3abc26aac7cdb6b6993aeade053304b71d9Ray Chen } 408cf46a3abc26aac7cdb6b6993aeade053304b71d9Ray Chen } 409cf46a3abc26aac7cdb6b6993aeade053304b71d9Ray Chen 410f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private void updateCurrentPhoto(MediaItem photo) { 411f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (mCurrentPhoto == photo) return; 412f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mCurrentPhoto = photo; 413f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (mCurrentPhoto == null) return; 414f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin updateMenuOperations(); 415ed46d77c16cd80357f4a0feada2435dfba8104a6Yuli Huang updateTitle(); 416f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (mShowDetails) { 417995c4566bed7df1aa48ba7e1351f964efa73880bMichael Kolb mDetailsHelper.reloadDetails(); 418f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 419898a2f4540635528a0916b0a6b0a177869854ae9Wu-cheng Li if ((mSecureAlbum == null) 420898a2f4540635528a0916b0a6b0a177869854ae9Wu-cheng Li && (photo.getSupportedOperations() & MediaItem.SUPPORT_SHARE) != 0) { 42115b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang updateShareURI(photo.getPath()); 42215b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang } 423f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 424f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 425ed46d77c16cd80357f4a0feada2435dfba8104a6Yuli Huang private void updateTitle() { 426ed46d77c16cd80357f4a0feada2435dfba8104a6Yuli Huang if (mCurrentPhoto == null) return; 427ed46d77c16cd80357f4a0feada2435dfba8104a6Yuli Huang boolean showTitle = mActivity.getAndroidContext().getResources().getBoolean( 428ed46d77c16cd80357f4a0feada2435dfba8104a6Yuli Huang R.bool.show_action_bar_title); 4292bb717f1ea38e2ce33dd102a23afe6bfacb5675cOwen Lin if (showTitle && mCurrentPhoto.getName() != null) { 430ed46d77c16cd80357f4a0feada2435dfba8104a6Yuli Huang mActionBar.setTitle(mCurrentPhoto.getName()); 4312bb717f1ea38e2ce33dd102a23afe6bfacb5675cOwen Lin } else { 432ed46d77c16cd80357f4a0feada2435dfba8104a6Yuli Huang mActionBar.setTitle(""); 4332bb717f1ea38e2ce33dd102a23afe6bfacb5675cOwen Lin } 434ed46d77c16cd80357f4a0feada2435dfba8104a6Yuli Huang } 435ed46d77c16cd80357f4a0feada2435dfba8104a6Yuli Huang 436f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private void updateMenuOperations() { 437b21b8e58a604f6c701245d84b141b5b87663192bOwen Lin MenuItem item = mActionBar.findMenuItem(R.id.action_slideshow); 438898a2f4540635528a0916b0a6b0a177869854ae9Wu-cheng Li item.setVisible((mSecureAlbum == null) && canDoSlideShow()); 4392066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang if (mCurrentPhoto == null) return; 440f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin int supportedOperations = mCurrentPhoto.getSupportedOperations(); 441898a2f4540635528a0916b0a6b0a177869854ae9Wu-cheng Li if (mSecureAlbum != null) { 442898a2f4540635528a0916b0a6b0a177869854ae9Wu-cheng Li supportedOperations = supportedOperations & MediaObject.SUPPORT_DELETE; 443898a2f4540635528a0916b0a6b0a177869854ae9Wu-cheng Li } else if (!GalleryUtils.isEditorAvailable(mActivity, "image/*")) { 444f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin supportedOperations &= ~MediaObject.SUPPORT_EDIT; 445f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 446b21b8e58a604f6c701245d84b141b5b87663192bOwen Lin MenuExecutor.updateMenuOperation(mActionBar.getMenu(), supportedOperations); 447f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 448f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 4492066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang private boolean canDoSlideShow() { 4502066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang if (mMediaSet == null || mCurrentPhoto == null) { 4512066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang return false; 4522066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang } 4532066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang if (mCurrentPhoto.getMediaType() != MediaObject.MEDIA_TYPE_IMAGE) { 4542066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang return false; 4552066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang } 4566b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang if (MtpSource.isMtpPath(mOriginalSetPathString)) { 4572066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang return false; 4582066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang } 4592066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang return true; 4602066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang } 4612066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang 46261f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang ////////////////////////////////////////////////////////////////////////// 46361f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang // Action Bar show/hide management 46461f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang ////////////////////////////////////////////////////////////////////////// 46561f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang 466f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private void showBars() { 467f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (mShowBars) return; 468f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mShowBars = true; 469e6251df06f0b3c8f556043f8b725b4b19be7474dChih-Chung Chang mOrientationManager.unlockOrientation(); 470f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mActionBar.show(); 4710b2486cff0c1b951c54325596256b986307f7f3aChih-Chung Chang mActivity.getGLRoot().setLightsOutMode(false); 47261f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang refreshHidingMessage(); 473f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 474f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 475f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private void hideBars() { 476f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (!mShowBars) return; 477f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mShowBars = false; 478f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mActionBar.hide(); 4790b2486cff0c1b951c54325596256b986307f7f3aChih-Chung Chang mActivity.getGLRoot().setLightsOutMode(true); 48061f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang mHandler.removeMessages(MSG_HIDE_BARS); 481f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 482f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 483f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private void refreshHidingMessage() { 484f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mHandler.removeMessages(MSG_HIDE_BARS); 48561f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang if (!mIsMenuVisible) { 486f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mHandler.sendEmptyMessageDelayed(MSG_HIDE_BARS, HIDE_BARS_TIMEOUT); 487f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 488f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 489f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 490aeb3062e84ed28f0e25a73f511f287ae0a3e4294Chih-Chung Chang private boolean canShowBars() { 491aeb3062e84ed28f0e25a73f511f287ae0a3e4294Chih-Chung Chang // No bars if we are showing camera preview. 492aeb3062e84ed28f0e25a73f511f287ae0a3e4294Chih-Chung Chang if (mAppBridge != null && mCurrentIndex == 0) return false; 493aeb3062e84ed28f0e25a73f511f287ae0a3e4294Chih-Chung Chang // No bars if it's not allowed. 494aeb3062e84ed28f0e25a73f511f287ae0a3e4294Chih-Chung Chang if (!mActionBarAllowed) return false; 495aeb3062e84ed28f0e25a73f511f287ae0a3e4294Chih-Chung Chang 496aeb3062e84ed28f0e25a73f511f287ae0a3e4294Chih-Chung Chang return true; 497aeb3062e84ed28f0e25a73f511f287ae0a3e4294Chih-Chung Chang } 498aeb3062e84ed28f0e25a73f511f287ae0a3e4294Chih-Chung Chang 499e6251df06f0b3c8f556043f8b725b4b19be7474dChih-Chung Chang private void wantBars() { 500e6251df06f0b3c8f556043f8b725b4b19be7474dChih-Chung Chang if (canShowBars()) showBars(); 501e6251df06f0b3c8f556043f8b725b4b19be7474dChih-Chung Chang } 502e6251df06f0b3c8f556043f8b725b4b19be7474dChih-Chung Chang 50361f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang private void toggleBars() { 504f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (mShowBars) { 505f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin hideBars(); 506aeb3062e84ed28f0e25a73f511f287ae0a3e4294Chih-Chung Chang } else { 507e6251df06f0b3c8f556043f8b725b4b19be7474dChih-Chung Chang if (canShowBars()) showBars(); 508f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 509f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 510f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 51161f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang private void updateBars() { 512e6251df06f0b3c8f556043f8b725b4b19be7474dChih-Chung Chang if (!canShowBars()) { 51361f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang hideBars(); 51461f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang } 515f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 516f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 517f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 5182ef46ed28b28b355d7f3f1432c7b1196b832a859Chih-Chung Chang public void onOrientationCompensationChanged() { 5192ef46ed28b28b355d7f3f1432c7b1196b832a859Chih-Chung Chang mActivity.getGLRoot().requestLayoutContentPane(); 520bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang } 521bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang 522bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang @Override 523f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin protected void onBackPressed() { 524f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (mShowDetails) { 525f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin hideDetails(); 5263b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang } else if (mAppBridge == null || !switchWithCaptureAnimation(-1)) { 527bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang // We are leaving this page. Set the result now. 528bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang setResult(); 52954fe6202b6f7d233e7645c121321fe0f3d20fc8bYuli Huang if (mTreatBackAsUp) { 53054fe6202b6f7d233e7645c121321fe0f3d20fc8bYuli Huang onUpPressed(); 53154fe6202b6f7d233e7645c121321fe0f3d20fc8bYuli Huang } else { 53254fe6202b6f7d233e7645c121321fe0f3d20fc8bYuli Huang super.onBackPressed(); 53354fe6202b6f7d233e7645c121321fe0f3d20fc8bYuli Huang } 534f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 535f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 536f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 537b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang private void onUpPressed() { 538b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang if (mActivity.getStateManager().getStateCount() > 1) { 539b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang super.onBackPressed(); 540ba12eae90b5b1a80ee002aa0df8c5c5189c4faa3Chih-Chung Chang return; 54166ca848b2f58b813d366642088d274a1b7c4a90cChih-Chung Chang } 54266ca848b2f58b813d366642088d274a1b7c4a90cChih-Chung Chang 54366ca848b2f58b813d366642088d274a1b7c4a90cChih-Chung Chang if (mOriginalSetPathString == null) return; 54466ca848b2f58b813d366642088d274a1b7c4a90cChih-Chung Chang 54566ca848b2f58b813d366642088d274a1b7c4a90cChih-Chung Chang if (mAppBridge == null) { 546b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang // We're in view mode so set up the stacks on our own. 547b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang Bundle data = new Bundle(getData()); 548b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang data.putString(AlbumPage.KEY_MEDIA_PATH, mOriginalSetPathString); 549b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang data.putString(AlbumPage.KEY_PARENT_MEDIA_PATH, 550b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang mActivity.getDataManager().getTopSetPath( 551b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang DataManager.INCLUDE_ALL)); 552b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang mActivity.getStateManager().switchState(this, AlbumPage.class, data); 55366ca848b2f58b813d366642088d274a1b7c4a90cChih-Chung Chang } else { 55466ca848b2f58b813d366642088d274a1b7c4a90cChih-Chung Chang // Start the real gallery activity to view the camera roll. 55566ca848b2f58b813d366642088d274a1b7c4a90cChih-Chung Chang Uri uri = Uri.parse("content://media/external/file?bucketId=" 55666ca848b2f58b813d366642088d274a1b7c4a90cChih-Chung Chang + MediaSetUtils.CAMERA_BUCKET_ID); 55766ca848b2f58b813d366642088d274a1b7c4a90cChih-Chung Chang Intent intent = new Intent(Intent.ACTION_VIEW); 55866ca848b2f58b813d366642088d274a1b7c4a90cChih-Chung Chang intent.setDataAndType(uri, ContentResolver.CURSOR_DIR_BASE_TYPE + "/image"); 55966ca848b2f58b813d366642088d274a1b7c4a90cChih-Chung Chang ((Activity) mActivity).startActivity(intent); 560b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang } 561b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang } 562b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang 563bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang private void setResult() { 564bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang Intent result = null; 565bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang if (!mPhotoView.getFilmMode()) { 566bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang result = new Intent(); 567bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang result.putExtra(KEY_RETURN_INDEX_HINT, mCurrentIndex); 568bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang } 569bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang setStateResult(Activity.RESULT_OK, result); 570bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang } 571bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang 572bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang ////////////////////////////////////////////////////////////////////////// 573bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang // AppBridge.Server interface 574bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang ////////////////////////////////////////////////////////////////////////// 575bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang 576bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang @Override 5772ef46ed28b28b355d7f3f1432c7b1196b832a859Chih-Chung Chang public void setCameraRelativeFrame(Rect frame) { 5782ef46ed28b28b355d7f3f1432c7b1196b832a859Chih-Chung Chang mPhotoView.setCameraRelativeFrame(frame); 579bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang } 580bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang 581bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang @Override 5822c6173822a612597c79be41b126367ddfbb5d518Chih-Chung Chang public boolean switchWithCaptureAnimation(int offset) { 5832c6173822a612597c79be41b126367ddfbb5d518Chih-Chung Chang return mPhotoView.switchWithCaptureAnimation(offset); 5842c6173822a612597c79be41b126367ddfbb5d518Chih-Chung Chang } 5852c6173822a612597c79be41b126367ddfbb5d518Chih-Chung Chang 586f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 5876575794a9c09f22d5721e212c093e0a2df376d0cChih-Chung Chang public void setSwipingEnabled(boolean enabled) { 5886575794a9c09f22d5721e212c093e0a2df376d0cChih-Chung Chang mPhotoView.setSwipingEnabled(enabled); 5896575794a9c09f22d5721e212c093e0a2df376d0cChih-Chung Chang } 5906575794a9c09f22d5721e212c093e0a2df376d0cChih-Chung Chang 5916575794a9c09f22d5721e212c093e0a2df376d0cChih-Chung Chang @Override 5923b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang public void notifyScreenNailChanged() { 5933b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang mScreenNailItem.setScreenNail(mAppBridge.attachScreenNail()); 5943b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang mScreenNailSet.notifyChange(); 5953b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang } 5963b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang 5973b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang @Override 598a0ce682e40c39ce046c48d8a7f989fff01bb9f2cWu-cheng Li public void addSecureAlbumItem(boolean isVideo, int id) { 599a0ce682e40c39ce046c48d8a7f989fff01bb9f2cWu-cheng Li mSecureAlbum.addMediaItem(isVideo, id); 600a0ce682e40c39ce046c48d8a7f989fff01bb9f2cWu-cheng Li } 601a0ce682e40c39ce046c48d8a7f989fff01bb9f2cWu-cheng Li 602a0ce682e40c39ce046c48d8a7f989fff01bb9f2cWu-cheng Li @Override 603f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin protected boolean onCreateActionBar(Menu menu) { 604b21b8e58a604f6c701245d84b141b5b87663192bOwen Lin mActionBar.createActionBarMenu(R.menu.photo, menu); 605cf46a3abc26aac7cdb6b6993aeade053304b71d9Ray Chen if (mPendingSharePath != null) updateShareURI(mPendingSharePath); 606f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin updateMenuOperations(); 607ed46d77c16cd80357f4a0feada2435dfba8104a6Yuli Huang updateTitle(); 608b21b8e58a604f6c701245d84b141b5b87663192bOwen Lin return true; 609f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 610f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 611d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin private MenuExecutor.ProgressListener mConfirmDialogListener = 612d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin new MenuExecutor.ProgressListener() { 613d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin @Override 614d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin public void onProgressUpdate(int index) {} 615d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin 616d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin @Override 617d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin public void onProgressComplete(int result) {} 618d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin 619d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin @Override 620d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin public void onConfirmDialogShown() { 621d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin mHandler.removeMessages(MSG_HIDE_BARS); 622d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin } 623d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin 624d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin @Override 625d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin public void onConfirmDialogDismissed(boolean confirmed) { 626d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin refreshHidingMessage(); 627d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin } 628ba50b9420e64731fd5aa8b1410e1f36457a1635aBobby Georgescu 629ba50b9420e64731fd5aa8b1410e1f36457a1635aBobby Georgescu @Override 630ba50b9420e64731fd5aa8b1410e1f36457a1635aBobby Georgescu public void onProgressStart() {} 631d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin }; 632d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin 633f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 634f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin protected boolean onItemSelected(MenuItem item) { 635d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin refreshHidingMessage(); 636616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin MediaItem current = mModel.getMediaItem(0); 637f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 638f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (current == null) { 639f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin // item is not ready, ignore 640f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return true; 641f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 642f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 643f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin int currentIndex = mModel.getCurrentIndex(); 644f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin Path path = current.getPath(); 645f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 646f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin DataManager manager = mActivity.getDataManager(); 647f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin int action = item.getItemId(); 6489a033b07b8e0d9fe7419b7a0d876e9c7febf43c8Ray Chen String confirmMsg = null; 649f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin switch (action) { 65084c220f10a643927c8a2126de8a755d8d7f7ec9eRay Chen case android.R.id.home: { 651b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang onUpPressed(); 65284c220f10a643927c8a2126de8a755d8d7f7ec9eRay Chen return true; 65384c220f10a643927c8a2126de8a755d8d7f7ec9eRay Chen } 654f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin case R.id.action_slideshow: { 655f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin Bundle data = new Bundle(); 6566cf807453fb58ccd4cc513ff187b306c7090e67cOwen Lin data.putString(SlideshowPage.KEY_SET_PATH, mMediaSet.getPath().toString()); 657604f053d040782159b61d3b74ee533bc2c0ccdd0Ray Chen data.putString(SlideshowPage.KEY_ITEM_PATH, path.toString()); 658f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin data.putInt(SlideshowPage.KEY_PHOTO_INDEX, currentIndex); 659f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin data.putBoolean(SlideshowPage.KEY_REPEAT, true); 660f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mActivity.getStateManager().startStateForResult( 661f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin SlideshowPage.class, REQUEST_SLIDESHOW, data); 662f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return true; 663f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 664f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin case R.id.action_crop: { 665898a2f4540635528a0916b0a6b0a177869854ae9Wu-cheng Li Activity activity = mActivity; 666f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin Intent intent = new Intent(CropImage.CROP_ACTION); 667f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin intent.setClass(activity, CropImage.class); 668f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin intent.setData(manager.getContentUri(path)); 669f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin activity.startActivityForResult(intent, PicasaSource.isPicasaImage(current) 670f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin ? REQUEST_CROP_PICASA 671f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin : REQUEST_CROP); 672f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return true; 673f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 67450ea2d2938218ac6b2039f0e42998cfbbc45d1f1Teng-Hui Zhu case R.id.action_trim: { 67550ea2d2938218ac6b2039f0e42998cfbbc45d1f1Teng-Hui Zhu // TODO: Add trimming activity here. 67650ea2d2938218ac6b2039f0e42998cfbbc45d1f1Teng-Hui Zhu return true; 67750ea2d2938218ac6b2039f0e42998cfbbc45d1f1Teng-Hui Zhu } 678f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang case R.id.action_edit: { 679f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang Intent intent = new Intent(Intent.ACTION_EDIT) 680f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang .setData(manager.getContentUri(path)) 681f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang .setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); 682f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang ((Activity) mActivity).startActivityForResult(Intent.createChooser(intent, null), 683f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang REQUEST_EDIT); 684f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang return true; 685f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang } 686f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin case R.id.action_details: { 687f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (mShowDetails) { 688f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin hideDetails(); 689f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } else { 690995c4566bed7df1aa48ba7e1351f964efa73880bMichael Kolb showDetails(); 691f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 692f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return true; 693f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 69467098d1a72fd04e2af06d3a5939cde28c65f70d9Ray Chen case R.id.action_delete: 6959a033b07b8e0d9fe7419b7a0d876e9c7febf43c8Ray Chen confirmMsg = mActivity.getResources().getQuantityString( 6969a033b07b8e0d9fe7419b7a0d876e9c7febf43c8Ray Chen R.plurals.delete_selection, 1); 697f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin case R.id.action_setas: 698f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin case R.id.action_rotate_ccw: 699f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin case R.id.action_rotate_cw: 700f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin case R.id.action_show_on_map: 701f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mSelectionManager.deSelectAll(); 702f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mSelectionManager.toggle(path); 703d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin mMenuExecutor.onMenuClicked(item, confirmMsg, mConfirmDialogListener); 704f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return true; 705f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin case R.id.action_import: 706f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mSelectionManager.deSelectAll(); 707f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mSelectionManager.toggle(path); 7089a033b07b8e0d9fe7419b7a0d876e9c7febf43c8Ray Chen mMenuExecutor.onMenuClicked(item, confirmMsg, 709f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin new ImportCompleteListener(mActivity)); 710f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return true; 711fb5571987f2555b04731b6f3e1c479efc16d542aWu-cheng Li case R.id.action_share: 712898a2f4540635528a0916b0a6b0a177869854ae9Wu-cheng Li Activity activity = mActivity; 713fb5571987f2555b04731b6f3e1c479efc16d542aWu-cheng Li Intent intent = createShareIntent(mCurrentPhoto.getPath()); 714fb5571987f2555b04731b6f3e1c479efc16d542aWu-cheng Li activity.startActivity(Intent.createChooser(intent, 715fb5571987f2555b04731b6f3e1c479efc16d542aWu-cheng Li activity.getString(R.string.share))); 716fb5571987f2555b04731b6f3e1c479efc16d542aWu-cheng Li return true; 717f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin default : 718f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return false; 719f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 720f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 721f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 722f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private void hideDetails() { 723f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mShowDetails = false; 7244105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen mDetailsHelper.hide(); 725f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 726f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 727995c4566bed7df1aa48ba7e1351f964efa73880bMichael Kolb private void showDetails() { 728f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mShowDetails = true; 7294105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen if (mDetailsHelper == null) { 7304105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen mDetailsHelper = new DetailsHelper(mActivity, mRootPane, new MyDetailsSource()); 7314105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen mDetailsHelper.setCloseListener(new CloseListener() { 73206c6401eededc2ec842ba4994a838c2ded0a666cPin Ting @Override 733f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void onClose() { 734f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin hideDetails(); 735f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 736f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin }); 737f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 7384105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen mDetailsHelper.show(); 739f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 740f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 741bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang //////////////////////////////////////////////////////////////////////////// 742bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang // Callbacks from PhotoView 743bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang //////////////////////////////////////////////////////////////////////////// 744bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang @Override 745f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void onSingleTapUp(int x, int y) { 746bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang if (mAppBridge != null) { 747bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang if (mAppBridge.onSingleTapUp(x, y)) return; 748014d9586d8145a33f4e99eaad570587f6d650026Wu-cheng Li } 749014d9586d8145a33f4e99eaad570587f6d650026Wu-cheng Li 750616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin MediaItem item = mModel.getMediaItem(0); 751b5dc542fbaeaf99bebdcf775ef0e034e89e88eaeWu-cheng Li if (item == null || item == mScreenNailItem) { 752b5dc542fbaeaf99bebdcf775ef0e034e89e88eaeWu-cheng Li // item is not ready or it is camera preview, ignore 753f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return; 754f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 755f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 756898a2f4540635528a0916b0a6b0a177869854ae9Wu-cheng Li boolean playVideo = (mSecureAlbum == null) && 757898a2f4540635528a0916b0a6b0a177869854ae9Wu-cheng Li ((item.getSupportedOperations() & MediaItem.SUPPORT_PLAY) != 0); 758f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 759f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (playVideo) { 760f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin // determine if the point is at center (1/6) of the photo view. 761f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin // (The position of the "play" icon is at center (1/6) of the photo) 762f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin int w = mPhotoView.getWidth(); 763f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin int h = mPhotoView.getHeight(); 764f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin playVideo = (Math.abs(x - w / 2) * 12 <= w) 765f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin && (Math.abs(y - h / 2) * 12 <= h); 766f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 767f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 768f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (playVideo) { 769898a2f4540635528a0916b0a6b0a177869854ae9Wu-cheng Li playVideo(mActivity, item.getPlayUri(), item.getName()); 770f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } else { 77161f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang toggleBars(); 772f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 773f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 774f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 775bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang @Override 776bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang public void lockOrientation() { 777bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang mHandler.sendEmptyMessage(MSG_LOCK_ORIENTATION); 778bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang } 779bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang 780bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang @Override 781bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang public void unlockOrientation() { 78206c6401eededc2ec842ba4994a838c2ded0a666cPin Ting mHandler.sendEmptyMessage(MSG_UNLOCK_ORIENTATION); 783bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang } 784bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang 785bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang @Override 78661f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang public void onActionBarAllowed(boolean allowed) { 78761f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang mActionBarAllowed = allowed; 78861f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang mHandler.sendEmptyMessage(MSG_UPDATE_ACTION_BAR); 78961f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang } 79061f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang 79161f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang @Override 792e6251df06f0b3c8f556043f8b725b4b19be7474dChih-Chung Chang public void onActionBarWanted() { 793e6251df06f0b3c8f556043f8b725b4b19be7474dChih-Chung Chang mHandler.sendEmptyMessage(MSG_WANT_BARS); 794e6251df06f0b3c8f556043f8b725b4b19be7474dChih-Chung Chang } 795e6251df06f0b3c8f556043f8b725b4b19be7474dChih-Chung Chang 796e6251df06f0b3c8f556043f8b725b4b19be7474dChih-Chung Chang @Override 797bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang public void onFullScreenChanged(boolean full) { 798bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang Message m = mHandler.obtainMessage( 799bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang MSG_ON_FULL_SCREEN_CHANGED, full ? 1 : 0, 0); 800bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang m.sendToTarget(); 801bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang } 802bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang 8036b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang // How we do delete/undo: 8046b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang // 8056b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang // When the user choose to delete a media item, we just tell the 8066b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang // FilterDeleteSet to hide that item. If the user choose to undo it, we 8076b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang // again tell FilterDeleteSet not to hide it. If the user choose to commit 8086b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang // the deletion, we then actually delete the media item. 8096b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang @Override 8106b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang public void onDeleteImage(Path path, int offset) { 8116118af9ddad8acc050133154f8f60c842c7f9bfaChih-Chung Chang onCommitDeleteImage(); // commit the previous deletion 8126b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang mDeletePath = path; 8136b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang mDeleteIsFocus = (offset == 0); 8146118af9ddad8acc050133154f8f60c842c7f9bfaChih-Chung Chang mMediaSet.addDeletion(path, mCurrentIndex + offset); 8156b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang } 8166b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang 8176b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang @Override 8186b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang public void onUndoDeleteImage() { 8196118af9ddad8acc050133154f8f60c842c7f9bfaChih-Chung Chang if (mDeletePath == null) return; 8206b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang // If the deletion was done on the focused item, we want the model to 8216b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang // focus on it when it is undeleted. 8226b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang if (mDeleteIsFocus) mModel.setFocusHintPath(mDeletePath); 8236118af9ddad8acc050133154f8f60c842c7f9bfaChih-Chung Chang mMediaSet.removeDeletion(mDeletePath); 8246b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang mDeletePath = null; 8256b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang } 8266b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang 8276b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang @Override 8286b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang public void onCommitDeleteImage() { 8296b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang if (mDeletePath == null) return; 8306b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang mSelectionManager.deSelectAll(); 8316b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang mSelectionManager.toggle(mDeletePath); 8326b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang mMenuExecutor.onMenuClicked(R.id.action_delete, null, true, false); 8336b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang mDeletePath = null; 8346b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang } 8356b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang 836f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public static void playVideo(Activity activity, Uri uri, String title) { 837f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin try { 838f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin Intent intent = new Intent(Intent.ACTION_VIEW) 839a3871050845b4921379add2b126add3cfbab1109Ray Chen .setDataAndType(uri, "video/*") 840a3871050845b4921379add2b126add3cfbab1109Ray Chen .putExtra(Intent.EXTRA_TITLE, title) 841a3871050845b4921379add2b126add3cfbab1109Ray Chen .putExtra(MovieActivity.KEY_TREAT_UP_AS_BACK, true); 84271cd89a38752bc22ae0ec2df965e4280b776623cChih-Chung Chang activity.startActivityForResult(intent, REQUEST_PLAY_VIDEO); 843f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } catch (ActivityNotFoundException e) { 844f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin Toast.makeText(activity, activity.getString(R.string.video_err), 845f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin Toast.LENGTH_SHORT).show(); 846f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 847f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 848f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 849f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang private void setCurrentPhotoByIntent(Intent intent) { 850f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang if (intent == null) return; 851f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang Path path = mApplication.getDataManager() 852f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang .findPathByUri(intent.getData(), intent.getType()); 853f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang if (path != null) { 854f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang mModel.setCurrentPhoto(path, mCurrentIndex); 855f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang } 856f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang } 857f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang 858f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 859f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin protected void onStateResult(int requestCode, int resultCode, Intent data) { 86071cd89a38752bc22ae0ec2df965e4280b776623cChih-Chung Chang mHasActivityResult = true; 861f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin switch (requestCode) { 862f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang case REQUEST_EDIT: 863f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang setCurrentPhotoByIntent(data); 864f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang break; 865f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin case REQUEST_CROP: 866f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (resultCode == Activity.RESULT_OK) { 867f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang setCurrentPhotoByIntent(data); 868f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 869f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin break; 870f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin case REQUEST_CROP_PICASA: { 871f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang if (resultCode == Activity.RESULT_OK) { 872f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang Context context = mActivity.getAndroidContext(); 87388cc2ca5f5596762a5546ec7426756f2036be455Yuli Huang String message = context.getString(R.string.crop_saved, 874f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang context.getString(R.string.folder_download)); 875f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang Toast.makeText(context, message, Toast.LENGTH_SHORT).show(); 876f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang } 877f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin break; 878f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 879f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin case REQUEST_SLIDESHOW: { 880f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (data == null) break; 881f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin String path = data.getStringExtra(SlideshowPage.KEY_ITEM_PATH); 882f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin int index = data.getIntExtra(SlideshowPage.KEY_PHOTO_INDEX, 0); 883f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (path != null) { 884f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mModel.setCurrentPhoto(Path.fromString(path), index); 885f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 886f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 887f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 888f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 889f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 89014d3289b4867c21da93ec4032119c0091bc78c30George Mount @Override 89114d3289b4867c21da93ec4032119c0091bc78c30George Mount protected void clearStateResult() { 89214d3289b4867c21da93ec4032119c0091bc78c30George Mount mHasActivityResult = false; 89314d3289b4867c21da93ec4032119c0091bc78c30George Mount } 89414d3289b4867c21da93ec4032119c0091bc78c30George Mount 895616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin private class PreparePhotoFallback implements OnGLIdleListener { 896616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin private PhotoFallbackEffect mPhotoFallback = new PhotoFallbackEffect(); 897616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin private boolean mResultReady = false; 898616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin 899616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin public synchronized PhotoFallbackEffect get() { 900616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin while (!mResultReady) { 901616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin Utils.waitWithoutInterrupt(this); 902616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin } 903616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin return mPhotoFallback; 904616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin } 905616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin 906616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin @Override 907616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin public boolean onGLIdle(GLCanvas canvas, boolean renderRequested) { 908616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin mPhotoFallback = mPhotoView.buildFallbackEffect(mRootPane, canvas); 909616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin synchronized (this) { 910616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin mResultReady = true; 911616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin notifyAll(); 912616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin } 913616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin return false; 914616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin } 915616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin } 916616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin 917616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin private void preparePhotoFallbackView() { 918616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin GLRoot root = mActivity.getGLRoot(); 919616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin PreparePhotoFallback task = new PreparePhotoFallback(); 920616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin root.unlockRenderThread(); 921616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin PhotoFallbackEffect anim; 922616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin try { 923616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin root.addOnGLIdleListener(task); 924616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin anim = task.get(); 925616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin } finally { 926616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin root.lockRenderThread(); 927616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin } 928616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin mActivity.getTransitionStore().put( 929616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin AlbumPage.KEY_RESUME_ANIMATION, anim); 930616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin } 931616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin 932f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 933f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void onPause() { 934d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin super.onPause(); 935d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin mIsActive = false; 936d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin 937bd7c016d728853d38f98a3c6077b7bd9b08858b9Yuli Huang mActivity.getGLRoot().unfreeze(); 938bd7c016d728853d38f98a3c6077b7bd9b08858b9Yuli Huang mHandler.removeMessages(MSG_UNFREEZE_GLROOT); 939616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin if (isFinishing()) preparePhotoFallbackView(); 940253c5aec7692afdd7880fbd169d4b44d5679cbc0Chih-Chung Chang 9414105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen DetailsHelper.pause(); 942f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mPhotoView.pause(); 943f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mModel.pause(); 944f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mHandler.removeMessages(MSG_HIDE_BARS); 945f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mActionBar.removeOnMenuVisibilityListener(mMenuVisibilityListener); 94633ef03776b7734717b16f6fc861b831fb1b1dfacMartijn Coenen 9476b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang onCommitDeleteImage(); 9482785956f8f5654966a41e20f482f4af3057eea3fChih-Chung Chang mMenuExecutor.pause(); 9496118af9ddad8acc050133154f8f60c842c7f9bfaChih-Chung Chang if (mMediaSet != null) mMediaSet.clearDeletion(); 950f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 951f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 952f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 953bd7c016d728853d38f98a3c6077b7bd9b08858b9Yuli Huang public void onCurrentImageUpdated() { 954bd7c016d728853d38f98a3c6077b7bd9b08858b9Yuli Huang mActivity.getGLRoot().unfreeze(); 955bd7c016d728853d38f98a3c6077b7bd9b08858b9Yuli Huang } 956bd7c016d728853d38f98a3c6077b7bd9b08858b9Yuli Huang 957bd7c016d728853d38f98a3c6077b7bd9b08858b9Yuli Huang @Override 958f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin protected void onResume() { 959f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin super.onResume(); 960d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin mActivity.getGLRoot().freeze(); 961f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mIsActive = true; 962f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin setContentPane(mRootPane); 96304ac045bf8da5082bbb0bdc9ea5f9c9b5b796ad0Yuli Huang 964f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mModel.resume(); 965f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mPhotoView.resume(); 966898a2f4540635528a0916b0a6b0a177869854ae9Wu-cheng Li mActionBar.setDisplayOptions( 967898a2f4540635528a0916b0a6b0a177869854ae9Wu-cheng Li ((mSecureAlbum == null) && (mSetPathString != null)), true); 968f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mActionBar.addOnMenuVisibilityListener(mMenuVisibilityListener); 96933ef03776b7734717b16f6fc861b831fb1b1dfacMartijn Coenen 97071cd89a38752bc22ae0ec2df965e4280b776623cChih-Chung Chang if (mAppBridge != null && !mHasActivityResult) { 97133f8567dd5003e4bb342683f3768ab7552648b02Chih-Chung Chang mPhotoView.resetToFirstPicture(); 972bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang } 97371cd89a38752bc22ae0ec2df965e4280b776623cChih-Chung Chang mHasActivityResult = false; 974bd7c016d728853d38f98a3c6077b7bd9b08858b9Yuli Huang mHandler.sendEmptyMessageDelayed(MSG_UNFREEZE_GLROOT, UNFREEZE_GLROOT_TIMEOUT); 975f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 976f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 97715b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang @Override 97815b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang protected void onDestroy() { 979bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang if (mAppBridge != null) { 980253c5aec7692afdd7880fbd169d4b44d5679cbc0Chih-Chung Chang mAppBridge.setServer(null); 9813b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang mScreenNailItem.setScreenNail(null); 982bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang mAppBridge.detachScreenNail(); 983bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang mAppBridge = null; 9843b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang mScreenNailSet = null; 9853b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang mScreenNailItem = null; 986b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang } 987bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang mOrientationManager.removeListener(this); 9882ef46ed28b28b355d7f3f1432c7b1196b832a859Chih-Chung Chang mActivity.getGLRoot().setOrientationSource(null); 989aeb3062e84ed28f0e25a73f511f287ae0a3e4294Chih-Chung Chang 990aeb3062e84ed28f0e25a73f511f287ae0a3e4294Chih-Chung Chang // Remove all pending messages. 991aeb3062e84ed28f0e25a73f511f287ae0a3e4294Chih-Chung Chang mHandler.removeCallbacksAndMessages(null); 99215b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang super.onDestroy(); 99315b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang } 99415b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang 995f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private class MyDetailsSource implements DetailsSource { 9966cf807453fb58ccd4cc513ff187b306c7090e67cOwen Lin 9976cf807453fb58ccd4cc513ff187b306c7090e67cOwen Lin @Override 998f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public MediaDetails getDetails() { 999616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin return mModel.getMediaItem(0).getDetails(); 1000f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 10016cf807453fb58ccd4cc513ff187b306c7090e67cOwen Lin 10026cf807453fb58ccd4cc513ff187b306c7090e67cOwen Lin @Override 1003f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public int size() { 1004f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return mMediaSet != null ? mMediaSet.getMediaItemCount() : 1; 1005f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 10066cf807453fb58ccd4cc513ff187b306c7090e67cOwen Lin 10076cf807453fb58ccd4cc513ff187b306c7090e67cOwen Lin @Override 1008995c4566bed7df1aa48ba7e1351f964efa73880bMichael Kolb public int setIndex() { 1009995c4566bed7df1aa48ba7e1351f964efa73880bMichael Kolb return mModel.getCurrentIndex(); 10104105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen } 1011f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 1012f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin} 1013