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; 261f4e6d14bba7290ea0268fbde28ffc664d4f7004Ray Chenimport android.os.Vibrator; 271336062985c9824d7fd796b1cebd5eaa8e4163caOwen Linimport android.view.Menu; 281336062985c9824d7fd796b1cebd5eaa8e4163caOwen Linimport android.view.MenuInflater; 291336062985c9824d7fd796b1cebd5eaa8e4163caOwen Linimport 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; 44f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.picasasource.PicasaSource; 45f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.settings.GallerySettings; 46f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.ui.ActionModeHandler; 47f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.ui.ActionModeHandler.ActionModeListener; 48c3d8ac3b9504346dafc49e006b5f732dd1db21e8Owen Linimport com.android.gallery3d.ui.AlbumSetSlotRenderer; 494105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chenimport com.android.gallery3d.ui.DetailsHelper; 504105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chenimport com.android.gallery3d.ui.DetailsHelper.CloseListener; 5190fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huangimport com.android.gallery3d.ui.FadeTexture; 52f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.ui.GLCanvas; 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; 951f4e6d14bba7290ea0268fbde28ffc664d4f7004Ray Chen private Vibrator mVibrator; 96f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 97f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin protected SelectionManager mSelectionManager; 98c3d8ac3b9504346dafc49e006b5f732dd1db21e8Owen Lin private AlbumSetDataLoader mAlbumSetDataAdapter; 99f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 100f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private boolean mGetContent; 101f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private boolean mGetAlbum; 102f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private ActionModeHandler mActionModeHandler; 1034105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen private DetailsHelper mDetailsHelper; 1044105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen private MyDetailsSource mDetailsSource; 105f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private boolean mShowDetails; 106f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private EyePosition mEyePosition; 10790fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang private Handler mHandler; 108f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 109f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin // The eyes' position of the user, the origin is at the center of the 110f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin // device and the unit is in pixels. 111f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private float mX; 112f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private float mY; 113f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private float mZ; 114f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 11557cbaa1ef40d2215c6400f5ae4af3a09e67abb2dHung-ying Tyan private Future<Integer> mSyncTask = null; 11657cbaa1ef40d2215c6400f5ae4af3a09e67abb2dHung-ying Tyan 117fbdd338d83596ba545a8a7c8105d2ad7b5df56e6Owen Lin private int mLoadingBits = 0; 118fbdd338d83596ba545a8a7c8105d2ad7b5df56e6Owen Lin private boolean mInitialSynced = false; 119fbdd338d83596ba545a8a7c8105d2ad7b5df56e6Owen Lin 120d208e12012152bf757c0492cd3bfc91f101294ccBobby Georgescu private Button mCameraButton; 121d208e12012152bf757c0492cd3bfc91f101294ccBobby Georgescu private boolean mShowedEmptyToastForSelf = false; 122d208e12012152bf757c0492cd3bfc91f101294ccBobby Georgescu 123915c2c5b2c367df71599370613af0924bd7c4887Bobby Georgescu @Override 124915c2c5b2c367df71599370613af0924bd7c4887Bobby Georgescu protected int getBackgroundColorId() { 125915c2c5b2c367df71599370613af0924bd7c4887Bobby Georgescu return R.color.albumset_background; 126915c2c5b2c367df71599370613af0924bd7c4887Bobby Georgescu } 127915c2c5b2c367df71599370613af0924bd7c4887Bobby Georgescu 128dbf4ba12afba115888493caa34937643257e2bb1Ray Chen private final GLView mRootPane = new GLView() { 129dbf4ba12afba115888493caa34937643257e2bb1Ray Chen private final float mMatrix[] = new float[16]; 130f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 131f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 132f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin protected void onLayout( 133f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin boolean changed, int left, int top, int right, int bottom) { 134f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mEyePosition.resetPosition(); 135f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 136f0c89374bfc008fb79ac3cb91cfd6d565d203041Bobby Georgescu int slotViewTop = mActionBar.getHeight() + mConfig.paddingTop; 137f0c89374bfc008fb79ac3cb91cfd6d565d203041Bobby Georgescu int slotViewBottom = bottom - top - mConfig.paddingBottom; 138f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin int slotViewRight = right - left; 139f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 140f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (mShowDetails) { 1414105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen mDetailsHelper.layout(left, slotViewTop, right, bottom); 142f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } else { 14331cac30e46a293f6d0901e22c6ab0d083cae7021Owen Lin mAlbumSetView.setHighlightItemPath(null); 144f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 145f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 1467260f6f74d465520e4497b23fe56f98abb0c15a2Owen Lin mSlotView.layout(0, slotViewTop, slotViewRight, slotViewBottom); 147f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 148f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 149f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 150f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin protected void render(GLCanvas canvas) { 151f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin canvas.save(GLCanvas.SAVE_FLAG_MATRIX); 152f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin GalleryUtils.setViewPointMatrix(mMatrix, 153f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin getWidth() / 2 + mX, getHeight() / 2 + mY, mZ); 154f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin canvas.multiplyMatrix(mMatrix, 0); 155f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin super.render(canvas); 156f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin canvas.restore(); 157f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 158f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin }; 159f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 160f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 161f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void onEyePositionChanged(float x, float y, float z) { 162f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mRootPane.lockRendering(); 163f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mX = x; 164f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mY = y; 165f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mZ = z; 166f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mRootPane.unlockRendering(); 167f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mRootPane.invalidate(); 168f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 169f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 170f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 171f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void onBackPressed() { 172f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (mShowDetails) { 173f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin hideDetails(); 174f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } else if (mSelectionManager.inSelectionMode()) { 175f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mSelectionManager.leaveSelectionMode(); 176f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } else { 177f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin super.onBackPressed(); 178f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 179f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 180f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 1812341c197b0becf99422e8ad305def77df6161714Owen Lin private void getSlotCenter(int slotIndex, int center[]) { 182f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin Rect offset = new Rect(); 1837260f6f74d465520e4497b23fe56f98abb0c15a2Owen Lin mRootPane.getBoundsOf(mSlotView, offset); 1847260f6f74d465520e4497b23fe56f98abb0c15a2Owen Lin Rect r = mSlotView.getSlotRect(slotIndex); 1857260f6f74d465520e4497b23fe56f98abb0c15a2Owen Lin int scrollX = mSlotView.getScrollX(); 1867260f6f74d465520e4497b23fe56f98abb0c15a2Owen Lin int scrollY = mSlotView.getScrollY(); 187f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin center[0] = offset.left + (r.left + r.right) / 2 - scrollX; 188f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin center[1] = offset.top + (r.top + r.bottom) / 2 - scrollY; 189f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 190f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 191f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void onSingleTapUp(int slotIndex) { 192cf06397b2bc65335fb97d5788f18cad4897126a2Owen Lin if (!mIsActive) return; 19390fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang 19490fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang if (mSelectionManager.inSelectionMode()) { 19590fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang MediaSet targetSet = mAlbumSetDataAdapter.getMediaSet(slotIndex); 19690fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang if (targetSet == null) return; // Content is dirty, we shall reload soon 19790fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang mSelectionManager.toggle(targetSet.getPath()); 19890fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang mSlotView.invalidate(); 19990fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang } else { 20090fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang // Show pressed-up animation for the single-tap. 20190fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang mAlbumSetView.setPressedIndex(slotIndex); 20290fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang mAlbumSetView.setPressedUp(); 20390fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang mHandler.sendMessageDelayed(mHandler.obtainMessage(MSG_PICK_ALBUM, slotIndex, 0), 20490fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang FadeTexture.DURATION); 20590fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang } 20690fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang } 20790fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang 2087eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu private static boolean albumShouldOpenInFilmstrip(MediaSet album) { 209b265ebb01cc046b74329eeb28dbecb24e0f953d2Bobby Georgescu int itemCount = album.getMediaItemCount(); 21027565de3ab86e81a20c9804ebc7f8d3f737031a0Hung-ying Tyan ArrayList<MediaItem> list = (itemCount == 1) ? album.getMediaItem(0, 1) : null; 2117a84c578a4b3bea9eebb0b21ac161c18aad49346Bobby Georgescu // open in film strip only if there's one item in the album and the item exists 2127a84c578a4b3bea9eebb0b21ac161c18aad49346Bobby Georgescu return (list != null && !list.isEmpty()); 2137eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu } 2147eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu 21509995299480b797254873319caffd5408624988bBobby Georgescu WeakReference<Toast> mEmptyAlbumToast = null; 21609995299480b797254873319caffd5408624988bBobby Georgescu 21709995299480b797254873319caffd5408624988bBobby Georgescu private void showEmptyAlbumToast(int toastLength) { 21809995299480b797254873319caffd5408624988bBobby Georgescu Toast toast; 21909995299480b797254873319caffd5408624988bBobby Georgescu if (mEmptyAlbumToast != null) { 22009995299480b797254873319caffd5408624988bBobby Georgescu toast = mEmptyAlbumToast.get(); 22109995299480b797254873319caffd5408624988bBobby Georgescu if (toast != null) { 22209995299480b797254873319caffd5408624988bBobby Georgescu toast.show(); 22309995299480b797254873319caffd5408624988bBobby Georgescu return; 22409995299480b797254873319caffd5408624988bBobby Georgescu } 22509995299480b797254873319caffd5408624988bBobby Georgescu } 22609995299480b797254873319caffd5408624988bBobby Georgescu toast = Toast.makeText(mActivity, R.string.empty_album, toastLength); 22709995299480b797254873319caffd5408624988bBobby Georgescu mEmptyAlbumToast = new WeakReference<Toast>(toast); 22809995299480b797254873319caffd5408624988bBobby Georgescu toast.show(); 22909995299480b797254873319caffd5408624988bBobby Georgescu } 23009995299480b797254873319caffd5408624988bBobby Georgescu 23109995299480b797254873319caffd5408624988bBobby Georgescu private void hideEmptyAlbumToast() { 23209995299480b797254873319caffd5408624988bBobby Georgescu if (mEmptyAlbumToast != null) { 23309995299480b797254873319caffd5408624988bBobby Georgescu Toast toast = mEmptyAlbumToast.get(); 23409995299480b797254873319caffd5408624988bBobby Georgescu if (toast != null) toast.cancel(); 23509995299480b797254873319caffd5408624988bBobby Georgescu } 23609995299480b797254873319caffd5408624988bBobby Georgescu } 23709995299480b797254873319caffd5408624988bBobby Georgescu 23890fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang private void pickAlbum(int slotIndex) { 23990fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang if (!mIsActive) return; 24090fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang 241f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin MediaSet targetSet = mAlbumSetDataAdapter.getMediaSet(slotIndex); 242f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (targetSet == null) return; // Content is dirty, we shall reload soon 24309995299480b797254873319caffd5408624988bBobby Georgescu if (targetSet.getTotalMediaItemCount() == 0) { 24409995299480b797254873319caffd5408624988bBobby Georgescu showEmptyAlbumToast(Toast.LENGTH_SHORT); 24509995299480b797254873319caffd5408624988bBobby Georgescu return; 24609995299480b797254873319caffd5408624988bBobby Georgescu } 24709995299480b797254873319caffd5408624988bBobby Georgescu hideEmptyAlbumToast(); 24809995299480b797254873319caffd5408624988bBobby Georgescu 24990fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang String mediaPath = targetSet.getPath().toString(); 250f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 25190fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang Bundle data = new Bundle(getData()); 25290fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang int[] center = new int[2]; 25390fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang getSlotCenter(slotIndex, center); 25490fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang data.putIntArray(AlbumPage.KEY_SET_CENTER, center); 25590fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang if (mGetAlbum && targetSet.isLeafAlbum()) { 256b21b8e58a604f6c701245d84b141b5b87663192bOwen Lin Activity activity = mActivity; 25790fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang Intent result = new Intent() 25890fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang .putExtra(AlbumPicker.KEY_ALBUM_PATH, targetSet.getPath().toString()); 25990fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang activity.setResult(Activity.RESULT_OK, result); 26090fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang activity.finish(); 26190fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang } else if (targetSet.getSubMediaSetCount() > 0) { 26290fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang data.putString(AlbumSetPage.KEY_MEDIA_PATH, mediaPath); 26390fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang mActivity.getStateManager().startStateForResult( 26490fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang AlbumSetPage.class, REQUEST_DO_ANIMATION, data); 265f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } else { 26690fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang if (!mGetContent && (targetSet.getSupportedOperations() 26790fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang & MediaObject.SUPPORT_IMPORT) != 0) { 26890fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang data.putBoolean(AlbumPage.KEY_AUTO_SELECT_ALL, true); 26910d8759b5b4d0cf0351bce929eb7b6420aabbfd9Owen Lin } else if (!mGetContent && albumShouldOpenInFilmstrip(targetSet)) { 2706b64c0670429a41b1fabb36e679a36b7e6fa9194Bobby Georgescu data.putParcelable(PhotoPage.KEY_OPEN_ANIMATION_RECT, 2716b64c0670429a41b1fabb36e679a36b7e6fa9194Bobby Georgescu mSlotView.getSlotRect(slotIndex, mRootPane)); 2727eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu data.putInt(PhotoPage.KEY_INDEX_HINT, 0); 2737eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu data.putString(PhotoPage.KEY_MEDIA_SET_PATH, 2747eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu mediaPath); 2757eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu data.putBoolean(PhotoPage.KEY_START_IN_FILMSTRIP, true); 27645f089d69141e3fb0dfaad9bc34d275b61eb2aeeBobby Georgescu data.putBoolean(PhotoPage.KEY_IN_CAMERA_ROLL, targetSet.isCameraRoll()); 2777eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu mActivity.getStateManager().startStateForResult( 2787eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu PhotoPage.class, AlbumPage.REQUEST_PHOTO, data); 2797eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu return; 28090fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang } 28190fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang data.putString(AlbumPage.KEY_MEDIA_PATH, mediaPath); 2827eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu 28390fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang // We only show cluster menu in the first AlbumPage in stack 2847eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu boolean inAlbum = mActivity.getStateManager().hasStateClass(AlbumPage.class); 28590fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang data.putBoolean(AlbumPage.KEY_SHOW_CLUSTER_MENU, !inAlbum); 28690fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang mActivity.getStateManager().startStateForResult( 28790fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang AlbumPage.class, REQUEST_DO_ANIMATION, data); 288f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 289f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 290f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 291bc2154199aee16762e3758ad0cfed685323d9a9fChih-Chung Chang private void onDown(int index) { 29231cac30e46a293f6d0901e22c6ab0d083cae7021Owen Lin mAlbumSetView.setPressedIndex(index); 293bc2154199aee16762e3758ad0cfed685323d9a9fChih-Chung Chang } 294bc2154199aee16762e3758ad0cfed685323d9a9fChih-Chung Chang 29590fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang private void onUp(boolean followedByLongPress) { 29690fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang if (followedByLongPress) { 29790fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang // Avoid showing press-up animations for long-press. 29890fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang mAlbumSetView.setPressedIndex(-1); 29990fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang } else { 30090fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang mAlbumSetView.setPressedUp(); 30190fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang } 302bc2154199aee16762e3758ad0cfed685323d9a9fChih-Chung Chang } 303bc2154199aee16762e3758ad0cfed685323d9a9fChih-Chung Chang 304f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void onLongTap(int slotIndex) { 305f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (mGetContent || mGetAlbum) return; 30690fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang MediaSet set = mAlbumSetDataAdapter.getMediaSet(slotIndex); 30790fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang if (set == null) return; 30890fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang mSelectionManager.setAutoLeaveSelectionMode(true); 30990fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang mSelectionManager.toggle(set.getPath()); 31090fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang mSlotView.invalidate(); 311f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 312f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 3132341c197b0becf99422e8ad305def77df6161714Owen Lin @Override 314f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void doCluster(int clusterType) { 315f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin String basePath = mMediaSet.getPath().toString(); 316f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin String newPath = FilterUtils.switchClusterPath(basePath, clusterType); 317f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin Bundle data = new Bundle(getData()); 318f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin data.putString(AlbumSetPage.KEY_MEDIA_PATH, newPath); 319b5f8d908c5dd287052cd49eddaf1f82d858cca03Ray Chen data.putInt(KEY_SELECTED_CLUSTER_TYPE, clusterType); 320f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mActivity.getStateManager().switchState(this, AlbumSetPage.class, data); 321f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 322f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 323f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 324f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void onCreate(Bundle data, Bundle restoreState) { 32545c56f2d34c71d0bc9b84ebeef6d1314738d0fc0Bobby Georgescu super.onCreate(data, restoreState); 326f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin initializeViews(); 327f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin initializeData(data); 3281f4e6d14bba7290ea0268fbde28ffc664d4f7004Ray Chen Context context = mActivity.getAndroidContext(); 329f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mGetContent = data.getBoolean(Gallery.KEY_GET_CONTENT, false); 330f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mGetAlbum = data.getBoolean(Gallery.KEY_GET_ALBUM, false); 3319c21268fa8d394cca6cab78dd023a52e0b147a6eRay Chen mTitle = data.getString(AlbumSetPage.KEY_SET_TITLE); 332f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mSubtitle = data.getString(AlbumSetPage.KEY_SET_SUBTITLE); 3331f4e6d14bba7290ea0268fbde28ffc664d4f7004Ray Chen mEyePosition = new EyePosition(context, this); 3344105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen mDetailsSource = new MyDetailsSource(); 3351f4e6d14bba7290ea0268fbde28ffc664d4f7004Ray Chen mVibrator = (Vibrator) context.getSystemService(Context.VIBRATOR_SERVICE); 3368cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen mActionBar = mActivity.getGalleryActionBar(); 3378cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen mSelectedAction = data.getInt(AlbumSetPage.KEY_SELECTED_CLUSTER_TYPE, 3388cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen FilterUtils.CLUSTER_BY_ALBUM); 33990fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang 34090fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang mHandler = new SynchronizedHandler(mActivity.getGLRoot()) { 34190fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang @Override 34290fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang public void handleMessage(Message message) { 34390fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang switch (message.what) { 34490fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang case MSG_PICK_ALBUM: { 34590fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang pickAlbum(message.arg1); 34690fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang break; 34790fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang } 34890fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang default: throw new AssertionError(message.what); 34990fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang } 35090fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang } 35190fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang }; 352f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 353f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 354d208e12012152bf757c0492cd3bfc91f101294ccBobby Georgescu @Override 355d208e12012152bf757c0492cd3bfc91f101294ccBobby Georgescu public void onDestroy() { 356d208e12012152bf757c0492cd3bfc91f101294ccBobby Georgescu cleanupCameraButton(); 357d208e12012152bf757c0492cd3bfc91f101294ccBobby Georgescu super.onDestroy(); 358d208e12012152bf757c0492cd3bfc91f101294ccBobby Georgescu } 359d208e12012152bf757c0492cd3bfc91f101294ccBobby Georgescu 360d208e12012152bf757c0492cd3bfc91f101294ccBobby Georgescu private boolean setupCameraButton() { 3614f69a058a77f741235a35e85ede78f3b2301861fBobby Georgescu if (!GalleryUtils.isCameraAvailable(mActivity)) return false; 362d208e12012152bf757c0492cd3bfc91f101294ccBobby Georgescu RelativeLayout galleryRoot = (RelativeLayout) ((Activity) mActivity) 363d208e12012152bf757c0492cd3bfc91f101294ccBobby Georgescu .findViewById(R.id.gallery_root); 364d208e12012152bf757c0492cd3bfc91f101294ccBobby Georgescu if (galleryRoot == null) return false; 365d208e12012152bf757c0492cd3bfc91f101294ccBobby Georgescu 366d208e12012152bf757c0492cd3bfc91f101294ccBobby Georgescu mCameraButton = new Button(mActivity); 367d208e12012152bf757c0492cd3bfc91f101294ccBobby Georgescu mCameraButton.setText(R.string.camera_label); 3688cfc7f0ce4bed1538b85b40fe08a5528cac8c270Bobby Georgescu mCameraButton.setCompoundDrawablesWithIntrinsicBounds(0, R.drawable.frame_overlay_gallery_camera, 0, 0); 369d208e12012152bf757c0492cd3bfc91f101294ccBobby Georgescu mCameraButton.setOnClickListener(new OnClickListener() { 370d208e12012152bf757c0492cd3bfc91f101294ccBobby Georgescu @Override 371d208e12012152bf757c0492cd3bfc91f101294ccBobby Georgescu public void onClick(View arg0) { 372d208e12012152bf757c0492cd3bfc91f101294ccBobby Georgescu GalleryUtils.startCameraActivity(mActivity); 373d208e12012152bf757c0492cd3bfc91f101294ccBobby Georgescu } 374d208e12012152bf757c0492cd3bfc91f101294ccBobby Georgescu }); 375d208e12012152bf757c0492cd3bfc91f101294ccBobby Georgescu RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams( 376d208e12012152bf757c0492cd3bfc91f101294ccBobby Georgescu RelativeLayout.LayoutParams.WRAP_CONTENT, 377d208e12012152bf757c0492cd3bfc91f101294ccBobby Georgescu RelativeLayout.LayoutParams.WRAP_CONTENT); 378d208e12012152bf757c0492cd3bfc91f101294ccBobby Georgescu lp.addRule(RelativeLayout.CENTER_IN_PARENT); 379d208e12012152bf757c0492cd3bfc91f101294ccBobby Georgescu galleryRoot.addView(mCameraButton, lp); 380d208e12012152bf757c0492cd3bfc91f101294ccBobby Georgescu return true; 381d208e12012152bf757c0492cd3bfc91f101294ccBobby Georgescu } 382d208e12012152bf757c0492cd3bfc91f101294ccBobby Georgescu 383d208e12012152bf757c0492cd3bfc91f101294ccBobby Georgescu private void cleanupCameraButton() { 384d208e12012152bf757c0492cd3bfc91f101294ccBobby Georgescu if (mCameraButton == null) return; 385d208e12012152bf757c0492cd3bfc91f101294ccBobby Georgescu RelativeLayout galleryRoot = (RelativeLayout) ((Activity) mActivity) 386d208e12012152bf757c0492cd3bfc91f101294ccBobby Georgescu .findViewById(R.id.gallery_root); 387d208e12012152bf757c0492cd3bfc91f101294ccBobby Georgescu if (galleryRoot == null) return; 388d208e12012152bf757c0492cd3bfc91f101294ccBobby Georgescu galleryRoot.removeView(mCameraButton); 389d208e12012152bf757c0492cd3bfc91f101294ccBobby Georgescu mCameraButton = null; 390d208e12012152bf757c0492cd3bfc91f101294ccBobby Georgescu } 391d208e12012152bf757c0492cd3bfc91f101294ccBobby Georgescu 392d208e12012152bf757c0492cd3bfc91f101294ccBobby Georgescu private void showCameraButton() { 393d208e12012152bf757c0492cd3bfc91f101294ccBobby Georgescu if (mCameraButton == null && !setupCameraButton()) return; 394d208e12012152bf757c0492cd3bfc91f101294ccBobby Georgescu mCameraButton.setVisibility(View.VISIBLE); 395d208e12012152bf757c0492cd3bfc91f101294ccBobby Georgescu } 396d208e12012152bf757c0492cd3bfc91f101294ccBobby Georgescu 397d208e12012152bf757c0492cd3bfc91f101294ccBobby Georgescu private void hideCameraButton() { 398d208e12012152bf757c0492cd3bfc91f101294ccBobby Georgescu if (mCameraButton == null) return; 399d208e12012152bf757c0492cd3bfc91f101294ccBobby Georgescu mCameraButton.setVisibility(View.GONE); 400d208e12012152bf757c0492cd3bfc91f101294ccBobby Georgescu } 401d208e12012152bf757c0492cd3bfc91f101294ccBobby Georgescu 402fbdd338d83596ba545a8a7c8105d2ad7b5df56e6Owen Lin private void clearLoadingBit(int loadingBit) { 403fbdd338d83596ba545a8a7c8105d2ad7b5df56e6Owen Lin mLoadingBits &= ~loadingBit; 404d05b0be120bb217b4f56add24a4b31bee92455b2Chih-Chung Chang if (mLoadingBits == 0 && mIsActive) { 405d208e12012152bf757c0492cd3bfc91f101294ccBobby Georgescu if (mAlbumSetDataAdapter.size() == 0) { 40609995299480b797254873319caffd5408624988bBobby Georgescu // If this is not the top of the gallery folder hierarchy, 40709995299480b797254873319caffd5408624988bBobby Georgescu // tell the parent AlbumSetPage instance to handle displaying 40809995299480b797254873319caffd5408624988bBobby Georgescu // the empty album toast, otherwise show it within this 40909995299480b797254873319caffd5408624988bBobby Georgescu // instance 410fbdd338d83596ba545a8a7c8105d2ad7b5df56e6Owen Lin if (mActivity.getStateManager().getStateCount() > 1) { 41109995299480b797254873319caffd5408624988bBobby Georgescu Intent result = new Intent(); 41209995299480b797254873319caffd5408624988bBobby Georgescu result.putExtra(AlbumPage.KEY_EMPTY_ALBUM, true); 41309995299480b797254873319caffd5408624988bBobby Georgescu setStateResult(Activity.RESULT_OK, result); 414fbdd338d83596ba545a8a7c8105d2ad7b5df56e6Owen Lin mActivity.getStateManager().finishState(this); 4155992daf6f4cb56742cbf33a014c5c2c142c6957eBobby Georgescu } else { 41609995299480b797254873319caffd5408624988bBobby Georgescu mShowedEmptyToastForSelf = true; 41709995299480b797254873319caffd5408624988bBobby Georgescu showEmptyAlbumToast(Toast.LENGTH_LONG); 41877fa1d232c1a804d17f3b1ceeaa6ab6c6555b047Bobby Georgescu mSlotView.invalidate(); 419d208e12012152bf757c0492cd3bfc91f101294ccBobby Georgescu showCameraButton(); 420fbdd338d83596ba545a8a7c8105d2ad7b5df56e6Owen Lin } 42109995299480b797254873319caffd5408624988bBobby Georgescu return; 422fbdd338d83596ba545a8a7c8105d2ad7b5df56e6Owen Lin } 423fbdd338d83596ba545a8a7c8105d2ad7b5df56e6Owen Lin } 42409995299480b797254873319caffd5408624988bBobby Georgescu // Hide the empty album toast if we are in the root instance of 42509995299480b797254873319caffd5408624988bBobby Georgescu // AlbumSetPage and the album is no longer empty (for instance, 42609995299480b797254873319caffd5408624988bBobby Georgescu // after a sync is completed and web albums have been synced) 42709995299480b797254873319caffd5408624988bBobby Georgescu if (mShowedEmptyToastForSelf) { 42809995299480b797254873319caffd5408624988bBobby Georgescu mShowedEmptyToastForSelf = false; 42909995299480b797254873319caffd5408624988bBobby Georgescu hideEmptyAlbumToast(); 430d208e12012152bf757c0492cd3bfc91f101294ccBobby Georgescu hideCameraButton(); 4315992daf6f4cb56742cbf33a014c5c2c142c6957eBobby Georgescu } 4325992daf6f4cb56742cbf33a014c5c2c142c6957eBobby Georgescu } 4335992daf6f4cb56742cbf33a014c5c2c142c6957eBobby Georgescu 434fbdd338d83596ba545a8a7c8105d2ad7b5df56e6Owen Lin private void setLoadingBit(int loadingBit) { 435fbdd338d83596ba545a8a7c8105d2ad7b5df56e6Owen Lin mLoadingBits |= loadingBit; 436fbdd338d83596ba545a8a7c8105d2ad7b5df56e6Owen Lin } 437fbdd338d83596ba545a8a7c8105d2ad7b5df56e6Owen Lin 438f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 439f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void onPause() { 440f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin super.onPause(); 441f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mIsActive = false; 442f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mActionModeHandler.pause(); 443f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mAlbumSetDataAdapter.pause(); 444f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mAlbumSetView.pause(); 445f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mEyePosition.pause(); 4464105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen DetailsHelper.pause(); 447fe1625c46f8258be4cd5e5e1ba69b584c1fe1a49Ray Chen // Call disableClusterMenu to avoid receiving callback after paused. 448fe1625c46f8258be4cd5e5e1ba69b584c1fe1a49Ray Chen // Don't hide menu here otherwise the list menu will disappear earlier than 449fe1625c46f8258be4cd5e5e1ba69b584c1fe1a49Ray Chen // the action bar, which is janky and unwanted behavior. 4508cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen mActionBar.disableClusterMenu(false); 45157cbaa1ef40d2215c6400f5ae4af3a09e67abb2dHung-ying Tyan if (mSyncTask != null) { 45257cbaa1ef40d2215c6400f5ae4af3a09e67abb2dHung-ying Tyan mSyncTask.cancel(); 45357cbaa1ef40d2215c6400f5ae4af3a09e67abb2dHung-ying Tyan mSyncTask = null; 454fbdd338d83596ba545a8a7c8105d2ad7b5df56e6Owen Lin clearLoadingBit(BIT_LOADING_SYNC); 45557cbaa1ef40d2215c6400f5ae4af3a09e67abb2dHung-ying Tyan } 456f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 457f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 458f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 459f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void onResume() { 460f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin super.onResume(); 461f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mIsActive = true; 462f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin setContentPane(mRootPane); 463fe49be45412f8d0f68343662318e73822da486c8Owen Lin 464fe49be45412f8d0f68343662318e73822da486c8Owen Lin // Set the reload bit here to prevent it exit this page in clearLoadingBit(). 465fe49be45412f8d0f68343662318e73822da486c8Owen Lin setLoadingBit(BIT_LOADING_RELOAD); 466f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mAlbumSetDataAdapter.resume(); 467fe49be45412f8d0f68343662318e73822da486c8Owen Lin 468f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mAlbumSetView.resume(); 469f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mEyePosition.resume(); 470f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mActionModeHandler.resume(); 4718cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen if (mShowClusterMenu) { 4728cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen mActionBar.enableClusterMenu(mSelectedAction, this); 473dbf4ba12afba115888493caa34937643257e2bb1Ray Chen } 474fbdd338d83596ba545a8a7c8105d2ad7b5df56e6Owen Lin if (!mInitialSynced) { 475fbdd338d83596ba545a8a7c8105d2ad7b5df56e6Owen Lin setLoadingBit(BIT_LOADING_SYNC); 476fe49be45412f8d0f68343662318e73822da486c8Owen Lin mSyncTask = mMediaSet.requestSync(AlbumSetPage.this); 477fbdd338d83596ba545a8a7c8105d2ad7b5df56e6Owen Lin } 478f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 479f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 480f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private void initializeData(Bundle data) { 481f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin String mediaPath = data.getString(AlbumSetPage.KEY_MEDIA_PATH); 482f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mMediaSet = mActivity.getDataManager().getMediaSet(mediaPath); 483f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mSelectionManager.setSourceMediaSet(mMediaSet); 484c3d8ac3b9504346dafc49e006b5f732dd1db21e8Owen Lin mAlbumSetDataAdapter = new AlbumSetDataLoader( 485f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mActivity, mMediaSet, DATA_CACHE_SIZE); 486f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mAlbumSetDataAdapter.setLoadingListener(new MyLoadingListener()); 487f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mAlbumSetView.setModel(mAlbumSetDataAdapter); 488f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 489f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 490f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private void initializeViews() { 491f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mSelectionManager = new SelectionManager(mActivity, true); 492f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mSelectionManager.setSelectionListener(this); 493f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 494b21b8e58a604f6c701245d84b141b5b87663192bOwen Lin mConfig = Config.AlbumSetPage.get(mActivity); 495f0c89374bfc008fb79ac3cb91cfd6d565d203041Bobby Georgescu mSlotView = new SlotView(mActivity, mConfig.slotViewSpec); 496c3d8ac3b9504346dafc49e006b5f732dd1db21e8Owen Lin mAlbumSetView = new AlbumSetSlotRenderer( 497915c2c5b2c367df71599370613af0924bd7c4887Bobby Georgescu mActivity, mSelectionManager, mSlotView, mConfig.labelSpec, 498915c2c5b2c367df71599370613af0924bd7c4887Bobby Georgescu mConfig.placeholderColor); 4997260f6f74d465520e4497b23fe56f98abb0c15a2Owen Lin mSlotView.setSlotRenderer(mAlbumSetView); 5007260f6f74d465520e4497b23fe56f98abb0c15a2Owen Lin mSlotView.setListener(new SlotView.SimpleListener() { 501f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 502bc2154199aee16762e3758ad0cfed685323d9a9fChih-Chung Chang public void onDown(int index) { 503bc2154199aee16762e3758ad0cfed685323d9a9fChih-Chung Chang AlbumSetPage.this.onDown(index); 504bc2154199aee16762e3758ad0cfed685323d9a9fChih-Chung Chang } 505bc2154199aee16762e3758ad0cfed685323d9a9fChih-Chung Chang 506bc2154199aee16762e3758ad0cfed685323d9a9fChih-Chung Chang @Override 50790fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang public void onUp(boolean followedByLongPress) { 50890fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang AlbumSetPage.this.onUp(followedByLongPress); 509bc2154199aee16762e3758ad0cfed685323d9a9fChih-Chung Chang } 510bc2154199aee16762e3758ad0cfed685323d9a9fChih-Chung Chang 511bc2154199aee16762e3758ad0cfed685323d9a9fChih-Chung Chang @Override 512f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void onSingleTapUp(int slotIndex) { 513f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin AlbumSetPage.this.onSingleTapUp(slotIndex); 514f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 515bc2154199aee16762e3758ad0cfed685323d9a9fChih-Chung Chang 516f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 517f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void onLongTap(int slotIndex) { 518f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin AlbumSetPage.this.onLongTap(slotIndex); 519f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 520f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin }); 521f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 522f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mActionModeHandler = new ActionModeHandler(mActivity, mSelectionManager); 523f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mActionModeHandler.setActionModeListener(new ActionModeListener() { 5242341c197b0becf99422e8ad305def77df6161714Owen Lin @Override 525f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public boolean onActionItemClicked(MenuItem item) { 526f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return onItemSelected(item); 527f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 528f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin }); 5297260f6f74d465520e4497b23fe56f98abb0c15a2Owen Lin mRootPane.addComponent(mSlotView); 530f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 531f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 532f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 533f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin protected boolean onCreateActionBar(Menu menu) { 534b21b8e58a604f6c701245d84b141b5b87663192bOwen Lin Activity activity = mActivity; 5352bb717f1ea38e2ce33dd102a23afe6bfacb5675cOwen Lin final boolean inAlbum = mActivity.getStateManager().hasStateClass(AlbumPage.class); 536b21b8e58a604f6c701245d84b141b5b87663192bOwen Lin MenuInflater inflater = getSupportMenuInflater(); 537b21b8e58a604f6c701245d84b141b5b87663192bOwen Lin 538f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (mGetContent) { 539b21b8e58a604f6c701245d84b141b5b87663192bOwen Lin inflater.inflate(R.menu.pickup, menu); 540f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin int typeBits = mData.getInt( 541f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin Gallery.KEY_TYPE_BITS, DataManager.INCLUDE_IMAGE); 5429a93949a6ab6348b1a600496a7d52267620aab95Ahbong Chang mActionBar.setTitle(GalleryUtils.getSelectionModePrompt(typeBits)); 543f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } else if (mGetAlbum) { 544b21b8e58a604f6c701245d84b141b5b87663192bOwen Lin inflater.inflate(R.menu.pickup, menu); 5458cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen mActionBar.setTitle(R.string.select_album); 546f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } else { 547b21b8e58a604f6c701245d84b141b5b87663192bOwen Lin inflater.inflate(R.menu.albumset, menu); 5483fd764008a73dd76be87b02f42d0e00786015c8aBobby Georgescu boolean wasShowingClusterMenu = mShowClusterMenu; 549b5f8d908c5dd287052cd49eddaf1f82d858cca03Ray Chen mShowClusterMenu = !inAlbum; 5502bb717f1ea38e2ce33dd102a23afe6bfacb5675cOwen Lin boolean selectAlbums = !inAlbum && 5512bb717f1ea38e2ce33dd102a23afe6bfacb5675cOwen Lin mActionBar.getClusterTypeAction() == FilterUtils.CLUSTER_BY_ALBUM; 552b21b8e58a604f6c701245d84b141b5b87663192bOwen Lin MenuItem selectItem = menu.findItem(R.id.action_select); 553b21b8e58a604f6c701245d84b141b5b87663192bOwen Lin selectItem.setTitle(activity.getString( 5542bb717f1ea38e2ce33dd102a23afe6bfacb5675cOwen Lin selectAlbums ? R.string.select_album : R.string.select_group)); 555f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 556b21b8e58a604f6c701245d84b141b5b87663192bOwen Lin MenuItem cameraItem = menu.findItem(R.id.action_camera); 557b21b8e58a604f6c701245d84b141b5b87663192bOwen Lin cameraItem.setVisible(GalleryUtils.isCameraAvailable(activity)); 558f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 559b21b8e58a604f6c701245d84b141b5b87663192bOwen Lin FilterUtils.setupMenuItems(mActionBar, mMediaSet.getPath(), false); 5602bb717f1ea38e2ce33dd102a23afe6bfacb5675cOwen Lin 5612bb717f1ea38e2ce33dd102a23afe6bfacb5675cOwen Lin Intent helpIntent = HelpUtils.getHelpIntent(activity, R.string.help_url_gallery_main); 562b21b8e58a604f6c701245d84b141b5b87663192bOwen Lin 563b21b8e58a604f6c701245d84b141b5b87663192bOwen Lin MenuItem helpItem = menu.findItem(R.id.action_general_help); 564b21b8e58a604f6c701245d84b141b5b87663192bOwen Lin helpItem.setVisible(helpIntent != null); 565b21b8e58a604f6c701245d84b141b5b87663192bOwen Lin if (helpIntent != null) helpItem.setIntent(helpIntent); 566b21b8e58a604f6c701245d84b141b5b87663192bOwen Lin 5678cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen mActionBar.setTitle(mTitle); 5688cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen mActionBar.setSubtitle(mSubtitle); 5693fd764008a73dd76be87b02f42d0e00786015c8aBobby Georgescu if (mShowClusterMenu != wasShowingClusterMenu) { 5703fd764008a73dd76be87b02f42d0e00786015c8aBobby Georgescu if (mShowClusterMenu) { 5713fd764008a73dd76be87b02f42d0e00786015c8aBobby Georgescu mActionBar.enableClusterMenu(mSelectedAction, this); 5723fd764008a73dd76be87b02f42d0e00786015c8aBobby Georgescu } else { 5733fd764008a73dd76be87b02f42d0e00786015c8aBobby Georgescu mActionBar.disableClusterMenu(true); 5743fd764008a73dd76be87b02f42d0e00786015c8aBobby Georgescu } 5753fd764008a73dd76be87b02f42d0e00786015c8aBobby Georgescu } 576f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 577b21b8e58a604f6c701245d84b141b5b87663192bOwen Lin return true; 578f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 579f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 580f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 581f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin protected boolean onItemSelected(MenuItem item) { 582b21b8e58a604f6c701245d84b141b5b87663192bOwen Lin Activity activity = mActivity; 583f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin switch (item.getItemId()) { 584bd8e025f1bb39b2be236b183ea8e78f93b308ad1Ray Chen case R.id.action_cancel: 585bd8e025f1bb39b2be236b183ea8e78f93b308ad1Ray Chen activity.setResult(Activity.RESULT_CANCELED); 586bd8e025f1bb39b2be236b183ea8e78f93b308ad1Ray Chen activity.finish(); 587bd8e025f1bb39b2be236b183ea8e78f93b308ad1Ray Chen return true; 588f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin case R.id.action_select: 589f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mSelectionManager.setAutoLeaveSelectionMode(false); 590f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mSelectionManager.enterSelectionMode(); 591f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return true; 592f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin case R.id.action_details: 593f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (mAlbumSetDataAdapter.size() != 0) { 594f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (mShowDetails) { 595f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin hideDetails(); 596f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } else { 597f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin showDetails(); 598f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 599f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } else { 600f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin Toast.makeText(activity, 601f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin activity.getText(R.string.no_albums_alert), 602f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin Toast.LENGTH_SHORT).show(); 603f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 604f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return true; 605f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin case R.id.action_camera: { 606402237b43fd853377e5dba4e048839ad23b99d72Chih-Chung Chang GalleryUtils.startCameraActivity(activity); 607f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return true; 608f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 609f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin case R.id.action_manage_offline: { 6106cf807453fb58ccd4cc513ff187b306c7090e67cOwen Lin Bundle data = new Bundle(); 6116cf807453fb58ccd4cc513ff187b306c7090e67cOwen Lin String mediaPath = mActivity.getDataManager().getTopSetPath( 6126cf807453fb58ccd4cc513ff187b306c7090e67cOwen Lin DataManager.INCLUDE_ALL); 6136cf807453fb58ccd4cc513ff187b306c7090e67cOwen Lin data.putString(AlbumSetPage.KEY_MEDIA_PATH, mediaPath); 6146cf807453fb58ccd4cc513ff187b306c7090e67cOwen Lin mActivity.getStateManager().startState(ManageCachePage.class, data); 615f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return true; 616f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 617f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin case R.id.action_sync_picasa_albums: { 618f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin PicasaSource.requestSync(activity); 619f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return true; 620f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 621f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin case R.id.action_settings: { 622f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin activity.startActivity(new Intent(activity, GallerySettings.class)); 623f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return true; 624f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 625f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin default: 626f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return false; 627f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 628f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 629f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 630f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 631f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin protected void onStateResult(int requestCode, int resultCode, Intent data) { 63209995299480b797254873319caffd5408624988bBobby Georgescu if (data != null && data.getBooleanExtra(AlbumPage.KEY_EMPTY_ALBUM, false)) { 63309995299480b797254873319caffd5408624988bBobby Georgescu showEmptyAlbumToast(Toast.LENGTH_SHORT); 63409995299480b797254873319caffd5408624988bBobby Georgescu } 635f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin switch (requestCode) { 636f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin case REQUEST_DO_ANIMATION: { 6372341c197b0becf99422e8ad305def77df6161714Owen Lin mSlotView.startRisingAnimation(); 638f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 639f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 640f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 641f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 642f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private String getSelectedString() { 643f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin int count = mSelectionManager.getSelectedCount(); 6448cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen int action = mActionBar.getClusterTypeAction(); 645f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin int string = action == FilterUtils.CLUSTER_BY_ALBUM 646f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin ? R.plurals.number_of_albums_selected 647f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin : R.plurals.number_of_groups_selected; 648f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin String format = mActivity.getResources().getQuantityString(string, count); 649f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return String.format(format, count); 650f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 651f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 6522341c197b0becf99422e8ad305def77df6161714Owen Lin @Override 653f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void onSelectionModeChange(int mode) { 654f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin switch (mode) { 655f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin case SelectionManager.ENTER_SELECTION_MODE: { 6568cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen mActionBar.disableClusterMenu(true); 6572bb717f1ea38e2ce33dd102a23afe6bfacb5675cOwen Lin mActionModeHandler.startActionMode(); 6582bb717f1ea38e2ce33dd102a23afe6bfacb5675cOwen Lin if (mHapticsEnabled) mVibrator.vibrate(100); 659f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin break; 660f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 661f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin case SelectionManager.LEAVE_SELECTION_MODE: { 6622bb717f1ea38e2ce33dd102a23afe6bfacb5675cOwen Lin mActionModeHandler.finishActionMode(); 6639c21268fa8d394cca6cab78dd023a52e0b147a6eRay Chen if (mShowClusterMenu) { 6648cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen mActionBar.enableClusterMenu(mSelectedAction, this); 6659c21268fa8d394cca6cab78dd023a52e0b147a6eRay Chen } 666f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mRootPane.invalidate(); 667f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin break; 668f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 669f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin case SelectionManager.SELECT_ALL_MODE: { 67021c2e665fdc1d1af0c91ab9c104d13fb7dc2444eRay Chen mActionModeHandler.updateSupportedOperation(); 671f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mRootPane.invalidate(); 672f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin break; 673f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 674f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 675f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 676f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 6772341c197b0becf99422e8ad305def77df6161714Owen Lin @Override 678f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void onSelectionChange(Path path, boolean selected) { 679f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mActionModeHandler.setTitle(getSelectedString()); 680f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mActionModeHandler.updateSupportedOperation(path, selected); 681f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 682f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 683f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private void hideDetails() { 684f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mShowDetails = false; 6854105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen mDetailsHelper.hide(); 68631cac30e46a293f6d0901e22c6ab0d083cae7021Owen Lin mAlbumSetView.setHighlightItemPath(null); 6877260f6f74d465520e4497b23fe56f98abb0c15a2Owen Lin mSlotView.invalidate(); 688f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 689f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 690f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private void showDetails() { 691f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mShowDetails = true; 6924105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen if (mDetailsHelper == null) { 6934105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen mDetailsHelper = new DetailsHelper(mActivity, mRootPane, mDetailsSource); 6944105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen mDetailsHelper.setCloseListener(new CloseListener() { 6952341c197b0becf99422e8ad305def77df6161714Owen Lin @Override 696f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void onClose() { 697f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin hideDetails(); 698f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 699f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin }); 700f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 7014105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen mDetailsHelper.show(); 702f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 703f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 70457cbaa1ef40d2215c6400f5ae4af3a09e67abb2dHung-ying Tyan @Override 70557cbaa1ef40d2215c6400f5ae4af3a09e67abb2dHung-ying Tyan public void onSyncDone(final MediaSet mediaSet, final int resultCode) { 70657cbaa1ef40d2215c6400f5ae4af3a09e67abb2dHung-ying Tyan if (resultCode == MediaSet.SYNC_RESULT_ERROR) { 70757cbaa1ef40d2215c6400f5ae4af3a09e67abb2dHung-ying Tyan Log.d(TAG, "onSyncDone: " + Utils.maskDebugInfo(mediaSet.getName()) + " result=" 70857cbaa1ef40d2215c6400f5ae4af3a09e67abb2dHung-ying Tyan + resultCode); 70957cbaa1ef40d2215c6400f5ae4af3a09e67abb2dHung-ying Tyan } 71057cbaa1ef40d2215c6400f5ae4af3a09e67abb2dHung-ying Tyan ((Activity) mActivity).runOnUiThread(new Runnable() { 71157cbaa1ef40d2215c6400f5ae4af3a09e67abb2dHung-ying Tyan @Override 71257cbaa1ef40d2215c6400f5ae4af3a09e67abb2dHung-ying Tyan public void run() { 71371632ac6c1596dd1fd477f95e268f96ad72ea572Owen Lin GLRoot root = mActivity.getGLRoot(); 71471632ac6c1596dd1fd477f95e268f96ad72ea572Owen Lin root.lockRenderThread(); 71571632ac6c1596dd1fd477f95e268f96ad72ea572Owen Lin try { 71671632ac6c1596dd1fd477f95e268f96ad72ea572Owen Lin if (resultCode == MediaSet.SYNC_RESULT_SUCCESS) { 71771632ac6c1596dd1fd477f95e268f96ad72ea572Owen Lin mInitialSynced = true; 71871632ac6c1596dd1fd477f95e268f96ad72ea572Owen Lin } 71971632ac6c1596dd1fd477f95e268f96ad72ea572Owen Lin clearLoadingBit(BIT_LOADING_SYNC); 72071632ac6c1596dd1fd477f95e268f96ad72ea572Owen Lin if (resultCode == MediaSet.SYNC_RESULT_ERROR && mIsActive) { 721e8c1e69f85efb8673d0606f3aca729a366038753Ray Chen Log.w(TAG, "failed to load album set"); 72271632ac6c1596dd1fd477f95e268f96ad72ea572Owen Lin } 72371632ac6c1596dd1fd477f95e268f96ad72ea572Owen Lin } finally { 72471632ac6c1596dd1fd477f95e268f96ad72ea572Owen Lin root.unlockRenderThread(); 72557cbaa1ef40d2215c6400f5ae4af3a09e67abb2dHung-ying Tyan } 72657cbaa1ef40d2215c6400f5ae4af3a09e67abb2dHung-ying Tyan } 72757cbaa1ef40d2215c6400f5ae4af3a09e67abb2dHung-ying Tyan }); 72857cbaa1ef40d2215c6400f5ae4af3a09e67abb2dHung-ying Tyan } 72957cbaa1ef40d2215c6400f5ae4af3a09e67abb2dHung-ying Tyan 730f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private class MyLoadingListener implements LoadingListener { 7312341c197b0becf99422e8ad305def77df6161714Owen Lin @Override 732f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void onLoadingStarted() { 733fbdd338d83596ba545a8a7c8105d2ad7b5df56e6Owen Lin setLoadingBit(BIT_LOADING_RELOAD); 734f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 735f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 7362341c197b0becf99422e8ad305def77df6161714Owen Lin @Override 73705da3f520eacb9219964b6ed57ef37846d889fd7Hung-ying Tyan public void onLoadingFinished(boolean loadingFailed) { 738fbdd338d83596ba545a8a7c8105d2ad7b5df56e6Owen Lin clearLoadingBit(BIT_LOADING_RELOAD); 739f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 740f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 741f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 7424105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen private class MyDetailsSource implements DetailsHelper.DetailsSource { 743f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private int mIndex; 7442341c197b0becf99422e8ad305def77df6161714Owen Lin 7452341c197b0becf99422e8ad305def77df6161714Owen Lin @Override 746f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public int size() { 747f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return mAlbumSetDataAdapter.size(); 748f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 749f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 7502341c197b0becf99422e8ad305def77df6161714Owen Lin @Override 751995c4566bed7df1aa48ba7e1351f964efa73880bMichael Kolb public int setIndex() { 752995c4566bed7df1aa48ba7e1351f964efa73880bMichael Kolb Path id = mSelectionManager.getSelected(false).get(0); 753995c4566bed7df1aa48ba7e1351f964efa73880bMichael Kolb mIndex = mAlbumSetDataAdapter.findSet(id); 754f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return mIndex; 755f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 756f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 7572341c197b0becf99422e8ad305def77df6161714Owen Lin @Override 758f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public MediaDetails getDetails() { 759f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin MediaObject item = mAlbumSetDataAdapter.getMediaSet(mIndex); 760f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (item != null) { 76131cac30e46a293f6d0901e22c6ab0d083cae7021Owen Lin mAlbumSetView.setHighlightItemPath(item.getPath()); 762f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return item.getDetails(); 763f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } else { 764f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return null; 765f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 766f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 767f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 768f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin} 769