PhotoPage.java revision bd141b5a51c96f6fcaddfa547f0928ce69cf0755
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; 46bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Changimport com.android.gallery3d.data.SnailItem; 4715b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Changimport com.android.gallery3d.data.SnailSource; 48f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.picasasource.PicasaSource; 494105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chenimport com.android.gallery3d.ui.DetailsHelper; 504105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chenimport com.android.gallery3d.ui.DetailsHelper.CloseListener; 514105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chenimport com.android.gallery3d.ui.DetailsHelper.DetailsSource; 52f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.ui.GLCanvas; 53f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.ui.GLView; 54f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.ui.ImportCompleteListener; 55f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.ui.MenuExecutor; 5621a412c93c9b0401b039f4eb86d4950752e5bb84Owen Linimport com.android.gallery3d.ui.PhotoView; 57b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Changimport com.android.gallery3d.ui.ScreenNail; 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 63bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Changpublic class PhotoPage extends ActivityState implements 64bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang PhotoView.Listener, UserInteractionListener, 65bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang OrientationManager.Listener, AppBridge.Server { 66f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private static final String TAG = "PhotoPage"; 67f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 68f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private static final int MSG_HIDE_BARS = 1; 69bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang private static final int MSG_LOCK_ORIENTATION = 2; 70bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang private static final int MSG_UNLOCK_ORIENTATION = 3; 71bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang private static final int MSG_ON_FULL_SCREEN_CHANGED = 4; 726cf807453fb58ccd4cc513ff187b306c7090e67cOwen Lin 73f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private static final int HIDE_BARS_TIMEOUT = 3500; 74f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 75f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private static final int REQUEST_SLIDESHOW = 1; 76f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private static final int REQUEST_CROP = 2; 77f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private static final int REQUEST_CROP_PICASA = 3; 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; 113bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang private AppBridge mAppBridge; 114b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang private ScreenNail mScreenNail; 115bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang private MediaItem mScreenNailItem; 116bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang private OrientationManager mOrientationManager; 11715b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang 11833ef03776b7734717b16f6fc861b831fb1b1dfacMartijn Coenen private NfcAdapter mNfcAdapter; 11933ef03776b7734717b16f6fc861b831fb1b1dfacMartijn Coenen 120f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public static interface Model extends PhotoView.Model { 121f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void resume(); 122f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void pause(); 123f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public boolean isEmpty(); 124f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public MediaItem getCurrentMediaItem(); 125f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void setCurrentPhoto(Path path, int indexHint); 126f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 127f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 128f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private class MyMenuVisibilityListener implements OnMenuVisibilityListener { 129f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void onMenuVisibilityChanged(boolean isVisible) { 130f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mIsMenuVisible = isVisible; 131f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin refreshHidingMessage(); 132f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 133f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 134f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 135604f053d040782159b61d3b74ee533bc2c0ccdd0Ray Chen private final GLView mRootPane = new GLView() { 136f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 137f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 138f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin protected void renderBackground(GLCanvas view) { 139f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin view.clearBuffer(); 140f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 141f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 142f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 143f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin protected void onLayout( 144f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin boolean changed, int left, int top, int right, int bottom) { 145f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mPhotoView.layout(0, 0, right - left, bottom - top); 146f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (mShowDetails) { 1478cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen mDetailsHelper.layout(left, mActionBar.getHeight(), right, bottom); 148f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 149f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 150bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang 151bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang @Override 152bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang protected void orient(int displayRotation, int compensation) { 153bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang displayRotation = mOrientationManager.getDisplayRotation(); 154bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang Log.d(TAG, "orient -- display rotation " + displayRotation 155bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang + ", compensation = " + compensation); 156bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang super.orient(displayRotation, compensation); 157bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang } 158f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin }; 159f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 160f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 161f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void onCreate(Bundle data, Bundle restoreState) { 1628cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen mActionBar = mActivity.getGalleryActionBar(); 163f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mSelectionManager = new SelectionManager(mActivity, false); 164f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mMenuExecutor = new MenuExecutor(mActivity, mSelectionManager); 165f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 166f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mPhotoView = new PhotoView(mActivity); 167bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang mPhotoView.setListener(this); 168f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mRootPane.addComponent(mPhotoView); 169f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mApplication = (GalleryApp)((Activity) mActivity).getApplication(); 170bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang mOrientationManager = mActivity.getOrientationManager(); 171bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang mOrientationManager.addListener(this); 172f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 17384c220f10a643927c8a2126de8a755d8d7f7ec9eRay Chen mSetPathString = data.getString(KEY_MEDIA_SET_PATH); 17433ef03776b7734717b16f6fc861b831fb1b1dfacMartijn Coenen mNfcAdapter = NfcAdapter.getDefaultAdapter(mActivity.getAndroidContext()); 175f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin Path itemPath = Path.fromString(data.getString(KEY_MEDIA_ITEM_PATH)); 176f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 17784c220f10a643927c8a2126de8a755d8d7f7ec9eRay Chen if (mSetPathString != null) { 178bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang mAppBridge = (AppBridge) data.getParcelable(KEY_APP_BRIDGE); 179bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang if (mAppBridge != null) { 180bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang mOrientationManager.lockOrientation(); 181b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang 182bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang // Get the ScreenNail from AppBridge and register it. 183bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang mScreenNail = mAppBridge.attachScreenNail(); 184b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang int id = SnailSource.registerScreenNail(mScreenNail); 185b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang Path screenNailSetPath = SnailSource.getSetPath(id); 186bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang Path screenNailItemPath = SnailSource.getItemPath(id); 187bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang mScreenNailItem = (MediaItem) mActivity.getDataManager() 188bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang .getMediaObject(screenNailItemPath); 189b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang 190b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang // Combine the original MediaSet with the one for CameraScreenNail. 191b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang mSetPathString = "/combo/item/{" + screenNailSetPath + 192b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang "," + mSetPathString + "}"; 193b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang 194b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang // Start from the screen nail. 195bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang itemPath = screenNailItemPath; 196788245711658188131ae2670e44fb6ca8ad5d53aWu-cheng Li 197788245711658188131ae2670e44fb6ca8ad5d53aWu-cheng Li // Action bar should not be displayed when camera starts. 198788245711658188131ae2670e44fb6ca8ad5d53aWu-cheng Li mFlags |= FLAG_HIDE_ACTION_BAR; 199b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang } 200b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang 20184c220f10a643927c8a2126de8a755d8d7f7ec9eRay Chen mMediaSet = mActivity.getDataManager().getMediaSet(mSetPathString); 202f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mCurrentIndex = data.getInt(KEY_INDEX_HINT, 0); 203f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (mMediaSet == null) { 20484c220f10a643927c8a2126de8a755d8d7f7ec9eRay Chen Log.w(TAG, "failed to restore " + mSetPathString); 205f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 206f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin PhotoDataAdapter pda = new PhotoDataAdapter( 207bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang mActivity, mPhotoView, mMediaSet, itemPath, mCurrentIndex, 208bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang mAppBridge == null ? -1 : 0); 209f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mModel = pda; 210f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mPhotoView.setModel(mModel); 211f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 212f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin pda.setDataListener(new PhotoDataAdapter.DataListener() { 213f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 214113bfc77c4468411da9ae1290553c3be89f8df9aOwen Lin @Override 215f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void onPhotoChanged(int index, Path item) { 216f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mCurrentIndex = index; 217f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (item != null) { 218f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin MediaItem photo = mModel.getCurrentMediaItem(); 219f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (photo != null) updateCurrentPhoto(photo); 220f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 221f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 222f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 223f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 224f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void onLoadingFinished() { 225f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin GalleryUtils.setSpinnerVisibility((Activity) mActivity, false); 226f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (!mModel.isEmpty()) { 227f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin MediaItem photo = mModel.getCurrentMediaItem(); 228f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (photo != null) updateCurrentPhoto(photo); 229f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } else if (mIsActive) { 230f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mActivity.getStateManager().finishState(PhotoPage.this); 231f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 232f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 233f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 234f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 235f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void onLoadingStarted() { 236f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin GalleryUtils.setSpinnerVisibility((Activity) mActivity, true); 237f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 238f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin }); 239f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } else { 240f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin // Get default media set by the URI 241f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin MediaItem mediaItem = (MediaItem) 242f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mActivity.getDataManager().getMediaObject(itemPath); 243f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mModel = new SinglePhotoDataAdapter(mActivity, mPhotoView, mediaItem); 244f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mPhotoView.setModel(mModel); 245f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin updateCurrentPhoto(mediaItem); 246f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 247cf46a3abc26aac7cdb6b6993aeade053304b71d9Ray Chen 248f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mHandler = new SynchronizedHandler(mActivity.getGLRoot()) { 249f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 250f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void handleMessage(Message message) { 251f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin switch (message.what) { 252f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin case MSG_HIDE_BARS: { 253f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin hideBars(); 254f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin break; 255f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 256bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang case MSG_LOCK_ORIENTATION: { 257bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang mOrientationManager.lockOrientation(); 258bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang break; 259bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang } 260bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang case MSG_UNLOCK_ORIENTATION: { 261bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang mOrientationManager.unlockOrientation(); 262bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang break; 263bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang } 264bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang case MSG_ON_FULL_SCREEN_CHANGED: { 265bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang mAppBridge.onFullScreenChanged(message.arg1 == 1); 266bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang break; 267bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang } 268f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin default: throw new AssertionError(message.what); 269f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 270f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 271f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin }; 272f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 27304ac045bf8da5082bbb0bdc9ea5f9c9b5b796ad0Yuli Huang // start the opening animation only if it's not restored. 27404ac045bf8da5082bbb0bdc9ea5f9c9b5b796ad0Yuli Huang if (restoreState == null) { 27504ac045bf8da5082bbb0bdc9ea5f9c9b5b796ad0Yuli Huang mPhotoView.setOpenAnimationRect((Rect) data.getParcelable(KEY_OPEN_ANIMATION_RECT)); 27604ac045bf8da5082bbb0bdc9ea5f9c9b5b796ad0Yuli Huang } 277f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 278f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 279cf46a3abc26aac7cdb6b6993aeade053304b71d9Ray Chen private void updateShareURI(Path path) { 280cf46a3abc26aac7cdb6b6993aeade053304b71d9Ray Chen if (mShareActionProvider != null) { 281cf46a3abc26aac7cdb6b6993aeade053304b71d9Ray Chen DataManager manager = mActivity.getDataManager(); 282cf46a3abc26aac7cdb6b6993aeade053304b71d9Ray Chen int type = manager.getMediaType(path); 283cf46a3abc26aac7cdb6b6993aeade053304b71d9Ray Chen Intent intent = new Intent(Intent.ACTION_SEND); 284cf46a3abc26aac7cdb6b6993aeade053304b71d9Ray Chen intent.setType(MenuExecutor.getMimeType(type)); 285cf46a3abc26aac7cdb6b6993aeade053304b71d9Ray Chen intent.putExtra(Intent.EXTRA_STREAM, manager.getContentUri(path)); 286cf46a3abc26aac7cdb6b6993aeade053304b71d9Ray Chen mShareActionProvider.setShareIntent(intent); 28733ef03776b7734717b16f6fc861b831fb1b1dfacMartijn Coenen if (mNfcAdapter != null) { 288a41ed05ff2f71d2177b4f24f53acd848b46fc840Martijn Coenen mNfcAdapter.setBeamPushUris(new Uri[]{manager.getContentUri(path)}, 289a41ed05ff2f71d2177b4f24f53acd848b46fc840Martijn Coenen (Activity)mActivity); 29033ef03776b7734717b16f6fc861b831fb1b1dfacMartijn Coenen } 291cf46a3abc26aac7cdb6b6993aeade053304b71d9Ray Chen mPendingSharePath = null; 292cf46a3abc26aac7cdb6b6993aeade053304b71d9Ray Chen } else { 293cf46a3abc26aac7cdb6b6993aeade053304b71d9Ray Chen // This happens when ActionBar is not created yet. 294cf46a3abc26aac7cdb6b6993aeade053304b71d9Ray Chen mPendingSharePath = path; 295cf46a3abc26aac7cdb6b6993aeade053304b71d9Ray Chen } 296cf46a3abc26aac7cdb6b6993aeade053304b71d9Ray Chen } 297cf46a3abc26aac7cdb6b6993aeade053304b71d9Ray Chen 298f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private void updateCurrentPhoto(MediaItem photo) { 299f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (mCurrentPhoto == photo) return; 300f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mCurrentPhoto = photo; 301f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (mCurrentPhoto == null) return; 302f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin updateMenuOperations(); 303736cf74b170d32374c8b35dbe6a46d975258be87Wu-cheng Li // Hide the action bar when going back to camera preview. 304bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang if (photo == mScreenNailItem) hideBars(); 305ed46d77c16cd80357f4a0feada2435dfba8104a6Yuli Huang updateTitle(); 306f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (mShowDetails) { 3074105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen mDetailsHelper.reloadDetails(mModel.getCurrentIndex()); 308f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 309cf46a3abc26aac7cdb6b6993aeade053304b71d9Ray Chen mPhotoView.showVideoPlayIcon( 310cf46a3abc26aac7cdb6b6993aeade053304b71d9Ray Chen photo.getMediaType() == MediaObject.MEDIA_TYPE_VIDEO); 311f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 31215b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang if ((photo.getSupportedOperations() & MediaItem.SUPPORT_SHARE) != 0) { 31315b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang updateShareURI(photo.getPath()); 31415b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang } 315f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 316f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 317ed46d77c16cd80357f4a0feada2435dfba8104a6Yuli Huang private void updateTitle() { 318ed46d77c16cd80357f4a0feada2435dfba8104a6Yuli Huang if (mCurrentPhoto == null) return; 319ed46d77c16cd80357f4a0feada2435dfba8104a6Yuli Huang boolean showTitle = mActivity.getAndroidContext().getResources().getBoolean( 320ed46d77c16cd80357f4a0feada2435dfba8104a6Yuli Huang R.bool.show_action_bar_title); 321ed46d77c16cd80357f4a0feada2435dfba8104a6Yuli Huang if (showTitle && mCurrentPhoto.getName() != null) 322ed46d77c16cd80357f4a0feada2435dfba8104a6Yuli Huang mActionBar.setTitle(mCurrentPhoto.getName()); 323ed46d77c16cd80357f4a0feada2435dfba8104a6Yuli Huang else 324ed46d77c16cd80357f4a0feada2435dfba8104a6Yuli Huang mActionBar.setTitle(""); 325ed46d77c16cd80357f4a0feada2435dfba8104a6Yuli Huang } 326ed46d77c16cd80357f4a0feada2435dfba8104a6Yuli Huang 327f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private void updateMenuOperations() { 3282066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang if (mMenu == null) return; 3292066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang MenuItem item = mMenu.findItem(R.id.action_slideshow); 3302066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang if (item != null) { 3312066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang item.setVisible(canDoSlideShow()); 3322066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang } 3332066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang if (mCurrentPhoto == null) return; 334f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin int supportedOperations = mCurrentPhoto.getSupportedOperations(); 335f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (!GalleryUtils.isEditorAvailable((Context) mActivity, "image/*")) { 336f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin supportedOperations &= ~MediaObject.SUPPORT_EDIT; 337f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 338604f053d040782159b61d3b74ee533bc2c0ccdd0Ray Chen 339f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin MenuExecutor.updateMenuOperation(mMenu, supportedOperations); 340f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 341f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 3422066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang private boolean canDoSlideShow() { 3432066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang if (mMediaSet == null || mCurrentPhoto == null) { 3442066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang return false; 3452066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang } 3462066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang if (mCurrentPhoto.getMediaType() != MediaObject.MEDIA_TYPE_IMAGE) { 3472066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang return false; 3482066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang } 3492066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang if (mMediaSet instanceof MtpDevice) { 3502066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang return false; 3512066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang } 3522066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang return true; 3532066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang } 3542066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang 355f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private void showBars() { 356f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (mShowBars) return; 357f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mShowBars = true; 358f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mActionBar.show(); 359f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin WindowManager.LayoutParams params = ((Activity) mActivity).getWindow().getAttributes(); 360f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin params.systemUiVisibility = View.SYSTEM_UI_FLAG_VISIBLE; 361f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin ((Activity) mActivity).getWindow().setAttributes(params); 362f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 363f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 364f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private void hideBars() { 365f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (!mShowBars) return; 366f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mShowBars = false; 367f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mActionBar.hide(); 368f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin WindowManager.LayoutParams params = ((Activity) mActivity).getWindow().getAttributes(); 369f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin params.systemUiVisibility = View. SYSTEM_UI_FLAG_LOW_PROFILE; 370f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin ((Activity) mActivity).getWindow().setAttributes(params); 371f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 372f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 373f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private void refreshHidingMessage() { 374f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mHandler.removeMessages(MSG_HIDE_BARS); 375f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (!mIsMenuVisible && !mIsInteracting) { 376f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mHandler.sendEmptyMessageDelayed(MSG_HIDE_BARS, HIDE_BARS_TIMEOUT); 377f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 378f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 379f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 3808bc5bebba780ca4a322b466b06fc909331697cf4Owen Lin @Override 381f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void onUserInteraction() { 382f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin showBars(); 383f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin refreshHidingMessage(); 384f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 385f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 386f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void onUserInteractionTap() { 387f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (mShowBars) { 388f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin hideBars(); 389f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mHandler.removeMessages(MSG_HIDE_BARS); 390f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } else { 391f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin showBars(); 392f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin refreshHidingMessage(); 393f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 394f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 395f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 3968bc5bebba780ca4a322b466b06fc909331697cf4Owen Lin @Override 397f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void onUserInteractionBegin() { 398f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin showBars(); 399f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mIsInteracting = true; 400f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin refreshHidingMessage(); 401f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 402f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 4038bc5bebba780ca4a322b466b06fc909331697cf4Owen Lin @Override 404f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void onUserInteractionEnd() { 405f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mIsInteracting = false; 4068bc5bebba780ca4a322b466b06fc909331697cf4Owen Lin 4078bc5bebba780ca4a322b466b06fc909331697cf4Owen Lin // This function could be called from GL thread (in SlotView.render) 4088bc5bebba780ca4a322b466b06fc909331697cf4Owen Lin // and post to the main thread. So, it could be executed while the 4098bc5bebba780ca4a322b466b06fc909331697cf4Owen Lin // activity is paused. 4108bc5bebba780ca4a322b466b06fc909331697cf4Owen Lin if (mIsActive) refreshHidingMessage(); 411f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 412f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 413f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 414bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang public void onOrientationCompensationChanged(int degrees) { 415bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang mActivity.getGLRoot().setOrientationCompensation(degrees); 416bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang } 417bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang 418bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang @Override 419f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin protected void onBackPressed() { 420f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (mShowDetails) { 421f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin hideDetails(); 422160e6d776daab93610b3d12413ad9ff2dd867d8bChih-Chung Chang } else if (mScreenNail == null 423160e6d776daab93610b3d12413ad9ff2dd867d8bChih-Chung Chang || !switchWithCaptureAnimation(-1)) { 424bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang // We are leaving this page. Set the result now. 425bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang setResult(); 426f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin super.onBackPressed(); 427f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 428f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 429f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 430bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang private void setResult() { 431bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang Intent result = null; 432bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang if (!mPhotoView.getFilmMode()) { 433bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang result = new Intent(); 434bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang result.putExtra(KEY_RETURN_INDEX_HINT, mCurrentIndex); 435bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang } 436bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang setStateResult(Activity.RESULT_OK, result); 437bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang } 438bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang 439bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang ////////////////////////////////////////////////////////////////////////// 440bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang // AppBridge.Server interface 441bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang ////////////////////////////////////////////////////////////////////////// 442bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang 443bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang @Override 444bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang public void setCameraNaturalFrame(Rect frame) { 445bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang mPhotoView.setCameraNaturalFrame(frame); 446bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang } 447bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang 448bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang @Override 4492c6173822a612597c79be41b126367ddfbb5d518Chih-Chung Chang public boolean switchWithCaptureAnimation(int offset) { 4502c6173822a612597c79be41b126367ddfbb5d518Chih-Chung Chang return mPhotoView.switchWithCaptureAnimation(offset); 4512c6173822a612597c79be41b126367ddfbb5d518Chih-Chung Chang } 4522c6173822a612597c79be41b126367ddfbb5d518Chih-Chung Chang 453f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 454f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin protected boolean onCreateActionBar(Menu menu) { 455f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin MenuInflater inflater = ((Activity) mActivity).getMenuInflater(); 456f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin inflater.inflate(R.menu.photo, menu); 457f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mShareActionProvider = GalleryActionBar.initializeShareActionProvider(menu); 458cf46a3abc26aac7cdb6b6993aeade053304b71d9Ray Chen if (mPendingSharePath != null) updateShareURI(mPendingSharePath); 459f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mMenu = menu; 460f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mShowBars = true; 461f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin updateMenuOperations(); 462ed46d77c16cd80357f4a0feada2435dfba8104a6Yuli Huang updateTitle(); 463f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return true; 464f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 465f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 466f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 467f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin protected boolean onItemSelected(MenuItem item) { 468f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin MediaItem current = mModel.getCurrentMediaItem(); 469f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 470f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (current == null) { 471f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin // item is not ready, ignore 472f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return true; 473f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 474f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 475f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin int currentIndex = mModel.getCurrentIndex(); 476f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin Path path = current.getPath(); 477f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 478f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin DataManager manager = mActivity.getDataManager(); 479f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin int action = item.getItemId(); 48067098d1a72fd04e2af06d3a5939cde28c65f70d9Ray Chen boolean needsConfirm = false; 481f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin switch (action) { 48284c220f10a643927c8a2126de8a755d8d7f7ec9eRay Chen case android.R.id.home: { 48384c220f10a643927c8a2126de8a755d8d7f7ec9eRay Chen if (mSetPathString != null) { 48484c220f10a643927c8a2126de8a755d8d7f7ec9eRay Chen if (mActivity.getStateManager().getStateCount() > 1) { 48584c220f10a643927c8a2126de8a755d8d7f7ec9eRay Chen onBackPressed(); 48684c220f10a643927c8a2126de8a755d8d7f7ec9eRay Chen } else { 48798c2490a424da79beefbdd8a29fb90ab006c77b0Ray Chen // We're in view mode so set up the stacks on our own. 48898c2490a424da79beefbdd8a29fb90ab006c77b0Ray Chen Bundle data = new Bundle(getData()); 48998c2490a424da79beefbdd8a29fb90ab006c77b0Ray Chen data.putString(AlbumPage.KEY_MEDIA_PATH, mSetPathString); 49098c2490a424da79beefbdd8a29fb90ab006c77b0Ray Chen data.putString(AlbumPage.KEY_PARENT_MEDIA_PATH, 49198c2490a424da79beefbdd8a29fb90ab006c77b0Ray Chen mActivity.getDataManager().getTopSetPath( 49298c2490a424da79beefbdd8a29fb90ab006c77b0Ray Chen DataManager.INCLUDE_ALL)); 49398c2490a424da79beefbdd8a29fb90ab006c77b0Ray Chen mActivity.getStateManager().switchState(this, AlbumPage.class, data); 49484c220f10a643927c8a2126de8a755d8d7f7ec9eRay Chen } 49584c220f10a643927c8a2126de8a755d8d7f7ec9eRay Chen } 49684c220f10a643927c8a2126de8a755d8d7f7ec9eRay Chen return true; 49784c220f10a643927c8a2126de8a755d8d7f7ec9eRay Chen } 498f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin case R.id.action_slideshow: { 499f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin Bundle data = new Bundle(); 5006cf807453fb58ccd4cc513ff187b306c7090e67cOwen Lin data.putString(SlideshowPage.KEY_SET_PATH, mMediaSet.getPath().toString()); 501604f053d040782159b61d3b74ee533bc2c0ccdd0Ray Chen data.putString(SlideshowPage.KEY_ITEM_PATH, path.toString()); 502f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin data.putInt(SlideshowPage.KEY_PHOTO_INDEX, currentIndex); 503f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin data.putBoolean(SlideshowPage.KEY_REPEAT, true); 504f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mActivity.getStateManager().startStateForResult( 505f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin SlideshowPage.class, REQUEST_SLIDESHOW, data); 506f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return true; 507f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 508f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin case R.id.action_crop: { 509f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin Activity activity = (Activity) mActivity; 510f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin Intent intent = new Intent(CropImage.CROP_ACTION); 511f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin intent.setClass(activity, CropImage.class); 512f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin intent.setData(manager.getContentUri(path)); 513f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin activity.startActivityForResult(intent, PicasaSource.isPicasaImage(current) 514f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin ? REQUEST_CROP_PICASA 515f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin : REQUEST_CROP); 516f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return true; 517f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 518f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin case R.id.action_details: { 519f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (mShowDetails) { 520f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin hideDetails(); 521f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } else { 522f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin showDetails(currentIndex); 523f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 524f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return true; 525f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 52667098d1a72fd04e2af06d3a5939cde28c65f70d9Ray Chen case R.id.action_delete: 52767098d1a72fd04e2af06d3a5939cde28c65f70d9Ray Chen needsConfirm = true; 528f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin case R.id.action_setas: 529f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin case R.id.action_rotate_ccw: 530f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin case R.id.action_rotate_cw: 531f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin case R.id.action_show_on_map: 532f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin case R.id.action_edit: 533f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mSelectionManager.deSelectAll(); 534f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mSelectionManager.toggle(path); 53567098d1a72fd04e2af06d3a5939cde28c65f70d9Ray Chen mMenuExecutor.onMenuClicked(item, needsConfirm, null); 536f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return true; 537f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin case R.id.action_import: 538f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mSelectionManager.deSelectAll(); 539f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mSelectionManager.toggle(path); 54067098d1a72fd04e2af06d3a5939cde28c65f70d9Ray Chen mMenuExecutor.onMenuClicked(item, needsConfirm, 541f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin new ImportCompleteListener(mActivity)); 542f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return true; 543f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin default : 544f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return false; 545f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 546f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 547f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 548f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private void hideDetails() { 549f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mShowDetails = false; 5504105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen mDetailsHelper.hide(); 551f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 552f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 553f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private void showDetails(int index) { 554f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mShowDetails = true; 5554105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen if (mDetailsHelper == null) { 5564105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen mDetailsHelper = new DetailsHelper(mActivity, mRootPane, new MyDetailsSource()); 5574105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen mDetailsHelper.setCloseListener(new CloseListener() { 558f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void onClose() { 559f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin hideDetails(); 560f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 561f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin }); 562f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 5634105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen mDetailsHelper.reloadDetails(index); 5644105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen mDetailsHelper.show(); 565f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 566f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 567bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang //////////////////////////////////////////////////////////////////////////// 568bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang // Callbacks from PhotoView 569bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang //////////////////////////////////////////////////////////////////////////// 570bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang @Override 571f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void onSingleTapUp(int x, int y) { 572bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang if (mAppBridge != null) { 573bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang if (mAppBridge.onSingleTapUp(x, y)) return; 574014d9586d8145a33f4e99eaad570587f6d650026Wu-cheng Li } 575014d9586d8145a33f4e99eaad570587f6d650026Wu-cheng Li 576f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin MediaItem item = mModel.getCurrentMediaItem(); 577f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (item == null) { 578f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin // item is not ready, ignore 579f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return; 580f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 581f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 582f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin boolean playVideo = 583f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin (item.getSupportedOperations() & MediaItem.SUPPORT_PLAY) != 0; 584f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 585f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (playVideo) { 586f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin // determine if the point is at center (1/6) of the photo view. 587f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin // (The position of the "play" icon is at center (1/6) of the photo) 588f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin int w = mPhotoView.getWidth(); 589f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin int h = mPhotoView.getHeight(); 590f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin playVideo = (Math.abs(x - w / 2) * 12 <= w) 591f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin && (Math.abs(y - h / 2) * 12 <= h); 592f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 593f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 594f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (playVideo) { 595f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin playVideo((Activity) mActivity, item.getPlayUri(), item.getName()); 596f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } else { 597f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin onUserInteractionTap(); 598f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 599f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 600f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 601bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang @Override 602bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang public void lockOrientation() { 603bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang mHandler.sendEmptyMessage(MSG_LOCK_ORIENTATION); 604bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang } 605bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang 606bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang @Override 607bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang public void unlockOrientation() { 608bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang // Temporarily disabled until Camera UI can switch orientation. 609bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang // mHandler.sendEmptyMessage(MSG_UNLOCK_ORIENTATION); 610bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang } 611bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang 612bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang @Override 613bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang public void onFullScreenChanged(boolean full) { 614bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang Message m = mHandler.obtainMessage( 615bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang MSG_ON_FULL_SCREEN_CHANGED, full ? 1 : 0, 0); 616bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang m.sendToTarget(); 617bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang } 618bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang 619f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public static void playVideo(Activity activity, Uri uri, String title) { 620f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin try { 621f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin Intent intent = new Intent(Intent.ACTION_VIEW) 622f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin .setDataAndType(uri, "video/*"); 623f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin intent.putExtra(Intent.EXTRA_TITLE, title); 624f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin activity.startActivity(intent); 625f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } catch (ActivityNotFoundException e) { 626f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin Toast.makeText(activity, activity.getString(R.string.video_err), 627f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin Toast.LENGTH_SHORT).show(); 628f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 629f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 630f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 631f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 632f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin protected void onStateResult(int requestCode, int resultCode, Intent data) { 633f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin switch (requestCode) { 634f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin case REQUEST_CROP: 635f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (resultCode == Activity.RESULT_OK) { 636f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (data == null) break; 63721a412c93c9b0401b039f4eb86d4950752e5bb84Owen Lin Path path = mApplication.getDataManager() 63821a412c93c9b0401b039f4eb86d4950752e5bb84Owen Lin .findPathByUri(data.getData(), data.getType()); 639f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (path != null) { 640f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mModel.setCurrentPhoto(path, mCurrentIndex); 641f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 642f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 643f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin break; 644f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin case REQUEST_CROP_PICASA: { 645985e289d4ceed04351c300484d28299dcf915896Yuli Huang Context context = mActivity.getAndroidContext(); 646985e289d4ceed04351c300484d28299dcf915896Yuli Huang // TODO: Use crop_saved instead of photo_saved after its new translation is done. 647985e289d4ceed04351c300484d28299dcf915896Yuli Huang String message = resultCode == Activity.RESULT_OK ? context.getString( 648985e289d4ceed04351c300484d28299dcf915896Yuli Huang R.string.photo_saved, context.getString(R.string.folder_download)) 649985e289d4ceed04351c300484d28299dcf915896Yuli Huang : context.getString(R.string.crop_not_saved); 650985e289d4ceed04351c300484d28299dcf915896Yuli Huang Toast.makeText(context, message, Toast.LENGTH_SHORT).show(); 651f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin break; 652f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 653f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin case REQUEST_SLIDESHOW: { 654f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (data == null) break; 655f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin String path = data.getStringExtra(SlideshowPage.KEY_ITEM_PATH); 656f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin int index = data.getIntExtra(SlideshowPage.KEY_PHOTO_INDEX, 0); 657f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (path != null) { 658f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mModel.setCurrentPhoto(Path.fromString(path), index); 659f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 660f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 661f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 662f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 663f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 664f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 665f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void onPause() { 666f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin super.onPause(); 667f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mIsActive = false; 668bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang if (mAppBridge != null) mAppBridge.setServer(null); 6694105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen DetailsHelper.pause(); 670f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mPhotoView.pause(); 671f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mModel.pause(); 672f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mHandler.removeMessages(MSG_HIDE_BARS); 673f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mActionBar.removeOnMenuVisibilityListener(mMenuVisibilityListener); 67433ef03776b7734717b16f6fc861b831fb1b1dfacMartijn Coenen 6752785956f8f5654966a41e20f482f4af3057eea3fChih-Chung Chang mMenuExecutor.pause(); 676f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 677f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 678f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 679f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin protected void onResume() { 680f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin super.onResume(); 681f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mIsActive = true; 682f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin setContentPane(mRootPane); 68304ac045bf8da5082bbb0bdc9ea5f9c9b5b796ad0Yuli Huang 684f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mModel.resume(); 685f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mPhotoView.resume(); 686f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (mMenuVisibilityListener == null) { 687f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mMenuVisibilityListener = new MyMenuVisibilityListener(); 688f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 6898cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen mActionBar.setDisplayOptions(mSetPathString != null, true); 690f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mActionBar.addOnMenuVisibilityListener(mMenuVisibilityListener); 69133ef03776b7734717b16f6fc861b831fb1b1dfacMartijn Coenen 692f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin onUserInteraction(); 693bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang if (mAppBridge != null) { 694bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang mAppBridge.setServer(this); 695bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang mModel.moveTo(0); // move to the camera preview after resume 696bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang } 697f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 698f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 69915b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang @Override 70015b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang protected void onDestroy() { 701bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang if (mAppBridge != null) { 702bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang // Unregister the ScreenNail and notify mAppBridge. 703b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang SnailSource.unregisterScreenNail(mScreenNail); 704bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang mAppBridge.detachScreenNail(); 705bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang mAppBridge = null; 706b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang mScreenNail = null; 707b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang } 708bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang mOrientationManager.removeListener(this); 70915b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang super.onDestroy(); 71015b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang } 71115b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang 712f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private class MyDetailsSource implements DetailsSource { 7134105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen private int mIndex; 7146cf807453fb58ccd4cc513ff187b306c7090e67cOwen Lin 7156cf807453fb58ccd4cc513ff187b306c7090e67cOwen Lin @Override 716f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public MediaDetails getDetails() { 717f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return mModel.getCurrentMediaItem().getDetails(); 718f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 7196cf807453fb58ccd4cc513ff187b306c7090e67cOwen Lin 7206cf807453fb58ccd4cc513ff187b306c7090e67cOwen Lin @Override 721f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public int size() { 722f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return mMediaSet != null ? mMediaSet.getMediaItemCount() : 1; 723f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 7246cf807453fb58ccd4cc513ff187b306c7090e67cOwen Lin 7256cf807453fb58ccd4cc513ff187b306c7090e67cOwen Lin @Override 726f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public int findIndex(int indexHint) { 7274105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen mIndex = indexHint; 728f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return indexHint; 729f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 7304105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen 7316cf807453fb58ccd4cc513ff187b306c7090e67cOwen Lin @Override 7324105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen public int getIndex() { 7334105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen return mIndex; 7344105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen } 735f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 736f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin} 737