PhotoPage.java revision 33f8567dd5003e4bb342683f3768ab7552648b02
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;
57f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.ui.SelectionManager;
58f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.ui.SynchronizedHandler;
59f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.ui.UserInteractionListener;
60f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.util.GalleryUtils;
61f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
62bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Changpublic class PhotoPage extends ActivityState implements
63bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang        PhotoView.Listener, UserInteractionListener,
64bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang        OrientationManager.Listener, AppBridge.Server {
65f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private static final String TAG = "PhotoPage";
66f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
67f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private static final int MSG_HIDE_BARS = 1;
68bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    private static final int MSG_LOCK_ORIENTATION = 2;
69bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    private static final int MSG_UNLOCK_ORIENTATION = 3;
70bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    private static final int MSG_ON_FULL_SCREEN_CHANGED = 4;
716cf807453fb58ccd4cc513ff187b306c7090e67cOwen Lin
72f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private static final int HIDE_BARS_TIMEOUT = 3500;
73f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
74f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private static final int REQUEST_SLIDESHOW = 1;
75f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private static final int REQUEST_CROP = 2;
76f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private static final int REQUEST_CROP_PICASA = 3;
77f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang    private static final int REQUEST_EDIT = 4;
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;
113b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang    // This is the original mSetPathString before adding the camera preview item.
114b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang    private String mOriginalSetPathString;
115bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    private AppBridge mAppBridge;
116b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang    private ScreenNail mScreenNail;
117bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    private MediaItem mScreenNailItem;
118bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    private OrientationManager mOrientationManager;
11915b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang
12033ef03776b7734717b16f6fc861b831fb1b1dfacMartijn Coenen    private NfcAdapter mNfcAdapter;
12133ef03776b7734717b16f6fc861b831fb1b1dfacMartijn Coenen
122f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public static interface Model extends PhotoView.Model {
123f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        public void resume();
124f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        public void pause();
125f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        public boolean isEmpty();
126f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        public MediaItem getCurrentMediaItem();
127f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        public void setCurrentPhoto(Path path, int indexHint);
128f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
129f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
130f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private class MyMenuVisibilityListener implements OnMenuVisibilityListener {
131f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        public void onMenuVisibilityChanged(boolean isVisible) {
132f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            mIsMenuVisible = isVisible;
133f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            refreshHidingMessage();
134f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
135f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
136f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
137604f053d040782159b61d3b74ee533bc2c0ccdd0Ray Chen    private final GLView mRootPane = new GLView() {
138f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
139f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        @Override
140f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        protected void renderBackground(GLCanvas view) {
141f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            view.clearBuffer();
142f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
143f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
144f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        @Override
145f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        protected void onLayout(
146f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                boolean changed, int left, int top, int right, int bottom) {
147f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            mPhotoView.layout(0, 0, right - left, bottom - top);
148f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            if (mShowDetails) {
1498cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen                mDetailsHelper.layout(left, mActionBar.getHeight(), right, bottom);
150f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            }
151f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
152bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang
153bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang        @Override
154bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang        protected void orient(int displayRotation, int compensation) {
155bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang            displayRotation = mOrientationManager.getDisplayRotation();
156bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang            Log.d(TAG, "orient -- display rotation " + displayRotation
157bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang                    + ", compensation = " + compensation);
158bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang            super.orient(displayRotation, compensation);
159bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang        }
160f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    };
161f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
162f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    @Override
163f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public void onCreate(Bundle data, Bundle restoreState) {
1648cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen        mActionBar = mActivity.getGalleryActionBar();
165f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mSelectionManager = new SelectionManager(mActivity, false);
166f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mMenuExecutor = new MenuExecutor(mActivity, mSelectionManager);
167f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
168f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mPhotoView = new PhotoView(mActivity);
169bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang        mPhotoView.setListener(this);
170f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mRootPane.addComponent(mPhotoView);
171f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mApplication = (GalleryApp)((Activity) mActivity).getApplication();
172bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang        mOrientationManager = mActivity.getOrientationManager();
173bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang        mOrientationManager.addListener(this);
174f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
17584c220f10a643927c8a2126de8a755d8d7f7ec9eRay Chen        mSetPathString = data.getString(KEY_MEDIA_SET_PATH);
176b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang        mOriginalSetPathString = mSetPathString;
17733ef03776b7734717b16f6fc861b831fb1b1dfacMartijn Coenen        mNfcAdapter = NfcAdapter.getDefaultAdapter(mActivity.getAndroidContext());
178f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        Path itemPath = Path.fromString(data.getString(KEY_MEDIA_ITEM_PATH));
179f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
18084c220f10a643927c8a2126de8a755d8d7f7ec9eRay Chen        if (mSetPathString != null) {
181bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang            mAppBridge = (AppBridge) data.getParcelable(KEY_APP_BRIDGE);
182bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang            if (mAppBridge != null) {
183bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang                mOrientationManager.lockOrientation();
184b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang
185bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang                // Get the ScreenNail from AppBridge and register it.
186bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang                mScreenNail = mAppBridge.attachScreenNail();
187b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang                int id = SnailSource.registerScreenNail(mScreenNail);
188b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang                Path screenNailSetPath = SnailSource.getSetPath(id);
189bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang                Path screenNailItemPath = SnailSource.getItemPath(id);
190bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang                mScreenNailItem = (MediaItem) mActivity.getDataManager()
191bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang                        .getMediaObject(screenNailItemPath);
192b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang
193b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang                // Combine the original MediaSet with the one for CameraScreenNail.
194b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang                mSetPathString = "/combo/item/{" + screenNailSetPath +
195b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang                        "," + mSetPathString + "}";
196b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang
197b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang                // Start from the screen nail.
198bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang                itemPath = screenNailItemPath;
199788245711658188131ae2670e44fb6ca8ad5d53aWu-cheng Li
200788245711658188131ae2670e44fb6ca8ad5d53aWu-cheng Li                // Action bar should not be displayed when camera starts.
201788245711658188131ae2670e44fb6ca8ad5d53aWu-cheng Li                mFlags |= FLAG_HIDE_ACTION_BAR;
202b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang            }
203b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang
20484c220f10a643927c8a2126de8a755d8d7f7ec9eRay Chen            mMediaSet = mActivity.getDataManager().getMediaSet(mSetPathString);
205f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            mCurrentIndex = data.getInt(KEY_INDEX_HINT, 0);
206f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            if (mMediaSet == null) {
20784c220f10a643927c8a2126de8a755d8d7f7ec9eRay Chen                Log.w(TAG, "failed to restore " + mSetPathString);
208f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            }
209f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            PhotoDataAdapter pda = new PhotoDataAdapter(
210bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang                    mActivity, mPhotoView, mMediaSet, itemPath, mCurrentIndex,
211bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang                    mAppBridge == null ? -1 : 0);
212f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            mModel = pda;
213f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            mPhotoView.setModel(mModel);
214f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
215f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            pda.setDataListener(new PhotoDataAdapter.DataListener() {
216f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
217113bfc77c4468411da9ae1290553c3be89f8df9aOwen Lin                @Override
218f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                public void onPhotoChanged(int index, Path item) {
219f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                    mCurrentIndex = index;
220f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                    if (item != null) {
221f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                        MediaItem photo = mModel.getCurrentMediaItem();
222f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                        if (photo != null) updateCurrentPhoto(photo);
223f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                    }
224f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                }
225f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
226f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                @Override
227f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                public void onLoadingFinished() {
228f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                    GalleryUtils.setSpinnerVisibility((Activity) mActivity, false);
229f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                    if (!mModel.isEmpty()) {
230f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                        MediaItem photo = mModel.getCurrentMediaItem();
231f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                        if (photo != null) updateCurrentPhoto(photo);
232f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                    } else if (mIsActive) {
233f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                        mActivity.getStateManager().finishState(PhotoPage.this);
234f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                    }
235f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                }
236f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
237f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                @Override
238f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                public void onLoadingStarted() {
239f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                    GalleryUtils.setSpinnerVisibility((Activity) mActivity, true);
240f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                }
241f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            });
242f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        } else {
243f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            // Get default media set by the URI
244f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            MediaItem mediaItem = (MediaItem)
245f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                    mActivity.getDataManager().getMediaObject(itemPath);
246f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            mModel = new SinglePhotoDataAdapter(mActivity, mPhotoView, mediaItem);
247f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            mPhotoView.setModel(mModel);
248f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            updateCurrentPhoto(mediaItem);
249f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
250cf46a3abc26aac7cdb6b6993aeade053304b71d9Ray Chen
251f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mHandler = new SynchronizedHandler(mActivity.getGLRoot()) {
252f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            @Override
253f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            public void handleMessage(Message message) {
254f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                switch (message.what) {
255f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                    case MSG_HIDE_BARS: {
256f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                        hideBars();
257f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                        break;
258f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                    }
259bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang                    case MSG_LOCK_ORIENTATION: {
260bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang                        mOrientationManager.lockOrientation();
261bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang                        break;
262bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang                    }
263bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang                    case MSG_UNLOCK_ORIENTATION: {
264bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang                        mOrientationManager.unlockOrientation();
265bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang                        break;
266bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang                    }
267bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang                    case MSG_ON_FULL_SCREEN_CHANGED: {
268bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang                        mAppBridge.onFullScreenChanged(message.arg1 == 1);
269bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang                        break;
270bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang                    }
271f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                    default: throw new AssertionError(message.what);
272f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                }
273f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            }
274f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        };
275f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
27604ac045bf8da5082bbb0bdc9ea5f9c9b5b796ad0Yuli Huang        // start the opening animation only if it's not restored.
27704ac045bf8da5082bbb0bdc9ea5f9c9b5b796ad0Yuli Huang        if (restoreState == null) {
27804ac045bf8da5082bbb0bdc9ea5f9c9b5b796ad0Yuli Huang            mPhotoView.setOpenAnimationRect((Rect) data.getParcelable(KEY_OPEN_ANIMATION_RECT));
27904ac045bf8da5082bbb0bdc9ea5f9c9b5b796ad0Yuli Huang        }
280f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
281f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
282cf46a3abc26aac7cdb6b6993aeade053304b71d9Ray Chen    private void updateShareURI(Path path) {
283cf46a3abc26aac7cdb6b6993aeade053304b71d9Ray Chen        if (mShareActionProvider != null) {
284cf46a3abc26aac7cdb6b6993aeade053304b71d9Ray Chen            DataManager manager = mActivity.getDataManager();
285cf46a3abc26aac7cdb6b6993aeade053304b71d9Ray Chen            int type = manager.getMediaType(path);
286cf46a3abc26aac7cdb6b6993aeade053304b71d9Ray Chen            Intent intent = new Intent(Intent.ACTION_SEND);
287cf46a3abc26aac7cdb6b6993aeade053304b71d9Ray Chen            intent.setType(MenuExecutor.getMimeType(type));
288cf46a3abc26aac7cdb6b6993aeade053304b71d9Ray Chen            intent.putExtra(Intent.EXTRA_STREAM, manager.getContentUri(path));
289cf46a3abc26aac7cdb6b6993aeade053304b71d9Ray Chen            mShareActionProvider.setShareIntent(intent);
29033ef03776b7734717b16f6fc861b831fb1b1dfacMartijn Coenen            if (mNfcAdapter != null) {
291a41ed05ff2f71d2177b4f24f53acd848b46fc840Martijn Coenen                mNfcAdapter.setBeamPushUris(new Uri[]{manager.getContentUri(path)},
292a41ed05ff2f71d2177b4f24f53acd848b46fc840Martijn Coenen                        (Activity)mActivity);
29333ef03776b7734717b16f6fc861b831fb1b1dfacMartijn Coenen            }
294cf46a3abc26aac7cdb6b6993aeade053304b71d9Ray Chen            mPendingSharePath = null;
295cf46a3abc26aac7cdb6b6993aeade053304b71d9Ray Chen        } else {
296cf46a3abc26aac7cdb6b6993aeade053304b71d9Ray Chen            // This happens when ActionBar is not created yet.
297cf46a3abc26aac7cdb6b6993aeade053304b71d9Ray Chen            mPendingSharePath = path;
298cf46a3abc26aac7cdb6b6993aeade053304b71d9Ray Chen        }
299cf46a3abc26aac7cdb6b6993aeade053304b71d9Ray Chen    }
300cf46a3abc26aac7cdb6b6993aeade053304b71d9Ray Chen
301f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private void updateCurrentPhoto(MediaItem photo) {
302f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        if (mCurrentPhoto == photo) return;
303f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mCurrentPhoto = photo;
304f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        if (mCurrentPhoto == null) return;
305f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        updateMenuOperations();
306736cf74b170d32374c8b35dbe6a46d975258be87Wu-cheng Li        // Hide the action bar when going back to camera preview.
307bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang        if (photo == mScreenNailItem) hideBars();
308ed46d77c16cd80357f4a0feada2435dfba8104a6Yuli Huang        updateTitle();
309f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        if (mShowDetails) {
3104105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen            mDetailsHelper.reloadDetails(mModel.getCurrentIndex());
311f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
312cf46a3abc26aac7cdb6b6993aeade053304b71d9Ray Chen        mPhotoView.showVideoPlayIcon(
313cf46a3abc26aac7cdb6b6993aeade053304b71d9Ray Chen                photo.getMediaType() == MediaObject.MEDIA_TYPE_VIDEO);
314f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
31515b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang        if ((photo.getSupportedOperations() & MediaItem.SUPPORT_SHARE) != 0) {
31615b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang            updateShareURI(photo.getPath());
31715b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang        }
318f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
319f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
320ed46d77c16cd80357f4a0feada2435dfba8104a6Yuli Huang    private void updateTitle() {
321ed46d77c16cd80357f4a0feada2435dfba8104a6Yuli Huang        if (mCurrentPhoto == null) return;
322ed46d77c16cd80357f4a0feada2435dfba8104a6Yuli Huang        boolean showTitle = mActivity.getAndroidContext().getResources().getBoolean(
323ed46d77c16cd80357f4a0feada2435dfba8104a6Yuli Huang                R.bool.show_action_bar_title);
324ed46d77c16cd80357f4a0feada2435dfba8104a6Yuli Huang        if (showTitle && mCurrentPhoto.getName() != null)
325ed46d77c16cd80357f4a0feada2435dfba8104a6Yuli Huang            mActionBar.setTitle(mCurrentPhoto.getName());
326ed46d77c16cd80357f4a0feada2435dfba8104a6Yuli Huang        else
327ed46d77c16cd80357f4a0feada2435dfba8104a6Yuli Huang            mActionBar.setTitle("");
328ed46d77c16cd80357f4a0feada2435dfba8104a6Yuli Huang    }
329ed46d77c16cd80357f4a0feada2435dfba8104a6Yuli Huang
330f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private void updateMenuOperations() {
3312066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang        if (mMenu == null) return;
3322066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang        MenuItem item = mMenu.findItem(R.id.action_slideshow);
3332066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang        if (item != null) {
3342066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang            item.setVisible(canDoSlideShow());
3352066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang        }
3362066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang        if (mCurrentPhoto == null) return;
337f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        int supportedOperations = mCurrentPhoto.getSupportedOperations();
338f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        if (!GalleryUtils.isEditorAvailable((Context) mActivity, "image/*")) {
339f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            supportedOperations &= ~MediaObject.SUPPORT_EDIT;
340f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
341604f053d040782159b61d3b74ee533bc2c0ccdd0Ray Chen
342f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        MenuExecutor.updateMenuOperation(mMenu, supportedOperations);
343f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
344f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
3452066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang    private boolean canDoSlideShow() {
3462066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang        if (mMediaSet == null || mCurrentPhoto == null) {
3472066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang            return false;
3482066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang        }
3492066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang        if (mCurrentPhoto.getMediaType() != MediaObject.MEDIA_TYPE_IMAGE) {
3502066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang            return false;
3512066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang        }
3522066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang        if (mMediaSet instanceof MtpDevice) {
3532066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang            return false;
3542066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang        }
3552066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang        return true;
3562066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang    }
3572066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang
358f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private void showBars() {
359f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        if (mShowBars) return;
360f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mShowBars = true;
361f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mActionBar.show();
362f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        WindowManager.LayoutParams params = ((Activity) mActivity).getWindow().getAttributes();
363f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        params.systemUiVisibility = View.SYSTEM_UI_FLAG_VISIBLE;
364f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        ((Activity) mActivity).getWindow().setAttributes(params);
365f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
366f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
367f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private void hideBars() {
368f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        if (!mShowBars) return;
369f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mShowBars = false;
370f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mActionBar.hide();
371f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        WindowManager.LayoutParams params = ((Activity) mActivity).getWindow().getAttributes();
372f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        params.systemUiVisibility = View. SYSTEM_UI_FLAG_LOW_PROFILE;
373f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        ((Activity) mActivity).getWindow().setAttributes(params);
374f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
375f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
376f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private void refreshHidingMessage() {
377f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mHandler.removeMessages(MSG_HIDE_BARS);
378f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        if (!mIsMenuVisible && !mIsInteracting) {
379f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            mHandler.sendEmptyMessageDelayed(MSG_HIDE_BARS, HIDE_BARS_TIMEOUT);
380f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
381f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
382f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
3838bc5bebba780ca4a322b466b06fc909331697cf4Owen Lin    @Override
384f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public void onUserInteraction() {
385f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        showBars();
386f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        refreshHidingMessage();
387f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
388f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
389f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public void onUserInteractionTap() {
390f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        if (mShowBars) {
391f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            hideBars();
392f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            mHandler.removeMessages(MSG_HIDE_BARS);
393f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        } else {
394f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            showBars();
395f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            refreshHidingMessage();
396f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
397f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
398f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
3998bc5bebba780ca4a322b466b06fc909331697cf4Owen Lin    @Override
400f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public void onUserInteractionBegin() {
401f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        showBars();
402f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mIsInteracting = true;
403f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        refreshHidingMessage();
404f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
405f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
4068bc5bebba780ca4a322b466b06fc909331697cf4Owen Lin    @Override
407f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public void onUserInteractionEnd() {
408f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mIsInteracting = false;
4098bc5bebba780ca4a322b466b06fc909331697cf4Owen Lin
4108bc5bebba780ca4a322b466b06fc909331697cf4Owen Lin        // This function could be called from GL thread (in SlotView.render)
4118bc5bebba780ca4a322b466b06fc909331697cf4Owen Lin        // and post to the main thread. So, it could be executed while the
4128bc5bebba780ca4a322b466b06fc909331697cf4Owen Lin        // activity is paused.
4138bc5bebba780ca4a322b466b06fc909331697cf4Owen Lin        if (mIsActive) refreshHidingMessage();
414f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
415f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
416f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    @Override
417bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    public void onOrientationCompensationChanged(int degrees) {
418bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang        mActivity.getGLRoot().setOrientationCompensation(degrees);
419bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    }
420bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang
421bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    @Override
422f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    protected void onBackPressed() {
423f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        if (mShowDetails) {
424f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            hideDetails();
425160e6d776daab93610b3d12413ad9ff2dd867d8bChih-Chung Chang        } else if (mScreenNail == null
426160e6d776daab93610b3d12413ad9ff2dd867d8bChih-Chung Chang                || !switchWithCaptureAnimation(-1)) {
427bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang            // We are leaving this page. Set the result now.
428bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang            setResult();
429f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            super.onBackPressed();
430f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
431f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
432f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
433b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang    private void onUpPressed() {
434b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang        if (mActivity.getStateManager().getStateCount() > 1) {
435b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang            super.onBackPressed();
436b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang        } else if (mOriginalSetPathString != null) {
437b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang            // We're in view mode so set up the stacks on our own.
438b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang            Bundle data = new Bundle(getData());
439b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang            data.putString(AlbumPage.KEY_MEDIA_PATH, mOriginalSetPathString);
440b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang            data.putString(AlbumPage.KEY_PARENT_MEDIA_PATH,
441b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang                    mActivity.getDataManager().getTopSetPath(
442b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang                            DataManager.INCLUDE_ALL));
443b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang            mActivity.getStateManager().switchState(this, AlbumPage.class, data);
444b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang        }
445b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang    }
446b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang
447bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    private void setResult() {
448bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang        Intent result = null;
449bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang        if (!mPhotoView.getFilmMode()) {
450bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang            result = new Intent();
451bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang            result.putExtra(KEY_RETURN_INDEX_HINT, mCurrentIndex);
452bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang        }
453bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang        setStateResult(Activity.RESULT_OK, result);
454bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    }
455bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang
456bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    //////////////////////////////////////////////////////////////////////////
457bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    //  AppBridge.Server interface
458bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    //////////////////////////////////////////////////////////////////////////
459bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang
460bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    @Override
461bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    public void setCameraNaturalFrame(Rect frame) {
462bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang        mPhotoView.setCameraNaturalFrame(frame);
463bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    }
464bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang
465bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    @Override
4662c6173822a612597c79be41b126367ddfbb5d518Chih-Chung Chang    public boolean switchWithCaptureAnimation(int offset) {
4672c6173822a612597c79be41b126367ddfbb5d518Chih-Chung Chang        return mPhotoView.switchWithCaptureAnimation(offset);
4682c6173822a612597c79be41b126367ddfbb5d518Chih-Chung Chang    }
4692c6173822a612597c79be41b126367ddfbb5d518Chih-Chung Chang
470f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    @Override
471f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    protected boolean onCreateActionBar(Menu menu) {
472f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        MenuInflater inflater = ((Activity) mActivity).getMenuInflater();
473f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        inflater.inflate(R.menu.photo, menu);
474f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mShareActionProvider = GalleryActionBar.initializeShareActionProvider(menu);
475cf46a3abc26aac7cdb6b6993aeade053304b71d9Ray Chen        if (mPendingSharePath != null) updateShareURI(mPendingSharePath);
476f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mMenu = menu;
477f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mShowBars = true;
478f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        updateMenuOperations();
479ed46d77c16cd80357f4a0feada2435dfba8104a6Yuli Huang        updateTitle();
480f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        return true;
481f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
482f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
483f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    @Override
484f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    protected boolean onItemSelected(MenuItem item) {
485f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        MediaItem current = mModel.getCurrentMediaItem();
486f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
487f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        if (current == null) {
488f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            // item is not ready, ignore
489f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            return true;
490f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
491f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
492f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        int currentIndex = mModel.getCurrentIndex();
493f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        Path path = current.getPath();
494f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
495f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        DataManager manager = mActivity.getDataManager();
496f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        int action = item.getItemId();
49767098d1a72fd04e2af06d3a5939cde28c65f70d9Ray Chen        boolean needsConfirm = false;
498f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        switch (action) {
49984c220f10a643927c8a2126de8a755d8d7f7ec9eRay Chen            case android.R.id.home: {
500b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang                onUpPressed();
50184c220f10a643927c8a2126de8a755d8d7f7ec9eRay Chen                return true;
50284c220f10a643927c8a2126de8a755d8d7f7ec9eRay Chen            }
503f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            case R.id.action_slideshow: {
504f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                Bundle data = new Bundle();
5056cf807453fb58ccd4cc513ff187b306c7090e67cOwen Lin                data.putString(SlideshowPage.KEY_SET_PATH, mMediaSet.getPath().toString());
506604f053d040782159b61d3b74ee533bc2c0ccdd0Ray Chen                data.putString(SlideshowPage.KEY_ITEM_PATH, path.toString());
507f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                data.putInt(SlideshowPage.KEY_PHOTO_INDEX, currentIndex);
508f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                data.putBoolean(SlideshowPage.KEY_REPEAT, true);
509f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                mActivity.getStateManager().startStateForResult(
510f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                        SlideshowPage.class, REQUEST_SLIDESHOW, data);
511f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                return true;
512f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            }
513f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            case R.id.action_crop: {
514f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                Activity activity = (Activity) mActivity;
515f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                Intent intent = new Intent(CropImage.CROP_ACTION);
516f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                intent.setClass(activity, CropImage.class);
517f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                intent.setData(manager.getContentUri(path));
518f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                activity.startActivityForResult(intent, PicasaSource.isPicasaImage(current)
519f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                        ? REQUEST_CROP_PICASA
520f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                        : REQUEST_CROP);
521f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                return true;
522f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            }
523f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang            case R.id.action_edit: {
524f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang                Intent intent = new Intent(Intent.ACTION_EDIT)
525f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang                        .setData(manager.getContentUri(path))
526f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang                        .setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
527f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang                ((Activity) mActivity).startActivityForResult(Intent.createChooser(intent, null),
528f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang                        REQUEST_EDIT);
529f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang                return true;
530f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang            }
531f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            case R.id.action_details: {
532f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                if (mShowDetails) {
533f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                    hideDetails();
534f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                } else {
535f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                    showDetails(currentIndex);
536f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                }
537f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                return true;
538f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            }
53967098d1a72fd04e2af06d3a5939cde28c65f70d9Ray Chen            case R.id.action_delete:
54067098d1a72fd04e2af06d3a5939cde28c65f70d9Ray Chen                needsConfirm = true;
541f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            case R.id.action_setas:
542f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            case R.id.action_rotate_ccw:
543f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            case R.id.action_rotate_cw:
544f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            case R.id.action_show_on_map:
545f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                mSelectionManager.deSelectAll();
546f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                mSelectionManager.toggle(path);
54767098d1a72fd04e2af06d3a5939cde28c65f70d9Ray Chen                mMenuExecutor.onMenuClicked(item, needsConfirm, null);
548f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                return true;
549f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            case R.id.action_import:
550f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                mSelectionManager.deSelectAll();
551f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                mSelectionManager.toggle(path);
55267098d1a72fd04e2af06d3a5939cde28c65f70d9Ray Chen                mMenuExecutor.onMenuClicked(item, needsConfirm,
553f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                        new ImportCompleteListener(mActivity));
554f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                return true;
555f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            default :
556f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                return false;
557f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
558f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
559f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
560f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private void hideDetails() {
561f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mShowDetails = false;
5624105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen        mDetailsHelper.hide();
563f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
564f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
565f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private void showDetails(int index) {
566f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mShowDetails = true;
5674105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen        if (mDetailsHelper == null) {
5684105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen            mDetailsHelper = new DetailsHelper(mActivity, mRootPane, new MyDetailsSource());
5694105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen            mDetailsHelper.setCloseListener(new CloseListener() {
570f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                public void onClose() {
571f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                    hideDetails();
572f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                }
573f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            });
574f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
5754105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen        mDetailsHelper.reloadDetails(index);
5764105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen        mDetailsHelper.show();
577f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
578f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
579bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    ////////////////////////////////////////////////////////////////////////////
580bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    //  Callbacks from PhotoView
581bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    ////////////////////////////////////////////////////////////////////////////
582bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    @Override
583f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public void onSingleTapUp(int x, int y) {
584bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang        if (mAppBridge != null) {
585bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang            if (mAppBridge.onSingleTapUp(x, y)) return;
586014d9586d8145a33f4e99eaad570587f6d650026Wu-cheng Li        }
587014d9586d8145a33f4e99eaad570587f6d650026Wu-cheng Li
588f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        MediaItem item = mModel.getCurrentMediaItem();
589b5dc542fbaeaf99bebdcf775ef0e034e89e88eaeWu-cheng Li        if (item == null || item == mScreenNailItem) {
590b5dc542fbaeaf99bebdcf775ef0e034e89e88eaeWu-cheng Li            // item is not ready or it is camera preview, ignore
591f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            return;
592f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
593f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
594f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        boolean playVideo =
595f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                (item.getSupportedOperations() & MediaItem.SUPPORT_PLAY) != 0;
596f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
597f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        if (playVideo) {
598f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            // determine if the point is at center (1/6) of the photo view.
599f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            // (The position of the "play" icon is at center (1/6) of the photo)
600f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            int w = mPhotoView.getWidth();
601f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            int h = mPhotoView.getHeight();
602f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            playVideo = (Math.abs(x - w / 2) * 12 <= w)
603f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                && (Math.abs(y - h / 2) * 12 <= h);
604f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
605f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
606f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        if (playVideo) {
607f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            playVideo((Activity) mActivity, item.getPlayUri(), item.getName());
608f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        } else {
609f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            onUserInteractionTap();
610f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
611f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
612f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
613bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    @Override
614bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    public void lockOrientation() {
615bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang        mHandler.sendEmptyMessage(MSG_LOCK_ORIENTATION);
616bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    }
617bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang
618bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    @Override
619bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    public void unlockOrientation() {
620bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang        // Temporarily disabled until Camera UI can switch orientation.
621bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang        // mHandler.sendEmptyMessage(MSG_UNLOCK_ORIENTATION);
622bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    }
623bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang
624bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    @Override
625bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    public void onFullScreenChanged(boolean full) {
626bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang        Message m = mHandler.obtainMessage(
627bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang                MSG_ON_FULL_SCREEN_CHANGED, full ? 1 : 0, 0);
628bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang        m.sendToTarget();
629bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    }
630bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang
631f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public static void playVideo(Activity activity, Uri uri, String title) {
632f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        try {
633f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            Intent intent = new Intent(Intent.ACTION_VIEW)
634f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                    .setDataAndType(uri, "video/*");
635f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            intent.putExtra(Intent.EXTRA_TITLE, title);
636f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            activity.startActivity(intent);
637f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        } catch (ActivityNotFoundException e) {
638f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            Toast.makeText(activity, activity.getString(R.string.video_err),
639f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                    Toast.LENGTH_SHORT).show();
640f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
641f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
642f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
643f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang    private void setCurrentPhotoByIntent(Intent intent) {
644f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang        if (intent == null) return;
645f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang        Path path = mApplication.getDataManager()
646f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang                .findPathByUri(intent.getData(), intent.getType());
647f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang        if (path != null) {
648f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang            mModel.setCurrentPhoto(path, mCurrentIndex);
649f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang        }
650f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang    }
651f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang
652f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    @Override
653f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    protected void onStateResult(int requestCode, int resultCode, Intent data) {
654f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        switch (requestCode) {
655f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang            case REQUEST_EDIT:
656f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang                setCurrentPhotoByIntent(data);
657f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang                break;
658f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            case REQUEST_CROP:
659f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                if (resultCode == Activity.RESULT_OK) {
660f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang                    setCurrentPhotoByIntent(data);
661f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                }
662f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                break;
663f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            case REQUEST_CROP_PICASA: {
664f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang                if (resultCode == Activity.RESULT_OK) {
665f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang                    Context context = mActivity.getAndroidContext();
666f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang                    // TODO: Use crop_saved instead of photo_saved after its new translation is done.
667f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang                    String message = context.getString(R.string.photo_saved,
668f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang                            context.getString(R.string.folder_download));
669f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang                    Toast.makeText(context, message, Toast.LENGTH_SHORT).show();
670f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang                }
671f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                break;
672f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            }
673f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            case REQUEST_SLIDESHOW: {
674f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                if (data == null) break;
675f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                String path = data.getStringExtra(SlideshowPage.KEY_ITEM_PATH);
676f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                int index = data.getIntExtra(SlideshowPage.KEY_PHOTO_INDEX, 0);
677f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                if (path != null) {
678f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                    mModel.setCurrentPhoto(Path.fromString(path), index);
679f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                }
680f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            }
681f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
682f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
683f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
684f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    @Override
685f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public void onPause() {
686f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        super.onPause();
687f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mIsActive = false;
688bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang        if (mAppBridge != null) mAppBridge.setServer(null);
6894105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen        DetailsHelper.pause();
690f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mPhotoView.pause();
691f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mModel.pause();
692f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mHandler.removeMessages(MSG_HIDE_BARS);
693f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mActionBar.removeOnMenuVisibilityListener(mMenuVisibilityListener);
69433ef03776b7734717b16f6fc861b831fb1b1dfacMartijn Coenen
6952785956f8f5654966a41e20f482f4af3057eea3fChih-Chung Chang        mMenuExecutor.pause();
696f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
697f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
698f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    @Override
699f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    protected void onResume() {
700f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        super.onResume();
701f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mIsActive = true;
702f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        setContentPane(mRootPane);
70304ac045bf8da5082bbb0bdc9ea5f9c9b5b796ad0Yuli Huang
704f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mModel.resume();
705f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mPhotoView.resume();
706f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        if (mMenuVisibilityListener == null) {
707f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            mMenuVisibilityListener = new MyMenuVisibilityListener();
708f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
7098cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen        mActionBar.setDisplayOptions(mSetPathString != null, true);
710f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mActionBar.addOnMenuVisibilityListener(mMenuVisibilityListener);
71133ef03776b7734717b16f6fc861b831fb1b1dfacMartijn Coenen
712f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        onUserInteraction();
713bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang        if (mAppBridge != null) {
714bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang            mAppBridge.setServer(this);
71533f8567dd5003e4bb342683f3768ab7552648b02Chih-Chung Chang            mPhotoView.resetToFirstPicture();
716bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang        }
717f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
718f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
71915b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang    @Override
72015b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang    protected void onDestroy() {
721bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang        if (mAppBridge != null) {
722bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang            // Unregister the ScreenNail and notify mAppBridge.
723b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang            SnailSource.unregisterScreenNail(mScreenNail);
724bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang            mAppBridge.detachScreenNail();
725bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang            mAppBridge = null;
726b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang            mScreenNail = null;
727b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang        }
728bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang        mOrientationManager.removeListener(this);
72915b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang        super.onDestroy();
73015b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang    }
73115b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang
732f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private class MyDetailsSource implements DetailsSource {
7334105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen        private int mIndex;
7346cf807453fb58ccd4cc513ff187b306c7090e67cOwen Lin
7356cf807453fb58ccd4cc513ff187b306c7090e67cOwen Lin        @Override
736f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        public MediaDetails getDetails() {
737f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            return mModel.getCurrentMediaItem().getDetails();
738f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
7396cf807453fb58ccd4cc513ff187b306c7090e67cOwen Lin
7406cf807453fb58ccd4cc513ff187b306c7090e67cOwen Lin        @Override
741f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        public int size() {
742f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            return mMediaSet != null ? mMediaSet.getMediaItemCount() : 1;
743f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
7446cf807453fb58ccd4cc513ff187b306c7090e67cOwen Lin
7456cf807453fb58ccd4cc513ff187b306c7090e67cOwen Lin        @Override
746f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        public int findIndex(int indexHint) {
7474105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen            mIndex = indexHint;
748f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            return indexHint;
749f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
7504105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen
7516cf807453fb58ccd4cc513ff187b306c7090e67cOwen Lin        @Override
7524105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen        public int getIndex() {
7534105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen            return mIndex;
7544105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen        }
755f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
756f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin}
757