PhotoPage.java revision 33f8567dd5003e4bb342683f3768ab7552648b02
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; 57f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.ui.SelectionManager; 58f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.ui.SynchronizedHandler; 59f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.ui.UserInteractionListener; 60f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.util.GalleryUtils; 61f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 62bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Changpublic class PhotoPage extends ActivityState implements 63bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang PhotoView.Listener, UserInteractionListener, 64bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang OrientationManager.Listener, AppBridge.Server { 65f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private static final String TAG = "PhotoPage"; 66f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 67f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private static final int MSG_HIDE_BARS = 1; 68bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang private static final int MSG_LOCK_ORIENTATION = 2; 69bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang private static final int MSG_UNLOCK_ORIENTATION = 3; 70bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang private static final int MSG_ON_FULL_SCREEN_CHANGED = 4; 716cf807453fb58ccd4cc513ff187b306c7090e67cOwen Lin 72f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private static final int HIDE_BARS_TIMEOUT = 3500; 73f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 74f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private static final int REQUEST_SLIDESHOW = 1; 75f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private static final int REQUEST_CROP = 2; 76f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private static final int REQUEST_CROP_PICASA = 3; 77f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang private static final int REQUEST_EDIT = 4; 78f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 79f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public static final String KEY_MEDIA_SET_PATH = "media-set-path"; 80f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public static final String KEY_MEDIA_ITEM_PATH = "media-item-path"; 81f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public static final String KEY_INDEX_HINT = "index-hint"; 8204ac045bf8da5082bbb0bdc9ea5f9c9b5b796ad0Yuli Huang public static final String KEY_OPEN_ANIMATION_RECT = "open-animation-rect"; 83bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang public static final String KEY_APP_BRIDGE = "app-bridge"; 84bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang 85bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang public static final String KEY_RETURN_INDEX_HINT = "return-index-hint"; 86f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 87f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private GalleryApp mApplication; 88f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private SelectionManager mSelectionManager; 89f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 90f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private PhotoView mPhotoView; 91f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private PhotoPage.Model mModel; 924105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen private DetailsHelper mDetailsHelper; 93f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private boolean mShowDetails; 94cf46a3abc26aac7cdb6b6993aeade053304b71d9Ray Chen private Path mPendingSharePath; 95f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 96f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin // mMediaSet could be null if there is no KEY_MEDIA_SET_PATH supplied. 97f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin // E.g., viewing a photo in gmail attachment 98f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private MediaSet mMediaSet; 99f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private Menu mMenu; 100f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 101f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private int mCurrentIndex = 0; 102f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private Handler mHandler; 103113bfc77c4468411da9ae1290553c3be89f8df9aOwen Lin private boolean mShowBars = true; 1048cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen private GalleryActionBar mActionBar; 105f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private MyMenuVisibilityListener mMenuVisibilityListener; 106f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private boolean mIsMenuVisible; 107f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private boolean mIsInteracting; 108f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private MediaItem mCurrentPhoto = null; 109f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private MenuExecutor mMenuExecutor; 110f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private boolean mIsActive; 111f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private ShareActionProvider mShareActionProvider; 11284c220f10a643927c8a2126de8a755d8d7f7ec9eRay Chen private String mSetPathString; 113b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang // This is the original mSetPathString before adding the camera preview item. 114b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang private String mOriginalSetPathString; 115bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang private AppBridge mAppBridge; 116b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang private ScreenNail mScreenNail; 117bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang private MediaItem mScreenNailItem; 118bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang private OrientationManager mOrientationManager; 11915b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang 12033ef03776b7734717b16f6fc861b831fb1b1dfacMartijn Coenen private NfcAdapter mNfcAdapter; 12133ef03776b7734717b16f6fc861b831fb1b1dfacMartijn Coenen 122f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public static interface Model extends PhotoView.Model { 123f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void resume(); 124f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void pause(); 125f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public boolean isEmpty(); 126f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public MediaItem getCurrentMediaItem(); 127f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void setCurrentPhoto(Path path, int indexHint); 128f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 129f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 130f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private class MyMenuVisibilityListener implements OnMenuVisibilityListener { 131f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void onMenuVisibilityChanged(boolean isVisible) { 132f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mIsMenuVisible = isVisible; 133f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin refreshHidingMessage(); 134f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 135f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 136f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 137604f053d040782159b61d3b74ee533bc2c0ccdd0Ray Chen private final GLView mRootPane = new GLView() { 138f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 139f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 140f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin protected void renderBackground(GLCanvas view) { 141f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin view.clearBuffer(); 142f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 143f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 144f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 145f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin protected void onLayout( 146f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin boolean changed, int left, int top, int right, int bottom) { 147f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mPhotoView.layout(0, 0, right - left, bottom - top); 148f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (mShowDetails) { 1498cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen mDetailsHelper.layout(left, mActionBar.getHeight(), right, bottom); 150f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 151f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 152bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang 153bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang @Override 154bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang protected void orient(int displayRotation, int compensation) { 155bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang displayRotation = mOrientationManager.getDisplayRotation(); 156bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang Log.d(TAG, "orient -- display rotation " + displayRotation 157bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang + ", compensation = " + compensation); 158bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang super.orient(displayRotation, compensation); 159bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang } 160f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin }; 161f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 162f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 163f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void onCreate(Bundle data, Bundle restoreState) { 1648cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen mActionBar = mActivity.getGalleryActionBar(); 165f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mSelectionManager = new SelectionManager(mActivity, false); 166f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mMenuExecutor = new MenuExecutor(mActivity, mSelectionManager); 167f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 168f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mPhotoView = new PhotoView(mActivity); 169bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang mPhotoView.setListener(this); 170f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mRootPane.addComponent(mPhotoView); 171f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mApplication = (GalleryApp)((Activity) mActivity).getApplication(); 172bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang mOrientationManager = mActivity.getOrientationManager(); 173bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang mOrientationManager.addListener(this); 174f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 17584c220f10a643927c8a2126de8a755d8d7f7ec9eRay Chen mSetPathString = data.getString(KEY_MEDIA_SET_PATH); 176b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang mOriginalSetPathString = mSetPathString; 17733ef03776b7734717b16f6fc861b831fb1b1dfacMartijn Coenen mNfcAdapter = NfcAdapter.getDefaultAdapter(mActivity.getAndroidContext()); 178f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin Path itemPath = Path.fromString(data.getString(KEY_MEDIA_ITEM_PATH)); 179f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 18084c220f10a643927c8a2126de8a755d8d7f7ec9eRay Chen if (mSetPathString != null) { 181bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang mAppBridge = (AppBridge) data.getParcelable(KEY_APP_BRIDGE); 182bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang if (mAppBridge != null) { 183bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang mOrientationManager.lockOrientation(); 184b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang 185bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang // Get the ScreenNail from AppBridge and register it. 186bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang mScreenNail = mAppBridge.attachScreenNail(); 187b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang int id = SnailSource.registerScreenNail(mScreenNail); 188b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang Path screenNailSetPath = SnailSource.getSetPath(id); 189bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang Path screenNailItemPath = SnailSource.getItemPath(id); 190bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang mScreenNailItem = (MediaItem) mActivity.getDataManager() 191bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang .getMediaObject(screenNailItemPath); 192b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang 193b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang // Combine the original MediaSet with the one for CameraScreenNail. 194b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang mSetPathString = "/combo/item/{" + screenNailSetPath + 195b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang "," + mSetPathString + "}"; 196b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang 197b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang // Start from the screen nail. 198bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang itemPath = screenNailItemPath; 199788245711658188131ae2670e44fb6ca8ad5d53aWu-cheng Li 200788245711658188131ae2670e44fb6ca8ad5d53aWu-cheng Li // Action bar should not be displayed when camera starts. 201788245711658188131ae2670e44fb6ca8ad5d53aWu-cheng Li mFlags |= FLAG_HIDE_ACTION_BAR; 202b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang } 203b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang 20484c220f10a643927c8a2126de8a755d8d7f7ec9eRay Chen mMediaSet = mActivity.getDataManager().getMediaSet(mSetPathString); 205f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mCurrentIndex = data.getInt(KEY_INDEX_HINT, 0); 206f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (mMediaSet == null) { 20784c220f10a643927c8a2126de8a755d8d7f7ec9eRay Chen Log.w(TAG, "failed to restore " + mSetPathString); 208f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 209f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin PhotoDataAdapter pda = new PhotoDataAdapter( 210bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang mActivity, mPhotoView, mMediaSet, itemPath, mCurrentIndex, 211bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang mAppBridge == null ? -1 : 0); 212f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mModel = pda; 213f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mPhotoView.setModel(mModel); 214f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 215f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin pda.setDataListener(new PhotoDataAdapter.DataListener() { 216f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 217113bfc77c4468411da9ae1290553c3be89f8df9aOwen Lin @Override 218f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void onPhotoChanged(int index, Path item) { 219f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mCurrentIndex = index; 220f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (item != null) { 221f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin MediaItem photo = mModel.getCurrentMediaItem(); 222f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (photo != null) updateCurrentPhoto(photo); 223f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 224f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 225f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 226f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 227f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void onLoadingFinished() { 228f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin GalleryUtils.setSpinnerVisibility((Activity) mActivity, false); 229f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (!mModel.isEmpty()) { 230f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin MediaItem photo = mModel.getCurrentMediaItem(); 231f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (photo != null) updateCurrentPhoto(photo); 232f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } else if (mIsActive) { 233f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mActivity.getStateManager().finishState(PhotoPage.this); 234f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 235f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 236f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 237f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 238f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void onLoadingStarted() { 239f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin GalleryUtils.setSpinnerVisibility((Activity) mActivity, true); 240f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 241f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin }); 242f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } else { 243f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin // Get default media set by the URI 244f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin MediaItem mediaItem = (MediaItem) 245f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mActivity.getDataManager().getMediaObject(itemPath); 246f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mModel = new SinglePhotoDataAdapter(mActivity, mPhotoView, mediaItem); 247f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mPhotoView.setModel(mModel); 248f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin updateCurrentPhoto(mediaItem); 249f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 250cf46a3abc26aac7cdb6b6993aeade053304b71d9Ray Chen 251f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mHandler = new SynchronizedHandler(mActivity.getGLRoot()) { 252f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 253f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void handleMessage(Message message) { 254f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin switch (message.what) { 255f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin case MSG_HIDE_BARS: { 256f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin hideBars(); 257f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin break; 258f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 259bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang case MSG_LOCK_ORIENTATION: { 260bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang mOrientationManager.lockOrientation(); 261bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang break; 262bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang } 263bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang case MSG_UNLOCK_ORIENTATION: { 264bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang mOrientationManager.unlockOrientation(); 265bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang break; 266bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang } 267bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang case MSG_ON_FULL_SCREEN_CHANGED: { 268bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang mAppBridge.onFullScreenChanged(message.arg1 == 1); 269bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang break; 270bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang } 271f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin default: throw new AssertionError(message.what); 272f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 273f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 274f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin }; 275f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 27604ac045bf8da5082bbb0bdc9ea5f9c9b5b796ad0Yuli Huang // start the opening animation only if it's not restored. 27704ac045bf8da5082bbb0bdc9ea5f9c9b5b796ad0Yuli Huang if (restoreState == null) { 27804ac045bf8da5082bbb0bdc9ea5f9c9b5b796ad0Yuli Huang mPhotoView.setOpenAnimationRect((Rect) data.getParcelable(KEY_OPEN_ANIMATION_RECT)); 27904ac045bf8da5082bbb0bdc9ea5f9c9b5b796ad0Yuli Huang } 280f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 281f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 282cf46a3abc26aac7cdb6b6993aeade053304b71d9Ray Chen private void updateShareURI(Path path) { 283cf46a3abc26aac7cdb6b6993aeade053304b71d9Ray Chen if (mShareActionProvider != null) { 284cf46a3abc26aac7cdb6b6993aeade053304b71d9Ray Chen DataManager manager = mActivity.getDataManager(); 285cf46a3abc26aac7cdb6b6993aeade053304b71d9Ray Chen int type = manager.getMediaType(path); 286cf46a3abc26aac7cdb6b6993aeade053304b71d9Ray Chen Intent intent = new Intent(Intent.ACTION_SEND); 287cf46a3abc26aac7cdb6b6993aeade053304b71d9Ray Chen intent.setType(MenuExecutor.getMimeType(type)); 288cf46a3abc26aac7cdb6b6993aeade053304b71d9Ray Chen intent.putExtra(Intent.EXTRA_STREAM, manager.getContentUri(path)); 289cf46a3abc26aac7cdb6b6993aeade053304b71d9Ray Chen mShareActionProvider.setShareIntent(intent); 29033ef03776b7734717b16f6fc861b831fb1b1dfacMartijn Coenen if (mNfcAdapter != null) { 291a41ed05ff2f71d2177b4f24f53acd848b46fc840Martijn Coenen mNfcAdapter.setBeamPushUris(new Uri[]{manager.getContentUri(path)}, 292a41ed05ff2f71d2177b4f24f53acd848b46fc840Martijn Coenen (Activity)mActivity); 29333ef03776b7734717b16f6fc861b831fb1b1dfacMartijn Coenen } 294cf46a3abc26aac7cdb6b6993aeade053304b71d9Ray Chen mPendingSharePath = null; 295cf46a3abc26aac7cdb6b6993aeade053304b71d9Ray Chen } else { 296cf46a3abc26aac7cdb6b6993aeade053304b71d9Ray Chen // This happens when ActionBar is not created yet. 297cf46a3abc26aac7cdb6b6993aeade053304b71d9Ray Chen mPendingSharePath = path; 298cf46a3abc26aac7cdb6b6993aeade053304b71d9Ray Chen } 299cf46a3abc26aac7cdb6b6993aeade053304b71d9Ray Chen } 300cf46a3abc26aac7cdb6b6993aeade053304b71d9Ray Chen 301f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private void updateCurrentPhoto(MediaItem photo) { 302f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (mCurrentPhoto == photo) return; 303f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mCurrentPhoto = photo; 304f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (mCurrentPhoto == null) return; 305f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin updateMenuOperations(); 306736cf74b170d32374c8b35dbe6a46d975258be87Wu-cheng Li // Hide the action bar when going back to camera preview. 307bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang if (photo == mScreenNailItem) hideBars(); 308ed46d77c16cd80357f4a0feada2435dfba8104a6Yuli Huang updateTitle(); 309f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (mShowDetails) { 3104105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen mDetailsHelper.reloadDetails(mModel.getCurrentIndex()); 311f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 312cf46a3abc26aac7cdb6b6993aeade053304b71d9Ray Chen mPhotoView.showVideoPlayIcon( 313cf46a3abc26aac7cdb6b6993aeade053304b71d9Ray Chen photo.getMediaType() == MediaObject.MEDIA_TYPE_VIDEO); 314f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 31515b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang if ((photo.getSupportedOperations() & MediaItem.SUPPORT_SHARE) != 0) { 31615b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang updateShareURI(photo.getPath()); 31715b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang } 318f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 319f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 320ed46d77c16cd80357f4a0feada2435dfba8104a6Yuli Huang private void updateTitle() { 321ed46d77c16cd80357f4a0feada2435dfba8104a6Yuli Huang if (mCurrentPhoto == null) return; 322ed46d77c16cd80357f4a0feada2435dfba8104a6Yuli Huang boolean showTitle = mActivity.getAndroidContext().getResources().getBoolean( 323ed46d77c16cd80357f4a0feada2435dfba8104a6Yuli Huang R.bool.show_action_bar_title); 324ed46d77c16cd80357f4a0feada2435dfba8104a6Yuli Huang if (showTitle && mCurrentPhoto.getName() != null) 325ed46d77c16cd80357f4a0feada2435dfba8104a6Yuli Huang mActionBar.setTitle(mCurrentPhoto.getName()); 326ed46d77c16cd80357f4a0feada2435dfba8104a6Yuli Huang else 327ed46d77c16cd80357f4a0feada2435dfba8104a6Yuli Huang mActionBar.setTitle(""); 328ed46d77c16cd80357f4a0feada2435dfba8104a6Yuli Huang } 329ed46d77c16cd80357f4a0feada2435dfba8104a6Yuli Huang 330f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private void updateMenuOperations() { 3312066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang if (mMenu == null) return; 3322066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang MenuItem item = mMenu.findItem(R.id.action_slideshow); 3332066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang if (item != null) { 3342066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang item.setVisible(canDoSlideShow()); 3352066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang } 3362066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang if (mCurrentPhoto == null) return; 337f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin int supportedOperations = mCurrentPhoto.getSupportedOperations(); 338f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (!GalleryUtils.isEditorAvailable((Context) mActivity, "image/*")) { 339f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin supportedOperations &= ~MediaObject.SUPPORT_EDIT; 340f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 341604f053d040782159b61d3b74ee533bc2c0ccdd0Ray Chen 342f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin MenuExecutor.updateMenuOperation(mMenu, supportedOperations); 343f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 344f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 3452066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang private boolean canDoSlideShow() { 3462066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang if (mMediaSet == null || mCurrentPhoto == null) { 3472066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang return false; 3482066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang } 3492066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang if (mCurrentPhoto.getMediaType() != MediaObject.MEDIA_TYPE_IMAGE) { 3502066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang return false; 3512066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang } 3522066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang if (mMediaSet instanceof MtpDevice) { 3532066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang return false; 3542066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang } 3552066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang return true; 3562066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang } 3572066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang 358f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private void showBars() { 359f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (mShowBars) return; 360f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mShowBars = true; 361f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mActionBar.show(); 362f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin WindowManager.LayoutParams params = ((Activity) mActivity).getWindow().getAttributes(); 363f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin params.systemUiVisibility = View.SYSTEM_UI_FLAG_VISIBLE; 364f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin ((Activity) mActivity).getWindow().setAttributes(params); 365f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 366f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 367f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private void hideBars() { 368f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (!mShowBars) return; 369f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mShowBars = false; 370f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mActionBar.hide(); 371f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin WindowManager.LayoutParams params = ((Activity) mActivity).getWindow().getAttributes(); 372f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin params.systemUiVisibility = View. SYSTEM_UI_FLAG_LOW_PROFILE; 373f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin ((Activity) mActivity).getWindow().setAttributes(params); 374f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 375f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 376f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private void refreshHidingMessage() { 377f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mHandler.removeMessages(MSG_HIDE_BARS); 378f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (!mIsMenuVisible && !mIsInteracting) { 379f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mHandler.sendEmptyMessageDelayed(MSG_HIDE_BARS, HIDE_BARS_TIMEOUT); 380f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 381f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 382f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 3838bc5bebba780ca4a322b466b06fc909331697cf4Owen Lin @Override 384f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void onUserInteraction() { 385f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin showBars(); 386f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin refreshHidingMessage(); 387f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 388f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 389f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void onUserInteractionTap() { 390f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (mShowBars) { 391f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin hideBars(); 392f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mHandler.removeMessages(MSG_HIDE_BARS); 393f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } else { 394f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin showBars(); 395f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin refreshHidingMessage(); 396f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 397f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 398f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 3998bc5bebba780ca4a322b466b06fc909331697cf4Owen Lin @Override 400f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void onUserInteractionBegin() { 401f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin showBars(); 402f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mIsInteracting = true; 403f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin refreshHidingMessage(); 404f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 405f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 4068bc5bebba780ca4a322b466b06fc909331697cf4Owen Lin @Override 407f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void onUserInteractionEnd() { 408f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mIsInteracting = false; 4098bc5bebba780ca4a322b466b06fc909331697cf4Owen Lin 4108bc5bebba780ca4a322b466b06fc909331697cf4Owen Lin // This function could be called from GL thread (in SlotView.render) 4118bc5bebba780ca4a322b466b06fc909331697cf4Owen Lin // and post to the main thread. So, it could be executed while the 4128bc5bebba780ca4a322b466b06fc909331697cf4Owen Lin // activity is paused. 4138bc5bebba780ca4a322b466b06fc909331697cf4Owen Lin if (mIsActive) refreshHidingMessage(); 414f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 415f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 416f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 417bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang public void onOrientationCompensationChanged(int degrees) { 418bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang mActivity.getGLRoot().setOrientationCompensation(degrees); 419bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang } 420bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang 421bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang @Override 422f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin protected void onBackPressed() { 423f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (mShowDetails) { 424f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin hideDetails(); 425160e6d776daab93610b3d12413ad9ff2dd867d8bChih-Chung Chang } else if (mScreenNail == null 426160e6d776daab93610b3d12413ad9ff2dd867d8bChih-Chung Chang || !switchWithCaptureAnimation(-1)) { 427bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang // We are leaving this page. Set the result now. 428bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang setResult(); 429f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin super.onBackPressed(); 430f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 431f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 432f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 433b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang private void onUpPressed() { 434b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang if (mActivity.getStateManager().getStateCount() > 1) { 435b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang super.onBackPressed(); 436b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang } else if (mOriginalSetPathString != null) { 437b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang // We're in view mode so set up the stacks on our own. 438b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang Bundle data = new Bundle(getData()); 439b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang data.putString(AlbumPage.KEY_MEDIA_PATH, mOriginalSetPathString); 440b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang data.putString(AlbumPage.KEY_PARENT_MEDIA_PATH, 441b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang mActivity.getDataManager().getTopSetPath( 442b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang DataManager.INCLUDE_ALL)); 443b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang mActivity.getStateManager().switchState(this, AlbumPage.class, data); 444b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang } 445b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang } 446b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang 447bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang private void setResult() { 448bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang Intent result = null; 449bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang if (!mPhotoView.getFilmMode()) { 450bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang result = new Intent(); 451bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang result.putExtra(KEY_RETURN_INDEX_HINT, mCurrentIndex); 452bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang } 453bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang setStateResult(Activity.RESULT_OK, result); 454bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang } 455bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang 456bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang ////////////////////////////////////////////////////////////////////////// 457bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang // AppBridge.Server interface 458bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang ////////////////////////////////////////////////////////////////////////// 459bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang 460bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang @Override 461bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang public void setCameraNaturalFrame(Rect frame) { 462bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang mPhotoView.setCameraNaturalFrame(frame); 463bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang } 464bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang 465bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang @Override 4662c6173822a612597c79be41b126367ddfbb5d518Chih-Chung Chang public boolean switchWithCaptureAnimation(int offset) { 4672c6173822a612597c79be41b126367ddfbb5d518Chih-Chung Chang return mPhotoView.switchWithCaptureAnimation(offset); 4682c6173822a612597c79be41b126367ddfbb5d518Chih-Chung Chang } 4692c6173822a612597c79be41b126367ddfbb5d518Chih-Chung Chang 470f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 471f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin protected boolean onCreateActionBar(Menu menu) { 472f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin MenuInflater inflater = ((Activity) mActivity).getMenuInflater(); 473f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin inflater.inflate(R.menu.photo, menu); 474f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mShareActionProvider = GalleryActionBar.initializeShareActionProvider(menu); 475cf46a3abc26aac7cdb6b6993aeade053304b71d9Ray Chen if (mPendingSharePath != null) updateShareURI(mPendingSharePath); 476f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mMenu = menu; 477f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mShowBars = true; 478f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin updateMenuOperations(); 479ed46d77c16cd80357f4a0feada2435dfba8104a6Yuli Huang updateTitle(); 480f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return true; 481f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 482f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 483f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 484f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin protected boolean onItemSelected(MenuItem item) { 485f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin MediaItem current = mModel.getCurrentMediaItem(); 486f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 487f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (current == null) { 488f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin // item is not ready, ignore 489f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return true; 490f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 491f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 492f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin int currentIndex = mModel.getCurrentIndex(); 493f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin Path path = current.getPath(); 494f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 495f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin DataManager manager = mActivity.getDataManager(); 496f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin int action = item.getItemId(); 49767098d1a72fd04e2af06d3a5939cde28c65f70d9Ray Chen boolean needsConfirm = false; 498f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin switch (action) { 49984c220f10a643927c8a2126de8a755d8d7f7ec9eRay Chen case android.R.id.home: { 500b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang onUpPressed(); 50184c220f10a643927c8a2126de8a755d8d7f7ec9eRay Chen return true; 50284c220f10a643927c8a2126de8a755d8d7f7ec9eRay Chen } 503f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin case R.id.action_slideshow: { 504f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin Bundle data = new Bundle(); 5056cf807453fb58ccd4cc513ff187b306c7090e67cOwen Lin data.putString(SlideshowPage.KEY_SET_PATH, mMediaSet.getPath().toString()); 506604f053d040782159b61d3b74ee533bc2c0ccdd0Ray Chen data.putString(SlideshowPage.KEY_ITEM_PATH, path.toString()); 507f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin data.putInt(SlideshowPage.KEY_PHOTO_INDEX, currentIndex); 508f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin data.putBoolean(SlideshowPage.KEY_REPEAT, true); 509f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mActivity.getStateManager().startStateForResult( 510f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin SlideshowPage.class, REQUEST_SLIDESHOW, data); 511f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return true; 512f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 513f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin case R.id.action_crop: { 514f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin Activity activity = (Activity) mActivity; 515f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin Intent intent = new Intent(CropImage.CROP_ACTION); 516f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin intent.setClass(activity, CropImage.class); 517f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin intent.setData(manager.getContentUri(path)); 518f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin activity.startActivityForResult(intent, PicasaSource.isPicasaImage(current) 519f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin ? REQUEST_CROP_PICASA 520f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin : REQUEST_CROP); 521f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return true; 522f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 523f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang case R.id.action_edit: { 524f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang Intent intent = new Intent(Intent.ACTION_EDIT) 525f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang .setData(manager.getContentUri(path)) 526f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang .setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); 527f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang ((Activity) mActivity).startActivityForResult(Intent.createChooser(intent, null), 528f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang REQUEST_EDIT); 529f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang return true; 530f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang } 531f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin case R.id.action_details: { 532f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (mShowDetails) { 533f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin hideDetails(); 534f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } else { 535f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin showDetails(currentIndex); 536f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 537f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return true; 538f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 53967098d1a72fd04e2af06d3a5939cde28c65f70d9Ray Chen case R.id.action_delete: 54067098d1a72fd04e2af06d3a5939cde28c65f70d9Ray Chen needsConfirm = true; 541f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin case R.id.action_setas: 542f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin case R.id.action_rotate_ccw: 543f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin case R.id.action_rotate_cw: 544f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin case R.id.action_show_on_map: 545f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mSelectionManager.deSelectAll(); 546f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mSelectionManager.toggle(path); 54767098d1a72fd04e2af06d3a5939cde28c65f70d9Ray Chen mMenuExecutor.onMenuClicked(item, needsConfirm, null); 548f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return true; 549f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin case R.id.action_import: 550f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mSelectionManager.deSelectAll(); 551f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mSelectionManager.toggle(path); 55267098d1a72fd04e2af06d3a5939cde28c65f70d9Ray Chen mMenuExecutor.onMenuClicked(item, needsConfirm, 553f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin new ImportCompleteListener(mActivity)); 554f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return true; 555f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin default : 556f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return false; 557f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 558f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 559f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 560f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private void hideDetails() { 561f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mShowDetails = false; 5624105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen mDetailsHelper.hide(); 563f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 564f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 565f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private void showDetails(int index) { 566f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mShowDetails = true; 5674105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen if (mDetailsHelper == null) { 5684105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen mDetailsHelper = new DetailsHelper(mActivity, mRootPane, new MyDetailsSource()); 5694105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen mDetailsHelper.setCloseListener(new CloseListener() { 570f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void onClose() { 571f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin hideDetails(); 572f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 573f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin }); 574f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 5754105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen mDetailsHelper.reloadDetails(index); 5764105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen mDetailsHelper.show(); 577f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 578f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 579bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang //////////////////////////////////////////////////////////////////////////// 580bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang // Callbacks from PhotoView 581bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang //////////////////////////////////////////////////////////////////////////// 582bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang @Override 583f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void onSingleTapUp(int x, int y) { 584bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang if (mAppBridge != null) { 585bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang if (mAppBridge.onSingleTapUp(x, y)) return; 586014d9586d8145a33f4e99eaad570587f6d650026Wu-cheng Li } 587014d9586d8145a33f4e99eaad570587f6d650026Wu-cheng Li 588f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin MediaItem item = mModel.getCurrentMediaItem(); 589b5dc542fbaeaf99bebdcf775ef0e034e89e88eaeWu-cheng Li if (item == null || item == mScreenNailItem) { 590b5dc542fbaeaf99bebdcf775ef0e034e89e88eaeWu-cheng Li // item is not ready or it is camera preview, ignore 591f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return; 592f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 593f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 594f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin boolean playVideo = 595f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin (item.getSupportedOperations() & MediaItem.SUPPORT_PLAY) != 0; 596f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 597f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (playVideo) { 598f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin // determine if the point is at center (1/6) of the photo view. 599f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin // (The position of the "play" icon is at center (1/6) of the photo) 600f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin int w = mPhotoView.getWidth(); 601f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin int h = mPhotoView.getHeight(); 602f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin playVideo = (Math.abs(x - w / 2) * 12 <= w) 603f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin && (Math.abs(y - h / 2) * 12 <= h); 604f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 605f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 606f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (playVideo) { 607f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin playVideo((Activity) mActivity, item.getPlayUri(), item.getName()); 608f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } else { 609f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin onUserInteractionTap(); 610f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 611f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 612f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 613bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang @Override 614bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang public void lockOrientation() { 615bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang mHandler.sendEmptyMessage(MSG_LOCK_ORIENTATION); 616bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang } 617bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang 618bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang @Override 619bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang public void unlockOrientation() { 620bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang // Temporarily disabled until Camera UI can switch orientation. 621bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang // mHandler.sendEmptyMessage(MSG_UNLOCK_ORIENTATION); 622bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang } 623bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang 624bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang @Override 625bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang public void onFullScreenChanged(boolean full) { 626bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang Message m = mHandler.obtainMessage( 627bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang MSG_ON_FULL_SCREEN_CHANGED, full ? 1 : 0, 0); 628bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang m.sendToTarget(); 629bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang } 630bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang 631f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public static void playVideo(Activity activity, Uri uri, String title) { 632f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin try { 633f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin Intent intent = new Intent(Intent.ACTION_VIEW) 634f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin .setDataAndType(uri, "video/*"); 635f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin intent.putExtra(Intent.EXTRA_TITLE, title); 636f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin activity.startActivity(intent); 637f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } catch (ActivityNotFoundException e) { 638f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin Toast.makeText(activity, activity.getString(R.string.video_err), 639f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin Toast.LENGTH_SHORT).show(); 640f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 641f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 642f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 643f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang private void setCurrentPhotoByIntent(Intent intent) { 644f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang if (intent == null) return; 645f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang Path path = mApplication.getDataManager() 646f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang .findPathByUri(intent.getData(), intent.getType()); 647f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang if (path != null) { 648f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang mModel.setCurrentPhoto(path, mCurrentIndex); 649f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang } 650f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang } 651f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang 652f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 653f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin protected void onStateResult(int requestCode, int resultCode, Intent data) { 654f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin switch (requestCode) { 655f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang case REQUEST_EDIT: 656f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang setCurrentPhotoByIntent(data); 657f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang break; 658f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin case REQUEST_CROP: 659f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (resultCode == Activity.RESULT_OK) { 660f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang setCurrentPhotoByIntent(data); 661f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 662f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin break; 663f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin case REQUEST_CROP_PICASA: { 664f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang if (resultCode == Activity.RESULT_OK) { 665f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang Context context = mActivity.getAndroidContext(); 666f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang // TODO: Use crop_saved instead of photo_saved after its new translation is done. 667f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang String message = context.getString(R.string.photo_saved, 668f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang context.getString(R.string.folder_download)); 669f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang Toast.makeText(context, message, Toast.LENGTH_SHORT).show(); 670f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang } 671f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin break; 672f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 673f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin case REQUEST_SLIDESHOW: { 674f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (data == null) break; 675f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin String path = data.getStringExtra(SlideshowPage.KEY_ITEM_PATH); 676f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin int index = data.getIntExtra(SlideshowPage.KEY_PHOTO_INDEX, 0); 677f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (path != null) { 678f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mModel.setCurrentPhoto(Path.fromString(path), index); 679f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 680f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 681f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 682f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 683f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 684f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 685f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void onPause() { 686f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin super.onPause(); 687f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mIsActive = false; 688bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang if (mAppBridge != null) mAppBridge.setServer(null); 6894105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen DetailsHelper.pause(); 690f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mPhotoView.pause(); 691f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mModel.pause(); 692f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mHandler.removeMessages(MSG_HIDE_BARS); 693f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mActionBar.removeOnMenuVisibilityListener(mMenuVisibilityListener); 69433ef03776b7734717b16f6fc861b831fb1b1dfacMartijn Coenen 6952785956f8f5654966a41e20f482f4af3057eea3fChih-Chung Chang mMenuExecutor.pause(); 696f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 697f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 698f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 699f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin protected void onResume() { 700f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin super.onResume(); 701f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mIsActive = true; 702f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin setContentPane(mRootPane); 70304ac045bf8da5082bbb0bdc9ea5f9c9b5b796ad0Yuli Huang 704f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mModel.resume(); 705f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mPhotoView.resume(); 706f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (mMenuVisibilityListener == null) { 707f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mMenuVisibilityListener = new MyMenuVisibilityListener(); 708f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 7098cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen mActionBar.setDisplayOptions(mSetPathString != null, true); 710f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mActionBar.addOnMenuVisibilityListener(mMenuVisibilityListener); 71133ef03776b7734717b16f6fc861b831fb1b1dfacMartijn Coenen 712f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin onUserInteraction(); 713bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang if (mAppBridge != null) { 714bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang mAppBridge.setServer(this); 71533f8567dd5003e4bb342683f3768ab7552648b02Chih-Chung Chang mPhotoView.resetToFirstPicture(); 716bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang } 717f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 718f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 71915b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang @Override 72015b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang protected void onDestroy() { 721bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang if (mAppBridge != null) { 722bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang // Unregister the ScreenNail and notify mAppBridge. 723b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang SnailSource.unregisterScreenNail(mScreenNail); 724bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang mAppBridge.detachScreenNail(); 725bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang mAppBridge = null; 726b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang mScreenNail = null; 727b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang } 728bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang mOrientationManager.removeListener(this); 72915b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang super.onDestroy(); 73015b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang } 73115b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang 732f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private class MyDetailsSource implements DetailsSource { 7334105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen private int mIndex; 7346cf807453fb58ccd4cc513ff187b306c7090e67cOwen Lin 7356cf807453fb58ccd4cc513ff187b306c7090e67cOwen Lin @Override 736f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public MediaDetails getDetails() { 737f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return mModel.getCurrentMediaItem().getDetails(); 738f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 7396cf807453fb58ccd4cc513ff187b306c7090e67cOwen Lin 7406cf807453fb58ccd4cc513ff187b306c7090e67cOwen Lin @Override 741f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public int size() { 742f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return mMediaSet != null ? mMediaSet.getMediaItemCount() : 1; 743f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 7446cf807453fb58ccd4cc513ff187b306c7090e67cOwen Lin 7456cf807453fb58ccd4cc513ff187b306c7090e67cOwen Lin @Override 746f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public int findIndex(int indexHint) { 7474105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen mIndex = indexHint; 748f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return indexHint; 749f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 7504105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen 7516cf807453fb58ccd4cc513ff187b306c7090e67cOwen Lin @Override 7524105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen public int getIndex() { 7534105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen return mIndex; 7544105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen } 755f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 756f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin} 757