PhotoPage.java revision bd141b5a51c96f6fcaddfa547f0928ce69cf0755
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;
46bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Changimport com.android.gallery3d.data.SnailItem;
4715b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Changimport com.android.gallery3d.data.SnailSource;
48f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.picasasource.PicasaSource;
494105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chenimport com.android.gallery3d.ui.DetailsHelper;
504105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chenimport com.android.gallery3d.ui.DetailsHelper.CloseListener;
514105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chenimport com.android.gallery3d.ui.DetailsHelper.DetailsSource;
52f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.ui.GLCanvas;
53f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.ui.GLView;
54f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.ui.ImportCompleteListener;
55f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.ui.MenuExecutor;
5621a412c93c9b0401b039f4eb86d4950752e5bb84Owen Linimport com.android.gallery3d.ui.PhotoView;
57b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Changimport com.android.gallery3d.ui.ScreenNail;
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
63bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Changpublic class PhotoPage extends ActivityState implements
64bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang        PhotoView.Listener, UserInteractionListener,
65bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang        OrientationManager.Listener, AppBridge.Server {
66f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private static final String TAG = "PhotoPage";
67f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
68f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private static final int MSG_HIDE_BARS = 1;
69bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    private static final int MSG_LOCK_ORIENTATION = 2;
70bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    private static final int MSG_UNLOCK_ORIENTATION = 3;
71bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    private static final int MSG_ON_FULL_SCREEN_CHANGED = 4;
726cf807453fb58ccd4cc513ff187b306c7090e67cOwen Lin
73f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private static final int HIDE_BARS_TIMEOUT = 3500;
74f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
75f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private static final int REQUEST_SLIDESHOW = 1;
76f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private static final int REQUEST_CROP = 2;
77f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private static final int REQUEST_CROP_PICASA = 3;
78f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
79f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public static final String KEY_MEDIA_SET_PATH = "media-set-path";
80f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public static final String KEY_MEDIA_ITEM_PATH = "media-item-path";
81f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public static final String KEY_INDEX_HINT = "index-hint";
8204ac045bf8da5082bbb0bdc9ea5f9c9b5b796ad0Yuli Huang    public static final String KEY_OPEN_ANIMATION_RECT = "open-animation-rect";
83bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    public static final String KEY_APP_BRIDGE = "app-bridge";
84bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang
85bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    public static final String KEY_RETURN_INDEX_HINT = "return-index-hint";
86f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
87f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private GalleryApp mApplication;
88f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private SelectionManager mSelectionManager;
89f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
90f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private PhotoView mPhotoView;
91f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private PhotoPage.Model mModel;
924105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen    private DetailsHelper mDetailsHelper;
93f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private boolean mShowDetails;
94cf46a3abc26aac7cdb6b6993aeade053304b71d9Ray Chen    private Path mPendingSharePath;
95f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
96f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    // mMediaSet could be null if there is no KEY_MEDIA_SET_PATH supplied.
97f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    // E.g., viewing a photo in gmail attachment
98f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private MediaSet mMediaSet;
99f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private Menu mMenu;
100f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
101f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private int mCurrentIndex = 0;
102f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private Handler mHandler;
103113bfc77c4468411da9ae1290553c3be89f8df9aOwen Lin    private boolean mShowBars = true;
1048cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen    private GalleryActionBar mActionBar;
105f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private MyMenuVisibilityListener mMenuVisibilityListener;
106f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private boolean mIsMenuVisible;
107f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private boolean mIsInteracting;
108f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private MediaItem mCurrentPhoto = null;
109f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private MenuExecutor mMenuExecutor;
110f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private boolean mIsActive;
111f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private ShareActionProvider mShareActionProvider;
11284c220f10a643927c8a2126de8a755d8d7f7ec9eRay Chen    private String mSetPathString;
113bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    private AppBridge mAppBridge;
114b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang    private ScreenNail mScreenNail;
115bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    private MediaItem mScreenNailItem;
116bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    private OrientationManager mOrientationManager;
11715b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang
11833ef03776b7734717b16f6fc861b831fb1b1dfacMartijn Coenen    private NfcAdapter mNfcAdapter;
11933ef03776b7734717b16f6fc861b831fb1b1dfacMartijn Coenen
120f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public static interface Model extends PhotoView.Model {
121f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        public void resume();
122f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        public void pause();
123f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        public boolean isEmpty();
124f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        public MediaItem getCurrentMediaItem();
125f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        public void setCurrentPhoto(Path path, int indexHint);
126f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
127f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
128f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private class MyMenuVisibilityListener implements OnMenuVisibilityListener {
129f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        public void onMenuVisibilityChanged(boolean isVisible) {
130f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            mIsMenuVisible = isVisible;
131f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            refreshHidingMessage();
132f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
133f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
134f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
135604f053d040782159b61d3b74ee533bc2c0ccdd0Ray Chen    private final GLView mRootPane = new GLView() {
136f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
137f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        @Override
138f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        protected void renderBackground(GLCanvas view) {
139f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            view.clearBuffer();
140f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
141f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
142f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        @Override
143f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        protected void onLayout(
144f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                boolean changed, int left, int top, int right, int bottom) {
145f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            mPhotoView.layout(0, 0, right - left, bottom - top);
146f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            if (mShowDetails) {
1478cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen                mDetailsHelper.layout(left, mActionBar.getHeight(), right, bottom);
148f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            }
149f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
150bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang
151bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang        @Override
152bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang        protected void orient(int displayRotation, int compensation) {
153bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang            displayRotation = mOrientationManager.getDisplayRotation();
154bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang            Log.d(TAG, "orient -- display rotation " + displayRotation
155bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang                    + ", compensation = " + compensation);
156bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang            super.orient(displayRotation, compensation);
157bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang        }
158f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    };
159f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
160f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    @Override
161f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public void onCreate(Bundle data, Bundle restoreState) {
1628cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen        mActionBar = mActivity.getGalleryActionBar();
163f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mSelectionManager = new SelectionManager(mActivity, false);
164f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mMenuExecutor = new MenuExecutor(mActivity, mSelectionManager);
165f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
166f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mPhotoView = new PhotoView(mActivity);
167bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang        mPhotoView.setListener(this);
168f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mRootPane.addComponent(mPhotoView);
169f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mApplication = (GalleryApp)((Activity) mActivity).getApplication();
170bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang        mOrientationManager = mActivity.getOrientationManager();
171bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang        mOrientationManager.addListener(this);
172f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
17384c220f10a643927c8a2126de8a755d8d7f7ec9eRay Chen        mSetPathString = data.getString(KEY_MEDIA_SET_PATH);
17433ef03776b7734717b16f6fc861b831fb1b1dfacMartijn Coenen        mNfcAdapter = NfcAdapter.getDefaultAdapter(mActivity.getAndroidContext());
175f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        Path itemPath = Path.fromString(data.getString(KEY_MEDIA_ITEM_PATH));
176f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
17784c220f10a643927c8a2126de8a755d8d7f7ec9eRay Chen        if (mSetPathString != null) {
178bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang            mAppBridge = (AppBridge) data.getParcelable(KEY_APP_BRIDGE);
179bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang            if (mAppBridge != null) {
180bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang                mOrientationManager.lockOrientation();
181b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang
182bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang                // Get the ScreenNail from AppBridge and register it.
183bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang                mScreenNail = mAppBridge.attachScreenNail();
184b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang                int id = SnailSource.registerScreenNail(mScreenNail);
185b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang                Path screenNailSetPath = SnailSource.getSetPath(id);
186bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang                Path screenNailItemPath = SnailSource.getItemPath(id);
187bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang                mScreenNailItem = (MediaItem) mActivity.getDataManager()
188bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang                        .getMediaObject(screenNailItemPath);
189b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang
190b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang                // Combine the original MediaSet with the one for CameraScreenNail.
191b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang                mSetPathString = "/combo/item/{" + screenNailSetPath +
192b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang                        "," + mSetPathString + "}";
193b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang
194b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang                // Start from the screen nail.
195bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang                itemPath = screenNailItemPath;
196788245711658188131ae2670e44fb6ca8ad5d53aWu-cheng Li
197788245711658188131ae2670e44fb6ca8ad5d53aWu-cheng Li                // Action bar should not be displayed when camera starts.
198788245711658188131ae2670e44fb6ca8ad5d53aWu-cheng Li                mFlags |= FLAG_HIDE_ACTION_BAR;
199b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang            }
200b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang
20184c220f10a643927c8a2126de8a755d8d7f7ec9eRay Chen            mMediaSet = mActivity.getDataManager().getMediaSet(mSetPathString);
202f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            mCurrentIndex = data.getInt(KEY_INDEX_HINT, 0);
203f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            if (mMediaSet == null) {
20484c220f10a643927c8a2126de8a755d8d7f7ec9eRay Chen                Log.w(TAG, "failed to restore " + mSetPathString);
205f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            }
206f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            PhotoDataAdapter pda = new PhotoDataAdapter(
207bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang                    mActivity, mPhotoView, mMediaSet, itemPath, mCurrentIndex,
208bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang                    mAppBridge == null ? -1 : 0);
209f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            mModel = pda;
210f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            mPhotoView.setModel(mModel);
211f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
212f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            pda.setDataListener(new PhotoDataAdapter.DataListener() {
213f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
214113bfc77c4468411da9ae1290553c3be89f8df9aOwen Lin                @Override
215f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                public void onPhotoChanged(int index, Path item) {
216f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                    mCurrentIndex = index;
217f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                    if (item != null) {
218f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                        MediaItem photo = mModel.getCurrentMediaItem();
219f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                        if (photo != null) updateCurrentPhoto(photo);
220f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                    }
221f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                }
222f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
223f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                @Override
224f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                public void onLoadingFinished() {
225f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                    GalleryUtils.setSpinnerVisibility((Activity) mActivity, false);
226f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                    if (!mModel.isEmpty()) {
227f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                        MediaItem photo = mModel.getCurrentMediaItem();
228f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                        if (photo != null) updateCurrentPhoto(photo);
229f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                    } else if (mIsActive) {
230f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                        mActivity.getStateManager().finishState(PhotoPage.this);
231f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                    }
232f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                }
233f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
234f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                @Override
235f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                public void onLoadingStarted() {
236f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                    GalleryUtils.setSpinnerVisibility((Activity) mActivity, true);
237f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                }
238f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            });
239f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        } else {
240f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            // Get default media set by the URI
241f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            MediaItem mediaItem = (MediaItem)
242f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                    mActivity.getDataManager().getMediaObject(itemPath);
243f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            mModel = new SinglePhotoDataAdapter(mActivity, mPhotoView, mediaItem);
244f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            mPhotoView.setModel(mModel);
245f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            updateCurrentPhoto(mediaItem);
246f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
247cf46a3abc26aac7cdb6b6993aeade053304b71d9Ray Chen
248f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mHandler = new SynchronizedHandler(mActivity.getGLRoot()) {
249f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            @Override
250f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            public void handleMessage(Message message) {
251f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                switch (message.what) {
252f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                    case MSG_HIDE_BARS: {
253f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                        hideBars();
254f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                        break;
255f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                    }
256bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang                    case MSG_LOCK_ORIENTATION: {
257bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang                        mOrientationManager.lockOrientation();
258bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang                        break;
259bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang                    }
260bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang                    case MSG_UNLOCK_ORIENTATION: {
261bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang                        mOrientationManager.unlockOrientation();
262bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang                        break;
263bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang                    }
264bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang                    case MSG_ON_FULL_SCREEN_CHANGED: {
265bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang                        mAppBridge.onFullScreenChanged(message.arg1 == 1);
266bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang                        break;
267bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang                    }
268f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                    default: throw new AssertionError(message.what);
269f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                }
270f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            }
271f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        };
272f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
27304ac045bf8da5082bbb0bdc9ea5f9c9b5b796ad0Yuli Huang        // start the opening animation only if it's not restored.
27404ac045bf8da5082bbb0bdc9ea5f9c9b5b796ad0Yuli Huang        if (restoreState == null) {
27504ac045bf8da5082bbb0bdc9ea5f9c9b5b796ad0Yuli Huang            mPhotoView.setOpenAnimationRect((Rect) data.getParcelable(KEY_OPEN_ANIMATION_RECT));
27604ac045bf8da5082bbb0bdc9ea5f9c9b5b796ad0Yuli Huang        }
277f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
278f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
279cf46a3abc26aac7cdb6b6993aeade053304b71d9Ray Chen    private void updateShareURI(Path path) {
280cf46a3abc26aac7cdb6b6993aeade053304b71d9Ray Chen        if (mShareActionProvider != null) {
281cf46a3abc26aac7cdb6b6993aeade053304b71d9Ray Chen            DataManager manager = mActivity.getDataManager();
282cf46a3abc26aac7cdb6b6993aeade053304b71d9Ray Chen            int type = manager.getMediaType(path);
283cf46a3abc26aac7cdb6b6993aeade053304b71d9Ray Chen            Intent intent = new Intent(Intent.ACTION_SEND);
284cf46a3abc26aac7cdb6b6993aeade053304b71d9Ray Chen            intent.setType(MenuExecutor.getMimeType(type));
285cf46a3abc26aac7cdb6b6993aeade053304b71d9Ray Chen            intent.putExtra(Intent.EXTRA_STREAM, manager.getContentUri(path));
286cf46a3abc26aac7cdb6b6993aeade053304b71d9Ray Chen            mShareActionProvider.setShareIntent(intent);
28733ef03776b7734717b16f6fc861b831fb1b1dfacMartijn Coenen            if (mNfcAdapter != null) {
288a41ed05ff2f71d2177b4f24f53acd848b46fc840Martijn Coenen                mNfcAdapter.setBeamPushUris(new Uri[]{manager.getContentUri(path)},
289a41ed05ff2f71d2177b4f24f53acd848b46fc840Martijn Coenen                        (Activity)mActivity);
29033ef03776b7734717b16f6fc861b831fb1b1dfacMartijn Coenen            }
291cf46a3abc26aac7cdb6b6993aeade053304b71d9Ray Chen            mPendingSharePath = null;
292cf46a3abc26aac7cdb6b6993aeade053304b71d9Ray Chen        } else {
293cf46a3abc26aac7cdb6b6993aeade053304b71d9Ray Chen            // This happens when ActionBar is not created yet.
294cf46a3abc26aac7cdb6b6993aeade053304b71d9Ray Chen            mPendingSharePath = path;
295cf46a3abc26aac7cdb6b6993aeade053304b71d9Ray Chen        }
296cf46a3abc26aac7cdb6b6993aeade053304b71d9Ray Chen    }
297cf46a3abc26aac7cdb6b6993aeade053304b71d9Ray Chen
298f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private void updateCurrentPhoto(MediaItem photo) {
299f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        if (mCurrentPhoto == photo) return;
300f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mCurrentPhoto = photo;
301f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        if (mCurrentPhoto == null) return;
302f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        updateMenuOperations();
303736cf74b170d32374c8b35dbe6a46d975258be87Wu-cheng Li        // Hide the action bar when going back to camera preview.
304bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang        if (photo == mScreenNailItem) hideBars();
305ed46d77c16cd80357f4a0feada2435dfba8104a6Yuli Huang        updateTitle();
306f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        if (mShowDetails) {
3074105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen            mDetailsHelper.reloadDetails(mModel.getCurrentIndex());
308f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
309cf46a3abc26aac7cdb6b6993aeade053304b71d9Ray Chen        mPhotoView.showVideoPlayIcon(
310cf46a3abc26aac7cdb6b6993aeade053304b71d9Ray Chen                photo.getMediaType() == MediaObject.MEDIA_TYPE_VIDEO);
311f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
31215b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang        if ((photo.getSupportedOperations() & MediaItem.SUPPORT_SHARE) != 0) {
31315b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang            updateShareURI(photo.getPath());
31415b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang        }
315f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
316f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
317ed46d77c16cd80357f4a0feada2435dfba8104a6Yuli Huang    private void updateTitle() {
318ed46d77c16cd80357f4a0feada2435dfba8104a6Yuli Huang        if (mCurrentPhoto == null) return;
319ed46d77c16cd80357f4a0feada2435dfba8104a6Yuli Huang        boolean showTitle = mActivity.getAndroidContext().getResources().getBoolean(
320ed46d77c16cd80357f4a0feada2435dfba8104a6Yuli Huang                R.bool.show_action_bar_title);
321ed46d77c16cd80357f4a0feada2435dfba8104a6Yuli Huang        if (showTitle && mCurrentPhoto.getName() != null)
322ed46d77c16cd80357f4a0feada2435dfba8104a6Yuli Huang            mActionBar.setTitle(mCurrentPhoto.getName());
323ed46d77c16cd80357f4a0feada2435dfba8104a6Yuli Huang        else
324ed46d77c16cd80357f4a0feada2435dfba8104a6Yuli Huang            mActionBar.setTitle("");
325ed46d77c16cd80357f4a0feada2435dfba8104a6Yuli Huang    }
326ed46d77c16cd80357f4a0feada2435dfba8104a6Yuli Huang
327f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private void updateMenuOperations() {
3282066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang        if (mMenu == null) return;
3292066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang        MenuItem item = mMenu.findItem(R.id.action_slideshow);
3302066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang        if (item != null) {
3312066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang            item.setVisible(canDoSlideShow());
3322066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang        }
3332066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang        if (mCurrentPhoto == null) return;
334f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        int supportedOperations = mCurrentPhoto.getSupportedOperations();
335f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        if (!GalleryUtils.isEditorAvailable((Context) mActivity, "image/*")) {
336f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            supportedOperations &= ~MediaObject.SUPPORT_EDIT;
337f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
338604f053d040782159b61d3b74ee533bc2c0ccdd0Ray Chen
339f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        MenuExecutor.updateMenuOperation(mMenu, supportedOperations);
340f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
341f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
3422066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang    private boolean canDoSlideShow() {
3432066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang        if (mMediaSet == null || mCurrentPhoto == null) {
3442066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang            return false;
3452066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang        }
3462066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang        if (mCurrentPhoto.getMediaType() != MediaObject.MEDIA_TYPE_IMAGE) {
3472066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang            return false;
3482066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang        }
3492066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang        if (mMediaSet instanceof MtpDevice) {
3502066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang            return false;
3512066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang        }
3522066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang        return true;
3532066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang    }
3542066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang
355f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private void showBars() {
356f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        if (mShowBars) return;
357f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mShowBars = true;
358f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mActionBar.show();
359f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        WindowManager.LayoutParams params = ((Activity) mActivity).getWindow().getAttributes();
360f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        params.systemUiVisibility = View.SYSTEM_UI_FLAG_VISIBLE;
361f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        ((Activity) mActivity).getWindow().setAttributes(params);
362f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
363f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
364f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private void hideBars() {
365f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        if (!mShowBars) return;
366f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mShowBars = false;
367f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mActionBar.hide();
368f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        WindowManager.LayoutParams params = ((Activity) mActivity).getWindow().getAttributes();
369f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        params.systemUiVisibility = View. SYSTEM_UI_FLAG_LOW_PROFILE;
370f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        ((Activity) mActivity).getWindow().setAttributes(params);
371f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
372f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
373f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private void refreshHidingMessage() {
374f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mHandler.removeMessages(MSG_HIDE_BARS);
375f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        if (!mIsMenuVisible && !mIsInteracting) {
376f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            mHandler.sendEmptyMessageDelayed(MSG_HIDE_BARS, HIDE_BARS_TIMEOUT);
377f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
378f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
379f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
3808bc5bebba780ca4a322b466b06fc909331697cf4Owen Lin    @Override
381f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public void onUserInteraction() {
382f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        showBars();
383f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        refreshHidingMessage();
384f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
385f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
386f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public void onUserInteractionTap() {
387f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        if (mShowBars) {
388f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            hideBars();
389f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            mHandler.removeMessages(MSG_HIDE_BARS);
390f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        } else {
391f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            showBars();
392f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            refreshHidingMessage();
393f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
394f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
395f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
3968bc5bebba780ca4a322b466b06fc909331697cf4Owen Lin    @Override
397f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public void onUserInteractionBegin() {
398f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        showBars();
399f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mIsInteracting = true;
400f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        refreshHidingMessage();
401f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
402f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
4038bc5bebba780ca4a322b466b06fc909331697cf4Owen Lin    @Override
404f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public void onUserInteractionEnd() {
405f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mIsInteracting = false;
4068bc5bebba780ca4a322b466b06fc909331697cf4Owen Lin
4078bc5bebba780ca4a322b466b06fc909331697cf4Owen Lin        // This function could be called from GL thread (in SlotView.render)
4088bc5bebba780ca4a322b466b06fc909331697cf4Owen Lin        // and post to the main thread. So, it could be executed while the
4098bc5bebba780ca4a322b466b06fc909331697cf4Owen Lin        // activity is paused.
4108bc5bebba780ca4a322b466b06fc909331697cf4Owen Lin        if (mIsActive) refreshHidingMessage();
411f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
412f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
413f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    @Override
414bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    public void onOrientationCompensationChanged(int degrees) {
415bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang        mActivity.getGLRoot().setOrientationCompensation(degrees);
416bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    }
417bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang
418bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    @Override
419f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    protected void onBackPressed() {
420f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        if (mShowDetails) {
421f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            hideDetails();
422160e6d776daab93610b3d12413ad9ff2dd867d8bChih-Chung Chang        } else if (mScreenNail == null
423160e6d776daab93610b3d12413ad9ff2dd867d8bChih-Chung Chang                || !switchWithCaptureAnimation(-1)) {
424bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang            // We are leaving this page. Set the result now.
425bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang            setResult();
426f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            super.onBackPressed();
427f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
428f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
429f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
430bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    private void setResult() {
431bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang        Intent result = null;
432bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang        if (!mPhotoView.getFilmMode()) {
433bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang            result = new Intent();
434bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang            result.putExtra(KEY_RETURN_INDEX_HINT, mCurrentIndex);
435bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang        }
436bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang        setStateResult(Activity.RESULT_OK, result);
437bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    }
438bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang
439bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    //////////////////////////////////////////////////////////////////////////
440bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    //  AppBridge.Server interface
441bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    //////////////////////////////////////////////////////////////////////////
442bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang
443bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    @Override
444bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    public void setCameraNaturalFrame(Rect frame) {
445bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang        mPhotoView.setCameraNaturalFrame(frame);
446bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    }
447bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang
448bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    @Override
4492c6173822a612597c79be41b126367ddfbb5d518Chih-Chung Chang    public boolean switchWithCaptureAnimation(int offset) {
4502c6173822a612597c79be41b126367ddfbb5d518Chih-Chung Chang        return mPhotoView.switchWithCaptureAnimation(offset);
4512c6173822a612597c79be41b126367ddfbb5d518Chih-Chung Chang    }
4522c6173822a612597c79be41b126367ddfbb5d518Chih-Chung Chang
453f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    @Override
454f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    protected boolean onCreateActionBar(Menu menu) {
455f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        MenuInflater inflater = ((Activity) mActivity).getMenuInflater();
456f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        inflater.inflate(R.menu.photo, menu);
457f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mShareActionProvider = GalleryActionBar.initializeShareActionProvider(menu);
458cf46a3abc26aac7cdb6b6993aeade053304b71d9Ray Chen        if (mPendingSharePath != null) updateShareURI(mPendingSharePath);
459f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mMenu = menu;
460f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mShowBars = true;
461f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        updateMenuOperations();
462ed46d77c16cd80357f4a0feada2435dfba8104a6Yuli Huang        updateTitle();
463f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        return true;
464f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
465f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
466f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    @Override
467f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    protected boolean onItemSelected(MenuItem item) {
468f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        MediaItem current = mModel.getCurrentMediaItem();
469f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
470f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        if (current == null) {
471f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            // item is not ready, ignore
472f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            return true;
473f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
474f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
475f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        int currentIndex = mModel.getCurrentIndex();
476f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        Path path = current.getPath();
477f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
478f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        DataManager manager = mActivity.getDataManager();
479f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        int action = item.getItemId();
48067098d1a72fd04e2af06d3a5939cde28c65f70d9Ray Chen        boolean needsConfirm = false;
481f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        switch (action) {
48284c220f10a643927c8a2126de8a755d8d7f7ec9eRay Chen            case android.R.id.home: {
48384c220f10a643927c8a2126de8a755d8d7f7ec9eRay Chen                if (mSetPathString != null) {
48484c220f10a643927c8a2126de8a755d8d7f7ec9eRay Chen                    if (mActivity.getStateManager().getStateCount() > 1) {
48584c220f10a643927c8a2126de8a755d8d7f7ec9eRay Chen                        onBackPressed();
48684c220f10a643927c8a2126de8a755d8d7f7ec9eRay Chen                    } else {
48798c2490a424da79beefbdd8a29fb90ab006c77b0Ray Chen                        // We're in view mode so set up the stacks on our own.
48898c2490a424da79beefbdd8a29fb90ab006c77b0Ray Chen                        Bundle data = new Bundle(getData());
48998c2490a424da79beefbdd8a29fb90ab006c77b0Ray Chen                        data.putString(AlbumPage.KEY_MEDIA_PATH, mSetPathString);
49098c2490a424da79beefbdd8a29fb90ab006c77b0Ray Chen                        data.putString(AlbumPage.KEY_PARENT_MEDIA_PATH,
49198c2490a424da79beefbdd8a29fb90ab006c77b0Ray Chen                                mActivity.getDataManager().getTopSetPath(
49298c2490a424da79beefbdd8a29fb90ab006c77b0Ray Chen                                        DataManager.INCLUDE_ALL));
49398c2490a424da79beefbdd8a29fb90ab006c77b0Ray Chen                        mActivity.getStateManager().switchState(this, AlbumPage.class, data);
49484c220f10a643927c8a2126de8a755d8d7f7ec9eRay Chen                    }
49584c220f10a643927c8a2126de8a755d8d7f7ec9eRay Chen                }
49684c220f10a643927c8a2126de8a755d8d7f7ec9eRay Chen                return true;
49784c220f10a643927c8a2126de8a755d8d7f7ec9eRay Chen            }
498f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            case R.id.action_slideshow: {
499f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                Bundle data = new Bundle();
5006cf807453fb58ccd4cc513ff187b306c7090e67cOwen Lin                data.putString(SlideshowPage.KEY_SET_PATH, mMediaSet.getPath().toString());
501604f053d040782159b61d3b74ee533bc2c0ccdd0Ray Chen                data.putString(SlideshowPage.KEY_ITEM_PATH, path.toString());
502f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                data.putInt(SlideshowPage.KEY_PHOTO_INDEX, currentIndex);
503f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                data.putBoolean(SlideshowPage.KEY_REPEAT, true);
504f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                mActivity.getStateManager().startStateForResult(
505f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                        SlideshowPage.class, REQUEST_SLIDESHOW, data);
506f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                return true;
507f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            }
508f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            case R.id.action_crop: {
509f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                Activity activity = (Activity) mActivity;
510f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                Intent intent = new Intent(CropImage.CROP_ACTION);
511f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                intent.setClass(activity, CropImage.class);
512f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                intent.setData(manager.getContentUri(path));
513f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                activity.startActivityForResult(intent, PicasaSource.isPicasaImage(current)
514f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                        ? REQUEST_CROP_PICASA
515f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                        : REQUEST_CROP);
516f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                return true;
517f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            }
518f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            case R.id.action_details: {
519f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                if (mShowDetails) {
520f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                    hideDetails();
521f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                } else {
522f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                    showDetails(currentIndex);
523f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                }
524f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                return true;
525f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            }
52667098d1a72fd04e2af06d3a5939cde28c65f70d9Ray Chen            case R.id.action_delete:
52767098d1a72fd04e2af06d3a5939cde28c65f70d9Ray Chen                needsConfirm = true;
528f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            case R.id.action_setas:
529f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            case R.id.action_rotate_ccw:
530f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            case R.id.action_rotate_cw:
531f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            case R.id.action_show_on_map:
532f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            case R.id.action_edit:
533f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                mSelectionManager.deSelectAll();
534f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                mSelectionManager.toggle(path);
53567098d1a72fd04e2af06d3a5939cde28c65f70d9Ray Chen                mMenuExecutor.onMenuClicked(item, needsConfirm, null);
536f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                return true;
537f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            case R.id.action_import:
538f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                mSelectionManager.deSelectAll();
539f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                mSelectionManager.toggle(path);
54067098d1a72fd04e2af06d3a5939cde28c65f70d9Ray Chen                mMenuExecutor.onMenuClicked(item, needsConfirm,
541f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                        new ImportCompleteListener(mActivity));
542f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                return true;
543f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            default :
544f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                return false;
545f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
546f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
547f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
548f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private void hideDetails() {
549f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mShowDetails = false;
5504105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen        mDetailsHelper.hide();
551f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
552f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
553f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private void showDetails(int index) {
554f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mShowDetails = true;
5554105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen        if (mDetailsHelper == null) {
5564105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen            mDetailsHelper = new DetailsHelper(mActivity, mRootPane, new MyDetailsSource());
5574105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen            mDetailsHelper.setCloseListener(new CloseListener() {
558f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                public void onClose() {
559f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                    hideDetails();
560f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                }
561f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            });
562f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
5634105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen        mDetailsHelper.reloadDetails(index);
5644105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen        mDetailsHelper.show();
565f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
566f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
567bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    ////////////////////////////////////////////////////////////////////////////
568bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    //  Callbacks from PhotoView
569bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    ////////////////////////////////////////////////////////////////////////////
570bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    @Override
571f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public void onSingleTapUp(int x, int y) {
572bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang        if (mAppBridge != null) {
573bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang            if (mAppBridge.onSingleTapUp(x, y)) return;
574014d9586d8145a33f4e99eaad570587f6d650026Wu-cheng Li        }
575014d9586d8145a33f4e99eaad570587f6d650026Wu-cheng Li
576f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        MediaItem item = mModel.getCurrentMediaItem();
577f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        if (item == null) {
578f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            // item is not ready, ignore
579f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            return;
580f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
581f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
582f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        boolean playVideo =
583f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                (item.getSupportedOperations() & MediaItem.SUPPORT_PLAY) != 0;
584f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
585f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        if (playVideo) {
586f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            // determine if the point is at center (1/6) of the photo view.
587f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            // (The position of the "play" icon is at center (1/6) of the photo)
588f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            int w = mPhotoView.getWidth();
589f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            int h = mPhotoView.getHeight();
590f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            playVideo = (Math.abs(x - w / 2) * 12 <= w)
591f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                && (Math.abs(y - h / 2) * 12 <= h);
592f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
593f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
594f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        if (playVideo) {
595f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            playVideo((Activity) mActivity, item.getPlayUri(), item.getName());
596f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        } else {
597f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            onUserInteractionTap();
598f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
599f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
600f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
601bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    @Override
602bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    public void lockOrientation() {
603bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang        mHandler.sendEmptyMessage(MSG_LOCK_ORIENTATION);
604bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    }
605bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang
606bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    @Override
607bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    public void unlockOrientation() {
608bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang        // Temporarily disabled until Camera UI can switch orientation.
609bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang        // mHandler.sendEmptyMessage(MSG_UNLOCK_ORIENTATION);
610bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    }
611bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang
612bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    @Override
613bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    public void onFullScreenChanged(boolean full) {
614bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang        Message m = mHandler.obtainMessage(
615bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang                MSG_ON_FULL_SCREEN_CHANGED, full ? 1 : 0, 0);
616bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang        m.sendToTarget();
617bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    }
618bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang
619f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public static void playVideo(Activity activity, Uri uri, String title) {
620f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        try {
621f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            Intent intent = new Intent(Intent.ACTION_VIEW)
622f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                    .setDataAndType(uri, "video/*");
623f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            intent.putExtra(Intent.EXTRA_TITLE, title);
624f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            activity.startActivity(intent);
625f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        } catch (ActivityNotFoundException e) {
626f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            Toast.makeText(activity, activity.getString(R.string.video_err),
627f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                    Toast.LENGTH_SHORT).show();
628f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
629f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
630f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
631f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    @Override
632f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    protected void onStateResult(int requestCode, int resultCode, Intent data) {
633f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        switch (requestCode) {
634f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            case REQUEST_CROP:
635f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                if (resultCode == Activity.RESULT_OK) {
636f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                    if (data == null) break;
63721a412c93c9b0401b039f4eb86d4950752e5bb84Owen Lin                    Path path = mApplication.getDataManager()
63821a412c93c9b0401b039f4eb86d4950752e5bb84Owen Lin                            .findPathByUri(data.getData(), data.getType());
639f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                    if (path != null) {
640f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                        mModel.setCurrentPhoto(path, mCurrentIndex);
641f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                    }
642f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                }
643f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                break;
644f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            case REQUEST_CROP_PICASA: {
645985e289d4ceed04351c300484d28299dcf915896Yuli Huang                Context context = mActivity.getAndroidContext();
646985e289d4ceed04351c300484d28299dcf915896Yuli Huang                // TODO: Use crop_saved instead of photo_saved after its new translation is done.
647985e289d4ceed04351c300484d28299dcf915896Yuli Huang                String message = resultCode == Activity.RESULT_OK ? context.getString(
648985e289d4ceed04351c300484d28299dcf915896Yuli Huang                        R.string.photo_saved, context.getString(R.string.folder_download))
649985e289d4ceed04351c300484d28299dcf915896Yuli Huang                        : context.getString(R.string.crop_not_saved);
650985e289d4ceed04351c300484d28299dcf915896Yuli Huang                Toast.makeText(context, message, Toast.LENGTH_SHORT).show();
651f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                break;
652f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            }
653f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            case REQUEST_SLIDESHOW: {
654f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                if (data == null) break;
655f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                String path = data.getStringExtra(SlideshowPage.KEY_ITEM_PATH);
656f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                int index = data.getIntExtra(SlideshowPage.KEY_PHOTO_INDEX, 0);
657f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                if (path != null) {
658f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                    mModel.setCurrentPhoto(Path.fromString(path), index);
659f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                }
660f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            }
661f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
662f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
663f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
664f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    @Override
665f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public void onPause() {
666f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        super.onPause();
667f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mIsActive = false;
668bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang        if (mAppBridge != null) mAppBridge.setServer(null);
6694105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen        DetailsHelper.pause();
670f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mPhotoView.pause();
671f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mModel.pause();
672f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mHandler.removeMessages(MSG_HIDE_BARS);
673f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mActionBar.removeOnMenuVisibilityListener(mMenuVisibilityListener);
67433ef03776b7734717b16f6fc861b831fb1b1dfacMartijn Coenen
6752785956f8f5654966a41e20f482f4af3057eea3fChih-Chung Chang        mMenuExecutor.pause();
676f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
677f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
678f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    @Override
679f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    protected void onResume() {
680f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        super.onResume();
681f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mIsActive = true;
682f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        setContentPane(mRootPane);
68304ac045bf8da5082bbb0bdc9ea5f9c9b5b796ad0Yuli Huang
684f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mModel.resume();
685f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mPhotoView.resume();
686f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        if (mMenuVisibilityListener == null) {
687f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            mMenuVisibilityListener = new MyMenuVisibilityListener();
688f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
6898cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen        mActionBar.setDisplayOptions(mSetPathString != null, true);
690f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mActionBar.addOnMenuVisibilityListener(mMenuVisibilityListener);
69133ef03776b7734717b16f6fc861b831fb1b1dfacMartijn Coenen
692f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        onUserInteraction();
693bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang        if (mAppBridge != null) {
694bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang            mAppBridge.setServer(this);
695bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang            mModel.moveTo(0);  // move to the camera preview after resume
696bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang        }
697f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
698f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
69915b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang    @Override
70015b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang    protected void onDestroy() {
701bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang        if (mAppBridge != null) {
702bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang            // Unregister the ScreenNail and notify mAppBridge.
703b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang            SnailSource.unregisterScreenNail(mScreenNail);
704bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang            mAppBridge.detachScreenNail();
705bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang            mAppBridge = null;
706b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang            mScreenNail = null;
707b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang        }
708bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang        mOrientationManager.removeListener(this);
70915b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang        super.onDestroy();
71015b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang    }
71115b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang
712f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private class MyDetailsSource implements DetailsSource {
7134105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen        private int mIndex;
7146cf807453fb58ccd4cc513ff187b306c7090e67cOwen Lin
7156cf807453fb58ccd4cc513ff187b306c7090e67cOwen Lin        @Override
716f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        public MediaDetails getDetails() {
717f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            return mModel.getCurrentMediaItem().getDetails();
718f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
7196cf807453fb58ccd4cc513ff187b306c7090e67cOwen Lin
7206cf807453fb58ccd4cc513ff187b306c7090e67cOwen Lin        @Override
721f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        public int size() {
722f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            return mMediaSet != null ? mMediaSet.getMediaItemCount() : 1;
723f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
7246cf807453fb58ccd4cc513ff187b306c7090e67cOwen Lin
7256cf807453fb58ccd4cc513ff187b306c7090e67cOwen Lin        @Override
726f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        public int findIndex(int indexHint) {
7274105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen            mIndex = indexHint;
728f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            return indexHint;
729f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
7304105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen
7316cf807453fb58ccd4cc513ff187b306c7090e67cOwen Lin        @Override
7324105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen        public int getIndex() {
7334105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen            return mIndex;
7344105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen        }
735f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
736f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin}
737