PhotoPage.java revision bd7c016d728853d38f98a3c6077b7bd9b08858b9
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;
2266ca848b2f58b813d366642088d274a1b7c4a90cChih-Chung Changimport android.content.ContentResolver;
23604f053d040782159b61d3b74ee533bc2c0ccdd0Ray Chenimport android.content.Context;
24604f053d040782159b61d3b74ee533bc2c0ccdd0Ray Chenimport android.content.Intent;
2504ac045bf8da5082bbb0bdc9ea5f9c9b5b796ad0Yuli Huangimport android.graphics.Rect;
26604f053d040782159b61d3b74ee533bc2c0ccdd0Ray Chenimport android.net.Uri;
2733ef03776b7734717b16f6fc861b831fb1b1dfacMartijn Coenenimport android.nfc.NfcAdapter;
28604f053d040782159b61d3b74ee533bc2c0ccdd0Ray Chenimport android.os.Bundle;
29604f053d040782159b61d3b74ee533bc2c0ccdd0Ray Chenimport android.os.Handler;
30604f053d040782159b61d3b74ee533bc2c0ccdd0Ray Chenimport android.os.Message;
31604f053d040782159b61d3b74ee533bc2c0ccdd0Ray Chenimport android.view.Menu;
32604f053d040782159b61d3b74ee533bc2c0ccdd0Ray Chenimport android.view.MenuInflater;
33604f053d040782159b61d3b74ee533bc2c0ccdd0Ray Chenimport android.view.MenuItem;
34604f053d040782159b61d3b74ee533bc2c0ccdd0Ray Chenimport android.view.View;
358bc5bebba780ca4a322b466b06fc909331697cf4Owen Linimport android.view.WindowManager;
36604f053d040782159b61d3b74ee533bc2c0ccdd0Ray Chenimport android.widget.ShareActionProvider;
37604f053d040782159b61d3b74ee533bc2c0ccdd0Ray Chenimport android.widget.Toast;
38604f053d040782159b61d3b74ee533bc2c0ccdd0Ray Chen
39f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.R;
40f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.data.DataManager;
41f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.data.MediaDetails;
42f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.data.MediaItem;
43f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.data.MediaObject;
44f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.data.MediaSet;
45f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.data.MtpDevice;
46f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.data.Path;
473b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Changimport com.android.gallery3d.data.SnailAlbum;
483b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Changimport com.android.gallery3d.data.SnailItem;
4915b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Changimport com.android.gallery3d.data.SnailSource;
50f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.picasasource.PicasaSource;
514105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chenimport com.android.gallery3d.ui.DetailsHelper;
524105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chenimport com.android.gallery3d.ui.DetailsHelper.CloseListener;
534105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chenimport com.android.gallery3d.ui.DetailsHelper.DetailsSource;
54f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.ui.GLCanvas;
55f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.ui.GLView;
56f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.ui.ImportCompleteListener;
57f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.ui.MenuExecutor;
5821a412c93c9b0401b039f4eb86d4950752e5bb84Owen Linimport com.android.gallery3d.ui.PhotoView;
59b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Changimport com.android.gallery3d.ui.ScreenNail;
60f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.ui.SelectionManager;
61f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.ui.SynchronizedHandler;
62f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.util.GalleryUtils;
6366ca848b2f58b813d366642088d274a1b7c4a90cChih-Chung Changimport com.android.gallery3d.util.MediaSetUtils;
64f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
65bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Changpublic class PhotoPage extends ActivityState implements
6661f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang        PhotoView.Listener, OrientationManager.Listener, AppBridge.Server {
67f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private static final String TAG = "PhotoPage";
68f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
69f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private static final int MSG_HIDE_BARS = 1;
70bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    private static final int MSG_LOCK_ORIENTATION = 2;
71bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    private static final int MSG_UNLOCK_ORIENTATION = 3;
72bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    private static final int MSG_ON_FULL_SCREEN_CHANGED = 4;
7361f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang    private static final int MSG_UPDATE_ACTION_BAR = 5;
74bd7c016d728853d38f98a3c6077b7bd9b08858b9Yuli Huang    private static final int MSG_UNFREEZE_GLROOT = 6;
756cf807453fb58ccd4cc513ff187b306c7090e67cOwen Lin
76f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private static final int HIDE_BARS_TIMEOUT = 3500;
77bd7c016d728853d38f98a3c6077b7bd9b08858b9Yuli Huang    private static final int UNFREEZE_GLROOT_TIMEOUT = 250;
78f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
79f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private static final int REQUEST_SLIDESHOW = 1;
80f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private static final int REQUEST_CROP = 2;
81f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private static final int REQUEST_CROP_PICASA = 3;
82f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang    private static final int REQUEST_EDIT = 4;
83f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
84f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public static final String KEY_MEDIA_SET_PATH = "media-set-path";
85f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public static final String KEY_MEDIA_ITEM_PATH = "media-item-path";
86f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public static final String KEY_INDEX_HINT = "index-hint";
8704ac045bf8da5082bbb0bdc9ea5f9c9b5b796ad0Yuli Huang    public static final String KEY_OPEN_ANIMATION_RECT = "open-animation-rect";
88bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    public static final String KEY_APP_BRIDGE = "app-bridge";
89bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang
90bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    public static final String KEY_RETURN_INDEX_HINT = "return-index-hint";
91f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
92f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private GalleryApp mApplication;
93f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private SelectionManager mSelectionManager;
94f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
95f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private PhotoView mPhotoView;
96f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private PhotoPage.Model mModel;
974105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen    private DetailsHelper mDetailsHelper;
98f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private boolean mShowDetails;
99cf46a3abc26aac7cdb6b6993aeade053304b71d9Ray Chen    private Path mPendingSharePath;
100f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
101f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    // mMediaSet could be null if there is no KEY_MEDIA_SET_PATH supplied.
102f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    // E.g., viewing a photo in gmail attachment
103f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private MediaSet mMediaSet;
104f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private Menu mMenu;
105f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
106f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private int mCurrentIndex = 0;
107f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private Handler mHandler;
108113bfc77c4468411da9ae1290553c3be89f8df9aOwen Lin    private boolean mShowBars = true;
109aeb3062e84ed28f0e25a73f511f287ae0a3e4294Chih-Chung Chang    // The value of canShowBars() last time the bar updates state.
110aeb3062e84ed28f0e25a73f511f287ae0a3e4294Chih-Chung Chang    private boolean mCanShowBars = false;
11161f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang    private volatile boolean mActionBarAllowed = true;
1128cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen    private GalleryActionBar mActionBar;
113f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private MyMenuVisibilityListener mMenuVisibilityListener;
114f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private boolean mIsMenuVisible;
115f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private MediaItem mCurrentPhoto = null;
116f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private MenuExecutor mMenuExecutor;
117f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private boolean mIsActive;
118f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private ShareActionProvider mShareActionProvider;
11984c220f10a643927c8a2126de8a755d8d7f7ec9eRay Chen    private String mSetPathString;
120b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang    // This is the original mSetPathString before adding the camera preview item.
121b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang    private String mOriginalSetPathString;
122bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    private AppBridge mAppBridge;
1233b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang    private SnailItem mScreenNailItem;
1243b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang    private SnailAlbum mScreenNailSet;
125bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    private OrientationManager mOrientationManager;
12615b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang
12733ef03776b7734717b16f6fc861b831fb1b1dfacMartijn Coenen    private NfcAdapter mNfcAdapter;
12833ef03776b7734717b16f6fc861b831fb1b1dfacMartijn Coenen
129f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public static interface Model extends PhotoView.Model {
130f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        public void resume();
131f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        public void pause();
132f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        public boolean isEmpty();
133f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        public MediaItem getCurrentMediaItem();
134f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        public void setCurrentPhoto(Path path, int indexHint);
135f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
136f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
137f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private class MyMenuVisibilityListener implements OnMenuVisibilityListener {
13806c6401eededc2ec842ba4994a838c2ded0a666cPin Ting        @Override
139f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        public void onMenuVisibilityChanged(boolean isVisible) {
140f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            mIsMenuVisible = isVisible;
141f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            refreshHidingMessage();
142f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
143f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
144f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
145604f053d040782159b61d3b74ee533bc2c0ccdd0Ray Chen    private final GLView mRootPane = new GLView() {
146f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
147f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        @Override
148f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        protected void renderBackground(GLCanvas view) {
149f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            view.clearBuffer();
150f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
151f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
152f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        @Override
153f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        protected void onLayout(
154f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                boolean changed, int left, int top, int right, int bottom) {
155f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            mPhotoView.layout(0, 0, right - left, bottom - top);
156f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            if (mShowDetails) {
1578cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen                mDetailsHelper.layout(left, mActionBar.getHeight(), right, bottom);
158f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            }
159f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
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);
1742ef46ed28b28b355d7f3f1432c7b1196b832a859Chih-Chung Chang        mActivity.getGLRoot().setOrientationSource(mOrientationManager);
175f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
17684c220f10a643927c8a2126de8a755d8d7f7ec9eRay Chen        mSetPathString = data.getString(KEY_MEDIA_SET_PATH);
177b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang        mOriginalSetPathString = mSetPathString;
17833ef03776b7734717b16f6fc861b831fb1b1dfacMartijn Coenen        mNfcAdapter = NfcAdapter.getDefaultAdapter(mActivity.getAndroidContext());
179f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        Path itemPath = Path.fromString(data.getString(KEY_MEDIA_ITEM_PATH));
180f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
18184c220f10a643927c8a2126de8a755d8d7f7ec9eRay Chen        if (mSetPathString != null) {
182bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang            mAppBridge = (AppBridge) data.getParcelable(KEY_APP_BRIDGE);
183bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang            if (mAppBridge != null) {
184bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang                mOrientationManager.lockOrientation();
185b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang
186bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang                // Get the ScreenNail from AppBridge and register it.
1873b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang                int id = SnailSource.newId();
188b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang                Path screenNailSetPath = SnailSource.getSetPath(id);
189bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang                Path screenNailItemPath = SnailSource.getItemPath(id);
1903b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang                mScreenNailSet = (SnailAlbum) mActivity.getDataManager()
1913b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang                        .getMediaObject(screenNailSetPath);
1923b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang                mScreenNailItem = (SnailItem) mActivity.getDataManager()
193bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang                        .getMediaObject(screenNailItemPath);
1943b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang                mScreenNailItem.setScreenNail(mAppBridge.attachScreenNail());
195b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang
1963b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang                // Combine the original MediaSet with the one for ScreenNail
1973b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang                // from AppBridge.
198b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang                mSetPathString = "/combo/item/{" + screenNailSetPath +
199b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang                        "," + mSetPathString + "}";
200b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang
201b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang                // Start from the screen nail.
202bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang                itemPath = screenNailItemPath;
203788245711658188131ae2670e44fb6ca8ad5d53aWu-cheng Li
204788245711658188131ae2670e44fb6ca8ad5d53aWu-cheng Li                // Action bar should not be displayed when camera starts.
205788245711658188131ae2670e44fb6ca8ad5d53aWu-cheng Li                mFlags |= FLAG_HIDE_ACTION_BAR;
20661f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang                mShowBars = false;
207b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang            }
208b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang
20984c220f10a643927c8a2126de8a755d8d7f7ec9eRay Chen            mMediaSet = mActivity.getDataManager().getMediaSet(mSetPathString);
210f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            mCurrentIndex = data.getInt(KEY_INDEX_HINT, 0);
211f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            if (mMediaSet == null) {
21284c220f10a643927c8a2126de8a755d8d7f7ec9eRay Chen                Log.w(TAG, "failed to restore " + mSetPathString);
213f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            }
214f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            PhotoDataAdapter pda = new PhotoDataAdapter(
215bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang                    mActivity, mPhotoView, mMediaSet, itemPath, mCurrentIndex,
216bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang                    mAppBridge == null ? -1 : 0);
217f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            mModel = pda;
218f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            mPhotoView.setModel(mModel);
219f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
220f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            pda.setDataListener(new PhotoDataAdapter.DataListener() {
221f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
222113bfc77c4468411da9ae1290553c3be89f8df9aOwen Lin                @Override
223f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                public void onPhotoChanged(int index, Path item) {
224f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                    mCurrentIndex = index;
225f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                    if (item != null) {
226f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                        MediaItem photo = mModel.getCurrentMediaItem();
227f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                        if (photo != null) updateCurrentPhoto(photo);
228f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                    }
22961f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang                    updateBars();
230f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                }
231f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
232f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                @Override
233f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                public void onLoadingFinished() {
234f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                    if (!mModel.isEmpty()) {
235f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                        MediaItem photo = mModel.getCurrentMediaItem();
236f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                        if (photo != null) updateCurrentPhoto(photo);
237f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                    } else if (mIsActive) {
238f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                        mActivity.getStateManager().finishState(PhotoPage.this);
239f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                    }
240f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                }
241f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
242f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                @Override
243f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                public void onLoadingStarted() {
244f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                }
245f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            });
246f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        } else {
247f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            // Get default media set by the URI
248f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            MediaItem mediaItem = (MediaItem)
249f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                    mActivity.getDataManager().getMediaObject(itemPath);
250f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            mModel = new SinglePhotoDataAdapter(mActivity, mPhotoView, mediaItem);
251f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            mPhotoView.setModel(mModel);
252f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            updateCurrentPhoto(mediaItem);
253f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
254cf46a3abc26aac7cdb6b6993aeade053304b71d9Ray Chen
255f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mHandler = new SynchronizedHandler(mActivity.getGLRoot()) {
256f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            @Override
257f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            public void handleMessage(Message message) {
258f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                switch (message.what) {
259f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                    case MSG_HIDE_BARS: {
260f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                        hideBars();
261f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                        break;
262f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                    }
263bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang                    case MSG_LOCK_ORIENTATION: {
264bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang                        mOrientationManager.lockOrientation();
265aeb3062e84ed28f0e25a73f511f287ae0a3e4294Chih-Chung Chang                        updateBars();
266bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang                        break;
267bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang                    }
268bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang                    case MSG_UNLOCK_ORIENTATION: {
269bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang                        mOrientationManager.unlockOrientation();
270aeb3062e84ed28f0e25a73f511f287ae0a3e4294Chih-Chung Chang                        updateBars();
271bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang                        break;
272bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang                    }
273bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang                    case MSG_ON_FULL_SCREEN_CHANGED: {
274bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang                        mAppBridge.onFullScreenChanged(message.arg1 == 1);
275bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang                        break;
276bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang                    }
27761f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang                    case MSG_UPDATE_ACTION_BAR: {
27861f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang                        updateBars();
27961f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang                        break;
28061f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang                    }
281bd7c016d728853d38f98a3c6077b7bd9b08858b9Yuli Huang                    case MSG_UNFREEZE_GLROOT: {
282bd7c016d728853d38f98a3c6077b7bd9b08858b9Yuli Huang                        mActivity.getGLRoot().unfreeze();
283bd7c016d728853d38f98a3c6077b7bd9b08858b9Yuli Huang                        break;
284bd7c016d728853d38f98a3c6077b7bd9b08858b9Yuli Huang                    }
285f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                    default: throw new AssertionError(message.what);
286f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                }
287f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            }
288f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        };
289f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
29004ac045bf8da5082bbb0bdc9ea5f9c9b5b796ad0Yuli Huang        // start the opening animation only if it's not restored.
29104ac045bf8da5082bbb0bdc9ea5f9c9b5b796ad0Yuli Huang        if (restoreState == null) {
29204ac045bf8da5082bbb0bdc9ea5f9c9b5b796ad0Yuli Huang            mPhotoView.setOpenAnimationRect((Rect) data.getParcelable(KEY_OPEN_ANIMATION_RECT));
29304ac045bf8da5082bbb0bdc9ea5f9c9b5b796ad0Yuli Huang        }
294f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
295f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
296cf46a3abc26aac7cdb6b6993aeade053304b71d9Ray Chen    private void updateShareURI(Path path) {
297cf46a3abc26aac7cdb6b6993aeade053304b71d9Ray Chen        if (mShareActionProvider != null) {
298cf46a3abc26aac7cdb6b6993aeade053304b71d9Ray Chen            DataManager manager = mActivity.getDataManager();
299cf46a3abc26aac7cdb6b6993aeade053304b71d9Ray Chen            int type = manager.getMediaType(path);
300cf46a3abc26aac7cdb6b6993aeade053304b71d9Ray Chen            Intent intent = new Intent(Intent.ACTION_SEND);
301cf46a3abc26aac7cdb6b6993aeade053304b71d9Ray Chen            intent.setType(MenuExecutor.getMimeType(type));
302cf46a3abc26aac7cdb6b6993aeade053304b71d9Ray Chen            intent.putExtra(Intent.EXTRA_STREAM, manager.getContentUri(path));
303cf46a3abc26aac7cdb6b6993aeade053304b71d9Ray Chen            mShareActionProvider.setShareIntent(intent);
30433ef03776b7734717b16f6fc861b831fb1b1dfacMartijn Coenen            if (mNfcAdapter != null) {
305a41ed05ff2f71d2177b4f24f53acd848b46fc840Martijn Coenen                mNfcAdapter.setBeamPushUris(new Uri[]{manager.getContentUri(path)},
306a41ed05ff2f71d2177b4f24f53acd848b46fc840Martijn Coenen                        (Activity)mActivity);
30733ef03776b7734717b16f6fc861b831fb1b1dfacMartijn Coenen            }
308cf46a3abc26aac7cdb6b6993aeade053304b71d9Ray Chen            mPendingSharePath = null;
309cf46a3abc26aac7cdb6b6993aeade053304b71d9Ray Chen        } else {
310cf46a3abc26aac7cdb6b6993aeade053304b71d9Ray Chen            // This happens when ActionBar is not created yet.
311cf46a3abc26aac7cdb6b6993aeade053304b71d9Ray Chen            mPendingSharePath = path;
312cf46a3abc26aac7cdb6b6993aeade053304b71d9Ray Chen        }
313cf46a3abc26aac7cdb6b6993aeade053304b71d9Ray Chen    }
314cf46a3abc26aac7cdb6b6993aeade053304b71d9Ray Chen
315f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private void updateCurrentPhoto(MediaItem photo) {
316f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        if (mCurrentPhoto == photo) return;
317f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mCurrentPhoto = photo;
318f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        if (mCurrentPhoto == null) return;
319f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        updateMenuOperations();
320ed46d77c16cd80357f4a0feada2435dfba8104a6Yuli Huang        updateTitle();
321f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        if (mShowDetails) {
3224105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen            mDetailsHelper.reloadDetails(mModel.getCurrentIndex());
323f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
32415b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang        if ((photo.getSupportedOperations() & MediaItem.SUPPORT_SHARE) != 0) {
32515b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang            updateShareURI(photo.getPath());
32615b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang        }
327f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
328f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
329ed46d77c16cd80357f4a0feada2435dfba8104a6Yuli Huang    private void updateTitle() {
330ed46d77c16cd80357f4a0feada2435dfba8104a6Yuli Huang        if (mCurrentPhoto == null) return;
331ed46d77c16cd80357f4a0feada2435dfba8104a6Yuli Huang        boolean showTitle = mActivity.getAndroidContext().getResources().getBoolean(
332ed46d77c16cd80357f4a0feada2435dfba8104a6Yuli Huang                R.bool.show_action_bar_title);
333ed46d77c16cd80357f4a0feada2435dfba8104a6Yuli Huang        if (showTitle && mCurrentPhoto.getName() != null)
334ed46d77c16cd80357f4a0feada2435dfba8104a6Yuli Huang            mActionBar.setTitle(mCurrentPhoto.getName());
335ed46d77c16cd80357f4a0feada2435dfba8104a6Yuli Huang        else
336ed46d77c16cd80357f4a0feada2435dfba8104a6Yuli Huang            mActionBar.setTitle("");
337ed46d77c16cd80357f4a0feada2435dfba8104a6Yuli Huang    }
338ed46d77c16cd80357f4a0feada2435dfba8104a6Yuli Huang
339f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private void updateMenuOperations() {
3402066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang        if (mMenu == null) return;
3412066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang        MenuItem item = mMenu.findItem(R.id.action_slideshow);
3422066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang        if (item != null) {
3432066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang            item.setVisible(canDoSlideShow());
3442066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang        }
3452066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang        if (mCurrentPhoto == null) return;
346f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        int supportedOperations = mCurrentPhoto.getSupportedOperations();
347f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        if (!GalleryUtils.isEditorAvailable((Context) mActivity, "image/*")) {
348f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            supportedOperations &= ~MediaObject.SUPPORT_EDIT;
349f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
350604f053d040782159b61d3b74ee533bc2c0ccdd0Ray Chen
351f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        MenuExecutor.updateMenuOperation(mMenu, supportedOperations);
352f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
353f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
3542066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang    private boolean canDoSlideShow() {
3552066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang        if (mMediaSet == null || mCurrentPhoto == null) {
3562066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang            return false;
3572066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang        }
3582066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang        if (mCurrentPhoto.getMediaType() != MediaObject.MEDIA_TYPE_IMAGE) {
3592066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang            return false;
3602066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang        }
3612066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang        if (mMediaSet instanceof MtpDevice) {
3622066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang            return false;
3632066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang        }
3642066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang        return true;
3652066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang    }
3662066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang
36761f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang    //////////////////////////////////////////////////////////////////////////
36861f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang    //  Action Bar show/hide management
36961f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang    //////////////////////////////////////////////////////////////////////////
37061f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang
371f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private void showBars() {
372f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        if (mShowBars) return;
373f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mShowBars = true;
374f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mActionBar.show();
37561f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang        WindowManager.LayoutParams params =
37661f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang                ((Activity) mActivity).getWindow().getAttributes();
377f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        params.systemUiVisibility = View.SYSTEM_UI_FLAG_VISIBLE;
378f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        ((Activity) mActivity).getWindow().setAttributes(params);
37961f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang        refreshHidingMessage();
380f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
381f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
382f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private void hideBars() {
383f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        if (!mShowBars) return;
384f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mShowBars = false;
385f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mActionBar.hide();
38661f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang        WindowManager.LayoutParams params =
38761f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang                ((Activity) mActivity).getWindow().getAttributes();
388aeb3062e84ed28f0e25a73f511f287ae0a3e4294Chih-Chung Chang        params.systemUiVisibility = View.SYSTEM_UI_FLAG_LOW_PROFILE;
389f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        ((Activity) mActivity).getWindow().setAttributes(params);
39061f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang        mHandler.removeMessages(MSG_HIDE_BARS);
391f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
392f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
393f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private void refreshHidingMessage() {
394f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mHandler.removeMessages(MSG_HIDE_BARS);
39561f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang        if (!mIsMenuVisible) {
396f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            mHandler.sendEmptyMessageDelayed(MSG_HIDE_BARS, HIDE_BARS_TIMEOUT);
397f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
398f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
399f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
400aeb3062e84ed28f0e25a73f511f287ae0a3e4294Chih-Chung Chang    private boolean canShowBars() {
401aeb3062e84ed28f0e25a73f511f287ae0a3e4294Chih-Chung Chang        // No bars if we are showing camera preview.
402aeb3062e84ed28f0e25a73f511f287ae0a3e4294Chih-Chung Chang        if (mAppBridge != null && mCurrentIndex == 0) return false;
403aeb3062e84ed28f0e25a73f511f287ae0a3e4294Chih-Chung Chang        // No bars if it's not allowed.
404aeb3062e84ed28f0e25a73f511f287ae0a3e4294Chih-Chung Chang        if (!mActionBarAllowed) return false;
405aeb3062e84ed28f0e25a73f511f287ae0a3e4294Chih-Chung Chang        // No bars if the orientation is locked.
406aeb3062e84ed28f0e25a73f511f287ae0a3e4294Chih-Chung Chang        if (mOrientationManager.isOrientationLocked()) return false;
407aeb3062e84ed28f0e25a73f511f287ae0a3e4294Chih-Chung Chang
408aeb3062e84ed28f0e25a73f511f287ae0a3e4294Chih-Chung Chang        return true;
409aeb3062e84ed28f0e25a73f511f287ae0a3e4294Chih-Chung Chang    }
410aeb3062e84ed28f0e25a73f511f287ae0a3e4294Chih-Chung Chang
41161f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang    private void toggleBars() {
412aeb3062e84ed28f0e25a73f511f287ae0a3e4294Chih-Chung Chang        mCanShowBars = canShowBars();
413f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        if (mShowBars) {
414f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            hideBars();
415aeb3062e84ed28f0e25a73f511f287ae0a3e4294Chih-Chung Chang        } else {
416aeb3062e84ed28f0e25a73f511f287ae0a3e4294Chih-Chung Chang            if (mCanShowBars) showBars();
417f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
418f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
419f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
42061f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang    private void updateBars() {
421aeb3062e84ed28f0e25a73f511f287ae0a3e4294Chih-Chung Chang        boolean v = canShowBars();
422aeb3062e84ed28f0e25a73f511f287ae0a3e4294Chih-Chung Chang        if (mCanShowBars == v) return;
423aeb3062e84ed28f0e25a73f511f287ae0a3e4294Chih-Chung Chang        mCanShowBars = v;
424aeb3062e84ed28f0e25a73f511f287ae0a3e4294Chih-Chung Chang
425aeb3062e84ed28f0e25a73f511f287ae0a3e4294Chih-Chung Chang        if (mCanShowBars) {
42661f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang            showBars();
42761f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang        } else {
42861f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang            hideBars();
42961f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang        }
430f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
431f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
432f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    @Override
4332ef46ed28b28b355d7f3f1432c7b1196b832a859Chih-Chung Chang    public void onOrientationCompensationChanged() {
4342ef46ed28b28b355d7f3f1432c7b1196b832a859Chih-Chung Chang        mActivity.getGLRoot().requestLayoutContentPane();
435bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    }
436bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang
437bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    @Override
438f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    protected void onBackPressed() {
439f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        if (mShowDetails) {
440f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            hideDetails();
4413b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang        } else if (mAppBridge == null || !switchWithCaptureAnimation(-1)) {
442bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang            // We are leaving this page. Set the result now.
443bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang            setResult();
444f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            super.onBackPressed();
445f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
446f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
447f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
448b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang    private void onUpPressed() {
449b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang        if (mActivity.getStateManager().getStateCount() > 1) {
450b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang            super.onBackPressed();
451ba12eae90b5b1a80ee002aa0df8c5c5189c4faa3Chih-Chung Chang            return;
45266ca848b2f58b813d366642088d274a1b7c4a90cChih-Chung Chang        }
45366ca848b2f58b813d366642088d274a1b7c4a90cChih-Chung Chang
45466ca848b2f58b813d366642088d274a1b7c4a90cChih-Chung Chang        if (mOriginalSetPathString == null) return;
45566ca848b2f58b813d366642088d274a1b7c4a90cChih-Chung Chang
45666ca848b2f58b813d366642088d274a1b7c4a90cChih-Chung Chang        if (mAppBridge == null) {
457b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang            // We're in view mode so set up the stacks on our own.
458b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang            Bundle data = new Bundle(getData());
459b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang            data.putString(AlbumPage.KEY_MEDIA_PATH, mOriginalSetPathString);
460b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang            data.putString(AlbumPage.KEY_PARENT_MEDIA_PATH,
461b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang                    mActivity.getDataManager().getTopSetPath(
462b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang                            DataManager.INCLUDE_ALL));
463b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang            mActivity.getStateManager().switchState(this, AlbumPage.class, data);
46466ca848b2f58b813d366642088d274a1b7c4a90cChih-Chung Chang        } else {
46566ca848b2f58b813d366642088d274a1b7c4a90cChih-Chung Chang            // Start the real gallery activity to view the camera roll.
46666ca848b2f58b813d366642088d274a1b7c4a90cChih-Chung Chang            Uri uri = Uri.parse("content://media/external/file?bucketId="
46766ca848b2f58b813d366642088d274a1b7c4a90cChih-Chung Chang                    + MediaSetUtils.CAMERA_BUCKET_ID);
46866ca848b2f58b813d366642088d274a1b7c4a90cChih-Chung Chang            Intent intent = new Intent(Intent.ACTION_VIEW);
46966ca848b2f58b813d366642088d274a1b7c4a90cChih-Chung Chang            intent.setDataAndType(uri, ContentResolver.CURSOR_DIR_BASE_TYPE + "/image");
47066ca848b2f58b813d366642088d274a1b7c4a90cChih-Chung Chang            ((Activity) mActivity).startActivity(intent);
471b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang        }
472b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang    }
473b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang
474bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    private void setResult() {
475bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang        Intent result = null;
476bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang        if (!mPhotoView.getFilmMode()) {
477bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang            result = new Intent();
478bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang            result.putExtra(KEY_RETURN_INDEX_HINT, mCurrentIndex);
479bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang        }
480bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang        setStateResult(Activity.RESULT_OK, result);
481bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    }
482bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang
483bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    //////////////////////////////////////////////////////////////////////////
484bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    //  AppBridge.Server interface
485bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    //////////////////////////////////////////////////////////////////////////
486bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang
487bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    @Override
4882ef46ed28b28b355d7f3f1432c7b1196b832a859Chih-Chung Chang    public void setCameraRelativeFrame(Rect frame) {
4892ef46ed28b28b355d7f3f1432c7b1196b832a859Chih-Chung Chang        mPhotoView.setCameraRelativeFrame(frame);
490bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    }
491bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang
492bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    @Override
4932c6173822a612597c79be41b126367ddfbb5d518Chih-Chung Chang    public boolean switchWithCaptureAnimation(int offset) {
4942c6173822a612597c79be41b126367ddfbb5d518Chih-Chung Chang        return mPhotoView.switchWithCaptureAnimation(offset);
4952c6173822a612597c79be41b126367ddfbb5d518Chih-Chung Chang    }
4962c6173822a612597c79be41b126367ddfbb5d518Chih-Chung Chang
497f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    @Override
4986575794a9c09f22d5721e212c093e0a2df376d0cChih-Chung Chang    public void setSwipingEnabled(boolean enabled) {
4996575794a9c09f22d5721e212c093e0a2df376d0cChih-Chung Chang        mPhotoView.setSwipingEnabled(enabled);
5006575794a9c09f22d5721e212c093e0a2df376d0cChih-Chung Chang    }
5016575794a9c09f22d5721e212c093e0a2df376d0cChih-Chung Chang
5026575794a9c09f22d5721e212c093e0a2df376d0cChih-Chung Chang    @Override
5033b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang    public void notifyScreenNailChanged() {
5043b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang        mScreenNailItem.setScreenNail(mAppBridge.attachScreenNail());
5053b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang        mScreenNailSet.notifyChange();
5063b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang    }
5073b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang
5083b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang    @Override
509f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    protected boolean onCreateActionBar(Menu menu) {
510f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        MenuInflater inflater = ((Activity) mActivity).getMenuInflater();
511f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        inflater.inflate(R.menu.photo, menu);
512f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mShareActionProvider = GalleryActionBar.initializeShareActionProvider(menu);
513cf46a3abc26aac7cdb6b6993aeade053304b71d9Ray Chen        if (mPendingSharePath != null) updateShareURI(mPendingSharePath);
514f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mMenu = menu;
515f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        updateMenuOperations();
516ed46d77c16cd80357f4a0feada2435dfba8104a6Yuli Huang        updateTitle();
517f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        return true;
518f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
519f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
520f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    @Override
521f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    protected boolean onItemSelected(MenuItem item) {
522f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        MediaItem current = mModel.getCurrentMediaItem();
523f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
524f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        if (current == null) {
525f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            // item is not ready, ignore
526f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            return true;
527f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
528f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
529f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        int currentIndex = mModel.getCurrentIndex();
530f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        Path path = current.getPath();
531f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
532f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        DataManager manager = mActivity.getDataManager();
533f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        int action = item.getItemId();
5349a033b07b8e0d9fe7419b7a0d876e9c7febf43c8Ray Chen        String confirmMsg = null;
535f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        switch (action) {
53684c220f10a643927c8a2126de8a755d8d7f7ec9eRay Chen            case android.R.id.home: {
537b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang                onUpPressed();
53884c220f10a643927c8a2126de8a755d8d7f7ec9eRay Chen                return true;
53984c220f10a643927c8a2126de8a755d8d7f7ec9eRay Chen            }
540f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            case R.id.action_slideshow: {
541f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                Bundle data = new Bundle();
5426cf807453fb58ccd4cc513ff187b306c7090e67cOwen Lin                data.putString(SlideshowPage.KEY_SET_PATH, mMediaSet.getPath().toString());
543604f053d040782159b61d3b74ee533bc2c0ccdd0Ray Chen                data.putString(SlideshowPage.KEY_ITEM_PATH, path.toString());
544f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                data.putInt(SlideshowPage.KEY_PHOTO_INDEX, currentIndex);
545f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                data.putBoolean(SlideshowPage.KEY_REPEAT, true);
546f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                mActivity.getStateManager().startStateForResult(
547f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                        SlideshowPage.class, REQUEST_SLIDESHOW, data);
548f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                return true;
549f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            }
550f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            case R.id.action_crop: {
551f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                Activity activity = (Activity) mActivity;
552f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                Intent intent = new Intent(CropImage.CROP_ACTION);
553f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                intent.setClass(activity, CropImage.class);
554f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                intent.setData(manager.getContentUri(path));
555f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                activity.startActivityForResult(intent, PicasaSource.isPicasaImage(current)
556f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                        ? REQUEST_CROP_PICASA
557f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                        : REQUEST_CROP);
558f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                return true;
559f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            }
560f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang            case R.id.action_edit: {
561f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang                Intent intent = new Intent(Intent.ACTION_EDIT)
562f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang                        .setData(manager.getContentUri(path))
563f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang                        .setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
564f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang                ((Activity) mActivity).startActivityForResult(Intent.createChooser(intent, null),
565f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang                        REQUEST_EDIT);
566f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang                return true;
567f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang            }
568f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            case R.id.action_details: {
569f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                if (mShowDetails) {
570f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                    hideDetails();
571f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                } else {
572f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                    showDetails(currentIndex);
573f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                }
574f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                return true;
575f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            }
57667098d1a72fd04e2af06d3a5939cde28c65f70d9Ray Chen            case R.id.action_delete:
5779a033b07b8e0d9fe7419b7a0d876e9c7febf43c8Ray Chen                confirmMsg = mActivity.getResources().getQuantityString(
5789a033b07b8e0d9fe7419b7a0d876e9c7febf43c8Ray Chen                        R.plurals.delete_selection, 1);
579f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            case R.id.action_setas:
580f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            case R.id.action_rotate_ccw:
581f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            case R.id.action_rotate_cw:
582f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            case R.id.action_show_on_map:
583f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                mSelectionManager.deSelectAll();
584f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                mSelectionManager.toggle(path);
5859a033b07b8e0d9fe7419b7a0d876e9c7febf43c8Ray Chen                mMenuExecutor.onMenuClicked(item, confirmMsg, null);
586f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                return true;
587f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            case R.id.action_import:
588f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                mSelectionManager.deSelectAll();
589f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                mSelectionManager.toggle(path);
5909a033b07b8e0d9fe7419b7a0d876e9c7febf43c8Ray Chen                mMenuExecutor.onMenuClicked(item, confirmMsg,
591f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                        new ImportCompleteListener(mActivity));
592f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                return true;
593f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            default :
594f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                return false;
595f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
596f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
597f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
598f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private void hideDetails() {
599f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mShowDetails = false;
6004105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen        mDetailsHelper.hide();
601f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
602f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
603f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private void showDetails(int index) {
604f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mShowDetails = true;
6054105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen        if (mDetailsHelper == null) {
6064105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen            mDetailsHelper = new DetailsHelper(mActivity, mRootPane, new MyDetailsSource());
6074105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen            mDetailsHelper.setCloseListener(new CloseListener() {
60806c6401eededc2ec842ba4994a838c2ded0a666cPin Ting                @Override
609f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                public void onClose() {
610f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                    hideDetails();
611f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                }
612f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            });
613f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
6144105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen        mDetailsHelper.reloadDetails(index);
6154105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen        mDetailsHelper.show();
616f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
617f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
618bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    ////////////////////////////////////////////////////////////////////////////
619bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    //  Callbacks from PhotoView
620bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    ////////////////////////////////////////////////////////////////////////////
621bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    @Override
622f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public void onSingleTapUp(int x, int y) {
623bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang        if (mAppBridge != null) {
624bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang            if (mAppBridge.onSingleTapUp(x, y)) return;
625014d9586d8145a33f4e99eaad570587f6d650026Wu-cheng Li        }
626014d9586d8145a33f4e99eaad570587f6d650026Wu-cheng Li
627f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        MediaItem item = mModel.getCurrentMediaItem();
628b5dc542fbaeaf99bebdcf775ef0e034e89e88eaeWu-cheng Li        if (item == null || item == mScreenNailItem) {
629b5dc542fbaeaf99bebdcf775ef0e034e89e88eaeWu-cheng Li            // item is not ready or it is camera preview, ignore
630f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            return;
631f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
632f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
633f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        boolean playVideo =
634f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                (item.getSupportedOperations() & MediaItem.SUPPORT_PLAY) != 0;
635f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
636f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        if (playVideo) {
637f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            // determine if the point is at center (1/6) of the photo view.
638f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            // (The position of the "play" icon is at center (1/6) of the photo)
639f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            int w = mPhotoView.getWidth();
640f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            int h = mPhotoView.getHeight();
641f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            playVideo = (Math.abs(x - w / 2) * 12 <= w)
642f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                && (Math.abs(y - h / 2) * 12 <= h);
643f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
644f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
645f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        if (playVideo) {
646f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            playVideo((Activity) mActivity, item.getPlayUri(), item.getName());
647f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        } else {
64861f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang            toggleBars();
649f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
650f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
651f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
652bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    @Override
653bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    public void lockOrientation() {
654bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang        mHandler.sendEmptyMessage(MSG_LOCK_ORIENTATION);
655bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    }
656bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang
657bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    @Override
658bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    public void unlockOrientation() {
65906c6401eededc2ec842ba4994a838c2ded0a666cPin Ting        mHandler.sendEmptyMessage(MSG_UNLOCK_ORIENTATION);
660bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    }
661bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang
662bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    @Override
66361f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang    public void onActionBarAllowed(boolean allowed) {
66461f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang        mActionBarAllowed = allowed;
66561f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang        mHandler.sendEmptyMessage(MSG_UPDATE_ACTION_BAR);
66661f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang    }
66761f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang
66861f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang    @Override
669bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    public void onFullScreenChanged(boolean full) {
670bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang        Message m = mHandler.obtainMessage(
671bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang                MSG_ON_FULL_SCREEN_CHANGED, full ? 1 : 0, 0);
672bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang        m.sendToTarget();
673bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    }
674bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang
675f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public static void playVideo(Activity activity, Uri uri, String title) {
676f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        try {
677f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            Intent intent = new Intent(Intent.ACTION_VIEW)
678f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                    .setDataAndType(uri, "video/*");
679f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            intent.putExtra(Intent.EXTRA_TITLE, title);
680f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            activity.startActivity(intent);
681f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        } catch (ActivityNotFoundException e) {
682f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            Toast.makeText(activity, activity.getString(R.string.video_err),
683f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                    Toast.LENGTH_SHORT).show();
684f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
685f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
686f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
687f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang    private void setCurrentPhotoByIntent(Intent intent) {
688f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang        if (intent == null) return;
689f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang        Path path = mApplication.getDataManager()
690f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang                .findPathByUri(intent.getData(), intent.getType());
691f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang        if (path != null) {
692f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang            mModel.setCurrentPhoto(path, mCurrentIndex);
693f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang        }
694f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang    }
695f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang
696f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    @Override
697f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    protected void onStateResult(int requestCode, int resultCode, Intent data) {
698f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        switch (requestCode) {
699f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang            case REQUEST_EDIT:
700f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang                setCurrentPhotoByIntent(data);
701f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang                break;
702f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            case REQUEST_CROP:
703f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                if (resultCode == Activity.RESULT_OK) {
704f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang                    setCurrentPhotoByIntent(data);
705f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                }
706f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                break;
707f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            case REQUEST_CROP_PICASA: {
708f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang                if (resultCode == Activity.RESULT_OK) {
709f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang                    Context context = mActivity.getAndroidContext();
71088cc2ca5f5596762a5546ec7426756f2036be455Yuli Huang                    String message = context.getString(R.string.crop_saved,
711f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang                            context.getString(R.string.folder_download));
712f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang                    Toast.makeText(context, message, Toast.LENGTH_SHORT).show();
713f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang                }
714f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                break;
715f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            }
716f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            case REQUEST_SLIDESHOW: {
717f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                if (data == null) break;
718f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                String path = data.getStringExtra(SlideshowPage.KEY_ITEM_PATH);
719f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                int index = data.getIntExtra(SlideshowPage.KEY_PHOTO_INDEX, 0);
720f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                if (path != null) {
721f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                    mModel.setCurrentPhoto(Path.fromString(path), index);
722f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                }
723f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            }
724f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
725f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
726f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
727f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    @Override
728f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public void onPause() {
729bd7c016d728853d38f98a3c6077b7bd9b08858b9Yuli Huang        mActivity.getGLRoot().unfreeze();
730bd7c016d728853d38f98a3c6077b7bd9b08858b9Yuli Huang        mHandler.removeMessages(MSG_UNFREEZE_GLROOT);
731f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        super.onPause();
732f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mIsActive = false;
733bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang        if (mAppBridge != null) mAppBridge.setServer(null);
7344105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen        DetailsHelper.pause();
735f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mPhotoView.pause();
736f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mModel.pause();
737f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mHandler.removeMessages(MSG_HIDE_BARS);
738f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mActionBar.removeOnMenuVisibilityListener(mMenuVisibilityListener);
73933ef03776b7734717b16f6fc861b831fb1b1dfacMartijn Coenen
7402785956f8f5654966a41e20f482f4af3057eea3fChih-Chung Chang        mMenuExecutor.pause();
741f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
742f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
743f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    @Override
744bd7c016d728853d38f98a3c6077b7bd9b08858b9Yuli Huang    public void onCurrentImageUpdated() {
745bd7c016d728853d38f98a3c6077b7bd9b08858b9Yuli Huang        mActivity.getGLRoot().unfreeze();
746bd7c016d728853d38f98a3c6077b7bd9b08858b9Yuli Huang    }
747bd7c016d728853d38f98a3c6077b7bd9b08858b9Yuli Huang
748bd7c016d728853d38f98a3c6077b7bd9b08858b9Yuli Huang    @Override
749f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    protected void onResume() {
750bd7c016d728853d38f98a3c6077b7bd9b08858b9Yuli Huang        mActivity.getGLRoot().freeze();
751f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        super.onResume();
752f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mIsActive = true;
753f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        setContentPane(mRootPane);
75404ac045bf8da5082bbb0bdc9ea5f9c9b5b796ad0Yuli Huang
755f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mModel.resume();
756f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mPhotoView.resume();
757f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        if (mMenuVisibilityListener == null) {
758f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            mMenuVisibilityListener = new MyMenuVisibilityListener();
759f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
7608cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen        mActionBar.setDisplayOptions(mSetPathString != null, true);
761f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mActionBar.addOnMenuVisibilityListener(mMenuVisibilityListener);
76233ef03776b7734717b16f6fc861b831fb1b1dfacMartijn Coenen
763bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang        if (mAppBridge != null) {
764bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang            mAppBridge.setServer(this);
76533f8567dd5003e4bb342683f3768ab7552648b02Chih-Chung Chang            mPhotoView.resetToFirstPicture();
766bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang        }
767bd7c016d728853d38f98a3c6077b7bd9b08858b9Yuli Huang        mHandler.sendEmptyMessageDelayed(MSG_UNFREEZE_GLROOT, UNFREEZE_GLROOT_TIMEOUT);
768f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
769f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
77015b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang    @Override
77115b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang    protected void onDestroy() {
772bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang        if (mAppBridge != null) {
7733b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang            mScreenNailItem.setScreenNail(null);
774bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang            mAppBridge.detachScreenNail();
775bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang            mAppBridge = null;
7763b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang            mScreenNailSet = null;
7773b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang            mScreenNailItem = null;
778b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang        }
779bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang        mOrientationManager.removeListener(this);
7802ef46ed28b28b355d7f3f1432c7b1196b832a859Chih-Chung Chang        mActivity.getGLRoot().setOrientationSource(null);
781aeb3062e84ed28f0e25a73f511f287ae0a3e4294Chih-Chung Chang
782aeb3062e84ed28f0e25a73f511f287ae0a3e4294Chih-Chung Chang        // Remove all pending messages.
783aeb3062e84ed28f0e25a73f511f287ae0a3e4294Chih-Chung Chang        mHandler.removeCallbacksAndMessages(null);
78415b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang        super.onDestroy();
78515b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang    }
78615b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang
787f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private class MyDetailsSource implements DetailsSource {
7884105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen        private int mIndex;
7896cf807453fb58ccd4cc513ff187b306c7090e67cOwen Lin
7906cf807453fb58ccd4cc513ff187b306c7090e67cOwen Lin        @Override
791f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        public MediaDetails getDetails() {
792f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            return mModel.getCurrentMediaItem().getDetails();
793f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
7946cf807453fb58ccd4cc513ff187b306c7090e67cOwen Lin
7956cf807453fb58ccd4cc513ff187b306c7090e67cOwen Lin        @Override
796f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        public int size() {
797f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            return mMediaSet != null ? mMediaSet.getMediaItemCount() : 1;
798f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
7996cf807453fb58ccd4cc513ff187b306c7090e67cOwen Lin
8006cf807453fb58ccd4cc513ff187b306c7090e67cOwen Lin        @Override
801f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        public int findIndex(int indexHint) {
8024105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen            mIndex = indexHint;
803f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            return indexHint;
804f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
8054105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen
8066cf807453fb58ccd4cc513ff187b306c7090e67cOwen Lin        @Override
8074105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen        public int getIndex() {
8084105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen            return mIndex;
8094105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen        }
810f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
811f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin}
812