1f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin/* 2f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * Copyright (C) 2010 The Android Open Source Project 3f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * 4f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * Licensed under the Apache License, Version 2.0 (the "License"); 5f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * you may not use this file except in compliance with the License. 6f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * You may obtain a copy of the License at 7f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * 8f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * http://www.apache.org/licenses/LICENSE-2.0 9f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * 10f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * Unless required by applicable law or agreed to in writing, software 11f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * distributed under the License is distributed on an "AS IS" BASIS, 12f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * See the License for the specific language governing permissions and 14f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * limitations under the License. 15f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin */ 16f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 17f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linpackage com.android.gallery3d.app; 18f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 191f4e6d14bba7290ea0268fbde28ffc664d4f7004Ray Chenimport android.app.Activity; 201f4e6d14bba7290ea0268fbde28ffc664d4f7004Ray Chenimport android.content.Context; 2128cb4161da5fc3756933ca67d509b8af1c6275f1Owen Linimport android.content.Intent; 221f4e6d14bba7290ea0268fbde28ffc664d4f7004Ray Chenimport android.graphics.Rect; 231f4e6d14bba7290ea0268fbde28ffc664d4f7004Ray Chenimport android.os.Bundle; 2490fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huangimport android.os.Handler; 2590fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huangimport android.os.Message; 26bcb427870043b12d4a1a454c08a088933d0eaf23Bobby Georgescuimport android.view.HapticFeedbackConstants; 272abaaf7caa9a83ba1ea759868aabde7f21387184John Reckimport android.view.Menu; 282abaaf7caa9a83ba1ea759868aabde7f21387184John Reckimport android.view.MenuInflater; 292abaaf7caa9a83ba1ea759868aabde7f21387184John Reckimport android.view.MenuItem; 30d208e12012152bf757c0492cd3bfc91f101294ccBobby Georgescuimport android.view.View; 31d208e12012152bf757c0492cd3bfc91f101294ccBobby Georgescuimport android.view.View.OnClickListener; 32d208e12012152bf757c0492cd3bfc91f101294ccBobby Georgescuimport android.widget.Button; 33d208e12012152bf757c0492cd3bfc91f101294ccBobby Georgescuimport android.widget.RelativeLayout; 341f4e6d14bba7290ea0268fbde28ffc664d4f7004Ray Chenimport android.widget.Toast; 351f4e6d14bba7290ea0268fbde28ffc664d4f7004Ray Chen 36f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.R; 37f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.common.Utils; 38f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.data.DataManager; 39f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.data.MediaDetails; 4027565de3ab86e81a20c9804ebc7f8d3f737031a0Hung-ying Tyanimport com.android.gallery3d.data.MediaItem; 41f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.data.MediaObject; 42f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.data.MediaSet; 43f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.data.Path; 44a4eae1abb4f2547dfbda84301ee764ce35464881John Reckimport com.android.gallery3d.glrenderer.FadeTexture; 45a4eae1abb4f2547dfbda84301ee764ce35464881John Reckimport com.android.gallery3d.glrenderer.GLCanvas; 46f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.picasasource.PicasaSource; 47f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.settings.GallerySettings; 48f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.ui.ActionModeHandler; 49f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.ui.ActionModeHandler.ActionModeListener; 50c3d8ac3b9504346dafc49e006b5f732dd1db21e8Owen Linimport com.android.gallery3d.ui.AlbumSetSlotRenderer; 514105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chenimport com.android.gallery3d.ui.DetailsHelper; 524105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chenimport com.android.gallery3d.ui.DetailsHelper.CloseListener; 5371632ac6c1596dd1fd477f95e268f96ad72ea572Owen Linimport com.android.gallery3d.ui.GLRoot; 54f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.ui.GLView; 55f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.ui.SelectionManager; 56f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.ui.SlotView; 5790fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huangimport com.android.gallery3d.ui.SynchronizedHandler; 5857cbaa1ef40d2215c6400f5ae4af3a09e67abb2dHung-ying Tyanimport com.android.gallery3d.util.Future; 59fbdd338d83596ba545a8a7c8105d2ad7b5df56e6Owen Linimport com.android.gallery3d.util.GalleryUtils; 60daf88feb0aab5806723b850d22a372cafe758239Ray Chenimport com.android.gallery3d.util.HelpUtils; 61f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 6209995299480b797254873319caffd5408624988bBobby Georgescuimport java.lang.ref.WeakReference; 6327565de3ab86e81a20c9804ebc7f8d3f737031a0Hung-ying Tyanimport java.util.ArrayList; 6409995299480b797254873319caffd5408624988bBobby Georgescu 65f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linpublic class AlbumSetPage extends ActivityState implements 66f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin SelectionManager.SelectionListener, GalleryActionBar.ClusterRunner, 6757cbaa1ef40d2215c6400f5ae4af3a09e67abb2dHung-ying Tyan EyePosition.EyePositionListener, MediaSet.SyncListener { 68f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @SuppressWarnings("unused") 69f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private static final String TAG = "AlbumSetPage"; 70f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 7190fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang private static final int MSG_PICK_ALBUM = 1; 7290fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang 73f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public static final String KEY_MEDIA_PATH = "media-path"; 74f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public static final String KEY_SET_TITLE = "set-title"; 75f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public static final String KEY_SET_SUBTITLE = "set-subtitle"; 76b5f8d908c5dd287052cd49eddaf1f82d858cca03Ray Chen public static final String KEY_SELECTED_CLUSTER_TYPE = "selected-cluster"; 776cf807453fb58ccd4cc513ff187b306c7090e67cOwen Lin 78f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private static final int DATA_CACHE_SIZE = 256; 79f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private static final int REQUEST_DO_ANIMATION = 1; 80f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 81fbdd338d83596ba545a8a7c8105d2ad7b5df56e6Owen Lin private static final int BIT_LOADING_RELOAD = 1; 82fbdd338d83596ba545a8a7c8105d2ad7b5df56e6Owen Lin private static final int BIT_LOADING_SYNC = 2; 83fbdd338d83596ba545a8a7c8105d2ad7b5df56e6Owen Lin 84f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private boolean mIsActive = false; 857260f6f74d465520e4497b23fe56f98abb0c15a2Owen Lin private SlotView mSlotView; 86c3d8ac3b9504346dafc49e006b5f732dd1db21e8Owen Lin private AlbumSetSlotRenderer mAlbumSetView; 87f0c89374bfc008fb79ac3cb91cfd6d565d203041Bobby Georgescu private Config.AlbumSetPage mConfig; 88f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 89f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private MediaSet mMediaSet; 909c21268fa8d394cca6cab78dd023a52e0b147a6eRay Chen private String mTitle; 91f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private String mSubtitle; 92b5f8d908c5dd287052cd49eddaf1f82d858cca03Ray Chen private boolean mShowClusterMenu; 938cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen private GalleryActionBar mActionBar; 94b5f8d908c5dd287052cd49eddaf1f82d858cca03Ray Chen private int mSelectedAction; 95f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 96f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin protected SelectionManager mSelectionManager; 97c3d8ac3b9504346dafc49e006b5f732dd1db21e8Owen Lin private AlbumSetDataLoader mAlbumSetDataAdapter; 98f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 99f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private boolean mGetContent; 100f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private boolean mGetAlbum; 101f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private ActionModeHandler mActionModeHandler; 1024105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen private DetailsHelper mDetailsHelper; 1034105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen private MyDetailsSource mDetailsSource; 104f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private boolean mShowDetails; 105f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private EyePosition mEyePosition; 10690fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang private Handler mHandler; 107f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 108f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin // The eyes' position of the user, the origin is at the center of the 109f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin // device and the unit is in pixels. 110f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private float mX; 111f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private float mY; 112f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private float mZ; 113f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 11457cbaa1ef40d2215c6400f5ae4af3a09e67abb2dHung-ying Tyan private Future<Integer> mSyncTask = null; 11557cbaa1ef40d2215c6400f5ae4af3a09e67abb2dHung-ying Tyan 116fbdd338d83596ba545a8a7c8105d2ad7b5df56e6Owen Lin private int mLoadingBits = 0; 117fbdd338d83596ba545a8a7c8105d2ad7b5df56e6Owen Lin private boolean mInitialSynced = false; 118fbdd338d83596ba545a8a7c8105d2ad7b5df56e6Owen Lin 119d208e12012152bf757c0492cd3bfc91f101294ccBobby Georgescu private Button mCameraButton; 120d208e12012152bf757c0492cd3bfc91f101294ccBobby Georgescu private boolean mShowedEmptyToastForSelf = false; 121d208e12012152bf757c0492cd3bfc91f101294ccBobby Georgescu 122915c2c5b2c367df71599370613af0924bd7c4887Bobby Georgescu @Override 123915c2c5b2c367df71599370613af0924bd7c4887Bobby Georgescu protected int getBackgroundColorId() { 124915c2c5b2c367df71599370613af0924bd7c4887Bobby Georgescu return R.color.albumset_background; 125915c2c5b2c367df71599370613af0924bd7c4887Bobby Georgescu } 126915c2c5b2c367df71599370613af0924bd7c4887Bobby Georgescu 127dbf4ba12afba115888493caa34937643257e2bb1Ray Chen private final GLView mRootPane = new GLView() { 128dbf4ba12afba115888493caa34937643257e2bb1Ray Chen private final float mMatrix[] = new float[16]; 129f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 130f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 131f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin protected void onLayout( 132f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin boolean changed, int left, int top, int right, int bottom) { 133f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mEyePosition.resetPosition(); 134f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 135f0c89374bfc008fb79ac3cb91cfd6d565d203041Bobby Georgescu int slotViewTop = mActionBar.getHeight() + mConfig.paddingTop; 136f0c89374bfc008fb79ac3cb91cfd6d565d203041Bobby Georgescu int slotViewBottom = bottom - top - mConfig.paddingBottom; 137f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin int slotViewRight = right - left; 138f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 139f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (mShowDetails) { 1404105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen mDetailsHelper.layout(left, slotViewTop, right, bottom); 141f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } else { 14231cac30e46a293f6d0901e22c6ab0d083cae7021Owen Lin mAlbumSetView.setHighlightItemPath(null); 143f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 144f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 1457260f6f74d465520e4497b23fe56f98abb0c15a2Owen Lin mSlotView.layout(0, slotViewTop, slotViewRight, slotViewBottom); 146f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 147f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 148f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 149f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin protected void render(GLCanvas canvas) { 150f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin canvas.save(GLCanvas.SAVE_FLAG_MATRIX); 151f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin GalleryUtils.setViewPointMatrix(mMatrix, 152f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin getWidth() / 2 + mX, getHeight() / 2 + mY, mZ); 153f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin canvas.multiplyMatrix(mMatrix, 0); 154f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin super.render(canvas); 155f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin canvas.restore(); 156f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 157f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin }; 158f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 159f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 160f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void onEyePositionChanged(float x, float y, float z) { 161f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mRootPane.lockRendering(); 162f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mX = x; 163f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mY = y; 164f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mZ = z; 165f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mRootPane.unlockRendering(); 166f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mRootPane.invalidate(); 167f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 168f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 169f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 170f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void onBackPressed() { 171f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (mShowDetails) { 172f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin hideDetails(); 173f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } else if (mSelectionManager.inSelectionMode()) { 174f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mSelectionManager.leaveSelectionMode(); 175f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } else { 176f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin super.onBackPressed(); 177f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 178f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 179f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 1802341c197b0becf99422e8ad305def77df6161714Owen Lin private void getSlotCenter(int slotIndex, int center[]) { 181f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin Rect offset = new Rect(); 1827260f6f74d465520e4497b23fe56f98abb0c15a2Owen Lin mRootPane.getBoundsOf(mSlotView, offset); 1837260f6f74d465520e4497b23fe56f98abb0c15a2Owen Lin Rect r = mSlotView.getSlotRect(slotIndex); 1847260f6f74d465520e4497b23fe56f98abb0c15a2Owen Lin int scrollX = mSlotView.getScrollX(); 1857260f6f74d465520e4497b23fe56f98abb0c15a2Owen Lin int scrollY = mSlotView.getScrollY(); 186f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin center[0] = offset.left + (r.left + r.right) / 2 - scrollX; 187f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin center[1] = offset.top + (r.top + r.bottom) / 2 - scrollY; 188f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 189f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 190f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void onSingleTapUp(int slotIndex) { 191cf06397b2bc65335fb97d5788f18cad4897126a2Owen Lin if (!mIsActive) return; 19290fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang 19390fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang if (mSelectionManager.inSelectionMode()) { 19490fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang MediaSet targetSet = mAlbumSetDataAdapter.getMediaSet(slotIndex); 19590fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang if (targetSet == null) return; // Content is dirty, we shall reload soon 19690fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang mSelectionManager.toggle(targetSet.getPath()); 19790fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang mSlotView.invalidate(); 19890fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang } else { 19990fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang // Show pressed-up animation for the single-tap. 20090fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang mAlbumSetView.setPressedIndex(slotIndex); 20190fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang mAlbumSetView.setPressedUp(); 20290fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang mHandler.sendMessageDelayed(mHandler.obtainMessage(MSG_PICK_ALBUM, slotIndex, 0), 20390fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang FadeTexture.DURATION); 20490fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang } 20590fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang } 20690fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang 2077eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu private static boolean albumShouldOpenInFilmstrip(MediaSet album) { 208b265ebb01cc046b74329eeb28dbecb24e0f953d2Bobby Georgescu int itemCount = album.getMediaItemCount(); 20927565de3ab86e81a20c9804ebc7f8d3f737031a0Hung-ying Tyan ArrayList<MediaItem> list = (itemCount == 1) ? album.getMediaItem(0, 1) : null; 2107a84c578a4b3bea9eebb0b21ac161c18aad49346Bobby Georgescu // open in film strip only if there's one item in the album and the item exists 2117a84c578a4b3bea9eebb0b21ac161c18aad49346Bobby Georgescu return (list != null && !list.isEmpty()); 2127eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu } 2137eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu 21409995299480b797254873319caffd5408624988bBobby Georgescu WeakReference<Toast> mEmptyAlbumToast = null; 21509995299480b797254873319caffd5408624988bBobby Georgescu 21609995299480b797254873319caffd5408624988bBobby Georgescu private void showEmptyAlbumToast(int toastLength) { 21709995299480b797254873319caffd5408624988bBobby Georgescu Toast toast; 21809995299480b797254873319caffd5408624988bBobby Georgescu if (mEmptyAlbumToast != null) { 21909995299480b797254873319caffd5408624988bBobby Georgescu toast = mEmptyAlbumToast.get(); 22009995299480b797254873319caffd5408624988bBobby Georgescu if (toast != null) { 22109995299480b797254873319caffd5408624988bBobby Georgescu toast.show(); 22209995299480b797254873319caffd5408624988bBobby Georgescu return; 22309995299480b797254873319caffd5408624988bBobby Georgescu } 22409995299480b797254873319caffd5408624988bBobby Georgescu } 22509995299480b797254873319caffd5408624988bBobby Georgescu toast = Toast.makeText(mActivity, R.string.empty_album, toastLength); 22609995299480b797254873319caffd5408624988bBobby Georgescu mEmptyAlbumToast = new WeakReference<Toast>(toast); 22709995299480b797254873319caffd5408624988bBobby Georgescu toast.show(); 22809995299480b797254873319caffd5408624988bBobby Georgescu } 22909995299480b797254873319caffd5408624988bBobby Georgescu 23009995299480b797254873319caffd5408624988bBobby Georgescu private void hideEmptyAlbumToast() { 23109995299480b797254873319caffd5408624988bBobby Georgescu if (mEmptyAlbumToast != null) { 23209995299480b797254873319caffd5408624988bBobby Georgescu Toast toast = mEmptyAlbumToast.get(); 23309995299480b797254873319caffd5408624988bBobby Georgescu if (toast != null) toast.cancel(); 23409995299480b797254873319caffd5408624988bBobby Georgescu } 23509995299480b797254873319caffd5408624988bBobby Georgescu } 23609995299480b797254873319caffd5408624988bBobby Georgescu 23790fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang private void pickAlbum(int slotIndex) { 23890fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang if (!mIsActive) return; 23990fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang 240f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin MediaSet targetSet = mAlbumSetDataAdapter.getMediaSet(slotIndex); 241f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (targetSet == null) return; // Content is dirty, we shall reload soon 24209995299480b797254873319caffd5408624988bBobby Georgescu if (targetSet.getTotalMediaItemCount() == 0) { 24309995299480b797254873319caffd5408624988bBobby Georgescu showEmptyAlbumToast(Toast.LENGTH_SHORT); 24409995299480b797254873319caffd5408624988bBobby Georgescu return; 24509995299480b797254873319caffd5408624988bBobby Georgescu } 24609995299480b797254873319caffd5408624988bBobby Georgescu hideEmptyAlbumToast(); 24709995299480b797254873319caffd5408624988bBobby Georgescu 24890fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang String mediaPath = targetSet.getPath().toString(); 249f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 25090fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang Bundle data = new Bundle(getData()); 25190fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang int[] center = new int[2]; 25290fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang getSlotCenter(slotIndex, center); 25390fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang data.putIntArray(AlbumPage.KEY_SET_CENTER, center); 25490fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang if (mGetAlbum && targetSet.isLeafAlbum()) { 255b21b8e58a604f6c701245d84b141b5b87663192bOwen Lin Activity activity = mActivity; 25690fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang Intent result = new Intent() 25790fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang .putExtra(AlbumPicker.KEY_ALBUM_PATH, targetSet.getPath().toString()); 25890fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang activity.setResult(Activity.RESULT_OK, result); 25990fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang activity.finish(); 26090fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang } else if (targetSet.getSubMediaSetCount() > 0) { 26190fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang data.putString(AlbumSetPage.KEY_MEDIA_PATH, mediaPath); 26290fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang mActivity.getStateManager().startStateForResult( 26390fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang AlbumSetPage.class, REQUEST_DO_ANIMATION, data); 264f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } else { 265d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu if (!mGetContent && albumShouldOpenInFilmstrip(targetSet)) { 2666b64c0670429a41b1fabb36e679a36b7e6fa9194Bobby Georgescu data.putParcelable(PhotoPage.KEY_OPEN_ANIMATION_RECT, 2676b64c0670429a41b1fabb36e679a36b7e6fa9194Bobby Georgescu mSlotView.getSlotRect(slotIndex, mRootPane)); 2687eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu data.putInt(PhotoPage.KEY_INDEX_HINT, 0); 2697eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu data.putString(PhotoPage.KEY_MEDIA_SET_PATH, 2707eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu mediaPath); 2717eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu data.putBoolean(PhotoPage.KEY_START_IN_FILMSTRIP, true); 27245f089d69141e3fb0dfaad9bc34d275b61eb2aeeBobby Georgescu data.putBoolean(PhotoPage.KEY_IN_CAMERA_ROLL, targetSet.isCameraRoll()); 2737eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu mActivity.getStateManager().startStateForResult( 274cfa7fde1a336a3200b2ad9091b27ba7bfd8f5c9aBobby Georgescu FilmstripPage.class, AlbumPage.REQUEST_PHOTO, data); 2757eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu return; 27690fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang } 27790fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang data.putString(AlbumPage.KEY_MEDIA_PATH, mediaPath); 2787eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu 27990fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang // We only show cluster menu in the first AlbumPage in stack 2807eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu boolean inAlbum = mActivity.getStateManager().hasStateClass(AlbumPage.class); 28190fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang data.putBoolean(AlbumPage.KEY_SHOW_CLUSTER_MENU, !inAlbum); 28290fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang mActivity.getStateManager().startStateForResult( 28390fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang AlbumPage.class, REQUEST_DO_ANIMATION, data); 284f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 285f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 286f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 287bc2154199aee16762e3758ad0cfed685323d9a9fChih-Chung Chang private void onDown(int index) { 28831cac30e46a293f6d0901e22c6ab0d083cae7021Owen Lin mAlbumSetView.setPressedIndex(index); 289bc2154199aee16762e3758ad0cfed685323d9a9fChih-Chung Chang } 290bc2154199aee16762e3758ad0cfed685323d9a9fChih-Chung Chang 29190fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang private void onUp(boolean followedByLongPress) { 29290fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang if (followedByLongPress) { 29390fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang // Avoid showing press-up animations for long-press. 29490fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang mAlbumSetView.setPressedIndex(-1); 29590fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang } else { 29690fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang mAlbumSetView.setPressedUp(); 29790fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang } 298bc2154199aee16762e3758ad0cfed685323d9a9fChih-Chung Chang } 299bc2154199aee16762e3758ad0cfed685323d9a9fChih-Chung Chang 300f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void onLongTap(int slotIndex) { 301f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (mGetContent || mGetAlbum) return; 30290fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang MediaSet set = mAlbumSetDataAdapter.getMediaSet(slotIndex); 30390fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang if (set == null) return; 30490fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang mSelectionManager.setAutoLeaveSelectionMode(true); 30590fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang mSelectionManager.toggle(set.getPath()); 30690fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang mSlotView.invalidate(); 307f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 308f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 3092341c197b0becf99422e8ad305def77df6161714Owen Lin @Override 310f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void doCluster(int clusterType) { 311f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin String basePath = mMediaSet.getPath().toString(); 312f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin String newPath = FilterUtils.switchClusterPath(basePath, clusterType); 313f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin Bundle data = new Bundle(getData()); 314f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin data.putString(AlbumSetPage.KEY_MEDIA_PATH, newPath); 315b5f8d908c5dd287052cd49eddaf1f82d858cca03Ray Chen data.putInt(KEY_SELECTED_CLUSTER_TYPE, clusterType); 316f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mActivity.getStateManager().switchState(this, AlbumSetPage.class, data); 317f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 318f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 319f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 320f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void onCreate(Bundle data, Bundle restoreState) { 32145c56f2d34c71d0bc9b84ebeef6d1314738d0fc0Bobby Georgescu super.onCreate(data, restoreState); 322f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin initializeViews(); 323f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin initializeData(data); 3241f4e6d14bba7290ea0268fbde28ffc664d4f7004Ray Chen Context context = mActivity.getAndroidContext(); 32506c027675948259368a902fd6f8c2ecac5db5167Mangesh Ghiware mGetContent = data.getBoolean(GalleryActivity.KEY_GET_CONTENT, false); 32606c027675948259368a902fd6f8c2ecac5db5167Mangesh Ghiware mGetAlbum = data.getBoolean(GalleryActivity.KEY_GET_ALBUM, false); 3279c21268fa8d394cca6cab78dd023a52e0b147a6eRay Chen mTitle = data.getString(AlbumSetPage.KEY_SET_TITLE); 328f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mSubtitle = data.getString(AlbumSetPage.KEY_SET_SUBTITLE); 3291f4e6d14bba7290ea0268fbde28ffc664d4f7004Ray Chen mEyePosition = new EyePosition(context, this); 3304105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen mDetailsSource = new MyDetailsSource(); 3318cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen mActionBar = mActivity.getGalleryActionBar(); 3328cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen mSelectedAction = data.getInt(AlbumSetPage.KEY_SELECTED_CLUSTER_TYPE, 3338cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen FilterUtils.CLUSTER_BY_ALBUM); 33490fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang 33590fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang mHandler = new SynchronizedHandler(mActivity.getGLRoot()) { 33690fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang @Override 33790fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang public void handleMessage(Message message) { 33890fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang switch (message.what) { 33990fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang case MSG_PICK_ALBUM: { 34090fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang pickAlbum(message.arg1); 34190fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang break; 34290fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang } 34390fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang default: throw new AssertionError(message.what); 34490fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang } 34590fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang } 34690fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang }; 347f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 348f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 349d208e12012152bf757c0492cd3bfc91f101294ccBobby Georgescu @Override 350d208e12012152bf757c0492cd3bfc91f101294ccBobby Georgescu public void onDestroy() { 351d208e12012152bf757c0492cd3bfc91f101294ccBobby Georgescu super.onDestroy(); 352a2d0d34a90543ee19ea295e72c112fde18fb3828Bobby Georgescu cleanupCameraButton(); 353a2d0d34a90543ee19ea295e72c112fde18fb3828Bobby Georgescu mActionModeHandler.destroy(); 354d208e12012152bf757c0492cd3bfc91f101294ccBobby Georgescu } 355d208e12012152bf757c0492cd3bfc91f101294ccBobby Georgescu 356d208e12012152bf757c0492cd3bfc91f101294ccBobby Georgescu private boolean setupCameraButton() { 3574f69a058a77f741235a35e85ede78f3b2301861fBobby Georgescu if (!GalleryUtils.isCameraAvailable(mActivity)) return false; 358d208e12012152bf757c0492cd3bfc91f101294ccBobby Georgescu RelativeLayout galleryRoot = (RelativeLayout) ((Activity) mActivity) 359d208e12012152bf757c0492cd3bfc91f101294ccBobby Georgescu .findViewById(R.id.gallery_root); 360d208e12012152bf757c0492cd3bfc91f101294ccBobby Georgescu if (galleryRoot == null) return false; 361d208e12012152bf757c0492cd3bfc91f101294ccBobby Georgescu 362d208e12012152bf757c0492cd3bfc91f101294ccBobby Georgescu mCameraButton = new Button(mActivity); 363d208e12012152bf757c0492cd3bfc91f101294ccBobby Georgescu mCameraButton.setText(R.string.camera_label); 3648cfc7f0ce4bed1538b85b40fe08a5528cac8c270Bobby Georgescu mCameraButton.setCompoundDrawablesWithIntrinsicBounds(0, R.drawable.frame_overlay_gallery_camera, 0, 0); 365d208e12012152bf757c0492cd3bfc91f101294ccBobby Georgescu mCameraButton.setOnClickListener(new OnClickListener() { 366d208e12012152bf757c0492cd3bfc91f101294ccBobby Georgescu @Override 367d208e12012152bf757c0492cd3bfc91f101294ccBobby Georgescu public void onClick(View arg0) { 368d208e12012152bf757c0492cd3bfc91f101294ccBobby Georgescu GalleryUtils.startCameraActivity(mActivity); 369d208e12012152bf757c0492cd3bfc91f101294ccBobby Georgescu } 370d208e12012152bf757c0492cd3bfc91f101294ccBobby Georgescu }); 371d208e12012152bf757c0492cd3bfc91f101294ccBobby Georgescu RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams( 372d208e12012152bf757c0492cd3bfc91f101294ccBobby Georgescu RelativeLayout.LayoutParams.WRAP_CONTENT, 373d208e12012152bf757c0492cd3bfc91f101294ccBobby Georgescu RelativeLayout.LayoutParams.WRAP_CONTENT); 374d208e12012152bf757c0492cd3bfc91f101294ccBobby Georgescu lp.addRule(RelativeLayout.CENTER_IN_PARENT); 375d208e12012152bf757c0492cd3bfc91f101294ccBobby Georgescu galleryRoot.addView(mCameraButton, lp); 376d208e12012152bf757c0492cd3bfc91f101294ccBobby Georgescu return true; 377d208e12012152bf757c0492cd3bfc91f101294ccBobby Georgescu } 378d208e12012152bf757c0492cd3bfc91f101294ccBobby Georgescu 379d208e12012152bf757c0492cd3bfc91f101294ccBobby Georgescu private void cleanupCameraButton() { 380d208e12012152bf757c0492cd3bfc91f101294ccBobby Georgescu if (mCameraButton == null) return; 381d208e12012152bf757c0492cd3bfc91f101294ccBobby Georgescu RelativeLayout galleryRoot = (RelativeLayout) ((Activity) mActivity) 382d208e12012152bf757c0492cd3bfc91f101294ccBobby Georgescu .findViewById(R.id.gallery_root); 383d208e12012152bf757c0492cd3bfc91f101294ccBobby Georgescu if (galleryRoot == null) return; 384d208e12012152bf757c0492cd3bfc91f101294ccBobby Georgescu galleryRoot.removeView(mCameraButton); 385d208e12012152bf757c0492cd3bfc91f101294ccBobby Georgescu mCameraButton = null; 386d208e12012152bf757c0492cd3bfc91f101294ccBobby Georgescu } 387d208e12012152bf757c0492cd3bfc91f101294ccBobby Georgescu 388d208e12012152bf757c0492cd3bfc91f101294ccBobby Georgescu private void showCameraButton() { 389d208e12012152bf757c0492cd3bfc91f101294ccBobby Georgescu if (mCameraButton == null && !setupCameraButton()) return; 390d208e12012152bf757c0492cd3bfc91f101294ccBobby Georgescu mCameraButton.setVisibility(View.VISIBLE); 391d208e12012152bf757c0492cd3bfc91f101294ccBobby Georgescu } 392d208e12012152bf757c0492cd3bfc91f101294ccBobby Georgescu 393d208e12012152bf757c0492cd3bfc91f101294ccBobby Georgescu private void hideCameraButton() { 394d208e12012152bf757c0492cd3bfc91f101294ccBobby Georgescu if (mCameraButton == null) return; 395d208e12012152bf757c0492cd3bfc91f101294ccBobby Georgescu mCameraButton.setVisibility(View.GONE); 396d208e12012152bf757c0492cd3bfc91f101294ccBobby Georgescu } 397d208e12012152bf757c0492cd3bfc91f101294ccBobby Georgescu 398fbdd338d83596ba545a8a7c8105d2ad7b5df56e6Owen Lin private void clearLoadingBit(int loadingBit) { 399fbdd338d83596ba545a8a7c8105d2ad7b5df56e6Owen Lin mLoadingBits &= ~loadingBit; 400d05b0be120bb217b4f56add24a4b31bee92455b2Chih-Chung Chang if (mLoadingBits == 0 && mIsActive) { 401d208e12012152bf757c0492cd3bfc91f101294ccBobby Georgescu if (mAlbumSetDataAdapter.size() == 0) { 40209995299480b797254873319caffd5408624988bBobby Georgescu // If this is not the top of the gallery folder hierarchy, 40309995299480b797254873319caffd5408624988bBobby Georgescu // tell the parent AlbumSetPage instance to handle displaying 40409995299480b797254873319caffd5408624988bBobby Georgescu // the empty album toast, otherwise show it within this 40509995299480b797254873319caffd5408624988bBobby Georgescu // instance 406fbdd338d83596ba545a8a7c8105d2ad7b5df56e6Owen Lin if (mActivity.getStateManager().getStateCount() > 1) { 40709995299480b797254873319caffd5408624988bBobby Georgescu Intent result = new Intent(); 40809995299480b797254873319caffd5408624988bBobby Georgescu result.putExtra(AlbumPage.KEY_EMPTY_ALBUM, true); 40909995299480b797254873319caffd5408624988bBobby Georgescu setStateResult(Activity.RESULT_OK, result); 410fbdd338d83596ba545a8a7c8105d2ad7b5df56e6Owen Lin mActivity.getStateManager().finishState(this); 4115992daf6f4cb56742cbf33a014c5c2c142c6957eBobby Georgescu } else { 41209995299480b797254873319caffd5408624988bBobby Georgescu mShowedEmptyToastForSelf = true; 41309995299480b797254873319caffd5408624988bBobby Georgescu showEmptyAlbumToast(Toast.LENGTH_LONG); 41477fa1d232c1a804d17f3b1ceeaa6ab6c6555b047Bobby Georgescu mSlotView.invalidate(); 415d208e12012152bf757c0492cd3bfc91f101294ccBobby Georgescu showCameraButton(); 416fbdd338d83596ba545a8a7c8105d2ad7b5df56e6Owen Lin } 41709995299480b797254873319caffd5408624988bBobby Georgescu return; 418fbdd338d83596ba545a8a7c8105d2ad7b5df56e6Owen Lin } 419fbdd338d83596ba545a8a7c8105d2ad7b5df56e6Owen Lin } 42009995299480b797254873319caffd5408624988bBobby Georgescu // Hide the empty album toast if we are in the root instance of 42109995299480b797254873319caffd5408624988bBobby Georgescu // AlbumSetPage and the album is no longer empty (for instance, 42209995299480b797254873319caffd5408624988bBobby Georgescu // after a sync is completed and web albums have been synced) 42309995299480b797254873319caffd5408624988bBobby Georgescu if (mShowedEmptyToastForSelf) { 42409995299480b797254873319caffd5408624988bBobby Georgescu mShowedEmptyToastForSelf = false; 42509995299480b797254873319caffd5408624988bBobby Georgescu hideEmptyAlbumToast(); 426d208e12012152bf757c0492cd3bfc91f101294ccBobby Georgescu hideCameraButton(); 4275992daf6f4cb56742cbf33a014c5c2c142c6957eBobby Georgescu } 4285992daf6f4cb56742cbf33a014c5c2c142c6957eBobby Georgescu } 4295992daf6f4cb56742cbf33a014c5c2c142c6957eBobby Georgescu 430fbdd338d83596ba545a8a7c8105d2ad7b5df56e6Owen Lin private void setLoadingBit(int loadingBit) { 431fbdd338d83596ba545a8a7c8105d2ad7b5df56e6Owen Lin mLoadingBits |= loadingBit; 432fbdd338d83596ba545a8a7c8105d2ad7b5df56e6Owen Lin } 433fbdd338d83596ba545a8a7c8105d2ad7b5df56e6Owen Lin 434f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 435f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void onPause() { 436f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin super.onPause(); 437f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mIsActive = false; 438f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mAlbumSetDataAdapter.pause(); 439f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mAlbumSetView.pause(); 440a2d0d34a90543ee19ea295e72c112fde18fb3828Bobby Georgescu mActionModeHandler.pause(); 441f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mEyePosition.pause(); 4424105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen DetailsHelper.pause(); 443fe1625c46f8258be4cd5e5e1ba69b584c1fe1a49Ray Chen // Call disableClusterMenu to avoid receiving callback after paused. 444fe1625c46f8258be4cd5e5e1ba69b584c1fe1a49Ray Chen // Don't hide menu here otherwise the list menu will disappear earlier than 445fe1625c46f8258be4cd5e5e1ba69b584c1fe1a49Ray Chen // the action bar, which is janky and unwanted behavior. 4468cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen mActionBar.disableClusterMenu(false); 44757cbaa1ef40d2215c6400f5ae4af3a09e67abb2dHung-ying Tyan if (mSyncTask != null) { 44857cbaa1ef40d2215c6400f5ae4af3a09e67abb2dHung-ying Tyan mSyncTask.cancel(); 44957cbaa1ef40d2215c6400f5ae4af3a09e67abb2dHung-ying Tyan mSyncTask = null; 450fbdd338d83596ba545a8a7c8105d2ad7b5df56e6Owen Lin clearLoadingBit(BIT_LOADING_SYNC); 45157cbaa1ef40d2215c6400f5ae4af3a09e67abb2dHung-ying Tyan } 452f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 453f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 454f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 455f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void onResume() { 456f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin super.onResume(); 457f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mIsActive = true; 458f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin setContentPane(mRootPane); 459fe49be45412f8d0f68343662318e73822da486c8Owen Lin 460fe49be45412f8d0f68343662318e73822da486c8Owen Lin // Set the reload bit here to prevent it exit this page in clearLoadingBit(). 461fe49be45412f8d0f68343662318e73822da486c8Owen Lin setLoadingBit(BIT_LOADING_RELOAD); 462f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mAlbumSetDataAdapter.resume(); 463fe49be45412f8d0f68343662318e73822da486c8Owen Lin 464f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mAlbumSetView.resume(); 465f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mEyePosition.resume(); 466f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mActionModeHandler.resume(); 4678cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen if (mShowClusterMenu) { 4688cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen mActionBar.enableClusterMenu(mSelectedAction, this); 469dbf4ba12afba115888493caa34937643257e2bb1Ray Chen } 470fbdd338d83596ba545a8a7c8105d2ad7b5df56e6Owen Lin if (!mInitialSynced) { 471fbdd338d83596ba545a8a7c8105d2ad7b5df56e6Owen Lin setLoadingBit(BIT_LOADING_SYNC); 472fe49be45412f8d0f68343662318e73822da486c8Owen Lin mSyncTask = mMediaSet.requestSync(AlbumSetPage.this); 473fbdd338d83596ba545a8a7c8105d2ad7b5df56e6Owen Lin } 474f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 475f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 476f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private void initializeData(Bundle data) { 477f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin String mediaPath = data.getString(AlbumSetPage.KEY_MEDIA_PATH); 478f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mMediaSet = mActivity.getDataManager().getMediaSet(mediaPath); 479f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mSelectionManager.setSourceMediaSet(mMediaSet); 480c3d8ac3b9504346dafc49e006b5f732dd1db21e8Owen Lin mAlbumSetDataAdapter = new AlbumSetDataLoader( 481f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mActivity, mMediaSet, DATA_CACHE_SIZE); 482f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mAlbumSetDataAdapter.setLoadingListener(new MyLoadingListener()); 483f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mAlbumSetView.setModel(mAlbumSetDataAdapter); 484f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 485f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 486f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private void initializeViews() { 487f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mSelectionManager = new SelectionManager(mActivity, true); 488f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mSelectionManager.setSelectionListener(this); 489f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 490b21b8e58a604f6c701245d84b141b5b87663192bOwen Lin mConfig = Config.AlbumSetPage.get(mActivity); 491f0c89374bfc008fb79ac3cb91cfd6d565d203041Bobby Georgescu mSlotView = new SlotView(mActivity, mConfig.slotViewSpec); 492c3d8ac3b9504346dafc49e006b5f732dd1db21e8Owen Lin mAlbumSetView = new AlbumSetSlotRenderer( 493915c2c5b2c367df71599370613af0924bd7c4887Bobby Georgescu mActivity, mSelectionManager, mSlotView, mConfig.labelSpec, 494915c2c5b2c367df71599370613af0924bd7c4887Bobby Georgescu mConfig.placeholderColor); 4957260f6f74d465520e4497b23fe56f98abb0c15a2Owen Lin mSlotView.setSlotRenderer(mAlbumSetView); 4967260f6f74d465520e4497b23fe56f98abb0c15a2Owen Lin mSlotView.setListener(new SlotView.SimpleListener() { 497f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 498bc2154199aee16762e3758ad0cfed685323d9a9fChih-Chung Chang public void onDown(int index) { 499bc2154199aee16762e3758ad0cfed685323d9a9fChih-Chung Chang AlbumSetPage.this.onDown(index); 500bc2154199aee16762e3758ad0cfed685323d9a9fChih-Chung Chang } 501bc2154199aee16762e3758ad0cfed685323d9a9fChih-Chung Chang 502bc2154199aee16762e3758ad0cfed685323d9a9fChih-Chung Chang @Override 50390fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang public void onUp(boolean followedByLongPress) { 50490fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang AlbumSetPage.this.onUp(followedByLongPress); 505bc2154199aee16762e3758ad0cfed685323d9a9fChih-Chung Chang } 506bc2154199aee16762e3758ad0cfed685323d9a9fChih-Chung Chang 507bc2154199aee16762e3758ad0cfed685323d9a9fChih-Chung Chang @Override 508f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void onSingleTapUp(int slotIndex) { 509f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin AlbumSetPage.this.onSingleTapUp(slotIndex); 510f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 511bc2154199aee16762e3758ad0cfed685323d9a9fChih-Chung Chang 512f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 513f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void onLongTap(int slotIndex) { 514f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin AlbumSetPage.this.onLongTap(slotIndex); 515f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 516f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin }); 517f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 518f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mActionModeHandler = new ActionModeHandler(mActivity, mSelectionManager); 519f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mActionModeHandler.setActionModeListener(new ActionModeListener() { 5202341c197b0becf99422e8ad305def77df6161714Owen Lin @Override 521f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public boolean onActionItemClicked(MenuItem item) { 522f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return onItemSelected(item); 523f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 524f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin }); 5257260f6f74d465520e4497b23fe56f98abb0c15a2Owen Lin mRootPane.addComponent(mSlotView); 526f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 527f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 528f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 529f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin protected boolean onCreateActionBar(Menu menu) { 530b21b8e58a604f6c701245d84b141b5b87663192bOwen Lin Activity activity = mActivity; 5312bb717f1ea38e2ce33dd102a23afe6bfacb5675cOwen Lin final boolean inAlbum = mActivity.getStateManager().hasStateClass(AlbumPage.class); 532b21b8e58a604f6c701245d84b141b5b87663192bOwen Lin MenuInflater inflater = getSupportMenuInflater(); 533b21b8e58a604f6c701245d84b141b5b87663192bOwen Lin 534f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (mGetContent) { 535b21b8e58a604f6c701245d84b141b5b87663192bOwen Lin inflater.inflate(R.menu.pickup, menu); 536f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin int typeBits = mData.getInt( 53706c027675948259368a902fd6f8c2ecac5db5167Mangesh Ghiware GalleryActivity.KEY_TYPE_BITS, DataManager.INCLUDE_IMAGE); 5389a93949a6ab6348b1a600496a7d52267620aab95Ahbong Chang mActionBar.setTitle(GalleryUtils.getSelectionModePrompt(typeBits)); 539f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } else if (mGetAlbum) { 540b21b8e58a604f6c701245d84b141b5b87663192bOwen Lin inflater.inflate(R.menu.pickup, menu); 5418cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen mActionBar.setTitle(R.string.select_album); 542f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } else { 543b21b8e58a604f6c701245d84b141b5b87663192bOwen Lin inflater.inflate(R.menu.albumset, menu); 5443fd764008a73dd76be87b02f42d0e00786015c8aBobby Georgescu boolean wasShowingClusterMenu = mShowClusterMenu; 545b5f8d908c5dd287052cd49eddaf1f82d858cca03Ray Chen mShowClusterMenu = !inAlbum; 5462bb717f1ea38e2ce33dd102a23afe6bfacb5675cOwen Lin boolean selectAlbums = !inAlbum && 5472bb717f1ea38e2ce33dd102a23afe6bfacb5675cOwen Lin mActionBar.getClusterTypeAction() == FilterUtils.CLUSTER_BY_ALBUM; 548b21b8e58a604f6c701245d84b141b5b87663192bOwen Lin MenuItem selectItem = menu.findItem(R.id.action_select); 549b21b8e58a604f6c701245d84b141b5b87663192bOwen Lin selectItem.setTitle(activity.getString( 5502bb717f1ea38e2ce33dd102a23afe6bfacb5675cOwen Lin selectAlbums ? R.string.select_album : R.string.select_group)); 551f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 552b21b8e58a604f6c701245d84b141b5b87663192bOwen Lin MenuItem cameraItem = menu.findItem(R.id.action_camera); 553b21b8e58a604f6c701245d84b141b5b87663192bOwen Lin cameraItem.setVisible(GalleryUtils.isCameraAvailable(activity)); 554f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 555b21b8e58a604f6c701245d84b141b5b87663192bOwen Lin FilterUtils.setupMenuItems(mActionBar, mMediaSet.getPath(), false); 5562bb717f1ea38e2ce33dd102a23afe6bfacb5675cOwen Lin 55706e34ad198138a9b9b5252af9dd54f2915d0551fJohn Reck Intent helpIntent = HelpUtils.getHelpIntent(activity); 558b21b8e58a604f6c701245d84b141b5b87663192bOwen Lin 559b21b8e58a604f6c701245d84b141b5b87663192bOwen Lin MenuItem helpItem = menu.findItem(R.id.action_general_help); 560b21b8e58a604f6c701245d84b141b5b87663192bOwen Lin helpItem.setVisible(helpIntent != null); 561b21b8e58a604f6c701245d84b141b5b87663192bOwen Lin if (helpIntent != null) helpItem.setIntent(helpIntent); 562b21b8e58a604f6c701245d84b141b5b87663192bOwen Lin 5638cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen mActionBar.setTitle(mTitle); 5648cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen mActionBar.setSubtitle(mSubtitle); 5653fd764008a73dd76be87b02f42d0e00786015c8aBobby Georgescu if (mShowClusterMenu != wasShowingClusterMenu) { 5663fd764008a73dd76be87b02f42d0e00786015c8aBobby Georgescu if (mShowClusterMenu) { 5673fd764008a73dd76be87b02f42d0e00786015c8aBobby Georgescu mActionBar.enableClusterMenu(mSelectedAction, this); 5683fd764008a73dd76be87b02f42d0e00786015c8aBobby Georgescu } else { 5693fd764008a73dd76be87b02f42d0e00786015c8aBobby Georgescu mActionBar.disableClusterMenu(true); 5703fd764008a73dd76be87b02f42d0e00786015c8aBobby Georgescu } 5713fd764008a73dd76be87b02f42d0e00786015c8aBobby Georgescu } 572f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 573b21b8e58a604f6c701245d84b141b5b87663192bOwen Lin return true; 574f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 575f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 576f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 577f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin protected boolean onItemSelected(MenuItem item) { 578b21b8e58a604f6c701245d84b141b5b87663192bOwen Lin Activity activity = mActivity; 579f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin switch (item.getItemId()) { 580bd8e025f1bb39b2be236b183ea8e78f93b308ad1Ray Chen case R.id.action_cancel: 581bd8e025f1bb39b2be236b183ea8e78f93b308ad1Ray Chen activity.setResult(Activity.RESULT_CANCELED); 582bd8e025f1bb39b2be236b183ea8e78f93b308ad1Ray Chen activity.finish(); 583bd8e025f1bb39b2be236b183ea8e78f93b308ad1Ray Chen return true; 584f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin case R.id.action_select: 585f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mSelectionManager.setAutoLeaveSelectionMode(false); 586f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mSelectionManager.enterSelectionMode(); 587f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return true; 588f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin case R.id.action_details: 589f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (mAlbumSetDataAdapter.size() != 0) { 590f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (mShowDetails) { 591f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin hideDetails(); 592f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } else { 593f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin showDetails(); 594f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 595f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } else { 596f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin Toast.makeText(activity, 597f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin activity.getText(R.string.no_albums_alert), 598f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin Toast.LENGTH_SHORT).show(); 599f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 600f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return true; 601f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin case R.id.action_camera: { 602402237b43fd853377e5dba4e048839ad23b99d72Chih-Chung Chang GalleryUtils.startCameraActivity(activity); 603f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return true; 604f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 605f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin case R.id.action_manage_offline: { 6066cf807453fb58ccd4cc513ff187b306c7090e67cOwen Lin Bundle data = new Bundle(); 6076cf807453fb58ccd4cc513ff187b306c7090e67cOwen Lin String mediaPath = mActivity.getDataManager().getTopSetPath( 6086cf807453fb58ccd4cc513ff187b306c7090e67cOwen Lin DataManager.INCLUDE_ALL); 6096cf807453fb58ccd4cc513ff187b306c7090e67cOwen Lin data.putString(AlbumSetPage.KEY_MEDIA_PATH, mediaPath); 6106cf807453fb58ccd4cc513ff187b306c7090e67cOwen Lin mActivity.getStateManager().startState(ManageCachePage.class, data); 611f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return true; 612f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 613f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin case R.id.action_sync_picasa_albums: { 614f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin PicasaSource.requestSync(activity); 615f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return true; 616f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 617f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin case R.id.action_settings: { 618f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin activity.startActivity(new Intent(activity, GallerySettings.class)); 619f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return true; 620f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 621f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin default: 622f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return false; 623f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 624f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 625f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 626f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 627f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin protected void onStateResult(int requestCode, int resultCode, Intent data) { 62809995299480b797254873319caffd5408624988bBobby Georgescu if (data != null && data.getBooleanExtra(AlbumPage.KEY_EMPTY_ALBUM, false)) { 62909995299480b797254873319caffd5408624988bBobby Georgescu showEmptyAlbumToast(Toast.LENGTH_SHORT); 63009995299480b797254873319caffd5408624988bBobby Georgescu } 631f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin switch (requestCode) { 632f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin case REQUEST_DO_ANIMATION: { 6332341c197b0becf99422e8ad305def77df6161714Owen Lin mSlotView.startRisingAnimation(); 634f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 635f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 636f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 637f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 638f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private String getSelectedString() { 639f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin int count = mSelectionManager.getSelectedCount(); 6408cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen int action = mActionBar.getClusterTypeAction(); 641f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin int string = action == FilterUtils.CLUSTER_BY_ALBUM 642f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin ? R.plurals.number_of_albums_selected 643f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin : R.plurals.number_of_groups_selected; 644f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin String format = mActivity.getResources().getQuantityString(string, count); 645f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return String.format(format, count); 646f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 647f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 6482341c197b0becf99422e8ad305def77df6161714Owen Lin @Override 649f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void onSelectionModeChange(int mode) { 650f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin switch (mode) { 651f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin case SelectionManager.ENTER_SELECTION_MODE: { 6528cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen mActionBar.disableClusterMenu(true); 6532bb717f1ea38e2ce33dd102a23afe6bfacb5675cOwen Lin mActionModeHandler.startActionMode(); 654bcb427870043b12d4a1a454c08a088933d0eaf23Bobby Georgescu performHapticFeedback(HapticFeedbackConstants.LONG_PRESS); 655f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin break; 656f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 657f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin case SelectionManager.LEAVE_SELECTION_MODE: { 6582bb717f1ea38e2ce33dd102a23afe6bfacb5675cOwen Lin mActionModeHandler.finishActionMode(); 6599c21268fa8d394cca6cab78dd023a52e0b147a6eRay Chen if (mShowClusterMenu) { 6608cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen mActionBar.enableClusterMenu(mSelectedAction, this); 6619c21268fa8d394cca6cab78dd023a52e0b147a6eRay Chen } 662f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mRootPane.invalidate(); 663f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin break; 664f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 665f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin case SelectionManager.SELECT_ALL_MODE: { 66621c2e665fdc1d1af0c91ab9c104d13fb7dc2444eRay Chen mActionModeHandler.updateSupportedOperation(); 667f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mRootPane.invalidate(); 668f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin break; 669f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 670f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 671f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 672f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 6732341c197b0becf99422e8ad305def77df6161714Owen Lin @Override 674f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void onSelectionChange(Path path, boolean selected) { 675f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mActionModeHandler.setTitle(getSelectedString()); 676f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mActionModeHandler.updateSupportedOperation(path, selected); 677f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 678f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 679f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private void hideDetails() { 680f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mShowDetails = false; 6814105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen mDetailsHelper.hide(); 68231cac30e46a293f6d0901e22c6ab0d083cae7021Owen Lin mAlbumSetView.setHighlightItemPath(null); 6837260f6f74d465520e4497b23fe56f98abb0c15a2Owen Lin mSlotView.invalidate(); 684f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 685f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 686f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private void showDetails() { 687f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mShowDetails = true; 6884105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen if (mDetailsHelper == null) { 6894105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen mDetailsHelper = new DetailsHelper(mActivity, mRootPane, mDetailsSource); 6904105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen mDetailsHelper.setCloseListener(new CloseListener() { 6912341c197b0becf99422e8ad305def77df6161714Owen Lin @Override 692f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void onClose() { 693f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin hideDetails(); 694f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 695f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin }); 696f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 6974105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen mDetailsHelper.show(); 698f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 699f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 70057cbaa1ef40d2215c6400f5ae4af3a09e67abb2dHung-ying Tyan @Override 70157cbaa1ef40d2215c6400f5ae4af3a09e67abb2dHung-ying Tyan public void onSyncDone(final MediaSet mediaSet, final int resultCode) { 70257cbaa1ef40d2215c6400f5ae4af3a09e67abb2dHung-ying Tyan if (resultCode == MediaSet.SYNC_RESULT_ERROR) { 70357cbaa1ef40d2215c6400f5ae4af3a09e67abb2dHung-ying Tyan Log.d(TAG, "onSyncDone: " + Utils.maskDebugInfo(mediaSet.getName()) + " result=" 70457cbaa1ef40d2215c6400f5ae4af3a09e67abb2dHung-ying Tyan + resultCode); 70557cbaa1ef40d2215c6400f5ae4af3a09e67abb2dHung-ying Tyan } 70657cbaa1ef40d2215c6400f5ae4af3a09e67abb2dHung-ying Tyan ((Activity) mActivity).runOnUiThread(new Runnable() { 70757cbaa1ef40d2215c6400f5ae4af3a09e67abb2dHung-ying Tyan @Override 70857cbaa1ef40d2215c6400f5ae4af3a09e67abb2dHung-ying Tyan public void run() { 70971632ac6c1596dd1fd477f95e268f96ad72ea572Owen Lin GLRoot root = mActivity.getGLRoot(); 71071632ac6c1596dd1fd477f95e268f96ad72ea572Owen Lin root.lockRenderThread(); 71171632ac6c1596dd1fd477f95e268f96ad72ea572Owen Lin try { 71271632ac6c1596dd1fd477f95e268f96ad72ea572Owen Lin if (resultCode == MediaSet.SYNC_RESULT_SUCCESS) { 71371632ac6c1596dd1fd477f95e268f96ad72ea572Owen Lin mInitialSynced = true; 71471632ac6c1596dd1fd477f95e268f96ad72ea572Owen Lin } 71571632ac6c1596dd1fd477f95e268f96ad72ea572Owen Lin clearLoadingBit(BIT_LOADING_SYNC); 71671632ac6c1596dd1fd477f95e268f96ad72ea572Owen Lin if (resultCode == MediaSet.SYNC_RESULT_ERROR && mIsActive) { 717e8c1e69f85efb8673d0606f3aca729a366038753Ray Chen Log.w(TAG, "failed to load album set"); 71871632ac6c1596dd1fd477f95e268f96ad72ea572Owen Lin } 71971632ac6c1596dd1fd477f95e268f96ad72ea572Owen Lin } finally { 72071632ac6c1596dd1fd477f95e268f96ad72ea572Owen Lin root.unlockRenderThread(); 72157cbaa1ef40d2215c6400f5ae4af3a09e67abb2dHung-ying Tyan } 72257cbaa1ef40d2215c6400f5ae4af3a09e67abb2dHung-ying Tyan } 72357cbaa1ef40d2215c6400f5ae4af3a09e67abb2dHung-ying Tyan }); 72457cbaa1ef40d2215c6400f5ae4af3a09e67abb2dHung-ying Tyan } 72557cbaa1ef40d2215c6400f5ae4af3a09e67abb2dHung-ying Tyan 726f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private class MyLoadingListener implements LoadingListener { 7272341c197b0becf99422e8ad305def77df6161714Owen Lin @Override 728f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void onLoadingStarted() { 729fbdd338d83596ba545a8a7c8105d2ad7b5df56e6Owen Lin setLoadingBit(BIT_LOADING_RELOAD); 730f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 731f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 7322341c197b0becf99422e8ad305def77df6161714Owen Lin @Override 73305da3f520eacb9219964b6ed57ef37846d889fd7Hung-ying Tyan public void onLoadingFinished(boolean loadingFailed) { 734fbdd338d83596ba545a8a7c8105d2ad7b5df56e6Owen Lin clearLoadingBit(BIT_LOADING_RELOAD); 735f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 736f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 737f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 7384105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen private class MyDetailsSource implements DetailsHelper.DetailsSource { 739f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private int mIndex; 7402341c197b0becf99422e8ad305def77df6161714Owen Lin 7412341c197b0becf99422e8ad305def77df6161714Owen Lin @Override 742f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public int size() { 743f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return mAlbumSetDataAdapter.size(); 744f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 745f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 7462341c197b0becf99422e8ad305def77df6161714Owen Lin @Override 747995c4566bed7df1aa48ba7e1351f964efa73880bMichael Kolb public int setIndex() { 748995c4566bed7df1aa48ba7e1351f964efa73880bMichael Kolb Path id = mSelectionManager.getSelected(false).get(0); 749995c4566bed7df1aa48ba7e1351f964efa73880bMichael Kolb mIndex = mAlbumSetDataAdapter.findSet(id); 750f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return mIndex; 751f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 752f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 7532341c197b0becf99422e8ad305def77df6161714Owen Lin @Override 754f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public MediaDetails getDetails() { 755f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin MediaObject item = mAlbumSetDataAdapter.getMediaSet(mIndex); 756f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (item != null) { 75731cac30e46a293f6d0901e22c6ab0d083cae7021Owen Lin mAlbumSetView.setHighlightItemPath(item.getPath()); 758f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return item.getDetails(); 759f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } else { 760f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return null; 761f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 762f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 763f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 764f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin} 765