AlbumSetPage.java revision 7260f6f74d465520e4497b23fe56f98abb0c15a2
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;
211f4e6d14bba7290ea0268fbde28ffc664d4f7004Ray Chenimport android.content.Intent;
221f4e6d14bba7290ea0268fbde28ffc664d4f7004Ray Chenimport android.graphics.Rect;
231f4e6d14bba7290ea0268fbde28ffc664d4f7004Ray Chenimport android.os.Bundle;
241f4e6d14bba7290ea0268fbde28ffc664d4f7004Ray Chenimport android.os.Vibrator;
251f4e6d14bba7290ea0268fbde28ffc664d4f7004Ray Chenimport android.provider.MediaStore;
261f4e6d14bba7290ea0268fbde28ffc664d4f7004Ray Chenimport android.view.ActionMode;
271f4e6d14bba7290ea0268fbde28ffc664d4f7004Ray Chenimport android.view.Menu;
281f4e6d14bba7290ea0268fbde28ffc664d4f7004Ray Chenimport android.view.MenuInflater;
291f4e6d14bba7290ea0268fbde28ffc664d4f7004Ray Chenimport android.view.MenuItem;
301f4e6d14bba7290ea0268fbde28ffc664d4f7004Ray Chenimport android.widget.Toast;
311f4e6d14bba7290ea0268fbde28ffc664d4f7004Ray Chen
32f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.R;
33f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.common.Utils;
34f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.data.DataManager;
35f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.data.MediaDetails;
36f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.data.MediaObject;
37f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.data.MediaSet;
38f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.data.Path;
39f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.picasasource.PicasaSource;
40f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.settings.GallerySettings;
41f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.ui.ActionModeHandler;
42f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.ui.ActionModeHandler.ActionModeListener;
43f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.ui.AlbumSetView;
444105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chenimport com.android.gallery3d.ui.DetailsHelper;
454105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chenimport com.android.gallery3d.ui.DetailsHelper.CloseListener;
46f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.ui.GLCanvas;
47f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.ui.GLView;
48f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.ui.GridDrawer;
49f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.ui.HighlightDrawer;
50f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.ui.PositionProvider;
51f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.ui.PositionRepository;
52f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.ui.PositionRepository.Position;
53f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.ui.SelectionManager;
54f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.ui.SlotView;
5557cbaa1ef40d2215c6400f5ae4af3a09e67abb2dHung-ying Tyanimport com.android.gallery3d.util.Future;
56fbdd338d83596ba545a8a7c8105d2ad7b5df56e6Owen Linimport com.android.gallery3d.util.GalleryUtils;
57f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
58f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linpublic class AlbumSetPage extends ActivityState implements
59f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        SelectionManager.SelectionListener, GalleryActionBar.ClusterRunner,
6057cbaa1ef40d2215c6400f5ae4af3a09e67abb2dHung-ying Tyan        EyePosition.EyePositionListener, MediaSet.SyncListener {
61f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    @SuppressWarnings("unused")
62f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private static final String TAG = "AlbumSetPage";
63f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
64f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public static final String KEY_MEDIA_PATH = "media-path";
65f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public static final String KEY_SET_TITLE = "set-title";
66f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public static final String KEY_SET_SUBTITLE = "set-subtitle";
67b5f8d908c5dd287052cd49eddaf1f82d858cca03Ray Chen    public static final String KEY_SELECTED_CLUSTER_TYPE = "selected-cluster";
686cf807453fb58ccd4cc513ff187b306c7090e67cOwen Lin
69f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private static final int DATA_CACHE_SIZE = 256;
70f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private static final int REQUEST_DO_ANIMATION = 1;
71f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
72fbdd338d83596ba545a8a7c8105d2ad7b5df56e6Owen Lin    private static final int BIT_LOADING_RELOAD = 1;
73fbdd338d83596ba545a8a7c8105d2ad7b5df56e6Owen Lin    private static final int BIT_LOADING_SYNC = 2;
74fbdd338d83596ba545a8a7c8105d2ad7b5df56e6Owen Lin
75f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private boolean mIsActive = false;
767260f6f74d465520e4497b23fe56f98abb0c15a2Owen Lin    private SlotView mSlotView;
77f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private AlbumSetView mAlbumSetView;
78f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
79f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private MediaSet mMediaSet;
809c21268fa8d394cca6cab78dd023a52e0b147a6eRay Chen    private String mTitle;
81f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private String mSubtitle;
82b5f8d908c5dd287052cd49eddaf1f82d858cca03Ray Chen    private boolean mShowClusterMenu;
838cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen    private GalleryActionBar mActionBar;
84b5f8d908c5dd287052cd49eddaf1f82d858cca03Ray Chen    private int mSelectedAction;
851f4e6d14bba7290ea0268fbde28ffc664d4f7004Ray Chen    private Vibrator mVibrator;
86f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
87f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    protected SelectionManager mSelectionManager;
88f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private AlbumSetDataAdapter mAlbumSetDataAdapter;
89f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private GridDrawer mGridDrawer;
90f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private HighlightDrawer mHighlightDrawer;
91f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
92f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private boolean mGetContent;
93f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private boolean mGetAlbum;
94f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private ActionMode mActionMode;
95f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private ActionModeHandler mActionModeHandler;
964105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen    private DetailsHelper mDetailsHelper;
974105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen    private MyDetailsSource mDetailsSource;
98f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private boolean mShowDetails;
99f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private EyePosition mEyePosition;
100f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
101f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    // The eyes' position of the user, the origin is at the center of the
102f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    // device and the unit is in pixels.
103f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private float mX;
104f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private float mY;
105f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private float mZ;
106f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
10757cbaa1ef40d2215c6400f5ae4af3a09e67abb2dHung-ying Tyan    private Future<Integer> mSyncTask = null;
10857cbaa1ef40d2215c6400f5ae4af3a09e67abb2dHung-ying Tyan
109fbdd338d83596ba545a8a7c8105d2ad7b5df56e6Owen Lin    private int mLoadingBits = 0;
110fbdd338d83596ba545a8a7c8105d2ad7b5df56e6Owen Lin    private boolean mInitialSynced = false;
111fbdd338d83596ba545a8a7c8105d2ad7b5df56e6Owen Lin
112dbf4ba12afba115888493caa34937643257e2bb1Ray Chen    private final GLView mRootPane = new GLView() {
113dbf4ba12afba115888493caa34937643257e2bb1Ray Chen        private final float mMatrix[] = new float[16];
114f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
115f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        @Override
116ff951a85c3c9015ef7ccd8902e69ce88360a0cb8Chih-Chung Chang        protected void renderBackground(GLCanvas view) {
117ff951a85c3c9015ef7ccd8902e69ce88360a0cb8Chih-Chung Chang            view.clearBuffer();
118ff951a85c3c9015ef7ccd8902e69ce88360a0cb8Chih-Chung Chang        }
119ff951a85c3c9015ef7ccd8902e69ce88360a0cb8Chih-Chung Chang
120ff951a85c3c9015ef7ccd8902e69ce88360a0cb8Chih-Chung Chang        @Override
121f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        protected void onLayout(
122f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                boolean changed, int left, int top, int right, int bottom) {
123f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            mEyePosition.resetPosition();
124f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
1258cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen            int slotViewTop = mActionBar.getHeight();
126f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            int slotViewBottom = bottom - top;
127f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            int slotViewRight = right - left;
128f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
129f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            if (mShowDetails) {
1304105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen                mDetailsHelper.layout(left, slotViewTop, right, bottom);
131f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            } else {
132f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                mAlbumSetView.setSelectionDrawer(mGridDrawer);
133f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            }
134f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
1357260f6f74d465520e4497b23fe56f98abb0c15a2Owen Lin            mSlotView.layout(0, slotViewTop, slotViewRight, slotViewBottom);
1367260f6f74d465520e4497b23fe56f98abb0c15a2Owen Lin
13704ac045bf8da5082bbb0bdc9ea5f9c9b5b796ad0Yuli Huang            // Reset position offset after the layout is changed.
138f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            PositionRepository.getInstance(mActivity).setOffset(
139f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                    0, slotViewTop);
140f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
141f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
142f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        @Override
143f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        protected void render(GLCanvas canvas) {
144f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            canvas.save(GLCanvas.SAVE_FLAG_MATRIX);
145f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            GalleryUtils.setViewPointMatrix(mMatrix,
146f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                    getWidth() / 2 + mX, getHeight() / 2 + mY, mZ);
147f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            canvas.multiplyMatrix(mMatrix, 0);
148f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            super.render(canvas);
149f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            canvas.restore();
150f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
151f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    };
152f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
153f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    @Override
154f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public void onEyePositionChanged(float x, float y, float z) {
155f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mRootPane.lockRendering();
156f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mX = x;
157f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mY = y;
158f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mZ = z;
159f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mRootPane.unlockRendering();
160f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mRootPane.invalidate();
161f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
162f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
163f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    @Override
164f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public void onBackPressed() {
165f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        if (mShowDetails) {
166f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            hideDetails();
167f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        } else if (mSelectionManager.inSelectionMode()) {
168f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            mSelectionManager.leaveSelectionMode();
169f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        } else {
1707260f6f74d465520e4497b23fe56f98abb0c15a2Owen Lin            // TODO: fix this regression during refactoring
1717260f6f74d465520e4497b23fe56f98abb0c15a2Owen Lin            // mSlotView.savePositions(
1727260f6f74d465520e4497b23fe56f98abb0c15a2Owen Lin            //        PositionRepository.getInstance(mActivity));
173f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            super.onBackPressed();
174f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
175f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
176f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
177f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private void savePositions(int slotIndex, int center[]) {
178f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        Rect offset = new Rect();
1797260f6f74d465520e4497b23fe56f98abb0c15a2Owen Lin        mRootPane.getBoundsOf(mSlotView, offset);
1807260f6f74d465520e4497b23fe56f98abb0c15a2Owen Lin        // TODO: fix this regression during refactoring
1817260f6f74d465520e4497b23fe56f98abb0c15a2Owen Lin        // mSlotView.savePositions(PositionRepository.getInstance(mActivity));
1827260f6f74d465520e4497b23fe56f98abb0c15a2Owen Lin        Rect r = mSlotView.getSlotRect(slotIndex);
1837260f6f74d465520e4497b23fe56f98abb0c15a2Owen Lin        int scrollX = mSlotView.getScrollX();
1847260f6f74d465520e4497b23fe56f98abb0c15a2Owen Lin        int scrollY = mSlotView.getScrollY();
185f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        center[0] = offset.left + (r.left + r.right) / 2 - scrollX;
186f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        center[1] = offset.top + (r.top + r.bottom) / 2 - scrollY;
187f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
188f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
189f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public void onSingleTapUp(int slotIndex) {
190f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        MediaSet targetSet = mAlbumSetDataAdapter.getMediaSet(slotIndex);
191f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        if (targetSet == null) return; // Content is dirty, we shall reload soon
192f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
193f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        if (mShowDetails) {
194f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            Path path = targetSet.getPath();
195f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            mHighlightDrawer.setHighlightItem(path);
1964105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen            mDetailsHelper.reloadDetails(slotIndex);
197f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        } else if (!mSelectionManager.inSelectionMode()) {
198f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            Bundle data = new Bundle(getData());
199f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            String mediaPath = targetSet.getPath().toString();
200f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            int[] center = new int[2];
201f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            savePositions(slotIndex, center);
202f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            data.putIntArray(AlbumPage.KEY_SET_CENTER, center);
203f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            if (mGetAlbum && targetSet.isLeafAlbum()) {
204f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                Activity activity = (Activity) mActivity;
205f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                Intent result = new Intent()
206f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                        .putExtra(AlbumPicker.KEY_ALBUM_PATH, targetSet.getPath().toString());
207f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                activity.setResult(Activity.RESULT_OK, result);
208f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                activity.finish();
209f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            } else if (targetSet.getSubMediaSetCount() > 0) {
210f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                data.putString(AlbumSetPage.KEY_MEDIA_PATH, mediaPath);
211f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                mActivity.getStateManager().startStateForResult(
212f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                        AlbumSetPage.class, REQUEST_DO_ANIMATION, data);
213f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            } else {
214f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                if (!mGetContent && (targetSet.getSupportedOperations()
215f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                        & MediaObject.SUPPORT_IMPORT) != 0) {
216f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                    data.putBoolean(AlbumPage.KEY_AUTO_SELECT_ALL, true);
217f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                }
218f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                data.putString(AlbumPage.KEY_MEDIA_PATH, mediaPath);
219f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                boolean inAlbum = mActivity.getStateManager().hasStateClass(AlbumPage.class);
220f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                // We only show cluster menu in the first AlbumPage in stack
221f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                data.putBoolean(AlbumPage.KEY_SHOW_CLUSTER_MENU, !inAlbum);
222f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                mActivity.getStateManager().startStateForResult(
223f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                        AlbumPage.class, REQUEST_DO_ANIMATION, data);
224f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            }
225f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        } else {
226f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            mSelectionManager.toggle(targetSet.getPath());
2277260f6f74d465520e4497b23fe56f98abb0c15a2Owen Lin            mSlotView.invalidate();
228f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
229f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
230f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
231bc2154199aee16762e3758ad0cfed685323d9a9fChih-Chung Chang    private void onDown(int index) {
232bc2154199aee16762e3758ad0cfed685323d9a9fChih-Chung Chang        MediaSet set = mAlbumSetDataAdapter.getMediaSet(index);
233bc2154199aee16762e3758ad0cfed685323d9a9fChih-Chung Chang        Path path = (set == null) ? null : set.getPath();
234bc2154199aee16762e3758ad0cfed685323d9a9fChih-Chung Chang        mSelectionManager.setPressedPath(path);
2357260f6f74d465520e4497b23fe56f98abb0c15a2Owen Lin        mSlotView.invalidate();
236bc2154199aee16762e3758ad0cfed685323d9a9fChih-Chung Chang    }
237bc2154199aee16762e3758ad0cfed685323d9a9fChih-Chung Chang
238bc2154199aee16762e3758ad0cfed685323d9a9fChih-Chung Chang    private void onUp() {
239bc2154199aee16762e3758ad0cfed685323d9a9fChih-Chung Chang        mSelectionManager.setPressedPath(null);
2407260f6f74d465520e4497b23fe56f98abb0c15a2Owen Lin        mSlotView.invalidate();
241bc2154199aee16762e3758ad0cfed685323d9a9fChih-Chung Chang    }
242bc2154199aee16762e3758ad0cfed685323d9a9fChih-Chung Chang
243f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public void onLongTap(int slotIndex) {
244f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        if (mGetContent || mGetAlbum) return;
245f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        if (mShowDetails) {
246f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            onSingleTapUp(slotIndex);
247f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        } else {
248f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            MediaSet set = mAlbumSetDataAdapter.getMediaSet(slotIndex);
249f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            if (set == null) return;
250f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            mSelectionManager.setAutoLeaveSelectionMode(true);
251f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            mSelectionManager.toggle(set.getPath());
2524105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen            mDetailsSource.findIndex(slotIndex);
2537260f6f74d465520e4497b23fe56f98abb0c15a2Owen Lin            mSlotView.invalidate();
254f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
255f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
256f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
257f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public void doCluster(int clusterType) {
258f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        String basePath = mMediaSet.getPath().toString();
259f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        String newPath = FilterUtils.switchClusterPath(basePath, clusterType);
260f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        Bundle data = new Bundle(getData());
261f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        data.putString(AlbumSetPage.KEY_MEDIA_PATH, newPath);
262b5f8d908c5dd287052cd49eddaf1f82d858cca03Ray Chen        data.putInt(KEY_SELECTED_CLUSTER_TYPE, clusterType);
263f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mActivity.getStateManager().switchState(this, AlbumSetPage.class, data);
264f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
265f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
266f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    @Override
267f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public void onCreate(Bundle data, Bundle restoreState) {
268f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        initializeViews();
269f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        initializeData(data);
2701f4e6d14bba7290ea0268fbde28ffc664d4f7004Ray Chen        Context context = mActivity.getAndroidContext();
271f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mGetContent = data.getBoolean(Gallery.KEY_GET_CONTENT, false);
272f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mGetAlbum = data.getBoolean(Gallery.KEY_GET_ALBUM, false);
2739c21268fa8d394cca6cab78dd023a52e0b147a6eRay Chen        mTitle = data.getString(AlbumSetPage.KEY_SET_TITLE);
274f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mSubtitle = data.getString(AlbumSetPage.KEY_SET_SUBTITLE);
2751f4e6d14bba7290ea0268fbde28ffc664d4f7004Ray Chen        mEyePosition = new EyePosition(context, this);
2764105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen        mDetailsSource = new MyDetailsSource();
2771f4e6d14bba7290ea0268fbde28ffc664d4f7004Ray Chen        mVibrator = (Vibrator) context.getSystemService(Context.VIBRATOR_SERVICE);
2788cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen        mActionBar = mActivity.getGalleryActionBar();
2798cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen        mSelectedAction = data.getInt(AlbumSetPage.KEY_SELECTED_CLUSTER_TYPE,
2808cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen                FilterUtils.CLUSTER_BY_ALBUM);
281f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        startTransition();
282f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
283f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
284fbdd338d83596ba545a8a7c8105d2ad7b5df56e6Owen Lin    private void clearLoadingBit(int loadingBit) {
285fbdd338d83596ba545a8a7c8105d2ad7b5df56e6Owen Lin        mLoadingBits &= ~loadingBit;
286d05b0be120bb217b4f56add24a4b31bee92455b2Chih-Chung Chang        if (mLoadingBits == 0 && mIsActive) {
287fbdd338d83596ba545a8a7c8105d2ad7b5df56e6Owen Lin            GalleryUtils.setSpinnerVisibility((Activity) mActivity, false);
288fbdd338d83596ba545a8a7c8105d2ad7b5df56e6Owen Lin
289fbdd338d83596ba545a8a7c8105d2ad7b5df56e6Owen Lin            // Only show toast when there's no album and we are going to finish
290fbdd338d83596ba545a8a7c8105d2ad7b5df56e6Owen Lin            // the page. Toast is redundant if we are going to stay on this page.
291fbdd338d83596ba545a8a7c8105d2ad7b5df56e6Owen Lin            if ((mAlbumSetDataAdapter.size() == 0)) {
292fbdd338d83596ba545a8a7c8105d2ad7b5df56e6Owen Lin                Toast.makeText((Context) mActivity,
293fbdd338d83596ba545a8a7c8105d2ad7b5df56e6Owen Lin                        R.string.empty_album, Toast.LENGTH_LONG).show();
294fbdd338d83596ba545a8a7c8105d2ad7b5df56e6Owen Lin                if (mActivity.getStateManager().getStateCount() > 1) {
295fbdd338d83596ba545a8a7c8105d2ad7b5df56e6Owen Lin                    mActivity.getStateManager().finishState(this);
296fbdd338d83596ba545a8a7c8105d2ad7b5df56e6Owen Lin                }
297fbdd338d83596ba545a8a7c8105d2ad7b5df56e6Owen Lin            }
298fbdd338d83596ba545a8a7c8105d2ad7b5df56e6Owen Lin        }
299fbdd338d83596ba545a8a7c8105d2ad7b5df56e6Owen Lin    }
300fbdd338d83596ba545a8a7c8105d2ad7b5df56e6Owen Lin
301fbdd338d83596ba545a8a7c8105d2ad7b5df56e6Owen Lin    private void setLoadingBit(int loadingBit) {
302d05b0be120bb217b4f56add24a4b31bee92455b2Chih-Chung Chang        if (mLoadingBits == 0 && mIsActive) {
303fbdd338d83596ba545a8a7c8105d2ad7b5df56e6Owen Lin            GalleryUtils.setSpinnerVisibility((Activity) mActivity, true);
304fbdd338d83596ba545a8a7c8105d2ad7b5df56e6Owen Lin        }
305fbdd338d83596ba545a8a7c8105d2ad7b5df56e6Owen Lin        mLoadingBits |= loadingBit;
306fbdd338d83596ba545a8a7c8105d2ad7b5df56e6Owen Lin    }
307fbdd338d83596ba545a8a7c8105d2ad7b5df56e6Owen Lin
308f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    @Override
309f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public void onPause() {
310f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        super.onPause();
311f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mIsActive = false;
312f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mActionModeHandler.pause();
313f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mAlbumSetDataAdapter.pause();
314f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mAlbumSetView.pause();
315f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mEyePosition.pause();
3164105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen        DetailsHelper.pause();
317fe1625c46f8258be4cd5e5e1ba69b584c1fe1a49Ray Chen        // Call disableClusterMenu to avoid receiving callback after paused.
318fe1625c46f8258be4cd5e5e1ba69b584c1fe1a49Ray Chen        // Don't hide menu here otherwise the list menu will disappear earlier than
319fe1625c46f8258be4cd5e5e1ba69b584c1fe1a49Ray Chen        // the action bar, which is janky and unwanted behavior.
3208cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen        mActionBar.disableClusterMenu(false);
32157cbaa1ef40d2215c6400f5ae4af3a09e67abb2dHung-ying Tyan        if (mSyncTask != null) {
32257cbaa1ef40d2215c6400f5ae4af3a09e67abb2dHung-ying Tyan            mSyncTask.cancel();
32357cbaa1ef40d2215c6400f5ae4af3a09e67abb2dHung-ying Tyan            mSyncTask = null;
324fbdd338d83596ba545a8a7c8105d2ad7b5df56e6Owen Lin            clearLoadingBit(BIT_LOADING_SYNC);
32557cbaa1ef40d2215c6400f5ae4af3a09e67abb2dHung-ying Tyan        }
326d05b0be120bb217b4f56add24a4b31bee92455b2Chih-Chung Chang        GalleryUtils.setSpinnerVisibility((Activity) mActivity, false);
327f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
328f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
329f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    @Override
330f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public void onResume() {
331f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        super.onResume();
332f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mIsActive = true;
333f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        setContentPane(mRootPane);
33404ac045bf8da5082bbb0bdc9ea5f9c9b5b796ad0Yuli Huang        // Reset position offset for resuming.
33504ac045bf8da5082bbb0bdc9ea5f9c9b5b796ad0Yuli Huang        PositionRepository.getInstance(mActivity).setOffset(
3367260f6f74d465520e4497b23fe56f98abb0c15a2Owen Lin                mSlotView.bounds().left, mSlotView.bounds().top);
337fe49be45412f8d0f68343662318e73822da486c8Owen Lin
338fe49be45412f8d0f68343662318e73822da486c8Owen Lin        // Set the reload bit here to prevent it exit this page in clearLoadingBit().
339fe49be45412f8d0f68343662318e73822da486c8Owen Lin        setLoadingBit(BIT_LOADING_RELOAD);
340f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mAlbumSetDataAdapter.resume();
341fe49be45412f8d0f68343662318e73822da486c8Owen Lin
342f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mAlbumSetView.resume();
343f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mEyePosition.resume();
344f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mActionModeHandler.resume();
3458cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen        if (mShowClusterMenu) {
3468cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen            mActionBar.enableClusterMenu(mSelectedAction, this);
347dbf4ba12afba115888493caa34937643257e2bb1Ray Chen        }
348fbdd338d83596ba545a8a7c8105d2ad7b5df56e6Owen Lin        if (!mInitialSynced) {
349fbdd338d83596ba545a8a7c8105d2ad7b5df56e6Owen Lin            setLoadingBit(BIT_LOADING_SYNC);
350fe49be45412f8d0f68343662318e73822da486c8Owen Lin            mSyncTask = mMediaSet.requestSync(AlbumSetPage.this);
351fbdd338d83596ba545a8a7c8105d2ad7b5df56e6Owen Lin        }
352f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
353f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
354f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private void initializeData(Bundle data) {
355f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        String mediaPath = data.getString(AlbumSetPage.KEY_MEDIA_PATH);
356f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mMediaSet = mActivity.getDataManager().getMediaSet(mediaPath);
357f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mSelectionManager.setSourceMediaSet(mMediaSet);
358f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mAlbumSetDataAdapter = new AlbumSetDataAdapter(
359f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                mActivity, mMediaSet, DATA_CACHE_SIZE);
360f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mAlbumSetDataAdapter.setLoadingListener(new MyLoadingListener());
361f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mAlbumSetView.setModel(mAlbumSetDataAdapter);
362f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
363f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
364f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private void initializeViews() {
365f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mSelectionManager = new SelectionManager(mActivity, true);
366f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mSelectionManager.setSelectionListener(this);
367f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
368f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mGridDrawer = new GridDrawer((Context) mActivity, mSelectionManager);
369f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        Config.AlbumSetPage config = Config.AlbumSetPage.get((Context) mActivity);
3707260f6f74d465520e4497b23fe56f98abb0c15a2Owen Lin        mSlotView = new SlotView((Context) mActivity, config.slotViewSpec);
3717260f6f74d465520e4497b23fe56f98abb0c15a2Owen Lin        mAlbumSetView = new AlbumSetView(
3727260f6f74d465520e4497b23fe56f98abb0c15a2Owen Lin                mActivity, mGridDrawer, mSlotView, config.labelSpec);
3737260f6f74d465520e4497b23fe56f98abb0c15a2Owen Lin        mSlotView.setSlotRenderer(mAlbumSetView);
3747260f6f74d465520e4497b23fe56f98abb0c15a2Owen Lin        mSlotView.setListener(new SlotView.SimpleListener() {
375f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            @Override
376bc2154199aee16762e3758ad0cfed685323d9a9fChih-Chung Chang            public void onDown(int index) {
377bc2154199aee16762e3758ad0cfed685323d9a9fChih-Chung Chang                AlbumSetPage.this.onDown(index);
378bc2154199aee16762e3758ad0cfed685323d9a9fChih-Chung Chang            }
379bc2154199aee16762e3758ad0cfed685323d9a9fChih-Chung Chang
380bc2154199aee16762e3758ad0cfed685323d9a9fChih-Chung Chang            @Override
381bc2154199aee16762e3758ad0cfed685323d9a9fChih-Chung Chang            public void onUp() {
382bc2154199aee16762e3758ad0cfed685323d9a9fChih-Chung Chang                AlbumSetPage.this.onUp();
383bc2154199aee16762e3758ad0cfed685323d9a9fChih-Chung Chang            }
384bc2154199aee16762e3758ad0cfed685323d9a9fChih-Chung Chang
385bc2154199aee16762e3758ad0cfed685323d9a9fChih-Chung Chang            @Override
386f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            public void onSingleTapUp(int slotIndex) {
387f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                AlbumSetPage.this.onSingleTapUp(slotIndex);
388f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            }
389bc2154199aee16762e3758ad0cfed685323d9a9fChih-Chung Chang
390f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            @Override
391f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            public void onLongTap(int slotIndex) {
392f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                AlbumSetPage.this.onLongTap(slotIndex);
393f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            }
394f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        });
395f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
396f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mActionModeHandler = new ActionModeHandler(mActivity, mSelectionManager);
397f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mActionModeHandler.setActionModeListener(new ActionModeListener() {
398f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            public boolean onActionItemClicked(MenuItem item) {
399f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                return onItemSelected(item);
400f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            }
401f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        });
4027260f6f74d465520e4497b23fe56f98abb0c15a2Owen Lin        mRootPane.addComponent(mSlotView);
403f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
404f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
405f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    @Override
406f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    protected boolean onCreateActionBar(Menu menu) {
407f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        Activity activity = (Activity) mActivity;
408f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        MenuInflater inflater = activity.getMenuInflater();
409f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
410f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        final boolean inAlbum = mActivity.getStateManager().hasStateClass(
411f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                AlbumPage.class);
412f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
413f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        if (mGetContent) {
414f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            inflater.inflate(R.menu.pickup, menu);
415f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            int typeBits = mData.getInt(
416f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                    Gallery.KEY_TYPE_BITS, DataManager.INCLUDE_IMAGE);
417f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            int id = R.string.select_image;
418f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            if ((typeBits & DataManager.INCLUDE_VIDEO) != 0) {
419f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                id = (typeBits & DataManager.INCLUDE_IMAGE) == 0
420f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                        ? R.string.select_video
421f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                        : R.string.select_item;
422f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            }
4238cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen            mActionBar.setTitle(id);
424f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        } else  if (mGetAlbum) {
425f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            inflater.inflate(R.menu.pickup, menu);
4268cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen            mActionBar.setTitle(R.string.select_album);
427f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        } else {
428b5f8d908c5dd287052cd49eddaf1f82d858cca03Ray Chen            mShowClusterMenu = !inAlbum;
429f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            inflater.inflate(R.menu.albumset, menu);
430f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            MenuItem selectItem = menu.findItem(R.id.action_select);
431f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
432f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            if (selectItem != null) {
433f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                boolean selectAlbums = !inAlbum &&
4348cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen                        mActionBar.getClusterTypeAction() == FilterUtils.CLUSTER_BY_ALBUM;
435f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                if (selectAlbums) {
436f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                    selectItem.setTitle(R.string.select_album);
437f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                } else {
438f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                    selectItem.setTitle(R.string.select_group);
439f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                }
440f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            }
441f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
4428cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen            FilterUtils.setupMenuItems(mActionBar, mMediaSet.getPath(), false);
443f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            MenuItem switchCamera = menu.findItem(R.id.action_camera);
444f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            if (switchCamera != null) {
445f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                switchCamera.setVisible(GalleryUtils.isCameraAvailable(activity));
446f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            }
447f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
4488cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen            mActionBar.setTitle(mTitle);
4498cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen            mActionBar.setSubtitle(mSubtitle);
450f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
451f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        return true;
452f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
453f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
454f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    @Override
455f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    protected boolean onItemSelected(MenuItem item) {
456f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        Activity activity = (Activity) mActivity;
457f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        switch (item.getItemId()) {
458bd8e025f1bb39b2be236b183ea8e78f93b308ad1Ray Chen            case R.id.action_cancel:
459bd8e025f1bb39b2be236b183ea8e78f93b308ad1Ray Chen                activity.setResult(Activity.RESULT_CANCELED);
460bd8e025f1bb39b2be236b183ea8e78f93b308ad1Ray Chen                activity.finish();
461bd8e025f1bb39b2be236b183ea8e78f93b308ad1Ray Chen                return true;
462f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            case R.id.action_select:
463f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                mSelectionManager.setAutoLeaveSelectionMode(false);
464f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                mSelectionManager.enterSelectionMode();
465f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                return true;
466f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            case R.id.action_details:
467f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                if (mAlbumSetDataAdapter.size() != 0) {
468f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                    if (mShowDetails) {
469f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                        hideDetails();
470f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                    } else {
471f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                        showDetails();
472f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                    }
473f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                } else {
474f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                    Toast.makeText(activity,
475f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                            activity.getText(R.string.no_albums_alert),
476f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                            Toast.LENGTH_SHORT).show();
477f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                }
478f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                return true;
479f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            case R.id.action_camera: {
480f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                Intent intent = new Intent(MediaStore.INTENT_ACTION_STILL_IMAGE_CAMERA)
481f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                        .setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP
482f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                        | Intent.FLAG_ACTIVITY_NEW_TASK);
483f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                activity.startActivity(intent);
484f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                return true;
485f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            }
486f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            case R.id.action_manage_offline: {
4876cf807453fb58ccd4cc513ff187b306c7090e67cOwen Lin                Bundle data = new Bundle();
4886cf807453fb58ccd4cc513ff187b306c7090e67cOwen Lin                String mediaPath = mActivity.getDataManager().getTopSetPath(
4896cf807453fb58ccd4cc513ff187b306c7090e67cOwen Lin                    DataManager.INCLUDE_ALL);
4906cf807453fb58ccd4cc513ff187b306c7090e67cOwen Lin                data.putString(AlbumSetPage.KEY_MEDIA_PATH, mediaPath);
4916cf807453fb58ccd4cc513ff187b306c7090e67cOwen Lin                mActivity.getStateManager().startState(ManageCachePage.class, data);
492f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                return true;
493f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            }
494f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            case R.id.action_sync_picasa_albums: {
495f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                PicasaSource.requestSync(activity);
496f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                return true;
497f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            }
498f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            case R.id.action_settings: {
499f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                activity.startActivity(new Intent(activity, GallerySettings.class));
500f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                return true;
501f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            }
502f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            default:
503f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                return false;
504f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
505f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
506f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
507f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    @Override
508f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    protected void onStateResult(int requestCode, int resultCode, Intent data) {
509f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        switch (requestCode) {
510f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            case REQUEST_DO_ANIMATION: {
511f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                startTransition();
512f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            }
513f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
514f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
515f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
516f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private void startTransition() {
517f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        final PositionRepository repository =
518f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                PositionRepository.getInstance(mActivity);
5197260f6f74d465520e4497b23fe56f98abb0c15a2Owen Lin        mSlotView.startTransition(new PositionProvider() {
520dbf4ba12afba115888493caa34937643257e2bb1Ray Chen            private final Position mTempPosition = new Position();
52195018d10aa68ecbea7ebce434733341a642510deChih-Chung Chang            public Position getPosition(int identity, Position target) {
522f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                Position p = repository.get(identity);
523f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                if (p == null) {
524f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                    p = mTempPosition;
525f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                    p.set(target.x, target.y, 128, target.theta, 1);
526f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                }
527f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                return p;
528f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            }
529f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        });
530f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
531f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
532f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private String getSelectedString() {
533f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        int count = mSelectionManager.getSelectedCount();
5348cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen        int action = mActionBar.getClusterTypeAction();
535f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        int string = action == FilterUtils.CLUSTER_BY_ALBUM
536f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                ? R.plurals.number_of_albums_selected
537f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                : R.plurals.number_of_groups_selected;
538f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        String format = mActivity.getResources().getQuantityString(string, count);
539f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        return String.format(format, count);
540f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
541f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
542f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public void onSelectionModeChange(int mode) {
543f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
544f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        switch (mode) {
545f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            case SelectionManager.ENTER_SELECTION_MODE: {
5468cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen                mActionBar.disableClusterMenu(true);
547f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                mActionMode = mActionModeHandler.startActionMode();
5481f4e6d14bba7290ea0268fbde28ffc664d4f7004Ray Chen                mVibrator.vibrate(100);
549f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                break;
550f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            }
551f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            case SelectionManager.LEAVE_SELECTION_MODE: {
552f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                mActionMode.finish();
5539c21268fa8d394cca6cab78dd023a52e0b147a6eRay Chen                if (mShowClusterMenu) {
5548cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen                    mActionBar.enableClusterMenu(mSelectedAction, this);
5559c21268fa8d394cca6cab78dd023a52e0b147a6eRay Chen                }
556f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                mRootPane.invalidate();
557f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                break;
558f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            }
559f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            case SelectionManager.SELECT_ALL_MODE: {
560f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                mActionModeHandler.setTitle(getSelectedString());
561f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                mRootPane.invalidate();
562f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                break;
563f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            }
564f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
565f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
566f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
567f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public void onSelectionChange(Path path, boolean selected) {
568f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        Utils.assertTrue(mActionMode != null);
569f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mActionModeHandler.setTitle(getSelectedString());
570f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mActionModeHandler.updateSupportedOperation(path, selected);
571f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
572f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
573f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private void hideDetails() {
574f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mShowDetails = false;
5754105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen        mDetailsHelper.hide();
576a4f0526dc8d993fb914d0e6505e22a1f30ad0e14Ray Chen        mAlbumSetView.setSelectionDrawer(mGridDrawer);
5777260f6f74d465520e4497b23fe56f98abb0c15a2Owen Lin        mSlotView.invalidate();
578f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
579f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
580f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private void showDetails() {
581f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mShowDetails = true;
5824105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen        if (mDetailsHelper == null) {
583bc2154199aee16762e3758ad0cfed685323d9a9fChih-Chung Chang            mHighlightDrawer = new HighlightDrawer(mActivity.getAndroidContext(),
584bc2154199aee16762e3758ad0cfed685323d9a9fChih-Chung Chang                    mSelectionManager);
5854105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen            mDetailsHelper = new DetailsHelper(mActivity, mRootPane, mDetailsSource);
5864105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen            mDetailsHelper.setCloseListener(new CloseListener() {
587f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                public void onClose() {
588f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                    hideDetails();
589f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                }
590f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            });
591f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
592f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mAlbumSetView.setSelectionDrawer(mHighlightDrawer);
5934105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen        mDetailsHelper.show();
594f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
595f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
59657cbaa1ef40d2215c6400f5ae4af3a09e67abb2dHung-ying Tyan    @Override
59757cbaa1ef40d2215c6400f5ae4af3a09e67abb2dHung-ying Tyan    public void onSyncDone(final MediaSet mediaSet, final int resultCode) {
59857cbaa1ef40d2215c6400f5ae4af3a09e67abb2dHung-ying Tyan        if (resultCode == MediaSet.SYNC_RESULT_ERROR) {
59957cbaa1ef40d2215c6400f5ae4af3a09e67abb2dHung-ying Tyan            Log.d(TAG, "onSyncDone: " + Utils.maskDebugInfo(mediaSet.getName()) + " result="
60057cbaa1ef40d2215c6400f5ae4af3a09e67abb2dHung-ying Tyan                    + resultCode);
60157cbaa1ef40d2215c6400f5ae4af3a09e67abb2dHung-ying Tyan        }
60257cbaa1ef40d2215c6400f5ae4af3a09e67abb2dHung-ying Tyan        ((Activity) mActivity).runOnUiThread(new Runnable() {
60357cbaa1ef40d2215c6400f5ae4af3a09e67abb2dHung-ying Tyan            @Override
60457cbaa1ef40d2215c6400f5ae4af3a09e67abb2dHung-ying Tyan            public void run() {
605fbdd338d83596ba545a8a7c8105d2ad7b5df56e6Owen Lin                if (resultCode == MediaSet.SYNC_RESULT_SUCCESS) {
606fbdd338d83596ba545a8a7c8105d2ad7b5df56e6Owen Lin                    mInitialSynced = true;
607fbdd338d83596ba545a8a7c8105d2ad7b5df56e6Owen Lin                }
608fbdd338d83596ba545a8a7c8105d2ad7b5df56e6Owen Lin                clearLoadingBit(BIT_LOADING_SYNC);
609d05b0be120bb217b4f56add24a4b31bee92455b2Chih-Chung Chang                if (resultCode == MediaSet.SYNC_RESULT_ERROR && mIsActive) {
61057cbaa1ef40d2215c6400f5ae4af3a09e67abb2dHung-ying Tyan                    Toast.makeText((Context) mActivity, R.string.sync_album_set_error,
61157cbaa1ef40d2215c6400f5ae4af3a09e67abb2dHung-ying Tyan                            Toast.LENGTH_LONG).show();
61257cbaa1ef40d2215c6400f5ae4af3a09e67abb2dHung-ying Tyan                }
61357cbaa1ef40d2215c6400f5ae4af3a09e67abb2dHung-ying Tyan            }
61457cbaa1ef40d2215c6400f5ae4af3a09e67abb2dHung-ying Tyan        });
61557cbaa1ef40d2215c6400f5ae4af3a09e67abb2dHung-ying Tyan    }
61657cbaa1ef40d2215c6400f5ae4af3a09e67abb2dHung-ying Tyan
617f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private class MyLoadingListener implements LoadingListener {
618f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        public void onLoadingStarted() {
619fbdd338d83596ba545a8a7c8105d2ad7b5df56e6Owen Lin            setLoadingBit(BIT_LOADING_RELOAD);
620f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
621f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
622f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        public void onLoadingFinished() {
623fbdd338d83596ba545a8a7c8105d2ad7b5df56e6Owen Lin            clearLoadingBit(BIT_LOADING_RELOAD);
624f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
625f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
626f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
6274105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen    private class MyDetailsSource implements DetailsHelper.DetailsSource {
628f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        private int mIndex;
629f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        public int size() {
630f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            return mAlbumSetDataAdapter.size();
631f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
632f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
6334105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen        public int getIndex() {
6344105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen            return mIndex;
6354105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen        }
6364105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen
637f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        // If requested index is out of active window, suggest a valid index.
638f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        // If there is no valid index available, return -1.
639f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        public int findIndex(int indexHint) {
640f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            if (mAlbumSetDataAdapter.isActive(indexHint)) {
641f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                mIndex = indexHint;
642f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            } else {
643f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                mIndex = mAlbumSetDataAdapter.getActiveStart();
644f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                if (!mAlbumSetDataAdapter.isActive(mIndex)) {
645f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                    return -1;
646f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                }
647f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            }
648f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            return mIndex;
649f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
650f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
651f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        public MediaDetails getDetails() {
652f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            MediaObject item = mAlbumSetDataAdapter.getMediaSet(mIndex);
653f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            if (item != null) {
654f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                mHighlightDrawer.setHighlightItem(item.getPath());
655f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                return item.getDetails();
656f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            } else {
657f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                return null;
658f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            }
659f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
660f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
661f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin}
662