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