AlbumSetPage.java revision 1336062985c9824d7fd796b1cebd5eaa8e4163ca
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; 40f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.data.MediaObject; 41f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.data.MediaSet; 42f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.data.Path; 43f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.picasasource.PicasaSource; 44f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.settings.GallerySettings; 45f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.ui.ActionModeHandler; 46f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.ui.ActionModeHandler.ActionModeListener; 47c3d8ac3b9504346dafc49e006b5f732dd1db21e8Owen Linimport com.android.gallery3d.ui.AlbumSetSlotRenderer; 484105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chenimport com.android.gallery3d.ui.DetailsHelper; 494105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chenimport com.android.gallery3d.ui.DetailsHelper.CloseListener; 5090fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huangimport com.android.gallery3d.ui.FadeTexture; 51f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.ui.GLCanvas; 5271632ac6c1596dd1fd477f95e268f96ad72ea572Owen Linimport com.android.gallery3d.ui.GLRoot; 53f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.ui.GLView; 5451bc561e85053abfd7fda695e3cd20710acca85cBobby Georgescuimport com.android.gallery3d.ui.PreparePageFadeoutTexture; 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; 6309995299480b797254873319caffd5408624988bBobby Georgescu 64f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linpublic class AlbumSetPage extends ActivityState implements 65f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin SelectionManager.SelectionListener, GalleryActionBar.ClusterRunner, 6657cbaa1ef40d2215c6400f5ae4af3a09e67abb2dHung-ying Tyan EyePosition.EyePositionListener, MediaSet.SyncListener { 67f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @SuppressWarnings("unused") 68f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private static final String TAG = "AlbumSetPage"; 69f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 7090fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang private static final int MSG_PICK_ALBUM = 1; 7190fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang 72f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public static final String KEY_MEDIA_PATH = "media-path"; 73f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public static final String KEY_SET_TITLE = "set-title"; 74f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public static final String KEY_SET_SUBTITLE = "set-subtitle"; 75b5f8d908c5dd287052cd49eddaf1f82d858cca03Ray Chen public static final String KEY_SELECTED_CLUSTER_TYPE = "selected-cluster"; 766cf807453fb58ccd4cc513ff187b306c7090e67cOwen Lin 77f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private static final int DATA_CACHE_SIZE = 256; 78f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private static final int REQUEST_DO_ANIMATION = 1; 79f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 80fbdd338d83596ba545a8a7c8105d2ad7b5df56e6Owen Lin private static final int BIT_LOADING_RELOAD = 1; 81fbdd338d83596ba545a8a7c8105d2ad7b5df56e6Owen Lin private static final int BIT_LOADING_SYNC = 2; 82fbdd338d83596ba545a8a7c8105d2ad7b5df56e6Owen Lin 83f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private boolean mIsActive = false; 847260f6f74d465520e4497b23fe56f98abb0c15a2Owen Lin private SlotView mSlotView; 85c3d8ac3b9504346dafc49e006b5f732dd1db21e8Owen Lin private AlbumSetSlotRenderer mAlbumSetView; 86f0c89374bfc008fb79ac3cb91cfd6d565d203041Bobby Georgescu private Config.AlbumSetPage mConfig; 87f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 88f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private MediaSet mMediaSet; 899c21268fa8d394cca6cab78dd023a52e0b147a6eRay Chen private String mTitle; 90f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private String mSubtitle; 91b5f8d908c5dd287052cd49eddaf1f82d858cca03Ray Chen private boolean mShowClusterMenu; 928cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen private GalleryActionBar mActionBar; 93b5f8d908c5dd287052cd49eddaf1f82d858cca03Ray Chen private int mSelectedAction; 941f4e6d14bba7290ea0268fbde28ffc664d4f7004Ray Chen private Vibrator mVibrator; 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 131ff951a85c3c9015ef7ccd8902e69ce88360a0cb8Chih-Chung Chang protected void renderBackground(GLCanvas view) { 132915c2c5b2c367df71599370613af0924bd7c4887Bobby Georgescu view.clearBuffer(getBackgroundColor()); 133ff951a85c3c9015ef7ccd8902e69ce88360a0cb8Chih-Chung Chang } 134ff951a85c3c9015ef7ccd8902e69ce88360a0cb8Chih-Chung Chang 135ff951a85c3c9015ef7ccd8902e69ce88360a0cb8Chih-Chung Chang @Override 136f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin protected void onLayout( 137f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin boolean changed, int left, int top, int right, int bottom) { 138f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mEyePosition.resetPosition(); 139f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 140f0c89374bfc008fb79ac3cb91cfd6d565d203041Bobby Georgescu int slotViewTop = mActionBar.getHeight() + mConfig.paddingTop; 141f0c89374bfc008fb79ac3cb91cfd6d565d203041Bobby Georgescu int slotViewBottom = bottom - top - mConfig.paddingBottom; 142f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin int slotViewRight = right - left; 143f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 144f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (mShowDetails) { 1454105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen mDetailsHelper.layout(left, slotViewTop, right, bottom); 146f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } else { 14731cac30e46a293f6d0901e22c6ab0d083cae7021Owen Lin mAlbumSetView.setHighlightItemPath(null); 148f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 149f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 1507260f6f74d465520e4497b23fe56f98abb0c15a2Owen Lin mSlotView.layout(0, slotViewTop, slotViewRight, slotViewBottom); 151f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 152f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 153f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 154f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin protected void render(GLCanvas canvas) { 155f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin canvas.save(GLCanvas.SAVE_FLAG_MATRIX); 156f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin GalleryUtils.setViewPointMatrix(mMatrix, 157f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin getWidth() / 2 + mX, getHeight() / 2 + mY, mZ); 158f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin canvas.multiplyMatrix(mMatrix, 0); 159f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin super.render(canvas); 160f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin canvas.restore(); 161f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 162f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin }; 163f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 164f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 165f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void onEyePositionChanged(float x, float y, float z) { 166f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mRootPane.lockRendering(); 167f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mX = x; 168f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mY = y; 169f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mZ = z; 170f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mRootPane.unlockRendering(); 171f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mRootPane.invalidate(); 172f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 173f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 174f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 175f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void onBackPressed() { 176f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (mShowDetails) { 177f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin hideDetails(); 178f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } else if (mSelectionManager.inSelectionMode()) { 179f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mSelectionManager.leaveSelectionMode(); 180f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } else { 181f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin super.onBackPressed(); 182f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 183f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 184f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 1852341c197b0becf99422e8ad305def77df6161714Owen Lin private void getSlotCenter(int slotIndex, int center[]) { 186f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin Rect offset = new Rect(); 1877260f6f74d465520e4497b23fe56f98abb0c15a2Owen Lin mRootPane.getBoundsOf(mSlotView, offset); 1887260f6f74d465520e4497b23fe56f98abb0c15a2Owen Lin Rect r = mSlotView.getSlotRect(slotIndex); 1897260f6f74d465520e4497b23fe56f98abb0c15a2Owen Lin int scrollX = mSlotView.getScrollX(); 1907260f6f74d465520e4497b23fe56f98abb0c15a2Owen Lin int scrollY = mSlotView.getScrollY(); 191f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin center[0] = offset.left + (r.left + r.right) / 2 - scrollX; 192f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin center[1] = offset.top + (r.top + r.bottom) / 2 - scrollY; 193f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 194f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 195f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void onSingleTapUp(int slotIndex) { 196cf06397b2bc65335fb97d5788f18cad4897126a2Owen Lin if (!mIsActive) return; 19790fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang 19890fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang if (mSelectionManager.inSelectionMode()) { 19990fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang MediaSet targetSet = mAlbumSetDataAdapter.getMediaSet(slotIndex); 20090fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang if (targetSet == null) return; // Content is dirty, we shall reload soon 20190fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang mSelectionManager.toggle(targetSet.getPath()); 20290fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang mSlotView.invalidate(); 20390fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang } else { 20490fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang // Show pressed-up animation for the single-tap. 20590fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang mAlbumSetView.setPressedIndex(slotIndex); 20690fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang mAlbumSetView.setPressedUp(); 20790fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang mHandler.sendMessageDelayed(mHandler.obtainMessage(MSG_PICK_ALBUM, slotIndex, 0), 20890fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang FadeTexture.DURATION); 20990fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang } 21090fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang } 21190fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang 2127eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu private static boolean albumShouldOpenInFilmstrip(MediaSet album) { 213b265ebb01cc046b74329eeb28dbecb24e0f953d2Bobby Georgescu int itemCount = album.getMediaItemCount(); 214b265ebb01cc046b74329eeb28dbecb24e0f953d2Bobby Georgescu return (album.isCameraRoll() && itemCount > 0) || itemCount == 1; 2157eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu } 2167eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu 21709995299480b797254873319caffd5408624988bBobby Georgescu WeakReference<Toast> mEmptyAlbumToast = null; 21809995299480b797254873319caffd5408624988bBobby Georgescu 21909995299480b797254873319caffd5408624988bBobby Georgescu private void showEmptyAlbumToast(int toastLength) { 22009995299480b797254873319caffd5408624988bBobby Georgescu Toast toast; 22109995299480b797254873319caffd5408624988bBobby Georgescu if (mEmptyAlbumToast != null) { 22209995299480b797254873319caffd5408624988bBobby Georgescu toast = mEmptyAlbumToast.get(); 22309995299480b797254873319caffd5408624988bBobby Georgescu if (toast != null) { 22409995299480b797254873319caffd5408624988bBobby Georgescu toast.show(); 22509995299480b797254873319caffd5408624988bBobby Georgescu return; 22609995299480b797254873319caffd5408624988bBobby Georgescu } 22709995299480b797254873319caffd5408624988bBobby Georgescu } 22809995299480b797254873319caffd5408624988bBobby Georgescu toast = Toast.makeText(mActivity, R.string.empty_album, toastLength); 22909995299480b797254873319caffd5408624988bBobby Georgescu mEmptyAlbumToast = new WeakReference<Toast>(toast); 23009995299480b797254873319caffd5408624988bBobby Georgescu toast.show(); 23109995299480b797254873319caffd5408624988bBobby Georgescu } 23209995299480b797254873319caffd5408624988bBobby Georgescu 23309995299480b797254873319caffd5408624988bBobby Georgescu private void hideEmptyAlbumToast() { 23409995299480b797254873319caffd5408624988bBobby Georgescu if (mEmptyAlbumToast != null) { 23509995299480b797254873319caffd5408624988bBobby Georgescu Toast toast = mEmptyAlbumToast.get(); 23609995299480b797254873319caffd5408624988bBobby Georgescu if (toast != null) toast.cancel(); 23709995299480b797254873319caffd5408624988bBobby Georgescu } 23809995299480b797254873319caffd5408624988bBobby Georgescu } 23909995299480b797254873319caffd5408624988bBobby Georgescu 24090fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang private void pickAlbum(int slotIndex) { 24190fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang if (!mIsActive) return; 24290fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang 243f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin MediaSet targetSet = mAlbumSetDataAdapter.getMediaSet(slotIndex); 244f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (targetSet == null) return; // Content is dirty, we shall reload soon 24509995299480b797254873319caffd5408624988bBobby Georgescu if (targetSet.getTotalMediaItemCount() == 0) { 24609995299480b797254873319caffd5408624988bBobby Georgescu showEmptyAlbumToast(Toast.LENGTH_SHORT); 24709995299480b797254873319caffd5408624988bBobby Georgescu return; 24809995299480b797254873319caffd5408624988bBobby Georgescu } 24909995299480b797254873319caffd5408624988bBobby Georgescu hideEmptyAlbumToast(); 25009995299480b797254873319caffd5408624988bBobby Georgescu 25190fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang String mediaPath = targetSet.getPath().toString(); 252f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 25390fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang Bundle data = new Bundle(getData()); 25490fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang int[] center = new int[2]; 25590fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang getSlotCenter(slotIndex, center); 25690fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang data.putIntArray(AlbumPage.KEY_SET_CENTER, center); 25790fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang if (mGetAlbum && targetSet.isLeafAlbum()) { 258b21b8e58a604f6c701245d84b141b5b87663192bOwen Lin Activity activity = mActivity; 25990fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang Intent result = new Intent() 26090fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang .putExtra(AlbumPicker.KEY_ALBUM_PATH, targetSet.getPath().toString()); 26190fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang activity.setResult(Activity.RESULT_OK, result); 26290fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang activity.finish(); 26390fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang } else if (targetSet.getSubMediaSetCount() > 0) { 26490fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang data.putString(AlbumSetPage.KEY_MEDIA_PATH, mediaPath); 26590fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang mActivity.getStateManager().startStateForResult( 26690fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang AlbumSetPage.class, REQUEST_DO_ANIMATION, data); 267f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } else { 26890fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang if (!mGetContent && (targetSet.getSupportedOperations() 26990fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang & MediaObject.SUPPORT_IMPORT) != 0) { 27090fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang data.putBoolean(AlbumPage.KEY_AUTO_SELECT_ALL, true); 27110d8759b5b4d0cf0351bce929eb7b6420aabbfd9Owen Lin } else if (!mGetContent && albumShouldOpenInFilmstrip(targetSet)) { 2727077701c8b11f6022cc712f5450e0f7b29535e41Bobby Georgescu PreparePageFadeoutTexture.prepareFadeOutTexture(mActivity, mRootPane); 2736b64c0670429a41b1fabb36e679a36b7e6fa9194Bobby Georgescu data.putParcelable(PhotoPage.KEY_OPEN_ANIMATION_RECT, 2746b64c0670429a41b1fabb36e679a36b7e6fa9194Bobby Georgescu mSlotView.getSlotRect(slotIndex, mRootPane)); 2757eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu data.putInt(PhotoPage.KEY_INDEX_HINT, 0); 2767eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu data.putString(PhotoPage.KEY_MEDIA_SET_PATH, 2777eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu mediaPath); 2787eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu data.putBoolean(PhotoPage.KEY_START_IN_FILMSTRIP, true); 2797eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu mActivity.getStateManager().startStateForResult( 2807eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu PhotoPage.class, AlbumPage.REQUEST_PHOTO, data); 2817eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu return; 28290fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang } 28390fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang data.putString(AlbumPage.KEY_MEDIA_PATH, mediaPath); 2847eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu 28590fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang // We only show cluster menu in the first AlbumPage in stack 2867eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu boolean inAlbum = mActivity.getStateManager().hasStateClass(AlbumPage.class); 28790fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang data.putBoolean(AlbumPage.KEY_SHOW_CLUSTER_MENU, !inAlbum); 28890fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang mActivity.getStateManager().startStateForResult( 28990fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang AlbumPage.class, REQUEST_DO_ANIMATION, data); 290f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 291f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 292f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 293bc2154199aee16762e3758ad0cfed685323d9a9fChih-Chung Chang private void onDown(int index) { 29431cac30e46a293f6d0901e22c6ab0d083cae7021Owen Lin mAlbumSetView.setPressedIndex(index); 295bc2154199aee16762e3758ad0cfed685323d9a9fChih-Chung Chang } 296bc2154199aee16762e3758ad0cfed685323d9a9fChih-Chung Chang 29790fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang private void onUp(boolean followedByLongPress) { 29890fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang if (followedByLongPress) { 29990fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang // Avoid showing press-up animations for long-press. 30090fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang mAlbumSetView.setPressedIndex(-1); 30190fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang } else { 30290fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang mAlbumSetView.setPressedUp(); 30390fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang } 304bc2154199aee16762e3758ad0cfed685323d9a9fChih-Chung Chang } 305bc2154199aee16762e3758ad0cfed685323d9a9fChih-Chung Chang 306f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void onLongTap(int slotIndex) { 307f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (mGetContent || mGetAlbum) return; 30890fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang MediaSet set = mAlbumSetDataAdapter.getMediaSet(slotIndex); 30990fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang if (set == null) return; 31090fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang mSelectionManager.setAutoLeaveSelectionMode(true); 31190fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang mSelectionManager.toggle(set.getPath()); 31290fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang mSlotView.invalidate(); 313f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 314f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 3152341c197b0becf99422e8ad305def77df6161714Owen Lin @Override 316f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void doCluster(int clusterType) { 317f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin String basePath = mMediaSet.getPath().toString(); 318f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin String newPath = FilterUtils.switchClusterPath(basePath, clusterType); 319f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin Bundle data = new Bundle(getData()); 320f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin data.putString(AlbumSetPage.KEY_MEDIA_PATH, newPath); 321b5f8d908c5dd287052cd49eddaf1f82d858cca03Ray Chen data.putInt(KEY_SELECTED_CLUSTER_TYPE, clusterType); 322f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mActivity.getStateManager().switchState(this, AlbumSetPage.class, data); 323f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 324f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 325f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 326f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void onCreate(Bundle data, Bundle restoreState) { 32745c56f2d34c71d0bc9b84ebeef6d1314738d0fc0Bobby Georgescu super.onCreate(data, restoreState); 328f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin initializeViews(); 329f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin initializeData(data); 3301f4e6d14bba7290ea0268fbde28ffc664d4f7004Ray Chen Context context = mActivity.getAndroidContext(); 331f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mGetContent = data.getBoolean(Gallery.KEY_GET_CONTENT, false); 332f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mGetAlbum = data.getBoolean(Gallery.KEY_GET_ALBUM, false); 3339c21268fa8d394cca6cab78dd023a52e0b147a6eRay Chen mTitle = data.getString(AlbumSetPage.KEY_SET_TITLE); 334f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mSubtitle = data.getString(AlbumSetPage.KEY_SET_SUBTITLE); 3351f4e6d14bba7290ea0268fbde28ffc664d4f7004Ray Chen mEyePosition = new EyePosition(context, this); 3364105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen mDetailsSource = new MyDetailsSource(); 3371f4e6d14bba7290ea0268fbde28ffc664d4f7004Ray Chen mVibrator = (Vibrator) context.getSystemService(Context.VIBRATOR_SERVICE); 3388cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen mActionBar = mActivity.getGalleryActionBar(); 3398cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen mSelectedAction = data.getInt(AlbumSetPage.KEY_SELECTED_CLUSTER_TYPE, 3408cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen FilterUtils.CLUSTER_BY_ALBUM); 34190fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang 34290fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang mHandler = new SynchronizedHandler(mActivity.getGLRoot()) { 34390fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang @Override 34490fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang public void handleMessage(Message message) { 34590fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang switch (message.what) { 34690fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang case MSG_PICK_ALBUM: { 34790fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang pickAlbum(message.arg1); 34890fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang break; 34990fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang } 35090fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang default: throw new AssertionError(message.what); 35190fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang } 35290fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang } 35390fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang }; 354f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 355f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 356d208e12012152bf757c0492cd3bfc91f101294ccBobby Georgescu @Override 357d208e12012152bf757c0492cd3bfc91f101294ccBobby Georgescu public void onDestroy() { 358d208e12012152bf757c0492cd3bfc91f101294ccBobby Georgescu cleanupCameraButton(); 359d208e12012152bf757c0492cd3bfc91f101294ccBobby Georgescu super.onDestroy(); 360d208e12012152bf757c0492cd3bfc91f101294ccBobby Georgescu } 361d208e12012152bf757c0492cd3bfc91f101294ccBobby Georgescu 362d208e12012152bf757c0492cd3bfc91f101294ccBobby Georgescu private boolean setupCameraButton() { 363d208e12012152bf757c0492cd3bfc91f101294ccBobby Georgescu RelativeLayout galleryRoot = (RelativeLayout) ((Activity) mActivity) 364d208e12012152bf757c0492cd3bfc91f101294ccBobby Georgescu .findViewById(R.id.gallery_root); 365d208e12012152bf757c0492cd3bfc91f101294ccBobby Georgescu if (galleryRoot == null) return false; 366d208e12012152bf757c0492cd3bfc91f101294ccBobby Georgescu 367d208e12012152bf757c0492cd3bfc91f101294ccBobby Georgescu mCameraButton = new Button(mActivity); 368d208e12012152bf757c0492cd3bfc91f101294ccBobby Georgescu mCameraButton.setText(R.string.camera_label); 3698cfc7f0ce4bed1538b85b40fe08a5528cac8c270Bobby Georgescu mCameraButton.setCompoundDrawablesWithIntrinsicBounds(0, R.drawable.frame_overlay_gallery_camera, 0, 0); 370d208e12012152bf757c0492cd3bfc91f101294ccBobby Georgescu mCameraButton.setOnClickListener(new OnClickListener() { 371d208e12012152bf757c0492cd3bfc91f101294ccBobby Georgescu @Override 372d208e12012152bf757c0492cd3bfc91f101294ccBobby Georgescu public void onClick(View arg0) { 373d208e12012152bf757c0492cd3bfc91f101294ccBobby Georgescu GalleryUtils.startCameraActivity(mActivity); 374d208e12012152bf757c0492cd3bfc91f101294ccBobby Georgescu } 375d208e12012152bf757c0492cd3bfc91f101294ccBobby Georgescu }); 376d208e12012152bf757c0492cd3bfc91f101294ccBobby Georgescu RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams( 377d208e12012152bf757c0492cd3bfc91f101294ccBobby Georgescu RelativeLayout.LayoutParams.WRAP_CONTENT, 378d208e12012152bf757c0492cd3bfc91f101294ccBobby Georgescu RelativeLayout.LayoutParams.WRAP_CONTENT); 379d208e12012152bf757c0492cd3bfc91f101294ccBobby Georgescu lp.addRule(RelativeLayout.CENTER_IN_PARENT); 380d208e12012152bf757c0492cd3bfc91f101294ccBobby Georgescu galleryRoot.addView(mCameraButton, lp); 381d208e12012152bf757c0492cd3bfc91f101294ccBobby Georgescu return true; 382d208e12012152bf757c0492cd3bfc91f101294ccBobby Georgescu } 383d208e12012152bf757c0492cd3bfc91f101294ccBobby Georgescu 384d208e12012152bf757c0492cd3bfc91f101294ccBobby Georgescu private void cleanupCameraButton() { 385d208e12012152bf757c0492cd3bfc91f101294ccBobby Georgescu if (mCameraButton == null) return; 386d208e12012152bf757c0492cd3bfc91f101294ccBobby Georgescu RelativeLayout galleryRoot = (RelativeLayout) ((Activity) mActivity) 387d208e12012152bf757c0492cd3bfc91f101294ccBobby Georgescu .findViewById(R.id.gallery_root); 388d208e12012152bf757c0492cd3bfc91f101294ccBobby Georgescu if (galleryRoot == null) return; 389d208e12012152bf757c0492cd3bfc91f101294ccBobby Georgescu galleryRoot.removeView(mCameraButton); 390d208e12012152bf757c0492cd3bfc91f101294ccBobby Georgescu mCameraButton = null; 391d208e12012152bf757c0492cd3bfc91f101294ccBobby Georgescu } 392d208e12012152bf757c0492cd3bfc91f101294ccBobby Georgescu 393d208e12012152bf757c0492cd3bfc91f101294ccBobby Georgescu private void showCameraButton() { 394d208e12012152bf757c0492cd3bfc91f101294ccBobby Georgescu if (mCameraButton == null && !setupCameraButton()) return; 395d208e12012152bf757c0492cd3bfc91f101294ccBobby Georgescu mCameraButton.setVisibility(View.VISIBLE); 396d208e12012152bf757c0492cd3bfc91f101294ccBobby Georgescu } 397d208e12012152bf757c0492cd3bfc91f101294ccBobby Georgescu 398d208e12012152bf757c0492cd3bfc91f101294ccBobby Georgescu private void hideCameraButton() { 399d208e12012152bf757c0492cd3bfc91f101294ccBobby Georgescu if (mCameraButton == null) return; 400d208e12012152bf757c0492cd3bfc91f101294ccBobby Georgescu mCameraButton.setVisibility(View.GONE); 401d208e12012152bf757c0492cd3bfc91f101294ccBobby Georgescu } 402d208e12012152bf757c0492cd3bfc91f101294ccBobby Georgescu 403fbdd338d83596ba545a8a7c8105d2ad7b5df56e6Owen Lin private void clearLoadingBit(int loadingBit) { 404fbdd338d83596ba545a8a7c8105d2ad7b5df56e6Owen Lin mLoadingBits &= ~loadingBit; 405d05b0be120bb217b4f56add24a4b31bee92455b2Chih-Chung Chang if (mLoadingBits == 0 && mIsActive) { 406d208e12012152bf757c0492cd3bfc91f101294ccBobby Georgescu if (mAlbumSetDataAdapter.size() == 0) { 40709995299480b797254873319caffd5408624988bBobby Georgescu // If this is not the top of the gallery folder hierarchy, 40809995299480b797254873319caffd5408624988bBobby Georgescu // tell the parent AlbumSetPage instance to handle displaying 40909995299480b797254873319caffd5408624988bBobby Georgescu // the empty album toast, otherwise show it within this 41009995299480b797254873319caffd5408624988bBobby Georgescu // instance 411fbdd338d83596ba545a8a7c8105d2ad7b5df56e6Owen Lin if (mActivity.getStateManager().getStateCount() > 1) { 41209995299480b797254873319caffd5408624988bBobby Georgescu Intent result = new Intent(); 41309995299480b797254873319caffd5408624988bBobby Georgescu result.putExtra(AlbumPage.KEY_EMPTY_ALBUM, true); 41409995299480b797254873319caffd5408624988bBobby Georgescu setStateResult(Activity.RESULT_OK, result); 415fbdd338d83596ba545a8a7c8105d2ad7b5df56e6Owen Lin mActivity.getStateManager().finishState(this); 4165992daf6f4cb56742cbf33a014c5c2c142c6957eBobby Georgescu } else { 41709995299480b797254873319caffd5408624988bBobby Georgescu mShowedEmptyToastForSelf = true; 41809995299480b797254873319caffd5408624988bBobby Georgescu showEmptyAlbumToast(Toast.LENGTH_LONG); 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 737f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void onLoadingFinished() { 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