AlbumSetPage.java revision fbdd338d83596ba545a8a7c8105d2ad7b5df56e6
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;
55f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.ui.StaticBackground;
5657cbaa1ef40d2215c6400f5ae4af3a09e67abb2dHung-ying Tyanimport com.android.gallery3d.util.Future;
57fbdd338d83596ba545a8a7c8105d2ad7b5df56e6Owen Linimport com.android.gallery3d.util.GalleryUtils;
58f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
59f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linpublic class AlbumSetPage extends ActivityState implements
60f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        SelectionManager.SelectionListener, GalleryActionBar.ClusterRunner,
6157cbaa1ef40d2215c6400f5ae4af3a09e67abb2dHung-ying Tyan        EyePosition.EyePositionListener, MediaSet.SyncListener {
62f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    @SuppressWarnings("unused")
63f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private static final String TAG = "AlbumSetPage";
64f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
65f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public static final String KEY_MEDIA_PATH = "media-path";
66f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public static final String KEY_SET_TITLE = "set-title";
67f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public static final String KEY_SET_SUBTITLE = "set-subtitle";
68b5f8d908c5dd287052cd49eddaf1f82d858cca03Ray Chen    public static final String KEY_SELECTED_CLUSTER_TYPE = "selected-cluster";
696cf807453fb58ccd4cc513ff187b306c7090e67cOwen Lin
70f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private static final int DATA_CACHE_SIZE = 256;
71f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private static final int REQUEST_DO_ANIMATION = 1;
72f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
73fbdd338d83596ba545a8a7c8105d2ad7b5df56e6Owen Lin    private static final int BIT_LOADING_RELOAD = 1;
74fbdd338d83596ba545a8a7c8105d2ad7b5df56e6Owen Lin    private static final int BIT_LOADING_SYNC = 2;
75fbdd338d83596ba545a8a7c8105d2ad7b5df56e6Owen Lin
76f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private boolean mIsActive = false;
77f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private StaticBackground mStaticBackground;
78f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private AlbumSetView mAlbumSetView;
79f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
80f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private MediaSet mMediaSet;
819c21268fa8d394cca6cab78dd023a52e0b147a6eRay Chen    private String mTitle;
82f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private String mSubtitle;
83b5f8d908c5dd287052cd49eddaf1f82d858cca03Ray Chen    private boolean mShowClusterMenu;
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
116f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        protected void onLayout(
117f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                boolean changed, int left, int top, int right, int bottom) {
118f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            mStaticBackground.layout(0, 0, right - left, bottom - top);
119f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            mEyePosition.resetPosition();
120f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
121f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            int slotViewTop = GalleryActionBar.getHeight((Activity) mActivity);
122f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            int slotViewBottom = bottom - top;
123f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            int slotViewRight = right - left;
124f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
125f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            if (mShowDetails) {
1264105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen                mDetailsHelper.layout(left, slotViewTop, right, bottom);
127f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            } else {
128f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                mAlbumSetView.setSelectionDrawer(mGridDrawer);
129f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            }
130f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
131f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            mAlbumSetView.layout(0, slotViewTop, slotViewRight, slotViewBottom);
132f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            PositionRepository.getInstance(mActivity).setOffset(
133f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                    0, slotViewTop);
134f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
135f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
136f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        @Override
137f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        protected void render(GLCanvas canvas) {
138f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            canvas.save(GLCanvas.SAVE_FLAG_MATRIX);
139f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            GalleryUtils.setViewPointMatrix(mMatrix,
140f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                    getWidth() / 2 + mX, getHeight() / 2 + mY, mZ);
141f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            canvas.multiplyMatrix(mMatrix, 0);
142f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            super.render(canvas);
143f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            canvas.restore();
144f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
145f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    };
146f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
147f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    @Override
148f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public void onEyePositionChanged(float x, float y, float z) {
149f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mRootPane.lockRendering();
150f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mX = x;
151f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mY = y;
152f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mZ = z;
153f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mRootPane.unlockRendering();
154f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mRootPane.invalidate();
155f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
156f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
157f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    @Override
158f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public void onBackPressed() {
159f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        if (mShowDetails) {
160f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            hideDetails();
161f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        } else if (mSelectionManager.inSelectionMode()) {
162f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            mSelectionManager.leaveSelectionMode();
163f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        } else {
164f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            mAlbumSetView.savePositions(
165f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                    PositionRepository.getInstance(mActivity));
166f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            super.onBackPressed();
167f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
168f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
169f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
170f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private void savePositions(int slotIndex, int center[]) {
171f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        Rect offset = new Rect();
172f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mRootPane.getBoundsOf(mAlbumSetView, offset);
173f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mAlbumSetView.savePositions(PositionRepository.getInstance(mActivity));
174f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        Rect r = mAlbumSetView.getSlotRect(slotIndex);
175f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        int scrollX = mAlbumSetView.getScrollX();
176f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        int scrollY = mAlbumSetView.getScrollY();
177f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        center[0] = offset.left + (r.left + r.right) / 2 - scrollX;
178f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        center[1] = offset.top + (r.top + r.bottom) / 2 - scrollY;
179f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
180f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
181f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public void onSingleTapUp(int slotIndex) {
182f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        MediaSet targetSet = mAlbumSetDataAdapter.getMediaSet(slotIndex);
183f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        if (targetSet == null) return; // Content is dirty, we shall reload soon
184f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
185f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        if (mShowDetails) {
186f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            Path path = targetSet.getPath();
187f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            mHighlightDrawer.setHighlightItem(path);
1884105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen            mDetailsHelper.reloadDetails(slotIndex);
189f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        } else if (!mSelectionManager.inSelectionMode()) {
190f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            Bundle data = new Bundle(getData());
191f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            String mediaPath = targetSet.getPath().toString();
192f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            int[] center = new int[2];
193f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            savePositions(slotIndex, center);
194f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            data.putIntArray(AlbumPage.KEY_SET_CENTER, center);
195f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            if (mGetAlbum && targetSet.isLeafAlbum()) {
196f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                Activity activity = (Activity) mActivity;
197f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                Intent result = new Intent()
198f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                        .putExtra(AlbumPicker.KEY_ALBUM_PATH, targetSet.getPath().toString());
199f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                activity.setResult(Activity.RESULT_OK, result);
200f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                activity.finish();
201f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            } else if (targetSet.getSubMediaSetCount() > 0) {
202f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                data.putString(AlbumSetPage.KEY_MEDIA_PATH, mediaPath);
203f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                mActivity.getStateManager().startStateForResult(
204f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                        AlbumSetPage.class, REQUEST_DO_ANIMATION, data);
205f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            } else {
206f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                if (!mGetContent && (targetSet.getSupportedOperations()
207f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                        & MediaObject.SUPPORT_IMPORT) != 0) {
208f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                    data.putBoolean(AlbumPage.KEY_AUTO_SELECT_ALL, true);
209f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                }
210f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                data.putString(AlbumPage.KEY_MEDIA_PATH, mediaPath);
211f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                boolean inAlbum = mActivity.getStateManager().hasStateClass(AlbumPage.class);
212f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                // We only show cluster menu in the first AlbumPage in stack
213f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                data.putBoolean(AlbumPage.KEY_SHOW_CLUSTER_MENU, !inAlbum);
214f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                mActivity.getStateManager().startStateForResult(
215f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                        AlbumPage.class, REQUEST_DO_ANIMATION, data);
216f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            }
217f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        } else {
218f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            mSelectionManager.toggle(targetSet.getPath());
219f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            mAlbumSetView.invalidate();
220f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
221f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
222f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
223bc2154199aee16762e3758ad0cfed685323d9a9fChih-Chung Chang    private void onDown(int index) {
224bc2154199aee16762e3758ad0cfed685323d9a9fChih-Chung Chang        MediaSet set = mAlbumSetDataAdapter.getMediaSet(index);
225bc2154199aee16762e3758ad0cfed685323d9a9fChih-Chung Chang        Path path = (set == null) ? null : set.getPath();
226bc2154199aee16762e3758ad0cfed685323d9a9fChih-Chung Chang        mSelectionManager.setPressedPath(path);
227bc2154199aee16762e3758ad0cfed685323d9a9fChih-Chung Chang        mAlbumSetView.invalidate();
228bc2154199aee16762e3758ad0cfed685323d9a9fChih-Chung Chang    }
229bc2154199aee16762e3758ad0cfed685323d9a9fChih-Chung Chang
230bc2154199aee16762e3758ad0cfed685323d9a9fChih-Chung Chang    private void onUp() {
231bc2154199aee16762e3758ad0cfed685323d9a9fChih-Chung Chang        mSelectionManager.setPressedPath(null);
232bc2154199aee16762e3758ad0cfed685323d9a9fChih-Chung Chang        mAlbumSetView.invalidate();
233bc2154199aee16762e3758ad0cfed685323d9a9fChih-Chung Chang    }
234bc2154199aee16762e3758ad0cfed685323d9a9fChih-Chung Chang
235f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public void onLongTap(int slotIndex) {
236f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        if (mGetContent || mGetAlbum) return;
237f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        if (mShowDetails) {
238f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            onSingleTapUp(slotIndex);
239f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        } else {
240f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            MediaSet set = mAlbumSetDataAdapter.getMediaSet(slotIndex);
241f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            if (set == null) return;
242f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            mSelectionManager.setAutoLeaveSelectionMode(true);
243f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            mSelectionManager.toggle(set.getPath());
2444105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen            mDetailsSource.findIndex(slotIndex);
245f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            mAlbumSetView.invalidate();
246f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
247f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
248f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
249f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public void doCluster(int clusterType) {
250f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        String basePath = mMediaSet.getPath().toString();
251f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        String newPath = FilterUtils.switchClusterPath(basePath, clusterType);
252f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        Bundle data = new Bundle(getData());
253f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        data.putString(AlbumSetPage.KEY_MEDIA_PATH, newPath);
254b5f8d908c5dd287052cd49eddaf1f82d858cca03Ray Chen        data.putInt(KEY_SELECTED_CLUSTER_TYPE, clusterType);
255f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mAlbumSetView.savePositions(PositionRepository.getInstance(mActivity));
256f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mActivity.getStateManager().switchState(this, AlbumSetPage.class, data);
257f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
258f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
259f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public void doFilter(int filterType) {
260f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        String basePath = mMediaSet.getPath().toString();
261f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        String newPath = FilterUtils.switchFilterPath(basePath, filterType);
262f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        Bundle data = new Bundle(getData());
263f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        data.putString(AlbumSetPage.KEY_MEDIA_PATH, newPath);
264f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mAlbumSetView.savePositions(PositionRepository.getInstance(mActivity));
265f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mActivity.getStateManager().switchState(this, AlbumSetPage.class, data);
266f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
267f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
268f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public void onOperationComplete() {
269f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mAlbumSetView.invalidate();
270f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        // TODO: enable animation
271f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
272f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
273f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    @Override
274f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public void onCreate(Bundle data, Bundle restoreState) {
275f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        initializeViews();
276f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        initializeData(data);
2771f4e6d14bba7290ea0268fbde28ffc664d4f7004Ray Chen        Context context = mActivity.getAndroidContext();
278f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mGetContent = data.getBoolean(Gallery.KEY_GET_CONTENT, false);
279f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mGetAlbum = data.getBoolean(Gallery.KEY_GET_ALBUM, false);
2809c21268fa8d394cca6cab78dd023a52e0b147a6eRay Chen        mTitle = data.getString(AlbumSetPage.KEY_SET_TITLE);
281f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mSubtitle = data.getString(AlbumSetPage.KEY_SET_SUBTITLE);
2821f4e6d14bba7290ea0268fbde28ffc664d4f7004Ray Chen        mEyePosition = new EyePosition(context, this);
2834105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen        mDetailsSource = new MyDetailsSource();
2841f4e6d14bba7290ea0268fbde28ffc664d4f7004Ray Chen        mVibrator = (Vibrator) context.getSystemService(Context.VIBRATOR_SERVICE);
285a79bbef0ffe0b99cb8d0e5dcedd3082abc61559cWei Huang        GalleryActionBar actionBar = mActivity.getGalleryActionBar();
286a79bbef0ffe0b99cb8d0e5dcedd3082abc61559cWei Huang        if (actionBar != null) {
287b5f8d908c5dd287052cd49eddaf1f82d858cca03Ray Chen            mSelectedAction = data.getInt(
288b5f8d908c5dd287052cd49eddaf1f82d858cca03Ray Chen                    AlbumSetPage.KEY_SELECTED_CLUSTER_TYPE, FilterUtils.CLUSTER_BY_ALBUM);
289a79bbef0ffe0b99cb8d0e5dcedd3082abc61559cWei Huang        }
290f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        startTransition();
291f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
292f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
293fbdd338d83596ba545a8a7c8105d2ad7b5df56e6Owen Lin    private void clearLoadingBit(int loadingBit) {
294fbdd338d83596ba545a8a7c8105d2ad7b5df56e6Owen Lin        mLoadingBits &= ~loadingBit;
295fbdd338d83596ba545a8a7c8105d2ad7b5df56e6Owen Lin        if (mLoadingBits == 0) {
296fbdd338d83596ba545a8a7c8105d2ad7b5df56e6Owen Lin            GalleryUtils.setSpinnerVisibility((Activity) mActivity, false);
297fbdd338d83596ba545a8a7c8105d2ad7b5df56e6Owen Lin
298fbdd338d83596ba545a8a7c8105d2ad7b5df56e6Owen Lin            // Only show toast when there's no album and we are going to finish
299fbdd338d83596ba545a8a7c8105d2ad7b5df56e6Owen Lin            // the page. Toast is redundant if we are going to stay on this page.
300fbdd338d83596ba545a8a7c8105d2ad7b5df56e6Owen Lin            if ((mAlbumSetDataAdapter.size() == 0)) {
301fbdd338d83596ba545a8a7c8105d2ad7b5df56e6Owen Lin                Toast.makeText((Context) mActivity,
302fbdd338d83596ba545a8a7c8105d2ad7b5df56e6Owen Lin                        R.string.empty_album, Toast.LENGTH_LONG).show();
303fbdd338d83596ba545a8a7c8105d2ad7b5df56e6Owen Lin                if (mActivity.getStateManager().getStateCount() > 1) {
304fbdd338d83596ba545a8a7c8105d2ad7b5df56e6Owen Lin                    mActivity.getStateManager().finishState(this);
305fbdd338d83596ba545a8a7c8105d2ad7b5df56e6Owen Lin                }
306fbdd338d83596ba545a8a7c8105d2ad7b5df56e6Owen Lin            }
307fbdd338d83596ba545a8a7c8105d2ad7b5df56e6Owen Lin        }
308fbdd338d83596ba545a8a7c8105d2ad7b5df56e6Owen Lin    }
309fbdd338d83596ba545a8a7c8105d2ad7b5df56e6Owen Lin
310fbdd338d83596ba545a8a7c8105d2ad7b5df56e6Owen Lin    private void setLoadingBit(int loadingBit) {
311fbdd338d83596ba545a8a7c8105d2ad7b5df56e6Owen Lin        if (mLoadingBits == 0) {
312fbdd338d83596ba545a8a7c8105d2ad7b5df56e6Owen Lin            GalleryUtils.setSpinnerVisibility((Activity) mActivity, true);
313fbdd338d83596ba545a8a7c8105d2ad7b5df56e6Owen Lin        }
314fbdd338d83596ba545a8a7c8105d2ad7b5df56e6Owen Lin        mLoadingBits |= loadingBit;
315fbdd338d83596ba545a8a7c8105d2ad7b5df56e6Owen Lin    }
316fbdd338d83596ba545a8a7c8105d2ad7b5df56e6Owen Lin
317f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    @Override
318f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public void onPause() {
319f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        super.onPause();
320f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mIsActive = false;
321f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mActionModeHandler.pause();
322f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mAlbumSetDataAdapter.pause();
323f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mAlbumSetView.pause();
324f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mEyePosition.pause();
3254105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen        DetailsHelper.pause();
326f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        GalleryActionBar actionBar = mActivity.getGalleryActionBar();
327b5f8d908c5dd287052cd49eddaf1f82d858cca03Ray Chen        if (actionBar != null) actionBar.hideClusterMenu();
32857cbaa1ef40d2215c6400f5ae4af3a09e67abb2dHung-ying Tyan        if (mSyncTask != null) {
32957cbaa1ef40d2215c6400f5ae4af3a09e67abb2dHung-ying Tyan            mSyncTask.cancel();
33057cbaa1ef40d2215c6400f5ae4af3a09e67abb2dHung-ying Tyan            mSyncTask = null;
331fbdd338d83596ba545a8a7c8105d2ad7b5df56e6Owen Lin            clearLoadingBit(BIT_LOADING_SYNC);
33257cbaa1ef40d2215c6400f5ae4af3a09e67abb2dHung-ying Tyan        }
333f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
334f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
335f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    @Override
336f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public void onResume() {
337f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        super.onResume();
338f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mIsActive = true;
339f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        setContentPane(mRootPane);
340f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mAlbumSetDataAdapter.resume();
341f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mAlbumSetView.resume();
342f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mEyePosition.resume();
343f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mActionModeHandler.resume();
344f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        GalleryActionBar actionBar = mActivity.getGalleryActionBar();
345dbf4ba12afba115888493caa34937643257e2bb1Ray Chen        if (mShowClusterMenu && actionBar != null) {
346dbf4ba12afba115888493caa34937643257e2bb1Ray Chen            actionBar.showClusterMenu(mSelectedAction, this);
347dbf4ba12afba115888493caa34937643257e2bb1Ray Chen        }
348fbdd338d83596ba545a8a7c8105d2ad7b5df56e6Owen Lin        if (!mInitialSynced) {
349fbdd338d83596ba545a8a7c8105d2ad7b5df56e6Owen Lin            mSyncTask = mMediaSet.requestSync(AlbumSetPage.this);
350fbdd338d83596ba545a8a7c8105d2ad7b5df56e6Owen Lin            setLoadingBit(BIT_LOADING_SYNC);
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        mStaticBackground = new StaticBackground(mActivity.getAndroidContext());
368f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mRootPane.addComponent(mStaticBackground);
369f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
370f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mGridDrawer = new GridDrawer((Context) mActivity, mSelectionManager);
371f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        Config.AlbumSetPage config = Config.AlbumSetPage.get((Context) mActivity);
372f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mAlbumSetView = new AlbumSetView(mActivity, mGridDrawer,
3739201679ed1c485767f2e334aa618bd733024af03Chih-Chung Chang                config.slotViewSpec, config.labelSpec);
374f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mAlbumSetView.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        });
402f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mRootPane.addComponent(mAlbumSetView);
403f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
404f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mStaticBackground.setImage(R.drawable.background,
405f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                R.drawable.background_portrait);
406f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
407f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
408f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    @Override
409f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    protected boolean onCreateActionBar(Menu menu) {
410f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        Activity activity = (Activity) mActivity;
411f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        GalleryActionBar actionBar = mActivity.getGalleryActionBar();
412f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        MenuInflater inflater = activity.getMenuInflater();
413f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
414f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        final boolean inAlbum = mActivity.getStateManager().hasStateClass(
415f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                AlbumPage.class);
416f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
417f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        if (mGetContent) {
418f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            inflater.inflate(R.menu.pickup, menu);
419f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            int typeBits = mData.getInt(
420f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                    Gallery.KEY_TYPE_BITS, DataManager.INCLUDE_IMAGE);
421f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            int id = R.string.select_image;
422f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            if ((typeBits & DataManager.INCLUDE_VIDEO) != 0) {
423f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                id = (typeBits & DataManager.INCLUDE_IMAGE) == 0
424f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                        ? R.string.select_video
425f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                        : R.string.select_item;
426f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            }
427f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            actionBar.setTitle(id);
428f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        } else  if (mGetAlbum) {
429f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            inflater.inflate(R.menu.pickup, menu);
430f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            actionBar.setTitle(R.string.select_album);
431f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        } else {
432b5f8d908c5dd287052cd49eddaf1f82d858cca03Ray Chen            mShowClusterMenu = !inAlbum;
433f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            inflater.inflate(R.menu.albumset, menu);
434f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            MenuItem selectItem = menu.findItem(R.id.action_select);
435f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
436f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            if (selectItem != null) {
437f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                boolean selectAlbums = !inAlbum &&
438f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                        actionBar.getClusterTypeAction() == FilterUtils.CLUSTER_BY_ALBUM;
439f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                if (selectAlbums) {
440f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                    selectItem.setTitle(R.string.select_album);
441f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                } else {
442f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                    selectItem.setTitle(R.string.select_group);
443f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                }
444f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            }
445f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
446f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            MenuItem switchCamera = menu.findItem(R.id.action_camera);
447f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            if (switchCamera != null) {
448f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                switchCamera.setVisible(GalleryUtils.isCameraAvailable(activity));
449f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            }
450f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
4519c21268fa8d394cca6cab78dd023a52e0b147a6eRay Chen            actionBar.setTitle(mTitle);
452f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            actionBar.setSubtitle(mSubtitle);
453f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
454f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        return true;
455f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
456f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
457f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    @Override
458f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    protected boolean onItemSelected(MenuItem item) {
459f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        Activity activity = (Activity) mActivity;
460f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        switch (item.getItemId()) {
461bd8e025f1bb39b2be236b183ea8e78f93b308ad1Ray Chen            case R.id.action_cancel:
462bd8e025f1bb39b2be236b183ea8e78f93b308ad1Ray Chen                activity.setResult(Activity.RESULT_CANCELED);
463bd8e025f1bb39b2be236b183ea8e78f93b308ad1Ray Chen                activity.finish();
464bd8e025f1bb39b2be236b183ea8e78f93b308ad1Ray Chen                return true;
465f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            case R.id.action_select:
466f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                mSelectionManager.setAutoLeaveSelectionMode(false);
467f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                mSelectionManager.enterSelectionMode();
468f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                return true;
469f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            case R.id.action_details:
470f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                if (mAlbumSetDataAdapter.size() != 0) {
471f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                    if (mShowDetails) {
472f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                        hideDetails();
473f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                    } else {
474f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                        showDetails();
475f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                    }
476f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                } else {
477f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                    Toast.makeText(activity,
478f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                            activity.getText(R.string.no_albums_alert),
479f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                            Toast.LENGTH_SHORT).show();
480f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                }
481f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                return true;
482f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            case R.id.action_camera: {
483f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                Intent intent = new Intent(MediaStore.INTENT_ACTION_STILL_IMAGE_CAMERA)
484f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                        .setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP
485f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                        | Intent.FLAG_ACTIVITY_NEW_TASK);
486f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                activity.startActivity(intent);
487f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                return true;
488f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            }
489f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            case R.id.action_manage_offline: {
4906cf807453fb58ccd4cc513ff187b306c7090e67cOwen Lin                Bundle data = new Bundle();
4916cf807453fb58ccd4cc513ff187b306c7090e67cOwen Lin                String mediaPath = mActivity.getDataManager().getTopSetPath(
4926cf807453fb58ccd4cc513ff187b306c7090e67cOwen Lin                    DataManager.INCLUDE_ALL);
4936cf807453fb58ccd4cc513ff187b306c7090e67cOwen Lin                data.putString(AlbumSetPage.KEY_MEDIA_PATH, mediaPath);
4946cf807453fb58ccd4cc513ff187b306c7090e67cOwen Lin                mActivity.getStateManager().startState(ManageCachePage.class, data);
495f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                return true;
496f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            }
497f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            case R.id.action_sync_picasa_albums: {
498f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                PicasaSource.requestSync(activity);
499f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                return true;
500f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            }
501f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            case R.id.action_settings: {
502f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                activity.startActivity(new Intent(activity, GallerySettings.class));
503f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                return true;
504f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            }
505f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            default:
506f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                return false;
507f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
508f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
509f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
510f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    @Override
511f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    protected void onStateResult(int requestCode, int resultCode, Intent data) {
512f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        switch (requestCode) {
513f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            case REQUEST_DO_ANIMATION: {
514f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                startTransition();
515f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            }
516f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
517f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
518f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
519f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private void startTransition() {
520f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        final PositionRepository repository =
521f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                PositionRepository.getInstance(mActivity);
522f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mAlbumSetView.startTransition(new PositionProvider() {
523dbf4ba12afba115888493caa34937643257e2bb1Ray Chen            private final Position mTempPosition = new Position();
524f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            public Position getPosition(long identity, Position target) {
525f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                Position p = repository.get(identity);
526f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                if (p == null) {
527f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                    p = mTempPosition;
528f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                    p.set(target.x, target.y, 128, target.theta, 1);
529f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                }
530f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                return p;
531f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            }
532f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        });
533f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
534f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
535f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private String getSelectedString() {
536f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        GalleryActionBar actionBar = mActivity.getGalleryActionBar();
537f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        int count = mSelectionManager.getSelectedCount();
538f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        int action = actionBar.getClusterTypeAction();
539f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        int string = action == FilterUtils.CLUSTER_BY_ALBUM
540f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                ? R.plurals.number_of_albums_selected
541f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                : R.plurals.number_of_groups_selected;
542f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        String format = mActivity.getResources().getQuantityString(string, count);
543f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        return String.format(format, count);
544f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
545f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
546f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public void onSelectionModeChange(int mode) {
547f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
548f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        switch (mode) {
549f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            case SelectionManager.ENTER_SELECTION_MODE: {
550b5f8d908c5dd287052cd49eddaf1f82d858cca03Ray Chen                mActivity.getGalleryActionBar().hideClusterMenu();
551f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                mActionMode = mActionModeHandler.startActionMode();
5521f4e6d14bba7290ea0268fbde28ffc664d4f7004Ray Chen                mVibrator.vibrate(100);
553f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                break;
554f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            }
555f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            case SelectionManager.LEAVE_SELECTION_MODE: {
556f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                mActionMode.finish();
5579c21268fa8d394cca6cab78dd023a52e0b147a6eRay Chen                if (mShowClusterMenu) {
5589c21268fa8d394cca6cab78dd023a52e0b147a6eRay Chen                    mActivity.getGalleryActionBar().showClusterMenu(mSelectedAction, this);
5599c21268fa8d394cca6cab78dd023a52e0b147a6eRay Chen                }
560f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                mRootPane.invalidate();
561f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                break;
562f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            }
563f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            case SelectionManager.SELECT_ALL_MODE: {
564f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                mActionModeHandler.setTitle(getSelectedString());
565f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                mRootPane.invalidate();
566f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                break;
567f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            }
568f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
569f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
570f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
571f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public void onSelectionChange(Path path, boolean selected) {
572f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        Utils.assertTrue(mActionMode != null);
573f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mActionModeHandler.setTitle(getSelectedString());
574f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mActionModeHandler.updateSupportedOperation(path, selected);
575f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
576f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
577f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private void hideDetails() {
578f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mShowDetails = false;
5794105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen        mDetailsHelper.hide();
580a4f0526dc8d993fb914d0e6505e22a1f30ad0e14Ray Chen        mAlbumSetView.setSelectionDrawer(mGridDrawer);
581a4f0526dc8d993fb914d0e6505e22a1f30ad0e14Ray Chen        mAlbumSetView.invalidate();
582f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
583f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
584f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private void showDetails() {
585f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mShowDetails = true;
5864105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen        if (mDetailsHelper == null) {
587bc2154199aee16762e3758ad0cfed685323d9a9fChih-Chung Chang            mHighlightDrawer = new HighlightDrawer(mActivity.getAndroidContext(),
588bc2154199aee16762e3758ad0cfed685323d9a9fChih-Chung Chang                    mSelectionManager);
5894105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen            mDetailsHelper = new DetailsHelper(mActivity, mRootPane, mDetailsSource);
5904105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen            mDetailsHelper.setCloseListener(new CloseListener() {
591f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                public void onClose() {
592f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                    hideDetails();
593f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                }
594f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            });
595f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
596f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mAlbumSetView.setSelectionDrawer(mHighlightDrawer);
5974105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen        mDetailsHelper.show();
598f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
599f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
60057cbaa1ef40d2215c6400f5ae4af3a09e67abb2dHung-ying Tyan    @Override
60157cbaa1ef40d2215c6400f5ae4af3a09e67abb2dHung-ying Tyan    public void onSyncDone(final MediaSet mediaSet, final int resultCode) {
60257cbaa1ef40d2215c6400f5ae4af3a09e67abb2dHung-ying Tyan        if (resultCode == MediaSet.SYNC_RESULT_ERROR) {
60357cbaa1ef40d2215c6400f5ae4af3a09e67abb2dHung-ying Tyan            Log.d(TAG, "onSyncDone: " + Utils.maskDebugInfo(mediaSet.getName()) + " result="
60457cbaa1ef40d2215c6400f5ae4af3a09e67abb2dHung-ying Tyan                    + resultCode);
60557cbaa1ef40d2215c6400f5ae4af3a09e67abb2dHung-ying Tyan        }
60657cbaa1ef40d2215c6400f5ae4af3a09e67abb2dHung-ying Tyan        ((Activity) mActivity).runOnUiThread(new Runnable() {
60757cbaa1ef40d2215c6400f5ae4af3a09e67abb2dHung-ying Tyan            @Override
60857cbaa1ef40d2215c6400f5ae4af3a09e67abb2dHung-ying Tyan            public void run() {
609fbdd338d83596ba545a8a7c8105d2ad7b5df56e6Owen Lin                if (resultCode == MediaSet.SYNC_RESULT_SUCCESS) {
610fbdd338d83596ba545a8a7c8105d2ad7b5df56e6Owen Lin                    mInitialSynced = true;
611fbdd338d83596ba545a8a7c8105d2ad7b5df56e6Owen Lin                }
61257cbaa1ef40d2215c6400f5ae4af3a09e67abb2dHung-ying Tyan                if (!mIsActive) return;
613fbdd338d83596ba545a8a7c8105d2ad7b5df56e6Owen Lin                clearLoadingBit(BIT_LOADING_SYNC);
61457cbaa1ef40d2215c6400f5ae4af3a09e67abb2dHung-ying Tyan                if (resultCode == MediaSet.SYNC_RESULT_ERROR) {
61557cbaa1ef40d2215c6400f5ae4af3a09e67abb2dHung-ying Tyan                    Toast.makeText((Context) mActivity, R.string.sync_album_set_error,
61657cbaa1ef40d2215c6400f5ae4af3a09e67abb2dHung-ying Tyan                            Toast.LENGTH_LONG).show();
61757cbaa1ef40d2215c6400f5ae4af3a09e67abb2dHung-ying Tyan                }
61857cbaa1ef40d2215c6400f5ae4af3a09e67abb2dHung-ying Tyan            }
61957cbaa1ef40d2215c6400f5ae4af3a09e67abb2dHung-ying Tyan        });
62057cbaa1ef40d2215c6400f5ae4af3a09e67abb2dHung-ying Tyan    }
62157cbaa1ef40d2215c6400f5ae4af3a09e67abb2dHung-ying Tyan
622f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private class MyLoadingListener implements LoadingListener {
623f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        public void onLoadingStarted() {
624fbdd338d83596ba545a8a7c8105d2ad7b5df56e6Owen Lin            setLoadingBit(BIT_LOADING_RELOAD);
625f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
626f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
627f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        public void onLoadingFinished() {
628f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            if (!mIsActive) return;
629fbdd338d83596ba545a8a7c8105d2ad7b5df56e6Owen Lin            clearLoadingBit(BIT_LOADING_RELOAD);
630f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
631f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
632f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
6334105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen    private class MyDetailsSource implements DetailsHelper.DetailsSource {
634f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        private int mIndex;
635f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        public int size() {
636f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            return mAlbumSetDataAdapter.size();
637f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
638f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
6394105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen        public int getIndex() {
6404105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen            return mIndex;
6414105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen        }
6424105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen
643f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        // If requested index is out of active window, suggest a valid index.
644f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        // If there is no valid index available, return -1.
645f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        public int findIndex(int indexHint) {
646f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            if (mAlbumSetDataAdapter.isActive(indexHint)) {
647f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                mIndex = indexHint;
648f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            } else {
649f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                mIndex = mAlbumSetDataAdapter.getActiveStart();
650f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                if (!mAlbumSetDataAdapter.isActive(mIndex)) {
651f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                    return -1;
652f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                }
653f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            }
654f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            return mIndex;
655f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
656f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
657f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        public MediaDetails getDetails() {
658f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            MediaObject item = mAlbumSetDataAdapter.getMediaSet(mIndex);
659f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            if (item != null) {
660f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                mHighlightDrawer.setHighlightItem(item.getPath());
661f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                return item.getDetails();
662f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            } else {
663f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                return null;
664f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            }
665f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
666f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
667f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin}
668