1f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin/*
2f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * Copyright (C) 2010 The Android Open Source Project
3f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin *
4f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * Licensed under the Apache License, Version 2.0 (the "License");
5f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * you may not use this file except in compliance with the License.
6f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * You may obtain a copy of the License at
7f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin *
8f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin *      http://www.apache.org/licenses/LICENSE-2.0
9f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin *
10f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * Unless required by applicable law or agreed to in writing, software
11f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * distributed under the License is distributed on an "AS IS" BASIS,
12f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * See the License for the specific language governing permissions and
14f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * limitations under the License.
15f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin */
16f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
17f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linpackage com.android.gallery3d.app;
18f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
191f4e6d14bba7290ea0268fbde28ffc664d4f7004Ray Chenimport android.app.Activity;
201f4e6d14bba7290ea0268fbde28ffc664d4f7004Ray Chenimport android.content.Context;
211f4e6d14bba7290ea0268fbde28ffc664d4f7004Ray Chenimport android.content.Intent;
2204ac045bf8da5082bbb0bdc9ea5f9c9b5b796ad0Yuli Huangimport android.graphics.Rect;
231f4e6d14bba7290ea0268fbde28ffc664d4f7004Ray Chenimport android.net.Uri;
241f4e6d14bba7290ea0268fbde28ffc664d4f7004Ray Chenimport android.os.Bundle;
2526e119cebe732582df086ff56ec564d2989042fdBobby Georgescuimport android.os.Handler;
2626e119cebe732582df086ff56ec564d2989042fdBobby Georgescuimport android.os.Message;
271f4e6d14bba7290ea0268fbde28ffc664d4f7004Ray Chenimport android.provider.MediaStore;
28bcb427870043b12d4a1a454c08a088933d0eaf23Bobby Georgescuimport android.view.HapticFeedbackConstants;
292abaaf7caa9a83ba1ea759868aabde7f21387184John Reckimport android.view.Menu;
302abaaf7caa9a83ba1ea759868aabde7f21387184John Reckimport android.view.MenuInflater;
312abaaf7caa9a83ba1ea759868aabde7f21387184John Reckimport android.view.MenuItem;
321f4e6d14bba7290ea0268fbde28ffc664d4f7004Ray Chenimport android.widget.Toast;
331f4e6d14bba7290ea0268fbde28ffc664d4f7004Ray Chen
34f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.R;
35f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.common.Utils;
36f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.data.DataManager;
37f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.data.MediaDetails;
38f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.data.MediaItem;
39f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.data.MediaObject;
40f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.data.MediaSet;
41f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.data.Path;
42d25fdea42988c72312ab3be0be76ab75e4d944c8Ruben Brunkimport com.android.gallery3d.filtershow.crop.CropActivity;
436fe165b7d28299d5b2f97deb135b233d84eb300fRuben Brunkimport com.android.gallery3d.filtershow.crop.CropExtras;
442abaaf7caa9a83ba1ea759868aabde7f21387184John Reckimport com.android.gallery3d.glrenderer.FadeTexture;
452abaaf7caa9a83ba1ea759868aabde7f21387184John Reckimport com.android.gallery3d.glrenderer.GLCanvas;
46f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.ui.ActionModeHandler;
47f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.ui.ActionModeHandler.ActionModeListener;
48c3d8ac3b9504346dafc49e006b5f732dd1db21e8Owen Linimport com.android.gallery3d.ui.AlbumSlotRenderer;
494105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chenimport com.android.gallery3d.ui.DetailsHelper;
504105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chenimport com.android.gallery3d.ui.DetailsHelper.CloseListener;
5171632ac6c1596dd1fd477f95e268f96ad72ea572Owen Linimport com.android.gallery3d.ui.GLRoot;
52f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.ui.GLView;
53616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Linimport com.android.gallery3d.ui.PhotoFallbackEffect;
542341c197b0becf99422e8ad305def77df6161714Owen Linimport com.android.gallery3d.ui.RelativePosition;
55f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.ui.SelectionManager;
56f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.ui.SlotView;
5726e119cebe732582df086ff56ec564d2989042fdBobby Georgescuimport com.android.gallery3d.ui.SynchronizedHandler;
58f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.util.Future;
59f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.util.GalleryUtils;
60402237b43fd853377e5dba4e048839ad23b99d72Chih-Chung Changimport com.android.gallery3d.util.MediaSetUtils;
61795776f67fe5bca902b09c01edec630879263341Ruben Brunk
62f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
63f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linpublic class AlbumPage extends ActivityState implements GalleryActionBar.ClusterRunner,
643cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu        SelectionManager.SelectionListener, MediaSet.SyncListener, GalleryActionBar.OnAlbumModeSelectedListener {
65f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    @SuppressWarnings("unused")
66f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private static final String TAG = "AlbumPage";
67f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
68f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public static final String KEY_MEDIA_PATH = "media-path";
6984c220f10a643927c8a2126de8a755d8d7f7ec9eRay Chen    public static final String KEY_PARENT_MEDIA_PATH = "parent-media-path";
70f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public static final String KEY_SET_CENTER = "set-center";
71f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public static final String KEY_AUTO_SELECT_ALL = "auto-select-all";
72f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public static final String KEY_SHOW_CLUSTER_MENU = "cluster-menu";
7309995299480b797254873319caffd5408624988bBobby Georgescu    public static final String KEY_EMPTY_ALBUM = "empty-album";
74616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin    public static final String KEY_RESUME_ANIMATION = "resume_animation";
75f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
76f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private static final int REQUEST_SLIDESHOW = 1;
777eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu    public static final int REQUEST_PHOTO = 2;
78f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private static final int REQUEST_DO_ANIMATION = 3;
79f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
80fbdd338d83596ba545a8a7c8105d2ad7b5df56e6Owen Lin    private static final int BIT_LOADING_RELOAD = 1;
81fbdd338d83596ba545a8a7c8105d2ad7b5df56e6Owen Lin    private static final int BIT_LOADING_SYNC = 2;
82fbdd338d83596ba545a8a7c8105d2ad7b5df56e6Owen Lin
83f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private static final float USER_DISTANCE_METER = 0.3f;
84f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
85f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private boolean mIsActive = false;
86c3d8ac3b9504346dafc49e006b5f732dd1db21e8Owen Lin    private AlbumSlotRenderer mAlbumView;
87f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private Path mMediaSetPath;
8884c220f10a643927c8a2126de8a755d8d7f7ec9eRay Chen    private String mParentMediaSetString;
897260f6f74d465520e4497b23fe56f98abb0c15a2Owen Lin    private SlotView mSlotView;
90f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
91c3d8ac3b9504346dafc49e006b5f732dd1db21e8Owen Lin    private AlbumDataLoader mAlbumDataAdapter;
92f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
93f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    protected SelectionManager mSelectionManager;
94f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
95f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private boolean mGetContent;
96f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private boolean mShowClusterMenu;
97f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
98f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private ActionModeHandler mActionModeHandler;
99f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private int mFocusIndex = 0;
1004105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen    private DetailsHelper mDetailsHelper;
1014105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen    private MyDetailsSource mDetailsSource;
102f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private MediaSet mMediaSet;
103f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private boolean mShowDetails;
104f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private float mUserDistance; // in pixel
10557cbaa1ef40d2215c6400f5ae4af3a09e67abb2dHung-ying Tyan    private Future<Integer> mSyncTask = null;
1067eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu    private boolean mLaunchedFromPhotoPage;
10700ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu    private boolean mInCameraApp;
10835e7b4ae727394aace466ebcf33d89adf01b690cBobby Georgescu    private boolean mInCameraAndWantQuitOnPause;
109f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
110fbdd338d83596ba545a8a7c8105d2ad7b5df56e6Owen Lin    private int mLoadingBits = 0;
111fbdd338d83596ba545a8a7c8105d2ad7b5df56e6Owen Lin    private boolean mInitialSynced = false;
11205da3f520eacb9219964b6ed57ef37846d889fd7Hung-ying Tyan    private int mSyncResult;
11305da3f520eacb9219964b6ed57ef37846d889fd7Hung-ying Tyan    private boolean mLoadingFailed;
1142341c197b0becf99422e8ad305def77df6161714Owen Lin    private RelativePosition mOpenCenter = new RelativePosition();
115fbdd338d83596ba545a8a7c8105d2ad7b5df56e6Owen Lin
11626e119cebe732582df086ff56ec564d2989042fdBobby Georgescu    private Handler mHandler;
11726e119cebe732582df086ff56ec564d2989042fdBobby Georgescu    private static final int MSG_PICK_PHOTO = 0;
11826e119cebe732582df086ff56ec564d2989042fdBobby Georgescu
119616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin    private PhotoFallbackEffect mResumeEffect;
120616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin    private PhotoFallbackEffect.PositionProvider mPositionProvider =
121616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin            new PhotoFallbackEffect.PositionProvider() {
122616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin        @Override
123616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin        public Rect getPosition(int index) {
124616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin            Rect rect = mSlotView.getSlotRect(index);
125616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin            Rect bounds = mSlotView.bounds();
126616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin            rect.offset(bounds.left - mSlotView.getScrollX(),
127616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin                    bounds.top - mSlotView.getScrollY());
128616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin            return rect;
129616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin        }
130616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin
131616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin        @Override
132616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin        public int getItemIndex(Path path) {
133616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin            int start = mSlotView.getVisibleStart();
134616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin            int end = mSlotView.getVisibleEnd();
135616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin            for (int i = start; i < end; ++i) {
136616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin                MediaItem item = mAlbumDataAdapter.get(i);
137616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin                if (item != null && item.getPath() == path) return i;
138616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin            }
139616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin            return -1;
140616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin        }
141616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin    };
142616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin
143915c2c5b2c367df71599370613af0924bd7c4887Bobby Georgescu    @Override
144915c2c5b2c367df71599370613af0924bd7c4887Bobby Georgescu    protected int getBackgroundColorId() {
145915c2c5b2c367df71599370613af0924bd7c4887Bobby Georgescu        return R.color.album_background;
146915c2c5b2c367df71599370613af0924bd7c4887Bobby Georgescu    }
147915c2c5b2c367df71599370613af0924bd7c4887Bobby Georgescu
1489170edf4071e0ef4a64e9af579a1e711447cfcfcRay Chen    private final GLView mRootPane = new GLView() {
1499170edf4071e0ef4a64e9af579a1e711447cfcfcRay Chen        private final float mMatrix[] = new float[16];
150f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
151f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        @Override
152f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        protected void onLayout(
153f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                boolean changed, int left, int top, int right, int bottom) {
154f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
1558cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen            int slotViewTop = mActivity.getGalleryActionBar().getHeight();
156f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            int slotViewBottom = bottom - top;
157f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            int slotViewRight = right - left;
158f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
159f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            if (mShowDetails) {
1604105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen                mDetailsHelper.layout(left, slotViewTop, right, bottom);
161f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            } else {
16231cac30e46a293f6d0901e22c6ab0d083cae7021Owen Lin                mAlbumView.setHighlightItemPath(null);
163f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            }
164f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
1652341c197b0becf99422e8ad305def77df6161714Owen Lin            // Set the mSlotView as a reference point to the open animation
1662341c197b0becf99422e8ad305def77df6161714Owen Lin            mOpenCenter.setReferencePosition(0, slotViewTop);
1677260f6f74d465520e4497b23fe56f98abb0c15a2Owen Lin            mSlotView.layout(0, slotViewTop, slotViewRight, slotViewBottom);
168f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            GalleryUtils.setViewPointMatrix(mMatrix,
169f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                    (right - left) / 2, (bottom - top) / 2, -mUserDistance);
170f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
171f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
172f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        @Override
173f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        protected void render(GLCanvas canvas) {
174f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            canvas.save(GLCanvas.SAVE_FLAG_MATRIX);
175f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            canvas.multiplyMatrix(mMatrix, 0);
176f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            super.render(canvas);
177616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin
178616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin            if (mResumeEffect != null) {
179616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin                boolean more = mResumeEffect.draw(canvas);
180616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin                if (!more) {
181616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin                    mResumeEffect = null;
182616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin                    mAlbumView.setSlotFilter(null);
183616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin                }
18437c605949219b8bf54c165c34d6405f5f2989f50Owen Lin                // We want to render one more time even when no more effect
18537c605949219b8bf54c165c34d6405f5f2989f50Owen Lin                // required. So that the animated thumbnails could be draw
18637c605949219b8bf54c165c34d6405f5f2989f50Owen Lin                // with declarations in super.render().
18737c605949219b8bf54c165c34d6405f5f2989f50Owen Lin                invalidate();
188616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin            }
189f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            canvas.restore();
190f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
191f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    };
192f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
193b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang    // This are the transitions we want:
194b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang    //
195b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang    // +--------+           +------------+    +-------+    +----------+
196b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang    // | Camera |---------->| Fullscreen |--->| Album |--->| AlbumSet |
197b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang    // |  View  | thumbnail |   Photo    | up | Page  | up |   Page   |
198b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang    // +--------+           +------------+    +-------+    +----------+
199b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang    //     ^                      |               |            ^  |
200b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang    //     |                      |               |            |  |         close
201b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang    //     +----------back--------+               +----back----+  +--back->  app
202b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang    //
203f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    @Override
204f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    protected void onBackPressed() {
205f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        if (mShowDetails) {
206f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            hideDetails();
207f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        } else if (mSelectionManager.inSelectionMode()) {
208f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            mSelectionManager.leaveSelectionMode();
209f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        } else {
21000ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu            if(mLaunchedFromPhotoPage) {
21100ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu                mActivity.getTransitionStore().putIfNotPresent(
21200ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu                        PhotoPage.KEY_ALBUMPAGE_TRANSITION,
21300ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu                        PhotoPage.MSG_ALBUMPAGE_RESUMED);
21400ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu            }
2157260f6f74d465520e4497b23fe56f98abb0c15a2Owen Lin            // TODO: fix this regression
2167260f6f74d465520e4497b23fe56f98abb0c15a2Owen Lin            // mAlbumView.savePositions(PositionRepository.getInstance(mActivity));
217624ed9df710ac4e34f3ff1d0c3bf4acd1c056258Bobby Georgescu            if (mInCameraApp) {
218624ed9df710ac4e34f3ff1d0c3bf4acd1c056258Bobby Georgescu                super.onBackPressed();
219624ed9df710ac4e34f3ff1d0c3bf4acd1c056258Bobby Georgescu            } else {
220624ed9df710ac4e34f3ff1d0c3bf4acd1c056258Bobby Georgescu                onUpPressed();
221624ed9df710ac4e34f3ff1d0c3bf4acd1c056258Bobby Georgescu            }
222b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang        }
223b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang    }
224b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang
225b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang    private void onUpPressed() {
226833f775afc9515567dc5aaf0cafe20e006e77545Bobby Georgescu        if (mInCameraApp) {
227833f775afc9515567dc5aaf0cafe20e006e77545Bobby Georgescu            GalleryUtils.startGalleryActivity(mActivity);
228833f775afc9515567dc5aaf0cafe20e006e77545Bobby Georgescu        } else if (mActivity.getStateManager().getStateCount() > 1) {
229f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            super.onBackPressed();
230b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang        } else if (mParentMediaSetString != null) {
231b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang            Bundle data = new Bundle(getData());
232b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang            data.putString(AlbumSetPage.KEY_MEDIA_PATH, mParentMediaSetString);
233b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang            mActivity.getStateManager().switchState(
234b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang                    this, AlbumSetPage.class, data);
235f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
236f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
237f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
238bc2154199aee16762e3758ad0cfed685323d9a9fChih-Chung Chang    private void onDown(int index) {
23931cac30e46a293f6d0901e22c6ab0d083cae7021Owen Lin        mAlbumView.setPressedIndex(index);
240bc2154199aee16762e3758ad0cfed685323d9a9fChih-Chung Chang    }
241bc2154199aee16762e3758ad0cfed685323d9a9fChih-Chung Chang
24290fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang    private void onUp(boolean followedByLongPress) {
24390fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang        if (followedByLongPress) {
24490fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang            // Avoid showing press-up animations for long-press.
24590fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang            mAlbumView.setPressedIndex(-1);
24690fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang        } else {
24790fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang            mAlbumView.setPressedUp();
24890fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang        }
249bc2154199aee16762e3758ad0cfed685323d9a9fChih-Chung Chang    }
250bc2154199aee16762e3758ad0cfed685323d9a9fChih-Chung Chang
25104ac045bf8da5082bbb0bdc9ea5f9c9b5b796ad0Yuli Huang    private void onSingleTapUp(int slotIndex) {
252cf06397b2bc65335fb97d5788f18cad4897126a2Owen Lin        if (!mIsActive) return;
25390fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang
25490fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang        if (mSelectionManager.inSelectionMode()) {
25590fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang            MediaItem item = mAlbumDataAdapter.get(slotIndex);
25690fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang            if (item == null) return; // Item not ready yet, ignore the click
257f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            mSelectionManager.toggle(item.getPath());
2587260f6f74d465520e4497b23fe56f98abb0c15a2Owen Lin            mSlotView.invalidate();
25990fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang        } else {
260766941ee72831a2c76defb4d826cab24d918e0dfBobby Georgescu            // Render transition in pressed state
26190fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang            mAlbumView.setPressedIndex(slotIndex);
26226e119cebe732582df086ff56ec564d2989042fdBobby Georgescu            mAlbumView.setPressedUp();
26326e119cebe732582df086ff56ec564d2989042fdBobby Georgescu            mHandler.sendMessageDelayed(mHandler.obtainMessage(MSG_PICK_PHOTO, slotIndex, 0),
26426e119cebe732582df086ff56ec564d2989042fdBobby Georgescu                    FadeTexture.DURATION);
26590fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang        }
26690fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang    }
26790fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang
26890fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang    private void pickPhoto(int slotIndex) {
2697eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu        pickPhoto(slotIndex, false);
2707eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu    }
2717eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu
2727eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu    private void pickPhoto(int slotIndex, boolean startInFilmstrip) {
27390fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang        if (!mIsActive) return;
27490fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang
2757eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu        if (!startInFilmstrip) {
2767eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu            // Launch photos in lights out mode
2777eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu            mActivity.getGLRoot().setLightsOutMode(true);
2787eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu        }
2797eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu
28090fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang        MediaItem item = mAlbumDataAdapter.get(slotIndex);
28190fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang        if (item == null) return; // Item not ready yet, ignore the click
28290fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang        if (mGetContent) {
28390fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang            onGetContent(item);
2847eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu        } else if (mLaunchedFromPhotoPage) {
2857eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu            TransitionStore transitions = mActivity.getTransitionStore();
2867eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu            transitions.put(
2877eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu                    PhotoPage.KEY_ALBUMPAGE_TRANSITION,
2887eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu                    PhotoPage.MSG_ALBUMPAGE_PICKED);
2897eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu            transitions.put(PhotoPage.KEY_INDEX_HINT, slotIndex);
2907eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu            onBackPressed();
29190fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang        } else {
29290fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang            // Get into the PhotoPage.
29390fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang            // mAlbumView.savePositions(PositionRepository.getInstance(mActivity));
29490fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang            Bundle data = new Bundle();
29590fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang            data.putInt(PhotoPage.KEY_INDEX_HINT, slotIndex);
29690fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang            data.putParcelable(PhotoPage.KEY_OPEN_ANIMATION_RECT,
29751bc561e85053abfd7fda695e3cd20710acca85cBobby Georgescu                    mSlotView.getSlotRect(slotIndex, mRootPane));
29890fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang            data.putString(PhotoPage.KEY_MEDIA_SET_PATH,
29990fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang                    mMediaSetPath.toString());
30090fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang            data.putString(PhotoPage.KEY_MEDIA_ITEM_PATH,
30190fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang                    item.getPath().toString());
3027eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu            data.putInt(PhotoPage.KEY_ALBUMPAGE_TRANSITION,
3037eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu                    PhotoPage.MSG_ALBUMPAGE_STARTED);
3047eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu            data.putBoolean(PhotoPage.KEY_START_IN_FILMSTRIP,
3057eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu                    startInFilmstrip);
3062aec8488aebe3d28a0a32c67d6629dfa4db4acaeBobby Georgescu            data.putBoolean(PhotoPage.KEY_IN_CAMERA_ROLL, mMediaSet.isCameraRoll());
3075585826e68c62c3719fb346d40fd1999438c6c6bBobby Georgescu            if (startInFilmstrip) {
308cfa7fde1a336a3200b2ad9091b27ba7bfd8f5c9aBobby Georgescu                mActivity.getStateManager().switchState(this, FilmstripPage.class, data);
3095585826e68c62c3719fb346d40fd1999438c6c6bBobby Georgescu            } else {
3105585826e68c62c3719fb346d40fd1999438c6c6bBobby Georgescu                mActivity.getStateManager().startStateForResult(
311cfa7fde1a336a3200b2ad9091b27ba7bfd8f5c9aBobby Georgescu                            SinglePhotoPage.class, REQUEST_PHOTO, data);
3125585826e68c62c3719fb346d40fd1999438c6c6bBobby Georgescu            }
313f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
314f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
315f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
316f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private void onGetContent(final MediaItem item) {
317f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        DataManager dm = mActivity.getDataManager();
318b21b8e58a604f6c701245d84b141b5b87663192bOwen Lin        Activity activity = mActivity;
31906c027675948259368a902fd6f8c2ecac5db5167Mangesh Ghiware        if (mData.getString(GalleryActivity.EXTRA_CROP) != null) {
320f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            Uri uri = dm.getContentUri(item.getPath());
321d25fdea42988c72312ab3be0be76ab75e4d944c8Ruben Brunk            Intent intent = new Intent(CropActivity.CROP_ACTION, uri)
322f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                    .addFlags(Intent.FLAG_ACTIVITY_FORWARD_RESULT)
323f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                    .putExtras(getData());
324f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            if (mData.getParcelable(MediaStore.EXTRA_OUTPUT) == null) {
325795776f67fe5bca902b09c01edec630879263341Ruben Brunk                intent.putExtra(CropExtras.KEY_RETURN_DATA, true);
326f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            }
327f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            activity.startActivity(intent);
328f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            activity.finish();
329f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        } else {
3301c38d440b454698093f3f5c867b4bad5bf74716fMangesh Ghiware            Intent intent = new Intent(null, item.getContentUri())
3311c38d440b454698093f3f5c867b4bad5bf74716fMangesh Ghiware                .addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
3321c38d440b454698093f3f5c867b4bad5bf74716fMangesh Ghiware            activity.setResult(Activity.RESULT_OK, intent);
333f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            activity.finish();
334f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
335f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
336f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
337f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public void onLongTap(int slotIndex) {
338f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        if (mGetContent) return;
33990fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang        MediaItem item = mAlbumDataAdapter.get(slotIndex);
34090fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang        if (item == null) return;
34190fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang        mSelectionManager.setAutoLeaveSelectionMode(true);
34290fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang        mSelectionManager.toggle(item.getPath());
34390fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang        mSlotView.invalidate();
344f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
345f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
3462341c197b0becf99422e8ad305def77df6161714Owen Lin    @Override
347f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public void doCluster(int clusterType) {
348f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        String basePath = mMediaSet.getPath().toString();
349f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        String newPath = FilterUtils.newClusterPath(basePath, clusterType);
350f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        Bundle data = new Bundle(getData());
351f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        data.putString(AlbumSetPage.KEY_MEDIA_PATH, newPath);
352f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        if (mShowClusterMenu) {
353f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            Context context = mActivity.getAndroidContext();
354f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            data.putString(AlbumSetPage.KEY_SET_TITLE, mMediaSet.getName());
355f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            data.putString(AlbumSetPage.KEY_SET_SUBTITLE,
356f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                    GalleryActionBar.getClusterByTypeString(context, clusterType));
357f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
358f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
3597260f6f74d465520e4497b23fe56f98abb0c15a2Owen Lin        // mAlbumView.savePositions(PositionRepository.getInstance(mActivity));
360f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mActivity.getStateManager().startStateForResult(
361f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                AlbumSetPage.class, REQUEST_DO_ANIMATION, data);
362f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
363f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
364f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    @Override
365f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    protected void onCreate(Bundle data, Bundle restoreState) {
36645c56f2d34c71d0bc9b84ebeef6d1314738d0fc0Bobby Georgescu        super.onCreate(data, restoreState);
367f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mUserDistance = GalleryUtils.meterToPixel(USER_DISTANCE_METER);
368f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        initializeViews();
369f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        initializeData(data);
37006c027675948259368a902fd6f8c2ecac5db5167Mangesh Ghiware        mGetContent = data.getBoolean(GalleryActivity.KEY_GET_CONTENT, false);
371f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mShowClusterMenu = data.getBoolean(KEY_SHOW_CLUSTER_MENU, false);
3724105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen        mDetailsSource = new MyDetailsSource();
3731f4e6d14bba7290ea0268fbde28ffc664d4f7004Ray Chen        Context context = mActivity.getAndroidContext();
374f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
375f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        if (data.getBoolean(KEY_AUTO_SELECT_ALL)) {
376f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            mSelectionManager.selectAll();
377f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
378f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
3797eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu        mLaunchedFromPhotoPage =
380cfa7fde1a336a3200b2ad9091b27ba7bfd8f5c9aBobby Georgescu                mActivity.getStateManager().hasStateClass(FilmstripPage.class);
38100ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu        mInCameraApp = data.getBoolean(PhotoPage.KEY_APP_BRIDGE, false);
38226e119cebe732582df086ff56ec564d2989042fdBobby Georgescu
38326e119cebe732582df086ff56ec564d2989042fdBobby Georgescu        mHandler = new SynchronizedHandler(mActivity.getGLRoot()) {
38426e119cebe732582df086ff56ec564d2989042fdBobby Georgescu            @Override
38526e119cebe732582df086ff56ec564d2989042fdBobby Georgescu            public void handleMessage(Message message) {
38626e119cebe732582df086ff56ec564d2989042fdBobby Georgescu                switch (message.what) {
38726e119cebe732582df086ff56ec564d2989042fdBobby Georgescu                    case MSG_PICK_PHOTO: {
38826e119cebe732582df086ff56ec564d2989042fdBobby Georgescu                        pickPhoto(message.arg1);
38926e119cebe732582df086ff56ec564d2989042fdBobby Georgescu                        break;
39026e119cebe732582df086ff56ec564d2989042fdBobby Georgescu                    }
39126e119cebe732582df086ff56ec564d2989042fdBobby Georgescu                    default:
39226e119cebe732582df086ff56ec564d2989042fdBobby Georgescu                        throw new AssertionError(message.what);
39326e119cebe732582df086ff56ec564d2989042fdBobby Georgescu                }
39426e119cebe732582df086ff56ec564d2989042fdBobby Georgescu            }
39526e119cebe732582df086ff56ec564d2989042fdBobby Georgescu        };
396f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
397f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
398f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    @Override
399f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    protected void onResume() {
400f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        super.onResume();
401f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mIsActive = true;
402616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin
403616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin        mResumeEffect = mActivity.getTransitionStore().get(KEY_RESUME_ANIMATION);
404616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin        if (mResumeEffect != null) {
405616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin            mAlbumView.setSlotFilter(mResumeEffect);
406616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin            mResumeEffect.setPositionProvider(mPositionProvider);
407616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin            mResumeEffect.start();
408616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin        }
409616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin
410f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        setContentPane(mRootPane);
411fe49be45412f8d0f68343662318e73822da486c8Owen Lin
41284c220f10a643927c8a2126de8a755d8d7f7ec9eRay Chen        boolean enableHomeButton = (mActivity.getStateManager().getStateCount() > 1) |
41384c220f10a643927c8a2126de8a755d8d7f7ec9eRay Chen                mParentMediaSetString != null;
4143cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu        GalleryActionBar actionBar = mActivity.getGalleryActionBar();
4153cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu        actionBar.setDisplayOptions(enableHomeButton, false);
4164c9e3e1d7a5af64ddc946297db9d07dc394d861eBobby Georgescu        if (!mGetContent) {
4174c9e3e1d7a5af64ddc946297db9d07dc394d861eBobby Georgescu            actionBar.enableAlbumModeMenu(GalleryActionBar.ALBUM_GRID_MODE_SELECTED, this);
4184c9e3e1d7a5af64ddc946297db9d07dc394d861eBobby Georgescu        }
41984c220f10a643927c8a2126de8a755d8d7f7ec9eRay Chen
420fe49be45412f8d0f68343662318e73822da486c8Owen Lin        // Set the reload bit here to prevent it exit this page in clearLoadingBit().
421fe49be45412f8d0f68343662318e73822da486c8Owen Lin        setLoadingBit(BIT_LOADING_RELOAD);
42205da3f520eacb9219964b6ed57ef37846d889fd7Hung-ying Tyan        mLoadingFailed = false;
423f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mAlbumDataAdapter.resume();
424fe49be45412f8d0f68343662318e73822da486c8Owen Lin
425f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mAlbumView.resume();
4265585826e68c62c3719fb346d40fd1999438c6c6bBobby Georgescu        mAlbumView.setPressedIndex(-1);
427f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mActionModeHandler.resume();
428fbdd338d83596ba545a8a7c8105d2ad7b5df56e6Owen Lin        if (!mInitialSynced) {
429fbdd338d83596ba545a8a7c8105d2ad7b5df56e6Owen Lin            setLoadingBit(BIT_LOADING_SYNC);
430fe49be45412f8d0f68343662318e73822da486c8Owen Lin            mSyncTask = mMediaSet.requestSync(this);
431fbdd338d83596ba545a8a7c8105d2ad7b5df56e6Owen Lin        }
43235e7b4ae727394aace466ebcf33d89adf01b690cBobby Georgescu        mInCameraAndWantQuitOnPause = mInCameraApp;
433f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
434f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
435f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    @Override
436f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    protected void onPause() {
437f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        super.onPause();
438f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mIsActive = false;
439616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin
4402daced6baacd59850e7c64ea02f2479530654ed8Doris Liu        if (mSelectionManager.inSelectionMode()) {
4412daced6baacd59850e7c64ea02f2479530654ed8Doris Liu            mSelectionManager.leaveSelectionMode();
4422daced6baacd59850e7c64ea02f2479530654ed8Doris Liu        }
443616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin        mAlbumView.setSlotFilter(null);
444a2d0d34a90543ee19ea295e72c112fde18fb3828Bobby Georgescu        mActionModeHandler.pause();
445f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mAlbumDataAdapter.pause();
446f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mAlbumView.pause();
4474105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen        DetailsHelper.pause();
4484c9e3e1d7a5af64ddc946297db9d07dc394d861eBobby Georgescu        if (!mGetContent) {
4494c9e3e1d7a5af64ddc946297db9d07dc394d861eBobby Georgescu            mActivity.getGalleryActionBar().disableAlbumModeMenu(true);
4504c9e3e1d7a5af64ddc946297db9d07dc394d861eBobby Georgescu        }
451fbdd338d83596ba545a8a7c8105d2ad7b5df56e6Owen Lin
452f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        if (mSyncTask != null) {
453f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            mSyncTask.cancel();
454f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            mSyncTask = null;
455d05b0be120bb217b4f56add24a4b31bee92455b2Chih-Chung Chang            clearLoadingBit(BIT_LOADING_SYNC);
456f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
457f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
458f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
459f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    @Override
460f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    protected void onDestroy() {
46157cbaa1ef40d2215c6400f5ae4af3a09e67abb2dHung-ying Tyan        super.onDestroy();
462f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        if (mAlbumDataAdapter != null) {
463f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            mAlbumDataAdapter.setLoadingListener(null);
464f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
465a2d0d34a90543ee19ea295e72c112fde18fb3828Bobby Georgescu        mActionModeHandler.destroy();
466f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
467f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
468f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private void initializeViews() {
469f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mSelectionManager = new SelectionManager(mActivity, false);
470f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mSelectionManager.setSelectionListener(this);
471b21b8e58a604f6c701245d84b141b5b87663192bOwen Lin        Config.AlbumPage config = Config.AlbumPage.get(mActivity);
47248ba94ae713dbf57898cfa84ae69517da50cf7a0Owen Lin        mSlotView = new SlotView(mActivity, config.slotViewSpec);
473915c2c5b2c367df71599370613af0924bd7c4887Bobby Georgescu        mAlbumView = new AlbumSlotRenderer(mActivity, mSlotView,
474915c2c5b2c367df71599370613af0924bd7c4887Bobby Georgescu                mSelectionManager, config.placeholderColor);
4757260f6f74d465520e4497b23fe56f98abb0c15a2Owen Lin        mSlotView.setSlotRenderer(mAlbumView);
4767260f6f74d465520e4497b23fe56f98abb0c15a2Owen Lin        mRootPane.addComponent(mSlotView);
4777260f6f74d465520e4497b23fe56f98abb0c15a2Owen Lin        mSlotView.setListener(new SlotView.SimpleListener() {
478f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            @Override
479bc2154199aee16762e3758ad0cfed685323d9a9fChih-Chung Chang            public void onDown(int index) {
480bc2154199aee16762e3758ad0cfed685323d9a9fChih-Chung Chang                AlbumPage.this.onDown(index);
481bc2154199aee16762e3758ad0cfed685323d9a9fChih-Chung Chang            }
482bc2154199aee16762e3758ad0cfed685323d9a9fChih-Chung Chang
483bc2154199aee16762e3758ad0cfed685323d9a9fChih-Chung Chang            @Override
48490fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang            public void onUp(boolean followedByLongPress) {
48590fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang                AlbumPage.this.onUp(followedByLongPress);
486bc2154199aee16762e3758ad0cfed685323d9a9fChih-Chung Chang            }
487bc2154199aee16762e3758ad0cfed685323d9a9fChih-Chung Chang
488bc2154199aee16762e3758ad0cfed685323d9a9fChih-Chung Chang            @Override
489f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            public void onSingleTapUp(int slotIndex) {
490f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                AlbumPage.this.onSingleTapUp(slotIndex);
491f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            }
492bc2154199aee16762e3758ad0cfed685323d9a9fChih-Chung Chang
493f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            @Override
494f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            public void onLongTap(int slotIndex) {
495f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                AlbumPage.this.onLongTap(slotIndex);
496f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            }
497f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        });
498f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mActionModeHandler = new ActionModeHandler(mActivity, mSelectionManager);
499f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mActionModeHandler.setActionModeListener(new ActionModeListener() {
5007817979db0c52ffeacb951625b1e821eba303285Ahbong Chang            @Override
501f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            public boolean onActionItemClicked(MenuItem item) {
502f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                return onItemSelected(item);
503f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            }
504f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        });
505f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
506f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
507f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private void initializeData(Bundle data) {
508f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mMediaSetPath = Path.fromString(data.getString(KEY_MEDIA_PATH));
50984c220f10a643927c8a2126de8a755d8d7f7ec9eRay Chen        mParentMediaSetString = data.getString(KEY_PARENT_MEDIA_PATH);
510f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mMediaSet = mActivity.getDataManager().getMediaSet(mMediaSetPath);
511cfa105d3934c4dfa14f02b693bfa97c8d17d56a9Chih-Chung Chang        if (mMediaSet == null) {
512cfa105d3934c4dfa14f02b693bfa97c8d17d56a9Chih-Chung Chang            Utils.fail("MediaSet is null. Path = %s", mMediaSetPath);
513cfa105d3934c4dfa14f02b693bfa97c8d17d56a9Chih-Chung Chang        }
514f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mSelectionManager.setSourceMediaSet(mMediaSet);
515c3d8ac3b9504346dafc49e006b5f732dd1db21e8Owen Lin        mAlbumDataAdapter = new AlbumDataLoader(mActivity, mMediaSet);
516f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mAlbumDataAdapter.setLoadingListener(new MyLoadingListener());
517f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mAlbumView.setModel(mAlbumDataAdapter);
518f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
519f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
520f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private void showDetails() {
521f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mShowDetails = true;
5224105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen        if (mDetailsHelper == null) {
5234105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen            mDetailsHelper = new DetailsHelper(mActivity, mRootPane, mDetailsSource);
5244105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen            mDetailsHelper.setCloseListener(new CloseListener() {
5257817979db0c52ffeacb951625b1e821eba303285Ahbong Chang                @Override
526f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                public void onClose() {
527f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                    hideDetails();
528f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                }
529f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            });
530f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
5314105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen        mDetailsHelper.show();
532f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
533f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
534f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private void hideDetails() {
535f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mShowDetails = false;
5364105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen        mDetailsHelper.hide();
53731cac30e46a293f6d0901e22c6ab0d083cae7021Owen Lin        mAlbumView.setHighlightItemPath(null);
5387260f6f74d465520e4497b23fe56f98abb0c15a2Owen Lin        mSlotView.invalidate();
539f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
540f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
541f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    @Override
542f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    protected boolean onCreateActionBar(Menu menu) {
543f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        GalleryActionBar actionBar = mActivity.getGalleryActionBar();
544b21b8e58a604f6c701245d84b141b5b87663192bOwen Lin        MenuInflater inflator = getSupportMenuInflater();
545f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        if (mGetContent) {
546b21b8e58a604f6c701245d84b141b5b87663192bOwen Lin            inflator.inflate(R.menu.pickup, menu);
54706c027675948259368a902fd6f8c2ecac5db5167Mangesh Ghiware            int typeBits = mData.getInt(GalleryActivity.KEY_TYPE_BITS,
548f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                    DataManager.INCLUDE_IMAGE);
549f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            actionBar.setTitle(GalleryUtils.getSelectionModePrompt(typeBits));
550f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        } else {
551b21b8e58a604f6c701245d84b141b5b87663192bOwen Lin            inflator.inflate(R.menu.album, menu);
552f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            actionBar.setTitle(mMediaSet.getName());
553b21b8e58a604f6c701245d84b141b5b87663192bOwen Lin
554f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            FilterUtils.setupMenuItems(actionBar, mMediaSetPath, true);
555b21b8e58a604f6c701245d84b141b5b87663192bOwen Lin
556b21b8e58a604f6c701245d84b141b5b87663192bOwen Lin            menu.findItem(R.id.action_group_by).setVisible(mShowClusterMenu);
557b21b8e58a604f6c701245d84b141b5b87663192bOwen Lin            menu.findItem(R.id.action_camera).setVisible(
5582bb717f1ea38e2ce33dd102a23afe6bfacb5675cOwen Lin                    MediaSetUtils.isCameraSource(mMediaSetPath)
559b21b8e58a604f6c701245d84b141b5b87663192bOwen Lin                    && GalleryUtils.isCameraAvailable(mActivity));
560402237b43fd853377e5dba4e048839ad23b99d72Chih-Chung Chang
561f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
562f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        actionBar.setSubtitle(null);
563b21b8e58a604f6c701245d84b141b5b87663192bOwen Lin        return true;
564f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
565f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
5667eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu    private void prepareAnimationBackToFilmstrip(int slotIndex) {
567d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu        if (mAlbumDataAdapter == null || !mAlbumDataAdapter.isActive(slotIndex)) return;
56800ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu        MediaItem item = mAlbumDataAdapter.get(slotIndex);
56900ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu        if (item == null) return;
5707eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu        TransitionStore transitions = mActivity.getTransitionStore();
5717eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu        transitions.put(PhotoPage.KEY_INDEX_HINT, slotIndex);
5727eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu        transitions.put(PhotoPage.KEY_OPEN_ANIMATION_RECT,
57351bc561e85053abfd7fda695e3cd20710acca85cBobby Georgescu                mSlotView.getSlotRect(slotIndex, mRootPane));
5747eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu    }
5757eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu
5763cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu    private void switchToFilmstrip() {
5773cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu        if (mAlbumDataAdapter.size() < 1) return;
5783cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu        int targetPhoto = mSlotView.getVisibleStart();
5793cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu        prepareAnimationBackToFilmstrip(targetPhoto);
5803cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu        if(mLaunchedFromPhotoPage) {
5813cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu            onBackPressed();
5823cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu        } else {
5833cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu            pickPhoto(targetPhoto, true);
5843cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu        }
5853cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu    }
5863cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu
587f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    @Override
588f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    protected boolean onItemSelected(MenuItem item) {
589f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        switch (item.getItemId()) {
59084c220f10a643927c8a2126de8a755d8d7f7ec9eRay Chen            case android.R.id.home: {
591b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang                onUpPressed();
59284c220f10a643927c8a2126de8a755d8d7f7ec9eRay Chen                return true;
59384c220f10a643927c8a2126de8a755d8d7f7ec9eRay Chen            }
594bd8e025f1bb39b2be236b183ea8e78f93b308ad1Ray Chen            case R.id.action_cancel:
595bd8e025f1bb39b2be236b183ea8e78f93b308ad1Ray Chen                mActivity.getStateManager().finishState(this);
596bd8e025f1bb39b2be236b183ea8e78f93b308ad1Ray Chen                return true;
597f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            case R.id.action_select:
598f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                mSelectionManager.setAutoLeaveSelectionMode(false);
599f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                mSelectionManager.enterSelectionMode();
600f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                return true;
601f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            case R.id.action_group_by: {
602f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                mActivity.getGalleryActionBar().showClusterDialog(this);
603f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                return true;
604f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            }
605f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            case R.id.action_slideshow: {
60635e7b4ae727394aace466ebcf33d89adf01b690cBobby Georgescu                mInCameraAndWantQuitOnPause = false;
607f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                Bundle data = new Bundle();
608f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                data.putString(SlideshowPage.KEY_SET_PATH,
609f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                        mMediaSetPath.toString());
610f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                data.putBoolean(SlideshowPage.KEY_REPEAT, true);
611f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                mActivity.getStateManager().startStateForResult(
612f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                        SlideshowPage.class, REQUEST_SLIDESHOW, data);
613f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                return true;
614f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            }
615f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            case R.id.action_details: {
616f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                if (mShowDetails) {
617f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                    hideDetails();
618f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                } else {
619f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                    showDetails();
620f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                }
621f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                return true;
622f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            }
623402237b43fd853377e5dba4e048839ad23b99d72Chih-Chung Chang            case R.id.action_camera: {
624b21b8e58a604f6c701245d84b141b5b87663192bOwen Lin                GalleryUtils.startCameraActivity(mActivity);
625402237b43fd853377e5dba4e048839ad23b99d72Chih-Chung Chang                return true;
626402237b43fd853377e5dba4e048839ad23b99d72Chih-Chung Chang            }
627f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            default:
628f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                return false;
629f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
630f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
631f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
632f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    @Override
633f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    protected void onStateResult(int request, int result, Intent data) {
634f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        switch (request) {
635f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            case REQUEST_SLIDESHOW: {
636f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                // data could be null, if there is no images in the album
637f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                if (data == null) return;
638f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                mFocusIndex = data.getIntExtra(SlideshowPage.KEY_PHOTO_INDEX, 0);
6397260f6f74d465520e4497b23fe56f98abb0c15a2Owen Lin                mSlotView.setCenterIndex(mFocusIndex);
640f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                break;
641f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            }
642f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            case REQUEST_PHOTO: {
643f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                if (data == null) return;
644bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang                mFocusIndex = data.getIntExtra(PhotoPage.KEY_RETURN_INDEX_HINT, 0);
645c63554245d9a822a9fbe5aeda8612624434fd247Owen Lin                mSlotView.makeSlotVisible(mFocusIndex);
646f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                break;
647f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            }
648f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            case REQUEST_DO_ANIMATION: {
6492341c197b0becf99422e8ad305def77df6161714Owen Lin                mSlotView.startRisingAnimation();
650f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                break;
651f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            }
652f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
653f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
654f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
6557817979db0c52ffeacb951625b1e821eba303285Ahbong Chang    @Override
656f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public void onSelectionModeChange(int mode) {
657f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        switch (mode) {
658f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            case SelectionManager.ENTER_SELECTION_MODE: {
6592bb717f1ea38e2ce33dd102a23afe6bfacb5675cOwen Lin                mActionModeHandler.startActionMode();
660bcb427870043b12d4a1a454c08a088933d0eaf23Bobby Georgescu                performHapticFeedback(HapticFeedbackConstants.LONG_PRESS);
661f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                break;
662f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            }
663f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            case SelectionManager.LEAVE_SELECTION_MODE: {
6642bb717f1ea38e2ce33dd102a23afe6bfacb5675cOwen Lin                mActionModeHandler.finishActionMode();
665f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                mRootPane.invalidate();
666f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                break;
667f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            }
668f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            case SelectionManager.SELECT_ALL_MODE: {
669f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                mActionModeHandler.updateSupportedOperation();
670f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                mRootPane.invalidate();
671f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                break;
672f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            }
673f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
674f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
675f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
6767817979db0c52ffeacb951625b1e821eba303285Ahbong Chang    @Override
677f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public void onSelectionChange(Path path, boolean selected) {
678f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        int count = mSelectionManager.getSelectedCount();
679f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        String format = mActivity.getResources().getQuantityString(
680f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                R.plurals.number_of_items_selected, count);
681f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mActionModeHandler.setTitle(String.format(format, count));
682f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mActionModeHandler.updateSupportedOperation(path, selected);
683f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
684f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
68557cbaa1ef40d2215c6400f5ae4af3a09e67abb2dHung-ying Tyan    @Override
68657cbaa1ef40d2215c6400f5ae4af3a09e67abb2dHung-ying Tyan    public void onSyncDone(final MediaSet mediaSet, final int resultCode) {
68757cbaa1ef40d2215c6400f5ae4af3a09e67abb2dHung-ying Tyan        Log.d(TAG, "onSyncDone: " + Utils.maskDebugInfo(mediaSet.getName()) + " result="
68857cbaa1ef40d2215c6400f5ae4af3a09e67abb2dHung-ying Tyan                + resultCode);
68957cbaa1ef40d2215c6400f5ae4af3a09e67abb2dHung-ying Tyan        ((Activity) mActivity).runOnUiThread(new Runnable() {
69057cbaa1ef40d2215c6400f5ae4af3a09e67abb2dHung-ying Tyan            @Override
69157cbaa1ef40d2215c6400f5ae4af3a09e67abb2dHung-ying Tyan            public void run() {
69271632ac6c1596dd1fd477f95e268f96ad72ea572Owen Lin                GLRoot root = mActivity.getGLRoot();
69371632ac6c1596dd1fd477f95e268f96ad72ea572Owen Lin                root.lockRenderThread();
69405da3f520eacb9219964b6ed57ef37846d889fd7Hung-ying Tyan                mSyncResult = resultCode;
69571632ac6c1596dd1fd477f95e268f96ad72ea572Owen Lin                try {
69671632ac6c1596dd1fd477f95e268f96ad72ea572Owen Lin                    if (resultCode == MediaSet.SYNC_RESULT_SUCCESS) {
69771632ac6c1596dd1fd477f95e268f96ad72ea572Owen Lin                        mInitialSynced = true;
69871632ac6c1596dd1fd477f95e268f96ad72ea572Owen Lin                    }
69971632ac6c1596dd1fd477f95e268f96ad72ea572Owen Lin                    clearLoadingBit(BIT_LOADING_SYNC);
70005da3f520eacb9219964b6ed57ef37846d889fd7Hung-ying Tyan                    showSyncErrorIfNecessary(mLoadingFailed);
70171632ac6c1596dd1fd477f95e268f96ad72ea572Owen Lin                } finally {
70271632ac6c1596dd1fd477f95e268f96ad72ea572Owen Lin                    root.unlockRenderThread();
70357cbaa1ef40d2215c6400f5ae4af3a09e67abb2dHung-ying Tyan                }
70457cbaa1ef40d2215c6400f5ae4af3a09e67abb2dHung-ying Tyan            }
70557cbaa1ef40d2215c6400f5ae4af3a09e67abb2dHung-ying Tyan        });
70657cbaa1ef40d2215c6400f5ae4af3a09e67abb2dHung-ying Tyan    }
70757cbaa1ef40d2215c6400f5ae4af3a09e67abb2dHung-ying Tyan
70805da3f520eacb9219964b6ed57ef37846d889fd7Hung-ying Tyan    // Show sync error toast when all the following conditions are met:
70905da3f520eacb9219964b6ed57ef37846d889fd7Hung-ying Tyan    // (1) both loading and sync are done,
71005da3f520eacb9219964b6ed57ef37846d889fd7Hung-ying Tyan    // (2) sync result is error,
71105da3f520eacb9219964b6ed57ef37846d889fd7Hung-ying Tyan    // (3) the page is still active, and
71205da3f520eacb9219964b6ed57ef37846d889fd7Hung-ying Tyan    // (4) no photo is shown or loading fails.
71305da3f520eacb9219964b6ed57ef37846d889fd7Hung-ying Tyan    private void showSyncErrorIfNecessary(boolean loadingFailed) {
71405da3f520eacb9219964b6ed57ef37846d889fd7Hung-ying Tyan        if ((mLoadingBits == 0) && (mSyncResult == MediaSet.SYNC_RESULT_ERROR) && mIsActive
71505da3f520eacb9219964b6ed57ef37846d889fd7Hung-ying Tyan                && (loadingFailed || (mAlbumDataAdapter.size() == 0))) {
71605da3f520eacb9219964b6ed57ef37846d889fd7Hung-ying Tyan            Toast.makeText(mActivity, R.string.sync_album_error,
71705da3f520eacb9219964b6ed57ef37846d889fd7Hung-ying Tyan                    Toast.LENGTH_LONG).show();
71805da3f520eacb9219964b6ed57ef37846d889fd7Hung-ying Tyan        }
71905da3f520eacb9219964b6ed57ef37846d889fd7Hung-ying Tyan    }
72005da3f520eacb9219964b6ed57ef37846d889fd7Hung-ying Tyan
721fbdd338d83596ba545a8a7c8105d2ad7b5df56e6Owen Lin    private void setLoadingBit(int loadTaskBit) {
722fbdd338d83596ba545a8a7c8105d2ad7b5df56e6Owen Lin        mLoadingBits |= loadTaskBit;
723fbdd338d83596ba545a8a7c8105d2ad7b5df56e6Owen Lin    }
724fbdd338d83596ba545a8a7c8105d2ad7b5df56e6Owen Lin
725fbdd338d83596ba545a8a7c8105d2ad7b5df56e6Owen Lin    private void clearLoadingBit(int loadTaskBit) {
726fbdd338d83596ba545a8a7c8105d2ad7b5df56e6Owen Lin        mLoadingBits &= ~loadTaskBit;
727d05b0be120bb217b4f56add24a4b31bee92455b2Chih-Chung Chang        if (mLoadingBits == 0 && mIsActive) {
728fbdd338d83596ba545a8a7c8105d2ad7b5df56e6Owen Lin            if (mAlbumDataAdapter.size() == 0) {
72909995299480b797254873319caffd5408624988bBobby Georgescu                Intent result = new Intent();
73009995299480b797254873319caffd5408624988bBobby Georgescu                result.putExtra(KEY_EMPTY_ALBUM, true);
73109995299480b797254873319caffd5408624988bBobby Georgescu                setStateResult(Activity.RESULT_OK, result);
73209995299480b797254873319caffd5408624988bBobby Georgescu                mActivity.getStateManager().finishState(this);
733fbdd338d83596ba545a8a7c8105d2ad7b5df56e6Owen Lin            }
734fbdd338d83596ba545a8a7c8105d2ad7b5df56e6Owen Lin        }
735fbdd338d83596ba545a8a7c8105d2ad7b5df56e6Owen Lin    }
736fbdd338d83596ba545a8a7c8105d2ad7b5df56e6Owen Lin
737f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private class MyLoadingListener implements LoadingListener {
738f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        @Override
739f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        public void onLoadingStarted() {
740fbdd338d83596ba545a8a7c8105d2ad7b5df56e6Owen Lin            setLoadingBit(BIT_LOADING_RELOAD);
74105da3f520eacb9219964b6ed57ef37846d889fd7Hung-ying Tyan            mLoadingFailed = false;
742f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
743f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
744f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        @Override
74505da3f520eacb9219964b6ed57ef37846d889fd7Hung-ying Tyan        public void onLoadingFinished(boolean loadingFailed) {
746fbdd338d83596ba545a8a7c8105d2ad7b5df56e6Owen Lin            clearLoadingBit(BIT_LOADING_RELOAD);
74705da3f520eacb9219964b6ed57ef37846d889fd7Hung-ying Tyan            mLoadingFailed = loadingFailed;
74805da3f520eacb9219964b6ed57ef37846d889fd7Hung-ying Tyan            showSyncErrorIfNecessary(loadingFailed);
749f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
750f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
751f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
7524105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen    private class MyDetailsSource implements DetailsHelper.DetailsSource {
753f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        private int mIndex;
754fbdd338d83596ba545a8a7c8105d2ad7b5df56e6Owen Lin
7557817979db0c52ffeacb951625b1e821eba303285Ahbong Chang        @Override
756f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        public int size() {
757f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            return mAlbumDataAdapter.size();
758f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
759f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
7607817979db0c52ffeacb951625b1e821eba303285Ahbong Chang        @Override
761995c4566bed7df1aa48ba7e1351f964efa73880bMichael Kolb        public int setIndex() {
762995c4566bed7df1aa48ba7e1351f964efa73880bMichael Kolb            Path id = mSelectionManager.getSelected(false).get(0);
763995c4566bed7df1aa48ba7e1351f964efa73880bMichael Kolb            mIndex = mAlbumDataAdapter.findItem(id);
764f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            return mIndex;
765f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
766f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
7677817979db0c52ffeacb951625b1e821eba303285Ahbong Chang        @Override
768f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        public MediaDetails getDetails() {
769995c4566bed7df1aa48ba7e1351f964efa73880bMichael Kolb            // this relies on setIndex() being called beforehand
770f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            MediaObject item = mAlbumDataAdapter.get(mIndex);
771f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            if (item != null) {
77231cac30e46a293f6d0901e22c6ab0d083cae7021Owen Lin                mAlbumView.setHighlightItemPath(item.getPath());
773f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                return item.getDetails();
774f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            } else {
775f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                return null;
776f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            }
777f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
778f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
7793cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu
7803cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu    @Override
7813cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu    public void onAlbumModeSelected(int mode) {
7823cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu        if (mode == GalleryActionBar.ALBUM_FILMSTRIP_MODE_SELECTED) {
7833cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu            switchToFilmstrip();
7843cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu        }
7853cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu    }
786f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin}
787