PhotoPage.java revision f8a39c644637a15b9291eb9299762b8cf91cd76a
1f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin/* 2f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * Copyright (C) 2010 The Android Open Source Project 3f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * 4f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * Licensed under the Apache License, Version 2.0 (the "License"); 5f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * you may not use this file except in compliance with the License. 6f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * You may obtain a copy of the License at 7f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * 8f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * http://www.apache.org/licenses/LICENSE-2.0 9f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * 10f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * Unless required by applicable law or agreed to in writing, software 11f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * distributed under the License is distributed on an "AS IS" BASIS, 12f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * See the License for the specific language governing permissions and 14f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * limitations under the License. 15f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin */ 16f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 17f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linpackage com.android.gallery3d.app; 18f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 19fc86994f86f8cfb31e151c9e730dc1e9dc7b3349Yuli Huangimport android.annotation.TargetApi; 208bc5bebba780ca4a322b466b06fc909331697cf4Owen Linimport android.app.Activity; 21604f053d040782159b61d3b74ee533bc2c0ccdd0Ray Chenimport android.content.ActivityNotFoundException; 2266ca848b2f58b813d366642088d274a1b7c4a90cChih-Chung Changimport android.content.ContentResolver; 23604f053d040782159b61d3b74ee533bc2c0ccdd0Ray Chenimport android.content.Context; 24604f053d040782159b61d3b74ee533bc2c0ccdd0Ray Chenimport android.content.Intent; 25a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescuimport android.content.pm.PackageManager; 2604ac045bf8da5082bbb0bdc9ea5f9c9b5b796ad0Yuli Huangimport android.graphics.Rect; 27604f053d040782159b61d3b74ee533bc2c0ccdd0Ray Chenimport android.net.Uri; 2833ef03776b7734717b16f6fc861b831fb1b1dfacMartijn Coenenimport android.nfc.NfcAdapter; 29604f053d040782159b61d3b74ee533bc2c0ccdd0Ray Chenimport android.os.Bundle; 30604f053d040782159b61d3b74ee533bc2c0ccdd0Ray Chenimport android.os.Handler; 31604f053d040782159b61d3b74ee533bc2c0ccdd0Ray Chenimport android.os.Message; 32a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescuimport android.view.View; 33a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescuimport android.view.View.OnClickListener; 34f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescuimport android.view.animation.AccelerateInterpolator; 35a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescuimport android.widget.ImageView; 36a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescuimport android.widget.RelativeLayout; 37604f053d040782159b61d3b74ee533bc2c0ccdd0Ray Chenimport android.widget.Toast; 38604f053d040782159b61d3b74ee533bc2c0ccdd0Ray Chen 39b21b8e58a604f6c701245d84b141b5b87663192bOwen Linimport com.actionbarsherlock.app.ActionBar.OnMenuVisibilityListener; 40b21b8e58a604f6c701245d84b141b5b87663192bOwen Linimport com.actionbarsherlock.view.Menu; 41b21b8e58a604f6c701245d84b141b5b87663192bOwen Linimport com.actionbarsherlock.view.MenuItem; 42f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.R; 43f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescuimport com.android.gallery3d.anim.FloatAnimation; 44fc86994f86f8cfb31e151c9e730dc1e9dc7b3349Yuli Huangimport com.android.gallery3d.common.ApiHelper; 45616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Linimport com.android.gallery3d.common.Utils; 46f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.data.DataManager; 476b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Changimport com.android.gallery3d.data.FilterDeleteSet; 48f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.data.MediaDetails; 49f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.data.MediaItem; 50f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.data.MediaObject; 51f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.data.MediaSet; 526b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Changimport com.android.gallery3d.data.MtpSource; 53f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.data.Path; 54a0ce682e40c39ce046c48d8a7f989fff01bb9f2cWu-cheng Liimport com.android.gallery3d.data.SecureAlbum; 55a0ce682e40c39ce046c48d8a7f989fff01bb9f2cWu-cheng Liimport com.android.gallery3d.data.SecureSource; 563b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Changimport com.android.gallery3d.data.SnailAlbum; 573b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Changimport com.android.gallery3d.data.SnailItem; 5815b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Changimport com.android.gallery3d.data.SnailSource; 59f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.picasasource.PicasaSource; 60f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescuimport com.android.gallery3d.ui.AnimationTime; 6124081fe26ca25448ddb9c8f9cc7f406d26344decOwen Linimport com.android.gallery3d.ui.BitmapScreenNail; 624105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chenimport com.android.gallery3d.ui.DetailsHelper; 634105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chenimport com.android.gallery3d.ui.DetailsHelper.CloseListener; 644105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chenimport com.android.gallery3d.ui.DetailsHelper.DetailsSource; 65f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.ui.GLCanvas; 66616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Linimport com.android.gallery3d.ui.GLRoot; 67616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Linimport com.android.gallery3d.ui.GLRoot.OnGLIdleListener; 68f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.ui.GLView; 69f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.ui.ImportCompleteListener; 70f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.ui.MenuExecutor; 71616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Linimport com.android.gallery3d.ui.PhotoFallbackEffect; 7221a412c93c9b0401b039f4eb86d4950752e5bb84Owen Linimport com.android.gallery3d.ui.PhotoView; 7351bc561e85053abfd7fda695e3cd20710acca85cBobby Georgescuimport com.android.gallery3d.ui.PreparePageFadeoutTexture; 74f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescuimport com.android.gallery3d.ui.RawTexture; 75f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.ui.SelectionManager; 76f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.ui.SynchronizedHandler; 77f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.util.GalleryUtils; 78c6781c0c0d8d193863ca09455a5bda3d542db493Bobby Georgescuimport com.android.gallery3d.util.LightCycleHelper; 7966ca848b2f58b813d366642088d274a1b7c4a90cChih-Chung Changimport com.android.gallery3d.util.MediaSetUtils; 80f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 81bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Changpublic class PhotoPage extends ActivityState implements 8261f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang PhotoView.Listener, OrientationManager.Listener, AppBridge.Server { 83f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private static final String TAG = "PhotoPage"; 84f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 85f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private static final int MSG_HIDE_BARS = 1; 86bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang private static final int MSG_LOCK_ORIENTATION = 2; 87bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang private static final int MSG_UNLOCK_ORIENTATION = 3; 88bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang private static final int MSG_ON_FULL_SCREEN_CHANGED = 4; 8961f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang private static final int MSG_UPDATE_ACTION_BAR = 5; 90bd7c016d728853d38f98a3c6077b7bd9b08858b9Yuli Huang private static final int MSG_UNFREEZE_GLROOT = 6; 91e6251df06f0b3c8f556043f8b725b4b19be7474dChih-Chung Chang private static final int MSG_WANT_BARS = 7; 927eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu private static final int MSG_REFRESH_GRID_BUTTON = 8; 93a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu private static final int MSG_REFRESH_EDIT_BUTTON = 9; 946cf807453fb58ccd4cc513ff187b306c7090e67cOwen Lin 95f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private static final int HIDE_BARS_TIMEOUT = 3500; 96bd7c016d728853d38f98a3c6077b7bd9b08858b9Yuli Huang private static final int UNFREEZE_GLROOT_TIMEOUT = 250; 97f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 98f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private static final int REQUEST_SLIDESHOW = 1; 99f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private static final int REQUEST_CROP = 2; 100f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private static final int REQUEST_CROP_PICASA = 3; 101f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang private static final int REQUEST_EDIT = 4; 10271cd89a38752bc22ae0ec2df965e4280b776623cChih-Chung Chang private static final int REQUEST_PLAY_VIDEO = 5; 1033f1f1baf3a674927e25cd5cd885fb372796bd3a0Teng-Hui Zhu private static final int REQUEST_TRIM = 6; 104f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 105f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public static final String KEY_MEDIA_SET_PATH = "media-set-path"; 106f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public static final String KEY_MEDIA_ITEM_PATH = "media-item-path"; 107f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public static final String KEY_INDEX_HINT = "index-hint"; 10804ac045bf8da5082bbb0bdc9ea5f9c9b5b796ad0Yuli Huang public static final String KEY_OPEN_ANIMATION_RECT = "open-animation-rect"; 109bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang public static final String KEY_APP_BRIDGE = "app-bridge"; 11054fe6202b6f7d233e7645c121321fe0f3d20fc8bYuli Huang public static final String KEY_TREAT_BACK_AS_UP = "treat-back-as-up"; 1117eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu public static final String KEY_START_IN_FILMSTRIP = "start-in-filmstrip"; 112bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang public static final String KEY_RETURN_INDEX_HINT = "return-index-hint"; 113f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 1147eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu public static final String KEY_ALBUMPAGE_TRANSITION = "albumpage-transition"; 1157eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu public static final int MSG_ALBUMPAGE_NONE = 0; 1167eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu public static final int MSG_ALBUMPAGE_STARTED = 1; 1177eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu public static final int MSG_ALBUMPAGE_RESUMED = 2; 1187eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu public static final int MSG_ALBUMPAGE_PICKED = 4; 1197eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu 120a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu public static final String ACTION_NEXTGEN_EDIT = "action_nextgen_edit"; 121a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu 122f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private GalleryApp mApplication; 123f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private SelectionManager mSelectionManager; 124f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 125f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private PhotoView mPhotoView; 126f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private PhotoPage.Model mModel; 1274105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen private DetailsHelper mDetailsHelper; 128f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private boolean mShowDetails; 129f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 130f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin // mMediaSet could be null if there is no KEY_MEDIA_SET_PATH supplied. 131f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin // E.g., viewing a photo in gmail attachment 1326b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang private FilterDeleteSet mMediaSet; 133f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 134a0ce682e40c39ce046c48d8a7f989fff01bb9f2cWu-cheng Li // The mediaset used by camera launched from secure lock screen. 135a0ce682e40c39ce046c48d8a7f989fff01bb9f2cWu-cheng Li private SecureAlbum mSecureAlbum; 136a0ce682e40c39ce046c48d8a7f989fff01bb9f2cWu-cheng Li 137f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private int mCurrentIndex = 0; 138f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private Handler mHandler; 139113bfc77c4468411da9ae1290553c3be89f8df9aOwen Lin private boolean mShowBars = true; 14061f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang private volatile boolean mActionBarAllowed = true; 1418cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen private GalleryActionBar mActionBar; 142f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private boolean mIsMenuVisible; 143f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private MediaItem mCurrentPhoto = null; 144f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private MenuExecutor mMenuExecutor; 145f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private boolean mIsActive; 14684c220f10a643927c8a2126de8a755d8d7f7ec9eRay Chen private String mSetPathString; 147b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang // This is the original mSetPathString before adding the camera preview item. 148b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang private String mOriginalSetPathString; 149bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang private AppBridge mAppBridge; 1503b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang private SnailItem mScreenNailItem; 1513b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang private SnailAlbum mScreenNailSet; 152bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang private OrientationManager mOrientationManager; 15371cd89a38752bc22ae0ec2df965e4280b776623cChih-Chung Chang private boolean mHasActivityResult; 15454fe6202b6f7d233e7645c121321fe0f3d20fc8bYuli Huang private boolean mTreatBackAsUp; 1557eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu private boolean mStartInFilmstrip; 1567eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu private boolean mStartedFromAlbumPage; 15715b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang 158f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu private RawTexture mFadeOutTexture; 159f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu private Rect mOpenAnimationRect; 1607eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu public static final int ANIM_TIME_OPENING = 300; 161f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu 1626b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang // The item that is deleted (but it can still be undeleted before commiting) 1636b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang private Path mDeletePath; 1646b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang private boolean mDeleteIsFocus; // whether the deleted item was in focus 1656b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang 16633ef03776b7734717b16f6fc861b831fb1b1dfacMartijn Coenen private NfcAdapter mNfcAdapter; 16733ef03776b7734717b16f6fc861b831fb1b1dfacMartijn Coenen 1682bb717f1ea38e2ce33dd102a23afe6bfacb5675cOwen Lin private final MyMenuVisibilityListener mMenuVisibilityListener = 1692bb717f1ea38e2ce33dd102a23afe6bfacb5675cOwen Lin new MyMenuVisibilityListener(); 1702bb717f1ea38e2ce33dd102a23afe6bfacb5675cOwen Lin 171f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public static interface Model extends PhotoView.Model { 172f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void resume(); 173f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void pause(); 174f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public boolean isEmpty(); 175f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void setCurrentPhoto(Path path, int indexHint); 176f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 177f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 178f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private class MyMenuVisibilityListener implements OnMenuVisibilityListener { 17906c6401eededc2ec842ba4994a838c2ded0a666cPin Ting @Override 180f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void onMenuVisibilityChanged(boolean isVisible) { 181f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mIsMenuVisible = isVisible; 182f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin refreshHidingMessage(); 183f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 184f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 185f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 186f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu private static class BackgroundFadeOut extends FloatAnimation { 187f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu public BackgroundFadeOut() { 188f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu super(1f, 0f, ANIM_TIME_OPENING); 189f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu setInterpolator(new AccelerateInterpolator(2f)); 190f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu } 191f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu } 192f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu 193f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu private final FloatAnimation mBackgroundFade = new BackgroundFadeOut(); 194f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 195915c2c5b2c367df71599370613af0924bd7c4887Bobby Georgescu @Override 196915c2c5b2c367df71599370613af0924bd7c4887Bobby Georgescu protected int getBackgroundColorId() { 197915c2c5b2c367df71599370613af0924bd7c4887Bobby Georgescu return R.color.photo_background; 198915c2c5b2c367df71599370613af0924bd7c4887Bobby Georgescu } 199915c2c5b2c367df71599370613af0924bd7c4887Bobby Georgescu 200f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu private final GLView mRootPane = new GLView() { 201f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 202f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin protected void renderBackground(GLCanvas view) { 20383be4e0c9b8e3372eff8f9b1a396afd961b72921Angus Kong if (mFadeOutTexture != null) { 20483be4e0c9b8e3372eff8f9b1a396afd961b72921Angus Kong if (mBackgroundFade.calculate(AnimationTime.get())) invalidate(); 20583be4e0c9b8e3372eff8f9b1a396afd961b72921Angus Kong if (!mBackgroundFade.isActive()) { 206f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu mFadeOutTexture = null; 207f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu mOpenAnimationRect = null; 208f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu BitmapScreenNail.enableDrawPlaceholder(); 209f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu } else { 210f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu float fadeAlpha = mBackgroundFade.get(); 21183be4e0c9b8e3372eff8f9b1a396afd961b72921Angus Kong if (fadeAlpha < 1f) { 212915c2c5b2c367df71599370613af0924bd7c4887Bobby Georgescu view.clearBuffer(getBackgroundColor()); 213f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu view.setAlpha(fadeAlpha); 214f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu } 215f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu mFadeOutTexture.draw(view, 0, 0); 21602ef48574ef7099ebaa0386bd6fd676bd2fd5489Bobby Georgescu view.setAlpha(1f - fadeAlpha); 217f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu return; 218f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu } 219f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu } 220915c2c5b2c367df71599370613af0924bd7c4887Bobby Georgescu view.clearBuffer(getBackgroundColor()); 221f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 222f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 223f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 224f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin protected void onLayout( 225f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin boolean changed, int left, int top, int right, int bottom) { 226f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mPhotoView.layout(0, 0, right - left, bottom - top); 227f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (mShowDetails) { 2288cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen mDetailsHelper.layout(left, mActionBar.getHeight(), right, bottom); 229f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 230f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 231f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin }; 232f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 233f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 234f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void onCreate(Bundle data, Bundle restoreState) { 23545c56f2d34c71d0bc9b84ebeef6d1314738d0fc0Bobby Georgescu super.onCreate(data, restoreState); 2368cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen mActionBar = mActivity.getGalleryActionBar(); 237f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mSelectionManager = new SelectionManager(mActivity, false); 238f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mMenuExecutor = new MenuExecutor(mActivity, mSelectionManager); 239f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 240f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mPhotoView = new PhotoView(mActivity); 241bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang mPhotoView.setListener(this); 242f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mRootPane.addComponent(mPhotoView); 24383be4e0c9b8e3372eff8f9b1a396afd961b72921Angus Kong mApplication = (GalleryApp) ((Activity) mActivity).getApplication(); 244bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang mOrientationManager = mActivity.getOrientationManager(); 245bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang mOrientationManager.addListener(this); 2462ef46ed28b28b355d7f3f1432c7b1196b832a859Chih-Chung Chang mActivity.getGLRoot().setOrientationSource(mOrientationManager); 247f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 248d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu mHandler = new SynchronizedHandler(mActivity.getGLRoot()) { 249d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu @Override 250d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu public void handleMessage(Message message) { 251d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu switch (message.what) { 252d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu case MSG_HIDE_BARS: { 253d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu hideBars(); 254d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu break; 255d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu } 256d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu case MSG_REFRESH_GRID_BUTTON: { 257d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu setGridButtonVisibility(mPhotoView.getFilmMode()); 258d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu break; 259d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu } 260d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu case MSG_REFRESH_EDIT_BUTTON: { 261d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu refreshEditButton(); 262d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu break; 263d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu } 264d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu case MSG_LOCK_ORIENTATION: { 265d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu mOrientationManager.lockOrientation(); 266d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu break; 267d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu } 268d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu case MSG_UNLOCK_ORIENTATION: { 269d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu mOrientationManager.unlockOrientation(); 270d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu break; 271d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu } 272d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu case MSG_ON_FULL_SCREEN_CHANGED: { 273d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu mAppBridge.onFullScreenChanged(message.arg1 == 1); 274d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu break; 275d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu } 276d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu case MSG_UPDATE_ACTION_BAR: { 277d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu updateBars(); 278d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu break; 279d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu } 280d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu case MSG_WANT_BARS: { 281d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu wantBars(); 282d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu break; 283d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu } 284d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu case MSG_UNFREEZE_GLROOT: { 285d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu mActivity.getGLRoot().unfreeze(); 286d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu break; 287d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu } 288d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu default: throw new AssertionError(message.what); 289d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu } 290d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu } 291d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu }; 292d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu 29384c220f10a643927c8a2126de8a755d8d7f7ec9eRay Chen mSetPathString = data.getString(KEY_MEDIA_SET_PATH); 294b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang mOriginalSetPathString = mSetPathString; 29533ef03776b7734717b16f6fc861b831fb1b1dfacMartijn Coenen mNfcAdapter = NfcAdapter.getDefaultAdapter(mActivity.getAndroidContext()); 2967eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu String itemPathString = data.getString(KEY_MEDIA_ITEM_PATH); 2977eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu Path itemPath = itemPathString != null ? 2987eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu Path.fromString(data.getString(KEY_MEDIA_ITEM_PATH)) : 2997eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu null; 30054fe6202b6f7d233e7645c121321fe0f3d20fc8bYuli Huang mTreatBackAsUp = data.getBoolean(KEY_TREAT_BACK_AS_UP, false); 3017eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu mStartInFilmstrip = 3027eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu data.getBoolean(KEY_START_IN_FILMSTRIP, false); 3037eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu mStartedFromAlbumPage = 3047eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu data.getInt(KEY_ALBUMPAGE_TRANSITION, 3057eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu MSG_ALBUMPAGE_NONE) == MSG_ALBUMPAGE_STARTED; 3067eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu setGridButtonVisibility(!mStartedFromAlbumPage); 30784c220f10a643927c8a2126de8a755d8d7f7ec9eRay Chen if (mSetPathString != null) { 308bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang mAppBridge = (AppBridge) data.getParcelable(KEY_APP_BRIDGE); 309bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang if (mAppBridge != null) { 3107eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu mFlags |= FLAG_HIDE_ACTION_BAR | FLAG_HIDE_STATUS_BAR; 3117eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu mShowBars = false; 3127eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu 313253c5aec7692afdd7880fbd169d4b44d5679cbc0Chih-Chung Chang mAppBridge.setServer(this); 314bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang mOrientationManager.lockOrientation(); 315b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang 316bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang // Get the ScreenNail from AppBridge and register it. 3173b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang int id = SnailSource.newId(); 318b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang Path screenNailSetPath = SnailSource.getSetPath(id); 319bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang Path screenNailItemPath = SnailSource.getItemPath(id); 3203b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang mScreenNailSet = (SnailAlbum) mActivity.getDataManager() 3213b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang .getMediaObject(screenNailSetPath); 3223b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang mScreenNailItem = (SnailItem) mActivity.getDataManager() 323bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang .getMediaObject(screenNailItemPath); 3243b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang mScreenNailItem.setScreenNail(mAppBridge.attachScreenNail()); 325b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang 326a0ce682e40c39ce046c48d8a7f989fff01bb9f2cWu-cheng Li // Check if the path is a secure album. 327a0ce682e40c39ce046c48d8a7f989fff01bb9f2cWu-cheng Li if (SecureSource.isSecurePath(mSetPathString)) { 328a0ce682e40c39ce046c48d8a7f989fff01bb9f2cWu-cheng Li mSecureAlbum = (SecureAlbum) mActivity.getDataManager() 329a0ce682e40c39ce046c48d8a7f989fff01bb9f2cWu-cheng Li .getMediaSet(mSetPathString); 330efd480e85dc5bd0d2ca0ac82d03e141212388830Wu-cheng Li // Set the flag to be on top of the lock screen. 331efd480e85dc5bd0d2ca0ac82d03e141212388830Wu-cheng Li mFlags |= FLAG_SHOW_WHEN_LOCKED; 332a0ce682e40c39ce046c48d8a7f989fff01bb9f2cWu-cheng Li } 333a0ce682e40c39ce046c48d8a7f989fff01bb9f2cWu-cheng Li 3343b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang // Combine the original MediaSet with the one for ScreenNail 3353b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang // from AppBridge. 336b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang mSetPathString = "/combo/item/{" + screenNailSetPath + 337b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang "," + mSetPathString + "}"; 338b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang 339b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang // Start from the screen nail. 340bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang itemPath = screenNailItemPath; 341b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang } 342b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang 3436118af9ddad8acc050133154f8f60c842c7f9bfaChih-Chung Chang MediaSet originalSet = mActivity.getDataManager() 3446118af9ddad8acc050133154f8f60c842c7f9bfaChih-Chung Chang .getMediaSet(mSetPathString); 3456118af9ddad8acc050133154f8f60c842c7f9bfaChih-Chung Chang mSelectionManager.setSourceMediaSet(originalSet); 3466b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang mSetPathString = "/filter/delete/{" + mSetPathString + "}"; 3476b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang mMediaSet = (FilterDeleteSet) mActivity.getDataManager() 3486b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang .getMediaSet(mSetPathString); 349f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mCurrentIndex = data.getInt(KEY_INDEX_HINT, 0); 350f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (mMediaSet == null) { 35184c220f10a643927c8a2126de8a755d8d7f7ec9eRay Chen Log.w(TAG, "failed to restore " + mSetPathString); 352f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 3537eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu if (itemPath == null) { 354d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu if (mMediaSet.getMediaItemCount() > 0) { 355d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu itemPath = mMediaSet.getMediaItem(mCurrentIndex, 1) 356d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu .get(0).getPath(); 357d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu } else { 358d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu return; 359d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu } 3607eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu } 361f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin PhotoDataAdapter pda = new PhotoDataAdapter( 362bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang mActivity, mPhotoView, mMediaSet, itemPath, mCurrentIndex, 36343a80fd806247cb50e81bacda3ad21d210e9ae88Angus Kong mAppBridge == null ? -1 : 0, 364dbb6acc204ba6f095eb0e49e1298e9ceda2c3096Wu-cheng Li mAppBridge == null ? false : mAppBridge.isPanorama(), 365dbb6acc204ba6f095eb0e49e1298e9ceda2c3096Wu-cheng Li mAppBridge == null ? false : mAppBridge.isStaticCamera()); 366f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mModel = pda; 367f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mPhotoView.setModel(mModel); 368f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 369f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin pda.setDataListener(new PhotoDataAdapter.DataListener() { 370f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 371113bfc77c4468411da9ae1290553c3be89f8df9aOwen Lin @Override 372f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void onPhotoChanged(int index, Path item) { 373f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mCurrentIndex = index; 374f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (item != null) { 375616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin MediaItem photo = mModel.getMediaItem(0); 376f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (photo != null) updateCurrentPhoto(photo); 377f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 37861f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang updateBars(); 379f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 380f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 381f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 382f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void onLoadingFinished() { 383f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (!mModel.isEmpty()) { 384616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin MediaItem photo = mModel.getMediaItem(0); 385f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (photo != null) updateCurrentPhoto(photo); 386f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } else if (mIsActive) { 387c370476adcf29f311ceec70a119792a0168781e9Chih-Chung Chang // We only want to finish the PhotoPage if there is no 388c370476adcf29f311ceec70a119792a0168781e9Chih-Chung Chang // deletion that the user can undo. 389c370476adcf29f311ceec70a119792a0168781e9Chih-Chung Chang if (mMediaSet.getNumberOfDeletions() == 0) { 390c370476adcf29f311ceec70a119792a0168781e9Chih-Chung Chang mActivity.getStateManager().finishState( 391c370476adcf29f311ceec70a119792a0168781e9Chih-Chung Chang PhotoPage.this); 392c370476adcf29f311ceec70a119792a0168781e9Chih-Chung Chang } 393f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 394f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 395f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 396f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 397f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void onLoadingStarted() { 398f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 399f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin }); 400f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } else { 401f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin // Get default media set by the URI 402f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin MediaItem mediaItem = (MediaItem) 403f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mActivity.getDataManager().getMediaObject(itemPath); 404f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mModel = new SinglePhotoDataAdapter(mActivity, mPhotoView, mediaItem); 405f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mPhotoView.setModel(mModel); 406f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin updateCurrentPhoto(mediaItem); 407f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 408cf46a3abc26aac7cdb6b6993aeade053304b71d9Ray Chen 409b265ebb01cc046b74329eeb28dbecb24e0f953d2Bobby Georgescu mPhotoView.setFilmMode(mStartInFilmstrip && mMediaSet.getMediaItemCount() > 1); 410a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu setupEditButton(); 411a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu } 412a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu 413a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu private ImageView mEditButton; 414a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu private void setupEditButton() { 41558f898c9cc0228f084d903b5d27ae609cedfc9b9Wu-cheng Li if (mSecureAlbum != null) return; 416a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu RelativeLayout galleryRoot = (RelativeLayout) ((Activity) mActivity) 417a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu .findViewById(mAppBridge != null ? R.id.content : R.id.gallery_root); 418a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu if (galleryRoot == null) return; 419a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu 420a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu mEditButton = new ImageView(mActivity); 421a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu mEditButton.setImageResource(R.drawable.photoeditor_artistic); 422a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu mEditButton.setOnClickListener(new OnClickListener() { 423a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu @Override 424a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu public void onClick(View arg0) { 425a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu launchPhotoEditor(); 426a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu } 427a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu }); 428a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams( 429a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu RelativeLayout.LayoutParams.WRAP_CONTENT, 430a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu RelativeLayout.LayoutParams.WRAP_CONTENT); 431a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu lp.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM); 432a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu galleryRoot.addView(mEditButton, lp); 433a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu refreshEditButton(); 434a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu } 435a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu 436a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu private void cleanupEditButton() { 43758f898c9cc0228f084d903b5d27ae609cedfc9b9Wu-cheng Li if (mEditButton == null) return; 438a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu RelativeLayout galleryRoot = (RelativeLayout) ((Activity) mActivity) 439a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu .findViewById(mAppBridge != null ? R.id.content : R.id.gallery_root); 440a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu if (galleryRoot == null) return; 441a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu galleryRoot.removeView(mEditButton); 442a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu mEditButton = null; 443a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu } 444a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu 445a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu private void refreshEditButton() { 446a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu if (mEditButton == null) return; 447d4553b1337cf6729ee3bc572b9cb3841145db7ddBobby Georgescu if (mShowBars && mCurrentPhoto != null && !mPhotoView.getFilmMode() 44814ad4efd409887a0f4cd90e29818c8c3bd2ece8fBobby Georgescu && mCurrentPhoto.getMediaType() == MediaObject.MEDIA_TYPE_IMAGE) { 449a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu mEditButton.setVisibility(View.VISIBLE); 450a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu } else { 451a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu mEditButton.setVisibility(View.GONE); 452a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu } 453f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 454f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 4556772173d2a49b87a1d209f42fe52b5f830596f99Chih-Chung Chang @TargetApi(ApiHelper.VERSION_CODES.JELLY_BEAN) 456fc86994f86f8cfb31e151c9e730dc1e9dc7b3349Yuli Huang private void setNfcBeamPushUris(Uri[] uris) { 4576772173d2a49b87a1d209f42fe52b5f830596f99Chih-Chung Chang if (mNfcAdapter != null && ApiHelper.HAS_SET_BEAM_PUSH_URIS) { 45824081fe26ca25448ddb9c8f9cc7f406d26344decOwen Lin mNfcAdapter.setBeamPushUris(uris, mActivity); 459fc86994f86f8cfb31e151c9e730dc1e9dc7b3349Yuli Huang } 460fc86994f86f8cfb31e151c9e730dc1e9dc7b3349Yuli Huang } 461fc86994f86f8cfb31e151c9e730dc1e9dc7b3349Yuli Huang 462fb5571987f2555b04731b6f3e1c479efc16d542aWu-cheng Li private Intent createShareIntent(Path path) { 463fb5571987f2555b04731b6f3e1c479efc16d542aWu-cheng Li DataManager manager = mActivity.getDataManager(); 464fb5571987f2555b04731b6f3e1c479efc16d542aWu-cheng Li int type = manager.getMediaType(path); 465fb5571987f2555b04731b6f3e1c479efc16d542aWu-cheng Li Intent intent = new Intent(Intent.ACTION_SEND); 466fb5571987f2555b04731b6f3e1c479efc16d542aWu-cheng Li intent.setType(MenuExecutor.getMimeType(type)); 4672bb717f1ea38e2ce33dd102a23afe6bfacb5675cOwen Lin Uri uri = manager.getContentUri(path); 468fb5571987f2555b04731b6f3e1c479efc16d542aWu-cheng Li intent.putExtra(Intent.EXTRA_STREAM, uri); 469fb5571987f2555b04731b6f3e1c479efc16d542aWu-cheng Li return intent; 470fb5571987f2555b04731b6f3e1c479efc16d542aWu-cheng Li 471fb5571987f2555b04731b6f3e1c479efc16d542aWu-cheng Li } 472fb5571987f2555b04731b6f3e1c479efc16d542aWu-cheng Li 473a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu private void launchPhotoEditor() { 474a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu MediaItem current = mModel.getMediaItem(0); 475a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu if (current == null) return; 476a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu 477a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu Intent intent = new Intent(ACTION_NEXTGEN_EDIT); 478a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu intent.setData(mActivity.getDataManager().getContentUri(current.getPath())).setFlags( 479a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu Intent.FLAG_GRANT_READ_URI_PERMISSION); 480a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu if (mActivity.getPackageManager() 481a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu .queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY).size() == 0) { 482a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu intent.setAction(Intent.ACTION_EDIT); 483a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu } 484a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu ((Activity) mActivity).startActivityForResult(Intent.createChooser(intent, null), 485a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu REQUEST_EDIT); 486a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu } 487a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu 4882bb717f1ea38e2ce33dd102a23afe6bfacb5675cOwen Lin private void updateShareURI(Path path) { 48924081fe26ca25448ddb9c8f9cc7f406d26344decOwen Lin DataManager manager = mActivity.getDataManager(); 49024081fe26ca25448ddb9c8f9cc7f406d26344decOwen Lin Uri uri = manager.getContentUri(path); 49124081fe26ca25448ddb9c8f9cc7f406d26344decOwen Lin mActionBar.setShareIntent(createShareIntent(path)); 49224081fe26ca25448ddb9c8f9cc7f406d26344decOwen Lin setNfcBeamPushUris(new Uri[]{uri}); 493cf46a3abc26aac7cdb6b6993aeade053304b71d9Ray Chen } 494cf46a3abc26aac7cdb6b6993aeade053304b71d9Ray Chen 495f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private void updateCurrentPhoto(MediaItem photo) { 496f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (mCurrentPhoto == photo) return; 497f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mCurrentPhoto = photo; 498f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (mCurrentPhoto == null) return; 499f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin updateMenuOperations(); 500ed46d77c16cd80357f4a0feada2435dfba8104a6Yuli Huang updateTitle(); 50114ad4efd409887a0f4cd90e29818c8c3bd2ece8fBobby Georgescu refreshEditButton(); 502f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (mShowDetails) { 503995c4566bed7df1aa48ba7e1351f964efa73880bMichael Kolb mDetailsHelper.reloadDetails(); 504f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 505898a2f4540635528a0916b0a6b0a177869854ae9Wu-cheng Li if ((mSecureAlbum == null) 506898a2f4540635528a0916b0a6b0a177869854ae9Wu-cheng Li && (photo.getSupportedOperations() & MediaItem.SUPPORT_SHARE) != 0) { 50715b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang updateShareURI(photo.getPath()); 50815b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang } 509f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 510f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 511ed46d77c16cd80357f4a0feada2435dfba8104a6Yuli Huang private void updateTitle() { 512ed46d77c16cd80357f4a0feada2435dfba8104a6Yuli Huang if (mCurrentPhoto == null) return; 513ed46d77c16cd80357f4a0feada2435dfba8104a6Yuli Huang boolean showTitle = mActivity.getAndroidContext().getResources().getBoolean( 514ed46d77c16cd80357f4a0feada2435dfba8104a6Yuli Huang R.bool.show_action_bar_title); 5152bb717f1ea38e2ce33dd102a23afe6bfacb5675cOwen Lin if (showTitle && mCurrentPhoto.getName() != null) { 516ed46d77c16cd80357f4a0feada2435dfba8104a6Yuli Huang mActionBar.setTitle(mCurrentPhoto.getName()); 5172bb717f1ea38e2ce33dd102a23afe6bfacb5675cOwen Lin } else { 518ed46d77c16cd80357f4a0feada2435dfba8104a6Yuli Huang mActionBar.setTitle(""); 5192bb717f1ea38e2ce33dd102a23afe6bfacb5675cOwen Lin } 520ed46d77c16cd80357f4a0feada2435dfba8104a6Yuli Huang } 521ed46d77c16cd80357f4a0feada2435dfba8104a6Yuli Huang 522f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private void updateMenuOperations() { 52324081fe26ca25448ddb9c8f9cc7f406d26344decOwen Lin Menu menu = mActionBar.getMenu(); 52424081fe26ca25448ddb9c8f9cc7f406d26344decOwen Lin 52524081fe26ca25448ddb9c8f9cc7f406d26344decOwen Lin // it could be null if onCreateActionBar has not been called yet 52624081fe26ca25448ddb9c8f9cc7f406d26344decOwen Lin if (menu == null) return; 52724081fe26ca25448ddb9c8f9cc7f406d26344decOwen Lin 5287eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu setGridButtonVisibility(mPhotoView.getFilmMode()); 5297eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu 53024081fe26ca25448ddb9c8f9cc7f406d26344decOwen Lin MenuItem item = menu.findItem(R.id.action_slideshow); 531898a2f4540635528a0916b0a6b0a177869854ae9Wu-cheng Li item.setVisible((mSecureAlbum == null) && canDoSlideShow()); 5322066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang if (mCurrentPhoto == null) return; 53324081fe26ca25448ddb9c8f9cc7f406d26344decOwen Lin 534f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin int supportedOperations = mCurrentPhoto.getSupportedOperations(); 535898a2f4540635528a0916b0a6b0a177869854ae9Wu-cheng Li if (mSecureAlbum != null) { 53624081fe26ca25448ddb9c8f9cc7f406d26344decOwen Lin supportedOperations &= MediaObject.SUPPORT_DELETE; 537898a2f4540635528a0916b0a6b0a177869854ae9Wu-cheng Li } else if (!GalleryUtils.isEditorAvailable(mActivity, "image/*")) { 538f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin supportedOperations &= ~MediaObject.SUPPORT_EDIT; 539f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 54024081fe26ca25448ddb9c8f9cc7f406d26344decOwen Lin MenuExecutor.updateMenuOperation(menu, supportedOperations); 541f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 542f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 5432066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang private boolean canDoSlideShow() { 5442066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang if (mMediaSet == null || mCurrentPhoto == null) { 5452066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang return false; 5462066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang } 5472066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang if (mCurrentPhoto.getMediaType() != MediaObject.MEDIA_TYPE_IMAGE) { 5482066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang return false; 5492066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang } 5506b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang if (MtpSource.isMtpPath(mOriginalSetPathString)) { 5512066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang return false; 5522066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang } 5532066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang return true; 5542066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang } 5552066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang 55661f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang ////////////////////////////////////////////////////////////////////////// 55761f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang // Action Bar show/hide management 55861f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang ////////////////////////////////////////////////////////////////////////// 55961f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang 560f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private void showBars() { 561f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (mShowBars) return; 562f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mShowBars = true; 563e6251df06f0b3c8f556043f8b725b4b19be7474dChih-Chung Chang mOrientationManager.unlockOrientation(); 564f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mActionBar.show(); 5650b2486cff0c1b951c54325596256b986307f7f3aChih-Chung Chang mActivity.getGLRoot().setLightsOutMode(false); 56661f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang refreshHidingMessage(); 567a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu refreshEditButton(); 568f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 569f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 570f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private void hideBars() { 571f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (!mShowBars) return; 572f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mShowBars = false; 573f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mActionBar.hide(); 5740b2486cff0c1b951c54325596256b986307f7f3aChih-Chung Chang mActivity.getGLRoot().setLightsOutMode(true); 57561f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang mHandler.removeMessages(MSG_HIDE_BARS); 576a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu refreshEditButton(); 577f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 578f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 579f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private void refreshHidingMessage() { 580f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mHandler.removeMessages(MSG_HIDE_BARS); 5817eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu if (!mIsMenuVisible && !mPhotoView.getFilmMode()) { 582f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mHandler.sendEmptyMessageDelayed(MSG_HIDE_BARS, HIDE_BARS_TIMEOUT); 583f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 584f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 585f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 586aeb3062e84ed28f0e25a73f511f287ae0a3e4294Chih-Chung Chang private boolean canShowBars() { 587aeb3062e84ed28f0e25a73f511f287ae0a3e4294Chih-Chung Chang // No bars if we are showing camera preview. 588aeb3062e84ed28f0e25a73f511f287ae0a3e4294Chih-Chung Chang if (mAppBridge != null && mCurrentIndex == 0) return false; 589aeb3062e84ed28f0e25a73f511f287ae0a3e4294Chih-Chung Chang // No bars if it's not allowed. 590aeb3062e84ed28f0e25a73f511f287ae0a3e4294Chih-Chung Chang if (!mActionBarAllowed) return false; 591aeb3062e84ed28f0e25a73f511f287ae0a3e4294Chih-Chung Chang 592aeb3062e84ed28f0e25a73f511f287ae0a3e4294Chih-Chung Chang return true; 593aeb3062e84ed28f0e25a73f511f287ae0a3e4294Chih-Chung Chang } 594aeb3062e84ed28f0e25a73f511f287ae0a3e4294Chih-Chung Chang 595e6251df06f0b3c8f556043f8b725b4b19be7474dChih-Chung Chang private void wantBars() { 596e6251df06f0b3c8f556043f8b725b4b19be7474dChih-Chung Chang if (canShowBars()) showBars(); 597e6251df06f0b3c8f556043f8b725b4b19be7474dChih-Chung Chang } 598e6251df06f0b3c8f556043f8b725b4b19be7474dChih-Chung Chang 59961f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang private void toggleBars() { 600f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (mShowBars) { 601f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin hideBars(); 602aeb3062e84ed28f0e25a73f511f287ae0a3e4294Chih-Chung Chang } else { 603e6251df06f0b3c8f556043f8b725b4b19be7474dChih-Chung Chang if (canShowBars()) showBars(); 604f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 605f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 606f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 60761f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang private void updateBars() { 608e6251df06f0b3c8f556043f8b725b4b19be7474dChih-Chung Chang if (!canShowBars()) { 60961f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang hideBars(); 61061f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang } 611f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 612f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 613f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 6142ef46ed28b28b355d7f3f1432c7b1196b832a859Chih-Chung Chang public void onOrientationCompensationChanged() { 6152ef46ed28b28b355d7f3f1432c7b1196b832a859Chih-Chung Chang mActivity.getGLRoot().requestLayoutContentPane(); 616bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang } 617bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang 618bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang @Override 619f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin protected void onBackPressed() { 620f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (mShowDetails) { 621f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin hideDetails(); 6223b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang } else if (mAppBridge == null || !switchWithCaptureAnimation(-1)) { 623bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang // We are leaving this page. Set the result now. 624bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang setResult(); 6257eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu if (mStartInFilmstrip && !mPhotoView.getFilmMode()) { 6267eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu mPhotoView.setFilmMode(true); 6277eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu } else if (mTreatBackAsUp) { 62854fe6202b6f7d233e7645c121321fe0f3d20fc8bYuli Huang onUpPressed(); 62954fe6202b6f7d233e7645c121321fe0f3d20fc8bYuli Huang } else { 63054fe6202b6f7d233e7645c121321fe0f3d20fc8bYuli Huang super.onBackPressed(); 63154fe6202b6f7d233e7645c121321fe0f3d20fc8bYuli Huang } 632f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 633f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 634f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 635b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang private void onUpPressed() { 6367eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu if (mStartInFilmstrip && !mPhotoView.getFilmMode()) { 6377eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu mPhotoView.setFilmMode(true); 6387eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu return; 6397eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu } 6407eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu 641b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang if (mActivity.getStateManager().getStateCount() > 1) { 6427eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu setResult(); 643b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang super.onBackPressed(); 644ba12eae90b5b1a80ee002aa0df8c5c5189c4faa3Chih-Chung Chang return; 64566ca848b2f58b813d366642088d274a1b7c4a90cChih-Chung Chang } 64666ca848b2f58b813d366642088d274a1b7c4a90cChih-Chung Chang 64766ca848b2f58b813d366642088d274a1b7c4a90cChih-Chung Chang if (mOriginalSetPathString == null) return; 64866ca848b2f58b813d366642088d274a1b7c4a90cChih-Chung Chang 64966ca848b2f58b813d366642088d274a1b7c4a90cChih-Chung Chang if (mAppBridge == null) { 650b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang // We're in view mode so set up the stacks on our own. 651b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang Bundle data = new Bundle(getData()); 652b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang data.putString(AlbumPage.KEY_MEDIA_PATH, mOriginalSetPathString); 653b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang data.putString(AlbumPage.KEY_PARENT_MEDIA_PATH, 654b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang mActivity.getDataManager().getTopSetPath( 655b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang DataManager.INCLUDE_ALL)); 656b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang mActivity.getStateManager().switchState(this, AlbumPage.class, data); 65766ca848b2f58b813d366642088d274a1b7c4a90cChih-Chung Chang } else { 65866ca848b2f58b813d366642088d274a1b7c4a90cChih-Chung Chang // Start the real gallery activity to view the camera roll. 65966ca848b2f58b813d366642088d274a1b7c4a90cChih-Chung Chang Uri uri = Uri.parse("content://media/external/file?bucketId=" 66066ca848b2f58b813d366642088d274a1b7c4a90cChih-Chung Chang + MediaSetUtils.CAMERA_BUCKET_ID); 66166ca848b2f58b813d366642088d274a1b7c4a90cChih-Chung Chang Intent intent = new Intent(Intent.ACTION_VIEW); 66266ca848b2f58b813d366642088d274a1b7c4a90cChih-Chung Chang intent.setDataAndType(uri, ContentResolver.CURSOR_DIR_BASE_TYPE + "/image"); 66366ca848b2f58b813d366642088d274a1b7c4a90cChih-Chung Chang ((Activity) mActivity).startActivity(intent); 664b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang } 665b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang } 666b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang 667bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang private void setResult() { 668bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang Intent result = null; 6697eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu result = new Intent(); 6707eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu result.putExtra(KEY_RETURN_INDEX_HINT, mCurrentIndex); 671bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang setStateResult(Activity.RESULT_OK, result); 672bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang } 673bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang 674bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang ////////////////////////////////////////////////////////////////////////// 675bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang // AppBridge.Server interface 676bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang ////////////////////////////////////////////////////////////////////////// 677bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang 678bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang @Override 6792ef46ed28b28b355d7f3f1432c7b1196b832a859Chih-Chung Chang public void setCameraRelativeFrame(Rect frame) { 6802ef46ed28b28b355d7f3f1432c7b1196b832a859Chih-Chung Chang mPhotoView.setCameraRelativeFrame(frame); 681bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang } 682bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang 683bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang @Override 6842c6173822a612597c79be41b126367ddfbb5d518Chih-Chung Chang public boolean switchWithCaptureAnimation(int offset) { 6852c6173822a612597c79be41b126367ddfbb5d518Chih-Chung Chang return mPhotoView.switchWithCaptureAnimation(offset); 6862c6173822a612597c79be41b126367ddfbb5d518Chih-Chung Chang } 6872c6173822a612597c79be41b126367ddfbb5d518Chih-Chung Chang 688f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 6896575794a9c09f22d5721e212c093e0a2df376d0cChih-Chung Chang public void setSwipingEnabled(boolean enabled) { 6906575794a9c09f22d5721e212c093e0a2df376d0cChih-Chung Chang mPhotoView.setSwipingEnabled(enabled); 6916575794a9c09f22d5721e212c093e0a2df376d0cChih-Chung Chang } 6926575794a9c09f22d5721e212c093e0a2df376d0cChih-Chung Chang 6936575794a9c09f22d5721e212c093e0a2df376d0cChih-Chung Chang @Override 6943b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang public void notifyScreenNailChanged() { 6953b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang mScreenNailItem.setScreenNail(mAppBridge.attachScreenNail()); 6963b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang mScreenNailSet.notifyChange(); 6973b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang } 6983b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang 6993b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang @Override 700a0ce682e40c39ce046c48d8a7f989fff01bb9f2cWu-cheng Li public void addSecureAlbumItem(boolean isVideo, int id) { 701a0ce682e40c39ce046c48d8a7f989fff01bb9f2cWu-cheng Li mSecureAlbum.addMediaItem(isVideo, id); 702a0ce682e40c39ce046c48d8a7f989fff01bb9f2cWu-cheng Li } 703a0ce682e40c39ce046c48d8a7f989fff01bb9f2cWu-cheng Li 704a0ce682e40c39ce046c48d8a7f989fff01bb9f2cWu-cheng Li @Override 705f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin protected boolean onCreateActionBar(Menu menu) { 706b21b8e58a604f6c701245d84b141b5b87663192bOwen Lin mActionBar.createActionBarMenu(R.menu.photo, menu); 707f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin updateMenuOperations(); 708ed46d77c16cd80357f4a0feada2435dfba8104a6Yuli Huang updateTitle(); 709b21b8e58a604f6c701245d84b141b5b87663192bOwen Lin return true; 710f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 711f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 712d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin private MenuExecutor.ProgressListener mConfirmDialogListener = 713d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin new MenuExecutor.ProgressListener() { 714d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin @Override 715d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin public void onProgressUpdate(int index) {} 716d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin 717d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin @Override 718d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin public void onProgressComplete(int result) {} 719d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin 720d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin @Override 721d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin public void onConfirmDialogShown() { 722d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin mHandler.removeMessages(MSG_HIDE_BARS); 723d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin } 724d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin 725d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin @Override 726d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin public void onConfirmDialogDismissed(boolean confirmed) { 727d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin refreshHidingMessage(); 728d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin } 729ba50b9420e64731fd5aa8b1410e1f36457a1635aBobby Georgescu 730ba50b9420e64731fd5aa8b1410e1f36457a1635aBobby Georgescu @Override 731ba50b9420e64731fd5aa8b1410e1f36457a1635aBobby Georgescu public void onProgressStart() {} 732d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin }; 733d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin 734f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 735f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin protected boolean onItemSelected(MenuItem item) { 736d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu if (mModel == null) return true; 737d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin refreshHidingMessage(); 738616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin MediaItem current = mModel.getMediaItem(0); 739f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 740f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (current == null) { 741f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin // item is not ready, ignore 742f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return true; 743f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 744f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 745f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin int currentIndex = mModel.getCurrentIndex(); 746f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin Path path = current.getPath(); 747f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 748f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin DataManager manager = mActivity.getDataManager(); 749f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin int action = item.getItemId(); 7509a033b07b8e0d9fe7419b7a0d876e9c7febf43c8Ray Chen String confirmMsg = null; 751f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin switch (action) { 75284c220f10a643927c8a2126de8a755d8d7f7ec9eRay Chen case android.R.id.home: { 753b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang onUpPressed(); 75484c220f10a643927c8a2126de8a755d8d7f7ec9eRay Chen return true; 75584c220f10a643927c8a2126de8a755d8d7f7ec9eRay Chen } 7567eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu case R.id.action_grid: { 7577eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu if (mStartedFromAlbumPage) { 7587eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu onUpPressed(); 7597eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu } else { 7607eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu preparePhotoFallbackView(); 7617eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu Bundle data = new Bundle(getData()); 7627eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu data.putString(AlbumPage.KEY_MEDIA_PATH, mOriginalSetPathString); 7637eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu data.putString(AlbumPage.KEY_PARENT_MEDIA_PATH, 7647eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu mActivity.getDataManager().getTopSetPath( 7657eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu DataManager.INCLUDE_ALL)); 7667eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu mActivity.getTransitionStore().put( 7677eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu KEY_RETURN_INDEX_HINT, mCurrentIndex); 7687eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu mActivity.getStateManager().startState(AlbumPage.class, data); 7697eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu } 7707eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu return true; 7717eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu } 772f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin case R.id.action_slideshow: { 773f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin Bundle data = new Bundle(); 7746cf807453fb58ccd4cc513ff187b306c7090e67cOwen Lin data.putString(SlideshowPage.KEY_SET_PATH, mMediaSet.getPath().toString()); 775604f053d040782159b61d3b74ee533bc2c0ccdd0Ray Chen data.putString(SlideshowPage.KEY_ITEM_PATH, path.toString()); 776f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin data.putInt(SlideshowPage.KEY_PHOTO_INDEX, currentIndex); 777f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin data.putBoolean(SlideshowPage.KEY_REPEAT, true); 778f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mActivity.getStateManager().startStateForResult( 779f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin SlideshowPage.class, REQUEST_SLIDESHOW, data); 780f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return true; 781f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 782f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin case R.id.action_crop: { 783898a2f4540635528a0916b0a6b0a177869854ae9Wu-cheng Li Activity activity = mActivity; 784f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin Intent intent = new Intent(CropImage.CROP_ACTION); 785f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin intent.setClass(activity, CropImage.class); 786f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin intent.setData(manager.getContentUri(path)); 787f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin activity.startActivityForResult(intent, PicasaSource.isPicasaImage(current) 788f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin ? REQUEST_CROP_PICASA 789f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin : REQUEST_CROP); 790f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return true; 791f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 79250ea2d2938218ac6b2039f0e42998cfbbc45d1f1Teng-Hui Zhu case R.id.action_trim: { 7933f1f1baf3a674927e25cd5cd885fb372796bd3a0Teng-Hui Zhu Intent intent = new Intent(mActivity, TrimVideo.class); 7943f1f1baf3a674927e25cd5cd885fb372796bd3a0Teng-Hui Zhu intent.setData(manager.getContentUri(path)); 7953f1f1baf3a674927e25cd5cd885fb372796bd3a0Teng-Hui Zhu mActivity.startActivityForResult(intent, REQUEST_TRIM); 79650ea2d2938218ac6b2039f0e42998cfbbc45d1f1Teng-Hui Zhu return true; 79750ea2d2938218ac6b2039f0e42998cfbbc45d1f1Teng-Hui Zhu } 798f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang case R.id.action_edit: { 799a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu launchPhotoEditor(); 800f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang return true; 801f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang } 802f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin case R.id.action_details: { 803f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (mShowDetails) { 804f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin hideDetails(); 805f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } else { 806995c4566bed7df1aa48ba7e1351f964efa73880bMichael Kolb showDetails(); 807f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 808f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return true; 809f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 81067098d1a72fd04e2af06d3a5939cde28c65f70d9Ray Chen case R.id.action_delete: 8119a033b07b8e0d9fe7419b7a0d876e9c7febf43c8Ray Chen confirmMsg = mActivity.getResources().getQuantityString( 8129a033b07b8e0d9fe7419b7a0d876e9c7febf43c8Ray Chen R.plurals.delete_selection, 1); 813f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin case R.id.action_setas: 814f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin case R.id.action_rotate_ccw: 815f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin case R.id.action_rotate_cw: 816f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin case R.id.action_show_on_map: 817f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mSelectionManager.deSelectAll(); 818f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mSelectionManager.toggle(path); 819d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin mMenuExecutor.onMenuClicked(item, confirmMsg, mConfirmDialogListener); 820f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return true; 821f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin case R.id.action_import: 822f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mSelectionManager.deSelectAll(); 823f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mSelectionManager.toggle(path); 8249a033b07b8e0d9fe7419b7a0d876e9c7febf43c8Ray Chen mMenuExecutor.onMenuClicked(item, confirmMsg, 825f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin new ImportCompleteListener(mActivity)); 826f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return true; 827fb5571987f2555b04731b6f3e1c479efc16d542aWu-cheng Li case R.id.action_share: 828898a2f4540635528a0916b0a6b0a177869854ae9Wu-cheng Li Activity activity = mActivity; 829fb5571987f2555b04731b6f3e1c479efc16d542aWu-cheng Li Intent intent = createShareIntent(mCurrentPhoto.getPath()); 830fb5571987f2555b04731b6f3e1c479efc16d542aWu-cheng Li activity.startActivity(Intent.createChooser(intent, 831fb5571987f2555b04731b6f3e1c479efc16d542aWu-cheng Li activity.getString(R.string.share))); 832fb5571987f2555b04731b6f3e1c479efc16d542aWu-cheng Li return true; 833f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin default : 834f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return false; 835f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 836f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 837f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 838f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private void hideDetails() { 839f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mShowDetails = false; 8404105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen mDetailsHelper.hide(); 841f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 842f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 843995c4566bed7df1aa48ba7e1351f964efa73880bMichael Kolb private void showDetails() { 844f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mShowDetails = true; 8454105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen if (mDetailsHelper == null) { 8464105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen mDetailsHelper = new DetailsHelper(mActivity, mRootPane, new MyDetailsSource()); 8474105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen mDetailsHelper.setCloseListener(new CloseListener() { 84806c6401eededc2ec842ba4994a838c2ded0a666cPin Ting @Override 849f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void onClose() { 850f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin hideDetails(); 851f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 852f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin }); 853f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 8544105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen mDetailsHelper.show(); 855f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 856f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 857bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang //////////////////////////////////////////////////////////////////////////// 858bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang // Callbacks from PhotoView 859bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang //////////////////////////////////////////////////////////////////////////// 860bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang @Override 861f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void onSingleTapUp(int x, int y) { 862bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang if (mAppBridge != null) { 863bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang if (mAppBridge.onSingleTapUp(x, y)) return; 864014d9586d8145a33f4e99eaad570587f6d650026Wu-cheng Li } 865014d9586d8145a33f4e99eaad570587f6d650026Wu-cheng Li 866616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin MediaItem item = mModel.getMediaItem(0); 867b5dc542fbaeaf99bebdcf775ef0e034e89e88eaeWu-cheng Li if (item == null || item == mScreenNailItem) { 868b5dc542fbaeaf99bebdcf775ef0e034e89e88eaeWu-cheng Li // item is not ready or it is camera preview, ignore 869f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return; 870f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 871f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 872898a2f4540635528a0916b0a6b0a177869854ae9Wu-cheng Li boolean playVideo = (mSecureAlbum == null) && 873898a2f4540635528a0916b0a6b0a177869854ae9Wu-cheng Li ((item.getSupportedOperations() & MediaItem.SUPPORT_PLAY) != 0); 874bef18c1e167f5835c8f854e76a91da63b700f93bWu-cheng Li boolean viewPanorama = (mSecureAlbum == null) && 87583be4e0c9b8e3372eff8f9b1a396afd961b72921Angus Kong (item.getSupportedOperations() & MediaItem.SUPPORT_VIEW_PANORAMA) != 0; 876f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 877f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (playVideo) { 878f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin // determine if the point is at center (1/6) of the photo view. 879f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin // (The position of the "play" icon is at center (1/6) of the photo) 880f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin int w = mPhotoView.getWidth(); 881f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin int h = mPhotoView.getHeight(); 882f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin playVideo = (Math.abs(x - w / 2) * 12 <= w) 883f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin && (Math.abs(y - h / 2) * 12 <= h); 884f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 885f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 886f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (playVideo) { 887898a2f4540635528a0916b0a6b0a177869854ae9Wu-cheng Li playVideo(mActivity, item.getPlayUri(), item.getName()); 88883be4e0c9b8e3372eff8f9b1a396afd961b72921Angus Kong } else if (viewPanorama) { 889f8a39c644637a15b9291eb9299762b8cf91cd76aGeorge Mount LightCycleHelper.viewPanorama(mActivity, item.getContentUri()); 890f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } else { 89161f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang toggleBars(); 892f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 893f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 894f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 895bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang @Override 896bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang public void lockOrientation() { 897bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang mHandler.sendEmptyMessage(MSG_LOCK_ORIENTATION); 898bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang } 899bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang 900bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang @Override 901bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang public void unlockOrientation() { 90206c6401eededc2ec842ba4994a838c2ded0a666cPin Ting mHandler.sendEmptyMessage(MSG_UNLOCK_ORIENTATION); 903bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang } 904bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang 905bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang @Override 90661f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang public void onActionBarAllowed(boolean allowed) { 90761f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang mActionBarAllowed = allowed; 90861f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang mHandler.sendEmptyMessage(MSG_UPDATE_ACTION_BAR); 90961f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang } 91061f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang 91161f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang @Override 912e6251df06f0b3c8f556043f8b725b4b19be7474dChih-Chung Chang public void onActionBarWanted() { 913e6251df06f0b3c8f556043f8b725b4b19be7474dChih-Chung Chang mHandler.sendEmptyMessage(MSG_WANT_BARS); 914e6251df06f0b3c8f556043f8b725b4b19be7474dChih-Chung Chang } 915e6251df06f0b3c8f556043f8b725b4b19be7474dChih-Chung Chang 916e6251df06f0b3c8f556043f8b725b4b19be7474dChih-Chung Chang @Override 917bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang public void onFullScreenChanged(boolean full) { 918bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang Message m = mHandler.obtainMessage( 919bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang MSG_ON_FULL_SCREEN_CHANGED, full ? 1 : 0, 0); 920bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang m.sendToTarget(); 921bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang } 922bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang 9236b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang // How we do delete/undo: 9246b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang // 9256b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang // When the user choose to delete a media item, we just tell the 9266b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang // FilterDeleteSet to hide that item. If the user choose to undo it, we 9276b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang // again tell FilterDeleteSet not to hide it. If the user choose to commit 9286b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang // the deletion, we then actually delete the media item. 9296b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang @Override 9306b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang public void onDeleteImage(Path path, int offset) { 9316118af9ddad8acc050133154f8f60c842c7f9bfaChih-Chung Chang onCommitDeleteImage(); // commit the previous deletion 9326b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang mDeletePath = path; 9336b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang mDeleteIsFocus = (offset == 0); 9346118af9ddad8acc050133154f8f60c842c7f9bfaChih-Chung Chang mMediaSet.addDeletion(path, mCurrentIndex + offset); 9356b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang } 9366b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang 9376b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang @Override 9386b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang public void onUndoDeleteImage() { 9396118af9ddad8acc050133154f8f60c842c7f9bfaChih-Chung Chang if (mDeletePath == null) return; 9406b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang // If the deletion was done on the focused item, we want the model to 9416b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang // focus on it when it is undeleted. 9426b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang if (mDeleteIsFocus) mModel.setFocusHintPath(mDeletePath); 9436118af9ddad8acc050133154f8f60c842c7f9bfaChih-Chung Chang mMediaSet.removeDeletion(mDeletePath); 9446b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang mDeletePath = null; 9456b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang } 9466b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang 9476b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang @Override 9486b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang public void onCommitDeleteImage() { 9496b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang if (mDeletePath == null) return; 9506b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang mSelectionManager.deSelectAll(); 9516b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang mSelectionManager.toggle(mDeletePath); 9526b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang mMenuExecutor.onMenuClicked(R.id.action_delete, null, true, false); 9536b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang mDeletePath = null; 9546b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang } 9556b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang 956f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public static void playVideo(Activity activity, Uri uri, String title) { 957f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin try { 958f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin Intent intent = new Intent(Intent.ACTION_VIEW) 959a3871050845b4921379add2b126add3cfbab1109Ray Chen .setDataAndType(uri, "video/*") 960a3871050845b4921379add2b126add3cfbab1109Ray Chen .putExtra(Intent.EXTRA_TITLE, title) 961a3871050845b4921379add2b126add3cfbab1109Ray Chen .putExtra(MovieActivity.KEY_TREAT_UP_AS_BACK, true); 96271cd89a38752bc22ae0ec2df965e4280b776623cChih-Chung Chang activity.startActivityForResult(intent, REQUEST_PLAY_VIDEO); 963f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } catch (ActivityNotFoundException e) { 964f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin Toast.makeText(activity, activity.getString(R.string.video_err), 965f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin Toast.LENGTH_SHORT).show(); 966f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 967f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 968f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 969f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang private void setCurrentPhotoByIntent(Intent intent) { 970f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang if (intent == null) return; 971f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang Path path = mApplication.getDataManager() 972f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang .findPathByUri(intent.getData(), intent.getType()); 973f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang if (path != null) { 974f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang mModel.setCurrentPhoto(path, mCurrentIndex); 975f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang } 976f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang } 977f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang 978f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 979f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin protected void onStateResult(int requestCode, int resultCode, Intent data) { 98071cd89a38752bc22ae0ec2df965e4280b776623cChih-Chung Chang mHasActivityResult = true; 981f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin switch (requestCode) { 982f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang case REQUEST_EDIT: 983f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang setCurrentPhotoByIntent(data); 984f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang break; 985f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin case REQUEST_CROP: 986f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (resultCode == Activity.RESULT_OK) { 987f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang setCurrentPhotoByIntent(data); 988f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 989f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin break; 990f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin case REQUEST_CROP_PICASA: { 991f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang if (resultCode == Activity.RESULT_OK) { 992f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang Context context = mActivity.getAndroidContext(); 99388cc2ca5f5596762a5546ec7426756f2036be455Yuli Huang String message = context.getString(R.string.crop_saved, 994f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang context.getString(R.string.folder_download)); 995f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang Toast.makeText(context, message, Toast.LENGTH_SHORT).show(); 996f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang } 997f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin break; 998f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 999f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin case REQUEST_SLIDESHOW: { 1000f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (data == null) break; 1001f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin String path = data.getStringExtra(SlideshowPage.KEY_ITEM_PATH); 1002f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin int index = data.getIntExtra(SlideshowPage.KEY_PHOTO_INDEX, 0); 1003f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (path != null) { 1004f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mModel.setCurrentPhoto(Path.fromString(path), index); 1005f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 1006f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 1007f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 1008f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 1009f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 101014d3289b4867c21da93ec4032119c0091bc78c30George Mount @Override 101114d3289b4867c21da93ec4032119c0091bc78c30George Mount protected void clearStateResult() { 101214d3289b4867c21da93ec4032119c0091bc78c30George Mount mHasActivityResult = false; 101314d3289b4867c21da93ec4032119c0091bc78c30George Mount } 101414d3289b4867c21da93ec4032119c0091bc78c30George Mount 1015616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin private class PreparePhotoFallback implements OnGLIdleListener { 1016616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin private PhotoFallbackEffect mPhotoFallback = new PhotoFallbackEffect(); 1017616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin private boolean mResultReady = false; 1018616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin 1019616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin public synchronized PhotoFallbackEffect get() { 1020616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin while (!mResultReady) { 1021616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin Utils.waitWithoutInterrupt(this); 1022616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin } 1023616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin return mPhotoFallback; 1024616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin } 1025616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin 1026616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin @Override 1027616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin public boolean onGLIdle(GLCanvas canvas, boolean renderRequested) { 1028616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin mPhotoFallback = mPhotoView.buildFallbackEffect(mRootPane, canvas); 1029616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin synchronized (this) { 1030616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin mResultReady = true; 1031616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin notifyAll(); 1032616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin } 1033616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin return false; 1034616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin } 1035616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin } 1036616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin 1037616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin private void preparePhotoFallbackView() { 1038616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin GLRoot root = mActivity.getGLRoot(); 1039616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin PreparePhotoFallback task = new PreparePhotoFallback(); 1040616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin root.unlockRenderThread(); 1041616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin PhotoFallbackEffect anim; 1042616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin try { 1043616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin root.addOnGLIdleListener(task); 1044616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin anim = task.get(); 1045616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin } finally { 1046616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin root.lockRenderThread(); 1047616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin } 1048616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin mActivity.getTransitionStore().put( 1049616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin AlbumPage.KEY_RESUME_ANIMATION, anim); 1050616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin } 1051616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin 1052f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 1053f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void onPause() { 1054d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin super.onPause(); 1055d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin mIsActive = false; 1056d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin 1057bd7c016d728853d38f98a3c6077b7bd9b08858b9Yuli Huang mActivity.getGLRoot().unfreeze(); 1058bd7c016d728853d38f98a3c6077b7bd9b08858b9Yuli Huang mHandler.removeMessages(MSG_UNFREEZE_GLROOT); 1059253c5aec7692afdd7880fbd169d4b44d5679cbc0Chih-Chung Chang 10604105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen DetailsHelper.pause(); 1061d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu if (mModel != null) { 1062d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu if (isFinishing()) preparePhotoFallbackView(); 1063d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu mModel.pause(); 1064d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu } 1065f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mPhotoView.pause(); 1066f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mHandler.removeMessages(MSG_HIDE_BARS); 1067f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mActionBar.removeOnMenuVisibilityListener(mMenuVisibilityListener); 106833ef03776b7734717b16f6fc861b831fb1b1dfacMartijn Coenen 10696b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang onCommitDeleteImage(); 10702785956f8f5654966a41e20f482f4af3057eea3fChih-Chung Chang mMenuExecutor.pause(); 10716118af9ddad8acc050133154f8f60c842c7f9bfaChih-Chung Chang if (mMediaSet != null) mMediaSet.clearDeletion(); 1072f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 1073f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 1074f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 1075bd7c016d728853d38f98a3c6077b7bd9b08858b9Yuli Huang public void onCurrentImageUpdated() { 1076bd7c016d728853d38f98a3c6077b7bd9b08858b9Yuli Huang mActivity.getGLRoot().unfreeze(); 1077bd7c016d728853d38f98a3c6077b7bd9b08858b9Yuli Huang } 1078bd7c016d728853d38f98a3c6077b7bd9b08858b9Yuli Huang 10797eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu private void setGridButtonVisibility(boolean enabled) { 10807eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu Menu menu = mActionBar.getMenu(); 10817eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu if (menu == null) return; 10827eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu MenuItem item = menu.findItem(R.id.action_grid); 10837eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu if (item != null) item.setVisible(enabled); 10847eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu } 10857eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu 10867eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu public void onFilmModeChanged(boolean enabled) { 10877eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu mHandler.sendEmptyMessage(MSG_REFRESH_GRID_BUTTON); 1088a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu mHandler.sendEmptyMessage(MSG_REFRESH_EDIT_BUTTON); 10897eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu if (enabled) { 10907eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu mHandler.removeMessages(MSG_HIDE_BARS); 10917eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu } else { 10927eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu refreshHidingMessage(); 10937eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu } 10947eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu } 10957eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu 10967eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu private void transitionFromAlbumPageIfNeeded() { 10977eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu TransitionStore transitions = mActivity.getTransitionStore(); 10987eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu 10997eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu int resumeIndex = transitions.get(KEY_INDEX_HINT, -1); 11007eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu if (resumeIndex >= 0) { 11017eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu mCurrentIndex = resumeIndex; 11027eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu mModel.setCurrentPhoto((Path)transitions.get(KEY_MEDIA_SET_PATH), mCurrentIndex); 11037eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu mPhotoView.switchToImage(mCurrentIndex); 11047eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu } 11057eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu 11067eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu int albumPageTransition = transitions.get( 11077eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu KEY_ALBUMPAGE_TRANSITION, MSG_ALBUMPAGE_NONE); 11087eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu 11097eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu if(albumPageTransition != MSG_ALBUMPAGE_NONE) { 11107eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu mPhotoView.setFilmMode(mStartInFilmstrip 11117eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu && albumPageTransition == MSG_ALBUMPAGE_RESUMED); 11127eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu } 11137eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu 111451bc561e85053abfd7fda695e3cd20710acca85cBobby Georgescu mFadeOutTexture = transitions.get(PreparePageFadeoutTexture.KEY_FADE_TEXTURE); 11157eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu if (mFadeOutTexture != null) { 11167eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu mBackgroundFade.start(); 11177eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu BitmapScreenNail.disableDrawPlaceholder(); 11187eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu mOpenAnimationRect = 11197eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu albumPageTransition == MSG_ALBUMPAGE_NONE ? 11207eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu (Rect) mData.getParcelable(KEY_OPEN_ANIMATION_RECT) : 11217eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu (Rect) transitions.get(KEY_OPEN_ANIMATION_RECT); 11227eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu mPhotoView.setOpenAnimationRect(mOpenAnimationRect); 11237eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu mBackgroundFade.start(); 11247eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu } 11257eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu } 11267eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu 1127bd7c016d728853d38f98a3c6077b7bd9b08858b9Yuli Huang @Override 1128f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin protected void onResume() { 1129f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin super.onResume(); 11307eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu 1131d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu if (mModel == null) { 1132d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu mActivity.getStateManager().finishState(this); 1133d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu return; 1134d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu } 11357eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu transitionFromAlbumPageIfNeeded(); 11367eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu 1137d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin mActivity.getGLRoot().freeze(); 1138f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mIsActive = true; 1139f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin setContentPane(mRootPane); 114004ac045bf8da5082bbb0bdc9ea5f9c9b5b796ad0Yuli Huang 1141f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mModel.resume(); 1142f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mPhotoView.resume(); 1143898a2f4540635528a0916b0a6b0a177869854ae9Wu-cheng Li mActionBar.setDisplayOptions( 1144898a2f4540635528a0916b0a6b0a177869854ae9Wu-cheng Li ((mSecureAlbum == null) && (mSetPathString != null)), true); 1145f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mActionBar.addOnMenuVisibilityListener(mMenuVisibilityListener); 114633ef03776b7734717b16f6fc861b831fb1b1dfacMartijn Coenen 114771cd89a38752bc22ae0ec2df965e4280b776623cChih-Chung Chang if (mAppBridge != null && !mHasActivityResult) { 114833f8567dd5003e4bb342683f3768ab7552648b02Chih-Chung Chang mPhotoView.resetToFirstPicture(); 1149bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang } 115071cd89a38752bc22ae0ec2df965e4280b776623cChih-Chung Chang mHasActivityResult = false; 1151bd7c016d728853d38f98a3c6077b7bd9b08858b9Yuli Huang mHandler.sendEmptyMessageDelayed(MSG_UNFREEZE_GLROOT, UNFREEZE_GLROOT_TIMEOUT); 1152f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 1153f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 115415b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang @Override 115515b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang protected void onDestroy() { 1156bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang if (mAppBridge != null) { 1157253c5aec7692afdd7880fbd169d4b44d5679cbc0Chih-Chung Chang mAppBridge.setServer(null); 11583b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang mScreenNailItem.setScreenNail(null); 1159bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang mAppBridge.detachScreenNail(); 1160bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang mAppBridge = null; 11613b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang mScreenNailSet = null; 11623b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang mScreenNailItem = null; 1163b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang } 1164bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang mOrientationManager.removeListener(this); 11652ef46ed28b28b355d7f3f1432c7b1196b832a859Chih-Chung Chang mActivity.getGLRoot().setOrientationSource(null); 1166a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu cleanupEditButton(); 1167aeb3062e84ed28f0e25a73f511f287ae0a3e4294Chih-Chung Chang 1168aeb3062e84ed28f0e25a73f511f287ae0a3e4294Chih-Chung Chang // Remove all pending messages. 1169aeb3062e84ed28f0e25a73f511f287ae0a3e4294Chih-Chung Chang mHandler.removeCallbacksAndMessages(null); 117015b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang super.onDestroy(); 117115b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang } 117215b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang 1173f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private class MyDetailsSource implements DetailsSource { 11746cf807453fb58ccd4cc513ff187b306c7090e67cOwen Lin 11756cf807453fb58ccd4cc513ff187b306c7090e67cOwen Lin @Override 1176f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public MediaDetails getDetails() { 1177616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin return mModel.getMediaItem(0).getDetails(); 1178f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 11796cf807453fb58ccd4cc513ff187b306c7090e67cOwen Lin 11806cf807453fb58ccd4cc513ff187b306c7090e67cOwen Lin @Override 1181f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public int size() { 1182f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return mMediaSet != null ? mMediaSet.getMediaItemCount() : 1; 1183f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 11846cf807453fb58ccd4cc513ff187b306c7090e67cOwen Lin 11856cf807453fb58ccd4cc513ff187b306c7090e67cOwen Lin @Override 1186995c4566bed7df1aa48ba7e1351f964efa73880bMichael Kolb public int setIndex() { 1187995c4566bed7df1aa48ba7e1351f964efa73880bMichael Kolb return mModel.getCurrentIndex(); 11884105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen } 1189f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 1190f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin} 1191