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;
202abaaf7caa9a83ba1ea759868aabde7f21387184John Reckimport 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;
264ea5c27007e38fa8583add4bacf268ba67b9f0adJohn Reckimport android.content.res.Configuration;
2704ac045bf8da5082bbb0bdc9ea5f9c9b5b796ad0Yuli Huangimport android.graphics.Rect;
28604f053d040782159b61d3b74ee533bc2c0ccdd0Ray Chenimport android.net.Uri;
2933ef03776b7734717b16f6fc861b831fb1b1dfacMartijn Coenenimport android.nfc.NfcAdapter;
30ddf0225a5192a589fc578945f56440b09bf74d12John Reckimport android.nfc.NfcAdapter.CreateBeamUrisCallback;
31ddf0225a5192a589fc578945f56440b09bf74d12John Reckimport android.nfc.NfcEvent;
32604f053d040782159b61d3b74ee533bc2c0ccdd0Ray Chenimport android.os.Bundle;
33604f053d040782159b61d3b74ee533bc2c0ccdd0Ray Chenimport android.os.Handler;
34604f053d040782159b61d3b74ee533bc2c0ccdd0Ray Chenimport android.os.Message;
35b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescuimport android.os.SystemClock;
362abaaf7caa9a83ba1ea759868aabde7f21387184John Reckimport android.view.Menu;
372abaaf7caa9a83ba1ea759868aabde7f21387184John Reckimport android.view.MenuItem;
3802f459f8e1ef6d6765c9a57ee1866fc5af2f9eb5ztenghuiimport android.view.View;
39a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescuimport android.widget.RelativeLayout;
402251386437163898eb4b6f7546705d1365744fd1Flavio Lerdaimport android.widget.ShareActionProvider;
41604f053d040782159b61d3b74ee533bc2c0ccdd0Ray Chenimport android.widget.Toast;
42604f053d040782159b61d3b74ee533bc2c0ccdd0Ray Chen
43f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.R;
44fc86994f86f8cfb31e151c9e730dc1e9dc7b3349Yuli Huangimport com.android.gallery3d.common.ApiHelper;
45ee899c09c88e5b054397ac44ad20e5055cd24f39Bobby Georgescuimport com.android.gallery3d.data.ComboAlbum;
46f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.data.DataManager;
476b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Changimport com.android.gallery3d.data.FilterDeleteSet;
4845f089d69141e3fb0dfaad9bc34d275b61eb2aeeBobby Georgescuimport com.android.gallery3d.data.FilterSource;
494e091eb758a3ac1016b373419cea1ada1b977bc5George Mountimport com.android.gallery3d.data.LocalImage;
50f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.data.MediaDetails;
51f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.data.MediaItem;
52f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.data.MediaObject;
534b4dbd225685502f4249c2bf25bf74f7ce526645George Mountimport com.android.gallery3d.data.MediaObject.PanoramaSupportCallback;
54f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.data.MediaSet;
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;
62c3178ca4daf7ed570f3432f3433959c208ecc105Ruben Brunkimport com.android.gallery3d.filtershow.crop.CropActivity;
63f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.picasasource.PicasaSource;
644105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chenimport com.android.gallery3d.ui.DetailsHelper;
654105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chenimport com.android.gallery3d.ui.DetailsHelper.CloseListener;
664105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chenimport com.android.gallery3d.ui.DetailsHelper.DetailsSource;
6702f459f8e1ef6d6765c9a57ee1866fc5af2f9eb5ztenghuiimport com.android.gallery3d.ui.GLRootView;
68f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.ui.GLView;
69f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.ui.MenuExecutor;
7021a412c93c9b0401b039f4eb86d4950752e5bb84Owen Linimport com.android.gallery3d.ui.PhotoView;
71f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.ui.SelectionManager;
72f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.ui.SynchronizedHandler;
73f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.util.GalleryUtils;
74f37648b877bf6029d7afead31e965b473114c89cBobby Georgescuimport com.android.gallery3d.util.UsageStatistics;
75f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
76cfa7fde1a336a3200b2ad9091b27ba7bfd8f5c9aBobby Georgescupublic abstract class PhotoPage extends ActivityState implements
772251386437163898eb4b6f7546705d1365744fd1Flavio Lerda        PhotoView.Listener, AppBridge.Server, ShareActionProvider.OnShareTargetSelectedListener,
783cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu        PhotoPageBottomControls.Delegate, GalleryActionBar.OnAlbumModeSelectedListener {
79f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private static final String TAG = "PhotoPage";
80f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
81f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private static final int MSG_HIDE_BARS = 1;
82bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    private static final int MSG_ON_FULL_SCREEN_CHANGED = 4;
8361f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang    private static final int MSG_UPDATE_ACTION_BAR = 5;
84bd7c016d728853d38f98a3c6077b7bd9b08858b9Yuli Huang    private static final int MSG_UNFREEZE_GLROOT = 6;
85e6251df06f0b3c8f556043f8b725b4b19be7474dChih-Chung Chang    private static final int MSG_WANT_BARS = 7;
863cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu    private static final int MSG_REFRESH_BOTTOM_CONTROLS = 8;
873cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu    private static final int MSG_ON_CAMERA_CENTER = 9;
88f4e22eb44bfae0c2a3b6570f19480c8c3535d808Bobby Georgescu    private static final int MSG_ON_PICTURE_CENTER = 10;
89f122d56e15e00928d731751796b0509ae47c6799George Mount    private static final int MSG_REFRESH_IMAGE = 11;
90423e45e492d4ebdc41ecfeba73299de23b1463c4Mangesh Ghiware    private static final int MSG_UPDATE_PHOTO_UI = 12;
91423e45e492d4ebdc41ecfeba73299de23b1463c4Mangesh Ghiware    private static final int MSG_UPDATE_DEFERRED = 14;
924b4dbd225685502f4249c2bf25bf74f7ce526645George Mount    private static final int MSG_UPDATE_SHARE_URI = 15;
934b4dbd225685502f4249c2bf25bf74f7ce526645George Mount    private static final int MSG_UPDATE_PANORAMA_UI = 16;
946cf807453fb58ccd4cc513ff187b306c7090e67cOwen Lin
95f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private static final int HIDE_BARS_TIMEOUT = 3500;
96bd7c016d728853d38f98a3c6077b7bd9b08858b9Yuli Huang    private static final int UNFREEZE_GLROOT_TIMEOUT = 250;
97f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
98f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private static final int REQUEST_SLIDESHOW = 1;
99f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private static final int REQUEST_CROP = 2;
100f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private static final int REQUEST_CROP_PICASA = 3;
101f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang    private static final int REQUEST_EDIT = 4;
10271cd89a38752bc22ae0ec2df965e4280b776623cChih-Chung Chang    private static final int REQUEST_PLAY_VIDEO = 5;
1033f1f1baf3a674927e25cd5cd885fb372796bd3a0Teng-Hui Zhu    private static final int REQUEST_TRIM = 6;
104f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
105f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public static final String KEY_MEDIA_SET_PATH = "media-set-path";
106f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public static final String KEY_MEDIA_ITEM_PATH = "media-item-path";
107f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public static final String KEY_INDEX_HINT = "index-hint";
10804ac045bf8da5082bbb0bdc9ea5f9c9b5b796ad0Yuli Huang    public static final String KEY_OPEN_ANIMATION_RECT = "open-animation-rect";
109bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    public static final String KEY_APP_BRIDGE = "app-bridge";
11054fe6202b6f7d233e7645c121321fe0f3d20fc8bYuli Huang    public static final String KEY_TREAT_BACK_AS_UP = "treat-back-as-up";
1117eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu    public static final String KEY_START_IN_FILMSTRIP = "start-in-filmstrip";
112bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    public static final String KEY_RETURN_INDEX_HINT = "return-index-hint";
11323e595f0c656ebaeb63f78e3018b5830628c5afeWu-cheng Li    public static final String KEY_SHOW_WHEN_LOCKED = "show_when_locked";
11445f089d69141e3fb0dfaad9bc34d275b61eb2aeeBobby Georgescu    public static final String KEY_IN_CAMERA_ROLL = "in_camera_roll";
115463b918edda204f1563dc2e27976cafa6af9a769John Hoford    public static final String KEY_READONLY = "read-only";
116f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
1177eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu    public static final String KEY_ALBUMPAGE_TRANSITION = "albumpage-transition";
1187eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu    public static final int MSG_ALBUMPAGE_NONE = 0;
1197eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu    public static final int MSG_ALBUMPAGE_STARTED = 1;
1207eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu    public static final int MSG_ALBUMPAGE_RESUMED = 2;
1217eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu    public static final int MSG_ALBUMPAGE_PICKED = 4;
1227eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu
123a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu    public static final String ACTION_NEXTGEN_EDIT = "action_nextgen_edit";
1248c4e95f4380a4104c9968963a363b62746e6c967nicolasroard    public static final String ACTION_SIMPLE_EDIT = "action_simple_edit";
125a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu
126f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private GalleryApp mApplication;
127f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private SelectionManager mSelectionManager;
128f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
129f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private PhotoView mPhotoView;
130f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private PhotoPage.Model mModel;
1314105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen    private DetailsHelper mDetailsHelper;
132f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private boolean mShowDetails;
133f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
134f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    // mMediaSet could be null if there is no KEY_MEDIA_SET_PATH supplied.
135f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    // E.g., viewing a photo in gmail attachment
1366b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang    private FilterDeleteSet mMediaSet;
137f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
138a0ce682e40c39ce046c48d8a7f989fff01bb9f2cWu-cheng Li    // The mediaset used by camera launched from secure lock screen.
139a0ce682e40c39ce046c48d8a7f989fff01bb9f2cWu-cheng Li    private SecureAlbum mSecureAlbum;
140a0ce682e40c39ce046c48d8a7f989fff01bb9f2cWu-cheng Li
141f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private int mCurrentIndex = 0;
142f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private Handler mHandler;
143113bfc77c4468411da9ae1290553c3be89f8df9aOwen Lin    private boolean mShowBars = true;
14461f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang    private volatile boolean mActionBarAllowed = true;
1458cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen    private GalleryActionBar mActionBar;
146f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private boolean mIsMenuVisible;
1478fe22ecb8e744a09a2e0d867f876ecbf74c82298John Reck    private boolean mHaveImageEditor;
148f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu    private PhotoPageBottomControls mBottomControls;
149f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private MediaItem mCurrentPhoto = null;
150f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private MenuExecutor mMenuExecutor;
151f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private boolean mIsActive;
152ba65c373f244f6de0b45afa6b7cd711866f1bfe4Bobby Georgescu    private boolean mShowSpinner;
15384c220f10a643927c8a2126de8a755d8d7f7ec9eRay Chen    private String mSetPathString;
154b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang    // This is the original mSetPathString before adding the camera preview item.
155463b918edda204f1563dc2e27976cafa6af9a769John Hoford    private boolean mReadOnlyView = false;
156b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang    private String mOriginalSetPathString;
157bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    private AppBridge mAppBridge;
1583b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang    private SnailItem mScreenNailItem;
1593b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang    private SnailAlbum mScreenNailSet;
160bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    private OrientationManager mOrientationManager;
16154fe6202b6f7d233e7645c121321fe0f3d20fc8bYuli Huang    private boolean mTreatBackAsUp;
1627eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu    private boolean mStartInFilmstrip;
1633ad7bbc55d7aaa0f36a7242fdd0f612d877adc19Bobby Georgescu    private boolean mHasCameraScreennailOrPlaceholder = false;
164d81b264931cfa3b34096efd46659b81f9a628fb5Bobby Georgescu    private boolean mRecenterCameraOnResume = true;
16515b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang
166a680a0c32ae3321c632288b36083f2782af2c55bDoris Liu    // These are only valid after the panorama callback
167a680a0c32ae3321c632288b36083f2782af2c55bDoris Liu    private boolean mIsPanorama;
168a680a0c32ae3321c632288b36083f2782af2c55bDoris Liu    private boolean mIsPanorama360;
169a680a0c32ae3321c632288b36083f2782af2c55bDoris Liu
170b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu    private long mCameraSwitchCutoff = 0;
171b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu    private boolean mSkipUpdateCurrentPhoto = false;
172b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu    private static final long CAMERA_SWITCH_CUTOFF_THRESHOLD_MS = 300;
173b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu
1744b4dbd225685502f4249c2bf25bf74f7ce526645George Mount    private static final long DEFERRED_UPDATE_MS = 250;
175e23a9d412cba5a202405e1c99c0cf080949db2c7Bobby Georgescu    private boolean mDeferredUpdateWaiting = false;
176e23a9d412cba5a202405e1c99c0cf080949db2c7Bobby Georgescu    private long mDeferUpdateUntil = Long.MAX_VALUE;
177e23a9d412cba5a202405e1c99c0cf080949db2c7Bobby Georgescu
1786b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang    // The item that is deleted (but it can still be undeleted before commiting)
1796b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang    private Path mDeletePath;
1806b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang    private boolean mDeleteIsFocus;  // whether the deleted item was in focus
1816b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang
182ddf0225a5192a589fc578945f56440b09bf74d12John Reck    private Uri[] mNfcPushUris = new Uri[1];
18333ef03776b7734717b16f6fc861b831fb1b1dfacMartijn Coenen
1842bb717f1ea38e2ce33dd102a23afe6bfacb5675cOwen Lin    private final MyMenuVisibilityListener mMenuVisibilityListener =
1852bb717f1ea38e2ce33dd102a23afe6bfacb5675cOwen Lin            new MyMenuVisibilityListener();
1862bb717f1ea38e2ce33dd102a23afe6bfacb5675cOwen Lin
18702f459f8e1ef6d6765c9a57ee1866fc5af2f9eb5ztenghui    private int mLastSystemUiVis = 0;
18802f459f8e1ef6d6765c9a57ee1866fc5af2f9eb5ztenghui
1894b4dbd225685502f4249c2bf25bf74f7ce526645George Mount    private final PanoramaSupportCallback mUpdatePanoramaMenuItemsCallback = new PanoramaSupportCallback() {
1904b4dbd225685502f4249c2bf25bf74f7ce526645George Mount        @Override
1914b4dbd225685502f4249c2bf25bf74f7ce526645George Mount        public void panoramaInfoAvailable(MediaObject mediaObject, boolean isPanorama,
1924b4dbd225685502f4249c2bf25bf74f7ce526645George Mount                boolean isPanorama360) {
1934b4dbd225685502f4249c2bf25bf74f7ce526645George Mount            if (mediaObject == mCurrentPhoto) {
1944b4dbd225685502f4249c2bf25bf74f7ce526645George Mount                mHandler.obtainMessage(MSG_UPDATE_PANORAMA_UI, isPanorama360 ? 1 : 0, 0,
1954b4dbd225685502f4249c2bf25bf74f7ce526645George Mount                        mediaObject).sendToTarget();
196825afb1b3e7d15b5c258d664ee008dc68da1c407Mangesh Ghiware            }
1974b4dbd225685502f4249c2bf25bf74f7ce526645George Mount        }
1984b4dbd225685502f4249c2bf25bf74f7ce526645George Mount    };
1994b4dbd225685502f4249c2bf25bf74f7ce526645George Mount
2004b4dbd225685502f4249c2bf25bf74f7ce526645George Mount    private final PanoramaSupportCallback mRefreshBottomControlsCallback = new PanoramaSupportCallback() {
2014b4dbd225685502f4249c2bf25bf74f7ce526645George Mount        @Override
2024b4dbd225685502f4249c2bf25bf74f7ce526645George Mount        public void panoramaInfoAvailable(MediaObject mediaObject, boolean isPanorama,
2034b4dbd225685502f4249c2bf25bf74f7ce526645George Mount                boolean isPanorama360) {
2044b4dbd225685502f4249c2bf25bf74f7ce526645George Mount            if (mediaObject == mCurrentPhoto) {
205a680a0c32ae3321c632288b36083f2782af2c55bDoris Liu                mHandler.obtainMessage(MSG_REFRESH_BOTTOM_CONTROLS, isPanorama ? 1 : 0, isPanorama360 ? 1 : 0,
206a680a0c32ae3321c632288b36083f2782af2c55bDoris Liu                        mediaObject).sendToTarget();
2074b4dbd225685502f4249c2bf25bf74f7ce526645George Mount            }
2084b4dbd225685502f4249c2bf25bf74f7ce526645George Mount        }
2094b4dbd225685502f4249c2bf25bf74f7ce526645George Mount    };
2104b4dbd225685502f4249c2bf25bf74f7ce526645George Mount
2114b4dbd225685502f4249c2bf25bf74f7ce526645George Mount    private final PanoramaSupportCallback mUpdateShareURICallback = new PanoramaSupportCallback() {
2124b4dbd225685502f4249c2bf25bf74f7ce526645George Mount        @Override
2134b4dbd225685502f4249c2bf25bf74f7ce526645George Mount        public void panoramaInfoAvailable(MediaObject mediaObject, boolean isPanorama,
2144b4dbd225685502f4249c2bf25bf74f7ce526645George Mount                boolean isPanorama360) {
2154b4dbd225685502f4249c2bf25bf74f7ce526645George Mount            if (mediaObject == mCurrentPhoto) {
2164b4dbd225685502f4249c2bf25bf74f7ce526645George Mount                mHandler.obtainMessage(MSG_UPDATE_SHARE_URI, isPanorama360 ? 1 : 0, 0, mediaObject)
2174b4dbd225685502f4249c2bf25bf74f7ce526645George Mount                        .sendToTarget();
2184b4dbd225685502f4249c2bf25bf74f7ce526645George Mount            }
2194b4dbd225685502f4249c2bf25bf74f7ce526645George Mount        }
2204b4dbd225685502f4249c2bf25bf74f7ce526645George Mount    };
221825afb1b3e7d15b5c258d664ee008dc68da1c407Mangesh Ghiware
222f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public static interface Model extends PhotoView.Model {
223f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        public void resume();
224f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        public void pause();
225f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        public boolean isEmpty();
226f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        public void setCurrentPhoto(Path path, int indexHint);
227f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
228f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
229f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private class MyMenuVisibilityListener implements OnMenuVisibilityListener {
23006c6401eededc2ec842ba4994a838c2ded0a666cPin Ting        @Override
231f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        public void onMenuVisibilityChanged(boolean isVisible) {
232f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            mIsMenuVisible = isVisible;
233f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            refreshHidingMessage();
234f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
235f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
236f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
237915c2c5b2c367df71599370613af0924bd7c4887Bobby Georgescu    @Override
238915c2c5b2c367df71599370613af0924bd7c4887Bobby Georgescu    protected int getBackgroundColorId() {
239915c2c5b2c367df71599370613af0924bd7c4887Bobby Georgescu        return R.color.photo_background;
240915c2c5b2c367df71599370613af0924bd7c4887Bobby Georgescu    }
241915c2c5b2c367df71599370613af0924bd7c4887Bobby Georgescu
242f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu    private final GLView mRootPane = new GLView() {
243f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        @Override
244f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        protected void onLayout(
245f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                boolean changed, int left, int top, int right, int bottom) {
246f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            mPhotoView.layout(0, 0, right - left, bottom - top);
247f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            if (mShowDetails) {
2488cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen                mDetailsHelper.layout(left, mActionBar.getHeight(), right, bottom);
249f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            }
250f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
251f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    };
252f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
253f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    @Override
254f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public void onCreate(Bundle data, Bundle restoreState) {
25545c56f2d34c71d0bc9b84ebeef6d1314738d0fc0Bobby Georgescu        super.onCreate(data, restoreState);
2568cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen        mActionBar = mActivity.getGalleryActionBar();
257f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mSelectionManager = new SelectionManager(mActivity, false);
258f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mMenuExecutor = new MenuExecutor(mActivity, mSelectionManager);
259f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
260f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mPhotoView = new PhotoView(mActivity);
261bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang        mPhotoView.setListener(this);
262f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mRootPane.addComponent(mPhotoView);
26383be4e0c9b8e3372eff8f9b1a396afd961b72921Angus Kong        mApplication = (GalleryApp) ((Activity) mActivity).getApplication();
264bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang        mOrientationManager = mActivity.getOrientationManager();
2652ef46ed28b28b355d7f3f1432c7b1196b832a859Chih-Chung Chang        mActivity.getGLRoot().setOrientationSource(mOrientationManager);
266f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
267d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu        mHandler = new SynchronizedHandler(mActivity.getGLRoot()) {
268d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu            @Override
269d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu            public void handleMessage(Message message) {
270d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu                switch (message.what) {
271d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu                    case MSG_HIDE_BARS: {
272d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu                        hideBars();
273d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu                        break;
274d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu                    }
275f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu                    case MSG_REFRESH_BOTTOM_CONTROLS: {
2764b4dbd225685502f4249c2bf25bf74f7ce526645George Mount                        if (mCurrentPhoto == message.obj && mBottomControls != null) {
277a680a0c32ae3321c632288b36083f2782af2c55bDoris Liu                            mIsPanorama = message.arg1 == 1;
278a680a0c32ae3321c632288b36083f2782af2c55bDoris Liu                            mIsPanorama360 = message.arg2 == 1;
279a680a0c32ae3321c632288b36083f2782af2c55bDoris Liu                            mBottomControls.refresh();
2804b4dbd225685502f4249c2bf25bf74f7ce526645George Mount                        }
281d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu                        break;
282d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu                    }
283d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu                    case MSG_ON_FULL_SCREEN_CHANGED: {
284db99a10b6ac9296d612db8ba51e37f141fee4170Bobby Georgescu                        if (mAppBridge != null) {
285db99a10b6ac9296d612db8ba51e37f141fee4170Bobby Georgescu                            mAppBridge.onFullScreenChanged(message.arg1 == 1);
286db99a10b6ac9296d612db8ba51e37f141fee4170Bobby Georgescu                        }
287d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu                        break;
288d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu                    }
289d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu                    case MSG_UPDATE_ACTION_BAR: {
290d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu                        updateBars();
291d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu                        break;
292d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu                    }
293d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu                    case MSG_WANT_BARS: {
294d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu                        wantBars();
295d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu                        break;
296d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu                    }
297d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu                    case MSG_UNFREEZE_GLROOT: {
298d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu                        mActivity.getGLRoot().unfreeze();
299d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu                        break;
300d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu                    }
301e23a9d412cba5a202405e1c99c0cf080949db2c7Bobby Georgescu                    case MSG_UPDATE_DEFERRED: {
302e23a9d412cba5a202405e1c99c0cf080949db2c7Bobby Georgescu                        long nextUpdate = mDeferUpdateUntil - SystemClock.uptimeMillis();
303e23a9d412cba5a202405e1c99c0cf080949db2c7Bobby Georgescu                        if (nextUpdate <= 0) {
304e23a9d412cba5a202405e1c99c0cf080949db2c7Bobby Georgescu                            mDeferredUpdateWaiting = false;
305e23a9d412cba5a202405e1c99c0cf080949db2c7Bobby Georgescu                            updateUIForCurrentPhoto();
306e23a9d412cba5a202405e1c99c0cf080949db2c7Bobby Georgescu                        } else {
307e23a9d412cba5a202405e1c99c0cf080949db2c7Bobby Georgescu                            mHandler.sendEmptyMessageDelayed(MSG_UPDATE_DEFERRED, nextUpdate);
308e23a9d412cba5a202405e1c99c0cf080949db2c7Bobby Georgescu                        }
309e23a9d412cba5a202405e1c99c0cf080949db2c7Bobby Georgescu                        break;
310e23a9d412cba5a202405e1c99c0cf080949db2c7Bobby Georgescu                    }
311b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu                    case MSG_ON_CAMERA_CENTER: {
312b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu                        mSkipUpdateCurrentPhoto = false;
313bbc993162d687df20e2ff9a329bb9b6e04926ba8Bobby Georgescu                        boolean stayedOnCamera = false;
314b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu                        if (!mPhotoView.getFilmMode()) {
315bbc993162d687df20e2ff9a329bb9b6e04926ba8Bobby Georgescu                            stayedOnCamera = true;
316b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu                        } else if (SystemClock.uptimeMillis() < mCameraSwitchCutoff &&
317b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu                                mMediaSet.getMediaItemCount() > 1) {
318b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu                            mPhotoView.switchToImage(1);
319b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu                        } else {
320cc6ad8217cb09b778d400c9c5e5928170ca53737Bobby Georgescu                            if (mAppBridge != null) mPhotoView.setFilmMode(false);
321bbc993162d687df20e2ff9a329bb9b6e04926ba8Bobby Georgescu                            stayedOnCamera = true;
322b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu                        }
323b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu
324bbc993162d687df20e2ff9a329bb9b6e04926ba8Bobby Georgescu                        if (stayedOnCamera) {
325617551e3e0016dc5ea9f3f1c4d1c9d8c0eab3f25Bobby Georgescu                            if (mAppBridge == null && mMediaSet.getTotalMediaItemCount() > 1) {
3265bd00332556b20c141b5c7f16433d55b1bc7fe0fBobby Georgescu                                launchCamera();
327cc6ad8217cb09b778d400c9c5e5928170ca53737Bobby Georgescu                                /* We got here by swiping from photo 1 to the
328cc6ad8217cb09b778d400c9c5e5928170ca53737Bobby Georgescu                                   placeholder, so make it be the thing that
329cc6ad8217cb09b778d400c9c5e5928170ca53737Bobby Georgescu                                   is in focus when the user presses back from
330cc6ad8217cb09b778d400c9c5e5928170ca53737Bobby Georgescu                                   the camera app */
331cc6ad8217cb09b778d400c9c5e5928170ca53737Bobby Georgescu                                mPhotoView.switchToImage(1);
332cc6ad8217cb09b778d400c9c5e5928170ca53737Bobby Georgescu                            } else {
333cc6ad8217cb09b778d400c9c5e5928170ca53737Bobby Georgescu                                updateBars();
334cc6ad8217cb09b778d400c9c5e5928170ca53737Bobby Georgescu                                updateCurrentPhoto(mModel.getMediaItem(0));
335cc6ad8217cb09b778d400c9c5e5928170ca53737Bobby Georgescu                            }
336b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu                        }
337b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu                        break;
338b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu                    }
339f4e22eb44bfae0c2a3b6570f19480c8c3535d808Bobby Georgescu                    case MSG_ON_PICTURE_CENTER: {
340e23a9d412cba5a202405e1c99c0cf080949db2c7Bobby Georgescu                        if (!mPhotoView.getFilmMode() && mCurrentPhoto != null
341f4e22eb44bfae0c2a3b6570f19480c8c3535d808Bobby Georgescu                                && (mCurrentPhoto.getSupportedOperations() & MediaObject.SUPPORT_ACTION) != 0) {
342f4e22eb44bfae0c2a3b6570f19480c8c3535d808Bobby Georgescu                            mPhotoView.setFilmMode(true);
343f4e22eb44bfae0c2a3b6570f19480c8c3535d808Bobby Georgescu                        }
344f4e22eb44bfae0c2a3b6570f19480c8c3535d808Bobby Georgescu                        break;
345f4e22eb44bfae0c2a3b6570f19480c8c3535d808Bobby Georgescu                    }
346f122d56e15e00928d731751796b0509ae47c6799George Mount                    case MSG_REFRESH_IMAGE: {
347423e45e492d4ebdc41ecfeba73299de23b1463c4Mangesh Ghiware                        final MediaItem photo = mCurrentPhoto;
348423e45e492d4ebdc41ecfeba73299de23b1463c4Mangesh Ghiware                        mCurrentPhoto = null;
349423e45e492d4ebdc41ecfeba73299de23b1463c4Mangesh Ghiware                        updateCurrentPhoto(photo);
350423e45e492d4ebdc41ecfeba73299de23b1463c4Mangesh Ghiware                        break;
351423e45e492d4ebdc41ecfeba73299de23b1463c4Mangesh Ghiware                    }
352423e45e492d4ebdc41ecfeba73299de23b1463c4Mangesh Ghiware                    case MSG_UPDATE_PHOTO_UI: {
353825afb1b3e7d15b5c258d664ee008dc68da1c407Mangesh Ghiware                        updateUIForCurrentPhoto();
354825afb1b3e7d15b5c258d664ee008dc68da1c407Mangesh Ghiware                        break;
355825afb1b3e7d15b5c258d664ee008dc68da1c407Mangesh Ghiware                    }
3564b4dbd225685502f4249c2bf25bf74f7ce526645George Mount                    case MSG_UPDATE_SHARE_URI: {
3574b4dbd225685502f4249c2bf25bf74f7ce526645George Mount                        if (mCurrentPhoto == message.obj) {
3584b4dbd225685502f4249c2bf25bf74f7ce526645George Mount                            boolean isPanorama360 = message.arg1 != 0;
3594b4dbd225685502f4249c2bf25bf74f7ce526645George Mount                            Uri contentUri = mCurrentPhoto.getContentUri();
3604b4dbd225685502f4249c2bf25bf74f7ce526645George Mount                            Intent panoramaIntent = null;
3614b4dbd225685502f4249c2bf25bf74f7ce526645George Mount                            if (isPanorama360) {
3624b4dbd225685502f4249c2bf25bf74f7ce526645George Mount                                panoramaIntent = createSharePanoramaIntent(contentUri);
3634b4dbd225685502f4249c2bf25bf74f7ce526645George Mount                            }
3644b4dbd225685502f4249c2bf25bf74f7ce526645George Mount                            Intent shareIntent = createShareIntent(mCurrentPhoto);
3654b4dbd225685502f4249c2bf25bf74f7ce526645George Mount
3662251386437163898eb4b6f7546705d1365744fd1Flavio Lerda                            mActionBar.setShareIntents(panoramaIntent, shareIntent, PhotoPage.this);
3674b4dbd225685502f4249c2bf25bf74f7ce526645George Mount                            setNfcBeamPushUri(contentUri);
3684b4dbd225685502f4249c2bf25bf74f7ce526645George Mount                        }
3694b4dbd225685502f4249c2bf25bf74f7ce526645George Mount                        break;
3704b4dbd225685502f4249c2bf25bf74f7ce526645George Mount                    }
3714b4dbd225685502f4249c2bf25bf74f7ce526645George Mount                    case MSG_UPDATE_PANORAMA_UI: {
3724b4dbd225685502f4249c2bf25bf74f7ce526645George Mount                        if (mCurrentPhoto == message.obj) {
3734b4dbd225685502f4249c2bf25bf74f7ce526645George Mount                            boolean isPanorama360 = message.arg1 != 0;
3744b4dbd225685502f4249c2bf25bf74f7ce526645George Mount                            updatePanoramaUI(isPanorama360);
3754b4dbd225685502f4249c2bf25bf74f7ce526645George Mount                        }
3764b4dbd225685502f4249c2bf25bf74f7ce526645George Mount                        break;
3774b4dbd225685502f4249c2bf25bf74f7ce526645George Mount                    }
378d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu                    default: throw new AssertionError(message.what);
379d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu                }
380d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu            }
381d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu        };
382d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu
38384c220f10a643927c8a2126de8a755d8d7f7ec9eRay Chen        mSetPathString = data.getString(KEY_MEDIA_SET_PATH);
384463b918edda204f1563dc2e27976cafa6af9a769John Hoford        mReadOnlyView = data.getBoolean(KEY_READONLY);
385b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang        mOriginalSetPathString = mSetPathString;
386ddf0225a5192a589fc578945f56440b09bf74d12John Reck        setupNfcBeamPush();
3877eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu        String itemPathString = data.getString(KEY_MEDIA_ITEM_PATH);
3887eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu        Path itemPath = itemPathString != null ?
3897eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu                Path.fromString(data.getString(KEY_MEDIA_ITEM_PATH)) :
3907eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu                    null;
39154fe6202b6f7d233e7645c121321fe0f3d20fc8bYuli Huang        mTreatBackAsUp = data.getBoolean(KEY_TREAT_BACK_AS_UP, false);
39245f089d69141e3fb0dfaad9bc34d275b61eb2aeeBobby Georgescu        mStartInFilmstrip = data.getBoolean(KEY_START_IN_FILMSTRIP, false);
3933ad7bbc55d7aaa0f36a7242fdd0f612d877adc19Bobby Georgescu        boolean inCameraRoll = data.getBoolean(KEY_IN_CAMERA_ROLL, false);
39445f089d69141e3fb0dfaad9bc34d275b61eb2aeeBobby Georgescu        mCurrentIndex = data.getInt(KEY_INDEX_HINT, 0);
39584c220f10a643927c8a2126de8a755d8d7f7ec9eRay Chen        if (mSetPathString != null) {
396ba65c373f244f6de0b45afa6b7cd711866f1bfe4Bobby Georgescu            mShowSpinner = true;
397bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang            mAppBridge = (AppBridge) data.getParcelable(KEY_APP_BRIDGE);
398bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang            if (mAppBridge != null) {
3997eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu                mShowBars = false;
4003ad7bbc55d7aaa0f36a7242fdd0f612d877adc19Bobby Georgescu                mHasCameraScreennailOrPlaceholder = true;
401253c5aec7692afdd7880fbd169d4b44d5679cbc0Chih-Chung Chang                mAppBridge.setServer(this);
402b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang
403bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang                // Get the ScreenNail from AppBridge and register it.
4043b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang                int id = SnailSource.newId();
405b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang                Path screenNailSetPath = SnailSource.getSetPath(id);
406bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang                Path screenNailItemPath = SnailSource.getItemPath(id);
4073b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang                mScreenNailSet = (SnailAlbum) mActivity.getDataManager()
4083b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang                        .getMediaObject(screenNailSetPath);
4093b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang                mScreenNailItem = (SnailItem) mActivity.getDataManager()
410bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang                        .getMediaObject(screenNailItemPath);
4113b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang                mScreenNailItem.setScreenNail(mAppBridge.attachScreenNail());
412b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang
41323e595f0c656ebaeb63f78e3018b5830628c5afeWu-cheng Li                if (data.getBoolean(KEY_SHOW_WHEN_LOCKED, false)) {
414efd480e85dc5bd0d2ca0ac82d03e141212388830Wu-cheng Li                    // Set the flag to be on top of the lock screen.
415efd480e85dc5bd0d2ca0ac82d03e141212388830Wu-cheng Li                    mFlags |= FLAG_SHOW_WHEN_LOCKED;
416a0ce682e40c39ce046c48d8a7f989fff01bb9f2cWu-cheng Li                }
417a0ce682e40c39ce046c48d8a7f989fff01bb9f2cWu-cheng Li
4184e091eb758a3ac1016b373419cea1ada1b977bc5George Mount                // Don't display "empty album" action item for capture intents.
4192c83c5f09aa79d81ee11da517fd62222f8c3337dWu-cheng Li                if (!mSetPathString.equals("/local/all/0")) {
4202c83c5f09aa79d81ee11da517fd62222f8c3337dWu-cheng Li                    // Check if the path is a secure album.
4212c83c5f09aa79d81ee11da517fd62222f8c3337dWu-cheng Li                    if (SecureSource.isSecurePath(mSetPathString)) {
4222c83c5f09aa79d81ee11da517fd62222f8c3337dWu-cheng Li                        mSecureAlbum = (SecureAlbum) mActivity.getDataManager()
4232c83c5f09aa79d81ee11da517fd62222f8c3337dWu-cheng Li                                .getMediaSet(mSetPathString);
4242c83c5f09aa79d81ee11da517fd62222f8c3337dWu-cheng Li                        mShowSpinner = false;
4252c83c5f09aa79d81ee11da517fd62222f8c3337dWu-cheng Li                    }
426c7e3c76d6965f520a9651d309052c5f01726cd58Bobby Georgescu                    mSetPathString = "/filter/empty/{"+mSetPathString+"}";
427c7e3c76d6965f520a9651d309052c5f01726cd58Bobby Georgescu                }
428c7e3c76d6965f520a9651d309052c5f01726cd58Bobby Georgescu
4293b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang                // Combine the original MediaSet with the one for ScreenNail
4303b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang                // from AppBridge.
431b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang                mSetPathString = "/combo/item/{" + screenNailSetPath +
432b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang                        "," + mSetPathString + "}";
433b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang
434b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang                // Start from the screen nail.
435bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang                itemPath = screenNailItemPath;
4363ad7bbc55d7aaa0f36a7242fdd0f612d877adc19Bobby Georgescu            } else if (inCameraRoll && GalleryUtils.isCameraAvailable(mActivity)) {
43745f089d69141e3fb0dfaad9bc34d275b61eb2aeeBobby Georgescu                mSetPathString = "/combo/item/{" + FilterSource.FILTER_CAMERA_SHORTCUT +
43845f089d69141e3fb0dfaad9bc34d275b61eb2aeeBobby Georgescu                        "," + mSetPathString + "}";
43945f089d69141e3fb0dfaad9bc34d275b61eb2aeeBobby Georgescu                mCurrentIndex++;
4403ad7bbc55d7aaa0f36a7242fdd0f612d877adc19Bobby Georgescu                mHasCameraScreennailOrPlaceholder = true;
441b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang            }
442b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang
4436118af9ddad8acc050133154f8f60c842c7f9bfaChih-Chung Chang            MediaSet originalSet = mActivity.getDataManager()
4446118af9ddad8acc050133154f8f60c842c7f9bfaChih-Chung Chang                    .getMediaSet(mSetPathString);
4453ad7bbc55d7aaa0f36a7242fdd0f612d877adc19Bobby Georgescu            if (mHasCameraScreennailOrPlaceholder && originalSet instanceof ComboAlbum) {
446ee899c09c88e5b054397ac44ad20e5055cd24f39Bobby Georgescu                // Use the name of the camera album rather than the default
447ee899c09c88e5b054397ac44ad20e5055cd24f39Bobby Georgescu                // ComboAlbum behavior
448ee899c09c88e5b054397ac44ad20e5055cd24f39Bobby Georgescu                ((ComboAlbum) originalSet).useNameOfChild(1);
449ee899c09c88e5b054397ac44ad20e5055cd24f39Bobby Georgescu            }
4506118af9ddad8acc050133154f8f60c842c7f9bfaChih-Chung Chang            mSelectionManager.setSourceMediaSet(originalSet);
4516b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang            mSetPathString = "/filter/delete/{" + mSetPathString + "}";
4526b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang            mMediaSet = (FilterDeleteSet) mActivity.getDataManager()
4536b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang                    .getMediaSet(mSetPathString);
454f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            if (mMediaSet == null) {
45584c220f10a643927c8a2126de8a755d8d7f7ec9eRay Chen                Log.w(TAG, "failed to restore " + mSetPathString);
456f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            }
4577eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu            if (itemPath == null) {
4583eb2e643a40d1be77998373343cdf8b14764f58cBobby Georgescu                int mediaItemCount = mMediaSet.getMediaItemCount();
4593eb2e643a40d1be77998373343cdf8b14764f58cBobby Georgescu                if (mediaItemCount > 0) {
4603eb2e643a40d1be77998373343cdf8b14764f58cBobby Georgescu                    if (mCurrentIndex >= mediaItemCount) mCurrentIndex = 0;
461d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu                    itemPath = mMediaSet.getMediaItem(mCurrentIndex, 1)
462d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu                        .get(0).getPath();
463d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu                } else {
4643eb2e643a40d1be77998373343cdf8b14764f58cBobby Georgescu                    // Bail out, PhotoPage can't load on an empty album
465d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu                    return;
466d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu                }
4677eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu            }
468f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            PhotoDataAdapter pda = new PhotoDataAdapter(
469bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang                    mActivity, mPhotoView, mMediaSet, itemPath, mCurrentIndex,
47043a80fd806247cb50e81bacda3ad21d210e9ae88Angus Kong                    mAppBridge == null ? -1 : 0,
471dbb6acc204ba6f095eb0e49e1298e9ceda2c3096Wu-cheng Li                    mAppBridge == null ? false : mAppBridge.isPanorama(),
472dbb6acc204ba6f095eb0e49e1298e9ceda2c3096Wu-cheng Li                    mAppBridge == null ? false : mAppBridge.isStaticCamera());
473f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            mModel = pda;
474f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            mPhotoView.setModel(mModel);
475f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
476f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            pda.setDataListener(new PhotoDataAdapter.DataListener() {
477f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
478113bfc77c4468411da9ae1290553c3be89f8df9aOwen Lin                @Override
479f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                public void onPhotoChanged(int index, Path item) {
48000ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu                    int oldIndex = mCurrentIndex;
481f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                    mCurrentIndex = index;
482b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu
4833ad7bbc55d7aaa0f36a7242fdd0f612d877adc19Bobby Georgescu                    if (mHasCameraScreennailOrPlaceholder) {
484b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu                        if (mCurrentIndex > 0) {
485b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu                            mSkipUpdateCurrentPhoto = false;
486b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu                        }
487b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu
48800ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu                        if (oldIndex == 0 && mCurrentIndex > 0
48900ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu                                && !mPhotoView.getFilmMode()) {
49000ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu                            mPhotoView.setFilmMode(true);
4919b4c3e9fa3f921e40f4abc549983fd35fb0a0a85Bobby Georgescu                            if (mAppBridge != null) {
4929b4c3e9fa3f921e40f4abc549983fd35fb0a0a85Bobby Georgescu                                UsageStatistics.onEvent("CameraToFilmstrip",
4939b4c3e9fa3f921e40f4abc549983fd35fb0a0a85Bobby Georgescu                                        UsageStatistics.TRANSITION_SWIPE, null);
4949b4c3e9fa3f921e40f4abc549983fd35fb0a0a85Bobby Georgescu                            }
495b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu                        } else if (oldIndex == 2 && mCurrentIndex == 1) {
496b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu                            mCameraSwitchCutoff = SystemClock.uptimeMillis() +
497b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu                                    CAMERA_SWITCH_CUTOFF_THRESHOLD_MS;
498b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu                            mPhotoView.stopScrolling();
499bbc993162d687df20e2ff9a329bb9b6e04926ba8Bobby Georgescu                        } else if (oldIndex >= 1 && mCurrentIndex == 0) {
500f4e22eb44bfae0c2a3b6570f19480c8c3535d808Bobby Georgescu                            mPhotoView.setWantPictureCenterCallbacks(true);
501b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu                            mSkipUpdateCurrentPhoto = true;
50200ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu                        }
50300ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu                    }
504b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu                    if (!mSkipUpdateCurrentPhoto) {
505b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu                        if (item != null) {
506b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu                            MediaItem photo = mModel.getMediaItem(0);
507b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu                            if (photo != null) updateCurrentPhoto(photo);
508b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu                        }
509b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu                        updateBars();
510b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu                    }
51100ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu                    // Reset the timeout for the bars after a swipe
51200ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu                    refreshHidingMessage();
513f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                }
514f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
515f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                @Override
51605da3f520eacb9219964b6ed57ef37846d889fd7Hung-ying Tyan                public void onLoadingFinished(boolean loadingFailed) {
517f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                    if (!mModel.isEmpty()) {
518616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin                        MediaItem photo = mModel.getMediaItem(0);
519f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                        if (photo != null) updateCurrentPhoto(photo);
520f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                    } else if (mIsActive) {
521c370476adcf29f311ceec70a119792a0168781e9Chih-Chung Chang                        // We only want to finish the PhotoPage if there is no
522c370476adcf29f311ceec70a119792a0168781e9Chih-Chung Chang                        // deletion that the user can undo.
523c370476adcf29f311ceec70a119792a0168781e9Chih-Chung Chang                        if (mMediaSet.getNumberOfDeletions() == 0) {
524c370476adcf29f311ceec70a119792a0168781e9Chih-Chung Chang                            mActivity.getStateManager().finishState(
525c370476adcf29f311ceec70a119792a0168781e9Chih-Chung Chang                                    PhotoPage.this);
526c370476adcf29f311ceec70a119792a0168781e9Chih-Chung Chang                        }
527f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                    }
528f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                }
529f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
530f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                @Override
531f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                public void onLoadingStarted() {
532f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                }
533f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            });
534f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        } else {
535f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            // Get default media set by the URI
536f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            MediaItem mediaItem = (MediaItem)
537f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                    mActivity.getDataManager().getMediaObject(itemPath);
538f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            mModel = new SinglePhotoDataAdapter(mActivity, mPhotoView, mediaItem);
539f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            mPhotoView.setModel(mModel);
540f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            updateCurrentPhoto(mediaItem);
541ba65c373f244f6de0b45afa6b7cd711866f1bfe4Bobby Georgescu            mShowSpinner = false;
542f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
543cf46a3abc26aac7cdb6b6993aeade053304b71d9Ray Chen
544b265ebb01cc046b74329eeb28dbecb24e0f953d2Bobby Georgescu        mPhotoView.setFilmMode(mStartInFilmstrip && mMediaSet.getMediaItemCount() > 1);
545f122d56e15e00928d731751796b0509ae47c6799George Mount        RelativeLayout galleryRoot = (RelativeLayout) ((Activity) mActivity)
546f122d56e15e00928d731751796b0509ae47c6799George Mount                .findViewById(mAppBridge != null ? R.id.content : R.id.gallery_root);
547f122d56e15e00928d731751796b0509ae47c6799George Mount        if (galleryRoot != null) {
548f122d56e15e00928d731751796b0509ae47c6799George Mount            if (mSecureAlbum == null) {
549f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu                mBottomControls = new PhotoPageBottomControls(this, mActivity, galleryRoot);
550f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu            }
551f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu        }
55202f459f8e1ef6d6765c9a57ee1866fc5af2f9eb5ztenghui
55302f459f8e1ef6d6765c9a57ee1866fc5af2f9eb5ztenghui        ((GLRootView) mActivity.getGLRoot()).setOnSystemUiVisibilityChangeListener(
55402f459f8e1ef6d6765c9a57ee1866fc5af2f9eb5ztenghui                new View.OnSystemUiVisibilityChangeListener() {
55502f459f8e1ef6d6765c9a57ee1866fc5af2f9eb5ztenghui                @Override
55602f459f8e1ef6d6765c9a57ee1866fc5af2f9eb5ztenghui                    public void onSystemUiVisibilityChange(int visibility) {
55702f459f8e1ef6d6765c9a57ee1866fc5af2f9eb5ztenghui                        int diff = mLastSystemUiVis ^ visibility;
55802f459f8e1ef6d6765c9a57ee1866fc5af2f9eb5ztenghui                        mLastSystemUiVis = visibility;
55902f459f8e1ef6d6765c9a57ee1866fc5af2f9eb5ztenghui                        if ((diff & View.SYSTEM_UI_FLAG_FULLSCREEN) != 0
56002f459f8e1ef6d6765c9a57ee1866fc5af2f9eb5ztenghui                                && (visibility & View.SYSTEM_UI_FLAG_FULLSCREEN) == 0) {
56102f459f8e1ef6d6765c9a57ee1866fc5af2f9eb5ztenghui                            showBars();
56202f459f8e1ef6d6765c9a57ee1866fc5af2f9eb5ztenghui                        }
56302f459f8e1ef6d6765c9a57ee1866fc5af2f9eb5ztenghui                    }
56402f459f8e1ef6d6765c9a57ee1866fc5af2f9eb5ztenghui                });
565a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu    }
566a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu
567e3b50f1bfcfa5c8729f31788eac1a6109a88988bSascha Haeberling    @Override
568f4e22eb44bfae0c2a3b6570f19480c8c3535d808Bobby Georgescu    public void onPictureCenter(boolean isCamera) {
5693ad7bbc55d7aaa0f36a7242fdd0f612d877adc19Bobby Georgescu        isCamera = isCamera || (mHasCameraScreennailOrPlaceholder && mAppBridge == null);
570f4e22eb44bfae0c2a3b6570f19480c8c3535d808Bobby Georgescu        mPhotoView.setWantPictureCenterCallbacks(false);
571f4e22eb44bfae0c2a3b6570f19480c8c3535d808Bobby Georgescu        mHandler.removeMessages(MSG_ON_CAMERA_CENTER);
572f4e22eb44bfae0c2a3b6570f19480c8c3535d808Bobby Georgescu        mHandler.removeMessages(MSG_ON_PICTURE_CENTER);
573f4e22eb44bfae0c2a3b6570f19480c8c3535d808Bobby Georgescu        mHandler.sendEmptyMessage(isCamera ? MSG_ON_CAMERA_CENTER : MSG_ON_PICTURE_CENTER);
574b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu    }
575b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu
576e3b50f1bfcfa5c8729f31788eac1a6109a88988bSascha Haeberling    @Override
577f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu    public boolean canDisplayBottomControls() {
578949584340c9f5f41a6133ba06058af280490f0c8Bobby Georgescu        return mIsActive && !mPhotoView.canUndo();
579a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu    }
580a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu
581e3b50f1bfcfa5c8729f31788eac1a6109a88988bSascha Haeberling    @Override
582a680a0c32ae3321c632288b36083f2782af2c55bDoris Liu    public boolean canDisplayBottomControl(int control) {
5834b4dbd225685502f4249c2bf25bf74f7ce526645George Mount        if (mCurrentPhoto == null) {
5844b4dbd225685502f4249c2bf25bf74f7ce526645George Mount            return false;
5854b4dbd225685502f4249c2bf25bf74f7ce526645George Mount        }
586f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu        switch(control) {
587f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu            case R.id.photopage_bottom_control_edit:
588463b918edda204f1563dc2e27976cafa6af9a769John Hoford                return mHaveImageEditor && mShowBars && !mReadOnlyView
589c02be7d6224c0b4e81c86e19c3d101ea070c7e1dBobby Georgescu                        && !mPhotoView.getFilmMode()
5904b4dbd225685502f4249c2bf25bf74f7ce526645George Mount                        && (mCurrentPhoto.getSupportedOperations() & MediaItem.SUPPORT_EDIT) != 0
5914b4dbd225685502f4249c2bf25bf74f7ce526645George Mount                        && mCurrentPhoto.getMediaType() == MediaObject.MEDIA_TYPE_IMAGE;
592f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu            case R.id.photopage_bottom_control_panorama:
593a680a0c32ae3321c632288b36083f2782af2c55bDoris Liu                return mIsPanorama;
594a680a0c32ae3321c632288b36083f2782af2c55bDoris Liu            case R.id.photopage_bottom_control_tiny_planet:
595a680a0c32ae3321c632288b36083f2782af2c55bDoris Liu                return mHaveImageEditor && mShowBars
596c02be7d6224c0b4e81c86e19c3d101ea070c7e1dBobby Georgescu                        && mIsPanorama360 && !mPhotoView.getFilmMode();
597f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu            default:
598f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu                return false;
599f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu        }
600a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu    }
601a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu
602e3b50f1bfcfa5c8729f31788eac1a6109a88988bSascha Haeberling    @Override
603f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu    public void onBottomControlClicked(int control) {
604f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu        switch(control) {
605f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu            case R.id.photopage_bottom_control_edit:
606f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu                launchPhotoEditor();
607f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu                return;
608f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu            case R.id.photopage_bottom_control_panorama:
609e3b50f1bfcfa5c8729f31788eac1a6109a88988bSascha Haeberling                mActivity.getPanoramaViewHelper()
610e3b50f1bfcfa5c8729f31788eac1a6109a88988bSascha Haeberling                        .showPanorama(mCurrentPhoto.getContentUri());
611f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu                return;
612a680a0c32ae3321c632288b36083f2782af2c55bDoris Liu            case R.id.photopage_bottom_control_tiny_planet:
613a680a0c32ae3321c632288b36083f2782af2c55bDoris Liu                launchTinyPlanet();
614a680a0c32ae3321c632288b36083f2782af2c55bDoris Liu                return;
615f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu            default:
616f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu                return;
617a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu        }
618f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
619f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
6206772173d2a49b87a1d209f42fe52b5f830596f99Chih-Chung Chang    @TargetApi(ApiHelper.VERSION_CODES.JELLY_BEAN)
621ddf0225a5192a589fc578945f56440b09bf74d12John Reck    private void setupNfcBeamPush() {
622ddf0225a5192a589fc578945f56440b09bf74d12John Reck        if (!ApiHelper.HAS_SET_BEAM_PUSH_URIS) return;
623ddf0225a5192a589fc578945f56440b09bf74d12John Reck
624ddf0225a5192a589fc578945f56440b09bf74d12John Reck        NfcAdapter adapter = NfcAdapter.getDefaultAdapter(mActivity);
625ddf0225a5192a589fc578945f56440b09bf74d12John Reck        if (adapter != null) {
6262619f20d30123a391cc6d37515fe8eb9d81d5029John Reck            adapter.setBeamPushUris(null, mActivity);
627ddf0225a5192a589fc578945f56440b09bf74d12John Reck            adapter.setBeamPushUrisCallback(new CreateBeamUrisCallback() {
628ddf0225a5192a589fc578945f56440b09bf74d12John Reck                @Override
629ddf0225a5192a589fc578945f56440b09bf74d12John Reck                public Uri[] createBeamUris(NfcEvent event) {
630ddf0225a5192a589fc578945f56440b09bf74d12John Reck                    return mNfcPushUris;
631ddf0225a5192a589fc578945f56440b09bf74d12John Reck                }
632ddf0225a5192a589fc578945f56440b09bf74d12John Reck            }, mActivity);
633fc86994f86f8cfb31e151c9e730dc1e9dc7b3349Yuli Huang        }
634fc86994f86f8cfb31e151c9e730dc1e9dc7b3349Yuli Huang    }
635fc86994f86f8cfb31e151c9e730dc1e9dc7b3349Yuli Huang
636ddf0225a5192a589fc578945f56440b09bf74d12John Reck    private void setNfcBeamPushUri(Uri uri) {
637ddf0225a5192a589fc578945f56440b09bf74d12John Reck        mNfcPushUris[0] = uri;
638ddf0225a5192a589fc578945f56440b09bf74d12John Reck    }
639ddf0225a5192a589fc578945f56440b09bf74d12John Reck
6404b4dbd225685502f4249c2bf25bf74f7ce526645George Mount    private static Intent createShareIntent(MediaObject mediaObject) {
6414b4dbd225685502f4249c2bf25bf74f7ce526645George Mount        int type = mediaObject.getMediaType();
642ca181a68a30ad830d55eb8886f62a323c64e1ba3Owen Lin        return new Intent(Intent.ACTION_SEND)
643ca181a68a30ad830d55eb8886f62a323c64e1ba3Owen Lin                .setType(MenuExecutor.getMimeType(type))
6444b4dbd225685502f4249c2bf25bf74f7ce526645George Mount                .putExtra(Intent.EXTRA_STREAM, mediaObject.getContentUri())
645ca181a68a30ad830d55eb8886f62a323c64e1ba3Owen Lin                .addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
6465172dee697c05235ddf932827d75e6fa0b81d382Mangesh Ghiware    }
647fb5571987f2555b04731b6f3e1c479efc16d542aWu-cheng Li
6484b4dbd225685502f4249c2bf25bf74f7ce526645George Mount    private static Intent createSharePanoramaIntent(Uri contentUri) {
649ca181a68a30ad830d55eb8886f62a323c64e1ba3Owen Lin        return new Intent(Intent.ACTION_SEND)
650ca181a68a30ad830d55eb8886f62a323c64e1ba3Owen Lin                .setType(GalleryUtils.MIME_TYPE_PANORAMA360)
6514b4dbd225685502f4249c2bf25bf74f7ce526645George Mount                .putExtra(Intent.EXTRA_STREAM, contentUri)
652ca181a68a30ad830d55eb8886f62a323c64e1ba3Owen Lin                .addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
653fb5571987f2555b04731b6f3e1c479efc16d542aWu-cheng Li    }
654fb5571987f2555b04731b6f3e1c479efc16d542aWu-cheng Li
65548129f36b96928b34e657cdc976c1ac19f7b5ad2Bobby Georgescu    private void overrideTransitionToEditor() {
6562db8b143cdcdecd81916c09e19e4c65e582dccf5Bobby Georgescu        ((Activity) mActivity).overridePendingTransition(android.R.anim.fade_in,
65748129f36b96928b34e657cdc976c1ac19f7b5ad2Bobby Georgescu                android.R.anim.fade_out);
65848129f36b96928b34e657cdc976c1ac19f7b5ad2Bobby Georgescu    }
65948129f36b96928b34e657cdc976c1ac19f7b5ad2Bobby Georgescu
660a680a0c32ae3321c632288b36083f2782af2c55bDoris Liu    private void launchTinyPlanet() {
661a680a0c32ae3321c632288b36083f2782af2c55bDoris Liu        // Deep link into tiny planet
662a680a0c32ae3321c632288b36083f2782af2c55bDoris Liu        MediaItem current = mModel.getMediaItem(0);
663a680a0c32ae3321c632288b36083f2782af2c55bDoris Liu        Intent intent = new Intent(FilterShowActivity.TINY_PLANET_ACTION);
664a680a0c32ae3321c632288b36083f2782af2c55bDoris Liu        intent.setClass(mActivity, FilterShowActivity.class);
665a680a0c32ae3321c632288b36083f2782af2c55bDoris Liu        intent.setDataAndType(current.getContentUri(), current.getMimeType())
666a680a0c32ae3321c632288b36083f2782af2c55bDoris Liu            .setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
667a850a543225e9f7a72c5a49bb6099573c7efda13Bobby Georgescu        intent.putExtra(FilterShowActivity.LAUNCH_FULLSCREEN,
668a850a543225e9f7a72c5a49bb6099573c7efda13Bobby Georgescu                mActivity.isFullscreen());
669a680a0c32ae3321c632288b36083f2782af2c55bDoris Liu        mActivity.startActivityForResult(intent, REQUEST_EDIT);
67048129f36b96928b34e657cdc976c1ac19f7b5ad2Bobby Georgescu        overrideTransitionToEditor();
671a680a0c32ae3321c632288b36083f2782af2c55bDoris Liu    }
672a680a0c32ae3321c632288b36083f2782af2c55bDoris Liu
6735bd00332556b20c141b5c7f16433d55b1bc7fe0fBobby Georgescu    private void launchCamera() {
67455705d5a9baadfe0e19170b2075e4a273033c260Mangesh Ghiware        mRecenterCameraOnResume = false;
67555705d5a9baadfe0e19170b2075e4a273033c260Mangesh Ghiware        GalleryUtils.startCameraActivity(mActivity);
6765bd00332556b20c141b5c7f16433d55b1bc7fe0fBobby Georgescu    }
6775bd00332556b20c141b5c7f16433d55b1bc7fe0fBobby Georgescu
678a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu    private void launchPhotoEditor() {
679a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu        MediaItem current = mModel.getMediaItem(0);
680462923e5800e151ab5ec450063334ba430c1da3aBobby Georgescu        if (current == null || (current.getSupportedOperations()
681462923e5800e151ab5ec450063334ba430c1da3aBobby Georgescu                & MediaObject.SUPPORT_EDIT) == 0) {
682462923e5800e151ab5ec450063334ba430c1da3aBobby Georgescu            return;
683462923e5800e151ab5ec450063334ba430c1da3aBobby Georgescu        }
684a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu
685a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu        Intent intent = new Intent(ACTION_NEXTGEN_EDIT);
686b6692653af5dbce477f33df721aa6177fabeda4bOwen Lin
687b6692653af5dbce477f33df721aa6177fabeda4bOwen Lin        intent.setDataAndType(current.getContentUri(), current.getMimeType())
688b6692653af5dbce477f33df721aa6177fabeda4bOwen Lin                .setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
689a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu        if (mActivity.getPackageManager()
690a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu                .queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY).size() == 0) {
691a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu            intent.setAction(Intent.ACTION_EDIT);
692a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu        }
693a850a543225e9f7a72c5a49bb6099573c7efda13Bobby Georgescu        intent.putExtra(FilterShowActivity.LAUNCH_FULLSCREEN,
694a850a543225e9f7a72c5a49bb6099573c7efda13Bobby Georgescu                mActivity.isFullscreen());
695a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu        ((Activity) mActivity).startActivityForResult(Intent.createChooser(intent, null),
696a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu                REQUEST_EDIT);
69748129f36b96928b34e657cdc976c1ac19f7b5ad2Bobby Georgescu        overrideTransitionToEditor();
698a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu    }
699a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu
7008c4e95f4380a4104c9968963a363b62746e6c967nicolasroard    private void launchSimpleEditor() {
7018c4e95f4380a4104c9968963a363b62746e6c967nicolasroard        MediaItem current = mModel.getMediaItem(0);
7028c4e95f4380a4104c9968963a363b62746e6c967nicolasroard        if (current == null || (current.getSupportedOperations()
7038c4e95f4380a4104c9968963a363b62746e6c967nicolasroard                & MediaObject.SUPPORT_EDIT) == 0) {
7048c4e95f4380a4104c9968963a363b62746e6c967nicolasroard            return;
7058c4e95f4380a4104c9968963a363b62746e6c967nicolasroard        }
7068c4e95f4380a4104c9968963a363b62746e6c967nicolasroard
7078c4e95f4380a4104c9968963a363b62746e6c967nicolasroard        Intent intent = new Intent(ACTION_SIMPLE_EDIT);
7088c4e95f4380a4104c9968963a363b62746e6c967nicolasroard
7098c4e95f4380a4104c9968963a363b62746e6c967nicolasroard        intent.setDataAndType(current.getContentUri(), current.getMimeType())
7108c4e95f4380a4104c9968963a363b62746e6c967nicolasroard                .setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
7118c4e95f4380a4104c9968963a363b62746e6c967nicolasroard        if (mActivity.getPackageManager()
7128c4e95f4380a4104c9968963a363b62746e6c967nicolasroard                .queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY).size() == 0) {
7138c4e95f4380a4104c9968963a363b62746e6c967nicolasroard            intent.setAction(Intent.ACTION_EDIT);
7148c4e95f4380a4104c9968963a363b62746e6c967nicolasroard        }
7158c4e95f4380a4104c9968963a363b62746e6c967nicolasroard        intent.putExtra(FilterShowActivity.LAUNCH_FULLSCREEN,
7168c4e95f4380a4104c9968963a363b62746e6c967nicolasroard                mActivity.isFullscreen());
7178c4e95f4380a4104c9968963a363b62746e6c967nicolasroard        ((Activity) mActivity).startActivityForResult(Intent.createChooser(intent, null),
7188c4e95f4380a4104c9968963a363b62746e6c967nicolasroard                REQUEST_EDIT);
7198c4e95f4380a4104c9968963a363b62746e6c967nicolasroard        overrideTransitionToEditor();
7208c4e95f4380a4104c9968963a363b62746e6c967nicolasroard    }
7218c4e95f4380a4104c9968963a363b62746e6c967nicolasroard
722e23a9d412cba5a202405e1c99c0cf080949db2c7Bobby Georgescu    private void requestDeferredUpdate() {
723e23a9d412cba5a202405e1c99c0cf080949db2c7Bobby Georgescu        mDeferUpdateUntil = SystemClock.uptimeMillis() + DEFERRED_UPDATE_MS;
724e23a9d412cba5a202405e1c99c0cf080949db2c7Bobby Georgescu        if (!mDeferredUpdateWaiting) {
725e23a9d412cba5a202405e1c99c0cf080949db2c7Bobby Georgescu            mDeferredUpdateWaiting = true;
726e23a9d412cba5a202405e1c99c0cf080949db2c7Bobby Georgescu            mHandler.sendEmptyMessageDelayed(MSG_UPDATE_DEFERRED, DEFERRED_UPDATE_MS);
727e23a9d412cba5a202405e1c99c0cf080949db2c7Bobby Georgescu        }
728e23a9d412cba5a202405e1c99c0cf080949db2c7Bobby Georgescu    }
729e23a9d412cba5a202405e1c99c0cf080949db2c7Bobby Georgescu
730e23a9d412cba5a202405e1c99c0cf080949db2c7Bobby Georgescu    private void updateUIForCurrentPhoto() {
731f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        if (mCurrentPhoto == null) return;
732c7e3c76d6965f520a9651d309052c5f01726cd58Bobby Georgescu
733c7e3c76d6965f520a9651d309052c5f01726cd58Bobby Georgescu        // If by swiping or deletion the user ends up on an action item
734c7e3c76d6965f520a9651d309052c5f01726cd58Bobby Georgescu        // and zoomed in, zoom out so that the context of the action is
735c7e3c76d6965f520a9651d309052c5f01726cd58Bobby Georgescu        // more clear
736e23a9d412cba5a202405e1c99c0cf080949db2c7Bobby Georgescu        if ((mCurrentPhoto.getSupportedOperations() & MediaObject.SUPPORT_ACTION) != 0
737c7e3c76d6965f520a9651d309052c5f01726cd58Bobby Georgescu                && !mPhotoView.getFilmMode()) {
738f4e22eb44bfae0c2a3b6570f19480c8c3535d808Bobby Georgescu            mPhotoView.setWantPictureCenterCallbacks(true);
739c7e3c76d6965f520a9651d309052c5f01726cd58Bobby Georgescu        }
740c7e3c76d6965f520a9651d309052c5f01726cd58Bobby Georgescu
741f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        updateMenuOperations();
7424b4dbd225685502f4249c2bf25bf74f7ce526645George Mount        refreshBottomControlsWhenReady();
743f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        if (mShowDetails) {
744995c4566bed7df1aa48ba7e1351f964efa73880bMichael Kolb            mDetailsHelper.reloadDetails();
745f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
746898a2f4540635528a0916b0a6b0a177869854ae9Wu-cheng Li        if ((mSecureAlbum == null)
747e23a9d412cba5a202405e1c99c0cf080949db2c7Bobby Georgescu                && (mCurrentPhoto.getSupportedOperations() & MediaItem.SUPPORT_SHARE) != 0) {
7484b4dbd225685502f4249c2bf25bf74f7ce526645George Mount            mCurrentPhoto.getPanoramaSupport(mUpdateShareURICallback);
749e23a9d412cba5a202405e1c99c0cf080949db2c7Bobby Georgescu        }
750e23a9d412cba5a202405e1c99c0cf080949db2c7Bobby Georgescu    }
751e23a9d412cba5a202405e1c99c0cf080949db2c7Bobby Georgescu
752e23a9d412cba5a202405e1c99c0cf080949db2c7Bobby Georgescu    private void updateCurrentPhoto(MediaItem photo) {
753e23a9d412cba5a202405e1c99c0cf080949db2c7Bobby Georgescu        if (mCurrentPhoto == photo) return;
754e23a9d412cba5a202405e1c99c0cf080949db2c7Bobby Georgescu        mCurrentPhoto = photo;
755e23a9d412cba5a202405e1c99c0cf080949db2c7Bobby Georgescu        if (mPhotoView.getFilmMode()) {
756e23a9d412cba5a202405e1c99c0cf080949db2c7Bobby Georgescu            requestDeferredUpdate();
757e23a9d412cba5a202405e1c99c0cf080949db2c7Bobby Georgescu        } else {
758e23a9d412cba5a202405e1c99c0cf080949db2c7Bobby Georgescu            updateUIForCurrentPhoto();
75915b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang        }
760825afb1b3e7d15b5c258d664ee008dc68da1c407Mangesh Ghiware    }
761825afb1b3e7d15b5c258d664ee008dc68da1c407Mangesh Ghiware
762f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private void updateMenuOperations() {
76324081fe26ca25448ddb9c8f9cc7f406d26344decOwen Lin        Menu menu = mActionBar.getMenu();
76424081fe26ca25448ddb9c8f9cc7f406d26344decOwen Lin
76524081fe26ca25448ddb9c8f9cc7f406d26344decOwen Lin        // it could be null if onCreateActionBar has not been called yet
76624081fe26ca25448ddb9c8f9cc7f406d26344decOwen Lin        if (menu == null) return;
76724081fe26ca25448ddb9c8f9cc7f406d26344decOwen Lin
76824081fe26ca25448ddb9c8f9cc7f406d26344decOwen Lin        MenuItem item = menu.findItem(R.id.action_slideshow);
76953fe9f72433f2fdae30e1708c5933390202cbcf5John Reck        if (item != null) {
77053fe9f72433f2fdae30e1708c5933390202cbcf5John Reck            item.setVisible((mSecureAlbum == null) && canDoSlideShow());
77153fe9f72433f2fdae30e1708c5933390202cbcf5John Reck        }
7722066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang        if (mCurrentPhoto == null) return;
77324081fe26ca25448ddb9c8f9cc7f406d26344decOwen Lin
774f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        int supportedOperations = mCurrentPhoto.getSupportedOperations();
775463b918edda204f1563dc2e27976cafa6af9a769John Hoford        if (mReadOnlyView) {
776463b918edda204f1563dc2e27976cafa6af9a769John Hoford            supportedOperations ^= MediaObject.SUPPORT_EDIT;
777463b918edda204f1563dc2e27976cafa6af9a769John Hoford        }
778898a2f4540635528a0916b0a6b0a177869854ae9Wu-cheng Li        if (mSecureAlbum != null) {
77924081fe26ca25448ddb9c8f9cc7f406d26344decOwen Lin            supportedOperations &= MediaObject.SUPPORT_DELETE;
7808e5828374ffd5d96e7d1efeb36db1b940972b818Sascha Haeberling        } else {
7818e5828374ffd5d96e7d1efeb36db1b940972b818Sascha Haeberling            mCurrentPhoto.getPanoramaSupport(mUpdatePanoramaMenuItemsCallback);
7828e5828374ffd5d96e7d1efeb36db1b940972b818Sascha Haeberling            if (!mHaveImageEditor) {
7838e5828374ffd5d96e7d1efeb36db1b940972b818Sascha Haeberling                supportedOperations &= ~MediaObject.SUPPORT_EDIT;
7848e5828374ffd5d96e7d1efeb36db1b940972b818Sascha Haeberling            }
785f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
78624081fe26ca25448ddb9c8f9cc7f406d26344decOwen Lin        MenuExecutor.updateMenuOperation(menu, supportedOperations);
787f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
788f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
7892066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang    private boolean canDoSlideShow() {
7902066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang        if (mMediaSet == null || mCurrentPhoto == null) {
7912066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang            return false;
7922066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang        }
7932066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang        if (mCurrentPhoto.getMediaType() != MediaObject.MEDIA_TYPE_IMAGE) {
7942066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang            return false;
7952066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang        }
7962066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang        return true;
7972066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang    }
7982066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang
79961f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang    //////////////////////////////////////////////////////////////////////////
80061f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang    //  Action Bar show/hide management
80161f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang    //////////////////////////////////////////////////////////////////////////
80261f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang
803f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private void showBars() {
804f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        if (mShowBars) return;
805f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mShowBars = true;
806e6251df06f0b3c8f556043f8b725b4b19be7474dChih-Chung Chang        mOrientationManager.unlockOrientation();
807f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mActionBar.show();
8080b2486cff0c1b951c54325596256b986307f7f3aChih-Chung Chang        mActivity.getGLRoot().setLightsOutMode(false);
80961f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang        refreshHidingMessage();
8104b4dbd225685502f4249c2bf25bf74f7ce526645George Mount        refreshBottomControlsWhenReady();
811f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
812f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
813f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private void hideBars() {
814f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        if (!mShowBars) return;
815f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mShowBars = false;
816f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mActionBar.hide();
8170b2486cff0c1b951c54325596256b986307f7f3aChih-Chung Chang        mActivity.getGLRoot().setLightsOutMode(true);
81861f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang        mHandler.removeMessages(MSG_HIDE_BARS);
8194b4dbd225685502f4249c2bf25bf74f7ce526645George Mount        refreshBottomControlsWhenReady();
820f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
821f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
822f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private void refreshHidingMessage() {
823f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mHandler.removeMessages(MSG_HIDE_BARS);
8247eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu        if (!mIsMenuVisible && !mPhotoView.getFilmMode()) {
825f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            mHandler.sendEmptyMessageDelayed(MSG_HIDE_BARS, HIDE_BARS_TIMEOUT);
826f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
827f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
828f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
829aeb3062e84ed28f0e25a73f511f287ae0a3e4294Chih-Chung Chang    private boolean canShowBars() {
830aeb3062e84ed28f0e25a73f511f287ae0a3e4294Chih-Chung Chang        // No bars if we are showing camera preview.
83156bdcb7272f222fde5e4c6fc133cb490b31c7667Bobby Georgescu        if (mAppBridge != null && mCurrentIndex == 0
83256bdcb7272f222fde5e4c6fc133cb490b31c7667Bobby Georgescu                && !mPhotoView.getFilmMode()) return false;
83356bdcb7272f222fde5e4c6fc133cb490b31c7667Bobby Georgescu
834aeb3062e84ed28f0e25a73f511f287ae0a3e4294Chih-Chung Chang        // No bars if it's not allowed.
835aeb3062e84ed28f0e25a73f511f287ae0a3e4294Chih-Chung Chang        if (!mActionBarAllowed) return false;
836aeb3062e84ed28f0e25a73f511f287ae0a3e4294Chih-Chung Chang
8374ea5c27007e38fa8583add4bacf268ba67b9f0adJohn Reck        Configuration config = mActivity.getResources().getConfiguration();
8384ea5c27007e38fa8583add4bacf268ba67b9f0adJohn Reck        if (config.touchscreen == Configuration.TOUCHSCREEN_NOTOUCH) {
8394ea5c27007e38fa8583add4bacf268ba67b9f0adJohn Reck            return false;
8404ea5c27007e38fa8583add4bacf268ba67b9f0adJohn Reck        }
8414ea5c27007e38fa8583add4bacf268ba67b9f0adJohn Reck
842aeb3062e84ed28f0e25a73f511f287ae0a3e4294Chih-Chung Chang        return true;
843aeb3062e84ed28f0e25a73f511f287ae0a3e4294Chih-Chung Chang    }
844aeb3062e84ed28f0e25a73f511f287ae0a3e4294Chih-Chung Chang
845e6251df06f0b3c8f556043f8b725b4b19be7474dChih-Chung Chang    private void wantBars() {
846e6251df06f0b3c8f556043f8b725b4b19be7474dChih-Chung Chang        if (canShowBars()) showBars();
847e6251df06f0b3c8f556043f8b725b4b19be7474dChih-Chung Chang    }
848e6251df06f0b3c8f556043f8b725b4b19be7474dChih-Chung Chang
84961f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang    private void toggleBars() {
850f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        if (mShowBars) {
851f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            hideBars();
852aeb3062e84ed28f0e25a73f511f287ae0a3e4294Chih-Chung Chang        } else {
853e6251df06f0b3c8f556043f8b725b4b19be7474dChih-Chung Chang            if (canShowBars()) showBars();
854f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
855f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
856f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
85761f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang    private void updateBars() {
858e6251df06f0b3c8f556043f8b725b4b19be7474dChih-Chung Chang        if (!canShowBars()) {
85961f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang            hideBars();
86061f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang        }
861f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
862f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
863f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    @Override
864f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    protected void onBackPressed() {
8654d7efab8c893b436e6e05cda486d6fd80baacb45nicolasroard        showBars();
866f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        if (mShowDetails) {
867f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            hideDetails();
8683b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang        } else if (mAppBridge == null || !switchWithCaptureAnimation(-1)) {
869bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang            // We are leaving this page. Set the result now.
870bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang            setResult();
8717eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu            if (mStartInFilmstrip && !mPhotoView.getFilmMode()) {
8727eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu                mPhotoView.setFilmMode(true);
8737eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu            } else if (mTreatBackAsUp) {
87454fe6202b6f7d233e7645c121321fe0f3d20fc8bYuli Huang                onUpPressed();
87554fe6202b6f7d233e7645c121321fe0f3d20fc8bYuli Huang            } else {
87654fe6202b6f7d233e7645c121321fe0f3d20fc8bYuli Huang                super.onBackPressed();
87754fe6202b6f7d233e7645c121321fe0f3d20fc8bYuli Huang            }
878f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
879f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
880f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
881b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang    private void onUpPressed() {
882833f775afc9515567dc5aaf0cafe20e006e77545Bobby Georgescu        if ((mStartInFilmstrip || mAppBridge != null)
883833f775afc9515567dc5aaf0cafe20e006e77545Bobby Georgescu                && !mPhotoView.getFilmMode()) {
8847eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu            mPhotoView.setFilmMode(true);
8857eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu            return;
8867eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu        }
8877eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu
888b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang        if (mActivity.getStateManager().getStateCount() > 1) {
8897eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu            setResult();
890b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang            super.onBackPressed();
891ba12eae90b5b1a80ee002aa0df8c5c5189c4faa3Chih-Chung Chang            return;
89266ca848b2f58b813d366642088d274a1b7c4a90cChih-Chung Chang        }
89366ca848b2f58b813d366642088d274a1b7c4a90cChih-Chung Chang
89466ca848b2f58b813d366642088d274a1b7c4a90cChih-Chung Chang        if (mOriginalSetPathString == null) return;
89566ca848b2f58b813d366642088d274a1b7c4a90cChih-Chung Chang
89666ca848b2f58b813d366642088d274a1b7c4a90cChih-Chung Chang        if (mAppBridge == null) {
897b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang            // We're in view mode so set up the stacks on our own.
898b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang            Bundle data = new Bundle(getData());
899b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang            data.putString(AlbumPage.KEY_MEDIA_PATH, mOriginalSetPathString);
900b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang            data.putString(AlbumPage.KEY_PARENT_MEDIA_PATH,
901b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang                    mActivity.getDataManager().getTopSetPath(
902b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang                            DataManager.INCLUDE_ALL));
903b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang            mActivity.getStateManager().switchState(this, AlbumPage.class, data);
90466ca848b2f58b813d366642088d274a1b7c4a90cChih-Chung Chang        } else {
905833f775afc9515567dc5aaf0cafe20e006e77545Bobby Georgescu            GalleryUtils.startGalleryActivity(mActivity);
906b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang        }
907b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang    }
908b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang
909bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    private void setResult() {
910bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang        Intent result = null;
9117eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu        result = new Intent();
9127eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu        result.putExtra(KEY_RETURN_INDEX_HINT, mCurrentIndex);
913bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang        setStateResult(Activity.RESULT_OK, result);
914bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    }
915bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang
916bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    //////////////////////////////////////////////////////////////////////////
917bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    //  AppBridge.Server interface
918bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    //////////////////////////////////////////////////////////////////////////
919bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang
920bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    @Override
9212ef46ed28b28b355d7f3f1432c7b1196b832a859Chih-Chung Chang    public void setCameraRelativeFrame(Rect frame) {
9222ef46ed28b28b355d7f3f1432c7b1196b832a859Chih-Chung Chang        mPhotoView.setCameraRelativeFrame(frame);
923bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    }
924bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang
925bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    @Override
9262c6173822a612597c79be41b126367ddfbb5d518Chih-Chung Chang    public boolean switchWithCaptureAnimation(int offset) {
9272c6173822a612597c79be41b126367ddfbb5d518Chih-Chung Chang        return mPhotoView.switchWithCaptureAnimation(offset);
9282c6173822a612597c79be41b126367ddfbb5d518Chih-Chung Chang    }
9292c6173822a612597c79be41b126367ddfbb5d518Chih-Chung Chang
930f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    @Override
9316575794a9c09f22d5721e212c093e0a2df376d0cChih-Chung Chang    public void setSwipingEnabled(boolean enabled) {
9326575794a9c09f22d5721e212c093e0a2df376d0cChih-Chung Chang        mPhotoView.setSwipingEnabled(enabled);
9336575794a9c09f22d5721e212c093e0a2df376d0cChih-Chung Chang    }
9346575794a9c09f22d5721e212c093e0a2df376d0cChih-Chung Chang
9356575794a9c09f22d5721e212c093e0a2df376d0cChih-Chung Chang    @Override
9363b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang    public void notifyScreenNailChanged() {
9373b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang        mScreenNailItem.setScreenNail(mAppBridge.attachScreenNail());
9383b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang        mScreenNailSet.notifyChange();
9393b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang    }
9403b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang
9413b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang    @Override
942a0ce682e40c39ce046c48d8a7f989fff01bb9f2cWu-cheng Li    public void addSecureAlbumItem(boolean isVideo, int id) {
943a0ce682e40c39ce046c48d8a7f989fff01bb9f2cWu-cheng Li        mSecureAlbum.addMediaItem(isVideo, id);
944a0ce682e40c39ce046c48d8a7f989fff01bb9f2cWu-cheng Li    }
945a0ce682e40c39ce046c48d8a7f989fff01bb9f2cWu-cheng Li
946a0ce682e40c39ce046c48d8a7f989fff01bb9f2cWu-cheng Li    @Override
947f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    protected boolean onCreateActionBar(Menu menu) {
948b21b8e58a604f6c701245d84b141b5b87663192bOwen Lin        mActionBar.createActionBarMenu(R.menu.photo, menu);
9498fe22ecb8e744a09a2e0d867f876ecbf74c82298John Reck        mHaveImageEditor = GalleryUtils.isEditorAvailable(mActivity, "image/*");
950f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        updateMenuOperations();
9513cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu        mActionBar.setTitle(mMediaSet != null ? mMediaSet.getName() : "");
952b21b8e58a604f6c701245d84b141b5b87663192bOwen Lin        return true;
953f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
954f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
955d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin    private MenuExecutor.ProgressListener mConfirmDialogListener =
956d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin            new MenuExecutor.ProgressListener() {
957d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin        @Override
958d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin        public void onProgressUpdate(int index) {}
959d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin
960d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin        @Override
961d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin        public void onProgressComplete(int result) {}
962d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin
963d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin        @Override
964d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin        public void onConfirmDialogShown() {
965d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin            mHandler.removeMessages(MSG_HIDE_BARS);
966d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin        }
967d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin
968d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin        @Override
969d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin        public void onConfirmDialogDismissed(boolean confirmed) {
970d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin            refreshHidingMessage();
971d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin        }
972ba50b9420e64731fd5aa8b1410e1f36457a1635aBobby Georgescu
973ba50b9420e64731fd5aa8b1410e1f36457a1635aBobby Georgescu        @Override
974ba50b9420e64731fd5aa8b1410e1f36457a1635aBobby Georgescu        public void onProgressStart() {}
975d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin    };
976d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin
9773cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu    private void switchToGrid() {
9785585826e68c62c3719fb346d40fd1999438c6c6bBobby Georgescu        if (mActivity.getStateManager().hasStateClass(AlbumPage.class)) {
9793cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu            onUpPressed();
9803cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu        } else {
9813cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu            if (mOriginalSetPathString == null) return;
9823cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu            Bundle data = new Bundle(getData());
9833cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu            data.putString(AlbumPage.KEY_MEDIA_PATH, mOriginalSetPathString);
9843cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu            data.putString(AlbumPage.KEY_PARENT_MEDIA_PATH,
9853cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu                    mActivity.getDataManager().getTopSetPath(
9863cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu                            DataManager.INCLUDE_ALL));
9873cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu
9883cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu            // We only show cluster menu in the first AlbumPage in stack
9893cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu            // TODO: Enable this when running from the camera app
9903cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu            boolean inAlbum = mActivity.getStateManager().hasStateClass(AlbumPage.class);
9913cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu            data.putBoolean(AlbumPage.KEY_SHOW_CLUSTER_MENU, !inAlbum
9923cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu                    && mAppBridge == null);
9933cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu
9943cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu            data.putBoolean(PhotoPage.KEY_APP_BRIDGE, mAppBridge != null);
9953cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu
9963cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu            // Account for live preview being first item
9973cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu            mActivity.getTransitionStore().put(KEY_RETURN_INDEX_HINT,
9983cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu                    mAppBridge != null ? mCurrentIndex - 1 : mCurrentIndex);
9993cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu
10003ad7bbc55d7aaa0f36a7242fdd0f612d877adc19Bobby Georgescu            if (mHasCameraScreennailOrPlaceholder && mAppBridge != null) {
10015585826e68c62c3719fb346d40fd1999438c6c6bBobby Georgescu                mActivity.getStateManager().startState(AlbumPage.class, data);
10025585826e68c62c3719fb346d40fd1999438c6c6bBobby Georgescu            } else {
10035585826e68c62c3719fb346d40fd1999438c6c6bBobby Georgescu                mActivity.getStateManager().switchState(this, AlbumPage.class, data);
10045585826e68c62c3719fb346d40fd1999438c6c6bBobby Georgescu            }
10053cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu        }
10063cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu    }
10073cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu
1008f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    @Override
1009f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    protected boolean onItemSelected(MenuItem item) {
1010d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu        if (mModel == null) return true;
1011d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin        refreshHidingMessage();
1012616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin        MediaItem current = mModel.getMediaItem(0);
1013f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
1014599bdd6d7de2adfc066b06e9899d860ae2697472Doris Liu        // This is a shield for monkey when it clicks the action bar
1015599bdd6d7de2adfc066b06e9899d860ae2697472Doris Liu        // menu when transitioning from filmstrip to camera
1016599bdd6d7de2adfc066b06e9899d860ae2697472Doris Liu        if (current instanceof SnailItem) return true;
1017599bdd6d7de2adfc066b06e9899d860ae2697472Doris Liu        // TODO: We should check the current photo against the MediaItem
1018599bdd6d7de2adfc066b06e9899d860ae2697472Doris Liu        // that the menu was initially created for. We need to fix this
1019599bdd6d7de2adfc066b06e9899d860ae2697472Doris Liu        // after PhotoPage being refactored.
1020f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        if (current == null) {
1021f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            // item is not ready, ignore
1022f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            return true;
1023f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
1024f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        int currentIndex = mModel.getCurrentIndex();
1025f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        Path path = current.getPath();
1026f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
1027f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        DataManager manager = mActivity.getDataManager();
1028f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        int action = item.getItemId();
10299a033b07b8e0d9fe7419b7a0d876e9c7febf43c8Ray Chen        String confirmMsg = null;
1030f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        switch (action) {
103184c220f10a643927c8a2126de8a755d8d7f7ec9eRay Chen            case android.R.id.home: {
1032b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang                onUpPressed();
103384c220f10a643927c8a2126de8a755d8d7f7ec9eRay Chen                return true;
103484c220f10a643927c8a2126de8a755d8d7f7ec9eRay Chen            }
1035f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            case R.id.action_slideshow: {
1036f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                Bundle data = new Bundle();
10376cf807453fb58ccd4cc513ff187b306c7090e67cOwen Lin                data.putString(SlideshowPage.KEY_SET_PATH, mMediaSet.getPath().toString());
1038604f053d040782159b61d3b74ee533bc2c0ccdd0Ray Chen                data.putString(SlideshowPage.KEY_ITEM_PATH, path.toString());
1039f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                data.putInt(SlideshowPage.KEY_PHOTO_INDEX, currentIndex);
1040f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                data.putBoolean(SlideshowPage.KEY_REPEAT, true);
1041f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                mActivity.getStateManager().startStateForResult(
1042f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                        SlideshowPage.class, REQUEST_SLIDESHOW, data);
1043f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                return true;
1044f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            }
1045f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            case R.id.action_crop: {
1046898a2f4540635528a0916b0a6b0a177869854ae9Wu-cheng Li                Activity activity = mActivity;
1047c3178ca4daf7ed570f3432f3433959c208ecc105Ruben Brunk                Intent intent = new Intent(CropActivity.CROP_ACTION);
1048c3178ca4daf7ed570f3432f3433959c208ecc105Ruben Brunk                intent.setClass(activity, CropActivity.class);
104963926d2ed2ca2921de8dca9b3a52c1d64d8afc46Ruben Brunk                intent.setDataAndType(manager.getContentUri(path), current.getMimeType())
105063926d2ed2ca2921de8dca9b3a52c1d64d8afc46Ruben Brunk                    .setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
1051f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                activity.startActivityForResult(intent, PicasaSource.isPicasaImage(current)
1052f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                        ? REQUEST_CROP_PICASA
1053f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                        : REQUEST_CROP);
1054f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                return true;
1055f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            }
105650ea2d2938218ac6b2039f0e42998cfbbc45d1f1Teng-Hui Zhu            case R.id.action_trim: {
10573f1f1baf3a674927e25cd5cd885fb372796bd3a0Teng-Hui Zhu                Intent intent = new Intent(mActivity, TrimVideo.class);
10583f1f1baf3a674927e25cd5cd885fb372796bd3a0Teng-Hui Zhu                intent.setData(manager.getContentUri(path));
105915ff1b1ca52bea348b8a490b5b5abe53fa43eaf2Teng-Hui Zhu                // We need the file path to wrap this into a RandomAccessFile.
106015ff1b1ca52bea348b8a490b5b5abe53fa43eaf2Teng-Hui Zhu                intent.putExtra(KEY_MEDIA_ITEM_PATH, current.getFilePath());
10613f1f1baf3a674927e25cd5cd885fb372796bd3a0Teng-Hui Zhu                mActivity.startActivityForResult(intent, REQUEST_TRIM);
106250ea2d2938218ac6b2039f0e42998cfbbc45d1f1Teng-Hui Zhu                return true;
106350ea2d2938218ac6b2039f0e42998cfbbc45d1f1Teng-Hui Zhu            }
1064648b339c74da2b863304ffc61c8528cc74c2afb3Teng-Hui Zhu            case R.id.action_mute: {
10651a719804ddd5c6fc9a6914ef5a2b6e914834d1f9Bobby Georgescu                MuteVideo muteVideo = new MuteVideo(current.getFilePath(),
1066648b339c74da2b863304ffc61c8528cc74c2afb3Teng-Hui Zhu                        manager.getContentUri(path), mActivity);
1067648b339c74da2b863304ffc61c8528cc74c2afb3Teng-Hui Zhu                muteVideo.muteInBackground();
1068648b339c74da2b863304ffc61c8528cc74c2afb3Teng-Hui Zhu                return true;
1069648b339c74da2b863304ffc61c8528cc74c2afb3Teng-Hui Zhu            }
1070f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang            case R.id.action_edit: {
1071a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu                launchPhotoEditor();
1072f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang                return true;
1073f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang            }
10748c4e95f4380a4104c9968963a363b62746e6c967nicolasroard            case R.id.action_simple_edit: {
10758c4e95f4380a4104c9968963a363b62746e6c967nicolasroard                launchSimpleEditor();
10768c4e95f4380a4104c9968963a363b62746e6c967nicolasroard                return true;
10778c4e95f4380a4104c9968963a363b62746e6c967nicolasroard            }
1078f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            case R.id.action_details: {
1079f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                if (mShowDetails) {
1080f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                    hideDetails();
1081f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                } else {
1082995c4566bed7df1aa48ba7e1351f964efa73880bMichael Kolb                    showDetails();
1083f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                }
1084f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                return true;
1085f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            }
1086513eb24fe6b9376ce41bff0abc53d6d14daf8325nicolasroard            case R.id.print: {
1087513eb24fe6b9376ce41bff0abc53d6d14daf8325nicolasroard                mActivity.printSelectedImage(manager.getContentUri(path));
1088513eb24fe6b9376ce41bff0abc53d6d14daf8325nicolasroard                return true;
1089513eb24fe6b9376ce41bff0abc53d6d14daf8325nicolasroard            }
109067098d1a72fd04e2af06d3a5939cde28c65f70d9Ray Chen            case R.id.action_delete:
10919a033b07b8e0d9fe7419b7a0d876e9c7febf43c8Ray Chen                confirmMsg = mActivity.getResources().getQuantityString(
10929a033b07b8e0d9fe7419b7a0d876e9c7febf43c8Ray Chen                        R.plurals.delete_selection, 1);
1093f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            case R.id.action_setas:
1094f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            case R.id.action_rotate_ccw:
1095f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            case R.id.action_rotate_cw:
1096f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            case R.id.action_show_on_map:
1097f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                mSelectionManager.deSelectAll();
1098f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                mSelectionManager.toggle(path);
1099d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin                mMenuExecutor.onMenuClicked(item, confirmMsg, mConfirmDialogListener);
1100f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                return true;
1101f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            default :
1102f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                return false;
1103f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
1104f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
1105f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
1106f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private void hideDetails() {
1107f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mShowDetails = false;
11084105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen        mDetailsHelper.hide();
1109f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
1110f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
1111995c4566bed7df1aa48ba7e1351f964efa73880bMichael Kolb    private void showDetails() {
1112f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mShowDetails = true;
11134105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen        if (mDetailsHelper == null) {
11144105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen            mDetailsHelper = new DetailsHelper(mActivity, mRootPane, new MyDetailsSource());
11154105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen            mDetailsHelper.setCloseListener(new CloseListener() {
111606c6401eededc2ec842ba4994a838c2ded0a666cPin Ting                @Override
1117f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                public void onClose() {
1118f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                    hideDetails();
1119f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                }
1120f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            });
1121f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
11224105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen        mDetailsHelper.show();
1123f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
1124f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
1125bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    ////////////////////////////////////////////////////////////////////////////
1126bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    //  Callbacks from PhotoView
1127bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    ////////////////////////////////////////////////////////////////////////////
1128bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    @Override
1129f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public void onSingleTapUp(int x, int y) {
1130bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang        if (mAppBridge != null) {
1131bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang            if (mAppBridge.onSingleTapUp(x, y)) return;
1132014d9586d8145a33f4e99eaad570587f6d650026Wu-cheng Li        }
1133014d9586d8145a33f4e99eaad570587f6d650026Wu-cheng Li
1134616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin        MediaItem item = mModel.getMediaItem(0);
1135b5dc542fbaeaf99bebdcf775ef0e034e89e88eaeWu-cheng Li        if (item == null || item == mScreenNailItem) {
1136b5dc542fbaeaf99bebdcf775ef0e034e89e88eaeWu-cheng Li            // item is not ready or it is camera preview, ignore
1137f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            return;
1138f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
1139f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
11408868aa1b2d199e7fa869c9c5fad3079175621002Wu-cheng Li        int supported = item.getSupportedOperations();
11413935ca3762344c5f8a306596d70c0d4d4a2fda4bAngus Kong        boolean playVideo = ((supported & MediaItem.SUPPORT_PLAY) != 0);
11428868aa1b2d199e7fa869c9c5fad3079175621002Wu-cheng Li        boolean unlock = ((supported & MediaItem.SUPPORT_UNLOCK) != 0);
1143c7e3c76d6965f520a9651d309052c5f01726cd58Bobby Georgescu        boolean goBack = ((supported & MediaItem.SUPPORT_BACK) != 0);
114445f089d69141e3fb0dfaad9bc34d275b61eb2aeeBobby Georgescu        boolean launchCamera = ((supported & MediaItem.SUPPORT_CAMERA_SHORTCUT) != 0);
1145f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
1146f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        if (playVideo) {
1147f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            // determine if the point is at center (1/6) of the photo view.
1148f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            // (The position of the "play" icon is at center (1/6) of the photo)
1149f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            int w = mPhotoView.getWidth();
1150f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            int h = mPhotoView.getHeight();
1151f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            playVideo = (Math.abs(x - w / 2) * 12 <= w)
1152f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                && (Math.abs(y - h / 2) * 12 <= h);
1153f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
1154f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
1155f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        if (playVideo) {
11563935ca3762344c5f8a306596d70c0d4d4a2fda4bAngus Kong            if (mSecureAlbum == null) {
11573935ca3762344c5f8a306596d70c0d4d4a2fda4bAngus Kong                playVideo(mActivity, item.getPlayUri(), item.getName());
11583935ca3762344c5f8a306596d70c0d4d4a2fda4bAngus Kong            } else {
11593935ca3762344c5f8a306596d70c0d4d4a2fda4bAngus Kong                mActivity.getStateManager().finishState(this);
11603935ca3762344c5f8a306596d70c0d4d4a2fda4bAngus Kong            }
1161c7e3c76d6965f520a9651d309052c5f01726cd58Bobby Georgescu        } else if (goBack) {
1162c7e3c76d6965f520a9651d309052c5f01726cd58Bobby Georgescu            onBackPressed();
11638868aa1b2d199e7fa869c9c5fad3079175621002Wu-cheng Li        } else if (unlock) {
116406c027675948259368a902fd6f8c2ecac5db5167Mangesh Ghiware            Intent intent = new Intent(mActivity, GalleryActivity.class);
116506c027675948259368a902fd6f8c2ecac5db5167Mangesh Ghiware            intent.putExtra(GalleryActivity.KEY_DISMISS_KEYGUARD, true);
11666455ba954daa6dd0a8e114c7db97a8361d064e5aWu-cheng Li            mActivity.startActivity(intent);
116745f089d69141e3fb0dfaad9bc34d275b61eb2aeeBobby Georgescu        } else if (launchCamera) {
11685bd00332556b20c141b5c7f16433d55b1bc7fe0fBobby Georgescu            launchCamera();
1169f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        } else {
117061f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang            toggleBars();
1171f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
1172f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
1173f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
1174bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    @Override
117561f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang    public void onActionBarAllowed(boolean allowed) {
117661f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang        mActionBarAllowed = allowed;
117761f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang        mHandler.sendEmptyMessage(MSG_UPDATE_ACTION_BAR);
117861f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang    }
117961f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang
118061f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang    @Override
1181e6251df06f0b3c8f556043f8b725b4b19be7474dChih-Chung Chang    public void onActionBarWanted() {
1182e6251df06f0b3c8f556043f8b725b4b19be7474dChih-Chung Chang        mHandler.sendEmptyMessage(MSG_WANT_BARS);
1183e6251df06f0b3c8f556043f8b725b4b19be7474dChih-Chung Chang    }
1184e6251df06f0b3c8f556043f8b725b4b19be7474dChih-Chung Chang
1185e6251df06f0b3c8f556043f8b725b4b19be7474dChih-Chung Chang    @Override
1186bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    public void onFullScreenChanged(boolean full) {
1187bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang        Message m = mHandler.obtainMessage(
1188bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang                MSG_ON_FULL_SCREEN_CHANGED, full ? 1 : 0, 0);
1189bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang        m.sendToTarget();
1190bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    }
1191bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang
11926b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang    // How we do delete/undo:
11936b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang    //
11946b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang    // When the user choose to delete a media item, we just tell the
11956b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang    // FilterDeleteSet to hide that item. If the user choose to undo it, we
11966b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang    // again tell FilterDeleteSet not to hide it. If the user choose to commit
11976b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang    // the deletion, we then actually delete the media item.
11986b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang    @Override
11996b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang    public void onDeleteImage(Path path, int offset) {
12006118af9ddad8acc050133154f8f60c842c7f9bfaChih-Chung Chang        onCommitDeleteImage();  // commit the previous deletion
12016b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang        mDeletePath = path;
12026b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang        mDeleteIsFocus = (offset == 0);
12036118af9ddad8acc050133154f8f60c842c7f9bfaChih-Chung Chang        mMediaSet.addDeletion(path, mCurrentIndex + offset);
12046b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang    }
12056b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang
12066b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang    @Override
12076b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang    public void onUndoDeleteImage() {
12086118af9ddad8acc050133154f8f60c842c7f9bfaChih-Chung Chang        if (mDeletePath == null) return;
12096b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang        // If the deletion was done on the focused item, we want the model to
12106b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang        // focus on it when it is undeleted.
12116b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang        if (mDeleteIsFocus) mModel.setFocusHintPath(mDeletePath);
12126118af9ddad8acc050133154f8f60c842c7f9bfaChih-Chung Chang        mMediaSet.removeDeletion(mDeletePath);
12136b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang        mDeletePath = null;
12146b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang    }
12156b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang
12166b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang    @Override
12176b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang    public void onCommitDeleteImage() {
12186b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang        if (mDeletePath == null) return;
1219d00f521a3138a8f244c91748b0277290edbf61f6Bobby Georgescu        mMenuExecutor.startSingleItemAction(R.id.action_delete, mDeletePath);
12206b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang        mDeletePath = null;
12216b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang    }
12226b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang
1223d81b264931cfa3b34096efd46659b81f9a628fb5Bobby Georgescu    public void playVideo(Activity activity, Uri uri, String title) {
1224f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        try {
1225f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            Intent intent = new Intent(Intent.ACTION_VIEW)
1226a3871050845b4921379add2b126add3cfbab1109Ray Chen                    .setDataAndType(uri, "video/*")
1227a3871050845b4921379add2b126add3cfbab1109Ray Chen                    .putExtra(Intent.EXTRA_TITLE, title)
1228a3871050845b4921379add2b126add3cfbab1109Ray Chen                    .putExtra(MovieActivity.KEY_TREAT_UP_AS_BACK, true);
122971cd89a38752bc22ae0ec2df965e4280b776623cChih-Chung Chang            activity.startActivityForResult(intent, REQUEST_PLAY_VIDEO);
1230f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        } catch (ActivityNotFoundException e) {
1231f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            Toast.makeText(activity, activity.getString(R.string.video_err),
1232f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                    Toast.LENGTH_SHORT).show();
1233f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
1234f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
1235f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
1236f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang    private void setCurrentPhotoByIntent(Intent intent) {
1237f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang        if (intent == null) return;
1238f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang        Path path = mApplication.getDataManager()
1239f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang                .findPathByUri(intent.getData(), intent.getType());
1240f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang        if (path != null) {
12410addfc7f6342184a67cdd8b5cc3872c6a5c87e55Doris Liu            Path albumPath = mApplication.getDataManager().getDefaultSetOf(path);
1242eb2950384846a3797e13b04765f65df70d80982eztenghui            if (albumPath == null) {
1243eb2950384846a3797e13b04765f65df70d80982eztenghui                return;
1244eb2950384846a3797e13b04765f65df70d80982eztenghui            }
12450addfc7f6342184a67cdd8b5cc3872c6a5c87e55Doris Liu            if (!albumPath.equalsIgnoreCase(mOriginalSetPathString)) {
12460addfc7f6342184a67cdd8b5cc3872c6a5c87e55Doris Liu                // If the edited image is stored in a different album, we need
12470addfc7f6342184a67cdd8b5cc3872c6a5c87e55Doris Liu                // to start a new activity state to show the new image
12480addfc7f6342184a67cdd8b5cc3872c6a5c87e55Doris Liu                Bundle data = new Bundle(getData());
12490addfc7f6342184a67cdd8b5cc3872c6a5c87e55Doris Liu                data.putString(KEY_MEDIA_SET_PATH, albumPath.toString());
12500addfc7f6342184a67cdd8b5cc3872c6a5c87e55Doris Liu                data.putString(PhotoPage.KEY_MEDIA_ITEM_PATH, path.toString());
1251cfa7fde1a336a3200b2ad9091b27ba7bfd8f5c9aBobby Georgescu                mActivity.getStateManager().startState(SinglePhotoPage.class, data);
12520addfc7f6342184a67cdd8b5cc3872c6a5c87e55Doris Liu                return;
12530addfc7f6342184a67cdd8b5cc3872c6a5c87e55Doris Liu            }
1254f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang            mModel.setCurrentPhoto(path, mCurrentIndex);
1255f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang        }
1256f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang    }
1257f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang
1258f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    @Override
1259f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    protected void onStateResult(int requestCode, int resultCode, Intent data) {
1260f85d974363a40b8ce588ba3fe902eec38de603d9John Reck        if (resultCode == Activity.RESULT_CANCELED) {
1261f85d974363a40b8ce588ba3fe902eec38de603d9John Reck            // This is a reset, not a canceled
1262f85d974363a40b8ce588ba3fe902eec38de603d9John Reck            return;
1263f85d974363a40b8ce588ba3fe902eec38de603d9John Reck        }
1264f85d974363a40b8ce588ba3fe902eec38de603d9John Reck        mRecenterCameraOnResume = false;
1265f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        switch (requestCode) {
1266f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang            case REQUEST_EDIT:
1267f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang                setCurrentPhotoByIntent(data);
1268f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang                break;
1269f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            case REQUEST_CROP:
1270f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                if (resultCode == Activity.RESULT_OK) {
1271f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang                    setCurrentPhotoByIntent(data);
1272f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                }
1273f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                break;
1274f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            case REQUEST_CROP_PICASA: {
1275f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang                if (resultCode == Activity.RESULT_OK) {
1276f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang                    Context context = mActivity.getAndroidContext();
127788cc2ca5f5596762a5546ec7426756f2036be455Yuli Huang                    String message = context.getString(R.string.crop_saved,
127800d64dd584c6d08310a32a28e75aebc6eb8238eaRuben Brunk                            context.getString(R.string.folder_edited_online_photos));
1279f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang                    Toast.makeText(context, message, Toast.LENGTH_SHORT).show();
1280f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang                }
1281f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                break;
1282f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            }
1283f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            case REQUEST_SLIDESHOW: {
1284f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                if (data == null) break;
1285f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                String path = data.getStringExtra(SlideshowPage.KEY_ITEM_PATH);
1286f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                int index = data.getIntExtra(SlideshowPage.KEY_PHOTO_INDEX, 0);
1287f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                if (path != null) {
1288f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                    mModel.setCurrentPhoto(Path.fromString(path), index);
1289f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                }
1290f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            }
1291f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
1292f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
1293f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
129414d3289b4867c21da93ec4032119c0091bc78c30George Mount    @Override
1295f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public void onPause() {
1296d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin        super.onPause();
1297d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin        mIsActive = false;
1298d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin
1299bd7c016d728853d38f98a3c6077b7bd9b08858b9Yuli Huang        mActivity.getGLRoot().unfreeze();
1300bd7c016d728853d38f98a3c6077b7bd9b08858b9Yuli Huang        mHandler.removeMessages(MSG_UNFREEZE_GLROOT);
1301253c5aec7692afdd7880fbd169d4b44d5679cbc0Chih-Chung Chang
13024105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen        DetailsHelper.pause();
13034438a7cce00cb19cb35cfc3cc149533f40043c00Doris Liu        // Hide the detail dialog on exit
13044438a7cce00cb19cb35cfc3cc149533f40043c00Doris Liu        if (mShowDetails) hideDetails();
1305d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu        if (mModel != null) {
1306d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu            mModel.pause();
1307d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu        }
1308f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mPhotoView.pause();
1309f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mHandler.removeMessages(MSG_HIDE_BARS);
1310d2724f69edf39cf2019eac1b49f316d22ab70d0aBobby Georgescu        mHandler.removeMessages(MSG_REFRESH_BOTTOM_CONTROLS);
13114b4dbd225685502f4249c2bf25bf74f7ce526645George Mount        refreshBottomControlsWhenReady();
1312f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mActionBar.removeOnMenuVisibilityListener(mMenuVisibilityListener);
1313ba65c373f244f6de0b45afa6b7cd711866f1bfe4Bobby Georgescu        if (mShowSpinner) {
13149481d05b0782dccd495c66d2e3240cd7448bbd4aBobby Georgescu            mActionBar.disableAlbumModeMenu(true);
13159481d05b0782dccd495c66d2e3240cd7448bbd4aBobby Georgescu        }
13166b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang        onCommitDeleteImage();
13172785956f8f5654966a41e20f482f4af3057eea3fChih-Chung Chang        mMenuExecutor.pause();
13186118af9ddad8acc050133154f8f60c842c7f9bfaChih-Chung Chang        if (mMediaSet != null) mMediaSet.clearDeletion();
1319f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
1320f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
1321f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    @Override
1322bd7c016d728853d38f98a3c6077b7bd9b08858b9Yuli Huang    public void onCurrentImageUpdated() {
1323bd7c016d728853d38f98a3c6077b7bd9b08858b9Yuli Huang        mActivity.getGLRoot().unfreeze();
1324bd7c016d728853d38f98a3c6077b7bd9b08858b9Yuli Huang    }
1325bd7c016d728853d38f98a3c6077b7bd9b08858b9Yuli Huang
1326f122d56e15e00928d731751796b0509ae47c6799George Mount    @Override
13277eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu    public void onFilmModeChanged(boolean enabled) {
13284b4dbd225685502f4249c2bf25bf74f7ce526645George Mount        refreshBottomControlsWhenReady();
1329c29588d7cc9fc3d2eef61af433fc0a8859e16ef4Bobby Georgescu        if (mShowSpinner) {
1330c29588d7cc9fc3d2eef61af433fc0a8859e16ef4Bobby Georgescu            if (enabled) {
1331c29588d7cc9fc3d2eef61af433fc0a8859e16ef4Bobby Georgescu                mActionBar.enableAlbumModeMenu(
1332c29588d7cc9fc3d2eef61af433fc0a8859e16ef4Bobby Georgescu                        GalleryActionBar.ALBUM_FILMSTRIP_MODE_SELECTED, this);
1333c29588d7cc9fc3d2eef61af433fc0a8859e16ef4Bobby Georgescu            } else {
1334c29588d7cc9fc3d2eef61af433fc0a8859e16ef4Bobby Georgescu                mActionBar.disableAlbumModeMenu(true);
1335c29588d7cc9fc3d2eef61af433fc0a8859e16ef4Bobby Georgescu            }
1336c29588d7cc9fc3d2eef61af433fc0a8859e16ef4Bobby Georgescu        }
13377eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu        if (enabled) {
13387eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu            mHandler.removeMessages(MSG_HIDE_BARS);
1339f37648b877bf6029d7afead31e965b473114c89cBobby Georgescu            UsageStatistics.onContentViewChanged(
1340f37648b877bf6029d7afead31e965b473114c89cBobby Georgescu                    UsageStatistics.COMPONENT_GALLERY, "FilmstripPage");
13417eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu        } else {
13427eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu            refreshHidingMessage();
1343f37648b877bf6029d7afead31e965b473114c89cBobby Georgescu            if (mAppBridge == null || mCurrentIndex > 0) {
1344f37648b877bf6029d7afead31e965b473114c89cBobby Georgescu                UsageStatistics.onContentViewChanged(
1345f37648b877bf6029d7afead31e965b473114c89cBobby Georgescu                        UsageStatistics.COMPONENT_GALLERY, "SinglePhotoPage");
1346f37648b877bf6029d7afead31e965b473114c89cBobby Georgescu            } else {
1347f37648b877bf6029d7afead31e965b473114c89cBobby Georgescu                UsageStatistics.onContentViewChanged(
1348f37648b877bf6029d7afead31e965b473114c89cBobby Georgescu                        UsageStatistics.COMPONENT_CAMERA, "Unknown"); // TODO
1349f37648b877bf6029d7afead31e965b473114c89cBobby Georgescu            }
13507eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu        }
13517eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu    }
13527eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu
13537eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu    private void transitionFromAlbumPageIfNeeded() {
13547eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu        TransitionStore transitions = mActivity.getTransitionStore();
13557eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu
13567eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu        int albumPageTransition = transitions.get(
13577eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu                KEY_ALBUMPAGE_TRANSITION, MSG_ALBUMPAGE_NONE);
13587eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu
1359d81b264931cfa3b34096efd46659b81f9a628fb5Bobby Georgescu        if (albumPageTransition == MSG_ALBUMPAGE_NONE && mAppBridge != null
1360d81b264931cfa3b34096efd46659b81f9a628fb5Bobby Georgescu                && mRecenterCameraOnResume) {
136100ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu            // Generally, resuming the PhotoPage when in Camera should
136200ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu            // reset to the capture mode to allow quick photo taking
136300ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu            mCurrentIndex = 0;
136400ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu            mPhotoView.resetToFirstPicture();
136500ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu        } else {
136600ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu            int resumeIndex = transitions.get(KEY_INDEX_HINT, -1);
136700ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu            if (resumeIndex >= 0) {
13683ad7bbc55d7aaa0f36a7242fdd0f612d877adc19Bobby Georgescu                if (mHasCameraScreennailOrPlaceholder) {
136976f1881067d7ca4eda6d3e398567473d2913c5d1Bobby Georgescu                    // Account for preview/placeholder being the first item
137000ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu                    resumeIndex++;
137100ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu                }
137200ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu                if (resumeIndex < mMediaSet.getMediaItemCount()) {
137300ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu                    mCurrentIndex = resumeIndex;
137400ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu                    mModel.moveTo(mCurrentIndex);
137500ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu                }
137600ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu            }
137700ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu        }
137800ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu
137900ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu        if (albumPageTransition == MSG_ALBUMPAGE_RESUMED) {
138000ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu            mPhotoView.setFilmMode(mStartInFilmstrip || mAppBridge != null);
138100ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu        } else if (albumPageTransition == MSG_ALBUMPAGE_PICKED) {
138200ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu            mPhotoView.setFilmMode(false);
13837eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu        }
13847eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu    }
13857eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu
1386bd7c016d728853d38f98a3c6077b7bd9b08858b9Yuli Huang    @Override
1387f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    protected void onResume() {
1388f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        super.onResume();
13897eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu
1390d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu        if (mModel == null) {
1391d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu            mActivity.getStateManager().finishState(this);
1392d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu            return;
1393d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu        }
13947eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu        transitionFromAlbumPageIfNeeded();
13957eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu
1396d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin        mActivity.getGLRoot().freeze();
1397f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mIsActive = true;
1398f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        setContentPane(mRootPane);
139904ac045bf8da5082bbb0bdc9ea5f9c9b5b796ad0Yuli Huang
1400f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mModel.resume();
1401f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mPhotoView.resume();
1402898a2f4540635528a0916b0a6b0a177869854ae9Wu-cheng Li        mActionBar.setDisplayOptions(
14033cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu                ((mSecureAlbum == null) && (mSetPathString != null)), false);
1404f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mActionBar.addOnMenuVisibilityListener(mMenuVisibilityListener);
14054b4dbd225685502f4249c2bf25bf74f7ce526645George Mount        refreshBottomControlsWhenReady();
1406c29588d7cc9fc3d2eef61af433fc0a8859e16ef4Bobby Georgescu        if (mShowSpinner && mPhotoView.getFilmMode()) {
14079481d05b0782dccd495c66d2e3240cd7448bbd4aBobby Georgescu            mActionBar.enableAlbumModeMenu(
14089481d05b0782dccd495c66d2e3240cd7448bbd4aBobby Georgescu                    GalleryActionBar.ALBUM_FILMSTRIP_MODE_SELECTED, this);
14099481d05b0782dccd495c66d2e3240cd7448bbd4aBobby Georgescu        }
141000ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu        if (!mShowBars) {
141100ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu            mActionBar.hide();
141200ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu            mActivity.getGLRoot().setLightsOutMode(true);
1413bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang        }
14148fe22ecb8e744a09a2e0d867f876ecbf74c82298John Reck        boolean haveImageEditor = GalleryUtils.isEditorAvailable(mActivity, "image/*");
14158fe22ecb8e744a09a2e0d867f876ecbf74c82298John Reck        if (haveImageEditor != mHaveImageEditor) {
14168fe22ecb8e744a09a2e0d867f876ecbf74c82298John Reck            mHaveImageEditor = haveImageEditor;
14178fe22ecb8e744a09a2e0d867f876ecbf74c82298John Reck            updateMenuOperations();
14188fe22ecb8e744a09a2e0d867f876ecbf74c82298John Reck        }
141900ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu
1420d81b264931cfa3b34096efd46659b81f9a628fb5Bobby Georgescu        mRecenterCameraOnResume = true;
1421bd7c016d728853d38f98a3c6077b7bd9b08858b9Yuli Huang        mHandler.sendEmptyMessageDelayed(MSG_UNFREEZE_GLROOT, UNFREEZE_GLROOT_TIMEOUT);
1422f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
1423f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
142415b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang    @Override
142515b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang    protected void onDestroy() {
1426bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang        if (mAppBridge != null) {
1427253c5aec7692afdd7880fbd169d4b44d5679cbc0Chih-Chung Chang            mAppBridge.setServer(null);
14283b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang            mScreenNailItem.setScreenNail(null);
1429bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang            mAppBridge.detachScreenNail();
1430bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang            mAppBridge = null;
14313b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang            mScreenNailSet = null;
14323b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang            mScreenNailItem = null;
1433b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang        }
14342ef46ed28b28b355d7f3f1432c7b1196b832a859Chih-Chung Chang        mActivity.getGLRoot().setOrientationSource(null);
1435f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu        if (mBottomControls != null) mBottomControls.cleanup();
1436aeb3062e84ed28f0e25a73f511f287ae0a3e4294Chih-Chung Chang
1437aeb3062e84ed28f0e25a73f511f287ae0a3e4294Chih-Chung Chang        // Remove all pending messages.
1438aeb3062e84ed28f0e25a73f511f287ae0a3e4294Chih-Chung Chang        mHandler.removeCallbacksAndMessages(null);
143915b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang        super.onDestroy();
144015b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang    }
144115b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang
1442f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private class MyDetailsSource implements DetailsSource {
14436cf807453fb58ccd4cc513ff187b306c7090e67cOwen Lin
14446cf807453fb58ccd4cc513ff187b306c7090e67cOwen Lin        @Override
1445f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        public MediaDetails getDetails() {
1446616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin            return mModel.getMediaItem(0).getDetails();
1447f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
14486cf807453fb58ccd4cc513ff187b306c7090e67cOwen Lin
14496cf807453fb58ccd4cc513ff187b306c7090e67cOwen Lin        @Override
1450f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        public int size() {
1451f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            return mMediaSet != null ? mMediaSet.getMediaItemCount() : 1;
1452f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
14536cf807453fb58ccd4cc513ff187b306c7090e67cOwen Lin
14546cf807453fb58ccd4cc513ff187b306c7090e67cOwen Lin        @Override
1455995c4566bed7df1aa48ba7e1351f964efa73880bMichael Kolb        public int setIndex() {
1456995c4566bed7df1aa48ba7e1351f964efa73880bMichael Kolb            return mModel.getCurrentIndex();
14574105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen        }
1458f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
14593cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu
14603cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu    @Override
14613cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu    public void onAlbumModeSelected(int mode) {
14623cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu        if (mode == GalleryActionBar.ALBUM_GRID_MODE_SELECTED) {
14633cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu            switchToGrid();
14643cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu        }
14653cf502a91b36bf6ce633f897505b0a2c3fc53ad5Bobby Georgescu    }
14664b4dbd225685502f4249c2bf25bf74f7ce526645George Mount
14674b4dbd225685502f4249c2bf25bf74f7ce526645George Mount    @Override
14684b4dbd225685502f4249c2bf25bf74f7ce526645George Mount    public void refreshBottomControlsWhenReady() {
14694b4dbd225685502f4249c2bf25bf74f7ce526645George Mount        if (mBottomControls == null) {
14704b4dbd225685502f4249c2bf25bf74f7ce526645George Mount            return;
14714b4dbd225685502f4249c2bf25bf74f7ce526645George Mount        }
14724b4dbd225685502f4249c2bf25bf74f7ce526645George Mount        MediaObject currentPhoto = mCurrentPhoto;
14734b4dbd225685502f4249c2bf25bf74f7ce526645George Mount        if (currentPhoto == null) {
14744b4dbd225685502f4249c2bf25bf74f7ce526645George Mount            mHandler.obtainMessage(MSG_REFRESH_BOTTOM_CONTROLS, 0, 0, currentPhoto).sendToTarget();
14754b4dbd225685502f4249c2bf25bf74f7ce526645George Mount        } else {
14764b4dbd225685502f4249c2bf25bf74f7ce526645George Mount            currentPhoto.getPanoramaSupport(mRefreshBottomControlsCallback);
14774b4dbd225685502f4249c2bf25bf74f7ce526645George Mount        }
14784b4dbd225685502f4249c2bf25bf74f7ce526645George Mount    }
14794b4dbd225685502f4249c2bf25bf74f7ce526645George Mount
14804b4dbd225685502f4249c2bf25bf74f7ce526645George Mount    private void updatePanoramaUI(boolean isPanorama360) {
14814b4dbd225685502f4249c2bf25bf74f7ce526645George Mount        Menu menu = mActionBar.getMenu();
14824b4dbd225685502f4249c2bf25bf74f7ce526645George Mount
14834b4dbd225685502f4249c2bf25bf74f7ce526645George Mount        // it could be null if onCreateActionBar has not been called yet
14844b4dbd225685502f4249c2bf25bf74f7ce526645George Mount        if (menu == null) {
14854b4dbd225685502f4249c2bf25bf74f7ce526645George Mount            return;
14864b4dbd225685502f4249c2bf25bf74f7ce526645George Mount        }
14874b4dbd225685502f4249c2bf25bf74f7ce526645George Mount
14884b4dbd225685502f4249c2bf25bf74f7ce526645George Mount        MenuExecutor.updateMenuForPanorama(menu, isPanorama360, isPanorama360);
14894b4dbd225685502f4249c2bf25bf74f7ce526645George Mount
14904b4dbd225685502f4249c2bf25bf74f7ce526645George Mount        if (isPanorama360) {
14914b4dbd225685502f4249c2bf25bf74f7ce526645George Mount            MenuItem item = menu.findItem(R.id.action_share);
14924b4dbd225685502f4249c2bf25bf74f7ce526645George Mount            if (item != null) {
14934b4dbd225685502f4249c2bf25bf74f7ce526645George Mount                item.setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER);
14944b4dbd225685502f4249c2bf25bf74f7ce526645George Mount                item.setTitle(mActivity.getResources().getString(R.string.share_as_photo));
14954b4dbd225685502f4249c2bf25bf74f7ce526645George Mount            }
14964b4dbd225685502f4249c2bf25bf74f7ce526645George Mount        } else if ((mCurrentPhoto.getSupportedOperations() & MediaObject.SUPPORT_SHARE) != 0) {
14974b4dbd225685502f4249c2bf25bf74f7ce526645George Mount            MenuItem item = menu.findItem(R.id.action_share);
14984b4dbd225685502f4249c2bf25bf74f7ce526645George Mount            if (item != null) {
14994b4dbd225685502f4249c2bf25bf74f7ce526645George Mount                item.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
15004b4dbd225685502f4249c2bf25bf74f7ce526645George Mount                item.setTitle(mActivity.getResources().getString(R.string.share));
15014b4dbd225685502f4249c2bf25bf74f7ce526645George Mount            }
15024b4dbd225685502f4249c2bf25bf74f7ce526645George Mount        }
15034b4dbd225685502f4249c2bf25bf74f7ce526645George Mount    }
1504949584340c9f5f41a6133ba06058af280490f0c8Bobby Georgescu
1505949584340c9f5f41a6133ba06058af280490f0c8Bobby Georgescu    @Override
1506949584340c9f5f41a6133ba06058af280490f0c8Bobby Georgescu    public void onUndoBarVisibilityChanged(boolean visible) {
1507949584340c9f5f41a6133ba06058af280490f0c8Bobby Georgescu        refreshBottomControlsWhenReady();
1508949584340c9f5f41a6133ba06058af280490f0c8Bobby Georgescu    }
15092251386437163898eb4b6f7546705d1365744fd1Flavio Lerda
15102251386437163898eb4b6f7546705d1365744fd1Flavio Lerda    @Override
15112251386437163898eb4b6f7546705d1365744fd1Flavio Lerda    public boolean onShareTargetSelected(ShareActionProvider source, Intent intent) {
15122251386437163898eb4b6f7546705d1365744fd1Flavio Lerda        final long timestampMillis = mCurrentPhoto.getDateInMs();
15132251386437163898eb4b6f7546705d1365744fd1Flavio Lerda        final String mediaType = getMediaTypeString(mCurrentPhoto);
15142251386437163898eb4b6f7546705d1365744fd1Flavio Lerda        UsageStatistics.onEvent(UsageStatistics.COMPONENT_GALLERY,
15152251386437163898eb4b6f7546705d1365744fd1Flavio Lerda                UsageStatistics.ACTION_SHARE,
15162251386437163898eb4b6f7546705d1365744fd1Flavio Lerda                mediaType,
15172251386437163898eb4b6f7546705d1365744fd1Flavio Lerda                        timestampMillis > 0
15182251386437163898eb4b6f7546705d1365744fd1Flavio Lerda                        ? System.currentTimeMillis() - timestampMillis
15192251386437163898eb4b6f7546705d1365744fd1Flavio Lerda                        : -1);
15202251386437163898eb4b6f7546705d1365744fd1Flavio Lerda        return false;
15212251386437163898eb4b6f7546705d1365744fd1Flavio Lerda    }
15222251386437163898eb4b6f7546705d1365744fd1Flavio Lerda
15232251386437163898eb4b6f7546705d1365744fd1Flavio Lerda    private static String getMediaTypeString(MediaItem item) {
15242251386437163898eb4b6f7546705d1365744fd1Flavio Lerda        if (item.getMediaType() == MediaObject.MEDIA_TYPE_VIDEO) {
15252251386437163898eb4b6f7546705d1365744fd1Flavio Lerda            return "Video";
15262251386437163898eb4b6f7546705d1365744fd1Flavio Lerda        } else if (item.getMediaType() == MediaObject.MEDIA_TYPE_IMAGE) {
15272251386437163898eb4b6f7546705d1365744fd1Flavio Lerda            return "Photo";
15282251386437163898eb4b6f7546705d1365744fd1Flavio Lerda        } else {
15292251386437163898eb4b6f7546705d1365744fd1Flavio Lerda            return "Unknown:" + item.getMediaType();
15302251386437163898eb4b6f7546705d1365744fd1Flavio Lerda        }
15312251386437163898eb4b6f7546705d1365744fd1Flavio Lerda    }
15322251386437163898eb4b6f7546705d1365744fd1Flavio Lerda
1533f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin}
1534