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
19fc86994f86f8cfb31e151c9e730dc1e9dc7b3349Yuli Huangimport android.annotation.TargetApi;
201336062985c9824d7fd796b1cebd5eaa8e4163caOwen Linimport android.app.ActionBar.OnMenuVisibilityListener;
218bc5bebba780ca4a322b466b06fc909331697cf4Owen Linimport android.app.Activity;
22604f053d040782159b61d3b74ee533bc2c0ccdd0Ray Chenimport android.content.ActivityNotFoundException;
23604f053d040782159b61d3b74ee533bc2c0ccdd0Ray Chenimport android.content.Context;
24604f053d040782159b61d3b74ee533bc2c0ccdd0Ray Chenimport android.content.Intent;
25a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescuimport android.content.pm.PackageManager;
2604ac045bf8da5082bbb0bdc9ea5f9c9b5b796ad0Yuli Huangimport android.graphics.Rect;
27604f053d040782159b61d3b74ee533bc2c0ccdd0Ray Chenimport android.net.Uri;
2833ef03776b7734717b16f6fc861b831fb1b1dfacMartijn Coenenimport android.nfc.NfcAdapter;
29ddf0225a5192a589fc578945f56440b09bf74d12John Reckimport android.nfc.NfcAdapter.CreateBeamUrisCallback;
30ddf0225a5192a589fc578945f56440b09bf74d12John Reckimport android.nfc.NfcEvent;
31604f053d040782159b61d3b74ee533bc2c0ccdd0Ray Chenimport android.os.Bundle;
32604f053d040782159b61d3b74ee533bc2c0ccdd0Ray Chenimport android.os.Handler;
33604f053d040782159b61d3b74ee533bc2c0ccdd0Ray Chenimport android.os.Message;
34b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescuimport android.os.SystemClock;
351336062985c9824d7fd796b1cebd5eaa8e4163caOwen Linimport android.view.Menu;
361336062985c9824d7fd796b1cebd5eaa8e4163caOwen Linimport android.view.MenuItem;
37a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescuimport android.widget.RelativeLayout;
38604f053d040782159b61d3b74ee533bc2c0ccdd0Ray Chenimport android.widget.Toast;
39604f053d040782159b61d3b74ee533bc2c0ccdd0Ray Chen
405bd00332556b20c141b5c7f16433d55b1bc7fe0fBobby Georgescuimport com.android.camera.CameraActivity;
41f85d974363a40b8ce588ba3fe902eec38de603d9John Reckimport com.android.camera.ProxyLauncher;
42f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.R;
43fc86994f86f8cfb31e151c9e730dc1e9dc7b3349Yuli Huangimport com.android.gallery3d.common.ApiHelper;
44ee899c09c88e5b054397ac44ad20e5055cd24f39Bobby Georgescuimport com.android.gallery3d.data.ComboAlbum;
45f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.data.DataManager;
466b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Changimport com.android.gallery3d.data.FilterDeleteSet;
4745f089d69141e3fb0dfaad9bc34d275b61eb2aeeBobby Georgescuimport com.android.gallery3d.data.FilterSource;
484e091eb758a3ac1016b373419cea1ada1b977bc5George Mountimport com.android.gallery3d.data.LocalImage;
49f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.data.MediaDetails;
50f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.data.MediaItem;
51f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.data.MediaObject;
524b4dbd225685502f4249c2bf25bf74f7ce526645George Mountimport com.android.gallery3d.data.MediaObject.PanoramaSupportCallback;
53f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.data.MediaSet;
546b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Changimport com.android.gallery3d.data.MtpSource;
55f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.data.Path;
56a0ce682e40c39ce046c48d8a7f989fff01bb9f2cWu-cheng Liimport com.android.gallery3d.data.SecureAlbum;
57a0ce682e40c39ce046c48d8a7f989fff01bb9f2cWu-cheng Liimport com.android.gallery3d.data.SecureSource;
583b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Changimport com.android.gallery3d.data.SnailAlbum;
593b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Changimport com.android.gallery3d.data.SnailItem;
6015b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Changimport com.android.gallery3d.data.SnailSource;
6163926d2ed2ca2921de8dca9b3a52c1d64d8afc46Ruben Brunkimport com.android.gallery3d.filtershow.FilterShowActivity;
62f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.picasasource.PicasaSource;
634105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chenimport com.android.gallery3d.ui.DetailsHelper;
644105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chenimport com.android.gallery3d.ui.DetailsHelper.CloseListener;
654105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chenimport com.android.gallery3d.ui.DetailsHelper.DetailsSource;
66f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.ui.GLView;
67f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.ui.ImportCompleteListener;
68f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.ui.MenuExecutor;
6921a412c93c9b0401b039f4eb86d4950752e5bb84Owen Linimport com.android.gallery3d.ui.PhotoView;
70f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.ui.SelectionManager;
71f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.ui.SynchronizedHandler;
72f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.util.GalleryUtils;
73f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
74bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Changpublic class PhotoPage extends ActivityState implements
753c6a0610d50a866e520485163011c79d9ee62457Your Name        PhotoView.Listener, AppBridge.Server,
763cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu        PhotoPageBottomControls.Delegate, GalleryActionBar.OnAlbumModeSelectedListener {
77f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private static final String TAG = "PhotoPage";
78f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
79f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private static final int MSG_HIDE_BARS = 1;
80bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    private static final int MSG_ON_FULL_SCREEN_CHANGED = 4;
8161f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang    private static final int MSG_UPDATE_ACTION_BAR = 5;
82bd7c016d728853d38f98a3c6077b7bd9b08858b9Yuli Huang    private static final int MSG_UNFREEZE_GLROOT = 6;
83e6251df06f0b3c8f556043f8b725b4b19be7474dChih-Chung Chang    private static final int MSG_WANT_BARS = 7;
843cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu    private static final int MSG_REFRESH_BOTTOM_CONTROLS = 8;
853cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu    private static final int MSG_ON_CAMERA_CENTER = 9;
86f4e22eb44bfae0c2a3b6570f19480c8c3535d808Bobby Georgescu    private static final int MSG_ON_PICTURE_CENTER = 10;
87f122d56e15e00928d731751796b0509ae47c6799George Mount    private static final int MSG_REFRESH_IMAGE = 11;
88423e45e492d4ebdc41ecfeba73299de23b1463c4Mangesh Ghiware    private static final int MSG_UPDATE_PHOTO_UI = 12;
89825afb1b3e7d15b5c258d664ee008dc68da1c407Mangesh Ghiware    private static final int MSG_UPDATE_PROGRESS = 13;
90423e45e492d4ebdc41ecfeba73299de23b1463c4Mangesh Ghiware    private static final int MSG_UPDATE_DEFERRED = 14;
914b4dbd225685502f4249c2bf25bf74f7ce526645George Mount    private static final int MSG_UPDATE_SHARE_URI = 15;
924b4dbd225685502f4249c2bf25bf74f7ce526645George Mount    private static final int MSG_UPDATE_PANORAMA_UI = 16;
936cf807453fb58ccd4cc513ff187b306c7090e67cOwen Lin
94f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private static final int HIDE_BARS_TIMEOUT = 3500;
95bd7c016d728853d38f98a3c6077b7bd9b08858b9Yuli Huang    private static final int UNFREEZE_GLROOT_TIMEOUT = 250;
96f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
97f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private static final int REQUEST_SLIDESHOW = 1;
98f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private static final int REQUEST_CROP = 2;
99f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private static final int REQUEST_CROP_PICASA = 3;
100f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang    private static final int REQUEST_EDIT = 4;
10171cd89a38752bc22ae0ec2df965e4280b776623cChih-Chung Chang    private static final int REQUEST_PLAY_VIDEO = 5;
1023f1f1baf3a674927e25cd5cd885fb372796bd3a0Teng-Hui Zhu    private static final int REQUEST_TRIM = 6;
103f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
104f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public static final String KEY_MEDIA_SET_PATH = "media-set-path";
105f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public static final String KEY_MEDIA_ITEM_PATH = "media-item-path";
106f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public static final String KEY_INDEX_HINT = "index-hint";
10704ac045bf8da5082bbb0bdc9ea5f9c9b5b796ad0Yuli Huang    public static final String KEY_OPEN_ANIMATION_RECT = "open-animation-rect";
108bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    public static final String KEY_APP_BRIDGE = "app-bridge";
10954fe6202b6f7d233e7645c121321fe0f3d20fc8bYuli Huang    public static final String KEY_TREAT_BACK_AS_UP = "treat-back-as-up";
1107eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu    public static final String KEY_START_IN_FILMSTRIP = "start-in-filmstrip";
111bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    public static final String KEY_RETURN_INDEX_HINT = "return-index-hint";
11223e595f0c656ebaeb63f78e3018b5830628c5afeWu-cheng Li    public static final String KEY_SHOW_WHEN_LOCKED = "show_when_locked";
11345f089d69141e3fb0dfaad9bc34d275b61eb2aeeBobby Georgescu    public static final String KEY_IN_CAMERA_ROLL = "in_camera_roll";
114f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
1157eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu    public static final String KEY_ALBUMPAGE_TRANSITION = "albumpage-transition";
1167eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu    public static final int MSG_ALBUMPAGE_NONE = 0;
1177eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu    public static final int MSG_ALBUMPAGE_STARTED = 1;
1187eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu    public static final int MSG_ALBUMPAGE_RESUMED = 2;
1197eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu    public static final int MSG_ALBUMPAGE_PICKED = 4;
1207eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu
121a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu    public static final String ACTION_NEXTGEN_EDIT = "action_nextgen_edit";
122a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu
123f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private GalleryApp mApplication;
124f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private SelectionManager mSelectionManager;
125f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
126f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private PhotoView mPhotoView;
127f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private PhotoPage.Model mModel;
1284105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen    private DetailsHelper mDetailsHelper;
129f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private boolean mShowDetails;
130f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
131f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    // mMediaSet could be null if there is no KEY_MEDIA_SET_PATH supplied.
132f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    // E.g., viewing a photo in gmail attachment
1336b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang    private FilterDeleteSet mMediaSet;
134f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
135a0ce682e40c39ce046c48d8a7f989fff01bb9f2cWu-cheng Li    // The mediaset used by camera launched from secure lock screen.
136a0ce682e40c39ce046c48d8a7f989fff01bb9f2cWu-cheng Li    private SecureAlbum mSecureAlbum;
137a0ce682e40c39ce046c48d8a7f989fff01bb9f2cWu-cheng Li
138f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private int mCurrentIndex = 0;
139f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private Handler mHandler;
140113bfc77c4468411da9ae1290553c3be89f8df9aOwen Lin    private boolean mShowBars = true;
14161f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang    private volatile boolean mActionBarAllowed = true;
1428cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen    private GalleryActionBar mActionBar;
143f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private boolean mIsMenuVisible;
1448fe22ecb8e744a09a2e0d867f876ecbf74c82298John Reck    private boolean mHaveImageEditor;
145f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu    private PhotoPageBottomControls mBottomControls;
146f122d56e15e00928d731751796b0509ae47c6799George Mount    private PhotoPageProgressBar mProgressBar;
147f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private MediaItem mCurrentPhoto = null;
148f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private MenuExecutor mMenuExecutor;
149f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private boolean mIsActive;
150ba65c373f244f6de0b45afa6b7cd711866f1bfe4Bobby Georgescu    private boolean mShowSpinner;
15184c220f10a643927c8a2126de8a755d8d7f7ec9eRay Chen    private String mSetPathString;
152b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang    // This is the original mSetPathString before adding the camera preview item.
153b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang    private String mOriginalSetPathString;
154bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    private AppBridge mAppBridge;
1553b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang    private SnailItem mScreenNailItem;
1563b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang    private SnailAlbum mScreenNailSet;
157bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    private OrientationManager mOrientationManager;
15854fe6202b6f7d233e7645c121321fe0f3d20fc8bYuli Huang    private boolean mTreatBackAsUp;
1597eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu    private boolean mStartInFilmstrip;
1603ad7bbc55d7aaa0f36a7242fdd0f612d877adc19Bobby Georgescu    private boolean mHasCameraScreennailOrPlaceholder = false;
161d81b264931cfa3b34096efd46659b81f9a628fb5Bobby Georgescu    private boolean mRecenterCameraOnResume = true;
16215b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang
163a680a0c32ae3321c632288b36083f2782af2c55bDoris Liu    // These are only valid after the panorama callback
164a680a0c32ae3321c632288b36083f2782af2c55bDoris Liu    private boolean mIsPanorama;
165a680a0c32ae3321c632288b36083f2782af2c55bDoris Liu    private boolean mIsPanorama360;
166a680a0c32ae3321c632288b36083f2782af2c55bDoris Liu
167b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu    private long mCameraSwitchCutoff = 0;
168b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu    private boolean mSkipUpdateCurrentPhoto = false;
169b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu    private static final long CAMERA_SWITCH_CUTOFF_THRESHOLD_MS = 300;
170b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu
1714b4dbd225685502f4249c2bf25bf74f7ce526645George Mount    private static final long DEFERRED_UPDATE_MS = 250;
172e23a9d412cba5a202405e1c99c0cf080949db2c7Bobby Georgescu    private boolean mDeferredUpdateWaiting = false;
173e23a9d412cba5a202405e1c99c0cf080949db2c7Bobby Georgescu    private long mDeferUpdateUntil = Long.MAX_VALUE;
174e23a9d412cba5a202405e1c99c0cf080949db2c7Bobby Georgescu
1756b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang    // The item that is deleted (but it can still be undeleted before commiting)
1766b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang    private Path mDeletePath;
1776b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang    private boolean mDeleteIsFocus;  // whether the deleted item was in focus
1786b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang
179ddf0225a5192a589fc578945f56440b09bf74d12John Reck    private Uri[] mNfcPushUris = new Uri[1];
18033ef03776b7734717b16f6fc861b831fb1b1dfacMartijn Coenen
1812bb717f1ea38e2ce33dd102a23afe6bfacb5675cOwen Lin    private final MyMenuVisibilityListener mMenuVisibilityListener =
1822bb717f1ea38e2ce33dd102a23afe6bfacb5675cOwen Lin            new MyMenuVisibilityListener();
183f122d56e15e00928d731751796b0509ae47c6799George Mount    private UpdateProgressListener mProgressListener;
1842bb717f1ea38e2ce33dd102a23afe6bfacb5675cOwen Lin
1854b4dbd225685502f4249c2bf25bf74f7ce526645George Mount    private final PanoramaSupportCallback mUpdatePanoramaMenuItemsCallback = new PanoramaSupportCallback() {
1864b4dbd225685502f4249c2bf25bf74f7ce526645George Mount        @Override
1874b4dbd225685502f4249c2bf25bf74f7ce526645George Mount        public void panoramaInfoAvailable(MediaObject mediaObject, boolean isPanorama,
1884b4dbd225685502f4249c2bf25bf74f7ce526645George Mount                boolean isPanorama360) {
1894b4dbd225685502f4249c2bf25bf74f7ce526645George Mount            if (mediaObject == mCurrentPhoto) {
1904b4dbd225685502f4249c2bf25bf74f7ce526645George Mount                mHandler.obtainMessage(MSG_UPDATE_PANORAMA_UI, isPanorama360 ? 1 : 0, 0,
1914b4dbd225685502f4249c2bf25bf74f7ce526645George Mount                        mediaObject).sendToTarget();
192825afb1b3e7d15b5c258d664ee008dc68da1c407Mangesh Ghiware            }
1934b4dbd225685502f4249c2bf25bf74f7ce526645George Mount        }
1944b4dbd225685502f4249c2bf25bf74f7ce526645George Mount    };
1954b4dbd225685502f4249c2bf25bf74f7ce526645George Mount
1964b4dbd225685502f4249c2bf25bf74f7ce526645George Mount    private final PanoramaSupportCallback mRefreshBottomControlsCallback = new PanoramaSupportCallback() {
1974b4dbd225685502f4249c2bf25bf74f7ce526645George Mount        @Override
1984b4dbd225685502f4249c2bf25bf74f7ce526645George Mount        public void panoramaInfoAvailable(MediaObject mediaObject, boolean isPanorama,
1994b4dbd225685502f4249c2bf25bf74f7ce526645George Mount                boolean isPanorama360) {
2004b4dbd225685502f4249c2bf25bf74f7ce526645George Mount            if (mediaObject == mCurrentPhoto) {
201a680a0c32ae3321c632288b36083f2782af2c55bDoris Liu                mHandler.obtainMessage(MSG_REFRESH_BOTTOM_CONTROLS, isPanorama ? 1 : 0, isPanorama360 ? 1 : 0,
202a680a0c32ae3321c632288b36083f2782af2c55bDoris Liu                        mediaObject).sendToTarget();
2034b4dbd225685502f4249c2bf25bf74f7ce526645George Mount            }
2044b4dbd225685502f4249c2bf25bf74f7ce526645George Mount        }
2054b4dbd225685502f4249c2bf25bf74f7ce526645George Mount    };
2064b4dbd225685502f4249c2bf25bf74f7ce526645George Mount
2074b4dbd225685502f4249c2bf25bf74f7ce526645George Mount    private final PanoramaSupportCallback mUpdateShareURICallback = new PanoramaSupportCallback() {
2084b4dbd225685502f4249c2bf25bf74f7ce526645George Mount        @Override
2094b4dbd225685502f4249c2bf25bf74f7ce526645George Mount        public void panoramaInfoAvailable(MediaObject mediaObject, boolean isPanorama,
2104b4dbd225685502f4249c2bf25bf74f7ce526645George Mount                boolean isPanorama360) {
2114b4dbd225685502f4249c2bf25bf74f7ce526645George Mount            if (mediaObject == mCurrentPhoto) {
2124b4dbd225685502f4249c2bf25bf74f7ce526645George Mount                mHandler.obtainMessage(MSG_UPDATE_SHARE_URI, isPanorama360 ? 1 : 0, 0, mediaObject)
2134b4dbd225685502f4249c2bf25bf74f7ce526645George Mount                        .sendToTarget();
2144b4dbd225685502f4249c2bf25bf74f7ce526645George Mount            }
2154b4dbd225685502f4249c2bf25bf74f7ce526645George Mount        }
2164b4dbd225685502f4249c2bf25bf74f7ce526645George Mount    };
217825afb1b3e7d15b5c258d664ee008dc68da1c407Mangesh Ghiware
218f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public static interface Model extends PhotoView.Model {
219f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        public void resume();
220f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        public void pause();
221f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        public boolean isEmpty();
222f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        public void setCurrentPhoto(Path path, int indexHint);
223f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
224f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
225f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private class MyMenuVisibilityListener implements OnMenuVisibilityListener {
22606c6401eededc2ec842ba4994a838c2ded0a666cPin Ting        @Override
227f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        public void onMenuVisibilityChanged(boolean isVisible) {
228f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            mIsMenuVisible = isVisible;
229f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            refreshHidingMessage();
230f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
231f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
232f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
233f122d56e15e00928d731751796b0509ae47c6799George Mount    private class UpdateProgressListener implements StitchingChangeListener {
234f122d56e15e00928d731751796b0509ae47c6799George Mount
235f122d56e15e00928d731751796b0509ae47c6799George Mount        @Override
2364e091eb758a3ac1016b373419cea1ada1b977bc5George Mount        public void onStitchingResult(Uri uri) {
237825afb1b3e7d15b5c258d664ee008dc68da1c407Mangesh Ghiware            sendUpdate(uri, MSG_REFRESH_IMAGE);
238f122d56e15e00928d731751796b0509ae47c6799George Mount        }
239f122d56e15e00928d731751796b0509ae47c6799George Mount
240f122d56e15e00928d731751796b0509ae47c6799George Mount        @Override
2414e091eb758a3ac1016b373419cea1ada1b977bc5George Mount        public void onStitchingQueued(Uri uri) {
242825afb1b3e7d15b5c258d664ee008dc68da1c407Mangesh Ghiware            sendUpdate(uri, MSG_UPDATE_PROGRESS);
243f122d56e15e00928d731751796b0509ae47c6799George Mount        }
244f122d56e15e00928d731751796b0509ae47c6799George Mount
245f122d56e15e00928d731751796b0509ae47c6799George Mount        @Override
2464e091eb758a3ac1016b373419cea1ada1b977bc5George Mount        public void onStitchingProgress(Uri uri, final int progress) {
247825afb1b3e7d15b5c258d664ee008dc68da1c407Mangesh Ghiware            sendUpdate(uri, MSG_UPDATE_PROGRESS);
248f122d56e15e00928d731751796b0509ae47c6799George Mount        }
249f122d56e15e00928d731751796b0509ae47c6799George Mount
250825afb1b3e7d15b5c258d664ee008dc68da1c407Mangesh Ghiware        private void sendUpdate(Uri uri, int message) {
2514b4dbd225685502f4249c2bf25bf74f7ce526645George Mount            MediaObject currentPhoto = mCurrentPhoto;
2524b4dbd225685502f4249c2bf25bf74f7ce526645George Mount            boolean isCurrentPhoto = currentPhoto instanceof LocalImage
2534b4dbd225685502f4249c2bf25bf74f7ce526645George Mount                    && currentPhoto.getContentUri().equals(uri);
254f122d56e15e00928d731751796b0509ae47c6799George Mount            if (isCurrentPhoto) {
255825afb1b3e7d15b5c258d664ee008dc68da1c407Mangesh Ghiware                mHandler.sendEmptyMessage(message);
256f122d56e15e00928d731751796b0509ae47c6799George Mount            }
257f122d56e15e00928d731751796b0509ae47c6799George Mount        }
258f122d56e15e00928d731751796b0509ae47c6799George Mount    };
259f122d56e15e00928d731751796b0509ae47c6799George Mount
260915c2c5b2c367df71599370613af0924bd7c4887Bobby Georgescu    @Override
261915c2c5b2c367df71599370613af0924bd7c4887Bobby Georgescu    protected int getBackgroundColorId() {
262915c2c5b2c367df71599370613af0924bd7c4887Bobby Georgescu        return R.color.photo_background;
263915c2c5b2c367df71599370613af0924bd7c4887Bobby Georgescu    }
264915c2c5b2c367df71599370613af0924bd7c4887Bobby Georgescu
265f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu    private final GLView mRootPane = new GLView() {
266f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        @Override
267f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        protected void onLayout(
268f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                boolean changed, int left, int top, int right, int bottom) {
269f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            mPhotoView.layout(0, 0, right - left, bottom - top);
270f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            if (mShowDetails) {
2718cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen                mDetailsHelper.layout(left, mActionBar.getHeight(), right, bottom);
272f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            }
273f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
274f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    };
275f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
276f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    @Override
277f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public void onCreate(Bundle data, Bundle restoreState) {
27845c56f2d34c71d0bc9b84ebeef6d1314738d0fc0Bobby Georgescu        super.onCreate(data, restoreState);
2798cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen        mActionBar = mActivity.getGalleryActionBar();
280f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mSelectionManager = new SelectionManager(mActivity, false);
281f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mMenuExecutor = new MenuExecutor(mActivity, mSelectionManager);
282f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
283f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mPhotoView = new PhotoView(mActivity);
284bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang        mPhotoView.setListener(this);
285f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mRootPane.addComponent(mPhotoView);
28683be4e0c9b8e3372eff8f9b1a396afd961b72921Angus Kong        mApplication = (GalleryApp) ((Activity) mActivity).getApplication();
287bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang        mOrientationManager = mActivity.getOrientationManager();
2882ef46ed28b28b355d7f3f1432c7b1196b832a859Chih-Chung Chang        mActivity.getGLRoot().setOrientationSource(mOrientationManager);
289f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
290d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu        mHandler = new SynchronizedHandler(mActivity.getGLRoot()) {
291d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu            @Override
292d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu            public void handleMessage(Message message) {
293d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu                switch (message.what) {
294d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu                    case MSG_HIDE_BARS: {
295d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu                        hideBars();
296d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu                        break;
297d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu                    }
298f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu                    case MSG_REFRESH_BOTTOM_CONTROLS: {
2994b4dbd225685502f4249c2bf25bf74f7ce526645George Mount                        if (mCurrentPhoto == message.obj && mBottomControls != null) {
300a680a0c32ae3321c632288b36083f2782af2c55bDoris Liu                            mIsPanorama = message.arg1 == 1;
301a680a0c32ae3321c632288b36083f2782af2c55bDoris Liu                            mIsPanorama360 = message.arg2 == 1;
302a680a0c32ae3321c632288b36083f2782af2c55bDoris Liu                            mBottomControls.refresh();
3034b4dbd225685502f4249c2bf25bf74f7ce526645George Mount                        }
304d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu                        break;
305d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu                    }
306d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu                    case MSG_ON_FULL_SCREEN_CHANGED: {
307db99a10b6ac9296d612db8ba51e37f141fee4170Bobby Georgescu                        if (mAppBridge != null) {
308db99a10b6ac9296d612db8ba51e37f141fee4170Bobby Georgescu                            mAppBridge.onFullScreenChanged(message.arg1 == 1);
309db99a10b6ac9296d612db8ba51e37f141fee4170Bobby Georgescu                        }
310d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu                        break;
311d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu                    }
312d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu                    case MSG_UPDATE_ACTION_BAR: {
313d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu                        updateBars();
314d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu                        break;
315d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu                    }
316d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu                    case MSG_WANT_BARS: {
317d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu                        wantBars();
318d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu                        break;
319d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu                    }
320d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu                    case MSG_UNFREEZE_GLROOT: {
321d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu                        mActivity.getGLRoot().unfreeze();
322d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu                        break;
323d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu                    }
324e23a9d412cba5a202405e1c99c0cf080949db2c7Bobby Georgescu                    case MSG_UPDATE_DEFERRED: {
325e23a9d412cba5a202405e1c99c0cf080949db2c7Bobby Georgescu                        long nextUpdate = mDeferUpdateUntil - SystemClock.uptimeMillis();
326e23a9d412cba5a202405e1c99c0cf080949db2c7Bobby Georgescu                        if (nextUpdate <= 0) {
327e23a9d412cba5a202405e1c99c0cf080949db2c7Bobby Georgescu                            mDeferredUpdateWaiting = false;
328e23a9d412cba5a202405e1c99c0cf080949db2c7Bobby Georgescu                            updateUIForCurrentPhoto();
329e23a9d412cba5a202405e1c99c0cf080949db2c7Bobby Georgescu                        } else {
330e23a9d412cba5a202405e1c99c0cf080949db2c7Bobby Georgescu                            mHandler.sendEmptyMessageDelayed(MSG_UPDATE_DEFERRED, nextUpdate);
331e23a9d412cba5a202405e1c99c0cf080949db2c7Bobby Georgescu                        }
332e23a9d412cba5a202405e1c99c0cf080949db2c7Bobby Georgescu                        break;
333e23a9d412cba5a202405e1c99c0cf080949db2c7Bobby Georgescu                    }
334b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu                    case MSG_ON_CAMERA_CENTER: {
335b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu                        mSkipUpdateCurrentPhoto = false;
336bbc993162d687df20e2ff9a329bb9b6e04926ba8Bobby Georgescu                        boolean stayedOnCamera = false;
337b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu                        if (!mPhotoView.getFilmMode()) {
338bbc993162d687df20e2ff9a329bb9b6e04926ba8Bobby Georgescu                            stayedOnCamera = true;
339b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu                        } else if (SystemClock.uptimeMillis() < mCameraSwitchCutoff &&
340b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu                                mMediaSet.getMediaItemCount() > 1) {
341b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu                            mPhotoView.switchToImage(1);
342b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu                        } else {
343cc6ad8217cb09b778d400c9c5e5928170ca53737Bobby Georgescu                            if (mAppBridge != null) mPhotoView.setFilmMode(false);
344bbc993162d687df20e2ff9a329bb9b6e04926ba8Bobby Georgescu                            stayedOnCamera = true;
345b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu                        }
346b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu
347bbc993162d687df20e2ff9a329bb9b6e04926ba8Bobby Georgescu                        if (stayedOnCamera) {
348cc6ad8217cb09b778d400c9c5e5928170ca53737Bobby Georgescu                            if (mAppBridge == null) {
3495bd00332556b20c141b5c7f16433d55b1bc7fe0fBobby Georgescu                                launchCamera();
350cc6ad8217cb09b778d400c9c5e5928170ca53737Bobby Georgescu                                /* We got here by swiping from photo 1 to the
351cc6ad8217cb09b778d400c9c5e5928170ca53737Bobby Georgescu                                   placeholder, so make it be the thing that
352cc6ad8217cb09b778d400c9c5e5928170ca53737Bobby Georgescu                                   is in focus when the user presses back from
353cc6ad8217cb09b778d400c9c5e5928170ca53737Bobby Georgescu                                   the camera app */
354cc6ad8217cb09b778d400c9c5e5928170ca53737Bobby Georgescu                                mPhotoView.switchToImage(1);
355cc6ad8217cb09b778d400c9c5e5928170ca53737Bobby Georgescu                            } else {
356cc6ad8217cb09b778d400c9c5e5928170ca53737Bobby Georgescu                                updateBars();
357cc6ad8217cb09b778d400c9c5e5928170ca53737Bobby Georgescu                                updateCurrentPhoto(mModel.getMediaItem(0));
358cc6ad8217cb09b778d400c9c5e5928170ca53737Bobby Georgescu                            }
359b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu                        }
360b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu                        break;
361b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu                    }
362f4e22eb44bfae0c2a3b6570f19480c8c3535d808Bobby Georgescu                    case MSG_ON_PICTURE_CENTER: {
363e23a9d412cba5a202405e1c99c0cf080949db2c7Bobby Georgescu                        if (!mPhotoView.getFilmMode() && mCurrentPhoto != null
364f4e22eb44bfae0c2a3b6570f19480c8c3535d808Bobby Georgescu                                && (mCurrentPhoto.getSupportedOperations() & MediaObject.SUPPORT_ACTION) != 0) {
365f4e22eb44bfae0c2a3b6570f19480c8c3535d808Bobby Georgescu                            mPhotoView.setFilmMode(true);
366f4e22eb44bfae0c2a3b6570f19480c8c3535d808Bobby Georgescu                        }
367f4e22eb44bfae0c2a3b6570f19480c8c3535d808Bobby Georgescu                        break;
368f4e22eb44bfae0c2a3b6570f19480c8c3535d808Bobby Georgescu                    }
369f122d56e15e00928d731751796b0509ae47c6799George Mount                    case MSG_REFRESH_IMAGE: {
370423e45e492d4ebdc41ecfeba73299de23b1463c4Mangesh Ghiware                        final MediaItem photo = mCurrentPhoto;
371423e45e492d4ebdc41ecfeba73299de23b1463c4Mangesh Ghiware                        mCurrentPhoto = null;
372423e45e492d4ebdc41ecfeba73299de23b1463c4Mangesh Ghiware                        updateCurrentPhoto(photo);
373423e45e492d4ebdc41ecfeba73299de23b1463c4Mangesh Ghiware                        break;
374423e45e492d4ebdc41ecfeba73299de23b1463c4Mangesh Ghiware                    }
375423e45e492d4ebdc41ecfeba73299de23b1463c4Mangesh Ghiware                    case MSG_UPDATE_PHOTO_UI: {
376825afb1b3e7d15b5c258d664ee008dc68da1c407Mangesh Ghiware                        updateUIForCurrentPhoto();
377825afb1b3e7d15b5c258d664ee008dc68da1c407Mangesh Ghiware                        break;
378825afb1b3e7d15b5c258d664ee008dc68da1c407Mangesh Ghiware                    }
379825afb1b3e7d15b5c258d664ee008dc68da1c407Mangesh Ghiware                    case MSG_UPDATE_PROGRESS: {
380825afb1b3e7d15b5c258d664ee008dc68da1c407Mangesh Ghiware                        updateProgressBar();
381f122d56e15e00928d731751796b0509ae47c6799George Mount                        break;
382f122d56e15e00928d731751796b0509ae47c6799George Mount                    }
3834b4dbd225685502f4249c2bf25bf74f7ce526645George Mount                    case MSG_UPDATE_SHARE_URI: {
3844b4dbd225685502f4249c2bf25bf74f7ce526645George Mount                        if (mCurrentPhoto == message.obj) {
3854b4dbd225685502f4249c2bf25bf74f7ce526645George Mount                            boolean isPanorama360 = message.arg1 != 0;
3864b4dbd225685502f4249c2bf25bf74f7ce526645George Mount                            Uri contentUri = mCurrentPhoto.getContentUri();
3874b4dbd225685502f4249c2bf25bf74f7ce526645George Mount                            Intent panoramaIntent = null;
3884b4dbd225685502f4249c2bf25bf74f7ce526645George Mount                            if (isPanorama360) {
3894b4dbd225685502f4249c2bf25bf74f7ce526645George Mount                                panoramaIntent = createSharePanoramaIntent(contentUri);
3904b4dbd225685502f4249c2bf25bf74f7ce526645George Mount                            }
3914b4dbd225685502f4249c2bf25bf74f7ce526645George Mount                            Intent shareIntent = createShareIntent(mCurrentPhoto);
3924b4dbd225685502f4249c2bf25bf74f7ce526645George Mount
3934b4dbd225685502f4249c2bf25bf74f7ce526645George Mount                            mActionBar.setShareIntents(panoramaIntent, shareIntent);
3944b4dbd225685502f4249c2bf25bf74f7ce526645George Mount                            setNfcBeamPushUri(contentUri);
3954b4dbd225685502f4249c2bf25bf74f7ce526645George Mount                        }
3964b4dbd225685502f4249c2bf25bf74f7ce526645George Mount                        break;
3974b4dbd225685502f4249c2bf25bf74f7ce526645George Mount                    }
3984b4dbd225685502f4249c2bf25bf74f7ce526645George Mount                    case MSG_UPDATE_PANORAMA_UI: {
3994b4dbd225685502f4249c2bf25bf74f7ce526645George Mount                        if (mCurrentPhoto == message.obj) {
4004b4dbd225685502f4249c2bf25bf74f7ce526645George Mount                            boolean isPanorama360 = message.arg1 != 0;
4014b4dbd225685502f4249c2bf25bf74f7ce526645George Mount                            updatePanoramaUI(isPanorama360);
4024b4dbd225685502f4249c2bf25bf74f7ce526645George Mount                        }
4034b4dbd225685502f4249c2bf25bf74f7ce526645George Mount                        break;
4044b4dbd225685502f4249c2bf25bf74f7ce526645George Mount                    }
405d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu                    default: throw new AssertionError(message.what);
406d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu                }
407d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu            }
408d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu        };
409d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu
41084c220f10a643927c8a2126de8a755d8d7f7ec9eRay Chen        mSetPathString = data.getString(KEY_MEDIA_SET_PATH);
411b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang        mOriginalSetPathString = mSetPathString;
412ddf0225a5192a589fc578945f56440b09bf74d12John Reck        setupNfcBeamPush();
4137eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu        String itemPathString = data.getString(KEY_MEDIA_ITEM_PATH);
4147eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu        Path itemPath = itemPathString != null ?
4157eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu                Path.fromString(data.getString(KEY_MEDIA_ITEM_PATH)) :
4167eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu                    null;
41754fe6202b6f7d233e7645c121321fe0f3d20fc8bYuli Huang        mTreatBackAsUp = data.getBoolean(KEY_TREAT_BACK_AS_UP, false);
41845f089d69141e3fb0dfaad9bc34d275b61eb2aeeBobby Georgescu        mStartInFilmstrip = data.getBoolean(KEY_START_IN_FILMSTRIP, false);
4193ad7bbc55d7aaa0f36a7242fdd0f612d877adc19Bobby Georgescu        boolean inCameraRoll = data.getBoolean(KEY_IN_CAMERA_ROLL, false);
42045f089d69141e3fb0dfaad9bc34d275b61eb2aeeBobby Georgescu        mCurrentIndex = data.getInt(KEY_INDEX_HINT, 0);
42184c220f10a643927c8a2126de8a755d8d7f7ec9eRay Chen        if (mSetPathString != null) {
422ba65c373f244f6de0b45afa6b7cd711866f1bfe4Bobby Georgescu            mShowSpinner = true;
423bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang            mAppBridge = (AppBridge) data.getParcelable(KEY_APP_BRIDGE);
424bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang            if (mAppBridge != null) {
4257eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu                mShowBars = false;
4263ad7bbc55d7aaa0f36a7242fdd0f612d877adc19Bobby Georgescu                mHasCameraScreennailOrPlaceholder = true;
427253c5aec7692afdd7880fbd169d4b44d5679cbc0Chih-Chung Chang                mAppBridge.setServer(this);
428b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang
429bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang                // Get the ScreenNail from AppBridge and register it.
4303b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang                int id = SnailSource.newId();
431b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang                Path screenNailSetPath = SnailSource.getSetPath(id);
432bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang                Path screenNailItemPath = SnailSource.getItemPath(id);
4333b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang                mScreenNailSet = (SnailAlbum) mActivity.getDataManager()
4343b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang                        .getMediaObject(screenNailSetPath);
4353b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang                mScreenNailItem = (SnailItem) mActivity.getDataManager()
436bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang                        .getMediaObject(screenNailItemPath);
4373b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang                mScreenNailItem.setScreenNail(mAppBridge.attachScreenNail());
438b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang
43923e595f0c656ebaeb63f78e3018b5830628c5afeWu-cheng Li                if (data.getBoolean(KEY_SHOW_WHEN_LOCKED, false)) {
440efd480e85dc5bd0d2ca0ac82d03e141212388830Wu-cheng Li                    // Set the flag to be on top of the lock screen.
441efd480e85dc5bd0d2ca0ac82d03e141212388830Wu-cheng Li                    mFlags |= FLAG_SHOW_WHEN_LOCKED;
442a0ce682e40c39ce046c48d8a7f989fff01bb9f2cWu-cheng Li                }
443a0ce682e40c39ce046c48d8a7f989fff01bb9f2cWu-cheng Li
4444e091eb758a3ac1016b373419cea1ada1b977bc5George Mount                // Don't display "empty album" action item for capture intents.
4452c83c5f09aa79d81ee11da517fd62222f8c3337dWu-cheng Li                if (!mSetPathString.equals("/local/all/0")) {
4462c83c5f09aa79d81ee11da517fd62222f8c3337dWu-cheng Li                    // Check if the path is a secure album.
4472c83c5f09aa79d81ee11da517fd62222f8c3337dWu-cheng Li                    if (SecureSource.isSecurePath(mSetPathString)) {
4482c83c5f09aa79d81ee11da517fd62222f8c3337dWu-cheng Li                        mSecureAlbum = (SecureAlbum) mActivity.getDataManager()
4492c83c5f09aa79d81ee11da517fd62222f8c3337dWu-cheng Li                                .getMediaSet(mSetPathString);
4502c83c5f09aa79d81ee11da517fd62222f8c3337dWu-cheng Li                        mShowSpinner = false;
4512c83c5f09aa79d81ee11da517fd62222f8c3337dWu-cheng Li                    }
452c7e3c76d6965f520a9651d309052c5f01726cd58Bobby Georgescu                    mSetPathString = "/filter/empty/{"+mSetPathString+"}";
453c7e3c76d6965f520a9651d309052c5f01726cd58Bobby Georgescu                }
454c7e3c76d6965f520a9651d309052c5f01726cd58Bobby Georgescu
4553b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang                // Combine the original MediaSet with the one for ScreenNail
4563b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang                // from AppBridge.
457b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang                mSetPathString = "/combo/item/{" + screenNailSetPath +
458b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang                        "," + mSetPathString + "}";
459b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang
460b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang                // Start from the screen nail.
461bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang                itemPath = screenNailItemPath;
4623ad7bbc55d7aaa0f36a7242fdd0f612d877adc19Bobby Georgescu            } else if (inCameraRoll && GalleryUtils.isCameraAvailable(mActivity)) {
46345f089d69141e3fb0dfaad9bc34d275b61eb2aeeBobby Georgescu                mSetPathString = "/combo/item/{" + FilterSource.FILTER_CAMERA_SHORTCUT +
46445f089d69141e3fb0dfaad9bc34d275b61eb2aeeBobby Georgescu                        "," + mSetPathString + "}";
46545f089d69141e3fb0dfaad9bc34d275b61eb2aeeBobby Georgescu                mCurrentIndex++;
4663ad7bbc55d7aaa0f36a7242fdd0f612d877adc19Bobby Georgescu                mHasCameraScreennailOrPlaceholder = true;
467b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang            }
468b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang
4696118af9ddad8acc050133154f8f60c842c7f9bfaChih-Chung Chang            MediaSet originalSet = mActivity.getDataManager()
4706118af9ddad8acc050133154f8f60c842c7f9bfaChih-Chung Chang                    .getMediaSet(mSetPathString);
4713ad7bbc55d7aaa0f36a7242fdd0f612d877adc19Bobby Georgescu            if (mHasCameraScreennailOrPlaceholder && originalSet instanceof ComboAlbum) {
472ee899c09c88e5b054397ac44ad20e5055cd24f39Bobby Georgescu                // Use the name of the camera album rather than the default
473ee899c09c88e5b054397ac44ad20e5055cd24f39Bobby Georgescu                // ComboAlbum behavior
474ee899c09c88e5b054397ac44ad20e5055cd24f39Bobby Georgescu                ((ComboAlbum) originalSet).useNameOfChild(1);
475ee899c09c88e5b054397ac44ad20e5055cd24f39Bobby Georgescu            }
4766118af9ddad8acc050133154f8f60c842c7f9bfaChih-Chung Chang            mSelectionManager.setSourceMediaSet(originalSet);
4776b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang            mSetPathString = "/filter/delete/{" + mSetPathString + "}";
4786b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang            mMediaSet = (FilterDeleteSet) mActivity.getDataManager()
4796b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang                    .getMediaSet(mSetPathString);
480f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            if (mMediaSet == null) {
48184c220f10a643927c8a2126de8a755d8d7f7ec9eRay Chen                Log.w(TAG, "failed to restore " + mSetPathString);
482f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            }
4837eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu            if (itemPath == null) {
4843eb2e643a40d1be77998373343cdf8b14764f58cBobby Georgescu                int mediaItemCount = mMediaSet.getMediaItemCount();
4853eb2e643a40d1be77998373343cdf8b14764f58cBobby Georgescu                if (mediaItemCount > 0) {
4863eb2e643a40d1be77998373343cdf8b14764f58cBobby Georgescu                    if (mCurrentIndex >= mediaItemCount) mCurrentIndex = 0;
487d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu                    itemPath = mMediaSet.getMediaItem(mCurrentIndex, 1)
488d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu                        .get(0).getPath();
489d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu                } else {
4903eb2e643a40d1be77998373343cdf8b14764f58cBobby Georgescu                    // Bail out, PhotoPage can't load on an empty album
491d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu                    return;
492d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu                }
4937eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu            }
494f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            PhotoDataAdapter pda = new PhotoDataAdapter(
495bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang                    mActivity, mPhotoView, mMediaSet, itemPath, mCurrentIndex,
49643a80fd806247cb50e81bacda3ad21d210e9ae88Angus Kong                    mAppBridge == null ? -1 : 0,
497dbb6acc204ba6f095eb0e49e1298e9ceda2c3096Wu-cheng Li                    mAppBridge == null ? false : mAppBridge.isPanorama(),
498dbb6acc204ba6f095eb0e49e1298e9ceda2c3096Wu-cheng Li                    mAppBridge == null ? false : mAppBridge.isStaticCamera());
499f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            mModel = pda;
500f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            mPhotoView.setModel(mModel);
501f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
502f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            pda.setDataListener(new PhotoDataAdapter.DataListener() {
503f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
504113bfc77c4468411da9ae1290553c3be89f8df9aOwen Lin                @Override
505f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                public void onPhotoChanged(int index, Path item) {
50600ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu                    int oldIndex = mCurrentIndex;
507f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                    mCurrentIndex = index;
508b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu
5093ad7bbc55d7aaa0f36a7242fdd0f612d877adc19Bobby Georgescu                    if (mHasCameraScreennailOrPlaceholder) {
510b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu                        if (mCurrentIndex > 0) {
511b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu                            mSkipUpdateCurrentPhoto = false;
512b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu                        }
513b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu
51400ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu                        if (oldIndex == 0 && mCurrentIndex > 0
51500ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu                                && !mPhotoView.getFilmMode()) {
51600ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu                            mPhotoView.setFilmMode(true);
517b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu                        } else if (oldIndex == 2 && mCurrentIndex == 1) {
518b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu                            mCameraSwitchCutoff = SystemClock.uptimeMillis() +
519b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu                                    CAMERA_SWITCH_CUTOFF_THRESHOLD_MS;
520b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu                            mPhotoView.stopScrolling();
521bbc993162d687df20e2ff9a329bb9b6e04926ba8Bobby Georgescu                        } else if (oldIndex >= 1 && mCurrentIndex == 0) {
522f4e22eb44bfae0c2a3b6570f19480c8c3535d808Bobby Georgescu                            mPhotoView.setWantPictureCenterCallbacks(true);
523b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu                            mSkipUpdateCurrentPhoto = true;
52400ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu                        }
52500ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu                    }
526b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu                    if (!mSkipUpdateCurrentPhoto) {
527b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu                        if (item != null) {
528b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu                            MediaItem photo = mModel.getMediaItem(0);
529b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu                            if (photo != null) updateCurrentPhoto(photo);
530b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu                        }
531b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu                        updateBars();
532b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu                    }
53300ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu                    // Reset the timeout for the bars after a swipe
53400ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu                    refreshHidingMessage();
535f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                }
536f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
537f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                @Override
53805da3f520eacb9219964b6ed57ef37846d889fd7Hung-ying Tyan                public void onLoadingFinished(boolean loadingFailed) {
539f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                    if (!mModel.isEmpty()) {
540616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin                        MediaItem photo = mModel.getMediaItem(0);
541f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                        if (photo != null) updateCurrentPhoto(photo);
542f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                    } else if (mIsActive) {
543c370476adcf29f311ceec70a119792a0168781e9Chih-Chung Chang                        // We only want to finish the PhotoPage if there is no
544c370476adcf29f311ceec70a119792a0168781e9Chih-Chung Chang                        // deletion that the user can undo.
545c370476adcf29f311ceec70a119792a0168781e9Chih-Chung Chang                        if (mMediaSet.getNumberOfDeletions() == 0) {
546c370476adcf29f311ceec70a119792a0168781e9Chih-Chung Chang                            mActivity.getStateManager().finishState(
547c370476adcf29f311ceec70a119792a0168781e9Chih-Chung Chang                                    PhotoPage.this);
548c370476adcf29f311ceec70a119792a0168781e9Chih-Chung Chang                        }
549f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                    }
550f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                }
551f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
552f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                @Override
553f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                public void onLoadingStarted() {
554f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                }
555f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            });
556f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        } else {
557f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            // Get default media set by the URI
558f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            MediaItem mediaItem = (MediaItem)
559f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                    mActivity.getDataManager().getMediaObject(itemPath);
560f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            mModel = new SinglePhotoDataAdapter(mActivity, mPhotoView, mediaItem);
561f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            mPhotoView.setModel(mModel);
562f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            updateCurrentPhoto(mediaItem);
563ba65c373f244f6de0b45afa6b7cd711866f1bfe4Bobby Georgescu            mShowSpinner = false;
564f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
565cf46a3abc26aac7cdb6b6993aeade053304b71d9Ray Chen
566b265ebb01cc046b74329eeb28dbecb24e0f953d2Bobby Georgescu        mPhotoView.setFilmMode(mStartInFilmstrip && mMediaSet.getMediaItemCount() > 1);
567f122d56e15e00928d731751796b0509ae47c6799George Mount        RelativeLayout galleryRoot = (RelativeLayout) ((Activity) mActivity)
568f122d56e15e00928d731751796b0509ae47c6799George Mount                .findViewById(mAppBridge != null ? R.id.content : R.id.gallery_root);
569f122d56e15e00928d731751796b0509ae47c6799George Mount        if (galleryRoot != null) {
570f122d56e15e00928d731751796b0509ae47c6799George Mount            if (mSecureAlbum == null) {
571f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu                mBottomControls = new PhotoPageBottomControls(this, mActivity, galleryRoot);
572f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu            }
573f122d56e15e00928d731751796b0509ae47c6799George Mount            StitchingProgressManager progressManager = mApplication.getStitchingProgressManager();
574f122d56e15e00928d731751796b0509ae47c6799George Mount            if (progressManager != null) {
575f122d56e15e00928d731751796b0509ae47c6799George Mount                mProgressBar = new PhotoPageProgressBar(mActivity, galleryRoot);
576f122d56e15e00928d731751796b0509ae47c6799George Mount                mProgressListener = new UpdateProgressListener();
577f122d56e15e00928d731751796b0509ae47c6799George Mount                progressManager.addChangeListener(mProgressListener);
578294b9945e01ec41c1e9e58dfcd5d6e106ee2d538Wu-cheng Li                if (mSecureAlbum != null) {
579294b9945e01ec41c1e9e58dfcd5d6e106ee2d538Wu-cheng Li                    progressManager.addChangeListener(mSecureAlbum);
580294b9945e01ec41c1e9e58dfcd5d6e106ee2d538Wu-cheng Li                }
581f122d56e15e00928d731751796b0509ae47c6799George Mount            }
582f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu        }
583a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu    }
584a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu
585e3b50f1bfcfa5c8729f31788eac1a6109a88988bSascha Haeberling    @Override
586f4e22eb44bfae0c2a3b6570f19480c8c3535d808Bobby Georgescu    public void onPictureCenter(boolean isCamera) {
5873ad7bbc55d7aaa0f36a7242fdd0f612d877adc19Bobby Georgescu        isCamera = isCamera || (mHasCameraScreennailOrPlaceholder && mAppBridge == null);
588f4e22eb44bfae0c2a3b6570f19480c8c3535d808Bobby Georgescu        mPhotoView.setWantPictureCenterCallbacks(false);
589f4e22eb44bfae0c2a3b6570f19480c8c3535d808Bobby Georgescu        mHandler.removeMessages(MSG_ON_CAMERA_CENTER);
590f4e22eb44bfae0c2a3b6570f19480c8c3535d808Bobby Georgescu        mHandler.removeMessages(MSG_ON_PICTURE_CENTER);
591f4e22eb44bfae0c2a3b6570f19480c8c3535d808Bobby Georgescu        mHandler.sendEmptyMessage(isCamera ? MSG_ON_CAMERA_CENTER : MSG_ON_PICTURE_CENTER);
592b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu    }
593b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu
594e3b50f1bfcfa5c8729f31788eac1a6109a88988bSascha Haeberling    @Override
595f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu    public boolean canDisplayBottomControls() {
596949584340c9f5f41a6133ba06058af280490f0c8Bobby Georgescu        return mIsActive && !mPhotoView.canUndo();
597a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu    }
598a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu
599e3b50f1bfcfa5c8729f31788eac1a6109a88988bSascha Haeberling    @Override
600a680a0c32ae3321c632288b36083f2782af2c55bDoris Liu    public boolean canDisplayBottomControl(int control) {
6014b4dbd225685502f4249c2bf25bf74f7ce526645George Mount        if (mCurrentPhoto == null) {
6024b4dbd225685502f4249c2bf25bf74f7ce526645George Mount            return false;
6034b4dbd225685502f4249c2bf25bf74f7ce526645George Mount        }
604f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu        switch(control) {
605f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu            case R.id.photopage_bottom_control_edit:
606d2724f69edf39cf2019eac1b49f316d22ab70d0aBobby Georgescu                return mHaveImageEditor && mShowBars
607c02be7d6224c0b4e81c86e19c3d101ea070c7e1dBobby Georgescu                        && !mPhotoView.getFilmMode()
6084b4dbd225685502f4249c2bf25bf74f7ce526645George Mount                        && (mCurrentPhoto.getSupportedOperations() & MediaItem.SUPPORT_EDIT) != 0
6094b4dbd225685502f4249c2bf25bf74f7ce526645George Mount                        && mCurrentPhoto.getMediaType() == MediaObject.MEDIA_TYPE_IMAGE;
610f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu            case R.id.photopage_bottom_control_panorama:
611a680a0c32ae3321c632288b36083f2782af2c55bDoris Liu                return mIsPanorama;
612a680a0c32ae3321c632288b36083f2782af2c55bDoris Liu            case R.id.photopage_bottom_control_tiny_planet:
613a680a0c32ae3321c632288b36083f2782af2c55bDoris Liu                return mHaveImageEditor && mShowBars
614c02be7d6224c0b4e81c86e19c3d101ea070c7e1dBobby Georgescu                        && mIsPanorama360 && !mPhotoView.getFilmMode();
615f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu            default:
616f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu                return false;
617f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu        }
618a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu    }
619a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu
620e3b50f1bfcfa5c8729f31788eac1a6109a88988bSascha Haeberling    @Override
621f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu    public void onBottomControlClicked(int control) {
622f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu        switch(control) {
623f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu            case R.id.photopage_bottom_control_edit:
624f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu                launchPhotoEditor();
625f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu                return;
626f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu            case R.id.photopage_bottom_control_panorama:
627e3b50f1bfcfa5c8729f31788eac1a6109a88988bSascha Haeberling                mActivity.getPanoramaViewHelper()
628e3b50f1bfcfa5c8729f31788eac1a6109a88988bSascha Haeberling                        .showPanorama(mCurrentPhoto.getContentUri());
629f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu                return;
630a680a0c32ae3321c632288b36083f2782af2c55bDoris Liu            case R.id.photopage_bottom_control_tiny_planet:
631a680a0c32ae3321c632288b36083f2782af2c55bDoris Liu                launchTinyPlanet();
632a680a0c32ae3321c632288b36083f2782af2c55bDoris Liu                return;
633f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu            default:
634f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu                return;
635a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu        }
636f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
637f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
6386772173d2a49b87a1d209f42fe52b5f830596f99Chih-Chung Chang    @TargetApi(ApiHelper.VERSION_CODES.JELLY_BEAN)
639ddf0225a5192a589fc578945f56440b09bf74d12John Reck    private void setupNfcBeamPush() {
640ddf0225a5192a589fc578945f56440b09bf74d12John Reck        if (!ApiHelper.HAS_SET_BEAM_PUSH_URIS) return;
641ddf0225a5192a589fc578945f56440b09bf74d12John Reck
642ddf0225a5192a589fc578945f56440b09bf74d12John Reck        NfcAdapter adapter = NfcAdapter.getDefaultAdapter(mActivity);
643ddf0225a5192a589fc578945f56440b09bf74d12John Reck        if (adapter != null) {
6442619f20d30123a391cc6d37515fe8eb9d81d5029John Reck            adapter.setBeamPushUris(null, mActivity);
645ddf0225a5192a589fc578945f56440b09bf74d12John Reck            adapter.setBeamPushUrisCallback(new CreateBeamUrisCallback() {
646ddf0225a5192a589fc578945f56440b09bf74d12John Reck                @Override
647ddf0225a5192a589fc578945f56440b09bf74d12John Reck                public Uri[] createBeamUris(NfcEvent event) {
648ddf0225a5192a589fc578945f56440b09bf74d12John Reck                    return mNfcPushUris;
649ddf0225a5192a589fc578945f56440b09bf74d12John Reck                }
650ddf0225a5192a589fc578945f56440b09bf74d12John Reck            }, mActivity);
651fc86994f86f8cfb31e151c9e730dc1e9dc7b3349Yuli Huang        }
652fc86994f86f8cfb31e151c9e730dc1e9dc7b3349Yuli Huang    }
653fc86994f86f8cfb31e151c9e730dc1e9dc7b3349Yuli Huang
654ddf0225a5192a589fc578945f56440b09bf74d12John Reck    private void setNfcBeamPushUri(Uri uri) {
655ddf0225a5192a589fc578945f56440b09bf74d12John Reck        mNfcPushUris[0] = uri;
656ddf0225a5192a589fc578945f56440b09bf74d12John Reck    }
657ddf0225a5192a589fc578945f56440b09bf74d12John Reck
6584b4dbd225685502f4249c2bf25bf74f7ce526645George Mount    private static Intent createShareIntent(MediaObject mediaObject) {
6594b4dbd225685502f4249c2bf25bf74f7ce526645George Mount        int type = mediaObject.getMediaType();
660ca181a68a30ad830d55eb8886f62a323c64e1ba3Owen Lin        return new Intent(Intent.ACTION_SEND)
661ca181a68a30ad830d55eb8886f62a323c64e1ba3Owen Lin                .setType(MenuExecutor.getMimeType(type))
6624b4dbd225685502f4249c2bf25bf74f7ce526645George Mount                .putExtra(Intent.EXTRA_STREAM, mediaObject.getContentUri())
663ca181a68a30ad830d55eb8886f62a323c64e1ba3Owen Lin                .addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
6645172dee697c05235ddf932827d75e6fa0b81d382Mangesh Ghiware    }
665fb5571987f2555b04731b6f3e1c479efc16d542aWu-cheng Li
6664b4dbd225685502f4249c2bf25bf74f7ce526645George Mount    private static Intent createSharePanoramaIntent(Uri contentUri) {
667ca181a68a30ad830d55eb8886f62a323c64e1ba3Owen Lin        return new Intent(Intent.ACTION_SEND)
668ca181a68a30ad830d55eb8886f62a323c64e1ba3Owen Lin                .setType(GalleryUtils.MIME_TYPE_PANORAMA360)
6694b4dbd225685502f4249c2bf25bf74f7ce526645George Mount                .putExtra(Intent.EXTRA_STREAM, contentUri)
670ca181a68a30ad830d55eb8886f62a323c64e1ba3Owen Lin                .addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
671fb5571987f2555b04731b6f3e1c479efc16d542aWu-cheng Li    }
672fb5571987f2555b04731b6f3e1c479efc16d542aWu-cheng Li
67348129f36b96928b34e657cdc976c1ac19f7b5ad2Bobby Georgescu    private void overrideTransitionToEditor() {
67448129f36b96928b34e657cdc976c1ac19f7b5ad2Bobby Georgescu        ((Activity) mActivity).overridePendingTransition(android.R.anim.slide_in_left,
67548129f36b96928b34e657cdc976c1ac19f7b5ad2Bobby Georgescu                android.R.anim.fade_out);
67648129f36b96928b34e657cdc976c1ac19f7b5ad2Bobby Georgescu    }
67748129f36b96928b34e657cdc976c1ac19f7b5ad2Bobby Georgescu
678a680a0c32ae3321c632288b36083f2782af2c55bDoris Liu    private void launchTinyPlanet() {
679a680a0c32ae3321c632288b36083f2782af2c55bDoris Liu        // Deep link into tiny planet
680a680a0c32ae3321c632288b36083f2782af2c55bDoris Liu        MediaItem current = mModel.getMediaItem(0);
681a680a0c32ae3321c632288b36083f2782af2c55bDoris Liu        Intent intent = new Intent(FilterShowActivity.TINY_PLANET_ACTION);
682a680a0c32ae3321c632288b36083f2782af2c55bDoris Liu        intent.setClass(mActivity, FilterShowActivity.class);
683a680a0c32ae3321c632288b36083f2782af2c55bDoris Liu        intent.setDataAndType(current.getContentUri(), current.getMimeType())
684a680a0c32ae3321c632288b36083f2782af2c55bDoris Liu            .setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
685a850a543225e9f7a72c5a49bb6099573c7efda13Bobby Georgescu        intent.putExtra(FilterShowActivity.LAUNCH_FULLSCREEN,
686a850a543225e9f7a72c5a49bb6099573c7efda13Bobby Georgescu                mActivity.isFullscreen());
687a680a0c32ae3321c632288b36083f2782af2c55bDoris Liu        mActivity.startActivityForResult(intent, REQUEST_EDIT);
68848129f36b96928b34e657cdc976c1ac19f7b5ad2Bobby Georgescu        overrideTransitionToEditor();
689a680a0c32ae3321c632288b36083f2782af2c55bDoris Liu    }
690a680a0c32ae3321c632288b36083f2782af2c55bDoris Liu
6915bd00332556b20c141b5c7f16433d55b1bc7fe0fBobby Georgescu    private void launchCamera() {
6929ec5de9dbf46caecd2f0b38a72d31fa37ecb0466Bobby Georgescu        Intent intent = new Intent(mActivity, CameraActivity.class)
6939ec5de9dbf46caecd2f0b38a72d31fa37ecb0466Bobby Georgescu            .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
6945bd00332556b20c141b5c7f16433d55b1bc7fe0fBobby Georgescu        mRecenterCameraOnResume = false;
6955bd00332556b20c141b5c7f16433d55b1bc7fe0fBobby Georgescu        mActivity.startActivity(intent);
6965bd00332556b20c141b5c7f16433d55b1bc7fe0fBobby Georgescu    }
6975bd00332556b20c141b5c7f16433d55b1bc7fe0fBobby Georgescu
698a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu    private void launchPhotoEditor() {
699a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu        MediaItem current = mModel.getMediaItem(0);
700462923e5800e151ab5ec450063334ba430c1da3aBobby Georgescu        if (current == null || (current.getSupportedOperations()
701462923e5800e151ab5ec450063334ba430c1da3aBobby Georgescu                & MediaObject.SUPPORT_EDIT) == 0) {
702462923e5800e151ab5ec450063334ba430c1da3aBobby Georgescu            return;
703462923e5800e151ab5ec450063334ba430c1da3aBobby Georgescu        }
704a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu
705a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu        Intent intent = new Intent(ACTION_NEXTGEN_EDIT);
706b6692653af5dbce477f33df721aa6177fabeda4bOwen Lin
707b6692653af5dbce477f33df721aa6177fabeda4bOwen Lin        intent.setDataAndType(current.getContentUri(), current.getMimeType())
708b6692653af5dbce477f33df721aa6177fabeda4bOwen Lin                .setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
709a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu        if (mActivity.getPackageManager()
710a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu                .queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY).size() == 0) {
711a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu            intent.setAction(Intent.ACTION_EDIT);
712a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu        }
713a850a543225e9f7a72c5a49bb6099573c7efda13Bobby Georgescu        intent.putExtra(FilterShowActivity.LAUNCH_FULLSCREEN,
714a850a543225e9f7a72c5a49bb6099573c7efda13Bobby Georgescu                mActivity.isFullscreen());
715a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu        ((Activity) mActivity).startActivityForResult(Intent.createChooser(intent, null),
716a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu                REQUEST_EDIT);
71748129f36b96928b34e657cdc976c1ac19f7b5ad2Bobby Georgescu        overrideTransitionToEditor();
718a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu    }
719a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu
720e23a9d412cba5a202405e1c99c0cf080949db2c7Bobby Georgescu    private void requestDeferredUpdate() {
721e23a9d412cba5a202405e1c99c0cf080949db2c7Bobby Georgescu        mDeferUpdateUntil = SystemClock.uptimeMillis() + DEFERRED_UPDATE_MS;
722e23a9d412cba5a202405e1c99c0cf080949db2c7Bobby Georgescu        if (!mDeferredUpdateWaiting) {
723e23a9d412cba5a202405e1c99c0cf080949db2c7Bobby Georgescu            mDeferredUpdateWaiting = true;
724e23a9d412cba5a202405e1c99c0cf080949db2c7Bobby Georgescu            mHandler.sendEmptyMessageDelayed(MSG_UPDATE_DEFERRED, DEFERRED_UPDATE_MS);
725e23a9d412cba5a202405e1c99c0cf080949db2c7Bobby Georgescu        }
726e23a9d412cba5a202405e1c99c0cf080949db2c7Bobby Georgescu    }
727e23a9d412cba5a202405e1c99c0cf080949db2c7Bobby Georgescu
728e23a9d412cba5a202405e1c99c0cf080949db2c7Bobby Georgescu    private void updateUIForCurrentPhoto() {
729f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        if (mCurrentPhoto == null) return;
730c7e3c76d6965f520a9651d309052c5f01726cd58Bobby Georgescu
731c7e3c76d6965f520a9651d309052c5f01726cd58Bobby Georgescu        // If by swiping or deletion the user ends up on an action item
732c7e3c76d6965f520a9651d309052c5f01726cd58Bobby Georgescu        // and zoomed in, zoom out so that the context of the action is
733c7e3c76d6965f520a9651d309052c5f01726cd58Bobby Georgescu        // more clear
734e23a9d412cba5a202405e1c99c0cf080949db2c7Bobby Georgescu        if ((mCurrentPhoto.getSupportedOperations() & MediaObject.SUPPORT_ACTION) != 0
735c7e3c76d6965f520a9651d309052c5f01726cd58Bobby Georgescu                && !mPhotoView.getFilmMode()) {
736f4e22eb44bfae0c2a3b6570f19480c8c3535d808Bobby Georgescu            mPhotoView.setWantPictureCenterCallbacks(true);
737c7e3c76d6965f520a9651d309052c5f01726cd58Bobby Georgescu        }
738c7e3c76d6965f520a9651d309052c5f01726cd58Bobby Georgescu
739f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        updateMenuOperations();
7404b4dbd225685502f4249c2bf25bf74f7ce526645George Mount        refreshBottomControlsWhenReady();
741f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        if (mShowDetails) {
742995c4566bed7df1aa48ba7e1351f964efa73880bMichael Kolb            mDetailsHelper.reloadDetails();
743f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
744898a2f4540635528a0916b0a6b0a177869854ae9Wu-cheng Li        if ((mSecureAlbum == null)
745e23a9d412cba5a202405e1c99c0cf080949db2c7Bobby Georgescu                && (mCurrentPhoto.getSupportedOperations() & MediaItem.SUPPORT_SHARE) != 0) {
7464b4dbd225685502f4249c2bf25bf74f7ce526645George Mount            mCurrentPhoto.getPanoramaSupport(mUpdateShareURICallback);
747e23a9d412cba5a202405e1c99c0cf080949db2c7Bobby Georgescu        }
748825afb1b3e7d15b5c258d664ee008dc68da1c407Mangesh Ghiware        updateProgressBar();
749e23a9d412cba5a202405e1c99c0cf080949db2c7Bobby Georgescu    }
750e23a9d412cba5a202405e1c99c0cf080949db2c7Bobby Georgescu
751e23a9d412cba5a202405e1c99c0cf080949db2c7Bobby Georgescu    private void updateCurrentPhoto(MediaItem photo) {
752e23a9d412cba5a202405e1c99c0cf080949db2c7Bobby Georgescu        if (mCurrentPhoto == photo) return;
753e23a9d412cba5a202405e1c99c0cf080949db2c7Bobby Georgescu        mCurrentPhoto = photo;
754e23a9d412cba5a202405e1c99c0cf080949db2c7Bobby Georgescu        if (mPhotoView.getFilmMode()) {
755e23a9d412cba5a202405e1c99c0cf080949db2c7Bobby Georgescu            requestDeferredUpdate();
756e23a9d412cba5a202405e1c99c0cf080949db2c7Bobby Georgescu        } else {
757e23a9d412cba5a202405e1c99c0cf080949db2c7Bobby Georgescu            updateUIForCurrentPhoto();
75815b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang        }
759825afb1b3e7d15b5c258d664ee008dc68da1c407Mangesh Ghiware    }
760825afb1b3e7d15b5c258d664ee008dc68da1c407Mangesh Ghiware
761825afb1b3e7d15b5c258d664ee008dc68da1c407Mangesh Ghiware    private void updateProgressBar() {
762785a1f8a5856b199f6553a92020e77621516c608George Mount        if (mProgressBar != null) {
763785a1f8a5856b199f6553a92020e77621516c608George Mount            mProgressBar.hideProgress();
764785a1f8a5856b199f6553a92020e77621516c608George Mount            StitchingProgressManager progressManager = mApplication.getStitchingProgressManager();
765785a1f8a5856b199f6553a92020e77621516c608George Mount            if (progressManager != null && mCurrentPhoto instanceof LocalImage) {
766825afb1b3e7d15b5c258d664ee008dc68da1c407Mangesh Ghiware                Integer progress = progressManager.getProgress(mCurrentPhoto.getContentUri());
767785a1f8a5856b199f6553a92020e77621516c608George Mount                if (progress != null) {
768785a1f8a5856b199f6553a92020e77621516c608George Mount                    mProgressBar.setProgress(progress);
769785a1f8a5856b199f6553a92020e77621516c608George Mount                }
770f122d56e15e00928d731751796b0509ae47c6799George Mount            }
771f122d56e15e00928d731751796b0509ae47c6799George Mount        }
772f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
773f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
774f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private void updateMenuOperations() {
77524081fe26ca25448ddb9c8f9cc7f406d26344decOwen Lin        Menu menu = mActionBar.getMenu();
77624081fe26ca25448ddb9c8f9cc7f406d26344decOwen Lin
77724081fe26ca25448ddb9c8f9cc7f406d26344decOwen Lin        // it could be null if onCreateActionBar has not been called yet
77824081fe26ca25448ddb9c8f9cc7f406d26344decOwen Lin        if (menu == null) return;
77924081fe26ca25448ddb9c8f9cc7f406d26344decOwen Lin
78024081fe26ca25448ddb9c8f9cc7f406d26344decOwen Lin        MenuItem item = menu.findItem(R.id.action_slideshow);
78153fe9f72433f2fdae30e1708c5933390202cbcf5John Reck        if (item != null) {
78253fe9f72433f2fdae30e1708c5933390202cbcf5John Reck            item.setVisible((mSecureAlbum == null) && canDoSlideShow());
78353fe9f72433f2fdae30e1708c5933390202cbcf5John Reck        }
7842066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang        if (mCurrentPhoto == null) return;
78524081fe26ca25448ddb9c8f9cc7f406d26344decOwen Lin
786f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        int supportedOperations = mCurrentPhoto.getSupportedOperations();
787898a2f4540635528a0916b0a6b0a177869854ae9Wu-cheng Li        if (mSecureAlbum != null) {
78824081fe26ca25448ddb9c8f9cc7f406d26344decOwen Lin            supportedOperations &= MediaObject.SUPPORT_DELETE;
7898fe22ecb8e744a09a2e0d867f876ecbf74c82298John Reck        } else if (!mHaveImageEditor) {
790f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            supportedOperations &= ~MediaObject.SUPPORT_EDIT;
791f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
79224081fe26ca25448ddb9c8f9cc7f406d26344decOwen Lin        MenuExecutor.updateMenuOperation(menu, supportedOperations);
7934b4dbd225685502f4249c2bf25bf74f7ce526645George Mount        mCurrentPhoto.getPanoramaSupport(mUpdatePanoramaMenuItemsCallback);
794f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
795f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
7962066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang    private boolean canDoSlideShow() {
7972066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang        if (mMediaSet == null || mCurrentPhoto == null) {
7982066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang            return false;
7992066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang        }
8002066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang        if (mCurrentPhoto.getMediaType() != MediaObject.MEDIA_TYPE_IMAGE) {
8012066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang            return false;
8022066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang        }
8036b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang        if (MtpSource.isMtpPath(mOriginalSetPathString)) {
8042066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang            return false;
8052066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang        }
8062066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang        return true;
8072066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang    }
8082066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang
80961f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang    //////////////////////////////////////////////////////////////////////////
81061f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang    //  Action Bar show/hide management
81161f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang    //////////////////////////////////////////////////////////////////////////
81261f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang
813f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private void showBars() {
814f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        if (mShowBars) return;
815f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mShowBars = true;
816e6251df06f0b3c8f556043f8b725b4b19be7474dChih-Chung Chang        mOrientationManager.unlockOrientation();
817f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mActionBar.show();
8180b2486cff0c1b951c54325596256b986307f7f3aChih-Chung Chang        mActivity.getGLRoot().setLightsOutMode(false);
81961f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang        refreshHidingMessage();
8204b4dbd225685502f4249c2bf25bf74f7ce526645George Mount        refreshBottomControlsWhenReady();
821f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
822f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
823f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private void hideBars() {
824f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        if (!mShowBars) return;
825f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mShowBars = false;
826f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mActionBar.hide();
8270b2486cff0c1b951c54325596256b986307f7f3aChih-Chung Chang        mActivity.getGLRoot().setLightsOutMode(true);
82861f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang        mHandler.removeMessages(MSG_HIDE_BARS);
8294b4dbd225685502f4249c2bf25bf74f7ce526645George Mount        refreshBottomControlsWhenReady();
830f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
831f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
832f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private void refreshHidingMessage() {
833f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mHandler.removeMessages(MSG_HIDE_BARS);
8347eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu        if (!mIsMenuVisible && !mPhotoView.getFilmMode()) {
835f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            mHandler.sendEmptyMessageDelayed(MSG_HIDE_BARS, HIDE_BARS_TIMEOUT);
836f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
837f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
838f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
839aeb3062e84ed28f0e25a73f511f287ae0a3e4294Chih-Chung Chang    private boolean canShowBars() {
840aeb3062e84ed28f0e25a73f511f287ae0a3e4294Chih-Chung Chang        // No bars if we are showing camera preview.
84156bdcb7272f222fde5e4c6fc133cb490b31c7667Bobby Georgescu        if (mAppBridge != null && mCurrentIndex == 0
84256bdcb7272f222fde5e4c6fc133cb490b31c7667Bobby Georgescu                && !mPhotoView.getFilmMode()) return false;
84356bdcb7272f222fde5e4c6fc133cb490b31c7667Bobby Georgescu
844aeb3062e84ed28f0e25a73f511f287ae0a3e4294Chih-Chung Chang        // No bars if it's not allowed.
845aeb3062e84ed28f0e25a73f511f287ae0a3e4294Chih-Chung Chang        if (!mActionBarAllowed) return false;
846aeb3062e84ed28f0e25a73f511f287ae0a3e4294Chih-Chung Chang
847aeb3062e84ed28f0e25a73f511f287ae0a3e4294Chih-Chung Chang        return true;
848aeb3062e84ed28f0e25a73f511f287ae0a3e4294Chih-Chung Chang    }
849aeb3062e84ed28f0e25a73f511f287ae0a3e4294Chih-Chung Chang
850e6251df06f0b3c8f556043f8b725b4b19be7474dChih-Chung Chang    private void wantBars() {
851e6251df06f0b3c8f556043f8b725b4b19be7474dChih-Chung Chang        if (canShowBars()) showBars();
852e6251df06f0b3c8f556043f8b725b4b19be7474dChih-Chung Chang    }
853e6251df06f0b3c8f556043f8b725b4b19be7474dChih-Chung Chang
85461f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang    private void toggleBars() {
855f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        if (mShowBars) {
856f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            hideBars();
857aeb3062e84ed28f0e25a73f511f287ae0a3e4294Chih-Chung Chang        } else {
858e6251df06f0b3c8f556043f8b725b4b19be7474dChih-Chung Chang            if (canShowBars()) showBars();
859f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
860f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
861f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
86261f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang    private void updateBars() {
863e6251df06f0b3c8f556043f8b725b4b19be7474dChih-Chung Chang        if (!canShowBars()) {
86461f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang            hideBars();
86561f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang        }
866f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
867f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
868f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    @Override
869f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    protected void onBackPressed() {
870f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        if (mShowDetails) {
871f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            hideDetails();
8723b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang        } else if (mAppBridge == null || !switchWithCaptureAnimation(-1)) {
873bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang            // We are leaving this page. Set the result now.
874bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang            setResult();
8757eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu            if (mStartInFilmstrip && !mPhotoView.getFilmMode()) {
8767eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu                mPhotoView.setFilmMode(true);
8777eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu            } else if (mTreatBackAsUp) {
87854fe6202b6f7d233e7645c121321fe0f3d20fc8bYuli Huang                onUpPressed();
87954fe6202b6f7d233e7645c121321fe0f3d20fc8bYuli Huang            } else {
88054fe6202b6f7d233e7645c121321fe0f3d20fc8bYuli Huang                super.onBackPressed();
88154fe6202b6f7d233e7645c121321fe0f3d20fc8bYuli Huang            }
882f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
883f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
884f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
885b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang    private void onUpPressed() {
886833f775afc9515567dc5aaf0cafe20e006e77545Bobby Georgescu        if ((mStartInFilmstrip || mAppBridge != null)
887833f775afc9515567dc5aaf0cafe20e006e77545Bobby Georgescu                && !mPhotoView.getFilmMode()) {
8887eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu            mPhotoView.setFilmMode(true);
8897eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu            return;
8907eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu        }
8917eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu
892b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang        if (mActivity.getStateManager().getStateCount() > 1) {
8937eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu            setResult();
894b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang            super.onBackPressed();
895ba12eae90b5b1a80ee002aa0df8c5c5189c4faa3Chih-Chung Chang            return;
89666ca848b2f58b813d366642088d274a1b7c4a90cChih-Chung Chang        }
89766ca848b2f58b813d366642088d274a1b7c4a90cChih-Chung Chang
89866ca848b2f58b813d366642088d274a1b7c4a90cChih-Chung Chang        if (mOriginalSetPathString == null) return;
89966ca848b2f58b813d366642088d274a1b7c4a90cChih-Chung Chang
90066ca848b2f58b813d366642088d274a1b7c4a90cChih-Chung Chang        if (mAppBridge == null) {
901b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang            // We're in view mode so set up the stacks on our own.
902b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang            Bundle data = new Bundle(getData());
903b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang            data.putString(AlbumPage.KEY_MEDIA_PATH, mOriginalSetPathString);
904b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang            data.putString(AlbumPage.KEY_PARENT_MEDIA_PATH,
905b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang                    mActivity.getDataManager().getTopSetPath(
906b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang                            DataManager.INCLUDE_ALL));
907b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang            mActivity.getStateManager().switchState(this, AlbumPage.class, data);
90866ca848b2f58b813d366642088d274a1b7c4a90cChih-Chung Chang        } else {
909833f775afc9515567dc5aaf0cafe20e006e77545Bobby Georgescu            GalleryUtils.startGalleryActivity(mActivity);
910b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang        }
911b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang    }
912b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang
913bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    private void setResult() {
914bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang        Intent result = null;
9157eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu        result = new Intent();
9167eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu        result.putExtra(KEY_RETURN_INDEX_HINT, mCurrentIndex);
917bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang        setStateResult(Activity.RESULT_OK, result);
918bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    }
919bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang
920bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    //////////////////////////////////////////////////////////////////////////
921bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    //  AppBridge.Server interface
922bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    //////////////////////////////////////////////////////////////////////////
923bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang
924bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    @Override
9252ef46ed28b28b355d7f3f1432c7b1196b832a859Chih-Chung Chang    public void setCameraRelativeFrame(Rect frame) {
9262ef46ed28b28b355d7f3f1432c7b1196b832a859Chih-Chung Chang        mPhotoView.setCameraRelativeFrame(frame);
927bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    }
928bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang
929bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    @Override
9302c6173822a612597c79be41b126367ddfbb5d518Chih-Chung Chang    public boolean switchWithCaptureAnimation(int offset) {
9312c6173822a612597c79be41b126367ddfbb5d518Chih-Chung Chang        return mPhotoView.switchWithCaptureAnimation(offset);
9322c6173822a612597c79be41b126367ddfbb5d518Chih-Chung Chang    }
9332c6173822a612597c79be41b126367ddfbb5d518Chih-Chung Chang
934f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    @Override
9356575794a9c09f22d5721e212c093e0a2df376d0cChih-Chung Chang    public void setSwipingEnabled(boolean enabled) {
9366575794a9c09f22d5721e212c093e0a2df376d0cChih-Chung Chang        mPhotoView.setSwipingEnabled(enabled);
9376575794a9c09f22d5721e212c093e0a2df376d0cChih-Chung Chang    }
9386575794a9c09f22d5721e212c093e0a2df376d0cChih-Chung Chang
9396575794a9c09f22d5721e212c093e0a2df376d0cChih-Chung Chang    @Override
9403b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang    public void notifyScreenNailChanged() {
9413b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang        mScreenNailItem.setScreenNail(mAppBridge.attachScreenNail());
9423b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang        mScreenNailSet.notifyChange();
9433b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang    }
9443b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang
9453b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang    @Override
946a0ce682e40c39ce046c48d8a7f989fff01bb9f2cWu-cheng Li    public void addSecureAlbumItem(boolean isVideo, int id) {
947a0ce682e40c39ce046c48d8a7f989fff01bb9f2cWu-cheng Li        mSecureAlbum.addMediaItem(isVideo, id);
948a0ce682e40c39ce046c48d8a7f989fff01bb9f2cWu-cheng Li    }
949a0ce682e40c39ce046c48d8a7f989fff01bb9f2cWu-cheng Li
950a0ce682e40c39ce046c48d8a7f989fff01bb9f2cWu-cheng Li    @Override
951f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    protected boolean onCreateActionBar(Menu menu) {
952b21b8e58a604f6c701245d84b141b5b87663192bOwen Lin        mActionBar.createActionBarMenu(R.menu.photo, menu);
9538fe22ecb8e744a09a2e0d867f876ecbf74c82298John Reck        mHaveImageEditor = GalleryUtils.isEditorAvailable(mActivity, "image/*");
954f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        updateMenuOperations();
9553cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu        mActionBar.setTitle(mMediaSet != null ? mMediaSet.getName() : "");
956b21b8e58a604f6c701245d84b141b5b87663192bOwen Lin        return true;
957f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
958f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
959d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin    private MenuExecutor.ProgressListener mConfirmDialogListener =
960d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin            new MenuExecutor.ProgressListener() {
961d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin        @Override
962d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin        public void onProgressUpdate(int index) {}
963d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin
964d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin        @Override
965d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin        public void onProgressComplete(int result) {}
966d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin
967d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin        @Override
968d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin        public void onConfirmDialogShown() {
969d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin            mHandler.removeMessages(MSG_HIDE_BARS);
970d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin        }
971d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin
972d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin        @Override
973d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin        public void onConfirmDialogDismissed(boolean confirmed) {
974d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin            refreshHidingMessage();
975d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin        }
976ba50b9420e64731fd5aa8b1410e1f36457a1635aBobby Georgescu
977ba50b9420e64731fd5aa8b1410e1f36457a1635aBobby Georgescu        @Override
978ba50b9420e64731fd5aa8b1410e1f36457a1635aBobby Georgescu        public void onProgressStart() {}
979d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin    };
980d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin
9813cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu    private void switchToGrid() {
9825585826e68c62c3719fb346d40fd1999438c6c6bBobby Georgescu        if (mActivity.getStateManager().hasStateClass(AlbumPage.class)) {
9833cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu            onUpPressed();
9843cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu        } else {
9853cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu            if (mOriginalSetPathString == null) return;
9864dd4d80af4cd3ba7555c12d1c1ba775e048b6c57George Mount            if (mProgressBar != null) {
9874dd4d80af4cd3ba7555c12d1c1ba775e048b6c57George Mount                updateCurrentPhoto(null);
9884dd4d80af4cd3ba7555c12d1c1ba775e048b6c57George Mount                mProgressBar.hideProgress();
9894dd4d80af4cd3ba7555c12d1c1ba775e048b6c57George Mount            }
9903cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu            Bundle data = new Bundle(getData());
9913cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu            data.putString(AlbumPage.KEY_MEDIA_PATH, mOriginalSetPathString);
9923cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu            data.putString(AlbumPage.KEY_PARENT_MEDIA_PATH,
9933cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu                    mActivity.getDataManager().getTopSetPath(
9943cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu                            DataManager.INCLUDE_ALL));
9953cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu
9963cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu            // We only show cluster menu in the first AlbumPage in stack
9973cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu            // TODO: Enable this when running from the camera app
9983cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu            boolean inAlbum = mActivity.getStateManager().hasStateClass(AlbumPage.class);
9993cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu            data.putBoolean(AlbumPage.KEY_SHOW_CLUSTER_MENU, !inAlbum
10003cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu                    && mAppBridge == null);
10013cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu
10023cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu            data.putBoolean(PhotoPage.KEY_APP_BRIDGE, mAppBridge != null);
10033cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu
10043cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu            // Account for live preview being first item
10053cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu            mActivity.getTransitionStore().put(KEY_RETURN_INDEX_HINT,
10063cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu                    mAppBridge != null ? mCurrentIndex - 1 : mCurrentIndex);
10073cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu
10083ad7bbc55d7aaa0f36a7242fdd0f612d877adc19Bobby Georgescu            if (mHasCameraScreennailOrPlaceholder && mAppBridge != null) {
10095585826e68c62c3719fb346d40fd1999438c6c6bBobby Georgescu                mActivity.getStateManager().startState(AlbumPage.class, data);
10105585826e68c62c3719fb346d40fd1999438c6c6bBobby Georgescu            } else {
10115585826e68c62c3719fb346d40fd1999438c6c6bBobby Georgescu                mActivity.getStateManager().switchState(this, AlbumPage.class, data);
10125585826e68c62c3719fb346d40fd1999438c6c6bBobby Georgescu            }
10133cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu        }
10143cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu    }
10153cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu
1016f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    @Override
1017f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    protected boolean onItemSelected(MenuItem item) {
1018d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu        if (mModel == null) return true;
1019d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin        refreshHidingMessage();
1020616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin        MediaItem current = mModel.getMediaItem(0);
1021f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
1022f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        if (current == null) {
1023f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            // item is not ready, ignore
1024f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            return true;
1025f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
1026f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
1027f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        int currentIndex = mModel.getCurrentIndex();
1028f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        Path path = current.getPath();
1029f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
1030f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        DataManager manager = mActivity.getDataManager();
1031f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        int action = item.getItemId();
10329a033b07b8e0d9fe7419b7a0d876e9c7febf43c8Ray Chen        String confirmMsg = null;
1033f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        switch (action) {
103484c220f10a643927c8a2126de8a755d8d7f7ec9eRay Chen            case android.R.id.home: {
1035b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang                onUpPressed();
103684c220f10a643927c8a2126de8a755d8d7f7ec9eRay Chen                return true;
103784c220f10a643927c8a2126de8a755d8d7f7ec9eRay Chen            }
1038f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            case R.id.action_slideshow: {
1039f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                Bundle data = new Bundle();
10406cf807453fb58ccd4cc513ff187b306c7090e67cOwen Lin                data.putString(SlideshowPage.KEY_SET_PATH, mMediaSet.getPath().toString());
1041604f053d040782159b61d3b74ee533bc2c0ccdd0Ray Chen                data.putString(SlideshowPage.KEY_ITEM_PATH, path.toString());
1042f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                data.putInt(SlideshowPage.KEY_PHOTO_INDEX, currentIndex);
1043f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                data.putBoolean(SlideshowPage.KEY_REPEAT, true);
1044f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                mActivity.getStateManager().startStateForResult(
1045f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                        SlideshowPage.class, REQUEST_SLIDESHOW, data);
1046f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                return true;
1047f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            }
1048f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            case R.id.action_crop: {
1049898a2f4540635528a0916b0a6b0a177869854ae9Wu-cheng Li                Activity activity = mActivity;
105063926d2ed2ca2921de8dca9b3a52c1d64d8afc46Ruben Brunk                Intent intent = new Intent(FilterShowActivity.CROP_ACTION);
105163926d2ed2ca2921de8dca9b3a52c1d64d8afc46Ruben Brunk                intent.setClass(activity, FilterShowActivity.class);
105263926d2ed2ca2921de8dca9b3a52c1d64d8afc46Ruben Brunk                intent.setDataAndType(manager.getContentUri(path), current.getMimeType())
105363926d2ed2ca2921de8dca9b3a52c1d64d8afc46Ruben Brunk                    .setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
1054f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                activity.startActivityForResult(intent, PicasaSource.isPicasaImage(current)
1055f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                        ? REQUEST_CROP_PICASA
1056f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                        : REQUEST_CROP);
1057f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                return true;
1058f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            }
105950ea2d2938218ac6b2039f0e42998cfbbc45d1f1Teng-Hui Zhu            case R.id.action_trim: {
10603f1f1baf3a674927e25cd5cd885fb372796bd3a0Teng-Hui Zhu                Intent intent = new Intent(mActivity, TrimVideo.class);
10613f1f1baf3a674927e25cd5cd885fb372796bd3a0Teng-Hui Zhu                intent.setData(manager.getContentUri(path));
106215ff1b1ca52bea348b8a490b5b5abe53fa43eaf2Teng-Hui Zhu                // We need the file path to wrap this into a RandomAccessFile.
106315ff1b1ca52bea348b8a490b5b5abe53fa43eaf2Teng-Hui Zhu                intent.putExtra(KEY_MEDIA_ITEM_PATH, current.getFilePath());
10643f1f1baf3a674927e25cd5cd885fb372796bd3a0Teng-Hui Zhu                mActivity.startActivityForResult(intent, REQUEST_TRIM);
106550ea2d2938218ac6b2039f0e42998cfbbc45d1f1Teng-Hui Zhu                return true;
106650ea2d2938218ac6b2039f0e42998cfbbc45d1f1Teng-Hui Zhu            }
1067f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang            case R.id.action_edit: {
1068a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu                launchPhotoEditor();
1069f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang                return true;
1070f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang            }
1071f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            case R.id.action_details: {
1072f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                if (mShowDetails) {
1073f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                    hideDetails();
1074f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                } else {
1075995c4566bed7df1aa48ba7e1351f964efa73880bMichael Kolb                    showDetails();
1076f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                }
1077f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                return true;
1078f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            }
107967098d1a72fd04e2af06d3a5939cde28c65f70d9Ray Chen            case R.id.action_delete:
10809a033b07b8e0d9fe7419b7a0d876e9c7febf43c8Ray Chen                confirmMsg = mActivity.getResources().getQuantityString(
10819a033b07b8e0d9fe7419b7a0d876e9c7febf43c8Ray Chen                        R.plurals.delete_selection, 1);
1082f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            case R.id.action_setas:
1083f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            case R.id.action_rotate_ccw:
1084f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            case R.id.action_rotate_cw:
1085f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            case R.id.action_show_on_map:
1086f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                mSelectionManager.deSelectAll();
1087f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                mSelectionManager.toggle(path);
1088d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin                mMenuExecutor.onMenuClicked(item, confirmMsg, mConfirmDialogListener);
1089f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                return true;
1090f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            case R.id.action_import:
1091f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                mSelectionManager.deSelectAll();
1092f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                mSelectionManager.toggle(path);
10939a033b07b8e0d9fe7419b7a0d876e9c7febf43c8Ray Chen                mMenuExecutor.onMenuClicked(item, confirmMsg,
1094f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                        new ImportCompleteListener(mActivity));
1095f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                return true;
1096f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            default :
1097f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                return false;
1098f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
1099f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
1100f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
1101f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private void hideDetails() {
1102f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mShowDetails = false;
11034105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen        mDetailsHelper.hide();
1104f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
1105f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
1106995c4566bed7df1aa48ba7e1351f964efa73880bMichael Kolb    private void showDetails() {
1107f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mShowDetails = true;
11084105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen        if (mDetailsHelper == null) {
11094105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen            mDetailsHelper = new DetailsHelper(mActivity, mRootPane, new MyDetailsSource());
11104105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen            mDetailsHelper.setCloseListener(new CloseListener() {
111106c6401eededc2ec842ba4994a838c2ded0a666cPin Ting                @Override
1112f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                public void onClose() {
1113f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                    hideDetails();
1114f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                }
1115f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            });
1116f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
11174105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen        mDetailsHelper.show();
1118f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
1119f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
1120bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    ////////////////////////////////////////////////////////////////////////////
1121bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    //  Callbacks from PhotoView
1122bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    ////////////////////////////////////////////////////////////////////////////
1123bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    @Override
1124f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public void onSingleTapUp(int x, int y) {
1125bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang        if (mAppBridge != null) {
1126bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang            if (mAppBridge.onSingleTapUp(x, y)) return;
1127014d9586d8145a33f4e99eaad570587f6d650026Wu-cheng Li        }
1128014d9586d8145a33f4e99eaad570587f6d650026Wu-cheng Li
1129616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin        MediaItem item = mModel.getMediaItem(0);
1130b5dc542fbaeaf99bebdcf775ef0e034e89e88eaeWu-cheng Li        if (item == null || item == mScreenNailItem) {
1131b5dc542fbaeaf99bebdcf775ef0e034e89e88eaeWu-cheng Li            // item is not ready or it is camera preview, ignore
1132f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            return;
1133f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
1134f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
11358868aa1b2d199e7fa869c9c5fad3079175621002Wu-cheng Li        int supported = item.getSupportedOperations();
11363935ca3762344c5f8a306596d70c0d4d4a2fda4bAngus Kong        boolean playVideo = ((supported & MediaItem.SUPPORT_PLAY) != 0);
11378868aa1b2d199e7fa869c9c5fad3079175621002Wu-cheng Li        boolean unlock = ((supported & MediaItem.SUPPORT_UNLOCK) != 0);
1138c7e3c76d6965f520a9651d309052c5f01726cd58Bobby Georgescu        boolean goBack = ((supported & MediaItem.SUPPORT_BACK) != 0);
113945f089d69141e3fb0dfaad9bc34d275b61eb2aeeBobby Georgescu        boolean launchCamera = ((supported & MediaItem.SUPPORT_CAMERA_SHORTCUT) != 0);
1140f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
1141f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        if (playVideo) {
1142f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            // determine if the point is at center (1/6) of the photo view.
1143f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            // (The position of the "play" icon is at center (1/6) of the photo)
1144f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            int w = mPhotoView.getWidth();
1145f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            int h = mPhotoView.getHeight();
1146f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            playVideo = (Math.abs(x - w / 2) * 12 <= w)
1147f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                && (Math.abs(y - h / 2) * 12 <= h);
1148f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
1149f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
1150f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        if (playVideo) {
11513935ca3762344c5f8a306596d70c0d4d4a2fda4bAngus Kong            if (mSecureAlbum == null) {
11523935ca3762344c5f8a306596d70c0d4d4a2fda4bAngus Kong                playVideo(mActivity, item.getPlayUri(), item.getName());
11533935ca3762344c5f8a306596d70c0d4d4a2fda4bAngus Kong            } else {
11543935ca3762344c5f8a306596d70c0d4d4a2fda4bAngus Kong                mActivity.getStateManager().finishState(this);
11553935ca3762344c5f8a306596d70c0d4d4a2fda4bAngus Kong            }
1156c7e3c76d6965f520a9651d309052c5f01726cd58Bobby Georgescu        } else if (goBack) {
1157c7e3c76d6965f520a9651d309052c5f01726cd58Bobby Georgescu            onBackPressed();
11588868aa1b2d199e7fa869c9c5fad3079175621002Wu-cheng Li        } else if (unlock) {
115919ded6d4283a887c579a29da3832dde286e97688Wu-cheng Li            Intent intent = new Intent(mActivity, Gallery.class);
116019ded6d4283a887c579a29da3832dde286e97688Wu-cheng Li            intent.putExtra(Gallery.KEY_DISMISS_KEYGUARD, true);
116119ded6d4283a887c579a29da3832dde286e97688Wu-cheng Li            mActivity.startActivity(intent);
116245f089d69141e3fb0dfaad9bc34d275b61eb2aeeBobby Georgescu        } else if (launchCamera) {
11635bd00332556b20c141b5c7f16433d55b1bc7fe0fBobby Georgescu            launchCamera();
1164f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        } else {
116561f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang            toggleBars();
1166f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
1167f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
1168f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
1169bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    @Override
117061f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang    public void onActionBarAllowed(boolean allowed) {
117161f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang        mActionBarAllowed = allowed;
117261f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang        mHandler.sendEmptyMessage(MSG_UPDATE_ACTION_BAR);
117361f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang    }
117461f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang
117561f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang    @Override
1176e6251df06f0b3c8f556043f8b725b4b19be7474dChih-Chung Chang    public void onActionBarWanted() {
1177e6251df06f0b3c8f556043f8b725b4b19be7474dChih-Chung Chang        mHandler.sendEmptyMessage(MSG_WANT_BARS);
1178e6251df06f0b3c8f556043f8b725b4b19be7474dChih-Chung Chang    }
1179e6251df06f0b3c8f556043f8b725b4b19be7474dChih-Chung Chang
1180e6251df06f0b3c8f556043f8b725b4b19be7474dChih-Chung Chang    @Override
1181bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    public void onFullScreenChanged(boolean full) {
1182bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang        Message m = mHandler.obtainMessage(
1183bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang                MSG_ON_FULL_SCREEN_CHANGED, full ? 1 : 0, 0);
1184bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang        m.sendToTarget();
1185bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    }
1186bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang
11876b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang    // How we do delete/undo:
11886b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang    //
11896b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang    // When the user choose to delete a media item, we just tell the
11906b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang    // FilterDeleteSet to hide that item. If the user choose to undo it, we
11916b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang    // again tell FilterDeleteSet not to hide it. If the user choose to commit
11926b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang    // the deletion, we then actually delete the media item.
11936b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang    @Override
11946b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang    public void onDeleteImage(Path path, int offset) {
11956118af9ddad8acc050133154f8f60c842c7f9bfaChih-Chung Chang        onCommitDeleteImage();  // commit the previous deletion
11966b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang        mDeletePath = path;
11976b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang        mDeleteIsFocus = (offset == 0);
11986118af9ddad8acc050133154f8f60c842c7f9bfaChih-Chung Chang        mMediaSet.addDeletion(path, mCurrentIndex + offset);
11996b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang    }
12006b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang
12016b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang    @Override
12026b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang    public void onUndoDeleteImage() {
12036118af9ddad8acc050133154f8f60c842c7f9bfaChih-Chung Chang        if (mDeletePath == null) return;
12046b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang        // If the deletion was done on the focused item, we want the model to
12056b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang        // focus on it when it is undeleted.
12066b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang        if (mDeleteIsFocus) mModel.setFocusHintPath(mDeletePath);
12076118af9ddad8acc050133154f8f60c842c7f9bfaChih-Chung Chang        mMediaSet.removeDeletion(mDeletePath);
12086b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang        mDeletePath = null;
12096b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang    }
12106b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang
12116b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang    @Override
12126b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang    public void onCommitDeleteImage() {
12136b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang        if (mDeletePath == null) return;
12146b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang        mSelectionManager.deSelectAll();
12156b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang        mSelectionManager.toggle(mDeletePath);
12166b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang        mMenuExecutor.onMenuClicked(R.id.action_delete, null, true, false);
12176b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang        mDeletePath = null;
12186b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang    }
12196b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang
1220d81b264931cfa3b34096efd46659b81f9a628fb5Bobby Georgescu    public void playVideo(Activity activity, Uri uri, String title) {
1221f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        try {
1222f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            Intent intent = new Intent(Intent.ACTION_VIEW)
1223a3871050845b4921379add2b126add3cfbab1109Ray Chen                    .setDataAndType(uri, "video/*")
1224a3871050845b4921379add2b126add3cfbab1109Ray Chen                    .putExtra(Intent.EXTRA_TITLE, title)
1225a3871050845b4921379add2b126add3cfbab1109Ray Chen                    .putExtra(MovieActivity.KEY_TREAT_UP_AS_BACK, true);
122671cd89a38752bc22ae0ec2df965e4280b776623cChih-Chung Chang            activity.startActivityForResult(intent, REQUEST_PLAY_VIDEO);
1227f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        } catch (ActivityNotFoundException e) {
1228f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            Toast.makeText(activity, activity.getString(R.string.video_err),
1229f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                    Toast.LENGTH_SHORT).show();
1230f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
1231f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
1232f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
1233f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang    private void setCurrentPhotoByIntent(Intent intent) {
1234f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang        if (intent == null) return;
1235f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang        Path path = mApplication.getDataManager()
1236f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang                .findPathByUri(intent.getData(), intent.getType());
1237f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang        if (path != null) {
12380addfc7f6342184a67cdd8b5cc3872c6a5c87e55Doris Liu            Path albumPath = mApplication.getDataManager().getDefaultSetOf(path);
12390addfc7f6342184a67cdd8b5cc3872c6a5c87e55Doris Liu            if (!albumPath.equalsIgnoreCase(mOriginalSetPathString)) {
12400addfc7f6342184a67cdd8b5cc3872c6a5c87e55Doris Liu                // If the edited image is stored in a different album, we need
12410addfc7f6342184a67cdd8b5cc3872c6a5c87e55Doris Liu                // to start a new activity state to show the new image
12420addfc7f6342184a67cdd8b5cc3872c6a5c87e55Doris Liu                Bundle data = new Bundle(getData());
12430addfc7f6342184a67cdd8b5cc3872c6a5c87e55Doris Liu                data.putString(KEY_MEDIA_SET_PATH, albumPath.toString());
12440addfc7f6342184a67cdd8b5cc3872c6a5c87e55Doris Liu                data.putString(PhotoPage.KEY_MEDIA_ITEM_PATH, path.toString());
12450addfc7f6342184a67cdd8b5cc3872c6a5c87e55Doris Liu                mActivity.getStateManager().startState(PhotoPage.class, data);
12460addfc7f6342184a67cdd8b5cc3872c6a5c87e55Doris Liu                return;
12470addfc7f6342184a67cdd8b5cc3872c6a5c87e55Doris Liu            }
1248f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang            mModel.setCurrentPhoto(path, mCurrentIndex);
1249f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang        }
1250f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang    }
1251f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang
1252f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    @Override
1253f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    protected void onStateResult(int requestCode, int resultCode, Intent data) {
1254f85d974363a40b8ce588ba3fe902eec38de603d9John Reck        if (resultCode == Activity.RESULT_CANCELED) {
1255f85d974363a40b8ce588ba3fe902eec38de603d9John Reck            // This is a reset, not a canceled
1256f85d974363a40b8ce588ba3fe902eec38de603d9John Reck            return;
1257f85d974363a40b8ce588ba3fe902eec38de603d9John Reck        }
1258f85d974363a40b8ce588ba3fe902eec38de603d9John Reck        if (resultCode == ProxyLauncher.RESULT_USER_CANCELED) {
1259f85d974363a40b8ce588ba3fe902eec38de603d9John Reck            // Unmap reset vs. canceled
1260f85d974363a40b8ce588ba3fe902eec38de603d9John Reck            resultCode = Activity.RESULT_CANCELED;
1261f85d974363a40b8ce588ba3fe902eec38de603d9John Reck        }
1262f85d974363a40b8ce588ba3fe902eec38de603d9John Reck        mRecenterCameraOnResume = false;
1263f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        switch (requestCode) {
1264f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang            case REQUEST_EDIT:
1265f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang                setCurrentPhotoByIntent(data);
1266f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang                break;
1267f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            case REQUEST_CROP:
1268f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                if (resultCode == Activity.RESULT_OK) {
1269f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang                    setCurrentPhotoByIntent(data);
1270f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                }
1271f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                break;
1272f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            case REQUEST_CROP_PICASA: {
1273f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang                if (resultCode == Activity.RESULT_OK) {
1274f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang                    Context context = mActivity.getAndroidContext();
127588cc2ca5f5596762a5546ec7426756f2036be455Yuli Huang                    String message = context.getString(R.string.crop_saved,
127600d64dd584c6d08310a32a28e75aebc6eb8238eaRuben Brunk                            context.getString(R.string.folder_edited_online_photos));
1277f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang                    Toast.makeText(context, message, Toast.LENGTH_SHORT).show();
1278f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang                }
1279f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                break;
1280f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            }
1281f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            case REQUEST_SLIDESHOW: {
1282f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                if (data == null) break;
1283f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                String path = data.getStringExtra(SlideshowPage.KEY_ITEM_PATH);
1284f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                int index = data.getIntExtra(SlideshowPage.KEY_PHOTO_INDEX, 0);
1285f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                if (path != null) {
1286f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                    mModel.setCurrentPhoto(Path.fromString(path), index);
1287f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                }
1288f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            }
1289f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
1290f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
1291f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
129214d3289b4867c21da93ec4032119c0091bc78c30George Mount    @Override
1293f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public void onPause() {
1294d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin        super.onPause();
1295d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin        mIsActive = false;
1296d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin
1297bd7c016d728853d38f98a3c6077b7bd9b08858b9Yuli Huang        mActivity.getGLRoot().unfreeze();
1298bd7c016d728853d38f98a3c6077b7bd9b08858b9Yuli Huang        mHandler.removeMessages(MSG_UNFREEZE_GLROOT);
1299253c5aec7692afdd7880fbd169d4b44d5679cbc0Chih-Chung Chang
13004105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen        DetailsHelper.pause();
13014438a7cce00cb19cb35cfc3cc149533f40043c00Doris Liu        // Hide the detail dialog on exit
13024438a7cce00cb19cb35cfc3cc149533f40043c00Doris Liu        if (mShowDetails) hideDetails();
1303d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu        if (mModel != null) {
1304d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu            mModel.pause();
1305d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu        }
1306f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mPhotoView.pause();
1307f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mHandler.removeMessages(MSG_HIDE_BARS);
1308d2724f69edf39cf2019eac1b49f316d22ab70d0aBobby Georgescu        mHandler.removeMessages(MSG_REFRESH_BOTTOM_CONTROLS);
13094b4dbd225685502f4249c2bf25bf74f7ce526645George Mount        refreshBottomControlsWhenReady();
1310f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mActionBar.removeOnMenuVisibilityListener(mMenuVisibilityListener);
1311ba65c373f244f6de0b45afa6b7cd711866f1bfe4Bobby Georgescu        if (mShowSpinner) {
13129481d05b0782dccd495c66d2e3240cd7448bbd4aBobby Georgescu            mActionBar.disableAlbumModeMenu(true);
13139481d05b0782dccd495c66d2e3240cd7448bbd4aBobby Georgescu        }
13146b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang        onCommitDeleteImage();
13152785956f8f5654966a41e20f482f4af3057eea3fChih-Chung Chang        mMenuExecutor.pause();
13166118af9ddad8acc050133154f8f60c842c7f9bfaChih-Chung Chang        if (mMediaSet != null) mMediaSet.clearDeletion();
1317f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
1318f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
1319f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    @Override
1320bd7c016d728853d38f98a3c6077b7bd9b08858b9Yuli Huang    public void onCurrentImageUpdated() {
1321bd7c016d728853d38f98a3c6077b7bd9b08858b9Yuli Huang        mActivity.getGLRoot().unfreeze();
1322bd7c016d728853d38f98a3c6077b7bd9b08858b9Yuli Huang    }
1323bd7c016d728853d38f98a3c6077b7bd9b08858b9Yuli Huang
1324f122d56e15e00928d731751796b0509ae47c6799George Mount    @Override
13257eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu    public void onFilmModeChanged(boolean enabled) {
13264b4dbd225685502f4249c2bf25bf74f7ce526645George Mount        refreshBottomControlsWhenReady();
1327c29588d7cc9fc3d2eef61af433fc0a8859e16ef4Bobby Georgescu        if (mShowSpinner) {
1328c29588d7cc9fc3d2eef61af433fc0a8859e16ef4Bobby Georgescu            if (enabled) {
1329c29588d7cc9fc3d2eef61af433fc0a8859e16ef4Bobby Georgescu                mActionBar.enableAlbumModeMenu(
1330c29588d7cc9fc3d2eef61af433fc0a8859e16ef4Bobby Georgescu                        GalleryActionBar.ALBUM_FILMSTRIP_MODE_SELECTED, this);
1331c29588d7cc9fc3d2eef61af433fc0a8859e16ef4Bobby Georgescu            } else {
1332c29588d7cc9fc3d2eef61af433fc0a8859e16ef4Bobby Georgescu                mActionBar.disableAlbumModeMenu(true);
1333c29588d7cc9fc3d2eef61af433fc0a8859e16ef4Bobby Georgescu            }
1334c29588d7cc9fc3d2eef61af433fc0a8859e16ef4Bobby Georgescu        }
13357eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu        if (enabled) {
13367eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu            mHandler.removeMessages(MSG_HIDE_BARS);
13377eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu        } else {
13387eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu            refreshHidingMessage();
13397eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu        }
13407eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu    }
13417eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu
13427eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu    private void transitionFromAlbumPageIfNeeded() {
13437eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu        TransitionStore transitions = mActivity.getTransitionStore();
13447eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu
13457eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu        int albumPageTransition = transitions.get(
13467eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu                KEY_ALBUMPAGE_TRANSITION, MSG_ALBUMPAGE_NONE);
13477eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu
1348d81b264931cfa3b34096efd46659b81f9a628fb5Bobby Georgescu        if (albumPageTransition == MSG_ALBUMPAGE_NONE && mAppBridge != null
1349d81b264931cfa3b34096efd46659b81f9a628fb5Bobby Georgescu                && mRecenterCameraOnResume) {
135000ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu            // Generally, resuming the PhotoPage when in Camera should
135100ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu            // reset to the capture mode to allow quick photo taking
135200ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu            mCurrentIndex = 0;
135300ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu            mPhotoView.resetToFirstPicture();
135400ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu        } else {
135500ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu            int resumeIndex = transitions.get(KEY_INDEX_HINT, -1);
135600ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu            if (resumeIndex >= 0) {
13573ad7bbc55d7aaa0f36a7242fdd0f612d877adc19Bobby Georgescu                if (mHasCameraScreennailOrPlaceholder) {
135876f1881067d7ca4eda6d3e398567473d2913c5d1Bobby Georgescu                    // Account for preview/placeholder being the first item
135900ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu                    resumeIndex++;
136000ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu                }
136100ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu                if (resumeIndex < mMediaSet.getMediaItemCount()) {
136200ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu                    mCurrentIndex = resumeIndex;
136300ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu                    mModel.moveTo(mCurrentIndex);
136400ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu                }
136500ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu            }
136600ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu        }
136700ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu
136800ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu        if (albumPageTransition == MSG_ALBUMPAGE_RESUMED) {
136900ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu            mPhotoView.setFilmMode(mStartInFilmstrip || mAppBridge != null);
137000ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu        } else if (albumPageTransition == MSG_ALBUMPAGE_PICKED) {
137100ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu            mPhotoView.setFilmMode(false);
13727eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu        }
13737eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu    }
13747eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu
1375bd7c016d728853d38f98a3c6077b7bd9b08858b9Yuli Huang    @Override
1376f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    protected void onResume() {
1377f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        super.onResume();
13787eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu
1379d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu        if (mModel == null) {
1380d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu            mActivity.getStateManager().finishState(this);
1381d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu            return;
1382d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu        }
13837eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu        transitionFromAlbumPageIfNeeded();
13847eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu
1385d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin        mActivity.getGLRoot().freeze();
1386f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mIsActive = true;
1387f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        setContentPane(mRootPane);
138804ac045bf8da5082bbb0bdc9ea5f9c9b5b796ad0Yuli Huang
1389f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mModel.resume();
1390f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mPhotoView.resume();
1391898a2f4540635528a0916b0a6b0a177869854ae9Wu-cheng Li        mActionBar.setDisplayOptions(
13923cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu                ((mSecureAlbum == null) && (mSetPathString != null)), false);
1393f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mActionBar.addOnMenuVisibilityListener(mMenuVisibilityListener);
13944b4dbd225685502f4249c2bf25bf74f7ce526645George Mount        refreshBottomControlsWhenReady();
1395c29588d7cc9fc3d2eef61af433fc0a8859e16ef4Bobby Georgescu        if (mShowSpinner && mPhotoView.getFilmMode()) {
13969481d05b0782dccd495c66d2e3240cd7448bbd4aBobby Georgescu            mActionBar.enableAlbumModeMenu(
13979481d05b0782dccd495c66d2e3240cd7448bbd4aBobby Georgescu                    GalleryActionBar.ALBUM_FILMSTRIP_MODE_SELECTED, this);
13989481d05b0782dccd495c66d2e3240cd7448bbd4aBobby Georgescu        }
139900ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu        if (!mShowBars) {
140000ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu            mActionBar.hide();
140100ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu            mActivity.getGLRoot().setLightsOutMode(true);
1402bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang        }
14038fe22ecb8e744a09a2e0d867f876ecbf74c82298John Reck        boolean haveImageEditor = GalleryUtils.isEditorAvailable(mActivity, "image/*");
14048fe22ecb8e744a09a2e0d867f876ecbf74c82298John Reck        if (haveImageEditor != mHaveImageEditor) {
14058fe22ecb8e744a09a2e0d867f876ecbf74c82298John Reck            mHaveImageEditor = haveImageEditor;
14068fe22ecb8e744a09a2e0d867f876ecbf74c82298John Reck            updateMenuOperations();
14078fe22ecb8e744a09a2e0d867f876ecbf74c82298John Reck        }
140800ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu
1409d81b264931cfa3b34096efd46659b81f9a628fb5Bobby Georgescu        mRecenterCameraOnResume = true;
1410bd7c016d728853d38f98a3c6077b7bd9b08858b9Yuli Huang        mHandler.sendEmptyMessageDelayed(MSG_UNFREEZE_GLROOT, UNFREEZE_GLROOT_TIMEOUT);
1411f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
1412f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
141315b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang    @Override
141415b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang    protected void onDestroy() {
1415bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang        if (mAppBridge != null) {
1416253c5aec7692afdd7880fbd169d4b44d5679cbc0Chih-Chung Chang            mAppBridge.setServer(null);
14173b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang            mScreenNailItem.setScreenNail(null);
1418bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang            mAppBridge.detachScreenNail();
1419bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang            mAppBridge = null;
14203b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang            mScreenNailSet = null;
14213b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang            mScreenNailItem = null;
1422b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang        }
14232ef46ed28b28b355d7f3f1432c7b1196b832a859Chih-Chung Chang        mActivity.getGLRoot().setOrientationSource(null);
1424f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu        if (mBottomControls != null) mBottomControls.cleanup();
1425aeb3062e84ed28f0e25a73f511f287ae0a3e4294Chih-Chung Chang
1426aeb3062e84ed28f0e25a73f511f287ae0a3e4294Chih-Chung Chang        // Remove all pending messages.
1427aeb3062e84ed28f0e25a73f511f287ae0a3e4294Chih-Chung Chang        mHandler.removeCallbacksAndMessages(null);
142815b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang        super.onDestroy();
142915b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang    }
143015b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang
1431f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private class MyDetailsSource implements DetailsSource {
14326cf807453fb58ccd4cc513ff187b306c7090e67cOwen Lin
14336cf807453fb58ccd4cc513ff187b306c7090e67cOwen Lin        @Override
1434f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        public MediaDetails getDetails() {
1435616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin            return mModel.getMediaItem(0).getDetails();
1436f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
14376cf807453fb58ccd4cc513ff187b306c7090e67cOwen Lin
14386cf807453fb58ccd4cc513ff187b306c7090e67cOwen Lin        @Override
1439f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        public int size() {
1440f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            return mMediaSet != null ? mMediaSet.getMediaItemCount() : 1;
1441f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
14426cf807453fb58ccd4cc513ff187b306c7090e67cOwen Lin
14436cf807453fb58ccd4cc513ff187b306c7090e67cOwen Lin        @Override
1444995c4566bed7df1aa48ba7e1351f964efa73880bMichael Kolb        public int setIndex() {
1445995c4566bed7df1aa48ba7e1351f964efa73880bMichael Kolb            return mModel.getCurrentIndex();
14464105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen        }
1447f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
14483cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu
14493cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu    @Override
14503cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu    public void onAlbumModeSelected(int mode) {
14513cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu        if (mode == GalleryActionBar.ALBUM_GRID_MODE_SELECTED) {
14523cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu            switchToGrid();
14533cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu        }
14543cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu    }
14554b4dbd225685502f4249c2bf25bf74f7ce526645George Mount
14564b4dbd225685502f4249c2bf25bf74f7ce526645George Mount    @Override
14574b4dbd225685502f4249c2bf25bf74f7ce526645George Mount    public void refreshBottomControlsWhenReady() {
14584b4dbd225685502f4249c2bf25bf74f7ce526645George Mount        if (mBottomControls == null) {
14594b4dbd225685502f4249c2bf25bf74f7ce526645George Mount            return;
14604b4dbd225685502f4249c2bf25bf74f7ce526645George Mount        }
14614b4dbd225685502f4249c2bf25bf74f7ce526645George Mount        MediaObject currentPhoto = mCurrentPhoto;
14624b4dbd225685502f4249c2bf25bf74f7ce526645George Mount        if (currentPhoto == null) {
14634b4dbd225685502f4249c2bf25bf74f7ce526645George Mount            mHandler.obtainMessage(MSG_REFRESH_BOTTOM_CONTROLS, 0, 0, currentPhoto).sendToTarget();
14644b4dbd225685502f4249c2bf25bf74f7ce526645George Mount        } else {
14654b4dbd225685502f4249c2bf25bf74f7ce526645George Mount            currentPhoto.getPanoramaSupport(mRefreshBottomControlsCallback);
14664b4dbd225685502f4249c2bf25bf74f7ce526645George Mount        }
14674b4dbd225685502f4249c2bf25bf74f7ce526645George Mount    }
14684b4dbd225685502f4249c2bf25bf74f7ce526645George Mount
14694b4dbd225685502f4249c2bf25bf74f7ce526645George Mount    private void updatePanoramaUI(boolean isPanorama360) {
14704b4dbd225685502f4249c2bf25bf74f7ce526645George Mount        Menu menu = mActionBar.getMenu();
14714b4dbd225685502f4249c2bf25bf74f7ce526645George Mount
14724b4dbd225685502f4249c2bf25bf74f7ce526645George Mount        // it could be null if onCreateActionBar has not been called yet
14734b4dbd225685502f4249c2bf25bf74f7ce526645George Mount        if (menu == null) {
14744b4dbd225685502f4249c2bf25bf74f7ce526645George Mount            return;
14754b4dbd225685502f4249c2bf25bf74f7ce526645George Mount        }
14764b4dbd225685502f4249c2bf25bf74f7ce526645George Mount
14774b4dbd225685502f4249c2bf25bf74f7ce526645George Mount        MenuExecutor.updateMenuForPanorama(menu, isPanorama360, isPanorama360);
14784b4dbd225685502f4249c2bf25bf74f7ce526645George Mount
14794b4dbd225685502f4249c2bf25bf74f7ce526645George Mount        if (isPanorama360) {
14804b4dbd225685502f4249c2bf25bf74f7ce526645George Mount            MenuItem item = menu.findItem(R.id.action_share);
14814b4dbd225685502f4249c2bf25bf74f7ce526645George Mount            if (item != null) {
14824b4dbd225685502f4249c2bf25bf74f7ce526645George Mount                item.setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER);
14834b4dbd225685502f4249c2bf25bf74f7ce526645George Mount                item.setTitle(mActivity.getResources().getString(R.string.share_as_photo));
14844b4dbd225685502f4249c2bf25bf74f7ce526645George Mount            }
14854b4dbd225685502f4249c2bf25bf74f7ce526645George Mount        } else if ((mCurrentPhoto.getSupportedOperations() & MediaObject.SUPPORT_SHARE) != 0) {
14864b4dbd225685502f4249c2bf25bf74f7ce526645George Mount            MenuItem item = menu.findItem(R.id.action_share);
14874b4dbd225685502f4249c2bf25bf74f7ce526645George Mount            if (item != null) {
14884b4dbd225685502f4249c2bf25bf74f7ce526645George Mount                item.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
14894b4dbd225685502f4249c2bf25bf74f7ce526645George Mount                item.setTitle(mActivity.getResources().getString(R.string.share));
14904b4dbd225685502f4249c2bf25bf74f7ce526645George Mount            }
14914b4dbd225685502f4249c2bf25bf74f7ce526645George Mount        }
14924b4dbd225685502f4249c2bf25bf74f7ce526645George Mount    }
1493949584340c9f5f41a6133ba06058af280490f0c8Bobby Georgescu
1494949584340c9f5f41a6133ba06058af280490f0c8Bobby Georgescu    @Override
1495949584340c9f5f41a6133ba06058af280490f0c8Bobby Georgescu    public void onUndoBarVisibilityChanged(boolean visible) {
1496949584340c9f5f41a6133ba06058af280490f0c8Bobby Georgescu        refreshBottomControlsWhenReady();
1497949584340c9f5f41a6133ba06058af280490f0c8Bobby Georgescu    }
1498f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin}
1499