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;
26bcb427870043b12d4a1a454c08a088933d0eaf23Bobby Georgescuimport android.view.HapticFeedbackConstants;
272abaaf7caa9a83ba1ea759868aabde7f21387184John Reckimport android.view.Menu;
282abaaf7caa9a83ba1ea759868aabde7f21387184John Reckimport android.view.MenuInflater;
292abaaf7caa9a83ba1ea759868aabde7f21387184John Reckimport 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;
44a4eae1abb4f2547dfbda84301ee764ce35464881John Reckimport com.android.gallery3d.glrenderer.FadeTexture;
45a4eae1abb4f2547dfbda84301ee764ce35464881John Reckimport com.android.gallery3d.glrenderer.GLCanvas;
46f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.picasasource.PicasaSource;
47f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.settings.GallerySettings;
48f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.ui.ActionModeHandler;
49f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.ui.ActionModeHandler.ActionModeListener;
50c3d8ac3b9504346dafc49e006b5f732dd1db21e8Owen Linimport com.android.gallery3d.ui.AlbumSetSlotRenderer;
514105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chenimport com.android.gallery3d.ui.DetailsHelper;
524105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chenimport com.android.gallery3d.ui.DetailsHelper.CloseListener;
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;
95f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
96f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    protected SelectionManager mSelectionManager;
97c3d8ac3b9504346dafc49e006b5f732dd1db21e8Owen Lin    private AlbumSetDataLoader mAlbumSetDataAdapter;
98f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
99f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private boolean mGetContent;
100f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private boolean mGetAlbum;
101f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private ActionModeHandler mActionModeHandler;
1024105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen    private DetailsHelper mDetailsHelper;
1034105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen    private MyDetailsSource mDetailsSource;
104f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private boolean mShowDetails;
105f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private EyePosition mEyePosition;
10690fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang    private Handler mHandler;
107f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
108f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    // The eyes' position of the user, the origin is at the center of the
109f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    // device and the unit is in pixels.
110f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private float mX;
111f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private float mY;
112f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private float mZ;
113f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
11457cbaa1ef40d2215c6400f5ae4af3a09e67abb2dHung-ying Tyan    private Future<Integer> mSyncTask = null;
11557cbaa1ef40d2215c6400f5ae4af3a09e67abb2dHung-ying Tyan
116fbdd338d83596ba545a8a7c8105d2ad7b5df56e6Owen Lin    private int mLoadingBits = 0;
117fbdd338d83596ba545a8a7c8105d2ad7b5df56e6Owen Lin    private boolean mInitialSynced = false;
118fbdd338d83596ba545a8a7c8105d2ad7b5df56e6Owen Lin
119d208e12012152bf757c0492cd3bfc91f101294ccBobby Georgescu    private Button mCameraButton;
120d208e12012152bf757c0492cd3bfc91f101294ccBobby Georgescu    private boolean mShowedEmptyToastForSelf = false;
121d208e12012152bf757c0492cd3bfc91f101294ccBobby Georgescu
122915c2c5b2c367df71599370613af0924bd7c4887Bobby Georgescu    @Override
123915c2c5b2c367df71599370613af0924bd7c4887Bobby Georgescu    protected int getBackgroundColorId() {
124915c2c5b2c367df71599370613af0924bd7c4887Bobby Georgescu        return R.color.albumset_background;
125915c2c5b2c367df71599370613af0924bd7c4887Bobby Georgescu    }
126915c2c5b2c367df71599370613af0924bd7c4887Bobby Georgescu
127dbf4ba12afba115888493caa34937643257e2bb1Ray Chen    private final GLView mRootPane = new GLView() {
128dbf4ba12afba115888493caa34937643257e2bb1Ray Chen        private final float mMatrix[] = new float[16];
129f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
130f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        @Override
131f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        protected void onLayout(
132f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                boolean changed, int left, int top, int right, int bottom) {
133f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            mEyePosition.resetPosition();
134f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
135f0c89374bfc008fb79ac3cb91cfd6d565d203041Bobby Georgescu            int slotViewTop = mActionBar.getHeight() + mConfig.paddingTop;
136f0c89374bfc008fb79ac3cb91cfd6d565d203041Bobby Georgescu            int slotViewBottom = bottom - top - mConfig.paddingBottom;
137f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            int slotViewRight = right - left;
138f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
139f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            if (mShowDetails) {
1404105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen                mDetailsHelper.layout(left, slotViewTop, right, bottom);
141f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            } else {
14231cac30e46a293f6d0901e22c6ab0d083cae7021Owen Lin                mAlbumSetView.setHighlightItemPath(null);
143f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            }
144f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
1457260f6f74d465520e4497b23fe56f98abb0c15a2Owen Lin            mSlotView.layout(0, slotViewTop, slotViewRight, slotViewBottom);
146f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
147f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
148f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        @Override
149f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        protected void render(GLCanvas canvas) {
150f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            canvas.save(GLCanvas.SAVE_FLAG_MATRIX);
151f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            GalleryUtils.setViewPointMatrix(mMatrix,
152f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                    getWidth() / 2 + mX, getHeight() / 2 + mY, mZ);
153f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            canvas.multiplyMatrix(mMatrix, 0);
154f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            super.render(canvas);
155f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            canvas.restore();
156f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
157f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    };
158f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
159f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    @Override
160f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public void onEyePositionChanged(float x, float y, float z) {
161f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mRootPane.lockRendering();
162f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mX = x;
163f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mY = y;
164f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mZ = z;
165f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mRootPane.unlockRendering();
166f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mRootPane.invalidate();
167f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
168f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
169f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    @Override
170f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public void onBackPressed() {
171f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        if (mShowDetails) {
172f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            hideDetails();
173f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        } else if (mSelectionManager.inSelectionMode()) {
174f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            mSelectionManager.leaveSelectionMode();
175f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        } else {
176f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            super.onBackPressed();
177f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
178f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
179f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
1802341c197b0becf99422e8ad305def77df6161714Owen Lin    private void getSlotCenter(int slotIndex, int center[]) {
181f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        Rect offset = new Rect();
1827260f6f74d465520e4497b23fe56f98abb0c15a2Owen Lin        mRootPane.getBoundsOf(mSlotView, offset);
1837260f6f74d465520e4497b23fe56f98abb0c15a2Owen Lin        Rect r = mSlotView.getSlotRect(slotIndex);
1847260f6f74d465520e4497b23fe56f98abb0c15a2Owen Lin        int scrollX = mSlotView.getScrollX();
1857260f6f74d465520e4497b23fe56f98abb0c15a2Owen Lin        int scrollY = mSlotView.getScrollY();
186f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        center[0] = offset.left + (r.left + r.right) / 2 - scrollX;
187f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        center[1] = offset.top + (r.top + r.bottom) / 2 - scrollY;
188f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
189f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
190f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public void onSingleTapUp(int slotIndex) {
191cf06397b2bc65335fb97d5788f18cad4897126a2Owen Lin        if (!mIsActive) return;
19290fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang
19390fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang        if (mSelectionManager.inSelectionMode()) {
19490fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang            MediaSet targetSet = mAlbumSetDataAdapter.getMediaSet(slotIndex);
19590fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang            if (targetSet == null) return; // Content is dirty, we shall reload soon
19690fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang            mSelectionManager.toggle(targetSet.getPath());
19790fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang            mSlotView.invalidate();
19890fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang        } else {
19990fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang            // Show pressed-up animation for the single-tap.
20090fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang            mAlbumSetView.setPressedIndex(slotIndex);
20190fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang            mAlbumSetView.setPressedUp();
20290fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang            mHandler.sendMessageDelayed(mHandler.obtainMessage(MSG_PICK_ALBUM, slotIndex, 0),
20390fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang                    FadeTexture.DURATION);
20490fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang        }
20590fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang    }
20690fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang
2077eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu    private static boolean albumShouldOpenInFilmstrip(MediaSet album) {
208b265ebb01cc046b74329eeb28dbecb24e0f953d2Bobby Georgescu        int itemCount = album.getMediaItemCount();
20927565de3ab86e81a20c9804ebc7f8d3f737031a0Hung-ying Tyan        ArrayList<MediaItem> list = (itemCount == 1) ? album.getMediaItem(0, 1) : null;
2107a84c578a4b3bea9eebb0b21ac161c18aad49346Bobby Georgescu        // open in film strip only if there's one item in the album and the item exists
2117a84c578a4b3bea9eebb0b21ac161c18aad49346Bobby Georgescu        return (list != null && !list.isEmpty());
2127eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu    }
2137eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu
21409995299480b797254873319caffd5408624988bBobby Georgescu    WeakReference<Toast> mEmptyAlbumToast = null;
21509995299480b797254873319caffd5408624988bBobby Georgescu
21609995299480b797254873319caffd5408624988bBobby Georgescu    private void showEmptyAlbumToast(int toastLength) {
21709995299480b797254873319caffd5408624988bBobby Georgescu        Toast toast;
21809995299480b797254873319caffd5408624988bBobby Georgescu        if (mEmptyAlbumToast != null) {
21909995299480b797254873319caffd5408624988bBobby Georgescu            toast = mEmptyAlbumToast.get();
22009995299480b797254873319caffd5408624988bBobby Georgescu            if (toast != null) {
22109995299480b797254873319caffd5408624988bBobby Georgescu                toast.show();
22209995299480b797254873319caffd5408624988bBobby Georgescu                return;
22309995299480b797254873319caffd5408624988bBobby Georgescu            }
22409995299480b797254873319caffd5408624988bBobby Georgescu        }
22509995299480b797254873319caffd5408624988bBobby Georgescu        toast = Toast.makeText(mActivity, R.string.empty_album, toastLength);
22609995299480b797254873319caffd5408624988bBobby Georgescu        mEmptyAlbumToast = new WeakReference<Toast>(toast);
22709995299480b797254873319caffd5408624988bBobby Georgescu        toast.show();
22809995299480b797254873319caffd5408624988bBobby Georgescu    }
22909995299480b797254873319caffd5408624988bBobby Georgescu
23009995299480b797254873319caffd5408624988bBobby Georgescu    private void hideEmptyAlbumToast() {
23109995299480b797254873319caffd5408624988bBobby Georgescu        if (mEmptyAlbumToast != null) {
23209995299480b797254873319caffd5408624988bBobby Georgescu            Toast toast = mEmptyAlbumToast.get();
23309995299480b797254873319caffd5408624988bBobby Georgescu            if (toast != null) toast.cancel();
23409995299480b797254873319caffd5408624988bBobby Georgescu        }
23509995299480b797254873319caffd5408624988bBobby Georgescu    }
23609995299480b797254873319caffd5408624988bBobby Georgescu
23790fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang    private void pickAlbum(int slotIndex) {
23890fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang        if (!mIsActive) return;
23990fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang
240f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        MediaSet targetSet = mAlbumSetDataAdapter.getMediaSet(slotIndex);
241f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        if (targetSet == null) return; // Content is dirty, we shall reload soon
24209995299480b797254873319caffd5408624988bBobby Georgescu        if (targetSet.getTotalMediaItemCount() == 0) {
24309995299480b797254873319caffd5408624988bBobby Georgescu            showEmptyAlbumToast(Toast.LENGTH_SHORT);
24409995299480b797254873319caffd5408624988bBobby Georgescu            return;
24509995299480b797254873319caffd5408624988bBobby Georgescu        }
24609995299480b797254873319caffd5408624988bBobby Georgescu        hideEmptyAlbumToast();
24709995299480b797254873319caffd5408624988bBobby Georgescu
24890fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang        String mediaPath = targetSet.getPath().toString();
249f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
25090fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang        Bundle data = new Bundle(getData());
25190fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang        int[] center = new int[2];
25290fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang        getSlotCenter(slotIndex, center);
25390fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang        data.putIntArray(AlbumPage.KEY_SET_CENTER, center);
25490fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang        if (mGetAlbum && targetSet.isLeafAlbum()) {
255b21b8e58a604f6c701245d84b141b5b87663192bOwen Lin            Activity activity = mActivity;
25690fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang            Intent result = new Intent()
25790fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang                    .putExtra(AlbumPicker.KEY_ALBUM_PATH, targetSet.getPath().toString());
25890fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang            activity.setResult(Activity.RESULT_OK, result);
25990fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang            activity.finish();
26090fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang        } else if (targetSet.getSubMediaSetCount() > 0) {
26190fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang            data.putString(AlbumSetPage.KEY_MEDIA_PATH, mediaPath);
26290fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang            mActivity.getStateManager().startStateForResult(
26390fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang                    AlbumSetPage.class, REQUEST_DO_ANIMATION, data);
264f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        } else {
265d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu            if (!mGetContent && albumShouldOpenInFilmstrip(targetSet)) {
2666b64c0670429a41b1fabb36e679a36b7e6fa9194Bobby Georgescu                data.putParcelable(PhotoPage.KEY_OPEN_ANIMATION_RECT,
2676b64c0670429a41b1fabb36e679a36b7e6fa9194Bobby Georgescu                        mSlotView.getSlotRect(slotIndex, mRootPane));
2687eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu                data.putInt(PhotoPage.KEY_INDEX_HINT, 0);
2697eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu                data.putString(PhotoPage.KEY_MEDIA_SET_PATH,
2707eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu                        mediaPath);
2717eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu                data.putBoolean(PhotoPage.KEY_START_IN_FILMSTRIP, true);
27245f089d69141e3fb0dfaad9bc34d275b61eb2aeeBobby Georgescu                data.putBoolean(PhotoPage.KEY_IN_CAMERA_ROLL, targetSet.isCameraRoll());
2737eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu                mActivity.getStateManager().startStateForResult(
274cfa7fde1a336a3200b2ad9091b27ba7bfd8f5c9aBobby Georgescu                        FilmstripPage.class, AlbumPage.REQUEST_PHOTO, data);
2757eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu                return;
27690fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang            }
27790fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang            data.putString(AlbumPage.KEY_MEDIA_PATH, mediaPath);
2787eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu
27990fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang            // We only show cluster menu in the first AlbumPage in stack
2807eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu            boolean inAlbum = mActivity.getStateManager().hasStateClass(AlbumPage.class);
28190fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang            data.putBoolean(AlbumPage.KEY_SHOW_CLUSTER_MENU, !inAlbum);
28290fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang            mActivity.getStateManager().startStateForResult(
28390fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang                    AlbumPage.class, REQUEST_DO_ANIMATION, data);
284f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
285f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
286f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
287bc2154199aee16762e3758ad0cfed685323d9a9fChih-Chung Chang    private void onDown(int index) {
28831cac30e46a293f6d0901e22c6ab0d083cae7021Owen Lin        mAlbumSetView.setPressedIndex(index);
289bc2154199aee16762e3758ad0cfed685323d9a9fChih-Chung Chang    }
290bc2154199aee16762e3758ad0cfed685323d9a9fChih-Chung Chang
29190fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang    private void onUp(boolean followedByLongPress) {
29290fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang        if (followedByLongPress) {
29390fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang            // Avoid showing press-up animations for long-press.
29490fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang            mAlbumSetView.setPressedIndex(-1);
29590fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang        } else {
29690fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang            mAlbumSetView.setPressedUp();
29790fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang        }
298bc2154199aee16762e3758ad0cfed685323d9a9fChih-Chung Chang    }
299bc2154199aee16762e3758ad0cfed685323d9a9fChih-Chung Chang
300f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public void onLongTap(int slotIndex) {
301f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        if (mGetContent || mGetAlbum) return;
30290fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang        MediaSet set = mAlbumSetDataAdapter.getMediaSet(slotIndex);
30390fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang        if (set == null) return;
30490fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang        mSelectionManager.setAutoLeaveSelectionMode(true);
30590fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang        mSelectionManager.toggle(set.getPath());
30690fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang        mSlotView.invalidate();
307f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
308f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
3092341c197b0becf99422e8ad305def77df6161714Owen Lin    @Override
310f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public void doCluster(int clusterType) {
311f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        String basePath = mMediaSet.getPath().toString();
312f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        String newPath = FilterUtils.switchClusterPath(basePath, clusterType);
313f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        Bundle data = new Bundle(getData());
314f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        data.putString(AlbumSetPage.KEY_MEDIA_PATH, newPath);
315b5f8d908c5dd287052cd49eddaf1f82d858cca03Ray Chen        data.putInt(KEY_SELECTED_CLUSTER_TYPE, clusterType);
316f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mActivity.getStateManager().switchState(this, AlbumSetPage.class, data);
317f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
318f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
319f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    @Override
320f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public void onCreate(Bundle data, Bundle restoreState) {
32145c56f2d34c71d0bc9b84ebeef6d1314738d0fc0Bobby Georgescu        super.onCreate(data, restoreState);
322f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        initializeViews();
323f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        initializeData(data);
3241f4e6d14bba7290ea0268fbde28ffc664d4f7004Ray Chen        Context context = mActivity.getAndroidContext();
32506c027675948259368a902fd6f8c2ecac5db5167Mangesh Ghiware        mGetContent = data.getBoolean(GalleryActivity.KEY_GET_CONTENT, false);
32606c027675948259368a902fd6f8c2ecac5db5167Mangesh Ghiware        mGetAlbum = data.getBoolean(GalleryActivity.KEY_GET_ALBUM, false);
3279c21268fa8d394cca6cab78dd023a52e0b147a6eRay Chen        mTitle = data.getString(AlbumSetPage.KEY_SET_TITLE);
328f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mSubtitle = data.getString(AlbumSetPage.KEY_SET_SUBTITLE);
3291f4e6d14bba7290ea0268fbde28ffc664d4f7004Ray Chen        mEyePosition = new EyePosition(context, this);
3304105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen        mDetailsSource = new MyDetailsSource();
3318cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen        mActionBar = mActivity.getGalleryActionBar();
3328cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen        mSelectedAction = data.getInt(AlbumSetPage.KEY_SELECTED_CLUSTER_TYPE,
3338cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen                FilterUtils.CLUSTER_BY_ALBUM);
33490fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang
33590fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang        mHandler = new SynchronizedHandler(mActivity.getGLRoot()) {
33690fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang            @Override
33790fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang            public void handleMessage(Message message) {
33890fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang                switch (message.what) {
33990fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang                    case MSG_PICK_ALBUM: {
34090fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang                        pickAlbum(message.arg1);
34190fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang                        break;
34290fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang                    }
34390fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang                    default: throw new AssertionError(message.what);
34490fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang                }
34590fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang            }
34690fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang        };
347f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
348f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
349d208e12012152bf757c0492cd3bfc91f101294ccBobby Georgescu    @Override
350d208e12012152bf757c0492cd3bfc91f101294ccBobby Georgescu    public void onDestroy() {
351d208e12012152bf757c0492cd3bfc91f101294ccBobby Georgescu        super.onDestroy();
352a2d0d34a90543ee19ea295e72c112fde18fb3828Bobby Georgescu        cleanupCameraButton();
353a2d0d34a90543ee19ea295e72c112fde18fb3828Bobby Georgescu        mActionModeHandler.destroy();
354d208e12012152bf757c0492cd3bfc91f101294ccBobby Georgescu    }
355d208e12012152bf757c0492cd3bfc91f101294ccBobby Georgescu
356d208e12012152bf757c0492cd3bfc91f101294ccBobby Georgescu    private boolean setupCameraButton() {
3574f69a058a77f741235a35e85ede78f3b2301861fBobby Georgescu        if (!GalleryUtils.isCameraAvailable(mActivity)) return false;
358d208e12012152bf757c0492cd3bfc91f101294ccBobby Georgescu        RelativeLayout galleryRoot = (RelativeLayout) ((Activity) mActivity)
359d208e12012152bf757c0492cd3bfc91f101294ccBobby Georgescu                .findViewById(R.id.gallery_root);
360d208e12012152bf757c0492cd3bfc91f101294ccBobby Georgescu        if (galleryRoot == null) return false;
361d208e12012152bf757c0492cd3bfc91f101294ccBobby Georgescu
362d208e12012152bf757c0492cd3bfc91f101294ccBobby Georgescu        mCameraButton = new Button(mActivity);
363d208e12012152bf757c0492cd3bfc91f101294ccBobby Georgescu        mCameraButton.setText(R.string.camera_label);
3648cfc7f0ce4bed1538b85b40fe08a5528cac8c270Bobby Georgescu        mCameraButton.setCompoundDrawablesWithIntrinsicBounds(0, R.drawable.frame_overlay_gallery_camera, 0, 0);
365d208e12012152bf757c0492cd3bfc91f101294ccBobby Georgescu        mCameraButton.setOnClickListener(new OnClickListener() {
366d208e12012152bf757c0492cd3bfc91f101294ccBobby Georgescu            @Override
367d208e12012152bf757c0492cd3bfc91f101294ccBobby Georgescu            public void onClick(View arg0) {
368d208e12012152bf757c0492cd3bfc91f101294ccBobby Georgescu                GalleryUtils.startCameraActivity(mActivity);
369d208e12012152bf757c0492cd3bfc91f101294ccBobby Georgescu            }
370d208e12012152bf757c0492cd3bfc91f101294ccBobby Georgescu        });
371d208e12012152bf757c0492cd3bfc91f101294ccBobby Georgescu        RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(
372d208e12012152bf757c0492cd3bfc91f101294ccBobby Georgescu                RelativeLayout.LayoutParams.WRAP_CONTENT,
373d208e12012152bf757c0492cd3bfc91f101294ccBobby Georgescu                RelativeLayout.LayoutParams.WRAP_CONTENT);
374d208e12012152bf757c0492cd3bfc91f101294ccBobby Georgescu        lp.addRule(RelativeLayout.CENTER_IN_PARENT);
375d208e12012152bf757c0492cd3bfc91f101294ccBobby Georgescu        galleryRoot.addView(mCameraButton, lp);
376d208e12012152bf757c0492cd3bfc91f101294ccBobby Georgescu        return true;
377d208e12012152bf757c0492cd3bfc91f101294ccBobby Georgescu    }
378d208e12012152bf757c0492cd3bfc91f101294ccBobby Georgescu
379d208e12012152bf757c0492cd3bfc91f101294ccBobby Georgescu    private void cleanupCameraButton() {
380d208e12012152bf757c0492cd3bfc91f101294ccBobby Georgescu        if (mCameraButton == null) return;
381d208e12012152bf757c0492cd3bfc91f101294ccBobby Georgescu        RelativeLayout galleryRoot = (RelativeLayout) ((Activity) mActivity)
382d208e12012152bf757c0492cd3bfc91f101294ccBobby Georgescu                .findViewById(R.id.gallery_root);
383d208e12012152bf757c0492cd3bfc91f101294ccBobby Georgescu        if (galleryRoot == null) return;
384d208e12012152bf757c0492cd3bfc91f101294ccBobby Georgescu        galleryRoot.removeView(mCameraButton);
385d208e12012152bf757c0492cd3bfc91f101294ccBobby Georgescu        mCameraButton = null;
386d208e12012152bf757c0492cd3bfc91f101294ccBobby Georgescu    }
387d208e12012152bf757c0492cd3bfc91f101294ccBobby Georgescu
388d208e12012152bf757c0492cd3bfc91f101294ccBobby Georgescu    private void showCameraButton() {
389d208e12012152bf757c0492cd3bfc91f101294ccBobby Georgescu        if (mCameraButton == null && !setupCameraButton()) return;
390d208e12012152bf757c0492cd3bfc91f101294ccBobby Georgescu        mCameraButton.setVisibility(View.VISIBLE);
391d208e12012152bf757c0492cd3bfc91f101294ccBobby Georgescu    }
392d208e12012152bf757c0492cd3bfc91f101294ccBobby Georgescu
393d208e12012152bf757c0492cd3bfc91f101294ccBobby Georgescu    private void hideCameraButton() {
394d208e12012152bf757c0492cd3bfc91f101294ccBobby Georgescu        if (mCameraButton == null) return;
395d208e12012152bf757c0492cd3bfc91f101294ccBobby Georgescu        mCameraButton.setVisibility(View.GONE);
396d208e12012152bf757c0492cd3bfc91f101294ccBobby Georgescu    }
397d208e12012152bf757c0492cd3bfc91f101294ccBobby Georgescu
398fbdd338d83596ba545a8a7c8105d2ad7b5df56e6Owen Lin    private void clearLoadingBit(int loadingBit) {
399fbdd338d83596ba545a8a7c8105d2ad7b5df56e6Owen Lin        mLoadingBits &= ~loadingBit;
400d05b0be120bb217b4f56add24a4b31bee92455b2Chih-Chung Chang        if (mLoadingBits == 0 && mIsActive) {
401d208e12012152bf757c0492cd3bfc91f101294ccBobby Georgescu            if (mAlbumSetDataAdapter.size() == 0) {
40209995299480b797254873319caffd5408624988bBobby Georgescu                // If this is not the top of the gallery folder hierarchy,
40309995299480b797254873319caffd5408624988bBobby Georgescu                // tell the parent AlbumSetPage instance to handle displaying
40409995299480b797254873319caffd5408624988bBobby Georgescu                // the empty album toast, otherwise show it within this
40509995299480b797254873319caffd5408624988bBobby Georgescu                // instance
406fbdd338d83596ba545a8a7c8105d2ad7b5df56e6Owen Lin                if (mActivity.getStateManager().getStateCount() > 1) {
40709995299480b797254873319caffd5408624988bBobby Georgescu                    Intent result = new Intent();
40809995299480b797254873319caffd5408624988bBobby Georgescu                    result.putExtra(AlbumPage.KEY_EMPTY_ALBUM, true);
40909995299480b797254873319caffd5408624988bBobby Georgescu                    setStateResult(Activity.RESULT_OK, result);
410fbdd338d83596ba545a8a7c8105d2ad7b5df56e6Owen Lin                    mActivity.getStateManager().finishState(this);
4115992daf6f4cb56742cbf33a014c5c2c142c6957eBobby Georgescu                } else {
41209995299480b797254873319caffd5408624988bBobby Georgescu                    mShowedEmptyToastForSelf = true;
41309995299480b797254873319caffd5408624988bBobby Georgescu                    showEmptyAlbumToast(Toast.LENGTH_LONG);
41477fa1d232c1a804d17f3b1ceeaa6ab6c6555b047Bobby Georgescu                    mSlotView.invalidate();
415d208e12012152bf757c0492cd3bfc91f101294ccBobby Georgescu                    showCameraButton();
416fbdd338d83596ba545a8a7c8105d2ad7b5df56e6Owen Lin                }
41709995299480b797254873319caffd5408624988bBobby Georgescu                return;
418fbdd338d83596ba545a8a7c8105d2ad7b5df56e6Owen Lin            }
419fbdd338d83596ba545a8a7c8105d2ad7b5df56e6Owen Lin        }
42009995299480b797254873319caffd5408624988bBobby Georgescu        // Hide the empty album toast if we are in the root instance of
42109995299480b797254873319caffd5408624988bBobby Georgescu        // AlbumSetPage and the album is no longer empty (for instance,
42209995299480b797254873319caffd5408624988bBobby Georgescu        // after a sync is completed and web albums have been synced)
42309995299480b797254873319caffd5408624988bBobby Georgescu        if (mShowedEmptyToastForSelf) {
42409995299480b797254873319caffd5408624988bBobby Georgescu            mShowedEmptyToastForSelf = false;
42509995299480b797254873319caffd5408624988bBobby Georgescu            hideEmptyAlbumToast();
426d208e12012152bf757c0492cd3bfc91f101294ccBobby Georgescu            hideCameraButton();
4275992daf6f4cb56742cbf33a014c5c2c142c6957eBobby Georgescu        }
4285992daf6f4cb56742cbf33a014c5c2c142c6957eBobby Georgescu    }
4295992daf6f4cb56742cbf33a014c5c2c142c6957eBobby Georgescu
430fbdd338d83596ba545a8a7c8105d2ad7b5df56e6Owen Lin    private void setLoadingBit(int loadingBit) {
431fbdd338d83596ba545a8a7c8105d2ad7b5df56e6Owen Lin        mLoadingBits |= loadingBit;
432fbdd338d83596ba545a8a7c8105d2ad7b5df56e6Owen Lin    }
433fbdd338d83596ba545a8a7c8105d2ad7b5df56e6Owen Lin
434f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    @Override
435f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public void onPause() {
436f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        super.onPause();
437f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mIsActive = false;
438f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mAlbumSetDataAdapter.pause();
439f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mAlbumSetView.pause();
440a2d0d34a90543ee19ea295e72c112fde18fb3828Bobby Georgescu        mActionModeHandler.pause();
441f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mEyePosition.pause();
4424105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen        DetailsHelper.pause();
443fe1625c46f8258be4cd5e5e1ba69b584c1fe1a49Ray Chen        // Call disableClusterMenu to avoid receiving callback after paused.
444fe1625c46f8258be4cd5e5e1ba69b584c1fe1a49Ray Chen        // Don't hide menu here otherwise the list menu will disappear earlier than
445fe1625c46f8258be4cd5e5e1ba69b584c1fe1a49Ray Chen        // the action bar, which is janky and unwanted behavior.
4468cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen        mActionBar.disableClusterMenu(false);
44757cbaa1ef40d2215c6400f5ae4af3a09e67abb2dHung-ying Tyan        if (mSyncTask != null) {
44857cbaa1ef40d2215c6400f5ae4af3a09e67abb2dHung-ying Tyan            mSyncTask.cancel();
44957cbaa1ef40d2215c6400f5ae4af3a09e67abb2dHung-ying Tyan            mSyncTask = null;
450fbdd338d83596ba545a8a7c8105d2ad7b5df56e6Owen Lin            clearLoadingBit(BIT_LOADING_SYNC);
45157cbaa1ef40d2215c6400f5ae4af3a09e67abb2dHung-ying Tyan        }
452f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
453f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
454f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    @Override
455f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public void onResume() {
456f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        super.onResume();
457f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mIsActive = true;
458f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        setContentPane(mRootPane);
459fe49be45412f8d0f68343662318e73822da486c8Owen Lin
460fe49be45412f8d0f68343662318e73822da486c8Owen Lin        // Set the reload bit here to prevent it exit this page in clearLoadingBit().
461fe49be45412f8d0f68343662318e73822da486c8Owen Lin        setLoadingBit(BIT_LOADING_RELOAD);
462f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mAlbumSetDataAdapter.resume();
463fe49be45412f8d0f68343662318e73822da486c8Owen Lin
464f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mAlbumSetView.resume();
465f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mEyePosition.resume();
466f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mActionModeHandler.resume();
4678cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen        if (mShowClusterMenu) {
4688cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen            mActionBar.enableClusterMenu(mSelectedAction, this);
469dbf4ba12afba115888493caa34937643257e2bb1Ray Chen        }
470fbdd338d83596ba545a8a7c8105d2ad7b5df56e6Owen Lin        if (!mInitialSynced) {
471fbdd338d83596ba545a8a7c8105d2ad7b5df56e6Owen Lin            setLoadingBit(BIT_LOADING_SYNC);
472fe49be45412f8d0f68343662318e73822da486c8Owen Lin            mSyncTask = mMediaSet.requestSync(AlbumSetPage.this);
473fbdd338d83596ba545a8a7c8105d2ad7b5df56e6Owen Lin        }
474f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
475f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
476f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private void initializeData(Bundle data) {
477f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        String mediaPath = data.getString(AlbumSetPage.KEY_MEDIA_PATH);
478f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mMediaSet = mActivity.getDataManager().getMediaSet(mediaPath);
479f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mSelectionManager.setSourceMediaSet(mMediaSet);
480c3d8ac3b9504346dafc49e006b5f732dd1db21e8Owen Lin        mAlbumSetDataAdapter = new AlbumSetDataLoader(
481f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                mActivity, mMediaSet, DATA_CACHE_SIZE);
482f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mAlbumSetDataAdapter.setLoadingListener(new MyLoadingListener());
483f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mAlbumSetView.setModel(mAlbumSetDataAdapter);
484f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
485f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
486f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private void initializeViews() {
487f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mSelectionManager = new SelectionManager(mActivity, true);
488f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mSelectionManager.setSelectionListener(this);
489f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
490b21b8e58a604f6c701245d84b141b5b87663192bOwen Lin        mConfig = Config.AlbumSetPage.get(mActivity);
491f0c89374bfc008fb79ac3cb91cfd6d565d203041Bobby Georgescu        mSlotView = new SlotView(mActivity, mConfig.slotViewSpec);
492c3d8ac3b9504346dafc49e006b5f732dd1db21e8Owen Lin        mAlbumSetView = new AlbumSetSlotRenderer(
493915c2c5b2c367df71599370613af0924bd7c4887Bobby Georgescu                mActivity, mSelectionManager, mSlotView, mConfig.labelSpec,
494915c2c5b2c367df71599370613af0924bd7c4887Bobby Georgescu                mConfig.placeholderColor);
4957260f6f74d465520e4497b23fe56f98abb0c15a2Owen Lin        mSlotView.setSlotRenderer(mAlbumSetView);
4967260f6f74d465520e4497b23fe56f98abb0c15a2Owen Lin        mSlotView.setListener(new SlotView.SimpleListener() {
497f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            @Override
498bc2154199aee16762e3758ad0cfed685323d9a9fChih-Chung Chang            public void onDown(int index) {
499bc2154199aee16762e3758ad0cfed685323d9a9fChih-Chung Chang                AlbumSetPage.this.onDown(index);
500bc2154199aee16762e3758ad0cfed685323d9a9fChih-Chung Chang            }
501bc2154199aee16762e3758ad0cfed685323d9a9fChih-Chung Chang
502bc2154199aee16762e3758ad0cfed685323d9a9fChih-Chung Chang            @Override
50390fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang            public void onUp(boolean followedByLongPress) {
50490fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang                AlbumSetPage.this.onUp(followedByLongPress);
505bc2154199aee16762e3758ad0cfed685323d9a9fChih-Chung Chang            }
506bc2154199aee16762e3758ad0cfed685323d9a9fChih-Chung Chang
507bc2154199aee16762e3758ad0cfed685323d9a9fChih-Chung Chang            @Override
508f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            public void onSingleTapUp(int slotIndex) {
509f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                AlbumSetPage.this.onSingleTapUp(slotIndex);
510f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            }
511bc2154199aee16762e3758ad0cfed685323d9a9fChih-Chung Chang
512f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            @Override
513f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            public void onLongTap(int slotIndex) {
514f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                AlbumSetPage.this.onLongTap(slotIndex);
515f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            }
516f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        });
517f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
518f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mActionModeHandler = new ActionModeHandler(mActivity, mSelectionManager);
519f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mActionModeHandler.setActionModeListener(new ActionModeListener() {
5202341c197b0becf99422e8ad305def77df6161714Owen Lin            @Override
521f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            public boolean onActionItemClicked(MenuItem item) {
522f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                return onItemSelected(item);
523f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            }
524f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        });
5257260f6f74d465520e4497b23fe56f98abb0c15a2Owen Lin        mRootPane.addComponent(mSlotView);
526f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
527f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
528f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    @Override
529f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    protected boolean onCreateActionBar(Menu menu) {
530b21b8e58a604f6c701245d84b141b5b87663192bOwen Lin        Activity activity = mActivity;
5312bb717f1ea38e2ce33dd102a23afe6bfacb5675cOwen Lin        final boolean inAlbum = mActivity.getStateManager().hasStateClass(AlbumPage.class);
532b21b8e58a604f6c701245d84b141b5b87663192bOwen Lin        MenuInflater inflater = getSupportMenuInflater();
533b21b8e58a604f6c701245d84b141b5b87663192bOwen Lin
534f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        if (mGetContent) {
535b21b8e58a604f6c701245d84b141b5b87663192bOwen Lin            inflater.inflate(R.menu.pickup, menu);
536f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            int typeBits = mData.getInt(
53706c027675948259368a902fd6f8c2ecac5db5167Mangesh Ghiware                    GalleryActivity.KEY_TYPE_BITS, DataManager.INCLUDE_IMAGE);
5389a93949a6ab6348b1a600496a7d52267620aab95Ahbong Chang            mActionBar.setTitle(GalleryUtils.getSelectionModePrompt(typeBits));
539f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        } else  if (mGetAlbum) {
540b21b8e58a604f6c701245d84b141b5b87663192bOwen Lin            inflater.inflate(R.menu.pickup, menu);
5418cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen            mActionBar.setTitle(R.string.select_album);
542f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        } else {
543b21b8e58a604f6c701245d84b141b5b87663192bOwen Lin            inflater.inflate(R.menu.albumset, menu);
5443fd764008a73dd76be87b02f42d0e00786015c8aBobby Georgescu            boolean wasShowingClusterMenu = mShowClusterMenu;
545b5f8d908c5dd287052cd49eddaf1f82d858cca03Ray Chen            mShowClusterMenu = !inAlbum;
5462bb717f1ea38e2ce33dd102a23afe6bfacb5675cOwen Lin            boolean selectAlbums = !inAlbum &&
5472bb717f1ea38e2ce33dd102a23afe6bfacb5675cOwen Lin                    mActionBar.getClusterTypeAction() == FilterUtils.CLUSTER_BY_ALBUM;
548b21b8e58a604f6c701245d84b141b5b87663192bOwen Lin            MenuItem selectItem = menu.findItem(R.id.action_select);
549b21b8e58a604f6c701245d84b141b5b87663192bOwen Lin            selectItem.setTitle(activity.getString(
5502bb717f1ea38e2ce33dd102a23afe6bfacb5675cOwen Lin                    selectAlbums ? R.string.select_album : R.string.select_group));
551f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
552b21b8e58a604f6c701245d84b141b5b87663192bOwen Lin            MenuItem cameraItem = menu.findItem(R.id.action_camera);
553b21b8e58a604f6c701245d84b141b5b87663192bOwen Lin            cameraItem.setVisible(GalleryUtils.isCameraAvailable(activity));
554f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
555b21b8e58a604f6c701245d84b141b5b87663192bOwen Lin            FilterUtils.setupMenuItems(mActionBar, mMediaSet.getPath(), false);
5562bb717f1ea38e2ce33dd102a23afe6bfacb5675cOwen Lin
55706e34ad198138a9b9b5252af9dd54f2915d0551fJohn Reck            Intent helpIntent = HelpUtils.getHelpIntent(activity);
558b21b8e58a604f6c701245d84b141b5b87663192bOwen Lin
559b21b8e58a604f6c701245d84b141b5b87663192bOwen Lin            MenuItem helpItem = menu.findItem(R.id.action_general_help);
560b21b8e58a604f6c701245d84b141b5b87663192bOwen Lin            helpItem.setVisible(helpIntent != null);
561b21b8e58a604f6c701245d84b141b5b87663192bOwen Lin            if (helpIntent != null) helpItem.setIntent(helpIntent);
562b21b8e58a604f6c701245d84b141b5b87663192bOwen Lin
5638cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen            mActionBar.setTitle(mTitle);
5648cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen            mActionBar.setSubtitle(mSubtitle);
5653fd764008a73dd76be87b02f42d0e00786015c8aBobby Georgescu            if (mShowClusterMenu != wasShowingClusterMenu) {
5663fd764008a73dd76be87b02f42d0e00786015c8aBobby Georgescu                if (mShowClusterMenu) {
5673fd764008a73dd76be87b02f42d0e00786015c8aBobby Georgescu                    mActionBar.enableClusterMenu(mSelectedAction, this);
5683fd764008a73dd76be87b02f42d0e00786015c8aBobby Georgescu                } else {
5693fd764008a73dd76be87b02f42d0e00786015c8aBobby Georgescu                    mActionBar.disableClusterMenu(true);
5703fd764008a73dd76be87b02f42d0e00786015c8aBobby Georgescu                }
5713fd764008a73dd76be87b02f42d0e00786015c8aBobby Georgescu            }
572f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
573b21b8e58a604f6c701245d84b141b5b87663192bOwen Lin        return true;
574f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
575f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
576f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    @Override
577f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    protected boolean onItemSelected(MenuItem item) {
578b21b8e58a604f6c701245d84b141b5b87663192bOwen Lin        Activity activity = mActivity;
579f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        switch (item.getItemId()) {
580bd8e025f1bb39b2be236b183ea8e78f93b308ad1Ray Chen            case R.id.action_cancel:
581bd8e025f1bb39b2be236b183ea8e78f93b308ad1Ray Chen                activity.setResult(Activity.RESULT_CANCELED);
582bd8e025f1bb39b2be236b183ea8e78f93b308ad1Ray Chen                activity.finish();
583bd8e025f1bb39b2be236b183ea8e78f93b308ad1Ray Chen                return true;
584f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            case R.id.action_select:
585f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                mSelectionManager.setAutoLeaveSelectionMode(false);
586f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                mSelectionManager.enterSelectionMode();
587f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                return true;
588f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            case R.id.action_details:
589f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                if (mAlbumSetDataAdapter.size() != 0) {
590f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                    if (mShowDetails) {
591f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                        hideDetails();
592f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                    } else {
593f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                        showDetails();
594f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                    }
595f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                } else {
596f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                    Toast.makeText(activity,
597f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                            activity.getText(R.string.no_albums_alert),
598f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                            Toast.LENGTH_SHORT).show();
599f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                }
600f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                return true;
601f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            case R.id.action_camera: {
602402237b43fd853377e5dba4e048839ad23b99d72Chih-Chung Chang                GalleryUtils.startCameraActivity(activity);
603f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                return true;
604f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            }
605f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            case R.id.action_manage_offline: {
6066cf807453fb58ccd4cc513ff187b306c7090e67cOwen Lin                Bundle data = new Bundle();
6076cf807453fb58ccd4cc513ff187b306c7090e67cOwen Lin                String mediaPath = mActivity.getDataManager().getTopSetPath(
6086cf807453fb58ccd4cc513ff187b306c7090e67cOwen Lin                    DataManager.INCLUDE_ALL);
6096cf807453fb58ccd4cc513ff187b306c7090e67cOwen Lin                data.putString(AlbumSetPage.KEY_MEDIA_PATH, mediaPath);
6106cf807453fb58ccd4cc513ff187b306c7090e67cOwen Lin                mActivity.getStateManager().startState(ManageCachePage.class, data);
611f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                return true;
612f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            }
613f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            case R.id.action_sync_picasa_albums: {
614f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                PicasaSource.requestSync(activity);
615f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                return true;
616f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            }
617f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            case R.id.action_settings: {
618f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                activity.startActivity(new Intent(activity, GallerySettings.class));
619f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                return true;
620f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            }
621f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            default:
622f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                return false;
623f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
624f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
625f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
626f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    @Override
627f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    protected void onStateResult(int requestCode, int resultCode, Intent data) {
62809995299480b797254873319caffd5408624988bBobby Georgescu        if (data != null && data.getBooleanExtra(AlbumPage.KEY_EMPTY_ALBUM, false)) {
62909995299480b797254873319caffd5408624988bBobby Georgescu            showEmptyAlbumToast(Toast.LENGTH_SHORT);
63009995299480b797254873319caffd5408624988bBobby Georgescu        }
631f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        switch (requestCode) {
632f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            case REQUEST_DO_ANIMATION: {
6332341c197b0becf99422e8ad305def77df6161714Owen Lin                mSlotView.startRisingAnimation();
634f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            }
635f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
636f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
637f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
638f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private String getSelectedString() {
639f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        int count = mSelectionManager.getSelectedCount();
6408cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen        int action = mActionBar.getClusterTypeAction();
641f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        int string = action == FilterUtils.CLUSTER_BY_ALBUM
642f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                ? R.plurals.number_of_albums_selected
643f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                : R.plurals.number_of_groups_selected;
644f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        String format = mActivity.getResources().getQuantityString(string, count);
645f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        return String.format(format, count);
646f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
647f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
6482341c197b0becf99422e8ad305def77df6161714Owen Lin    @Override
649f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public void onSelectionModeChange(int mode) {
650f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        switch (mode) {
651f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            case SelectionManager.ENTER_SELECTION_MODE: {
6528cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen                mActionBar.disableClusterMenu(true);
6532bb717f1ea38e2ce33dd102a23afe6bfacb5675cOwen Lin                mActionModeHandler.startActionMode();
654bcb427870043b12d4a1a454c08a088933d0eaf23Bobby Georgescu                performHapticFeedback(HapticFeedbackConstants.LONG_PRESS);
655f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                break;
656f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            }
657f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            case SelectionManager.LEAVE_SELECTION_MODE: {
6582bb717f1ea38e2ce33dd102a23afe6bfacb5675cOwen Lin                mActionModeHandler.finishActionMode();
6599c21268fa8d394cca6cab78dd023a52e0b147a6eRay Chen                if (mShowClusterMenu) {
6608cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen                    mActionBar.enableClusterMenu(mSelectedAction, this);
6619c21268fa8d394cca6cab78dd023a52e0b147a6eRay Chen                }
662f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                mRootPane.invalidate();
663f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                break;
664f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            }
665f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            case SelectionManager.SELECT_ALL_MODE: {
66621c2e665fdc1d1af0c91ab9c104d13fb7dc2444eRay Chen                mActionModeHandler.updateSupportedOperation();
667f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                mRootPane.invalidate();
668f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                break;
669f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            }
670f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
671f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
672f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
6732341c197b0becf99422e8ad305def77df6161714Owen Lin    @Override
674f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public void onSelectionChange(Path path, boolean selected) {
675f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mActionModeHandler.setTitle(getSelectedString());
676f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mActionModeHandler.updateSupportedOperation(path, selected);
677f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
678f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
679f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private void hideDetails() {
680f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mShowDetails = false;
6814105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen        mDetailsHelper.hide();
68231cac30e46a293f6d0901e22c6ab0d083cae7021Owen Lin        mAlbumSetView.setHighlightItemPath(null);
6837260f6f74d465520e4497b23fe56f98abb0c15a2Owen Lin        mSlotView.invalidate();
684f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
685f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
686f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private void showDetails() {
687f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mShowDetails = true;
6884105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen        if (mDetailsHelper == null) {
6894105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen            mDetailsHelper = new DetailsHelper(mActivity, mRootPane, mDetailsSource);
6904105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen            mDetailsHelper.setCloseListener(new CloseListener() {
6912341c197b0becf99422e8ad305def77df6161714Owen Lin                @Override
692f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                public void onClose() {
693f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                    hideDetails();
694f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                }
695f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            });
696f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
6974105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen        mDetailsHelper.show();
698f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
699f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
70057cbaa1ef40d2215c6400f5ae4af3a09e67abb2dHung-ying Tyan    @Override
70157cbaa1ef40d2215c6400f5ae4af3a09e67abb2dHung-ying Tyan    public void onSyncDone(final MediaSet mediaSet, final int resultCode) {
70257cbaa1ef40d2215c6400f5ae4af3a09e67abb2dHung-ying Tyan        if (resultCode == MediaSet.SYNC_RESULT_ERROR) {
70357cbaa1ef40d2215c6400f5ae4af3a09e67abb2dHung-ying Tyan            Log.d(TAG, "onSyncDone: " + Utils.maskDebugInfo(mediaSet.getName()) + " result="
70457cbaa1ef40d2215c6400f5ae4af3a09e67abb2dHung-ying Tyan                    + resultCode);
70557cbaa1ef40d2215c6400f5ae4af3a09e67abb2dHung-ying Tyan        }
70657cbaa1ef40d2215c6400f5ae4af3a09e67abb2dHung-ying Tyan        ((Activity) mActivity).runOnUiThread(new Runnable() {
70757cbaa1ef40d2215c6400f5ae4af3a09e67abb2dHung-ying Tyan            @Override
70857cbaa1ef40d2215c6400f5ae4af3a09e67abb2dHung-ying Tyan            public void run() {
70971632ac6c1596dd1fd477f95e268f96ad72ea572Owen Lin                GLRoot root = mActivity.getGLRoot();
71071632ac6c1596dd1fd477f95e268f96ad72ea572Owen Lin                root.lockRenderThread();
71171632ac6c1596dd1fd477f95e268f96ad72ea572Owen Lin                try {
71271632ac6c1596dd1fd477f95e268f96ad72ea572Owen Lin                    if (resultCode == MediaSet.SYNC_RESULT_SUCCESS) {
71371632ac6c1596dd1fd477f95e268f96ad72ea572Owen Lin                        mInitialSynced = true;
71471632ac6c1596dd1fd477f95e268f96ad72ea572Owen Lin                    }
71571632ac6c1596dd1fd477f95e268f96ad72ea572Owen Lin                    clearLoadingBit(BIT_LOADING_SYNC);
71671632ac6c1596dd1fd477f95e268f96ad72ea572Owen Lin                    if (resultCode == MediaSet.SYNC_RESULT_ERROR && mIsActive) {
717e8c1e69f85efb8673d0606f3aca729a366038753Ray Chen                        Log.w(TAG, "failed to load album set");
71871632ac6c1596dd1fd477f95e268f96ad72ea572Owen Lin                    }
71971632ac6c1596dd1fd477f95e268f96ad72ea572Owen Lin                } finally {
72071632ac6c1596dd1fd477f95e268f96ad72ea572Owen Lin                    root.unlockRenderThread();
72157cbaa1ef40d2215c6400f5ae4af3a09e67abb2dHung-ying Tyan                }
72257cbaa1ef40d2215c6400f5ae4af3a09e67abb2dHung-ying Tyan            }
72357cbaa1ef40d2215c6400f5ae4af3a09e67abb2dHung-ying Tyan        });
72457cbaa1ef40d2215c6400f5ae4af3a09e67abb2dHung-ying Tyan    }
72557cbaa1ef40d2215c6400f5ae4af3a09e67abb2dHung-ying Tyan
726f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private class MyLoadingListener implements LoadingListener {
7272341c197b0becf99422e8ad305def77df6161714Owen Lin        @Override
728f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        public void onLoadingStarted() {
729fbdd338d83596ba545a8a7c8105d2ad7b5df56e6Owen Lin            setLoadingBit(BIT_LOADING_RELOAD);
730f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
731f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
7322341c197b0becf99422e8ad305def77df6161714Owen Lin        @Override
73305da3f520eacb9219964b6ed57ef37846d889fd7Hung-ying Tyan        public void onLoadingFinished(boolean loadingFailed) {
734fbdd338d83596ba545a8a7c8105d2ad7b5df56e6Owen Lin            clearLoadingBit(BIT_LOADING_RELOAD);
735f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
736f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
737f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
7384105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen    private class MyDetailsSource implements DetailsHelper.DetailsSource {
739f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        private int mIndex;
7402341c197b0becf99422e8ad305def77df6161714Owen Lin
7412341c197b0becf99422e8ad305def77df6161714Owen Lin        @Override
742f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        public int size() {
743f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            return mAlbumSetDataAdapter.size();
744f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
745f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
7462341c197b0becf99422e8ad305def77df6161714Owen Lin        @Override
747995c4566bed7df1aa48ba7e1351f964efa73880bMichael Kolb        public int setIndex() {
748995c4566bed7df1aa48ba7e1351f964efa73880bMichael Kolb            Path id = mSelectionManager.getSelected(false).get(0);
749995c4566bed7df1aa48ba7e1351f964efa73880bMichael Kolb            mIndex = mAlbumSetDataAdapter.findSet(id);
750f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            return mIndex;
751f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
752f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
7532341c197b0becf99422e8ad305def77df6161714Owen Lin        @Override
754f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        public MediaDetails getDetails() {
755f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            MediaObject item = mAlbumSetDataAdapter.getMediaSet(mIndex);
756f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            if (item != null) {
75731cac30e46a293f6d0901e22c6ab0d083cae7021Owen Lin                mAlbumSetView.setHighlightItemPath(item.getPath());
758f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                return item.getDetails();
759f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            } else {
760f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                return null;
761f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            }
762f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
763f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
764f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin}
765