PhotoPage.java revision 21a412c93c9b0401b039f4eb86d4950752e5bb84
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
19604f053d040782159b61d3b74ee533bc2c0ccdd0Ray Chenimport android.app.ActionBar.OnMenuVisibilityListener;
208bc5bebba780ca4a322b466b06fc909331697cf4Owen Linimport android.app.Activity;
21604f053d040782159b61d3b74ee533bc2c0ccdd0Ray Chenimport android.content.ActivityNotFoundException;
22604f053d040782159b61d3b74ee533bc2c0ccdd0Ray Chenimport android.content.Context;
23604f053d040782159b61d3b74ee533bc2c0ccdd0Ray Chenimport android.content.Intent;
2404ac045bf8da5082bbb0bdc9ea5f9c9b5b796ad0Yuli Huangimport android.graphics.Rect;
25604f053d040782159b61d3b74ee533bc2c0ccdd0Ray Chenimport android.net.Uri;
2633ef03776b7734717b16f6fc861b831fb1b1dfacMartijn Coenenimport android.nfc.NfcAdapter;
27604f053d040782159b61d3b74ee533bc2c0ccdd0Ray Chenimport android.os.Bundle;
28604f053d040782159b61d3b74ee533bc2c0ccdd0Ray Chenimport android.os.Handler;
29604f053d040782159b61d3b74ee533bc2c0ccdd0Ray Chenimport android.os.Message;
30604f053d040782159b61d3b74ee533bc2c0ccdd0Ray Chenimport android.view.Menu;
31604f053d040782159b61d3b74ee533bc2c0ccdd0Ray Chenimport android.view.MenuInflater;
32604f053d040782159b61d3b74ee533bc2c0ccdd0Ray Chenimport android.view.MenuItem;
33604f053d040782159b61d3b74ee533bc2c0ccdd0Ray Chenimport android.view.View;
348bc5bebba780ca4a322b466b06fc909331697cf4Owen Linimport android.view.WindowManager;
35604f053d040782159b61d3b74ee533bc2c0ccdd0Ray Chenimport android.widget.ShareActionProvider;
36604f053d040782159b61d3b74ee533bc2c0ccdd0Ray Chenimport android.widget.Toast;
37604f053d040782159b61d3b74ee533bc2c0ccdd0Ray Chen
38f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.R;
39f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.data.DataManager;
40f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.data.MediaDetails;
41f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.data.MediaItem;
42f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.data.MediaObject;
43f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.data.MediaSet;
44f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.data.MtpDevice;
45f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.data.Path;
4615b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Changimport com.android.gallery3d.data.SnailSource;
47f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.picasasource.PicasaSource;
484105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chenimport com.android.gallery3d.ui.DetailsHelper;
494105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chenimport com.android.gallery3d.ui.DetailsHelper.CloseListener;
504105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chenimport com.android.gallery3d.ui.DetailsHelper.DetailsSource;
51f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.ui.GLCanvas;
52f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.ui.GLView;
53f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.ui.ImportCompleteListener;
54f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.ui.MenuExecutor;
5521a412c93c9b0401b039f4eb86d4950752e5bb84Owen Linimport com.android.gallery3d.ui.PhotoView;
56b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Changimport com.android.gallery3d.ui.ScreenNail;
57b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Changimport com.android.gallery3d.ui.ScreenNailHolder;
58f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.ui.SelectionManager;
59f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.ui.SynchronizedHandler;
60f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.ui.UserInteractionListener;
61f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.util.GalleryUtils;
62f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
63f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linpublic class PhotoPage extends ActivityState
64921895ba0b3511aeba053bdc0c965f9d3f62eb51Chih-Chung Chang        implements PhotoView.PhotoTapListener, UserInteractionListener {
65f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private static final String TAG = "PhotoPage";
66f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
67f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private static final int MSG_HIDE_BARS = 1;
686cf807453fb58ccd4cc513ff187b306c7090e67cOwen Lin
69f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private static final int HIDE_BARS_TIMEOUT = 3500;
70f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
71f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private static final int REQUEST_SLIDESHOW = 1;
72f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private static final int REQUEST_CROP = 2;
73f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private static final int REQUEST_CROP_PICASA = 3;
74f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
75f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public static final String KEY_MEDIA_SET_PATH = "media-set-path";
76f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public static final String KEY_MEDIA_ITEM_PATH = "media-item-path";
77f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public static final String KEY_INDEX_HINT = "index-hint";
7804ac045bf8da5082bbb0bdc9ea5f9c9b5b796ad0Yuli Huang    public static final String KEY_OPEN_ANIMATION_RECT = "open-animation-rect";
79b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang    public static final String KEY_SCREENNAIL_HOLDER = "screennail-holder";
80f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
81f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private GalleryApp mApplication;
82f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private SelectionManager mSelectionManager;
83f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
84f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private PhotoView mPhotoView;
85f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private PhotoPage.Model mModel;
864105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen    private DetailsHelper mDetailsHelper;
87f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private boolean mShowDetails;
88cf46a3abc26aac7cdb6b6993aeade053304b71d9Ray Chen    private Path mPendingSharePath;
89f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
90f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    // mMediaSet could be null if there is no KEY_MEDIA_SET_PATH supplied.
91f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    // E.g., viewing a photo in gmail attachment
92f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private MediaSet mMediaSet;
93f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private Menu mMenu;
94f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
95604f053d040782159b61d3b74ee533bc2c0ccdd0Ray Chen    private final Intent mResultIntent = new Intent();
96f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private int mCurrentIndex = 0;
97f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private Handler mHandler;
98113bfc77c4468411da9ae1290553c3be89f8df9aOwen Lin    private boolean mShowBars = true;
998cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen    private GalleryActionBar mActionBar;
100f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private MyMenuVisibilityListener mMenuVisibilityListener;
101014d9586d8145a33f4e99eaad570587f6d650026Wu-cheng Li    private PageTapListener mPageTapListener;
102f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private boolean mIsMenuVisible;
103f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private boolean mIsInteracting;
104f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private MediaItem mCurrentPhoto = null;
105f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private MenuExecutor mMenuExecutor;
106f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private boolean mIsActive;
107f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private ShareActionProvider mShareActionProvider;
10884c220f10a643927c8a2126de8a755d8d7f7ec9eRay Chen    private String mSetPathString;
109b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang    private ScreenNailHolder mScreenNailHolder;
110b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang    private ScreenNail mScreenNail;
11115b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang
11233ef03776b7734717b16f6fc861b831fb1b1dfacMartijn Coenen    private NfcAdapter mNfcAdapter;
11333ef03776b7734717b16f6fc861b831fb1b1dfacMartijn Coenen
114f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public static interface Model extends PhotoView.Model {
115f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        public void resume();
116f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        public void pause();
117f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        public boolean isEmpty();
118f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        public MediaItem getCurrentMediaItem();
119f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        public int getCurrentIndex();
120f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        public void setCurrentPhoto(Path path, int indexHint);
121f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
122f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
123f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private class MyMenuVisibilityListener implements OnMenuVisibilityListener {
124f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        public void onMenuVisibilityChanged(boolean isVisible) {
125f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            mIsMenuVisible = isVisible;
126f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            refreshHidingMessage();
127f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
128f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
129f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
130014d9586d8145a33f4e99eaad570587f6d650026Wu-cheng Li    public interface PageTapListener {
131014d9586d8145a33f4e99eaad570587f6d650026Wu-cheng Li        // Return true if the tap is consumed.
132014d9586d8145a33f4e99eaad570587f6d650026Wu-cheng Li        public boolean onSingleTapUp(int x, int y);
133014d9586d8145a33f4e99eaad570587f6d650026Wu-cheng Li    }
134014d9586d8145a33f4e99eaad570587f6d650026Wu-cheng Li
135014d9586d8145a33f4e99eaad570587f6d650026Wu-cheng Li    public void setPageTapListener(PageTapListener listener) {
136014d9586d8145a33f4e99eaad570587f6d650026Wu-cheng Li        mPageTapListener = listener;
137014d9586d8145a33f4e99eaad570587f6d650026Wu-cheng Li    }
138014d9586d8145a33f4e99eaad570587f6d650026Wu-cheng Li
139604f053d040782159b61d3b74ee533bc2c0ccdd0Ray Chen    private final GLView mRootPane = new GLView() {
140f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
141f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        @Override
142f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        protected void renderBackground(GLCanvas view) {
143f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            view.clearBuffer();
144f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
145f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
146f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        @Override
147f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        protected void onLayout(
148f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                boolean changed, int left, int top, int right, int bottom) {
149f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            mPhotoView.layout(0, 0, right - left, bottom - top);
150f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            if (mShowDetails) {
1518cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen                mDetailsHelper.layout(left, mActionBar.getHeight(), right, bottom);
152f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            }
153f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
154f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    };
155f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
156f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    @Override
157f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public void onCreate(Bundle data, Bundle restoreState) {
1588cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen        mActionBar = mActivity.getGalleryActionBar();
159f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mSelectionManager = new SelectionManager(mActivity, false);
160f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mMenuExecutor = new MenuExecutor(mActivity, mSelectionManager);
161f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
162f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mPhotoView = new PhotoView(mActivity);
163f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mPhotoView.setPhotoTapListener(this);
164f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mRootPane.addComponent(mPhotoView);
165f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mApplication = (GalleryApp)((Activity) mActivity).getApplication();
166f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
16784c220f10a643927c8a2126de8a755d8d7f7ec9eRay Chen        mSetPathString = data.getString(KEY_MEDIA_SET_PATH);
16833ef03776b7734717b16f6fc861b831fb1b1dfacMartijn Coenen        mNfcAdapter = NfcAdapter.getDefaultAdapter(mActivity.getAndroidContext());
169f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        Path itemPath = Path.fromString(data.getString(KEY_MEDIA_ITEM_PATH));
170f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
17184c220f10a643927c8a2126de8a755d8d7f7ec9eRay Chen        if (mSetPathString != null) {
172b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang            mScreenNailHolder =
173b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang                (ScreenNailHolder) data.getParcelable(KEY_SCREENNAIL_HOLDER);
174b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang            if (mScreenNailHolder != null) {
175b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang                mScreenNail = mScreenNailHolder.attach();
176b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang
177b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang                // Get the ScreenNail from ScreenNailHolder and register it.
178b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang                int id = SnailSource.registerScreenNail(mScreenNail);
179b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang                Path screenNailSetPath = SnailSource.getSetPath(id);
180b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang                Path screenNailItemPath = SnailSource.getItemPath(id);
181b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang
182b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang                // Combine the original MediaSet with the one for CameraScreenNail.
183b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang                mSetPathString = "/combo/item/{" + screenNailSetPath +
184b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang                        "," + mSetPathString + "}";
185b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang
186b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang                // Start from the screen nail.
187b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang                itemPath = screenNailItemPath;
188b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang            }
189b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang
19084c220f10a643927c8a2126de8a755d8d7f7ec9eRay Chen            mMediaSet = mActivity.getDataManager().getMediaSet(mSetPathString);
191f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            mCurrentIndex = data.getInt(KEY_INDEX_HINT, 0);
192f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            mMediaSet = (MediaSet)
19384c220f10a643927c8a2126de8a755d8d7f7ec9eRay Chen                    mActivity.getDataManager().getMediaObject(mSetPathString);
194f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            if (mMediaSet == null) {
19584c220f10a643927c8a2126de8a755d8d7f7ec9eRay Chen                Log.w(TAG, "failed to restore " + mSetPathString);
196f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            }
197f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            PhotoDataAdapter pda = new PhotoDataAdapter(
198f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                    mActivity, mPhotoView, mMediaSet, itemPath, mCurrentIndex);
199f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            mModel = pda;
200f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            mPhotoView.setModel(mModel);
201f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
202f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            mResultIntent.putExtra(KEY_INDEX_HINT, mCurrentIndex);
203f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            setStateResult(Activity.RESULT_OK, mResultIntent);
204f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
205f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            pda.setDataListener(new PhotoDataAdapter.DataListener() {
206f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
207113bfc77c4468411da9ae1290553c3be89f8df9aOwen Lin                @Override
208f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                public void onPhotoChanged(int index, Path item) {
209f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                    mCurrentIndex = index;
210f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                    mResultIntent.putExtra(KEY_INDEX_HINT, index);
211f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                    if (item != null) {
212f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                        mResultIntent.putExtra(KEY_MEDIA_ITEM_PATH, item.toString());
213f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                        MediaItem photo = mModel.getCurrentMediaItem();
214f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                        if (photo != null) updateCurrentPhoto(photo);
215f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                    } else {
216f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                        mResultIntent.removeExtra(KEY_MEDIA_ITEM_PATH);
217f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                    }
218f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                    setStateResult(Activity.RESULT_OK, mResultIntent);
219f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                }
220f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
221f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                @Override
222f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                public void onLoadingFinished() {
223f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                    GalleryUtils.setSpinnerVisibility((Activity) mActivity, false);
224f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                    if (!mModel.isEmpty()) {
225f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                        MediaItem photo = mModel.getCurrentMediaItem();
226f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                        if (photo != null) updateCurrentPhoto(photo);
227f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                    } else if (mIsActive) {
228f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                        mActivity.getStateManager().finishState(PhotoPage.this);
229f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                    }
230f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                }
231f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
232f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                @Override
233f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                public void onLoadingStarted() {
234f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                    GalleryUtils.setSpinnerVisibility((Activity) mActivity, true);
235f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                }
236f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            });
237f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        } else {
238f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            // Get default media set by the URI
239f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            MediaItem mediaItem = (MediaItem)
240f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                    mActivity.getDataManager().getMediaObject(itemPath);
241f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            mModel = new SinglePhotoDataAdapter(mActivity, mPhotoView, mediaItem);
242f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            mPhotoView.setModel(mModel);
243f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            updateCurrentPhoto(mediaItem);
244f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
245cf46a3abc26aac7cdb6b6993aeade053304b71d9Ray Chen
246f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mHandler = new SynchronizedHandler(mActivity.getGLRoot()) {
247f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            @Override
248f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            public void handleMessage(Message message) {
249f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                switch (message.what) {
250f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                    case MSG_HIDE_BARS: {
251f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                        hideBars();
252f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                        break;
253f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                    }
254f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                    default: throw new AssertionError(message.what);
255f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                }
256f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            }
257f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        };
258f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
25904ac045bf8da5082bbb0bdc9ea5f9c9b5b796ad0Yuli Huang        // start the opening animation only if it's not restored.
26004ac045bf8da5082bbb0bdc9ea5f9c9b5b796ad0Yuli Huang        if (restoreState == null) {
26104ac045bf8da5082bbb0bdc9ea5f9c9b5b796ad0Yuli Huang            mPhotoView.setOpenAnimationRect((Rect) data.getParcelable(KEY_OPEN_ANIMATION_RECT));
26204ac045bf8da5082bbb0bdc9ea5f9c9b5b796ad0Yuli Huang        }
263f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
264f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
265cf46a3abc26aac7cdb6b6993aeade053304b71d9Ray Chen    private void updateShareURI(Path path) {
266cf46a3abc26aac7cdb6b6993aeade053304b71d9Ray Chen        if (mShareActionProvider != null) {
267cf46a3abc26aac7cdb6b6993aeade053304b71d9Ray Chen            DataManager manager = mActivity.getDataManager();
268cf46a3abc26aac7cdb6b6993aeade053304b71d9Ray Chen            int type = manager.getMediaType(path);
269cf46a3abc26aac7cdb6b6993aeade053304b71d9Ray Chen            Intent intent = new Intent(Intent.ACTION_SEND);
270cf46a3abc26aac7cdb6b6993aeade053304b71d9Ray Chen            intent.setType(MenuExecutor.getMimeType(type));
271cf46a3abc26aac7cdb6b6993aeade053304b71d9Ray Chen            intent.putExtra(Intent.EXTRA_STREAM, manager.getContentUri(path));
272cf46a3abc26aac7cdb6b6993aeade053304b71d9Ray Chen            mShareActionProvider.setShareIntent(intent);
27333ef03776b7734717b16f6fc861b831fb1b1dfacMartijn Coenen            if (mNfcAdapter != null) {
274a41ed05ff2f71d2177b4f24f53acd848b46fc840Martijn Coenen                mNfcAdapter.setBeamPushUris(new Uri[]{manager.getContentUri(path)},
275a41ed05ff2f71d2177b4f24f53acd848b46fc840Martijn Coenen                        (Activity)mActivity);
27633ef03776b7734717b16f6fc861b831fb1b1dfacMartijn Coenen            }
277cf46a3abc26aac7cdb6b6993aeade053304b71d9Ray Chen            mPendingSharePath = null;
278cf46a3abc26aac7cdb6b6993aeade053304b71d9Ray Chen        } else {
279cf46a3abc26aac7cdb6b6993aeade053304b71d9Ray Chen            // This happens when ActionBar is not created yet.
280cf46a3abc26aac7cdb6b6993aeade053304b71d9Ray Chen            mPendingSharePath = path;
281cf46a3abc26aac7cdb6b6993aeade053304b71d9Ray Chen        }
282cf46a3abc26aac7cdb6b6993aeade053304b71d9Ray Chen    }
283cf46a3abc26aac7cdb6b6993aeade053304b71d9Ray Chen
284f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private void updateCurrentPhoto(MediaItem photo) {
285f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        if (mCurrentPhoto == photo) return;
286f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mCurrentPhoto = photo;
287f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        if (mCurrentPhoto == null) return;
288f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        updateMenuOperations();
289ed46d77c16cd80357f4a0feada2435dfba8104a6Yuli Huang        updateTitle();
290f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        if (mShowDetails) {
2914105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen            mDetailsHelper.reloadDetails(mModel.getCurrentIndex());
292f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
293cf46a3abc26aac7cdb6b6993aeade053304b71d9Ray Chen        mPhotoView.showVideoPlayIcon(
294cf46a3abc26aac7cdb6b6993aeade053304b71d9Ray Chen                photo.getMediaType() == MediaObject.MEDIA_TYPE_VIDEO);
295f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
29615b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang        if ((photo.getSupportedOperations() & MediaItem.SUPPORT_SHARE) != 0) {
29715b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang            updateShareURI(photo.getPath());
29815b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang        }
299f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
300f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
301ed46d77c16cd80357f4a0feada2435dfba8104a6Yuli Huang    private void updateTitle() {
302ed46d77c16cd80357f4a0feada2435dfba8104a6Yuli Huang        if (mCurrentPhoto == null) return;
303ed46d77c16cd80357f4a0feada2435dfba8104a6Yuli Huang        boolean showTitle = mActivity.getAndroidContext().getResources().getBoolean(
304ed46d77c16cd80357f4a0feada2435dfba8104a6Yuli Huang                R.bool.show_action_bar_title);
305ed46d77c16cd80357f4a0feada2435dfba8104a6Yuli Huang        if (showTitle && mCurrentPhoto.getName() != null)
306ed46d77c16cd80357f4a0feada2435dfba8104a6Yuli Huang            mActionBar.setTitle(mCurrentPhoto.getName());
307ed46d77c16cd80357f4a0feada2435dfba8104a6Yuli Huang        else
308ed46d77c16cd80357f4a0feada2435dfba8104a6Yuli Huang            mActionBar.setTitle("");
309ed46d77c16cd80357f4a0feada2435dfba8104a6Yuli Huang    }
310ed46d77c16cd80357f4a0feada2435dfba8104a6Yuli Huang
311f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private void updateMenuOperations() {
3122066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang        if (mMenu == null) return;
3132066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang        MenuItem item = mMenu.findItem(R.id.action_slideshow);
3142066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang        if (item != null) {
3152066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang            item.setVisible(canDoSlideShow());
3162066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang        }
3172066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang        if (mCurrentPhoto == null) return;
318f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        int supportedOperations = mCurrentPhoto.getSupportedOperations();
319f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        if (!GalleryUtils.isEditorAvailable((Context) mActivity, "image/*")) {
320f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            supportedOperations &= ~MediaObject.SUPPORT_EDIT;
321f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
322604f053d040782159b61d3b74ee533bc2c0ccdd0Ray Chen
323f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        MenuExecutor.updateMenuOperation(mMenu, supportedOperations);
324f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
325f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
3262066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang    private boolean canDoSlideShow() {
3272066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang        if (mMediaSet == null || mCurrentPhoto == null) {
3282066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang            return false;
3292066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang        }
3302066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang        if (mCurrentPhoto.getMediaType() != MediaObject.MEDIA_TYPE_IMAGE) {
3312066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang            return false;
3322066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang        }
3332066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang        if (mMediaSet instanceof MtpDevice) {
3342066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang            return false;
3352066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang        }
3362066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang        return true;
3372066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang    }
3382066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang
339f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private void showBars() {
340f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        if (mShowBars) return;
341f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mShowBars = true;
342f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mActionBar.show();
343f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        WindowManager.LayoutParams params = ((Activity) mActivity).getWindow().getAttributes();
344f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        params.systemUiVisibility = View.SYSTEM_UI_FLAG_VISIBLE;
345f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        ((Activity) mActivity).getWindow().setAttributes(params);
346f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
347f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
348f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private void hideBars() {
349f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        if (!mShowBars) return;
350f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mShowBars = false;
351f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mActionBar.hide();
352f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        WindowManager.LayoutParams params = ((Activity) mActivity).getWindow().getAttributes();
353f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        params.systemUiVisibility = View. SYSTEM_UI_FLAG_LOW_PROFILE;
354f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        ((Activity) mActivity).getWindow().setAttributes(params);
355f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
356f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
357f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private void refreshHidingMessage() {
358f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mHandler.removeMessages(MSG_HIDE_BARS);
359f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        if (!mIsMenuVisible && !mIsInteracting) {
360f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            mHandler.sendEmptyMessageDelayed(MSG_HIDE_BARS, HIDE_BARS_TIMEOUT);
361f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
362f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
363f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
3648bc5bebba780ca4a322b466b06fc909331697cf4Owen Lin    @Override
365f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public void onUserInteraction() {
366f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        showBars();
367f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        refreshHidingMessage();
368f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
369f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
370f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public void onUserInteractionTap() {
371f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        if (mShowBars) {
372f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            hideBars();
373f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            mHandler.removeMessages(MSG_HIDE_BARS);
374f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        } else {
375f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            showBars();
376f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            refreshHidingMessage();
377f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
378f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
379f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
3808bc5bebba780ca4a322b466b06fc909331697cf4Owen Lin    @Override
381f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public void onUserInteractionBegin() {
382f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        showBars();
383f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mIsInteracting = true;
384f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        refreshHidingMessage();
385f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
386f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
3878bc5bebba780ca4a322b466b06fc909331697cf4Owen Lin    @Override
388f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public void onUserInteractionEnd() {
389f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mIsInteracting = false;
3908bc5bebba780ca4a322b466b06fc909331697cf4Owen Lin
3918bc5bebba780ca4a322b466b06fc909331697cf4Owen Lin        // This function could be called from GL thread (in SlotView.render)
3928bc5bebba780ca4a322b466b06fc909331697cf4Owen Lin        // and post to the main thread. So, it could be executed while the
3938bc5bebba780ca4a322b466b06fc909331697cf4Owen Lin        // activity is paused.
3948bc5bebba780ca4a322b466b06fc909331697cf4Owen Lin        if (mIsActive) refreshHidingMessage();
395f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
396f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
397f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    @Override
398f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    protected void onBackPressed() {
399f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        if (mShowDetails) {
400f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            hideDetails();
401160e6d776daab93610b3d12413ad9ff2dd867d8bChih-Chung Chang        } else if (mScreenNail == null
402160e6d776daab93610b3d12413ad9ff2dd867d8bChih-Chung Chang                || !switchWithCaptureAnimation(-1)) {
403f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            super.onBackPressed();
404f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
405f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
406f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
4072c6173822a612597c79be41b126367ddfbb5d518Chih-Chung Chang    // Switch to the previous or next picture using the capture animation.
4082c6173822a612597c79be41b126367ddfbb5d518Chih-Chung Chang    // The offset is -1 to switch to the previous picture, 1 to switch to
4092c6173822a612597c79be41b126367ddfbb5d518Chih-Chung Chang    // the next picture.
4102c6173822a612597c79be41b126367ddfbb5d518Chih-Chung Chang    public boolean switchWithCaptureAnimation(int offset) {
4112c6173822a612597c79be41b126367ddfbb5d518Chih-Chung Chang        return mPhotoView.switchWithCaptureAnimation(offset);
4122c6173822a612597c79be41b126367ddfbb5d518Chih-Chung Chang    }
4132c6173822a612597c79be41b126367ddfbb5d518Chih-Chung Chang
414f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    @Override
415f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    protected boolean onCreateActionBar(Menu menu) {
416f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        MenuInflater inflater = ((Activity) mActivity).getMenuInflater();
417f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        inflater.inflate(R.menu.photo, menu);
418f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mShareActionProvider = GalleryActionBar.initializeShareActionProvider(menu);
419cf46a3abc26aac7cdb6b6993aeade053304b71d9Ray Chen        if (mPendingSharePath != null) updateShareURI(mPendingSharePath);
420f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mMenu = menu;
421f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mShowBars = true;
422f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        updateMenuOperations();
423ed46d77c16cd80357f4a0feada2435dfba8104a6Yuli Huang        updateTitle();
424f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        return true;
425f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
426f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
427f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    @Override
428f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    protected boolean onItemSelected(MenuItem item) {
429f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        MediaItem current = mModel.getCurrentMediaItem();
430f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
431f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        if (current == null) {
432f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            // item is not ready, ignore
433f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            return true;
434f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
435f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
436f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        int currentIndex = mModel.getCurrentIndex();
437f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        Path path = current.getPath();
438f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
439f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        DataManager manager = mActivity.getDataManager();
440f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        int action = item.getItemId();
44167098d1a72fd04e2af06d3a5939cde28c65f70d9Ray Chen        boolean needsConfirm = false;
442f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        switch (action) {
44384c220f10a643927c8a2126de8a755d8d7f7ec9eRay Chen            case android.R.id.home: {
44484c220f10a643927c8a2126de8a755d8d7f7ec9eRay Chen                if (mSetPathString != null) {
44584c220f10a643927c8a2126de8a755d8d7f7ec9eRay Chen                    if (mActivity.getStateManager().getStateCount() > 1) {
44684c220f10a643927c8a2126de8a755d8d7f7ec9eRay Chen                        onBackPressed();
44784c220f10a643927c8a2126de8a755d8d7f7ec9eRay Chen                    } else {
44898c2490a424da79beefbdd8a29fb90ab006c77b0Ray Chen                        // We're in view mode so set up the stacks on our own.
44998c2490a424da79beefbdd8a29fb90ab006c77b0Ray Chen                        Bundle data = new Bundle(getData());
45098c2490a424da79beefbdd8a29fb90ab006c77b0Ray Chen                        data.putString(AlbumPage.KEY_MEDIA_PATH, mSetPathString);
45198c2490a424da79beefbdd8a29fb90ab006c77b0Ray Chen                        data.putString(AlbumPage.KEY_PARENT_MEDIA_PATH,
45298c2490a424da79beefbdd8a29fb90ab006c77b0Ray Chen                                mActivity.getDataManager().getTopSetPath(
45398c2490a424da79beefbdd8a29fb90ab006c77b0Ray Chen                                        DataManager.INCLUDE_ALL));
45498c2490a424da79beefbdd8a29fb90ab006c77b0Ray Chen                        mActivity.getStateManager().switchState(this, AlbumPage.class, data);
45584c220f10a643927c8a2126de8a755d8d7f7ec9eRay Chen                    }
45684c220f10a643927c8a2126de8a755d8d7f7ec9eRay Chen                }
45784c220f10a643927c8a2126de8a755d8d7f7ec9eRay Chen                return true;
45884c220f10a643927c8a2126de8a755d8d7f7ec9eRay Chen            }
459f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            case R.id.action_slideshow: {
460f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                Bundle data = new Bundle();
4616cf807453fb58ccd4cc513ff187b306c7090e67cOwen Lin                data.putString(SlideshowPage.KEY_SET_PATH, mMediaSet.getPath().toString());
462604f053d040782159b61d3b74ee533bc2c0ccdd0Ray Chen                data.putString(SlideshowPage.KEY_ITEM_PATH, path.toString());
463f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                data.putInt(SlideshowPage.KEY_PHOTO_INDEX, currentIndex);
464f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                data.putBoolean(SlideshowPage.KEY_REPEAT, true);
465f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                mActivity.getStateManager().startStateForResult(
466f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                        SlideshowPage.class, REQUEST_SLIDESHOW, data);
467f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                return true;
468f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            }
469f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            case R.id.action_crop: {
470f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                Activity activity = (Activity) mActivity;
471f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                Intent intent = new Intent(CropImage.CROP_ACTION);
472f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                intent.setClass(activity, CropImage.class);
473f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                intent.setData(manager.getContentUri(path));
474f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                activity.startActivityForResult(intent, PicasaSource.isPicasaImage(current)
475f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                        ? REQUEST_CROP_PICASA
476f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                        : REQUEST_CROP);
477f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                return true;
478f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            }
479f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            case R.id.action_details: {
480f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                if (mShowDetails) {
481f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                    hideDetails();
482f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                } else {
483f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                    showDetails(currentIndex);
484f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                }
485f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                return true;
486f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            }
48767098d1a72fd04e2af06d3a5939cde28c65f70d9Ray Chen            case R.id.action_delete:
48867098d1a72fd04e2af06d3a5939cde28c65f70d9Ray Chen                needsConfirm = true;
489f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            case R.id.action_setas:
490f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            case R.id.action_rotate_ccw:
491f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            case R.id.action_rotate_cw:
492f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            case R.id.action_show_on_map:
493f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            case R.id.action_edit:
494f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                mSelectionManager.deSelectAll();
495f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                mSelectionManager.toggle(path);
49667098d1a72fd04e2af06d3a5939cde28c65f70d9Ray Chen                mMenuExecutor.onMenuClicked(item, needsConfirm, null);
497f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                return true;
498f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            case R.id.action_import:
499f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                mSelectionManager.deSelectAll();
500f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                mSelectionManager.toggle(path);
50167098d1a72fd04e2af06d3a5939cde28c65f70d9Ray Chen                mMenuExecutor.onMenuClicked(item, needsConfirm,
502f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                        new ImportCompleteListener(mActivity));
503f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                return true;
504f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            default :
505f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                return false;
506f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
507f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
508f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
509f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private void hideDetails() {
510f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mShowDetails = false;
5114105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen        mDetailsHelper.hide();
512f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
513f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
514f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private void showDetails(int index) {
515f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mShowDetails = true;
5164105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen        if (mDetailsHelper == null) {
5174105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen            mDetailsHelper = new DetailsHelper(mActivity, mRootPane, new MyDetailsSource());
5184105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen            mDetailsHelper.setCloseListener(new CloseListener() {
519f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                public void onClose() {
520f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                    hideDetails();
521f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                }
522f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            });
523f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
5244105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen        mDetailsHelper.reloadDetails(index);
5254105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen        mDetailsHelper.show();
526f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
527f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
528f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public void onSingleTapUp(int x, int y) {
529014d9586d8145a33f4e99eaad570587f6d650026Wu-cheng Li        if (mPageTapListener != null) {
530014d9586d8145a33f4e99eaad570587f6d650026Wu-cheng Li            if (mPageTapListener.onSingleTapUp(x, y)) return;
531014d9586d8145a33f4e99eaad570587f6d650026Wu-cheng Li        }
532014d9586d8145a33f4e99eaad570587f6d650026Wu-cheng Li
533f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        MediaItem item = mModel.getCurrentMediaItem();
534f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        if (item == null) {
535f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            // item is not ready, ignore
536f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            return;
537f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
538f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
539f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        boolean playVideo =
540f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                (item.getSupportedOperations() & MediaItem.SUPPORT_PLAY) != 0;
541f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
542f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        if (playVideo) {
543f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            // determine if the point is at center (1/6) of the photo view.
544f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            // (The position of the "play" icon is at center (1/6) of the photo)
545f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            int w = mPhotoView.getWidth();
546f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            int h = mPhotoView.getHeight();
547f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            playVideo = (Math.abs(x - w / 2) * 12 <= w)
548f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                && (Math.abs(y - h / 2) * 12 <= h);
549f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
550f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
551f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        if (playVideo) {
552f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            playVideo((Activity) mActivity, item.getPlayUri(), item.getName());
553f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        } else {
554f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            onUserInteractionTap();
555f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
556f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
557f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
558f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public static void playVideo(Activity activity, Uri uri, String title) {
559f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        try {
560f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            Intent intent = new Intent(Intent.ACTION_VIEW)
561f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                    .setDataAndType(uri, "video/*");
562f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            intent.putExtra(Intent.EXTRA_TITLE, title);
563f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            activity.startActivity(intent);
564f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        } catch (ActivityNotFoundException e) {
565f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            Toast.makeText(activity, activity.getString(R.string.video_err),
566f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                    Toast.LENGTH_SHORT).show();
567f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
568f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
569f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
570f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    @Override
571f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    protected void onStateResult(int requestCode, int resultCode, Intent data) {
572f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        switch (requestCode) {
573f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            case REQUEST_CROP:
574f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                if (resultCode == Activity.RESULT_OK) {
575f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                    if (data == null) break;
57621a412c93c9b0401b039f4eb86d4950752e5bb84Owen Lin                    Path path = mApplication.getDataManager()
57721a412c93c9b0401b039f4eb86d4950752e5bb84Owen Lin                            .findPathByUri(data.getData(), data.getType());
578f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                    if (path != null) {
579f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                        mModel.setCurrentPhoto(path, mCurrentIndex);
580f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                    }
581f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                }
582f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                break;
583f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            case REQUEST_CROP_PICASA: {
584f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                int message = resultCode == Activity.RESULT_OK
585f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                        ? R.string.crop_saved
586f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                        : R.string.crop_not_saved;
587f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                Toast.makeText(mActivity.getAndroidContext(),
588f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                        message, Toast.LENGTH_SHORT).show();
589f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                break;
590f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            }
591f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            case REQUEST_SLIDESHOW: {
592f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                if (data == null) break;
593f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                String path = data.getStringExtra(SlideshowPage.KEY_ITEM_PATH);
594f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                int index = data.getIntExtra(SlideshowPage.KEY_PHOTO_INDEX, 0);
595f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                if (path != null) {
596f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                    mModel.setCurrentPhoto(Path.fromString(path), index);
597f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                }
598f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            }
599f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
600f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
601f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
602f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    @Override
603f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public void onPause() {
604f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        super.onPause();
605f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mIsActive = false;
6064105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen        DetailsHelper.pause();
607f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mPhotoView.pause();
608f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mModel.pause();
609f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mHandler.removeMessages(MSG_HIDE_BARS);
610f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mActionBar.removeOnMenuVisibilityListener(mMenuVisibilityListener);
61133ef03776b7734717b16f6fc861b831fb1b1dfacMartijn Coenen
6122785956f8f5654966a41e20f482f4af3057eea3fChih-Chung Chang        mMenuExecutor.pause();
613f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
614f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
615f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    @Override
616f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    protected void onResume() {
617f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        super.onResume();
618f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mIsActive = true;
619f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        setContentPane(mRootPane);
62004ac045bf8da5082bbb0bdc9ea5f9c9b5b796ad0Yuli Huang
621f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mModel.resume();
622f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mPhotoView.resume();
623f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        if (mMenuVisibilityListener == null) {
624f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            mMenuVisibilityListener = new MyMenuVisibilityListener();
625f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
6268cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen        mActionBar.setDisplayOptions(mSetPathString != null, true);
627f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mActionBar.addOnMenuVisibilityListener(mMenuVisibilityListener);
62833ef03776b7734717b16f6fc861b831fb1b1dfacMartijn Coenen
629f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        onUserInteraction();
630f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
631f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
63215b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang    @Override
63315b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang    protected void onDestroy() {
634b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang        if (mScreenNailHolder != null) {
635b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang            // Unregister the ScreenNail and notify mScreenNailHolder.
636b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang            SnailSource.unregisterScreenNail(mScreenNail);
637b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang            mScreenNailHolder.detach();
638b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang            mScreenNailHolder = null;
639b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang            mScreenNail = null;
640b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang        }
64115b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang        super.onDestroy();
64215b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang    }
64315b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang
644f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private class MyDetailsSource implements DetailsSource {
6454105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen        private int mIndex;
6466cf807453fb58ccd4cc513ff187b306c7090e67cOwen Lin
6476cf807453fb58ccd4cc513ff187b306c7090e67cOwen Lin        @Override
648f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        public MediaDetails getDetails() {
649f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            return mModel.getCurrentMediaItem().getDetails();
650f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
6516cf807453fb58ccd4cc513ff187b306c7090e67cOwen Lin
6526cf807453fb58ccd4cc513ff187b306c7090e67cOwen Lin        @Override
653f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        public int size() {
654f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            return mMediaSet != null ? mMediaSet.getMediaItemCount() : 1;
655f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
6566cf807453fb58ccd4cc513ff187b306c7090e67cOwen Lin
6576cf807453fb58ccd4cc513ff187b306c7090e67cOwen Lin        @Override
658f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        public int findIndex(int indexHint) {
6594105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen            mIndex = indexHint;
660f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            return indexHint;
661f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
6624105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen
6636cf807453fb58ccd4cc513ff187b306c7090e67cOwen Lin        @Override
6644105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen        public int getIndex() {
6654105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen            return mIndex;
6664105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen        }
667f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
66833ef03776b7734717b16f6fc861b831fb1b1dfacMartijn Coenen
669f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin}
670