PhotoPage.java revision bd7c016d728853d38f98a3c6077b7bd9b08858b9
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; 2266ca848b2f58b813d366642088d274a1b7c4a90cChih-Chung Changimport android.content.ContentResolver; 23604f053d040782159b61d3b74ee533bc2c0ccdd0Ray Chenimport android.content.Context; 24604f053d040782159b61d3b74ee533bc2c0ccdd0Ray Chenimport android.content.Intent; 2504ac045bf8da5082bbb0bdc9ea5f9c9b5b796ad0Yuli Huangimport android.graphics.Rect; 26604f053d040782159b61d3b74ee533bc2c0ccdd0Ray Chenimport android.net.Uri; 2733ef03776b7734717b16f6fc861b831fb1b1dfacMartijn Coenenimport android.nfc.NfcAdapter; 28604f053d040782159b61d3b74ee533bc2c0ccdd0Ray Chenimport android.os.Bundle; 29604f053d040782159b61d3b74ee533bc2c0ccdd0Ray Chenimport android.os.Handler; 30604f053d040782159b61d3b74ee533bc2c0ccdd0Ray Chenimport android.os.Message; 31604f053d040782159b61d3b74ee533bc2c0ccdd0Ray Chenimport android.view.Menu; 32604f053d040782159b61d3b74ee533bc2c0ccdd0Ray Chenimport android.view.MenuInflater; 33604f053d040782159b61d3b74ee533bc2c0ccdd0Ray Chenimport android.view.MenuItem; 34604f053d040782159b61d3b74ee533bc2c0ccdd0Ray Chenimport android.view.View; 358bc5bebba780ca4a322b466b06fc909331697cf4Owen Linimport android.view.WindowManager; 36604f053d040782159b61d3b74ee533bc2c0ccdd0Ray Chenimport android.widget.ShareActionProvider; 37604f053d040782159b61d3b74ee533bc2c0ccdd0Ray Chenimport android.widget.Toast; 38604f053d040782159b61d3b74ee533bc2c0ccdd0Ray Chen 39f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.R; 40f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.data.DataManager; 41f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.data.MediaDetails; 42f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.data.MediaItem; 43f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.data.MediaObject; 44f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.data.MediaSet; 45f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.data.MtpDevice; 46f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.data.Path; 473b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Changimport com.android.gallery3d.data.SnailAlbum; 483b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Changimport com.android.gallery3d.data.SnailItem; 4915b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Changimport com.android.gallery3d.data.SnailSource; 50f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.picasasource.PicasaSource; 514105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chenimport com.android.gallery3d.ui.DetailsHelper; 524105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chenimport com.android.gallery3d.ui.DetailsHelper.CloseListener; 534105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chenimport com.android.gallery3d.ui.DetailsHelper.DetailsSource; 54f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.ui.GLCanvas; 55f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.ui.GLView; 56f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.ui.ImportCompleteListener; 57f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.ui.MenuExecutor; 5821a412c93c9b0401b039f4eb86d4950752e5bb84Owen Linimport com.android.gallery3d.ui.PhotoView; 59b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Changimport com.android.gallery3d.ui.ScreenNail; 60f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.ui.SelectionManager; 61f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.ui.SynchronizedHandler; 62f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.util.GalleryUtils; 6366ca848b2f58b813d366642088d274a1b7c4a90cChih-Chung Changimport com.android.gallery3d.util.MediaSetUtils; 64f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 65bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Changpublic class PhotoPage extends ActivityState implements 6661f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang PhotoView.Listener, OrientationManager.Listener, AppBridge.Server { 67f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private static final String TAG = "PhotoPage"; 68f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 69f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private static final int MSG_HIDE_BARS = 1; 70bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang private static final int MSG_LOCK_ORIENTATION = 2; 71bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang private static final int MSG_UNLOCK_ORIENTATION = 3; 72bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang private static final int MSG_ON_FULL_SCREEN_CHANGED = 4; 7361f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang private static final int MSG_UPDATE_ACTION_BAR = 5; 74bd7c016d728853d38f98a3c6077b7bd9b08858b9Yuli Huang private static final int MSG_UNFREEZE_GLROOT = 6; 756cf807453fb58ccd4cc513ff187b306c7090e67cOwen Lin 76f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private static final int HIDE_BARS_TIMEOUT = 3500; 77bd7c016d728853d38f98a3c6077b7bd9b08858b9Yuli Huang private static final int UNFREEZE_GLROOT_TIMEOUT = 250; 78f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 79f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private static final int REQUEST_SLIDESHOW = 1; 80f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private static final int REQUEST_CROP = 2; 81f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private static final int REQUEST_CROP_PICASA = 3; 82f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang private static final int REQUEST_EDIT = 4; 83f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 84f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public static final String KEY_MEDIA_SET_PATH = "media-set-path"; 85f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public static final String KEY_MEDIA_ITEM_PATH = "media-item-path"; 86f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public static final String KEY_INDEX_HINT = "index-hint"; 8704ac045bf8da5082bbb0bdc9ea5f9c9b5b796ad0Yuli Huang public static final String KEY_OPEN_ANIMATION_RECT = "open-animation-rect"; 88bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang public static final String KEY_APP_BRIDGE = "app-bridge"; 89bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang 90bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang public static final String KEY_RETURN_INDEX_HINT = "return-index-hint"; 91f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 92f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private GalleryApp mApplication; 93f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private SelectionManager mSelectionManager; 94f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 95f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private PhotoView mPhotoView; 96f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private PhotoPage.Model mModel; 974105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen private DetailsHelper mDetailsHelper; 98f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private boolean mShowDetails; 99cf46a3abc26aac7cdb6b6993aeade053304b71d9Ray Chen private Path mPendingSharePath; 100f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 101f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin // mMediaSet could be null if there is no KEY_MEDIA_SET_PATH supplied. 102f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin // E.g., viewing a photo in gmail attachment 103f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private MediaSet mMediaSet; 104f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private Menu mMenu; 105f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 106f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private int mCurrentIndex = 0; 107f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private Handler mHandler; 108113bfc77c4468411da9ae1290553c3be89f8df9aOwen Lin private boolean mShowBars = true; 109aeb3062e84ed28f0e25a73f511f287ae0a3e4294Chih-Chung Chang // The value of canShowBars() last time the bar updates state. 110aeb3062e84ed28f0e25a73f511f287ae0a3e4294Chih-Chung Chang private boolean mCanShowBars = false; 11161f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang private volatile boolean mActionBarAllowed = true; 1128cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen private GalleryActionBar mActionBar; 113f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private MyMenuVisibilityListener mMenuVisibilityListener; 114f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private boolean mIsMenuVisible; 115f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private MediaItem mCurrentPhoto = null; 116f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private MenuExecutor mMenuExecutor; 117f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private boolean mIsActive; 118f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private ShareActionProvider mShareActionProvider; 11984c220f10a643927c8a2126de8a755d8d7f7ec9eRay Chen private String mSetPathString; 120b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang // This is the original mSetPathString before adding the camera preview item. 121b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang private String mOriginalSetPathString; 122bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang private AppBridge mAppBridge; 1233b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang private SnailItem mScreenNailItem; 1243b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang private SnailAlbum mScreenNailSet; 125bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang private OrientationManager mOrientationManager; 12615b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang 12733ef03776b7734717b16f6fc861b831fb1b1dfacMartijn Coenen private NfcAdapter mNfcAdapter; 12833ef03776b7734717b16f6fc861b831fb1b1dfacMartijn Coenen 129f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public static interface Model extends PhotoView.Model { 130f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void resume(); 131f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void pause(); 132f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public boolean isEmpty(); 133f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public MediaItem getCurrentMediaItem(); 134f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void setCurrentPhoto(Path path, int indexHint); 135f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 136f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 137f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private class MyMenuVisibilityListener implements OnMenuVisibilityListener { 13806c6401eededc2ec842ba4994a838c2ded0a666cPin Ting @Override 139f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void onMenuVisibilityChanged(boolean isVisible) { 140f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mIsMenuVisible = isVisible; 141f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin refreshHidingMessage(); 142f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 143f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 144f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 145604f053d040782159b61d3b74ee533bc2c0ccdd0Ray Chen private final GLView mRootPane = new GLView() { 146f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 147f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 148f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin protected void renderBackground(GLCanvas view) { 149f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin view.clearBuffer(); 150f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 151f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 152f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 153f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin protected void onLayout( 154f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin boolean changed, int left, int top, int right, int bottom) { 155f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mPhotoView.layout(0, 0, right - left, bottom - top); 156f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (mShowDetails) { 1578cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen mDetailsHelper.layout(left, mActionBar.getHeight(), right, bottom); 158f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 159f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 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); 1742ef46ed28b28b355d7f3f1432c7b1196b832a859Chih-Chung Chang mActivity.getGLRoot().setOrientationSource(mOrientationManager); 175f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 17684c220f10a643927c8a2126de8a755d8d7f7ec9eRay Chen mSetPathString = data.getString(KEY_MEDIA_SET_PATH); 177b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang mOriginalSetPathString = mSetPathString; 17833ef03776b7734717b16f6fc861b831fb1b1dfacMartijn Coenen mNfcAdapter = NfcAdapter.getDefaultAdapter(mActivity.getAndroidContext()); 179f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin Path itemPath = Path.fromString(data.getString(KEY_MEDIA_ITEM_PATH)); 180f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 18184c220f10a643927c8a2126de8a755d8d7f7ec9eRay Chen if (mSetPathString != null) { 182bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang mAppBridge = (AppBridge) data.getParcelable(KEY_APP_BRIDGE); 183bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang if (mAppBridge != null) { 184bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang mOrientationManager.lockOrientation(); 185b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang 186bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang // Get the ScreenNail from AppBridge and register it. 1873b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang int id = SnailSource.newId(); 188b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang Path screenNailSetPath = SnailSource.getSetPath(id); 189bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang Path screenNailItemPath = SnailSource.getItemPath(id); 1903b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang mScreenNailSet = (SnailAlbum) mActivity.getDataManager() 1913b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang .getMediaObject(screenNailSetPath); 1923b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang mScreenNailItem = (SnailItem) mActivity.getDataManager() 193bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang .getMediaObject(screenNailItemPath); 1943b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang mScreenNailItem.setScreenNail(mAppBridge.attachScreenNail()); 195b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang 1963b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang // Combine the original MediaSet with the one for ScreenNail 1973b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang // from AppBridge. 198b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang mSetPathString = "/combo/item/{" + screenNailSetPath + 199b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang "," + mSetPathString + "}"; 200b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang 201b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang // Start from the screen nail. 202bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang itemPath = screenNailItemPath; 203788245711658188131ae2670e44fb6ca8ad5d53aWu-cheng Li 204788245711658188131ae2670e44fb6ca8ad5d53aWu-cheng Li // Action bar should not be displayed when camera starts. 205788245711658188131ae2670e44fb6ca8ad5d53aWu-cheng Li mFlags |= FLAG_HIDE_ACTION_BAR; 20661f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang mShowBars = false; 207b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang } 208b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang 20984c220f10a643927c8a2126de8a755d8d7f7ec9eRay Chen mMediaSet = mActivity.getDataManager().getMediaSet(mSetPathString); 210f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mCurrentIndex = data.getInt(KEY_INDEX_HINT, 0); 211f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (mMediaSet == null) { 21284c220f10a643927c8a2126de8a755d8d7f7ec9eRay Chen Log.w(TAG, "failed to restore " + mSetPathString); 213f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 214f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin PhotoDataAdapter pda = new PhotoDataAdapter( 215bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang mActivity, mPhotoView, mMediaSet, itemPath, mCurrentIndex, 216bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang mAppBridge == null ? -1 : 0); 217f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mModel = pda; 218f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mPhotoView.setModel(mModel); 219f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 220f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin pda.setDataListener(new PhotoDataAdapter.DataListener() { 221f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 222113bfc77c4468411da9ae1290553c3be89f8df9aOwen Lin @Override 223f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void onPhotoChanged(int index, Path item) { 224f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mCurrentIndex = index; 225f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (item != null) { 226f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin MediaItem photo = mModel.getCurrentMediaItem(); 227f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (photo != null) updateCurrentPhoto(photo); 228f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 22961f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang updateBars(); 230f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 231f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 232f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 233f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void onLoadingFinished() { 234f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (!mModel.isEmpty()) { 235f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin MediaItem photo = mModel.getCurrentMediaItem(); 236f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (photo != null) updateCurrentPhoto(photo); 237f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } else if (mIsActive) { 238f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mActivity.getStateManager().finishState(PhotoPage.this); 239f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 240f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 241f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 242f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 243f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void onLoadingStarted() { 244f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 245f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin }); 246f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } else { 247f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin // Get default media set by the URI 248f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin MediaItem mediaItem = (MediaItem) 249f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mActivity.getDataManager().getMediaObject(itemPath); 250f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mModel = new SinglePhotoDataAdapter(mActivity, mPhotoView, mediaItem); 251f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mPhotoView.setModel(mModel); 252f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin updateCurrentPhoto(mediaItem); 253f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 254cf46a3abc26aac7cdb6b6993aeade053304b71d9Ray Chen 255f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mHandler = new SynchronizedHandler(mActivity.getGLRoot()) { 256f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 257f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void handleMessage(Message message) { 258f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin switch (message.what) { 259f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin case MSG_HIDE_BARS: { 260f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin hideBars(); 261f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin break; 262f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 263bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang case MSG_LOCK_ORIENTATION: { 264bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang mOrientationManager.lockOrientation(); 265aeb3062e84ed28f0e25a73f511f287ae0a3e4294Chih-Chung Chang updateBars(); 266bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang break; 267bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang } 268bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang case MSG_UNLOCK_ORIENTATION: { 269bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang mOrientationManager.unlockOrientation(); 270aeb3062e84ed28f0e25a73f511f287ae0a3e4294Chih-Chung Chang updateBars(); 271bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang break; 272bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang } 273bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang case MSG_ON_FULL_SCREEN_CHANGED: { 274bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang mAppBridge.onFullScreenChanged(message.arg1 == 1); 275bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang break; 276bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang } 27761f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang case MSG_UPDATE_ACTION_BAR: { 27861f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang updateBars(); 27961f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang break; 28061f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang } 281bd7c016d728853d38f98a3c6077b7bd9b08858b9Yuli Huang case MSG_UNFREEZE_GLROOT: { 282bd7c016d728853d38f98a3c6077b7bd9b08858b9Yuli Huang mActivity.getGLRoot().unfreeze(); 283bd7c016d728853d38f98a3c6077b7bd9b08858b9Yuli Huang break; 284bd7c016d728853d38f98a3c6077b7bd9b08858b9Yuli Huang } 285f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin default: throw new AssertionError(message.what); 286f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 287f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 288f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin }; 289f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 29004ac045bf8da5082bbb0bdc9ea5f9c9b5b796ad0Yuli Huang // start the opening animation only if it's not restored. 29104ac045bf8da5082bbb0bdc9ea5f9c9b5b796ad0Yuli Huang if (restoreState == null) { 29204ac045bf8da5082bbb0bdc9ea5f9c9b5b796ad0Yuli Huang mPhotoView.setOpenAnimationRect((Rect) data.getParcelable(KEY_OPEN_ANIMATION_RECT)); 29304ac045bf8da5082bbb0bdc9ea5f9c9b5b796ad0Yuli Huang } 294f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 295f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 296cf46a3abc26aac7cdb6b6993aeade053304b71d9Ray Chen private void updateShareURI(Path path) { 297cf46a3abc26aac7cdb6b6993aeade053304b71d9Ray Chen if (mShareActionProvider != null) { 298cf46a3abc26aac7cdb6b6993aeade053304b71d9Ray Chen DataManager manager = mActivity.getDataManager(); 299cf46a3abc26aac7cdb6b6993aeade053304b71d9Ray Chen int type = manager.getMediaType(path); 300cf46a3abc26aac7cdb6b6993aeade053304b71d9Ray Chen Intent intent = new Intent(Intent.ACTION_SEND); 301cf46a3abc26aac7cdb6b6993aeade053304b71d9Ray Chen intent.setType(MenuExecutor.getMimeType(type)); 302cf46a3abc26aac7cdb6b6993aeade053304b71d9Ray Chen intent.putExtra(Intent.EXTRA_STREAM, manager.getContentUri(path)); 303cf46a3abc26aac7cdb6b6993aeade053304b71d9Ray Chen mShareActionProvider.setShareIntent(intent); 30433ef03776b7734717b16f6fc861b831fb1b1dfacMartijn Coenen if (mNfcAdapter != null) { 305a41ed05ff2f71d2177b4f24f53acd848b46fc840Martijn Coenen mNfcAdapter.setBeamPushUris(new Uri[]{manager.getContentUri(path)}, 306a41ed05ff2f71d2177b4f24f53acd848b46fc840Martijn Coenen (Activity)mActivity); 30733ef03776b7734717b16f6fc861b831fb1b1dfacMartijn Coenen } 308cf46a3abc26aac7cdb6b6993aeade053304b71d9Ray Chen mPendingSharePath = null; 309cf46a3abc26aac7cdb6b6993aeade053304b71d9Ray Chen } else { 310cf46a3abc26aac7cdb6b6993aeade053304b71d9Ray Chen // This happens when ActionBar is not created yet. 311cf46a3abc26aac7cdb6b6993aeade053304b71d9Ray Chen mPendingSharePath = path; 312cf46a3abc26aac7cdb6b6993aeade053304b71d9Ray Chen } 313cf46a3abc26aac7cdb6b6993aeade053304b71d9Ray Chen } 314cf46a3abc26aac7cdb6b6993aeade053304b71d9Ray Chen 315f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private void updateCurrentPhoto(MediaItem photo) { 316f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (mCurrentPhoto == photo) return; 317f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mCurrentPhoto = photo; 318f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (mCurrentPhoto == null) return; 319f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin updateMenuOperations(); 320ed46d77c16cd80357f4a0feada2435dfba8104a6Yuli Huang updateTitle(); 321f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (mShowDetails) { 3224105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen mDetailsHelper.reloadDetails(mModel.getCurrentIndex()); 323f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 32415b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang if ((photo.getSupportedOperations() & MediaItem.SUPPORT_SHARE) != 0) { 32515b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang updateShareURI(photo.getPath()); 32615b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang } 327f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 328f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 329ed46d77c16cd80357f4a0feada2435dfba8104a6Yuli Huang private void updateTitle() { 330ed46d77c16cd80357f4a0feada2435dfba8104a6Yuli Huang if (mCurrentPhoto == null) return; 331ed46d77c16cd80357f4a0feada2435dfba8104a6Yuli Huang boolean showTitle = mActivity.getAndroidContext().getResources().getBoolean( 332ed46d77c16cd80357f4a0feada2435dfba8104a6Yuli Huang R.bool.show_action_bar_title); 333ed46d77c16cd80357f4a0feada2435dfba8104a6Yuli Huang if (showTitle && mCurrentPhoto.getName() != null) 334ed46d77c16cd80357f4a0feada2435dfba8104a6Yuli Huang mActionBar.setTitle(mCurrentPhoto.getName()); 335ed46d77c16cd80357f4a0feada2435dfba8104a6Yuli Huang else 336ed46d77c16cd80357f4a0feada2435dfba8104a6Yuli Huang mActionBar.setTitle(""); 337ed46d77c16cd80357f4a0feada2435dfba8104a6Yuli Huang } 338ed46d77c16cd80357f4a0feada2435dfba8104a6Yuli Huang 339f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private void updateMenuOperations() { 3402066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang if (mMenu == null) return; 3412066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang MenuItem item = mMenu.findItem(R.id.action_slideshow); 3422066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang if (item != null) { 3432066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang item.setVisible(canDoSlideShow()); 3442066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang } 3452066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang if (mCurrentPhoto == null) return; 346f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin int supportedOperations = mCurrentPhoto.getSupportedOperations(); 347f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (!GalleryUtils.isEditorAvailable((Context) mActivity, "image/*")) { 348f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin supportedOperations &= ~MediaObject.SUPPORT_EDIT; 349f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 350604f053d040782159b61d3b74ee533bc2c0ccdd0Ray Chen 351f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin MenuExecutor.updateMenuOperation(mMenu, supportedOperations); 352f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 353f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 3542066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang private boolean canDoSlideShow() { 3552066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang if (mMediaSet == null || mCurrentPhoto == null) { 3562066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang return false; 3572066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang } 3582066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang if (mCurrentPhoto.getMediaType() != MediaObject.MEDIA_TYPE_IMAGE) { 3592066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang return false; 3602066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang } 3612066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang if (mMediaSet instanceof MtpDevice) { 3622066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang return false; 3632066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang } 3642066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang return true; 3652066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang } 3662066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang 36761f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang ////////////////////////////////////////////////////////////////////////// 36861f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang // Action Bar show/hide management 36961f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang ////////////////////////////////////////////////////////////////////////// 37061f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang 371f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private void showBars() { 372f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (mShowBars) return; 373f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mShowBars = true; 374f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mActionBar.show(); 37561f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang WindowManager.LayoutParams params = 37661f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang ((Activity) mActivity).getWindow().getAttributes(); 377f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin params.systemUiVisibility = View.SYSTEM_UI_FLAG_VISIBLE; 378f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin ((Activity) mActivity).getWindow().setAttributes(params); 37961f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang refreshHidingMessage(); 380f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 381f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 382f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private void hideBars() { 383f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (!mShowBars) return; 384f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mShowBars = false; 385f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mActionBar.hide(); 38661f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang WindowManager.LayoutParams params = 38761f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang ((Activity) mActivity).getWindow().getAttributes(); 388aeb3062e84ed28f0e25a73f511f287ae0a3e4294Chih-Chung Chang params.systemUiVisibility = View.SYSTEM_UI_FLAG_LOW_PROFILE; 389f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin ((Activity) mActivity).getWindow().setAttributes(params); 39061f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang mHandler.removeMessages(MSG_HIDE_BARS); 391f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 392f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 393f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private void refreshHidingMessage() { 394f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mHandler.removeMessages(MSG_HIDE_BARS); 39561f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang if (!mIsMenuVisible) { 396f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mHandler.sendEmptyMessageDelayed(MSG_HIDE_BARS, HIDE_BARS_TIMEOUT); 397f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 398f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 399f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 400aeb3062e84ed28f0e25a73f511f287ae0a3e4294Chih-Chung Chang private boolean canShowBars() { 401aeb3062e84ed28f0e25a73f511f287ae0a3e4294Chih-Chung Chang // No bars if we are showing camera preview. 402aeb3062e84ed28f0e25a73f511f287ae0a3e4294Chih-Chung Chang if (mAppBridge != null && mCurrentIndex == 0) return false; 403aeb3062e84ed28f0e25a73f511f287ae0a3e4294Chih-Chung Chang // No bars if it's not allowed. 404aeb3062e84ed28f0e25a73f511f287ae0a3e4294Chih-Chung Chang if (!mActionBarAllowed) return false; 405aeb3062e84ed28f0e25a73f511f287ae0a3e4294Chih-Chung Chang // No bars if the orientation is locked. 406aeb3062e84ed28f0e25a73f511f287ae0a3e4294Chih-Chung Chang if (mOrientationManager.isOrientationLocked()) return false; 407aeb3062e84ed28f0e25a73f511f287ae0a3e4294Chih-Chung Chang 408aeb3062e84ed28f0e25a73f511f287ae0a3e4294Chih-Chung Chang return true; 409aeb3062e84ed28f0e25a73f511f287ae0a3e4294Chih-Chung Chang } 410aeb3062e84ed28f0e25a73f511f287ae0a3e4294Chih-Chung Chang 41161f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang private void toggleBars() { 412aeb3062e84ed28f0e25a73f511f287ae0a3e4294Chih-Chung Chang mCanShowBars = canShowBars(); 413f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (mShowBars) { 414f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin hideBars(); 415aeb3062e84ed28f0e25a73f511f287ae0a3e4294Chih-Chung Chang } else { 416aeb3062e84ed28f0e25a73f511f287ae0a3e4294Chih-Chung Chang if (mCanShowBars) showBars(); 417f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 418f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 419f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 42061f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang private void updateBars() { 421aeb3062e84ed28f0e25a73f511f287ae0a3e4294Chih-Chung Chang boolean v = canShowBars(); 422aeb3062e84ed28f0e25a73f511f287ae0a3e4294Chih-Chung Chang if (mCanShowBars == v) return; 423aeb3062e84ed28f0e25a73f511f287ae0a3e4294Chih-Chung Chang mCanShowBars = v; 424aeb3062e84ed28f0e25a73f511f287ae0a3e4294Chih-Chung Chang 425aeb3062e84ed28f0e25a73f511f287ae0a3e4294Chih-Chung Chang if (mCanShowBars) { 42661f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang showBars(); 42761f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang } else { 42861f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang hideBars(); 42961f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang } 430f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 431f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 432f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 4332ef46ed28b28b355d7f3f1432c7b1196b832a859Chih-Chung Chang public void onOrientationCompensationChanged() { 4342ef46ed28b28b355d7f3f1432c7b1196b832a859Chih-Chung Chang mActivity.getGLRoot().requestLayoutContentPane(); 435bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang } 436bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang 437bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang @Override 438f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin protected void onBackPressed() { 439f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (mShowDetails) { 440f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin hideDetails(); 4413b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang } else if (mAppBridge == null || !switchWithCaptureAnimation(-1)) { 442bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang // We are leaving this page. Set the result now. 443bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang setResult(); 444f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin super.onBackPressed(); 445f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 446f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 447f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 448b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang private void onUpPressed() { 449b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang if (mActivity.getStateManager().getStateCount() > 1) { 450b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang super.onBackPressed(); 451ba12eae90b5b1a80ee002aa0df8c5c5189c4faa3Chih-Chung Chang return; 45266ca848b2f58b813d366642088d274a1b7c4a90cChih-Chung Chang } 45366ca848b2f58b813d366642088d274a1b7c4a90cChih-Chung Chang 45466ca848b2f58b813d366642088d274a1b7c4a90cChih-Chung Chang if (mOriginalSetPathString == null) return; 45566ca848b2f58b813d366642088d274a1b7c4a90cChih-Chung Chang 45666ca848b2f58b813d366642088d274a1b7c4a90cChih-Chung Chang if (mAppBridge == null) { 457b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang // We're in view mode so set up the stacks on our own. 458b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang Bundle data = new Bundle(getData()); 459b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang data.putString(AlbumPage.KEY_MEDIA_PATH, mOriginalSetPathString); 460b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang data.putString(AlbumPage.KEY_PARENT_MEDIA_PATH, 461b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang mActivity.getDataManager().getTopSetPath( 462b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang DataManager.INCLUDE_ALL)); 463b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang mActivity.getStateManager().switchState(this, AlbumPage.class, data); 46466ca848b2f58b813d366642088d274a1b7c4a90cChih-Chung Chang } else { 46566ca848b2f58b813d366642088d274a1b7c4a90cChih-Chung Chang // Start the real gallery activity to view the camera roll. 46666ca848b2f58b813d366642088d274a1b7c4a90cChih-Chung Chang Uri uri = Uri.parse("content://media/external/file?bucketId=" 46766ca848b2f58b813d366642088d274a1b7c4a90cChih-Chung Chang + MediaSetUtils.CAMERA_BUCKET_ID); 46866ca848b2f58b813d366642088d274a1b7c4a90cChih-Chung Chang Intent intent = new Intent(Intent.ACTION_VIEW); 46966ca848b2f58b813d366642088d274a1b7c4a90cChih-Chung Chang intent.setDataAndType(uri, ContentResolver.CURSOR_DIR_BASE_TYPE + "/image"); 47066ca848b2f58b813d366642088d274a1b7c4a90cChih-Chung Chang ((Activity) mActivity).startActivity(intent); 471b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang } 472b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang } 473b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang 474bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang private void setResult() { 475bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang Intent result = null; 476bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang if (!mPhotoView.getFilmMode()) { 477bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang result = new Intent(); 478bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang result.putExtra(KEY_RETURN_INDEX_HINT, mCurrentIndex); 479bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang } 480bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang setStateResult(Activity.RESULT_OK, result); 481bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang } 482bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang 483bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang ////////////////////////////////////////////////////////////////////////// 484bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang // AppBridge.Server interface 485bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang ////////////////////////////////////////////////////////////////////////// 486bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang 487bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang @Override 4882ef46ed28b28b355d7f3f1432c7b1196b832a859Chih-Chung Chang public void setCameraRelativeFrame(Rect frame) { 4892ef46ed28b28b355d7f3f1432c7b1196b832a859Chih-Chung Chang mPhotoView.setCameraRelativeFrame(frame); 490bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang } 491bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang 492bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang @Override 4932c6173822a612597c79be41b126367ddfbb5d518Chih-Chung Chang public boolean switchWithCaptureAnimation(int offset) { 4942c6173822a612597c79be41b126367ddfbb5d518Chih-Chung Chang return mPhotoView.switchWithCaptureAnimation(offset); 4952c6173822a612597c79be41b126367ddfbb5d518Chih-Chung Chang } 4962c6173822a612597c79be41b126367ddfbb5d518Chih-Chung Chang 497f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 4986575794a9c09f22d5721e212c093e0a2df376d0cChih-Chung Chang public void setSwipingEnabled(boolean enabled) { 4996575794a9c09f22d5721e212c093e0a2df376d0cChih-Chung Chang mPhotoView.setSwipingEnabled(enabled); 5006575794a9c09f22d5721e212c093e0a2df376d0cChih-Chung Chang } 5016575794a9c09f22d5721e212c093e0a2df376d0cChih-Chung Chang 5026575794a9c09f22d5721e212c093e0a2df376d0cChih-Chung Chang @Override 5033b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang public void notifyScreenNailChanged() { 5043b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang mScreenNailItem.setScreenNail(mAppBridge.attachScreenNail()); 5053b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang mScreenNailSet.notifyChange(); 5063b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang } 5073b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang 5083b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang @Override 509f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin protected boolean onCreateActionBar(Menu menu) { 510f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin MenuInflater inflater = ((Activity) mActivity).getMenuInflater(); 511f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin inflater.inflate(R.menu.photo, menu); 512f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mShareActionProvider = GalleryActionBar.initializeShareActionProvider(menu); 513cf46a3abc26aac7cdb6b6993aeade053304b71d9Ray Chen if (mPendingSharePath != null) updateShareURI(mPendingSharePath); 514f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mMenu = menu; 515f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin updateMenuOperations(); 516ed46d77c16cd80357f4a0feada2435dfba8104a6Yuli Huang updateTitle(); 517f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return true; 518f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 519f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 520f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 521f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin protected boolean onItemSelected(MenuItem item) { 522f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin MediaItem current = mModel.getCurrentMediaItem(); 523f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 524f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (current == null) { 525f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin // item is not ready, ignore 526f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return true; 527f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 528f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 529f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin int currentIndex = mModel.getCurrentIndex(); 530f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin Path path = current.getPath(); 531f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 532f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin DataManager manager = mActivity.getDataManager(); 533f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin int action = item.getItemId(); 5349a033b07b8e0d9fe7419b7a0d876e9c7febf43c8Ray Chen String confirmMsg = null; 535f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin switch (action) { 53684c220f10a643927c8a2126de8a755d8d7f7ec9eRay Chen case android.R.id.home: { 537b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang onUpPressed(); 53884c220f10a643927c8a2126de8a755d8d7f7ec9eRay Chen return true; 53984c220f10a643927c8a2126de8a755d8d7f7ec9eRay Chen } 540f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin case R.id.action_slideshow: { 541f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin Bundle data = new Bundle(); 5426cf807453fb58ccd4cc513ff187b306c7090e67cOwen Lin data.putString(SlideshowPage.KEY_SET_PATH, mMediaSet.getPath().toString()); 543604f053d040782159b61d3b74ee533bc2c0ccdd0Ray Chen data.putString(SlideshowPage.KEY_ITEM_PATH, path.toString()); 544f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin data.putInt(SlideshowPage.KEY_PHOTO_INDEX, currentIndex); 545f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin data.putBoolean(SlideshowPage.KEY_REPEAT, true); 546f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mActivity.getStateManager().startStateForResult( 547f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin SlideshowPage.class, REQUEST_SLIDESHOW, data); 548f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return true; 549f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 550f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin case R.id.action_crop: { 551f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin Activity activity = (Activity) mActivity; 552f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin Intent intent = new Intent(CropImage.CROP_ACTION); 553f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin intent.setClass(activity, CropImage.class); 554f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin intent.setData(manager.getContentUri(path)); 555f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin activity.startActivityForResult(intent, PicasaSource.isPicasaImage(current) 556f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin ? REQUEST_CROP_PICASA 557f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin : REQUEST_CROP); 558f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return true; 559f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 560f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang case R.id.action_edit: { 561f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang Intent intent = new Intent(Intent.ACTION_EDIT) 562f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang .setData(manager.getContentUri(path)) 563f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang .setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); 564f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang ((Activity) mActivity).startActivityForResult(Intent.createChooser(intent, null), 565f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang REQUEST_EDIT); 566f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang return true; 567f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang } 568f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin case R.id.action_details: { 569f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (mShowDetails) { 570f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin hideDetails(); 571f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } else { 572f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin showDetails(currentIndex); 573f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 574f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return true; 575f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 57667098d1a72fd04e2af06d3a5939cde28c65f70d9Ray Chen case R.id.action_delete: 5779a033b07b8e0d9fe7419b7a0d876e9c7febf43c8Ray Chen confirmMsg = mActivity.getResources().getQuantityString( 5789a033b07b8e0d9fe7419b7a0d876e9c7febf43c8Ray Chen R.plurals.delete_selection, 1); 579f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin case R.id.action_setas: 580f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin case R.id.action_rotate_ccw: 581f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin case R.id.action_rotate_cw: 582f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin case R.id.action_show_on_map: 583f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mSelectionManager.deSelectAll(); 584f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mSelectionManager.toggle(path); 5859a033b07b8e0d9fe7419b7a0d876e9c7febf43c8Ray Chen mMenuExecutor.onMenuClicked(item, confirmMsg, null); 586f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return true; 587f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin case R.id.action_import: 588f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mSelectionManager.deSelectAll(); 589f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mSelectionManager.toggle(path); 5909a033b07b8e0d9fe7419b7a0d876e9c7febf43c8Ray Chen mMenuExecutor.onMenuClicked(item, confirmMsg, 591f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin new ImportCompleteListener(mActivity)); 592f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return true; 593f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin default : 594f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return false; 595f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 596f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 597f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 598f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private void hideDetails() { 599f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mShowDetails = false; 6004105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen mDetailsHelper.hide(); 601f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 602f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 603f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private void showDetails(int index) { 604f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mShowDetails = true; 6054105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen if (mDetailsHelper == null) { 6064105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen mDetailsHelper = new DetailsHelper(mActivity, mRootPane, new MyDetailsSource()); 6074105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen mDetailsHelper.setCloseListener(new CloseListener() { 60806c6401eededc2ec842ba4994a838c2ded0a666cPin Ting @Override 609f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void onClose() { 610f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin hideDetails(); 611f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 612f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin }); 613f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 6144105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen mDetailsHelper.reloadDetails(index); 6154105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen mDetailsHelper.show(); 616f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 617f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 618bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang //////////////////////////////////////////////////////////////////////////// 619bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang // Callbacks from PhotoView 620bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang //////////////////////////////////////////////////////////////////////////// 621bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang @Override 622f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void onSingleTapUp(int x, int y) { 623bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang if (mAppBridge != null) { 624bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang if (mAppBridge.onSingleTapUp(x, y)) return; 625014d9586d8145a33f4e99eaad570587f6d650026Wu-cheng Li } 626014d9586d8145a33f4e99eaad570587f6d650026Wu-cheng Li 627f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin MediaItem item = mModel.getCurrentMediaItem(); 628b5dc542fbaeaf99bebdcf775ef0e034e89e88eaeWu-cheng Li if (item == null || item == mScreenNailItem) { 629b5dc542fbaeaf99bebdcf775ef0e034e89e88eaeWu-cheng Li // item is not ready or it is camera preview, ignore 630f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return; 631f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 632f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 633f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin boolean playVideo = 634f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin (item.getSupportedOperations() & MediaItem.SUPPORT_PLAY) != 0; 635f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 636f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (playVideo) { 637f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin // determine if the point is at center (1/6) of the photo view. 638f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin // (The position of the "play" icon is at center (1/6) of the photo) 639f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin int w = mPhotoView.getWidth(); 640f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin int h = mPhotoView.getHeight(); 641f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin playVideo = (Math.abs(x - w / 2) * 12 <= w) 642f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin && (Math.abs(y - h / 2) * 12 <= h); 643f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 644f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 645f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (playVideo) { 646f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin playVideo((Activity) mActivity, item.getPlayUri(), item.getName()); 647f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } else { 64861f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang toggleBars(); 649f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 650f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 651f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 652bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang @Override 653bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang public void lockOrientation() { 654bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang mHandler.sendEmptyMessage(MSG_LOCK_ORIENTATION); 655bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang } 656bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang 657bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang @Override 658bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang public void unlockOrientation() { 65906c6401eededc2ec842ba4994a838c2ded0a666cPin Ting mHandler.sendEmptyMessage(MSG_UNLOCK_ORIENTATION); 660bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang } 661bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang 662bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang @Override 66361f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang public void onActionBarAllowed(boolean allowed) { 66461f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang mActionBarAllowed = allowed; 66561f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang mHandler.sendEmptyMessage(MSG_UPDATE_ACTION_BAR); 66661f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang } 66761f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang 66861f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang @Override 669bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang public void onFullScreenChanged(boolean full) { 670bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang Message m = mHandler.obtainMessage( 671bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang MSG_ON_FULL_SCREEN_CHANGED, full ? 1 : 0, 0); 672bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang m.sendToTarget(); 673bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang } 674bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang 675f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public static void playVideo(Activity activity, Uri uri, String title) { 676f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin try { 677f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin Intent intent = new Intent(Intent.ACTION_VIEW) 678f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin .setDataAndType(uri, "video/*"); 679f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin intent.putExtra(Intent.EXTRA_TITLE, title); 680f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin activity.startActivity(intent); 681f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } catch (ActivityNotFoundException e) { 682f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin Toast.makeText(activity, activity.getString(R.string.video_err), 683f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin Toast.LENGTH_SHORT).show(); 684f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 685f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 686f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 687f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang private void setCurrentPhotoByIntent(Intent intent) { 688f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang if (intent == null) return; 689f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang Path path = mApplication.getDataManager() 690f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang .findPathByUri(intent.getData(), intent.getType()); 691f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang if (path != null) { 692f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang mModel.setCurrentPhoto(path, mCurrentIndex); 693f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang } 694f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang } 695f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang 696f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 697f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin protected void onStateResult(int requestCode, int resultCode, Intent data) { 698f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin switch (requestCode) { 699f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang case REQUEST_EDIT: 700f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang setCurrentPhotoByIntent(data); 701f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang break; 702f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin case REQUEST_CROP: 703f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (resultCode == Activity.RESULT_OK) { 704f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang setCurrentPhotoByIntent(data); 705f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 706f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin break; 707f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin case REQUEST_CROP_PICASA: { 708f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang if (resultCode == Activity.RESULT_OK) { 709f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang Context context = mActivity.getAndroidContext(); 71088cc2ca5f5596762a5546ec7426756f2036be455Yuli Huang String message = context.getString(R.string.crop_saved, 711f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang context.getString(R.string.folder_download)); 712f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang Toast.makeText(context, message, Toast.LENGTH_SHORT).show(); 713f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang } 714f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin break; 715f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 716f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin case REQUEST_SLIDESHOW: { 717f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (data == null) break; 718f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin String path = data.getStringExtra(SlideshowPage.KEY_ITEM_PATH); 719f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin int index = data.getIntExtra(SlideshowPage.KEY_PHOTO_INDEX, 0); 720f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (path != null) { 721f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mModel.setCurrentPhoto(Path.fromString(path), index); 722f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 723f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 724f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 725f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 726f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 727f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 728f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void onPause() { 729bd7c016d728853d38f98a3c6077b7bd9b08858b9Yuli Huang mActivity.getGLRoot().unfreeze(); 730bd7c016d728853d38f98a3c6077b7bd9b08858b9Yuli Huang mHandler.removeMessages(MSG_UNFREEZE_GLROOT); 731f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin super.onPause(); 732f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mIsActive = false; 733bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang if (mAppBridge != null) mAppBridge.setServer(null); 7344105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen DetailsHelper.pause(); 735f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mPhotoView.pause(); 736f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mModel.pause(); 737f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mHandler.removeMessages(MSG_HIDE_BARS); 738f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mActionBar.removeOnMenuVisibilityListener(mMenuVisibilityListener); 73933ef03776b7734717b16f6fc861b831fb1b1dfacMartijn Coenen 7402785956f8f5654966a41e20f482f4af3057eea3fChih-Chung Chang mMenuExecutor.pause(); 741f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 742f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 743f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 744bd7c016d728853d38f98a3c6077b7bd9b08858b9Yuli Huang public void onCurrentImageUpdated() { 745bd7c016d728853d38f98a3c6077b7bd9b08858b9Yuli Huang mActivity.getGLRoot().unfreeze(); 746bd7c016d728853d38f98a3c6077b7bd9b08858b9Yuli Huang } 747bd7c016d728853d38f98a3c6077b7bd9b08858b9Yuli Huang 748bd7c016d728853d38f98a3c6077b7bd9b08858b9Yuli Huang @Override 749f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin protected void onResume() { 750bd7c016d728853d38f98a3c6077b7bd9b08858b9Yuli Huang mActivity.getGLRoot().freeze(); 751f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin super.onResume(); 752f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mIsActive = true; 753f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin setContentPane(mRootPane); 75404ac045bf8da5082bbb0bdc9ea5f9c9b5b796ad0Yuli Huang 755f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mModel.resume(); 756f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mPhotoView.resume(); 757f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (mMenuVisibilityListener == null) { 758f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mMenuVisibilityListener = new MyMenuVisibilityListener(); 759f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 7608cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen mActionBar.setDisplayOptions(mSetPathString != null, true); 761f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mActionBar.addOnMenuVisibilityListener(mMenuVisibilityListener); 76233ef03776b7734717b16f6fc861b831fb1b1dfacMartijn Coenen 763bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang if (mAppBridge != null) { 764bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang mAppBridge.setServer(this); 76533f8567dd5003e4bb342683f3768ab7552648b02Chih-Chung Chang mPhotoView.resetToFirstPicture(); 766bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang } 767bd7c016d728853d38f98a3c6077b7bd9b08858b9Yuli Huang mHandler.sendEmptyMessageDelayed(MSG_UNFREEZE_GLROOT, UNFREEZE_GLROOT_TIMEOUT); 768f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 769f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 77015b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang @Override 77115b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang protected void onDestroy() { 772bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang if (mAppBridge != null) { 7733b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang mScreenNailItem.setScreenNail(null); 774bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang mAppBridge.detachScreenNail(); 775bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang mAppBridge = null; 7763b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang mScreenNailSet = null; 7773b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang mScreenNailItem = null; 778b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang } 779bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang mOrientationManager.removeListener(this); 7802ef46ed28b28b355d7f3f1432c7b1196b832a859Chih-Chung Chang mActivity.getGLRoot().setOrientationSource(null); 781aeb3062e84ed28f0e25a73f511f287ae0a3e4294Chih-Chung Chang 782aeb3062e84ed28f0e25a73f511f287ae0a3e4294Chih-Chung Chang // Remove all pending messages. 783aeb3062e84ed28f0e25a73f511f287ae0a3e4294Chih-Chung Chang mHandler.removeCallbacksAndMessages(null); 78415b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang super.onDestroy(); 78515b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang } 78615b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang 787f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private class MyDetailsSource implements DetailsSource { 7884105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen private int mIndex; 7896cf807453fb58ccd4cc513ff187b306c7090e67cOwen Lin 7906cf807453fb58ccd4cc513ff187b306c7090e67cOwen Lin @Override 791f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public MediaDetails getDetails() { 792f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return mModel.getCurrentMediaItem().getDetails(); 793f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 7946cf807453fb58ccd4cc513ff187b306c7090e67cOwen Lin 7956cf807453fb58ccd4cc513ff187b306c7090e67cOwen Lin @Override 796f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public int size() { 797f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return mMediaSet != null ? mMediaSet.getMediaItemCount() : 1; 798f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 7996cf807453fb58ccd4cc513ff187b306c7090e67cOwen Lin 8006cf807453fb58ccd4cc513ff187b306c7090e67cOwen Lin @Override 801f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public int findIndex(int indexHint) { 8024105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen mIndex = indexHint; 803f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return indexHint; 804f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 8054105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen 8066cf807453fb58ccd4cc513ff187b306c7090e67cOwen Lin @Override 8074105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen public int getIndex() { 8084105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen return mIndex; 8094105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen } 810f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 811f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin} 812