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 191f4e6d14bba7290ea0268fbde28ffc664d4f7004Ray Chenimport android.app.Activity; 201f4e6d14bba7290ea0268fbde28ffc664d4f7004Ray Chenimport android.content.Context; 211f4e6d14bba7290ea0268fbde28ffc664d4f7004Ray Chenimport android.content.Intent; 2204ac045bf8da5082bbb0bdc9ea5f9c9b5b796ad0Yuli Huangimport android.graphics.Rect; 231f4e6d14bba7290ea0268fbde28ffc664d4f7004Ray Chenimport android.net.Uri; 241f4e6d14bba7290ea0268fbde28ffc664d4f7004Ray Chenimport android.os.Bundle; 2526e119cebe732582df086ff56ec564d2989042fdBobby Georgescuimport android.os.Handler; 2626e119cebe732582df086ff56ec564d2989042fdBobby Georgescuimport android.os.Message; 271f4e6d14bba7290ea0268fbde28ffc664d4f7004Ray Chenimport android.provider.MediaStore; 28bcb427870043b12d4a1a454c08a088933d0eaf23Bobby Georgescuimport android.view.HapticFeedbackConstants; 292abaaf7caa9a83ba1ea759868aabde7f21387184John Reckimport android.view.Menu; 302abaaf7caa9a83ba1ea759868aabde7f21387184John Reckimport android.view.MenuInflater; 312abaaf7caa9a83ba1ea759868aabde7f21387184John Reckimport android.view.MenuItem; 321f4e6d14bba7290ea0268fbde28ffc664d4f7004Ray Chenimport android.widget.Toast; 331f4e6d14bba7290ea0268fbde28ffc664d4f7004Ray Chen 34f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.R; 35f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.common.Utils; 36f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.data.DataManager; 37f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.data.MediaDetails; 38f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.data.MediaItem; 39f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.data.MediaObject; 40f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.data.MediaSet; 41f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.data.Path; 42d25fdea42988c72312ab3be0be76ab75e4d944c8Ruben Brunkimport com.android.gallery3d.filtershow.crop.CropActivity; 436fe165b7d28299d5b2f97deb135b233d84eb300fRuben Brunkimport com.android.gallery3d.filtershow.crop.CropExtras; 442abaaf7caa9a83ba1ea759868aabde7f21387184John Reckimport com.android.gallery3d.glrenderer.FadeTexture; 452abaaf7caa9a83ba1ea759868aabde7f21387184John Reckimport com.android.gallery3d.glrenderer.GLCanvas; 46f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.ui.ActionModeHandler; 47f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.ui.ActionModeHandler.ActionModeListener; 48c3d8ac3b9504346dafc49e006b5f732dd1db21e8Owen Linimport com.android.gallery3d.ui.AlbumSlotRenderer; 494105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chenimport com.android.gallery3d.ui.DetailsHelper; 504105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chenimport com.android.gallery3d.ui.DetailsHelper.CloseListener; 5171632ac6c1596dd1fd477f95e268f96ad72ea572Owen Linimport com.android.gallery3d.ui.GLRoot; 52f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.ui.GLView; 53616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Linimport com.android.gallery3d.ui.PhotoFallbackEffect; 542341c197b0becf99422e8ad305def77df6161714Owen Linimport com.android.gallery3d.ui.RelativePosition; 55f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.ui.SelectionManager; 56f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.ui.SlotView; 5726e119cebe732582df086ff56ec564d2989042fdBobby Georgescuimport com.android.gallery3d.ui.SynchronizedHandler; 58f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.util.Future; 59f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.util.GalleryUtils; 60402237b43fd853377e5dba4e048839ad23b99d72Chih-Chung Changimport com.android.gallery3d.util.MediaSetUtils; 61795776f67fe5bca902b09c01edec630879263341Ruben Brunk 62f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 63f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linpublic class AlbumPage extends ActivityState implements GalleryActionBar.ClusterRunner, 643cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu SelectionManager.SelectionListener, MediaSet.SyncListener, GalleryActionBar.OnAlbumModeSelectedListener { 65f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @SuppressWarnings("unused") 66f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private static final String TAG = "AlbumPage"; 67f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 68f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public static final String KEY_MEDIA_PATH = "media-path"; 6984c220f10a643927c8a2126de8a755d8d7f7ec9eRay Chen public static final String KEY_PARENT_MEDIA_PATH = "parent-media-path"; 70f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public static final String KEY_SET_CENTER = "set-center"; 71f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public static final String KEY_AUTO_SELECT_ALL = "auto-select-all"; 72f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public static final String KEY_SHOW_CLUSTER_MENU = "cluster-menu"; 7309995299480b797254873319caffd5408624988bBobby Georgescu public static final String KEY_EMPTY_ALBUM = "empty-album"; 74616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin public static final String KEY_RESUME_ANIMATION = "resume_animation"; 75f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 76f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private static final int REQUEST_SLIDESHOW = 1; 777eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu public static final int REQUEST_PHOTO = 2; 78f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private static final int REQUEST_DO_ANIMATION = 3; 79f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 80fbdd338d83596ba545a8a7c8105d2ad7b5df56e6Owen Lin private static final int BIT_LOADING_RELOAD = 1; 81fbdd338d83596ba545a8a7c8105d2ad7b5df56e6Owen Lin private static final int BIT_LOADING_SYNC = 2; 82fbdd338d83596ba545a8a7c8105d2ad7b5df56e6Owen Lin 83f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private static final float USER_DISTANCE_METER = 0.3f; 84f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 85f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private boolean mIsActive = false; 86c3d8ac3b9504346dafc49e006b5f732dd1db21e8Owen Lin private AlbumSlotRenderer mAlbumView; 87f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private Path mMediaSetPath; 8884c220f10a643927c8a2126de8a755d8d7f7ec9eRay Chen private String mParentMediaSetString; 897260f6f74d465520e4497b23fe56f98abb0c15a2Owen Lin private SlotView mSlotView; 90f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 91c3d8ac3b9504346dafc49e006b5f732dd1db21e8Owen Lin private AlbumDataLoader mAlbumDataAdapter; 92f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 93f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin protected SelectionManager mSelectionManager; 94f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 95f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private boolean mGetContent; 96f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private boolean mShowClusterMenu; 97f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 98f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private ActionModeHandler mActionModeHandler; 99f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private int mFocusIndex = 0; 1004105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen private DetailsHelper mDetailsHelper; 1014105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen private MyDetailsSource mDetailsSource; 102f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private MediaSet mMediaSet; 103f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private boolean mShowDetails; 104f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private float mUserDistance; // in pixel 10557cbaa1ef40d2215c6400f5ae4af3a09e67abb2dHung-ying Tyan private Future<Integer> mSyncTask = null; 1067eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu private boolean mLaunchedFromPhotoPage; 10700ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu private boolean mInCameraApp; 10835e7b4ae727394aace466ebcf33d89adf01b690cBobby Georgescu private boolean mInCameraAndWantQuitOnPause; 109f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 110fbdd338d83596ba545a8a7c8105d2ad7b5df56e6Owen Lin private int mLoadingBits = 0; 111fbdd338d83596ba545a8a7c8105d2ad7b5df56e6Owen Lin private boolean mInitialSynced = false; 11205da3f520eacb9219964b6ed57ef37846d889fd7Hung-ying Tyan private int mSyncResult; 11305da3f520eacb9219964b6ed57ef37846d889fd7Hung-ying Tyan private boolean mLoadingFailed; 1142341c197b0becf99422e8ad305def77df6161714Owen Lin private RelativePosition mOpenCenter = new RelativePosition(); 115fbdd338d83596ba545a8a7c8105d2ad7b5df56e6Owen Lin 11626e119cebe732582df086ff56ec564d2989042fdBobby Georgescu private Handler mHandler; 11726e119cebe732582df086ff56ec564d2989042fdBobby Georgescu private static final int MSG_PICK_PHOTO = 0; 11826e119cebe732582df086ff56ec564d2989042fdBobby Georgescu 119616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin private PhotoFallbackEffect mResumeEffect; 120616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin private PhotoFallbackEffect.PositionProvider mPositionProvider = 121616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin new PhotoFallbackEffect.PositionProvider() { 122616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin @Override 123616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin public Rect getPosition(int index) { 124616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin Rect rect = mSlotView.getSlotRect(index); 125616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin Rect bounds = mSlotView.bounds(); 126616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin rect.offset(bounds.left - mSlotView.getScrollX(), 127616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin bounds.top - mSlotView.getScrollY()); 128616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin return rect; 129616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin } 130616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin 131616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin @Override 132616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin public int getItemIndex(Path path) { 133616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin int start = mSlotView.getVisibleStart(); 134616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin int end = mSlotView.getVisibleEnd(); 135616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin for (int i = start; i < end; ++i) { 136616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin MediaItem item = mAlbumDataAdapter.get(i); 137616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin if (item != null && item.getPath() == path) return i; 138616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin } 139616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin return -1; 140616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin } 141616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin }; 142616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin 143915c2c5b2c367df71599370613af0924bd7c4887Bobby Georgescu @Override 144915c2c5b2c367df71599370613af0924bd7c4887Bobby Georgescu protected int getBackgroundColorId() { 145915c2c5b2c367df71599370613af0924bd7c4887Bobby Georgescu return R.color.album_background; 146915c2c5b2c367df71599370613af0924bd7c4887Bobby Georgescu } 147915c2c5b2c367df71599370613af0924bd7c4887Bobby Georgescu 1489170edf4071e0ef4a64e9af579a1e711447cfcfcRay Chen private final GLView mRootPane = new GLView() { 1499170edf4071e0ef4a64e9af579a1e711447cfcfcRay Chen private final float mMatrix[] = new float[16]; 150f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 151f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 152f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin protected void onLayout( 153f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin boolean changed, int left, int top, int right, int bottom) { 154f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 1558cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen int slotViewTop = mActivity.getGalleryActionBar().getHeight(); 156f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin int slotViewBottom = bottom - top; 157f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin int slotViewRight = right - left; 158f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 159f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (mShowDetails) { 1604105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen mDetailsHelper.layout(left, slotViewTop, right, bottom); 161f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } else { 16231cac30e46a293f6d0901e22c6ab0d083cae7021Owen Lin mAlbumView.setHighlightItemPath(null); 163f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 164f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 1652341c197b0becf99422e8ad305def77df6161714Owen Lin // Set the mSlotView as a reference point to the open animation 1662341c197b0becf99422e8ad305def77df6161714Owen Lin mOpenCenter.setReferencePosition(0, slotViewTop); 1677260f6f74d465520e4497b23fe56f98abb0c15a2Owen Lin mSlotView.layout(0, slotViewTop, slotViewRight, slotViewBottom); 168f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin GalleryUtils.setViewPointMatrix(mMatrix, 169f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin (right - left) / 2, (bottom - top) / 2, -mUserDistance); 170f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 171f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 172f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 173f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin protected void render(GLCanvas canvas) { 174f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin canvas.save(GLCanvas.SAVE_FLAG_MATRIX); 175f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin canvas.multiplyMatrix(mMatrix, 0); 176f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin super.render(canvas); 177616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin 178616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin if (mResumeEffect != null) { 179616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin boolean more = mResumeEffect.draw(canvas); 180616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin if (!more) { 181616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin mResumeEffect = null; 182616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin mAlbumView.setSlotFilter(null); 183616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin } 18437c605949219b8bf54c165c34d6405f5f2989f50Owen Lin // We want to render one more time even when no more effect 18537c605949219b8bf54c165c34d6405f5f2989f50Owen Lin // required. So that the animated thumbnails could be draw 18637c605949219b8bf54c165c34d6405f5f2989f50Owen Lin // with declarations in super.render(). 18737c605949219b8bf54c165c34d6405f5f2989f50Owen Lin invalidate(); 188616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin } 189f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin canvas.restore(); 190f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 191f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin }; 192f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 193b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang // This are the transitions we want: 194b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang // 195b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang // +--------+ +------------+ +-------+ +----------+ 196b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang // | Camera |---------->| Fullscreen |--->| Album |--->| AlbumSet | 197b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang // | View | thumbnail | Photo | up | Page | up | Page | 198b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang // +--------+ +------------+ +-------+ +----------+ 199b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang // ^ | | ^ | 200b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang // | | | | | close 201b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang // +----------back--------+ +----back----+ +--back-> app 202b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang // 203f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 204f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin protected void onBackPressed() { 205f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (mShowDetails) { 206f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin hideDetails(); 207f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } else if (mSelectionManager.inSelectionMode()) { 208f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mSelectionManager.leaveSelectionMode(); 209f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } else { 21000ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu if(mLaunchedFromPhotoPage) { 21100ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu mActivity.getTransitionStore().putIfNotPresent( 21200ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu PhotoPage.KEY_ALBUMPAGE_TRANSITION, 21300ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu PhotoPage.MSG_ALBUMPAGE_RESUMED); 21400ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu } 2157260f6f74d465520e4497b23fe56f98abb0c15a2Owen Lin // TODO: fix this regression 2167260f6f74d465520e4497b23fe56f98abb0c15a2Owen Lin // mAlbumView.savePositions(PositionRepository.getInstance(mActivity)); 217624ed9df710ac4e34f3ff1d0c3bf4acd1c056258Bobby Georgescu if (mInCameraApp) { 218624ed9df710ac4e34f3ff1d0c3bf4acd1c056258Bobby Georgescu super.onBackPressed(); 219624ed9df710ac4e34f3ff1d0c3bf4acd1c056258Bobby Georgescu } else { 220624ed9df710ac4e34f3ff1d0c3bf4acd1c056258Bobby Georgescu onUpPressed(); 221624ed9df710ac4e34f3ff1d0c3bf4acd1c056258Bobby Georgescu } 222b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang } 223b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang } 224b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang 225b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang private void onUpPressed() { 226833f775afc9515567dc5aaf0cafe20e006e77545Bobby Georgescu if (mInCameraApp) { 227833f775afc9515567dc5aaf0cafe20e006e77545Bobby Georgescu GalleryUtils.startGalleryActivity(mActivity); 228833f775afc9515567dc5aaf0cafe20e006e77545Bobby Georgescu } else if (mActivity.getStateManager().getStateCount() > 1) { 229f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin super.onBackPressed(); 230b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang } else if (mParentMediaSetString != null) { 231b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang Bundle data = new Bundle(getData()); 232b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang data.putString(AlbumSetPage.KEY_MEDIA_PATH, mParentMediaSetString); 233b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang mActivity.getStateManager().switchState( 234b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang this, AlbumSetPage.class, data); 235f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 236f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 237f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 238bc2154199aee16762e3758ad0cfed685323d9a9fChih-Chung Chang private void onDown(int index) { 23931cac30e46a293f6d0901e22c6ab0d083cae7021Owen Lin mAlbumView.setPressedIndex(index); 240bc2154199aee16762e3758ad0cfed685323d9a9fChih-Chung Chang } 241bc2154199aee16762e3758ad0cfed685323d9a9fChih-Chung Chang 24290fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang private void onUp(boolean followedByLongPress) { 24390fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang if (followedByLongPress) { 24490fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang // Avoid showing press-up animations for long-press. 24590fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang mAlbumView.setPressedIndex(-1); 24690fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang } else { 24790fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang mAlbumView.setPressedUp(); 24890fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang } 249bc2154199aee16762e3758ad0cfed685323d9a9fChih-Chung Chang } 250bc2154199aee16762e3758ad0cfed685323d9a9fChih-Chung Chang 25104ac045bf8da5082bbb0bdc9ea5f9c9b5b796ad0Yuli Huang private void onSingleTapUp(int slotIndex) { 252cf06397b2bc65335fb97d5788f18cad4897126a2Owen Lin if (!mIsActive) return; 25390fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang 25490fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang if (mSelectionManager.inSelectionMode()) { 25590fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang MediaItem item = mAlbumDataAdapter.get(slotIndex); 25690fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang if (item == null) return; // Item not ready yet, ignore the click 257f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mSelectionManager.toggle(item.getPath()); 2587260f6f74d465520e4497b23fe56f98abb0c15a2Owen Lin mSlotView.invalidate(); 25990fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang } else { 260766941ee72831a2c76defb4d826cab24d918e0dfBobby Georgescu // Render transition in pressed state 26190fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang mAlbumView.setPressedIndex(slotIndex); 26226e119cebe732582df086ff56ec564d2989042fdBobby Georgescu mAlbumView.setPressedUp(); 26326e119cebe732582df086ff56ec564d2989042fdBobby Georgescu mHandler.sendMessageDelayed(mHandler.obtainMessage(MSG_PICK_PHOTO, slotIndex, 0), 26426e119cebe732582df086ff56ec564d2989042fdBobby Georgescu FadeTexture.DURATION); 26590fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang } 26690fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang } 26790fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang 26890fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang private void pickPhoto(int slotIndex) { 2697eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu pickPhoto(slotIndex, false); 2707eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu } 2717eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu 2727eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu private void pickPhoto(int slotIndex, boolean startInFilmstrip) { 27390fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang if (!mIsActive) return; 27490fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang 2757eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu if (!startInFilmstrip) { 2767eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu // Launch photos in lights out mode 2777eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu mActivity.getGLRoot().setLightsOutMode(true); 2787eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu } 2797eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu 28090fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang MediaItem item = mAlbumDataAdapter.get(slotIndex); 28190fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang if (item == null) return; // Item not ready yet, ignore the click 28290fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang if (mGetContent) { 28390fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang onGetContent(item); 2847eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu } else if (mLaunchedFromPhotoPage) { 2857eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu TransitionStore transitions = mActivity.getTransitionStore(); 2867eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu transitions.put( 2877eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu PhotoPage.KEY_ALBUMPAGE_TRANSITION, 2887eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu PhotoPage.MSG_ALBUMPAGE_PICKED); 2897eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu transitions.put(PhotoPage.KEY_INDEX_HINT, slotIndex); 2907eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu onBackPressed(); 29190fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang } else { 29290fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang // Get into the PhotoPage. 29390fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang // mAlbumView.savePositions(PositionRepository.getInstance(mActivity)); 29490fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang Bundle data = new Bundle(); 29590fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang data.putInt(PhotoPage.KEY_INDEX_HINT, slotIndex); 29690fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang data.putParcelable(PhotoPage.KEY_OPEN_ANIMATION_RECT, 29751bc561e85053abfd7fda695e3cd20710acca85cBobby Georgescu mSlotView.getSlotRect(slotIndex, mRootPane)); 29890fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang data.putString(PhotoPage.KEY_MEDIA_SET_PATH, 29990fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang mMediaSetPath.toString()); 30090fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang data.putString(PhotoPage.KEY_MEDIA_ITEM_PATH, 30190fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang item.getPath().toString()); 3027eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu data.putInt(PhotoPage.KEY_ALBUMPAGE_TRANSITION, 3037eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu PhotoPage.MSG_ALBUMPAGE_STARTED); 3047eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu data.putBoolean(PhotoPage.KEY_START_IN_FILMSTRIP, 3057eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu startInFilmstrip); 3062aec8488aebe3d28a0a32c67d6629dfa4db4acaeBobby Georgescu data.putBoolean(PhotoPage.KEY_IN_CAMERA_ROLL, mMediaSet.isCameraRoll()); 3075585826e68c62c3719fb346d40fd1999438c6c6bBobby Georgescu if (startInFilmstrip) { 308cfa7fde1a336a3200b2ad9091b27ba7bfd8f5c9aBobby Georgescu mActivity.getStateManager().switchState(this, FilmstripPage.class, data); 3095585826e68c62c3719fb346d40fd1999438c6c6bBobby Georgescu } else { 3105585826e68c62c3719fb346d40fd1999438c6c6bBobby Georgescu mActivity.getStateManager().startStateForResult( 311cfa7fde1a336a3200b2ad9091b27ba7bfd8f5c9aBobby Georgescu SinglePhotoPage.class, REQUEST_PHOTO, data); 3125585826e68c62c3719fb346d40fd1999438c6c6bBobby Georgescu } 313f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 314f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 315f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 316f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private void onGetContent(final MediaItem item) { 317f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin DataManager dm = mActivity.getDataManager(); 318b21b8e58a604f6c701245d84b141b5b87663192bOwen Lin Activity activity = mActivity; 31906c027675948259368a902fd6f8c2ecac5db5167Mangesh Ghiware if (mData.getString(GalleryActivity.EXTRA_CROP) != null) { 320f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin Uri uri = dm.getContentUri(item.getPath()); 321d25fdea42988c72312ab3be0be76ab75e4d944c8Ruben Brunk Intent intent = new Intent(CropActivity.CROP_ACTION, uri) 322f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin .addFlags(Intent.FLAG_ACTIVITY_FORWARD_RESULT) 323f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin .putExtras(getData()); 324f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (mData.getParcelable(MediaStore.EXTRA_OUTPUT) == null) { 325795776f67fe5bca902b09c01edec630879263341Ruben Brunk intent.putExtra(CropExtras.KEY_RETURN_DATA, true); 326f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 327f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin activity.startActivity(intent); 328f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin activity.finish(); 329f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } else { 3301c38d440b454698093f3f5c867b4bad5bf74716fMangesh Ghiware Intent intent = new Intent(null, item.getContentUri()) 3311c38d440b454698093f3f5c867b4bad5bf74716fMangesh Ghiware .addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); 3321c38d440b454698093f3f5c867b4bad5bf74716fMangesh Ghiware activity.setResult(Activity.RESULT_OK, intent); 333f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin activity.finish(); 334f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 335f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 336f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 337f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void onLongTap(int slotIndex) { 338f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (mGetContent) return; 33990fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang MediaItem item = mAlbumDataAdapter.get(slotIndex); 34090fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang if (item == null) return; 34190fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang mSelectionManager.setAutoLeaveSelectionMode(true); 34290fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang mSelectionManager.toggle(item.getPath()); 34390fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang mSlotView.invalidate(); 344f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 345f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 3462341c197b0becf99422e8ad305def77df6161714Owen Lin @Override 347f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void doCluster(int clusterType) { 348f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin String basePath = mMediaSet.getPath().toString(); 349f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin String newPath = FilterUtils.newClusterPath(basePath, clusterType); 350f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin Bundle data = new Bundle(getData()); 351f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin data.putString(AlbumSetPage.KEY_MEDIA_PATH, newPath); 352f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (mShowClusterMenu) { 353f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin Context context = mActivity.getAndroidContext(); 354f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin data.putString(AlbumSetPage.KEY_SET_TITLE, mMediaSet.getName()); 355f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin data.putString(AlbumSetPage.KEY_SET_SUBTITLE, 356f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin GalleryActionBar.getClusterByTypeString(context, clusterType)); 357f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 358f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 3597260f6f74d465520e4497b23fe56f98abb0c15a2Owen Lin // mAlbumView.savePositions(PositionRepository.getInstance(mActivity)); 360f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mActivity.getStateManager().startStateForResult( 361f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin AlbumSetPage.class, REQUEST_DO_ANIMATION, data); 362f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 363f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 364f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 365f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin protected void onCreate(Bundle data, Bundle restoreState) { 36645c56f2d34c71d0bc9b84ebeef6d1314738d0fc0Bobby Georgescu super.onCreate(data, restoreState); 367f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mUserDistance = GalleryUtils.meterToPixel(USER_DISTANCE_METER); 368f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin initializeViews(); 369f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin initializeData(data); 37006c027675948259368a902fd6f8c2ecac5db5167Mangesh Ghiware mGetContent = data.getBoolean(GalleryActivity.KEY_GET_CONTENT, false); 371f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mShowClusterMenu = data.getBoolean(KEY_SHOW_CLUSTER_MENU, false); 3724105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen mDetailsSource = new MyDetailsSource(); 3731f4e6d14bba7290ea0268fbde28ffc664d4f7004Ray Chen Context context = mActivity.getAndroidContext(); 374f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 375f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (data.getBoolean(KEY_AUTO_SELECT_ALL)) { 376f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mSelectionManager.selectAll(); 377f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 378f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 3797eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu mLaunchedFromPhotoPage = 380cfa7fde1a336a3200b2ad9091b27ba7bfd8f5c9aBobby Georgescu mActivity.getStateManager().hasStateClass(FilmstripPage.class); 38100ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu mInCameraApp = data.getBoolean(PhotoPage.KEY_APP_BRIDGE, false); 38226e119cebe732582df086ff56ec564d2989042fdBobby Georgescu 38326e119cebe732582df086ff56ec564d2989042fdBobby Georgescu mHandler = new SynchronizedHandler(mActivity.getGLRoot()) { 38426e119cebe732582df086ff56ec564d2989042fdBobby Georgescu @Override 38526e119cebe732582df086ff56ec564d2989042fdBobby Georgescu public void handleMessage(Message message) { 38626e119cebe732582df086ff56ec564d2989042fdBobby Georgescu switch (message.what) { 38726e119cebe732582df086ff56ec564d2989042fdBobby Georgescu case MSG_PICK_PHOTO: { 38826e119cebe732582df086ff56ec564d2989042fdBobby Georgescu pickPhoto(message.arg1); 38926e119cebe732582df086ff56ec564d2989042fdBobby Georgescu break; 39026e119cebe732582df086ff56ec564d2989042fdBobby Georgescu } 39126e119cebe732582df086ff56ec564d2989042fdBobby Georgescu default: 39226e119cebe732582df086ff56ec564d2989042fdBobby Georgescu throw new AssertionError(message.what); 39326e119cebe732582df086ff56ec564d2989042fdBobby Georgescu } 39426e119cebe732582df086ff56ec564d2989042fdBobby Georgescu } 39526e119cebe732582df086ff56ec564d2989042fdBobby Georgescu }; 396f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 397f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 398f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 399f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin protected void onResume() { 400f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin super.onResume(); 401f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mIsActive = true; 402616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin 403616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin mResumeEffect = mActivity.getTransitionStore().get(KEY_RESUME_ANIMATION); 404616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin if (mResumeEffect != null) { 405616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin mAlbumView.setSlotFilter(mResumeEffect); 406616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin mResumeEffect.setPositionProvider(mPositionProvider); 407616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin mResumeEffect.start(); 408616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin } 409616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin 410f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin setContentPane(mRootPane); 411fe49be45412f8d0f68343662318e73822da486c8Owen Lin 41284c220f10a643927c8a2126de8a755d8d7f7ec9eRay Chen boolean enableHomeButton = (mActivity.getStateManager().getStateCount() > 1) | 41384c220f10a643927c8a2126de8a755d8d7f7ec9eRay Chen mParentMediaSetString != null; 4143cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu GalleryActionBar actionBar = mActivity.getGalleryActionBar(); 4153cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu actionBar.setDisplayOptions(enableHomeButton, false); 4164c9e3e1d7a5af64ddc946297db9d07dc394d861eBobby Georgescu if (!mGetContent) { 4174c9e3e1d7a5af64ddc946297db9d07dc394d861eBobby Georgescu actionBar.enableAlbumModeMenu(GalleryActionBar.ALBUM_GRID_MODE_SELECTED, this); 4184c9e3e1d7a5af64ddc946297db9d07dc394d861eBobby Georgescu } 41984c220f10a643927c8a2126de8a755d8d7f7ec9eRay Chen 420fe49be45412f8d0f68343662318e73822da486c8Owen Lin // Set the reload bit here to prevent it exit this page in clearLoadingBit(). 421fe49be45412f8d0f68343662318e73822da486c8Owen Lin setLoadingBit(BIT_LOADING_RELOAD); 42205da3f520eacb9219964b6ed57ef37846d889fd7Hung-ying Tyan mLoadingFailed = false; 423f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mAlbumDataAdapter.resume(); 424fe49be45412f8d0f68343662318e73822da486c8Owen Lin 425f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mAlbumView.resume(); 4265585826e68c62c3719fb346d40fd1999438c6c6bBobby Georgescu mAlbumView.setPressedIndex(-1); 427f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mActionModeHandler.resume(); 428fbdd338d83596ba545a8a7c8105d2ad7b5df56e6Owen Lin if (!mInitialSynced) { 429fbdd338d83596ba545a8a7c8105d2ad7b5df56e6Owen Lin setLoadingBit(BIT_LOADING_SYNC); 430fe49be45412f8d0f68343662318e73822da486c8Owen Lin mSyncTask = mMediaSet.requestSync(this); 431fbdd338d83596ba545a8a7c8105d2ad7b5df56e6Owen Lin } 43235e7b4ae727394aace466ebcf33d89adf01b690cBobby Georgescu mInCameraAndWantQuitOnPause = mInCameraApp; 433f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 434f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 435f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 436f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin protected void onPause() { 437f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin super.onPause(); 438f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mIsActive = false; 439616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin 4402daced6baacd59850e7c64ea02f2479530654ed8Doris Liu if (mSelectionManager.inSelectionMode()) { 4412daced6baacd59850e7c64ea02f2479530654ed8Doris Liu mSelectionManager.leaveSelectionMode(); 4422daced6baacd59850e7c64ea02f2479530654ed8Doris Liu } 443616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin mAlbumView.setSlotFilter(null); 444a2d0d34a90543ee19ea295e72c112fde18fb3828Bobby Georgescu mActionModeHandler.pause(); 445f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mAlbumDataAdapter.pause(); 446f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mAlbumView.pause(); 4474105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen DetailsHelper.pause(); 4484c9e3e1d7a5af64ddc946297db9d07dc394d861eBobby Georgescu if (!mGetContent) { 4494c9e3e1d7a5af64ddc946297db9d07dc394d861eBobby Georgescu mActivity.getGalleryActionBar().disableAlbumModeMenu(true); 4504c9e3e1d7a5af64ddc946297db9d07dc394d861eBobby Georgescu } 451fbdd338d83596ba545a8a7c8105d2ad7b5df56e6Owen Lin 452f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (mSyncTask != null) { 453f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mSyncTask.cancel(); 454f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mSyncTask = null; 455d05b0be120bb217b4f56add24a4b31bee92455b2Chih-Chung Chang clearLoadingBit(BIT_LOADING_SYNC); 456f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 457f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 458f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 459f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 460f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin protected void onDestroy() { 46157cbaa1ef40d2215c6400f5ae4af3a09e67abb2dHung-ying Tyan super.onDestroy(); 462f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (mAlbumDataAdapter != null) { 463f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mAlbumDataAdapter.setLoadingListener(null); 464f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 465a2d0d34a90543ee19ea295e72c112fde18fb3828Bobby Georgescu mActionModeHandler.destroy(); 466f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 467f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 468f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private void initializeViews() { 469f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mSelectionManager = new SelectionManager(mActivity, false); 470f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mSelectionManager.setSelectionListener(this); 471b21b8e58a604f6c701245d84b141b5b87663192bOwen Lin Config.AlbumPage config = Config.AlbumPage.get(mActivity); 47248ba94ae713dbf57898cfa84ae69517da50cf7a0Owen Lin mSlotView = new SlotView(mActivity, config.slotViewSpec); 473915c2c5b2c367df71599370613af0924bd7c4887Bobby Georgescu mAlbumView = new AlbumSlotRenderer(mActivity, mSlotView, 474915c2c5b2c367df71599370613af0924bd7c4887Bobby Georgescu mSelectionManager, config.placeholderColor); 4757260f6f74d465520e4497b23fe56f98abb0c15a2Owen Lin mSlotView.setSlotRenderer(mAlbumView); 4767260f6f74d465520e4497b23fe56f98abb0c15a2Owen Lin mRootPane.addComponent(mSlotView); 4777260f6f74d465520e4497b23fe56f98abb0c15a2Owen Lin mSlotView.setListener(new SlotView.SimpleListener() { 478f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 479bc2154199aee16762e3758ad0cfed685323d9a9fChih-Chung Chang public void onDown(int index) { 480bc2154199aee16762e3758ad0cfed685323d9a9fChih-Chung Chang AlbumPage.this.onDown(index); 481bc2154199aee16762e3758ad0cfed685323d9a9fChih-Chung Chang } 482bc2154199aee16762e3758ad0cfed685323d9a9fChih-Chung Chang 483bc2154199aee16762e3758ad0cfed685323d9a9fChih-Chung Chang @Override 48490fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang public void onUp(boolean followedByLongPress) { 48590fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang AlbumPage.this.onUp(followedByLongPress); 486bc2154199aee16762e3758ad0cfed685323d9a9fChih-Chung Chang } 487bc2154199aee16762e3758ad0cfed685323d9a9fChih-Chung Chang 488bc2154199aee16762e3758ad0cfed685323d9a9fChih-Chung Chang @Override 489f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void onSingleTapUp(int slotIndex) { 490f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin AlbumPage.this.onSingleTapUp(slotIndex); 491f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 492bc2154199aee16762e3758ad0cfed685323d9a9fChih-Chung Chang 493f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 494f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void onLongTap(int slotIndex) { 495f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin AlbumPage.this.onLongTap(slotIndex); 496f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 497f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin }); 498f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mActionModeHandler = new ActionModeHandler(mActivity, mSelectionManager); 499f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mActionModeHandler.setActionModeListener(new ActionModeListener() { 5007817979db0c52ffeacb951625b1e821eba303285Ahbong Chang @Override 501f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public boolean onActionItemClicked(MenuItem item) { 502f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return onItemSelected(item); 503f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 504f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin }); 505f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 506f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 507f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private void initializeData(Bundle data) { 508f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mMediaSetPath = Path.fromString(data.getString(KEY_MEDIA_PATH)); 50984c220f10a643927c8a2126de8a755d8d7f7ec9eRay Chen mParentMediaSetString = data.getString(KEY_PARENT_MEDIA_PATH); 510f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mMediaSet = mActivity.getDataManager().getMediaSet(mMediaSetPath); 511cfa105d3934c4dfa14f02b693bfa97c8d17d56a9Chih-Chung Chang if (mMediaSet == null) { 512cfa105d3934c4dfa14f02b693bfa97c8d17d56a9Chih-Chung Chang Utils.fail("MediaSet is null. Path = %s", mMediaSetPath); 513cfa105d3934c4dfa14f02b693bfa97c8d17d56a9Chih-Chung Chang } 514f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mSelectionManager.setSourceMediaSet(mMediaSet); 515c3d8ac3b9504346dafc49e006b5f732dd1db21e8Owen Lin mAlbumDataAdapter = new AlbumDataLoader(mActivity, mMediaSet); 516f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mAlbumDataAdapter.setLoadingListener(new MyLoadingListener()); 517f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mAlbumView.setModel(mAlbumDataAdapter); 518f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 519f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 520f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private void showDetails() { 521f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mShowDetails = true; 5224105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen if (mDetailsHelper == null) { 5234105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen mDetailsHelper = new DetailsHelper(mActivity, mRootPane, mDetailsSource); 5244105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen mDetailsHelper.setCloseListener(new CloseListener() { 5257817979db0c52ffeacb951625b1e821eba303285Ahbong Chang @Override 526f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void onClose() { 527f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin hideDetails(); 528f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 529f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin }); 530f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 5314105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen mDetailsHelper.show(); 532f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 533f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 534f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private void hideDetails() { 535f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mShowDetails = false; 5364105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen mDetailsHelper.hide(); 53731cac30e46a293f6d0901e22c6ab0d083cae7021Owen Lin mAlbumView.setHighlightItemPath(null); 5387260f6f74d465520e4497b23fe56f98abb0c15a2Owen Lin mSlotView.invalidate(); 539f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 540f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 541f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 542f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin protected boolean onCreateActionBar(Menu menu) { 543f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin GalleryActionBar actionBar = mActivity.getGalleryActionBar(); 544b21b8e58a604f6c701245d84b141b5b87663192bOwen Lin MenuInflater inflator = getSupportMenuInflater(); 545f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (mGetContent) { 546b21b8e58a604f6c701245d84b141b5b87663192bOwen Lin inflator.inflate(R.menu.pickup, menu); 54706c027675948259368a902fd6f8c2ecac5db5167Mangesh Ghiware int typeBits = mData.getInt(GalleryActivity.KEY_TYPE_BITS, 548f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin DataManager.INCLUDE_IMAGE); 549f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin actionBar.setTitle(GalleryUtils.getSelectionModePrompt(typeBits)); 550f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } else { 551b21b8e58a604f6c701245d84b141b5b87663192bOwen Lin inflator.inflate(R.menu.album, menu); 552f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin actionBar.setTitle(mMediaSet.getName()); 553b21b8e58a604f6c701245d84b141b5b87663192bOwen Lin 554f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin FilterUtils.setupMenuItems(actionBar, mMediaSetPath, true); 555b21b8e58a604f6c701245d84b141b5b87663192bOwen Lin 556b21b8e58a604f6c701245d84b141b5b87663192bOwen Lin menu.findItem(R.id.action_group_by).setVisible(mShowClusterMenu); 557b21b8e58a604f6c701245d84b141b5b87663192bOwen Lin menu.findItem(R.id.action_camera).setVisible( 5582bb717f1ea38e2ce33dd102a23afe6bfacb5675cOwen Lin MediaSetUtils.isCameraSource(mMediaSetPath) 559b21b8e58a604f6c701245d84b141b5b87663192bOwen Lin && GalleryUtils.isCameraAvailable(mActivity)); 560402237b43fd853377e5dba4e048839ad23b99d72Chih-Chung Chang 561f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 562f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin actionBar.setSubtitle(null); 563b21b8e58a604f6c701245d84b141b5b87663192bOwen Lin return true; 564f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 565f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 5667eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu private void prepareAnimationBackToFilmstrip(int slotIndex) { 567d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu if (mAlbumDataAdapter == null || !mAlbumDataAdapter.isActive(slotIndex)) return; 56800ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu MediaItem item = mAlbumDataAdapter.get(slotIndex); 56900ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu if (item == null) return; 5707eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu TransitionStore transitions = mActivity.getTransitionStore(); 5717eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu transitions.put(PhotoPage.KEY_INDEX_HINT, slotIndex); 5727eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu transitions.put(PhotoPage.KEY_OPEN_ANIMATION_RECT, 57351bc561e85053abfd7fda695e3cd20710acca85cBobby Georgescu mSlotView.getSlotRect(slotIndex, mRootPane)); 5747eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu } 5757eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu 5763cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu private void switchToFilmstrip() { 5773cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu if (mAlbumDataAdapter.size() < 1) return; 5783cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu int targetPhoto = mSlotView.getVisibleStart(); 5793cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu prepareAnimationBackToFilmstrip(targetPhoto); 5803cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu if(mLaunchedFromPhotoPage) { 5813cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu onBackPressed(); 5823cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu } else { 5833cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu pickPhoto(targetPhoto, true); 5843cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu } 5853cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu } 5863cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu 587f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 588f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin protected boolean onItemSelected(MenuItem item) { 589f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin switch (item.getItemId()) { 59084c220f10a643927c8a2126de8a755d8d7f7ec9eRay Chen case android.R.id.home: { 591b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang onUpPressed(); 59284c220f10a643927c8a2126de8a755d8d7f7ec9eRay Chen return true; 59384c220f10a643927c8a2126de8a755d8d7f7ec9eRay Chen } 594bd8e025f1bb39b2be236b183ea8e78f93b308ad1Ray Chen case R.id.action_cancel: 595bd8e025f1bb39b2be236b183ea8e78f93b308ad1Ray Chen mActivity.getStateManager().finishState(this); 596bd8e025f1bb39b2be236b183ea8e78f93b308ad1Ray Chen return true; 597f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin case R.id.action_select: 598f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mSelectionManager.setAutoLeaveSelectionMode(false); 599f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mSelectionManager.enterSelectionMode(); 600f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return true; 601f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin case R.id.action_group_by: { 602f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mActivity.getGalleryActionBar().showClusterDialog(this); 603f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return true; 604f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 605f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin case R.id.action_slideshow: { 60635e7b4ae727394aace466ebcf33d89adf01b690cBobby Georgescu mInCameraAndWantQuitOnPause = false; 607f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin Bundle data = new Bundle(); 608f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin data.putString(SlideshowPage.KEY_SET_PATH, 609f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mMediaSetPath.toString()); 610f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin data.putBoolean(SlideshowPage.KEY_REPEAT, true); 611f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mActivity.getStateManager().startStateForResult( 612f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin SlideshowPage.class, REQUEST_SLIDESHOW, data); 613f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return true; 614f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 615f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin case R.id.action_details: { 616f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (mShowDetails) { 617f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin hideDetails(); 618f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } else { 619f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin showDetails(); 620f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 621f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return true; 622f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 623402237b43fd853377e5dba4e048839ad23b99d72Chih-Chung Chang case R.id.action_camera: { 624b21b8e58a604f6c701245d84b141b5b87663192bOwen Lin GalleryUtils.startCameraActivity(mActivity); 625402237b43fd853377e5dba4e048839ad23b99d72Chih-Chung Chang return true; 626402237b43fd853377e5dba4e048839ad23b99d72Chih-Chung Chang } 627f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin default: 628f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return false; 629f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 630f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 631f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 632f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 633f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin protected void onStateResult(int request, int result, Intent data) { 634f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin switch (request) { 635f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin case REQUEST_SLIDESHOW: { 636f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin // data could be null, if there is no images in the album 637f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (data == null) return; 638f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mFocusIndex = data.getIntExtra(SlideshowPage.KEY_PHOTO_INDEX, 0); 6397260f6f74d465520e4497b23fe56f98abb0c15a2Owen Lin mSlotView.setCenterIndex(mFocusIndex); 640f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin break; 641f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 642f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin case REQUEST_PHOTO: { 643f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (data == null) return; 644bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang mFocusIndex = data.getIntExtra(PhotoPage.KEY_RETURN_INDEX_HINT, 0); 645c63554245d9a822a9fbe5aeda8612624434fd247Owen Lin mSlotView.makeSlotVisible(mFocusIndex); 646f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin break; 647f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 648f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin case REQUEST_DO_ANIMATION: { 6492341c197b0becf99422e8ad305def77df6161714Owen Lin mSlotView.startRisingAnimation(); 650f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin break; 651f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 652f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 653f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 654f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 6557817979db0c52ffeacb951625b1e821eba303285Ahbong Chang @Override 656f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void onSelectionModeChange(int mode) { 657f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin switch (mode) { 658f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin case SelectionManager.ENTER_SELECTION_MODE: { 6592bb717f1ea38e2ce33dd102a23afe6bfacb5675cOwen Lin mActionModeHandler.startActionMode(); 660bcb427870043b12d4a1a454c08a088933d0eaf23Bobby Georgescu performHapticFeedback(HapticFeedbackConstants.LONG_PRESS); 661f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin break; 662f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 663f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin case SelectionManager.LEAVE_SELECTION_MODE: { 6642bb717f1ea38e2ce33dd102a23afe6bfacb5675cOwen Lin mActionModeHandler.finishActionMode(); 665f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mRootPane.invalidate(); 666f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin break; 667f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 668f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin case SelectionManager.SELECT_ALL_MODE: { 669f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mActionModeHandler.updateSupportedOperation(); 670f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mRootPane.invalidate(); 671f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin break; 672f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 673f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 674f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 675f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 6767817979db0c52ffeacb951625b1e821eba303285Ahbong Chang @Override 677f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void onSelectionChange(Path path, boolean selected) { 678f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin int count = mSelectionManager.getSelectedCount(); 679f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin String format = mActivity.getResources().getQuantityString( 680f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin R.plurals.number_of_items_selected, count); 681f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mActionModeHandler.setTitle(String.format(format, count)); 682f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mActionModeHandler.updateSupportedOperation(path, selected); 683f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 684f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 68557cbaa1ef40d2215c6400f5ae4af3a09e67abb2dHung-ying Tyan @Override 68657cbaa1ef40d2215c6400f5ae4af3a09e67abb2dHung-ying Tyan public void onSyncDone(final MediaSet mediaSet, final int resultCode) { 68757cbaa1ef40d2215c6400f5ae4af3a09e67abb2dHung-ying Tyan Log.d(TAG, "onSyncDone: " + Utils.maskDebugInfo(mediaSet.getName()) + " result=" 68857cbaa1ef40d2215c6400f5ae4af3a09e67abb2dHung-ying Tyan + resultCode); 68957cbaa1ef40d2215c6400f5ae4af3a09e67abb2dHung-ying Tyan ((Activity) mActivity).runOnUiThread(new Runnable() { 69057cbaa1ef40d2215c6400f5ae4af3a09e67abb2dHung-ying Tyan @Override 69157cbaa1ef40d2215c6400f5ae4af3a09e67abb2dHung-ying Tyan public void run() { 69271632ac6c1596dd1fd477f95e268f96ad72ea572Owen Lin GLRoot root = mActivity.getGLRoot(); 69371632ac6c1596dd1fd477f95e268f96ad72ea572Owen Lin root.lockRenderThread(); 69405da3f520eacb9219964b6ed57ef37846d889fd7Hung-ying Tyan mSyncResult = resultCode; 69571632ac6c1596dd1fd477f95e268f96ad72ea572Owen Lin try { 69671632ac6c1596dd1fd477f95e268f96ad72ea572Owen Lin if (resultCode == MediaSet.SYNC_RESULT_SUCCESS) { 69771632ac6c1596dd1fd477f95e268f96ad72ea572Owen Lin mInitialSynced = true; 69871632ac6c1596dd1fd477f95e268f96ad72ea572Owen Lin } 69971632ac6c1596dd1fd477f95e268f96ad72ea572Owen Lin clearLoadingBit(BIT_LOADING_SYNC); 70005da3f520eacb9219964b6ed57ef37846d889fd7Hung-ying Tyan showSyncErrorIfNecessary(mLoadingFailed); 70171632ac6c1596dd1fd477f95e268f96ad72ea572Owen Lin } finally { 70271632ac6c1596dd1fd477f95e268f96ad72ea572Owen Lin root.unlockRenderThread(); 70357cbaa1ef40d2215c6400f5ae4af3a09e67abb2dHung-ying Tyan } 70457cbaa1ef40d2215c6400f5ae4af3a09e67abb2dHung-ying Tyan } 70557cbaa1ef40d2215c6400f5ae4af3a09e67abb2dHung-ying Tyan }); 70657cbaa1ef40d2215c6400f5ae4af3a09e67abb2dHung-ying Tyan } 70757cbaa1ef40d2215c6400f5ae4af3a09e67abb2dHung-ying Tyan 70805da3f520eacb9219964b6ed57ef37846d889fd7Hung-ying Tyan // Show sync error toast when all the following conditions are met: 70905da3f520eacb9219964b6ed57ef37846d889fd7Hung-ying Tyan // (1) both loading and sync are done, 71005da3f520eacb9219964b6ed57ef37846d889fd7Hung-ying Tyan // (2) sync result is error, 71105da3f520eacb9219964b6ed57ef37846d889fd7Hung-ying Tyan // (3) the page is still active, and 71205da3f520eacb9219964b6ed57ef37846d889fd7Hung-ying Tyan // (4) no photo is shown or loading fails. 71305da3f520eacb9219964b6ed57ef37846d889fd7Hung-ying Tyan private void showSyncErrorIfNecessary(boolean loadingFailed) { 71405da3f520eacb9219964b6ed57ef37846d889fd7Hung-ying Tyan if ((mLoadingBits == 0) && (mSyncResult == MediaSet.SYNC_RESULT_ERROR) && mIsActive 71505da3f520eacb9219964b6ed57ef37846d889fd7Hung-ying Tyan && (loadingFailed || (mAlbumDataAdapter.size() == 0))) { 71605da3f520eacb9219964b6ed57ef37846d889fd7Hung-ying Tyan Toast.makeText(mActivity, R.string.sync_album_error, 71705da3f520eacb9219964b6ed57ef37846d889fd7Hung-ying Tyan Toast.LENGTH_LONG).show(); 71805da3f520eacb9219964b6ed57ef37846d889fd7Hung-ying Tyan } 71905da3f520eacb9219964b6ed57ef37846d889fd7Hung-ying Tyan } 72005da3f520eacb9219964b6ed57ef37846d889fd7Hung-ying Tyan 721fbdd338d83596ba545a8a7c8105d2ad7b5df56e6Owen Lin private void setLoadingBit(int loadTaskBit) { 722fbdd338d83596ba545a8a7c8105d2ad7b5df56e6Owen Lin mLoadingBits |= loadTaskBit; 723fbdd338d83596ba545a8a7c8105d2ad7b5df56e6Owen Lin } 724fbdd338d83596ba545a8a7c8105d2ad7b5df56e6Owen Lin 725fbdd338d83596ba545a8a7c8105d2ad7b5df56e6Owen Lin private void clearLoadingBit(int loadTaskBit) { 726fbdd338d83596ba545a8a7c8105d2ad7b5df56e6Owen Lin mLoadingBits &= ~loadTaskBit; 727d05b0be120bb217b4f56add24a4b31bee92455b2Chih-Chung Chang if (mLoadingBits == 0 && mIsActive) { 728fbdd338d83596ba545a8a7c8105d2ad7b5df56e6Owen Lin if (mAlbumDataAdapter.size() == 0) { 72909995299480b797254873319caffd5408624988bBobby Georgescu Intent result = new Intent(); 73009995299480b797254873319caffd5408624988bBobby Georgescu result.putExtra(KEY_EMPTY_ALBUM, true); 73109995299480b797254873319caffd5408624988bBobby Georgescu setStateResult(Activity.RESULT_OK, result); 73209995299480b797254873319caffd5408624988bBobby Georgescu mActivity.getStateManager().finishState(this); 733fbdd338d83596ba545a8a7c8105d2ad7b5df56e6Owen Lin } 734fbdd338d83596ba545a8a7c8105d2ad7b5df56e6Owen Lin } 735fbdd338d83596ba545a8a7c8105d2ad7b5df56e6Owen Lin } 736fbdd338d83596ba545a8a7c8105d2ad7b5df56e6Owen Lin 737f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private class MyLoadingListener implements LoadingListener { 738f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 739f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void onLoadingStarted() { 740fbdd338d83596ba545a8a7c8105d2ad7b5df56e6Owen Lin setLoadingBit(BIT_LOADING_RELOAD); 74105da3f520eacb9219964b6ed57ef37846d889fd7Hung-ying Tyan mLoadingFailed = false; 742f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 743f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 744f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 74505da3f520eacb9219964b6ed57ef37846d889fd7Hung-ying Tyan public void onLoadingFinished(boolean loadingFailed) { 746fbdd338d83596ba545a8a7c8105d2ad7b5df56e6Owen Lin clearLoadingBit(BIT_LOADING_RELOAD); 74705da3f520eacb9219964b6ed57ef37846d889fd7Hung-ying Tyan mLoadingFailed = loadingFailed; 74805da3f520eacb9219964b6ed57ef37846d889fd7Hung-ying Tyan showSyncErrorIfNecessary(loadingFailed); 749f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 750f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 751f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 7524105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen private class MyDetailsSource implements DetailsHelper.DetailsSource { 753f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private int mIndex; 754fbdd338d83596ba545a8a7c8105d2ad7b5df56e6Owen Lin 7557817979db0c52ffeacb951625b1e821eba303285Ahbong Chang @Override 756f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public int size() { 757f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return mAlbumDataAdapter.size(); 758f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 759f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 7607817979db0c52ffeacb951625b1e821eba303285Ahbong Chang @Override 761995c4566bed7df1aa48ba7e1351f964efa73880bMichael Kolb public int setIndex() { 762995c4566bed7df1aa48ba7e1351f964efa73880bMichael Kolb Path id = mSelectionManager.getSelected(false).get(0); 763995c4566bed7df1aa48ba7e1351f964efa73880bMichael Kolb mIndex = mAlbumDataAdapter.findItem(id); 764f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return mIndex; 765f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 766f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 7677817979db0c52ffeacb951625b1e821eba303285Ahbong Chang @Override 768f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public MediaDetails getDetails() { 769995c4566bed7df1aa48ba7e1351f964efa73880bMichael Kolb // this relies on setIndex() being called beforehand 770f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin MediaObject item = mAlbumDataAdapter.get(mIndex); 771f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (item != null) { 77231cac30e46a293f6d0901e22c6ab0d083cae7021Owen Lin mAlbumView.setHighlightItemPath(item.getPath()); 773f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return item.getDetails(); 774f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } else { 775f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return null; 776f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 777f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 778f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 7793cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu 7803cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu @Override 7813cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu public void onAlbumModeSelected(int mode) { 7823cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu if (mode == GalleryActionBar.ALBUM_FILMSTRIP_MODE_SELECTED) { 7833cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu switchToFilmstrip(); 7843cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu } 7853cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu } 786f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin} 787