PhotoPage.java revision 21a412c93c9b0401b039f4eb86d4950752e5bb84
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 19604f053d040782159b61d3b74ee533bc2c0ccdd0Ray Chenimport android.app.ActionBar.OnMenuVisibilityListener; 208bc5bebba780ca4a322b466b06fc909331697cf4Owen Linimport android.app.Activity; 21604f053d040782159b61d3b74ee533bc2c0ccdd0Ray Chenimport android.content.ActivityNotFoundException; 22604f053d040782159b61d3b74ee533bc2c0ccdd0Ray Chenimport android.content.Context; 23604f053d040782159b61d3b74ee533bc2c0ccdd0Ray Chenimport android.content.Intent; 2404ac045bf8da5082bbb0bdc9ea5f9c9b5b796ad0Yuli Huangimport android.graphics.Rect; 25604f053d040782159b61d3b74ee533bc2c0ccdd0Ray Chenimport android.net.Uri; 2633ef03776b7734717b16f6fc861b831fb1b1dfacMartijn Coenenimport android.nfc.NfcAdapter; 27604f053d040782159b61d3b74ee533bc2c0ccdd0Ray Chenimport android.os.Bundle; 28604f053d040782159b61d3b74ee533bc2c0ccdd0Ray Chenimport android.os.Handler; 29604f053d040782159b61d3b74ee533bc2c0ccdd0Ray Chenimport android.os.Message; 30604f053d040782159b61d3b74ee533bc2c0ccdd0Ray Chenimport android.view.Menu; 31604f053d040782159b61d3b74ee533bc2c0ccdd0Ray Chenimport android.view.MenuInflater; 32604f053d040782159b61d3b74ee533bc2c0ccdd0Ray Chenimport android.view.MenuItem; 33604f053d040782159b61d3b74ee533bc2c0ccdd0Ray Chenimport android.view.View; 348bc5bebba780ca4a322b466b06fc909331697cf4Owen Linimport android.view.WindowManager; 35604f053d040782159b61d3b74ee533bc2c0ccdd0Ray Chenimport android.widget.ShareActionProvider; 36604f053d040782159b61d3b74ee533bc2c0ccdd0Ray Chenimport android.widget.Toast; 37604f053d040782159b61d3b74ee533bc2c0ccdd0Ray Chen 38f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.R; 39f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.data.DataManager; 40f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.data.MediaDetails; 41f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.data.MediaItem; 42f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.data.MediaObject; 43f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.data.MediaSet; 44f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.data.MtpDevice; 45f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.data.Path; 4615b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Changimport com.android.gallery3d.data.SnailSource; 47f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.picasasource.PicasaSource; 484105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chenimport com.android.gallery3d.ui.DetailsHelper; 494105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chenimport com.android.gallery3d.ui.DetailsHelper.CloseListener; 504105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chenimport com.android.gallery3d.ui.DetailsHelper.DetailsSource; 51f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.ui.GLCanvas; 52f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.ui.GLView; 53f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.ui.ImportCompleteListener; 54f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.ui.MenuExecutor; 5521a412c93c9b0401b039f4eb86d4950752e5bb84Owen Linimport com.android.gallery3d.ui.PhotoView; 56b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Changimport com.android.gallery3d.ui.ScreenNail; 57b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Changimport com.android.gallery3d.ui.ScreenNailHolder; 58f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.ui.SelectionManager; 59f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.ui.SynchronizedHandler; 60f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.ui.UserInteractionListener; 61f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.util.GalleryUtils; 62f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 63f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linpublic class PhotoPage extends ActivityState 64921895ba0b3511aeba053bdc0c965f9d3f62eb51Chih-Chung Chang implements PhotoView.PhotoTapListener, UserInteractionListener { 65f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private static final String TAG = "PhotoPage"; 66f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 67f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private static final int MSG_HIDE_BARS = 1; 686cf807453fb58ccd4cc513ff187b306c7090e67cOwen Lin 69f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private static final int HIDE_BARS_TIMEOUT = 3500; 70f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 71f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private static final int REQUEST_SLIDESHOW = 1; 72f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private static final int REQUEST_CROP = 2; 73f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private static final int REQUEST_CROP_PICASA = 3; 74f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 75f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public static final String KEY_MEDIA_SET_PATH = "media-set-path"; 76f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public static final String KEY_MEDIA_ITEM_PATH = "media-item-path"; 77f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public static final String KEY_INDEX_HINT = "index-hint"; 7804ac045bf8da5082bbb0bdc9ea5f9c9b5b796ad0Yuli Huang public static final String KEY_OPEN_ANIMATION_RECT = "open-animation-rect"; 79b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang public static final String KEY_SCREENNAIL_HOLDER = "screennail-holder"; 80f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 81f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private GalleryApp mApplication; 82f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private SelectionManager mSelectionManager; 83f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 84f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private PhotoView mPhotoView; 85f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private PhotoPage.Model mModel; 864105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen private DetailsHelper mDetailsHelper; 87f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private boolean mShowDetails; 88cf46a3abc26aac7cdb6b6993aeade053304b71d9Ray Chen private Path mPendingSharePath; 89f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 90f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin // mMediaSet could be null if there is no KEY_MEDIA_SET_PATH supplied. 91f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin // E.g., viewing a photo in gmail attachment 92f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private MediaSet mMediaSet; 93f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private Menu mMenu; 94f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 95604f053d040782159b61d3b74ee533bc2c0ccdd0Ray Chen private final Intent mResultIntent = new Intent(); 96f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private int mCurrentIndex = 0; 97f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private Handler mHandler; 98113bfc77c4468411da9ae1290553c3be89f8df9aOwen Lin private boolean mShowBars = true; 998cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen private GalleryActionBar mActionBar; 100f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private MyMenuVisibilityListener mMenuVisibilityListener; 101014d9586d8145a33f4e99eaad570587f6d650026Wu-cheng Li private PageTapListener mPageTapListener; 102f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private boolean mIsMenuVisible; 103f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private boolean mIsInteracting; 104f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private MediaItem mCurrentPhoto = null; 105f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private MenuExecutor mMenuExecutor; 106f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private boolean mIsActive; 107f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private ShareActionProvider mShareActionProvider; 10884c220f10a643927c8a2126de8a755d8d7f7ec9eRay Chen private String mSetPathString; 109b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang private ScreenNailHolder mScreenNailHolder; 110b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang private ScreenNail mScreenNail; 11115b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang 11233ef03776b7734717b16f6fc861b831fb1b1dfacMartijn Coenen private NfcAdapter mNfcAdapter; 11333ef03776b7734717b16f6fc861b831fb1b1dfacMartijn Coenen 114f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public static interface Model extends PhotoView.Model { 115f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void resume(); 116f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void pause(); 117f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public boolean isEmpty(); 118f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public MediaItem getCurrentMediaItem(); 119f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public int getCurrentIndex(); 120f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void setCurrentPhoto(Path path, int indexHint); 121f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 122f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 123f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private class MyMenuVisibilityListener implements OnMenuVisibilityListener { 124f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void onMenuVisibilityChanged(boolean isVisible) { 125f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mIsMenuVisible = isVisible; 126f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin refreshHidingMessage(); 127f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 128f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 129f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 130014d9586d8145a33f4e99eaad570587f6d650026Wu-cheng Li public interface PageTapListener { 131014d9586d8145a33f4e99eaad570587f6d650026Wu-cheng Li // Return true if the tap is consumed. 132014d9586d8145a33f4e99eaad570587f6d650026Wu-cheng Li public boolean onSingleTapUp(int x, int y); 133014d9586d8145a33f4e99eaad570587f6d650026Wu-cheng Li } 134014d9586d8145a33f4e99eaad570587f6d650026Wu-cheng Li 135014d9586d8145a33f4e99eaad570587f6d650026Wu-cheng Li public void setPageTapListener(PageTapListener listener) { 136014d9586d8145a33f4e99eaad570587f6d650026Wu-cheng Li mPageTapListener = listener; 137014d9586d8145a33f4e99eaad570587f6d650026Wu-cheng Li } 138014d9586d8145a33f4e99eaad570587f6d650026Wu-cheng Li 139604f053d040782159b61d3b74ee533bc2c0ccdd0Ray Chen private final GLView mRootPane = new GLView() { 140f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 141f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 142f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin protected void renderBackground(GLCanvas view) { 143f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin view.clearBuffer(); 144f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 145f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 146f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 147f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin protected void onLayout( 148f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin boolean changed, int left, int top, int right, int bottom) { 149f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mPhotoView.layout(0, 0, right - left, bottom - top); 150f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (mShowDetails) { 1518cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen mDetailsHelper.layout(left, mActionBar.getHeight(), right, bottom); 152f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 153f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 154f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin }; 155f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 156f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 157f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void onCreate(Bundle data, Bundle restoreState) { 1588cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen mActionBar = mActivity.getGalleryActionBar(); 159f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mSelectionManager = new SelectionManager(mActivity, false); 160f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mMenuExecutor = new MenuExecutor(mActivity, mSelectionManager); 161f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 162f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mPhotoView = new PhotoView(mActivity); 163f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mPhotoView.setPhotoTapListener(this); 164f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mRootPane.addComponent(mPhotoView); 165f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mApplication = (GalleryApp)((Activity) mActivity).getApplication(); 166f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 16784c220f10a643927c8a2126de8a755d8d7f7ec9eRay Chen mSetPathString = data.getString(KEY_MEDIA_SET_PATH); 16833ef03776b7734717b16f6fc861b831fb1b1dfacMartijn Coenen mNfcAdapter = NfcAdapter.getDefaultAdapter(mActivity.getAndroidContext()); 169f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin Path itemPath = Path.fromString(data.getString(KEY_MEDIA_ITEM_PATH)); 170f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 17184c220f10a643927c8a2126de8a755d8d7f7ec9eRay Chen if (mSetPathString != null) { 172b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang mScreenNailHolder = 173b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang (ScreenNailHolder) data.getParcelable(KEY_SCREENNAIL_HOLDER); 174b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang if (mScreenNailHolder != null) { 175b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang mScreenNail = mScreenNailHolder.attach(); 176b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang 177b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang // Get the ScreenNail from ScreenNailHolder and register it. 178b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang int id = SnailSource.registerScreenNail(mScreenNail); 179b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang Path screenNailSetPath = SnailSource.getSetPath(id); 180b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang Path screenNailItemPath = SnailSource.getItemPath(id); 181b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang 182b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang // Combine the original MediaSet with the one for CameraScreenNail. 183b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang mSetPathString = "/combo/item/{" + screenNailSetPath + 184b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang "," + mSetPathString + "}"; 185b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang 186b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang // Start from the screen nail. 187b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang itemPath = screenNailItemPath; 188b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang } 189b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang 19084c220f10a643927c8a2126de8a755d8d7f7ec9eRay Chen mMediaSet = mActivity.getDataManager().getMediaSet(mSetPathString); 191f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mCurrentIndex = data.getInt(KEY_INDEX_HINT, 0); 192f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mMediaSet = (MediaSet) 19384c220f10a643927c8a2126de8a755d8d7f7ec9eRay Chen mActivity.getDataManager().getMediaObject(mSetPathString); 194f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (mMediaSet == null) { 19584c220f10a643927c8a2126de8a755d8d7f7ec9eRay Chen Log.w(TAG, "failed to restore " + mSetPathString); 196f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 197f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin PhotoDataAdapter pda = new PhotoDataAdapter( 198f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mActivity, mPhotoView, mMediaSet, itemPath, mCurrentIndex); 199f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mModel = pda; 200f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mPhotoView.setModel(mModel); 201f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 202f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mResultIntent.putExtra(KEY_INDEX_HINT, mCurrentIndex); 203f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin setStateResult(Activity.RESULT_OK, mResultIntent); 204f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 205f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin pda.setDataListener(new PhotoDataAdapter.DataListener() { 206f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 207113bfc77c4468411da9ae1290553c3be89f8df9aOwen Lin @Override 208f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void onPhotoChanged(int index, Path item) { 209f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mCurrentIndex = index; 210f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mResultIntent.putExtra(KEY_INDEX_HINT, index); 211f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (item != null) { 212f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mResultIntent.putExtra(KEY_MEDIA_ITEM_PATH, item.toString()); 213f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin MediaItem photo = mModel.getCurrentMediaItem(); 214f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (photo != null) updateCurrentPhoto(photo); 215f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } else { 216f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mResultIntent.removeExtra(KEY_MEDIA_ITEM_PATH); 217f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 218f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin setStateResult(Activity.RESULT_OK, mResultIntent); 219f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 220f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 221f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 222f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void onLoadingFinished() { 223f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin GalleryUtils.setSpinnerVisibility((Activity) mActivity, false); 224f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (!mModel.isEmpty()) { 225f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin MediaItem photo = mModel.getCurrentMediaItem(); 226f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (photo != null) updateCurrentPhoto(photo); 227f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } else if (mIsActive) { 228f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mActivity.getStateManager().finishState(PhotoPage.this); 229f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 230f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 231f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 232f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 233f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void onLoadingStarted() { 234f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin GalleryUtils.setSpinnerVisibility((Activity) mActivity, true); 235f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 236f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin }); 237f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } else { 238f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin // Get default media set by the URI 239f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin MediaItem mediaItem = (MediaItem) 240f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mActivity.getDataManager().getMediaObject(itemPath); 241f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mModel = new SinglePhotoDataAdapter(mActivity, mPhotoView, mediaItem); 242f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mPhotoView.setModel(mModel); 243f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin updateCurrentPhoto(mediaItem); 244f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 245cf46a3abc26aac7cdb6b6993aeade053304b71d9Ray Chen 246f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mHandler = new SynchronizedHandler(mActivity.getGLRoot()) { 247f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 248f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void handleMessage(Message message) { 249f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin switch (message.what) { 250f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin case MSG_HIDE_BARS: { 251f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin hideBars(); 252f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin break; 253f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 254f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin default: throw new AssertionError(message.what); 255f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 256f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 257f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin }; 258f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 25904ac045bf8da5082bbb0bdc9ea5f9c9b5b796ad0Yuli Huang // start the opening animation only if it's not restored. 26004ac045bf8da5082bbb0bdc9ea5f9c9b5b796ad0Yuli Huang if (restoreState == null) { 26104ac045bf8da5082bbb0bdc9ea5f9c9b5b796ad0Yuli Huang mPhotoView.setOpenAnimationRect((Rect) data.getParcelable(KEY_OPEN_ANIMATION_RECT)); 26204ac045bf8da5082bbb0bdc9ea5f9c9b5b796ad0Yuli Huang } 263f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 264f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 265cf46a3abc26aac7cdb6b6993aeade053304b71d9Ray Chen private void updateShareURI(Path path) { 266cf46a3abc26aac7cdb6b6993aeade053304b71d9Ray Chen if (mShareActionProvider != null) { 267cf46a3abc26aac7cdb6b6993aeade053304b71d9Ray Chen DataManager manager = mActivity.getDataManager(); 268cf46a3abc26aac7cdb6b6993aeade053304b71d9Ray Chen int type = manager.getMediaType(path); 269cf46a3abc26aac7cdb6b6993aeade053304b71d9Ray Chen Intent intent = new Intent(Intent.ACTION_SEND); 270cf46a3abc26aac7cdb6b6993aeade053304b71d9Ray Chen intent.setType(MenuExecutor.getMimeType(type)); 271cf46a3abc26aac7cdb6b6993aeade053304b71d9Ray Chen intent.putExtra(Intent.EXTRA_STREAM, manager.getContentUri(path)); 272cf46a3abc26aac7cdb6b6993aeade053304b71d9Ray Chen mShareActionProvider.setShareIntent(intent); 27333ef03776b7734717b16f6fc861b831fb1b1dfacMartijn Coenen if (mNfcAdapter != null) { 274a41ed05ff2f71d2177b4f24f53acd848b46fc840Martijn Coenen mNfcAdapter.setBeamPushUris(new Uri[]{manager.getContentUri(path)}, 275a41ed05ff2f71d2177b4f24f53acd848b46fc840Martijn Coenen (Activity)mActivity); 27633ef03776b7734717b16f6fc861b831fb1b1dfacMartijn Coenen } 277cf46a3abc26aac7cdb6b6993aeade053304b71d9Ray Chen mPendingSharePath = null; 278cf46a3abc26aac7cdb6b6993aeade053304b71d9Ray Chen } else { 279cf46a3abc26aac7cdb6b6993aeade053304b71d9Ray Chen // This happens when ActionBar is not created yet. 280cf46a3abc26aac7cdb6b6993aeade053304b71d9Ray Chen mPendingSharePath = path; 281cf46a3abc26aac7cdb6b6993aeade053304b71d9Ray Chen } 282cf46a3abc26aac7cdb6b6993aeade053304b71d9Ray Chen } 283cf46a3abc26aac7cdb6b6993aeade053304b71d9Ray Chen 284f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private void updateCurrentPhoto(MediaItem photo) { 285f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (mCurrentPhoto == photo) return; 286f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mCurrentPhoto = photo; 287f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (mCurrentPhoto == null) return; 288f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin updateMenuOperations(); 289ed46d77c16cd80357f4a0feada2435dfba8104a6Yuli Huang updateTitle(); 290f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (mShowDetails) { 2914105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen mDetailsHelper.reloadDetails(mModel.getCurrentIndex()); 292f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 293cf46a3abc26aac7cdb6b6993aeade053304b71d9Ray Chen mPhotoView.showVideoPlayIcon( 294cf46a3abc26aac7cdb6b6993aeade053304b71d9Ray Chen photo.getMediaType() == MediaObject.MEDIA_TYPE_VIDEO); 295f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 29615b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang if ((photo.getSupportedOperations() & MediaItem.SUPPORT_SHARE) != 0) { 29715b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang updateShareURI(photo.getPath()); 29815b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang } 299f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 300f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 301ed46d77c16cd80357f4a0feada2435dfba8104a6Yuli Huang private void updateTitle() { 302ed46d77c16cd80357f4a0feada2435dfba8104a6Yuli Huang if (mCurrentPhoto == null) return; 303ed46d77c16cd80357f4a0feada2435dfba8104a6Yuli Huang boolean showTitle = mActivity.getAndroidContext().getResources().getBoolean( 304ed46d77c16cd80357f4a0feada2435dfba8104a6Yuli Huang R.bool.show_action_bar_title); 305ed46d77c16cd80357f4a0feada2435dfba8104a6Yuli Huang if (showTitle && mCurrentPhoto.getName() != null) 306ed46d77c16cd80357f4a0feada2435dfba8104a6Yuli Huang mActionBar.setTitle(mCurrentPhoto.getName()); 307ed46d77c16cd80357f4a0feada2435dfba8104a6Yuli Huang else 308ed46d77c16cd80357f4a0feada2435dfba8104a6Yuli Huang mActionBar.setTitle(""); 309ed46d77c16cd80357f4a0feada2435dfba8104a6Yuli Huang } 310ed46d77c16cd80357f4a0feada2435dfba8104a6Yuli Huang 311f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private void updateMenuOperations() { 3122066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang if (mMenu == null) return; 3132066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang MenuItem item = mMenu.findItem(R.id.action_slideshow); 3142066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang if (item != null) { 3152066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang item.setVisible(canDoSlideShow()); 3162066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang } 3172066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang if (mCurrentPhoto == null) return; 318f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin int supportedOperations = mCurrentPhoto.getSupportedOperations(); 319f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (!GalleryUtils.isEditorAvailable((Context) mActivity, "image/*")) { 320f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin supportedOperations &= ~MediaObject.SUPPORT_EDIT; 321f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 322604f053d040782159b61d3b74ee533bc2c0ccdd0Ray Chen 323f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin MenuExecutor.updateMenuOperation(mMenu, supportedOperations); 324f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 325f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 3262066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang private boolean canDoSlideShow() { 3272066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang if (mMediaSet == null || mCurrentPhoto == null) { 3282066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang return false; 3292066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang } 3302066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang if (mCurrentPhoto.getMediaType() != MediaObject.MEDIA_TYPE_IMAGE) { 3312066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang return false; 3322066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang } 3332066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang if (mMediaSet instanceof MtpDevice) { 3342066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang return false; 3352066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang } 3362066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang return true; 3372066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang } 3382066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang 339f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private void showBars() { 340f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (mShowBars) return; 341f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mShowBars = true; 342f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mActionBar.show(); 343f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin WindowManager.LayoutParams params = ((Activity) mActivity).getWindow().getAttributes(); 344f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin params.systemUiVisibility = View.SYSTEM_UI_FLAG_VISIBLE; 345f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin ((Activity) mActivity).getWindow().setAttributes(params); 346f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 347f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 348f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private void hideBars() { 349f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (!mShowBars) return; 350f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mShowBars = false; 351f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mActionBar.hide(); 352f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin WindowManager.LayoutParams params = ((Activity) mActivity).getWindow().getAttributes(); 353f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin params.systemUiVisibility = View. SYSTEM_UI_FLAG_LOW_PROFILE; 354f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin ((Activity) mActivity).getWindow().setAttributes(params); 355f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 356f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 357f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private void refreshHidingMessage() { 358f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mHandler.removeMessages(MSG_HIDE_BARS); 359f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (!mIsMenuVisible && !mIsInteracting) { 360f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mHandler.sendEmptyMessageDelayed(MSG_HIDE_BARS, HIDE_BARS_TIMEOUT); 361f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 362f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 363f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 3648bc5bebba780ca4a322b466b06fc909331697cf4Owen Lin @Override 365f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void onUserInteraction() { 366f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin showBars(); 367f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin refreshHidingMessage(); 368f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 369f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 370f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void onUserInteractionTap() { 371f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (mShowBars) { 372f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin hideBars(); 373f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mHandler.removeMessages(MSG_HIDE_BARS); 374f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } else { 375f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin showBars(); 376f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin refreshHidingMessage(); 377f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 378f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 379f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 3808bc5bebba780ca4a322b466b06fc909331697cf4Owen Lin @Override 381f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void onUserInteractionBegin() { 382f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin showBars(); 383f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mIsInteracting = true; 384f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin refreshHidingMessage(); 385f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 386f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 3878bc5bebba780ca4a322b466b06fc909331697cf4Owen Lin @Override 388f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void onUserInteractionEnd() { 389f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mIsInteracting = false; 3908bc5bebba780ca4a322b466b06fc909331697cf4Owen Lin 3918bc5bebba780ca4a322b466b06fc909331697cf4Owen Lin // This function could be called from GL thread (in SlotView.render) 3928bc5bebba780ca4a322b466b06fc909331697cf4Owen Lin // and post to the main thread. So, it could be executed while the 3938bc5bebba780ca4a322b466b06fc909331697cf4Owen Lin // activity is paused. 3948bc5bebba780ca4a322b466b06fc909331697cf4Owen Lin if (mIsActive) refreshHidingMessage(); 395f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 396f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 397f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 398f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin protected void onBackPressed() { 399f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (mShowDetails) { 400f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin hideDetails(); 401160e6d776daab93610b3d12413ad9ff2dd867d8bChih-Chung Chang } else if (mScreenNail == null 402160e6d776daab93610b3d12413ad9ff2dd867d8bChih-Chung Chang || !switchWithCaptureAnimation(-1)) { 403f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin super.onBackPressed(); 404f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 405f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 406f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 4072c6173822a612597c79be41b126367ddfbb5d518Chih-Chung Chang // Switch to the previous or next picture using the capture animation. 4082c6173822a612597c79be41b126367ddfbb5d518Chih-Chung Chang // The offset is -1 to switch to the previous picture, 1 to switch to 4092c6173822a612597c79be41b126367ddfbb5d518Chih-Chung Chang // the next picture. 4102c6173822a612597c79be41b126367ddfbb5d518Chih-Chung Chang public boolean switchWithCaptureAnimation(int offset) { 4112c6173822a612597c79be41b126367ddfbb5d518Chih-Chung Chang return mPhotoView.switchWithCaptureAnimation(offset); 4122c6173822a612597c79be41b126367ddfbb5d518Chih-Chung Chang } 4132c6173822a612597c79be41b126367ddfbb5d518Chih-Chung Chang 414f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 415f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin protected boolean onCreateActionBar(Menu menu) { 416f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin MenuInflater inflater = ((Activity) mActivity).getMenuInflater(); 417f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin inflater.inflate(R.menu.photo, menu); 418f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mShareActionProvider = GalleryActionBar.initializeShareActionProvider(menu); 419cf46a3abc26aac7cdb6b6993aeade053304b71d9Ray Chen if (mPendingSharePath != null) updateShareURI(mPendingSharePath); 420f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mMenu = menu; 421f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mShowBars = true; 422f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin updateMenuOperations(); 423ed46d77c16cd80357f4a0feada2435dfba8104a6Yuli Huang updateTitle(); 424f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return true; 425f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 426f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 427f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 428f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin protected boolean onItemSelected(MenuItem item) { 429f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin MediaItem current = mModel.getCurrentMediaItem(); 430f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 431f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (current == null) { 432f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin // item is not ready, ignore 433f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return true; 434f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 435f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 436f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin int currentIndex = mModel.getCurrentIndex(); 437f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin Path path = current.getPath(); 438f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 439f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin DataManager manager = mActivity.getDataManager(); 440f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin int action = item.getItemId(); 44167098d1a72fd04e2af06d3a5939cde28c65f70d9Ray Chen boolean needsConfirm = false; 442f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin switch (action) { 44384c220f10a643927c8a2126de8a755d8d7f7ec9eRay Chen case android.R.id.home: { 44484c220f10a643927c8a2126de8a755d8d7f7ec9eRay Chen if (mSetPathString != null) { 44584c220f10a643927c8a2126de8a755d8d7f7ec9eRay Chen if (mActivity.getStateManager().getStateCount() > 1) { 44684c220f10a643927c8a2126de8a755d8d7f7ec9eRay Chen onBackPressed(); 44784c220f10a643927c8a2126de8a755d8d7f7ec9eRay Chen } else { 44898c2490a424da79beefbdd8a29fb90ab006c77b0Ray Chen // We're in view mode so set up the stacks on our own. 44998c2490a424da79beefbdd8a29fb90ab006c77b0Ray Chen Bundle data = new Bundle(getData()); 45098c2490a424da79beefbdd8a29fb90ab006c77b0Ray Chen data.putString(AlbumPage.KEY_MEDIA_PATH, mSetPathString); 45198c2490a424da79beefbdd8a29fb90ab006c77b0Ray Chen data.putString(AlbumPage.KEY_PARENT_MEDIA_PATH, 45298c2490a424da79beefbdd8a29fb90ab006c77b0Ray Chen mActivity.getDataManager().getTopSetPath( 45398c2490a424da79beefbdd8a29fb90ab006c77b0Ray Chen DataManager.INCLUDE_ALL)); 45498c2490a424da79beefbdd8a29fb90ab006c77b0Ray Chen mActivity.getStateManager().switchState(this, AlbumPage.class, data); 45584c220f10a643927c8a2126de8a755d8d7f7ec9eRay Chen } 45684c220f10a643927c8a2126de8a755d8d7f7ec9eRay Chen } 45784c220f10a643927c8a2126de8a755d8d7f7ec9eRay Chen return true; 45884c220f10a643927c8a2126de8a755d8d7f7ec9eRay Chen } 459f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin case R.id.action_slideshow: { 460f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin Bundle data = new Bundle(); 4616cf807453fb58ccd4cc513ff187b306c7090e67cOwen Lin data.putString(SlideshowPage.KEY_SET_PATH, mMediaSet.getPath().toString()); 462604f053d040782159b61d3b74ee533bc2c0ccdd0Ray Chen data.putString(SlideshowPage.KEY_ITEM_PATH, path.toString()); 463f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin data.putInt(SlideshowPage.KEY_PHOTO_INDEX, currentIndex); 464f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin data.putBoolean(SlideshowPage.KEY_REPEAT, true); 465f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mActivity.getStateManager().startStateForResult( 466f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin SlideshowPage.class, REQUEST_SLIDESHOW, data); 467f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return true; 468f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 469f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin case R.id.action_crop: { 470f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin Activity activity = (Activity) mActivity; 471f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin Intent intent = new Intent(CropImage.CROP_ACTION); 472f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin intent.setClass(activity, CropImage.class); 473f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin intent.setData(manager.getContentUri(path)); 474f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin activity.startActivityForResult(intent, PicasaSource.isPicasaImage(current) 475f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin ? REQUEST_CROP_PICASA 476f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin : REQUEST_CROP); 477f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return true; 478f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 479f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin case R.id.action_details: { 480f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (mShowDetails) { 481f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin hideDetails(); 482f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } else { 483f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin showDetails(currentIndex); 484f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 485f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return true; 486f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 48767098d1a72fd04e2af06d3a5939cde28c65f70d9Ray Chen case R.id.action_delete: 48867098d1a72fd04e2af06d3a5939cde28c65f70d9Ray Chen needsConfirm = true; 489f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin case R.id.action_setas: 490f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin case R.id.action_rotate_ccw: 491f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin case R.id.action_rotate_cw: 492f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin case R.id.action_show_on_map: 493f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin case R.id.action_edit: 494f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mSelectionManager.deSelectAll(); 495f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mSelectionManager.toggle(path); 49667098d1a72fd04e2af06d3a5939cde28c65f70d9Ray Chen mMenuExecutor.onMenuClicked(item, needsConfirm, null); 497f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return true; 498f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin case R.id.action_import: 499f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mSelectionManager.deSelectAll(); 500f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mSelectionManager.toggle(path); 50167098d1a72fd04e2af06d3a5939cde28c65f70d9Ray Chen mMenuExecutor.onMenuClicked(item, needsConfirm, 502f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin new ImportCompleteListener(mActivity)); 503f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return true; 504f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin default : 505f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return false; 506f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 507f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 508f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 509f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private void hideDetails() { 510f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mShowDetails = false; 5114105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen mDetailsHelper.hide(); 512f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 513f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 514f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private void showDetails(int index) { 515f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mShowDetails = true; 5164105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen if (mDetailsHelper == null) { 5174105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen mDetailsHelper = new DetailsHelper(mActivity, mRootPane, new MyDetailsSource()); 5184105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen mDetailsHelper.setCloseListener(new CloseListener() { 519f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void onClose() { 520f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin hideDetails(); 521f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 522f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin }); 523f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 5244105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen mDetailsHelper.reloadDetails(index); 5254105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen mDetailsHelper.show(); 526f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 527f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 528f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void onSingleTapUp(int x, int y) { 529014d9586d8145a33f4e99eaad570587f6d650026Wu-cheng Li if (mPageTapListener != null) { 530014d9586d8145a33f4e99eaad570587f6d650026Wu-cheng Li if (mPageTapListener.onSingleTapUp(x, y)) return; 531014d9586d8145a33f4e99eaad570587f6d650026Wu-cheng Li } 532014d9586d8145a33f4e99eaad570587f6d650026Wu-cheng Li 533f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin MediaItem item = mModel.getCurrentMediaItem(); 534f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (item == null) { 535f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin // item is not ready, ignore 536f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return; 537f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 538f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 539f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin boolean playVideo = 540f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin (item.getSupportedOperations() & MediaItem.SUPPORT_PLAY) != 0; 541f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 542f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (playVideo) { 543f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin // determine if the point is at center (1/6) of the photo view. 544f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin // (The position of the "play" icon is at center (1/6) of the photo) 545f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin int w = mPhotoView.getWidth(); 546f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin int h = mPhotoView.getHeight(); 547f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin playVideo = (Math.abs(x - w / 2) * 12 <= w) 548f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin && (Math.abs(y - h / 2) * 12 <= h); 549f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 550f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 551f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (playVideo) { 552f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin playVideo((Activity) mActivity, item.getPlayUri(), item.getName()); 553f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } else { 554f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin onUserInteractionTap(); 555f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 556f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 557f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 558f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public static void playVideo(Activity activity, Uri uri, String title) { 559f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin try { 560f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin Intent intent = new Intent(Intent.ACTION_VIEW) 561f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin .setDataAndType(uri, "video/*"); 562f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin intent.putExtra(Intent.EXTRA_TITLE, title); 563f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin activity.startActivity(intent); 564f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } catch (ActivityNotFoundException e) { 565f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin Toast.makeText(activity, activity.getString(R.string.video_err), 566f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin Toast.LENGTH_SHORT).show(); 567f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 568f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 569f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 570f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 571f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin protected void onStateResult(int requestCode, int resultCode, Intent data) { 572f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin switch (requestCode) { 573f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin case REQUEST_CROP: 574f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (resultCode == Activity.RESULT_OK) { 575f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (data == null) break; 57621a412c93c9b0401b039f4eb86d4950752e5bb84Owen Lin Path path = mApplication.getDataManager() 57721a412c93c9b0401b039f4eb86d4950752e5bb84Owen Lin .findPathByUri(data.getData(), data.getType()); 578f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (path != null) { 579f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mModel.setCurrentPhoto(path, mCurrentIndex); 580f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 581f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 582f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin break; 583f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin case REQUEST_CROP_PICASA: { 584f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin int message = resultCode == Activity.RESULT_OK 585f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin ? R.string.crop_saved 586f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin : R.string.crop_not_saved; 587f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin Toast.makeText(mActivity.getAndroidContext(), 588f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin message, Toast.LENGTH_SHORT).show(); 589f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin break; 590f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 591f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin case REQUEST_SLIDESHOW: { 592f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (data == null) break; 593f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin String path = data.getStringExtra(SlideshowPage.KEY_ITEM_PATH); 594f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin int index = data.getIntExtra(SlideshowPage.KEY_PHOTO_INDEX, 0); 595f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (path != null) { 596f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mModel.setCurrentPhoto(Path.fromString(path), index); 597f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 598f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 599f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 600f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 601f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 602f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 603f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void onPause() { 604f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin super.onPause(); 605f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mIsActive = false; 6064105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen DetailsHelper.pause(); 607f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mPhotoView.pause(); 608f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mModel.pause(); 609f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mHandler.removeMessages(MSG_HIDE_BARS); 610f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mActionBar.removeOnMenuVisibilityListener(mMenuVisibilityListener); 61133ef03776b7734717b16f6fc861b831fb1b1dfacMartijn Coenen 6122785956f8f5654966a41e20f482f4af3057eea3fChih-Chung Chang mMenuExecutor.pause(); 613f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 614f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 615f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 616f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin protected void onResume() { 617f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin super.onResume(); 618f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mIsActive = true; 619f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin setContentPane(mRootPane); 62004ac045bf8da5082bbb0bdc9ea5f9c9b5b796ad0Yuli Huang 621f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mModel.resume(); 622f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mPhotoView.resume(); 623f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (mMenuVisibilityListener == null) { 624f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mMenuVisibilityListener = new MyMenuVisibilityListener(); 625f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 6268cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen mActionBar.setDisplayOptions(mSetPathString != null, true); 627f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mActionBar.addOnMenuVisibilityListener(mMenuVisibilityListener); 62833ef03776b7734717b16f6fc861b831fb1b1dfacMartijn Coenen 629f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin onUserInteraction(); 630f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 631f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 63215b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang @Override 63315b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang protected void onDestroy() { 634b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang if (mScreenNailHolder != null) { 635b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang // Unregister the ScreenNail and notify mScreenNailHolder. 636b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang SnailSource.unregisterScreenNail(mScreenNail); 637b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang mScreenNailHolder.detach(); 638b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang mScreenNailHolder = null; 639b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang mScreenNail = null; 640b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang } 64115b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang super.onDestroy(); 64215b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang } 64315b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang 644f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private class MyDetailsSource implements DetailsSource { 6454105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen private int mIndex; 6466cf807453fb58ccd4cc513ff187b306c7090e67cOwen Lin 6476cf807453fb58ccd4cc513ff187b306c7090e67cOwen Lin @Override 648f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public MediaDetails getDetails() { 649f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return mModel.getCurrentMediaItem().getDetails(); 650f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 6516cf807453fb58ccd4cc513ff187b306c7090e67cOwen Lin 6526cf807453fb58ccd4cc513ff187b306c7090e67cOwen Lin @Override 653f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public int size() { 654f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return mMediaSet != null ? mMediaSet.getMediaItemCount() : 1; 655f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 6566cf807453fb58ccd4cc513ff187b306c7090e67cOwen Lin 6576cf807453fb58ccd4cc513ff187b306c7090e67cOwen Lin @Override 658f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public int findIndex(int indexHint) { 6594105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen mIndex = indexHint; 660f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return indexHint; 661f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 6624105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen 6636cf807453fb58ccd4cc513ff187b306c7090e67cOwen Lin @Override 6644105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen public int getIndex() { 6654105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen return mIndex; 6664105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen } 667f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 66833ef03776b7734717b16f6fc861b831fb1b1dfacMartijn Coenen 669f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin} 670