PhotoPage.java revision b27df4650459068b409924493bbadaf25bb7e191
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;
208bc5bebba780ca4a322b466b06fc909331697cf4Owen Linimport android.app.Activity;
21604f053d040782159b61d3b74ee533bc2c0ccdd0Ray Chenimport android.content.ActivityNotFoundException;
22604f053d040782159b61d3b74ee533bc2c0ccdd0Ray Chenimport android.content.Context;
23604f053d040782159b61d3b74ee533bc2c0ccdd0Ray Chenimport android.content.Intent;
24a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescuimport android.content.pm.PackageManager;
2504ac045bf8da5082bbb0bdc9ea5f9c9b5b796ad0Yuli Huangimport android.graphics.Rect;
26604f053d040782159b61d3b74ee533bc2c0ccdd0Ray Chenimport android.net.Uri;
2733ef03776b7734717b16f6fc861b831fb1b1dfacMartijn Coenenimport android.nfc.NfcAdapter;
28ddf0225a5192a589fc578945f56440b09bf74d12John Reckimport android.nfc.NfcAdapter.CreateBeamUrisCallback;
29ddf0225a5192a589fc578945f56440b09bf74d12John Reckimport android.nfc.NfcEvent;
30604f053d040782159b61d3b74ee533bc2c0ccdd0Ray Chenimport android.os.Bundle;
31604f053d040782159b61d3b74ee533bc2c0ccdd0Ray Chenimport android.os.Handler;
32604f053d040782159b61d3b74ee533bc2c0ccdd0Ray Chenimport android.os.Message;
33b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescuimport android.os.SystemClock;
34f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescuimport android.view.animation.AccelerateInterpolator;
35a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescuimport android.widget.RelativeLayout;
36604f053d040782159b61d3b74ee533bc2c0ccdd0Ray Chenimport android.widget.Toast;
37604f053d040782159b61d3b74ee533bc2c0ccdd0Ray Chen
38b21b8e58a604f6c701245d84b141b5b87663192bOwen Linimport com.actionbarsherlock.app.ActionBar.OnMenuVisibilityListener;
39b21b8e58a604f6c701245d84b141b5b87663192bOwen Linimport com.actionbarsherlock.view.Menu;
40b21b8e58a604f6c701245d84b141b5b87663192bOwen Linimport com.actionbarsherlock.view.MenuItem;
41f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.R;
42f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescuimport com.android.gallery3d.anim.FloatAnimation;
43fc86994f86f8cfb31e151c9e730dc1e9dc7b3349Yuli Huangimport com.android.gallery3d.common.ApiHelper;
44616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Linimport com.android.gallery3d.common.Utils;
45f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.data.DataManager;
466b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Changimport com.android.gallery3d.data.FilterDeleteSet;
47f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.data.MediaDetails;
48f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.data.MediaItem;
49f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.data.MediaObject;
50f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.data.MediaSet;
516b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Changimport com.android.gallery3d.data.MtpSource;
52f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.data.Path;
53a0ce682e40c39ce046c48d8a7f989fff01bb9f2cWu-cheng Liimport com.android.gallery3d.data.SecureAlbum;
54a0ce682e40c39ce046c48d8a7f989fff01bb9f2cWu-cheng Liimport com.android.gallery3d.data.SecureSource;
553b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Changimport com.android.gallery3d.data.SnailAlbum;
563b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Changimport com.android.gallery3d.data.SnailItem;
5715b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Changimport com.android.gallery3d.data.SnailSource;
58f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.picasasource.PicasaSource;
59f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescuimport com.android.gallery3d.ui.AnimationTime;
6024081fe26ca25448ddb9c8f9cc7f406d26344decOwen Linimport com.android.gallery3d.ui.BitmapScreenNail;
614105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chenimport com.android.gallery3d.ui.DetailsHelper;
624105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chenimport com.android.gallery3d.ui.DetailsHelper.CloseListener;
634105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chenimport com.android.gallery3d.ui.DetailsHelper.DetailsSource;
64f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.ui.GLCanvas;
65616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Linimport com.android.gallery3d.ui.GLRoot;
66616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Linimport com.android.gallery3d.ui.GLRoot.OnGLIdleListener;
67f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.ui.GLView;
68f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.ui.ImportCompleteListener;
69f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.ui.MenuExecutor;
70616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Linimport com.android.gallery3d.ui.PhotoFallbackEffect;
7121a412c93c9b0401b039f4eb86d4950752e5bb84Owen Linimport com.android.gallery3d.ui.PhotoView;
7251bc561e85053abfd7fda695e3cd20710acca85cBobby Georgescuimport com.android.gallery3d.ui.PreparePageFadeoutTexture;
73f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescuimport com.android.gallery3d.ui.RawTexture;
74f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.ui.SelectionManager;
75f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.ui.SynchronizedHandler;
76f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.util.GalleryUtils;
77c6781c0c0d8d193863ca09455a5bda3d542db493Bobby Georgescuimport com.android.gallery3d.util.LightCycleHelper;
78f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
79bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Changpublic class PhotoPage extends ActivityState implements
80f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu        PhotoView.Listener, OrientationManager.Listener, AppBridge.Server,
81f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu        PhotoPageBottomControls.Delegate {
82f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private static final String TAG = "PhotoPage";
83f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
84f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private static final int MSG_HIDE_BARS = 1;
85bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    private static final int MSG_LOCK_ORIENTATION = 2;
86bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    private static final int MSG_UNLOCK_ORIENTATION = 3;
87bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    private static final int MSG_ON_FULL_SCREEN_CHANGED = 4;
8861f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang    private static final int MSG_UPDATE_ACTION_BAR = 5;
89bd7c016d728853d38f98a3c6077b7bd9b08858b9Yuli Huang    private static final int MSG_UNFREEZE_GLROOT = 6;
90e6251df06f0b3c8f556043f8b725b4b19be7474dChih-Chung Chang    private static final int MSG_WANT_BARS = 7;
917eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu    private static final int MSG_REFRESH_GRID_BUTTON = 8;
92f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu    private static final int MSG_REFRESH_BOTTOM_CONTROLS = 9;
93b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu    private static final int MSG_ON_CAMERA_CENTER = 10;
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";
114f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
1157eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu    public static final String KEY_ALBUMPAGE_TRANSITION = "albumpage-transition";
1167eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu    public static final int MSG_ALBUMPAGE_NONE = 0;
1177eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu    public static final int MSG_ALBUMPAGE_STARTED = 1;
1187eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu    public static final int MSG_ALBUMPAGE_RESUMED = 2;
1197eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu    public static final int MSG_ALBUMPAGE_PICKED = 4;
1207eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu
121a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu    public static final String ACTION_NEXTGEN_EDIT = "action_nextgen_edit";
122a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu
123f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private GalleryApp mApplication;
124f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private SelectionManager mSelectionManager;
125f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
126f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private PhotoView mPhotoView;
127f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private PhotoPage.Model mModel;
1284105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen    private DetailsHelper mDetailsHelper;
129f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private boolean mShowDetails;
130f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
131f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    // mMediaSet could be null if there is no KEY_MEDIA_SET_PATH supplied.
132f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    // E.g., viewing a photo in gmail attachment
1336b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang    private FilterDeleteSet mMediaSet;
134f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
135a0ce682e40c39ce046c48d8a7f989fff01bb9f2cWu-cheng Li    // The mediaset used by camera launched from secure lock screen.
136a0ce682e40c39ce046c48d8a7f989fff01bb9f2cWu-cheng Li    private SecureAlbum mSecureAlbum;
137a0ce682e40c39ce046c48d8a7f989fff01bb9f2cWu-cheng Li
138f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private int mCurrentIndex = 0;
139f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private Handler mHandler;
140113bfc77c4468411da9ae1290553c3be89f8df9aOwen Lin    private boolean mShowBars = true;
14161f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang    private volatile boolean mActionBarAllowed = true;
1428cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen    private GalleryActionBar mActionBar;
143f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private boolean mIsMenuVisible;
1448fe22ecb8e744a09a2e0d867f876ecbf74c82298John Reck    private boolean mHaveImageEditor;
145f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu    private PhotoPageBottomControls mBottomControls;
146f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private MediaItem mCurrentPhoto = null;
147f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private MenuExecutor mMenuExecutor;
148f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private boolean mIsActive;
14984c220f10a643927c8a2126de8a755d8d7f7ec9eRay Chen    private String mSetPathString;
150b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang    // This is the original mSetPathString before adding the camera preview item.
151b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang    private String mOriginalSetPathString;
152bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    private AppBridge mAppBridge;
1533b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang    private SnailItem mScreenNailItem;
1543b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang    private SnailAlbum mScreenNailSet;
155bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    private OrientationManager mOrientationManager;
15671cd89a38752bc22ae0ec2df965e4280b776623cChih-Chung Chang    private boolean mHasActivityResult;
15754fe6202b6f7d233e7645c121321fe0f3d20fc8bYuli Huang    private boolean mTreatBackAsUp;
1587eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu    private boolean mStartInFilmstrip;
1597eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu    private boolean mStartedFromAlbumPage;
16015b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang
161b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu    private long mCameraSwitchCutoff = 0;
162b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu    private boolean mSkipUpdateCurrentPhoto = false;
163b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu    private static final long CAMERA_SWITCH_CUTOFF_THRESHOLD_MS = 300;
164b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu
165f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu    private RawTexture mFadeOutTexture;
166f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu    private Rect mOpenAnimationRect;
1677eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu    public static final int ANIM_TIME_OPENING = 300;
168f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu
1696b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang    // The item that is deleted (but it can still be undeleted before commiting)
1706b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang    private Path mDeletePath;
1716b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang    private boolean mDeleteIsFocus;  // whether the deleted item was in focus
1726b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang
173ddf0225a5192a589fc578945f56440b09bf74d12John Reck    private Uri[] mNfcPushUris = new Uri[1];
17433ef03776b7734717b16f6fc861b831fb1b1dfacMartijn Coenen
1752bb717f1ea38e2ce33dd102a23afe6bfacb5675cOwen Lin    private final MyMenuVisibilityListener mMenuVisibilityListener =
1762bb717f1ea38e2ce33dd102a23afe6bfacb5675cOwen Lin            new MyMenuVisibilityListener();
1772bb717f1ea38e2ce33dd102a23afe6bfacb5675cOwen Lin
178f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public static interface Model extends PhotoView.Model {
179f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        public void resume();
180f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        public void pause();
181f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        public boolean isEmpty();
182f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        public void setCurrentPhoto(Path path, int indexHint);
183f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
184f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
185f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private class MyMenuVisibilityListener implements OnMenuVisibilityListener {
18606c6401eededc2ec842ba4994a838c2ded0a666cPin Ting        @Override
187f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        public void onMenuVisibilityChanged(boolean isVisible) {
188f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            mIsMenuVisible = isVisible;
189f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            refreshHidingMessage();
190f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
191f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
192f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
193f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu    private static class BackgroundFadeOut extends FloatAnimation {
194f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu        public BackgroundFadeOut() {
195f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu            super(1f, 0f, ANIM_TIME_OPENING);
196f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu            setInterpolator(new AccelerateInterpolator(2f));
197f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu        }
198f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu    }
199f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu
200f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu    private final FloatAnimation mBackgroundFade = new BackgroundFadeOut();
201f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
202915c2c5b2c367df71599370613af0924bd7c4887Bobby Georgescu    @Override
203915c2c5b2c367df71599370613af0924bd7c4887Bobby Georgescu    protected int getBackgroundColorId() {
204915c2c5b2c367df71599370613af0924bd7c4887Bobby Georgescu        return R.color.photo_background;
205915c2c5b2c367df71599370613af0924bd7c4887Bobby Georgescu    }
206915c2c5b2c367df71599370613af0924bd7c4887Bobby Georgescu
207f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu    private final GLView mRootPane = new GLView() {
208f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        @Override
209f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        protected void renderBackground(GLCanvas view) {
21083be4e0c9b8e3372eff8f9b1a396afd961b72921Angus Kong            if (mFadeOutTexture != null) {
21183be4e0c9b8e3372eff8f9b1a396afd961b72921Angus Kong                if (mBackgroundFade.calculate(AnimationTime.get())) invalidate();
21283be4e0c9b8e3372eff8f9b1a396afd961b72921Angus Kong                if (!mBackgroundFade.isActive()) {
213f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu                    mFadeOutTexture = null;
214f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu                    mOpenAnimationRect = null;
215f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu                    BitmapScreenNail.enableDrawPlaceholder();
216f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu                } else {
217f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu                    float fadeAlpha = mBackgroundFade.get();
21883be4e0c9b8e3372eff8f9b1a396afd961b72921Angus Kong                    if (fadeAlpha < 1f) {
219915c2c5b2c367df71599370613af0924bd7c4887Bobby Georgescu                        view.clearBuffer(getBackgroundColor());
220f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu                        view.setAlpha(fadeAlpha);
221f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu                    }
222f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu                    mFadeOutTexture.draw(view, 0, 0);
22302ef48574ef7099ebaa0386bd6fd676bd2fd5489Bobby Georgescu                    view.setAlpha(1f - fadeAlpha);
224f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu                    return;
225f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu                }
226f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu            }
227915c2c5b2c367df71599370613af0924bd7c4887Bobby Georgescu            view.clearBuffer(getBackgroundColor());
228f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
229f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
230f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        @Override
231f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        protected void onLayout(
232f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                boolean changed, int left, int top, int right, int bottom) {
233f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            mPhotoView.layout(0, 0, right - left, bottom - top);
234f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            if (mShowDetails) {
2358cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen                mDetailsHelper.layout(left, mActionBar.getHeight(), right, bottom);
236f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            }
237f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
238f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    };
239f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
240f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    @Override
241f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public void onCreate(Bundle data, Bundle restoreState) {
24245c56f2d34c71d0bc9b84ebeef6d1314738d0fc0Bobby Georgescu        super.onCreate(data, restoreState);
2438cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen        mActionBar = mActivity.getGalleryActionBar();
244f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mSelectionManager = new SelectionManager(mActivity, false);
245f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mMenuExecutor = new MenuExecutor(mActivity, mSelectionManager);
246f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
247f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mPhotoView = new PhotoView(mActivity);
248bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang        mPhotoView.setListener(this);
249f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mRootPane.addComponent(mPhotoView);
25083be4e0c9b8e3372eff8f9b1a396afd961b72921Angus Kong        mApplication = (GalleryApp) ((Activity) mActivity).getApplication();
251bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang        mOrientationManager = mActivity.getOrientationManager();
252bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang        mOrientationManager.addListener(this);
2532ef46ed28b28b355d7f3f1432c7b1196b832a859Chih-Chung Chang        mActivity.getGLRoot().setOrientationSource(mOrientationManager);
254f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
255d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu        mHandler = new SynchronizedHandler(mActivity.getGLRoot()) {
256d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu            @Override
257d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu            public void handleMessage(Message message) {
258d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu                switch (message.what) {
259d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu                    case MSG_HIDE_BARS: {
260d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu                        hideBars();
261d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu                        break;
262d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu                    }
263d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu                    case MSG_REFRESH_GRID_BUTTON: {
264d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu                        setGridButtonVisibility(mPhotoView.getFilmMode());
265d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu                        break;
266d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu                    }
267f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu                    case MSG_REFRESH_BOTTOM_CONTROLS: {
268f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu                        if (mBottomControls != null) mBottomControls.refresh();
269d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu                        break;
270d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu                    }
271d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu                    case MSG_LOCK_ORIENTATION: {
272d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu                        mOrientationManager.lockOrientation();
273d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu                        break;
274d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu                    }
275d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu                    case MSG_UNLOCK_ORIENTATION: {
276d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu                        mOrientationManager.unlockOrientation();
277d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu                        break;
278d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu                    }
279d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu                    case MSG_ON_FULL_SCREEN_CHANGED: {
280d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu                        mAppBridge.onFullScreenChanged(message.arg1 == 1);
281d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu                        break;
282d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu                    }
283d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu                    case MSG_UPDATE_ACTION_BAR: {
284d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu                        updateBars();
285d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu                        break;
286d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu                    }
287d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu                    case MSG_WANT_BARS: {
288d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu                        wantBars();
289d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu                        break;
290d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu                    }
291d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu                    case MSG_UNFREEZE_GLROOT: {
292d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu                        mActivity.getGLRoot().unfreeze();
293d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu                        break;
294d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu                    }
295b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu                    case MSG_ON_CAMERA_CENTER: {
296b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu                        mSkipUpdateCurrentPhoto = false;
297b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu                        boolean updateNeeded = false;
298b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu                        if (!mPhotoView.getFilmMode()) {
299b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu                            lockOrientation();
300b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu                            updateNeeded = true;
301b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu                        } else if (SystemClock.uptimeMillis() < mCameraSwitchCutoff &&
302b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu                                mMediaSet.getMediaItemCount() > 1) {
303b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu                            mPhotoView.switchToImage(1);
304b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu                        } else {
305b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu                            mPhotoView.setFilmMode(false);
306b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu                            updateNeeded = true;
307b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu                        }
308b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu
309b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu                        if (updateNeeded) {
310b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu                            updateBars();
311b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu                            updateCurrentPhoto(mModel.getMediaItem(0));
312b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu                        }
313b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu                        break;
314b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu                    }
315d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu                    default: throw new AssertionError(message.what);
316d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu                }
317d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu            }
318d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu        };
319d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu
32084c220f10a643927c8a2126de8a755d8d7f7ec9eRay Chen        mSetPathString = data.getString(KEY_MEDIA_SET_PATH);
321b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang        mOriginalSetPathString = mSetPathString;
322ddf0225a5192a589fc578945f56440b09bf74d12John Reck        setupNfcBeamPush();
3237eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu        String itemPathString = data.getString(KEY_MEDIA_ITEM_PATH);
3247eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu        Path itemPath = itemPathString != null ?
3257eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu                Path.fromString(data.getString(KEY_MEDIA_ITEM_PATH)) :
3267eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu                    null;
32754fe6202b6f7d233e7645c121321fe0f3d20fc8bYuli Huang        mTreatBackAsUp = data.getBoolean(KEY_TREAT_BACK_AS_UP, false);
3287eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu        mStartInFilmstrip =
3297eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu            data.getBoolean(KEY_START_IN_FILMSTRIP, false);
3307eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu        mStartedFromAlbumPage =
3317eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu                data.getInt(KEY_ALBUMPAGE_TRANSITION,
3327eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu                        MSG_ALBUMPAGE_NONE) == MSG_ALBUMPAGE_STARTED;
3337eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu        setGridButtonVisibility(!mStartedFromAlbumPage);
33484c220f10a643927c8a2126de8a755d8d7f7ec9eRay Chen        if (mSetPathString != null) {
335bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang            mAppBridge = (AppBridge) data.getParcelable(KEY_APP_BRIDGE);
336bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang            if (mAppBridge != null) {
3377eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu                mShowBars = false;
3387eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu
339253c5aec7692afdd7880fbd169d4b44d5679cbc0Chih-Chung Chang                mAppBridge.setServer(this);
340bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang                mOrientationManager.lockOrientation();
341b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang
342bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang                // Get the ScreenNail from AppBridge and register it.
3433b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang                int id = SnailSource.newId();
344b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang                Path screenNailSetPath = SnailSource.getSetPath(id);
345bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang                Path screenNailItemPath = SnailSource.getItemPath(id);
3463b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang                mScreenNailSet = (SnailAlbum) mActivity.getDataManager()
3473b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang                        .getMediaObject(screenNailSetPath);
3483b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang                mScreenNailItem = (SnailItem) mActivity.getDataManager()
349bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang                        .getMediaObject(screenNailItemPath);
3503b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang                mScreenNailItem.setScreenNail(mAppBridge.attachScreenNail());
351b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang
352a0ce682e40c39ce046c48d8a7f989fff01bb9f2cWu-cheng Li                // Check if the path is a secure album.
353a0ce682e40c39ce046c48d8a7f989fff01bb9f2cWu-cheng Li                if (SecureSource.isSecurePath(mSetPathString)) {
354a0ce682e40c39ce046c48d8a7f989fff01bb9f2cWu-cheng Li                    mSecureAlbum = (SecureAlbum) mActivity.getDataManager()
355a0ce682e40c39ce046c48d8a7f989fff01bb9f2cWu-cheng Li                            .getMediaSet(mSetPathString);
35623e595f0c656ebaeb63f78e3018b5830628c5afeWu-cheng Li                }
35723e595f0c656ebaeb63f78e3018b5830628c5afeWu-cheng Li                if (data.getBoolean(KEY_SHOW_WHEN_LOCKED, false)) {
358efd480e85dc5bd0d2ca0ac82d03e141212388830Wu-cheng Li                    // Set the flag to be on top of the lock screen.
359efd480e85dc5bd0d2ca0ac82d03e141212388830Wu-cheng Li                    mFlags |= FLAG_SHOW_WHEN_LOCKED;
360a0ce682e40c39ce046c48d8a7f989fff01bb9f2cWu-cheng Li                }
361a0ce682e40c39ce046c48d8a7f989fff01bb9f2cWu-cheng Li
362c7e3c76d6965f520a9651d309052c5f01726cd58Bobby Georgescu                // Don't display "empty album" action item for capture intents
363c7e3c76d6965f520a9651d309052c5f01726cd58Bobby Georgescu                if(!mSetPathString.equals("/local/all/0")) {
364c7e3c76d6965f520a9651d309052c5f01726cd58Bobby Georgescu                    mSetPathString = "/filter/empty/{"+mSetPathString+"}";
365c7e3c76d6965f520a9651d309052c5f01726cd58Bobby Georgescu                }
366c7e3c76d6965f520a9651d309052c5f01726cd58Bobby Georgescu
3673b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang                // Combine the original MediaSet with the one for ScreenNail
3683b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang                // from AppBridge.
369b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang                mSetPathString = "/combo/item/{" + screenNailSetPath +
370b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang                        "," + mSetPathString + "}";
371b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang
372b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang                // Start from the screen nail.
373bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang                itemPath = screenNailItemPath;
374b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang            }
375b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang
3766118af9ddad8acc050133154f8f60c842c7f9bfaChih-Chung Chang            MediaSet originalSet = mActivity.getDataManager()
3776118af9ddad8acc050133154f8f60c842c7f9bfaChih-Chung Chang                    .getMediaSet(mSetPathString);
3786118af9ddad8acc050133154f8f60c842c7f9bfaChih-Chung Chang            mSelectionManager.setSourceMediaSet(originalSet);
3796b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang            mSetPathString = "/filter/delete/{" + mSetPathString + "}";
3806b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang            mMediaSet = (FilterDeleteSet) mActivity.getDataManager()
3816b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang                    .getMediaSet(mSetPathString);
382f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            mCurrentIndex = data.getInt(KEY_INDEX_HINT, 0);
383f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            if (mMediaSet == null) {
38484c220f10a643927c8a2126de8a755d8d7f7ec9eRay Chen                Log.w(TAG, "failed to restore " + mSetPathString);
385f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            }
3867eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu            if (itemPath == null) {
3873eb2e643a40d1be77998373343cdf8b14764f58cBobby Georgescu                int mediaItemCount = mMediaSet.getMediaItemCount();
3883eb2e643a40d1be77998373343cdf8b14764f58cBobby Georgescu                if (mediaItemCount > 0) {
3893eb2e643a40d1be77998373343cdf8b14764f58cBobby Georgescu                    if (mCurrentIndex >= mediaItemCount) mCurrentIndex = 0;
390d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu                    itemPath = mMediaSet.getMediaItem(mCurrentIndex, 1)
391d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu                        .get(0).getPath();
392d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu                } else {
3933eb2e643a40d1be77998373343cdf8b14764f58cBobby Georgescu                    // Bail out, PhotoPage can't load on an empty album
394d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu                    return;
395d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu                }
3967eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu            }
397f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            PhotoDataAdapter pda = new PhotoDataAdapter(
398bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang                    mActivity, mPhotoView, mMediaSet, itemPath, mCurrentIndex,
39943a80fd806247cb50e81bacda3ad21d210e9ae88Angus Kong                    mAppBridge == null ? -1 : 0,
400dbb6acc204ba6f095eb0e49e1298e9ceda2c3096Wu-cheng Li                    mAppBridge == null ? false : mAppBridge.isPanorama(),
401dbb6acc204ba6f095eb0e49e1298e9ceda2c3096Wu-cheng Li                    mAppBridge == null ? false : mAppBridge.isStaticCamera());
402f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            mModel = pda;
403f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            mPhotoView.setModel(mModel);
404f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
405f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            pda.setDataListener(new PhotoDataAdapter.DataListener() {
406f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
407113bfc77c4468411da9ae1290553c3be89f8df9aOwen Lin                @Override
408f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                public void onPhotoChanged(int index, Path item) {
40900ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu                    int oldIndex = mCurrentIndex;
410f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                    mCurrentIndex = index;
411b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu
41200ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu                    if (mAppBridge != null) {
413b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu                        mPhotoView.setWantCameraCenterCallbacks(true);
414b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu                        if (mCurrentIndex > 0) {
415b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu                            mHandler.removeMessages(MSG_ON_CAMERA_CENTER);
416b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu                            mSkipUpdateCurrentPhoto = false;
417b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu                        }
418b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu
41900ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu                        if (oldIndex == 0 && mCurrentIndex > 0
42000ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu                                && !mPhotoView.getFilmMode()) {
42100ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu                            mPhotoView.setFilmMode(true);
422b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu                        } else if (oldIndex == 2 && mCurrentIndex == 1) {
423b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu                            mCameraSwitchCutoff = SystemClock.uptimeMillis() +
424b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu                                    CAMERA_SWITCH_CUTOFF_THRESHOLD_MS;
425b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu                            mPhotoView.stopScrolling();
426b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu                        } else if (oldIndex == 1 && mCurrentIndex == 0) {
427b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu                            mSkipUpdateCurrentPhoto = true;
42800ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu                        }
42900ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu                    }
430b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu                    if (!mSkipUpdateCurrentPhoto) {
431b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu                        if (item != null) {
432b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu                            MediaItem photo = mModel.getMediaItem(0);
433b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu                            if (photo != null) updateCurrentPhoto(photo);
434b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu                        }
435b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu                        updateBars();
436b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu                    }
43700ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu                    // Reset the timeout for the bars after a swipe
43800ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu                    refreshHidingMessage();
439f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                }
440f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
441f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                @Override
442f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                public void onLoadingFinished() {
443f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                    if (!mModel.isEmpty()) {
444616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin                        MediaItem photo = mModel.getMediaItem(0);
445f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                        if (photo != null) updateCurrentPhoto(photo);
446f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                    } else if (mIsActive) {
447c370476adcf29f311ceec70a119792a0168781e9Chih-Chung Chang                        // We only want to finish the PhotoPage if there is no
448c370476adcf29f311ceec70a119792a0168781e9Chih-Chung Chang                        // deletion that the user can undo.
449c370476adcf29f311ceec70a119792a0168781e9Chih-Chung Chang                        if (mMediaSet.getNumberOfDeletions() == 0) {
450c370476adcf29f311ceec70a119792a0168781e9Chih-Chung Chang                            mActivity.getStateManager().finishState(
451c370476adcf29f311ceec70a119792a0168781e9Chih-Chung Chang                                    PhotoPage.this);
452c370476adcf29f311ceec70a119792a0168781e9Chih-Chung Chang                        }
453f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                    }
454f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                }
455f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
456f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                @Override
457f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                public void onLoadingStarted() {
458f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                }
459f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            });
460f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        } else {
461f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            // Get default media set by the URI
462f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            MediaItem mediaItem = (MediaItem)
463f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                    mActivity.getDataManager().getMediaObject(itemPath);
464f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            mModel = new SinglePhotoDataAdapter(mActivity, mPhotoView, mediaItem);
465f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            mPhotoView.setModel(mModel);
466f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            updateCurrentPhoto(mediaItem);
467f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
468cf46a3abc26aac7cdb6b6993aeade053304b71d9Ray Chen
469b265ebb01cc046b74329eeb28dbecb24e0f953d2Bobby Georgescu        mPhotoView.setFilmMode(mStartInFilmstrip && mMediaSet.getMediaItemCount() > 1);
470f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu        if (mSecureAlbum == null) {
471f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu            RelativeLayout galleryRoot = (RelativeLayout) ((Activity) mActivity)
472f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu                        .findViewById(mAppBridge != null ? R.id.content : R.id.gallery_root);
473f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu            if (galleryRoot != null) {
474f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu                mBottomControls = new PhotoPageBottomControls(this, mActivity, galleryRoot);
475f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu            }
476f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu        }
477a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu    }
478a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu
479b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu    public void onCameraCenter() {
480b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu        mPhotoView.setWantCameraCenterCallbacks(false);
481b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu        mHandler.sendEmptyMessage(MSG_ON_CAMERA_CENTER);
482b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu    }
483b27df4650459068b409924493bbadaf25bb7e191Bobby Georgescu
484f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu    public boolean canDisplayBottomControls() {
485f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu        return mShowBars && !mPhotoView.getFilmMode();
486a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu    }
487a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu
488f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu    public boolean canDisplayBottomControl(int control) {
489f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu        if (mCurrentPhoto == null) return false;
490f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu        switch(control) {
491f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu            case R.id.photopage_bottom_control_edit:
492f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu                return mCurrentPhoto.getMediaType() == MediaObject.MEDIA_TYPE_IMAGE;
493f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu            case R.id.photopage_bottom_control_panorama:
494f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu                return (mCurrentPhoto.getSupportedOperations()
4954f32d514ee7474d867d04bf3934f9e11e9e92783Mangesh Ghiware                        & MediaItem.SUPPORT_PANORAMA) != 0;
496f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu            default:
497f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu                return false;
498f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu        }
499a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu    }
500a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu
501f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu    public void onBottomControlClicked(int control) {
502f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu        switch(control) {
503f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu            case R.id.photopage_bottom_control_edit:
504f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu                launchPhotoEditor();
505f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu                return;
506f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu            case R.id.photopage_bottom_control_panorama:
507f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu                LightCycleHelper.viewPanorama(mActivity, mCurrentPhoto.getContentUri());
508f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu                return;
509f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu            default:
510f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu                return;
511a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu        }
512f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
513f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
5146772173d2a49b87a1d209f42fe52b5f830596f99Chih-Chung Chang    @TargetApi(ApiHelper.VERSION_CODES.JELLY_BEAN)
515ddf0225a5192a589fc578945f56440b09bf74d12John Reck    private void setupNfcBeamPush() {
516ddf0225a5192a589fc578945f56440b09bf74d12John Reck        if (!ApiHelper.HAS_SET_BEAM_PUSH_URIS) return;
517ddf0225a5192a589fc578945f56440b09bf74d12John Reck
518ddf0225a5192a589fc578945f56440b09bf74d12John Reck        NfcAdapter adapter = NfcAdapter.getDefaultAdapter(mActivity);
519ddf0225a5192a589fc578945f56440b09bf74d12John Reck        if (adapter != null) {
520ddf0225a5192a589fc578945f56440b09bf74d12John Reck            adapter.setBeamPushUrisCallback(new CreateBeamUrisCallback() {
521ddf0225a5192a589fc578945f56440b09bf74d12John Reck                @Override
522ddf0225a5192a589fc578945f56440b09bf74d12John Reck                public Uri[] createBeamUris(NfcEvent event) {
523ddf0225a5192a589fc578945f56440b09bf74d12John Reck                    return mNfcPushUris;
524ddf0225a5192a589fc578945f56440b09bf74d12John Reck                }
525ddf0225a5192a589fc578945f56440b09bf74d12John Reck            }, mActivity);
526fc86994f86f8cfb31e151c9e730dc1e9dc7b3349Yuli Huang        }
527fc86994f86f8cfb31e151c9e730dc1e9dc7b3349Yuli Huang    }
528fc86994f86f8cfb31e151c9e730dc1e9dc7b3349Yuli Huang
529ddf0225a5192a589fc578945f56440b09bf74d12John Reck    private void setNfcBeamPushUri(Uri uri) {
530ddf0225a5192a589fc578945f56440b09bf74d12John Reck        mNfcPushUris[0] = uri;
531ddf0225a5192a589fc578945f56440b09bf74d12John Reck    }
532ddf0225a5192a589fc578945f56440b09bf74d12John Reck
533fb5571987f2555b04731b6f3e1c479efc16d542aWu-cheng Li    private Intent createShareIntent(Path path) {
534fb5571987f2555b04731b6f3e1c479efc16d542aWu-cheng Li        DataManager manager = mActivity.getDataManager();
535fb5571987f2555b04731b6f3e1c479efc16d542aWu-cheng Li        int type = manager.getMediaType(path);
536fb5571987f2555b04731b6f3e1c479efc16d542aWu-cheng Li        Intent intent = new Intent(Intent.ACTION_SEND);
5375172dee697c05235ddf932827d75e6fa0b81d382Mangesh Ghiware        intent.setType(MenuExecutor.getMimeType(type));
5382bb717f1ea38e2ce33dd102a23afe6bfacb5675cOwen Lin        Uri uri = manager.getContentUri(path);
539fb5571987f2555b04731b6f3e1c479efc16d542aWu-cheng Li        intent.putExtra(Intent.EXTRA_STREAM, uri);
540fb5571987f2555b04731b6f3e1c479efc16d542aWu-cheng Li        return intent;
5415172dee697c05235ddf932827d75e6fa0b81d382Mangesh Ghiware    }
542fb5571987f2555b04731b6f3e1c479efc16d542aWu-cheng Li
5435172dee697c05235ddf932827d75e6fa0b81d382Mangesh Ghiware    private Intent createSharePanoramaIntent(Path path) {
5445172dee697c05235ddf932827d75e6fa0b81d382Mangesh Ghiware        DataManager manager = mActivity.getDataManager();
5455172dee697c05235ddf932827d75e6fa0b81d382Mangesh Ghiware        int supported = manager.getSupportedOperations(path);
5465172dee697c05235ddf932827d75e6fa0b81d382Mangesh Ghiware        if ((supported & MediaObject.SUPPORT_PANORAMA) == 0) {
5475172dee697c05235ddf932827d75e6fa0b81d382Mangesh Ghiware            return null;
5485172dee697c05235ddf932827d75e6fa0b81d382Mangesh Ghiware        }
5495172dee697c05235ddf932827d75e6fa0b81d382Mangesh Ghiware        Intent intent = new Intent(Intent.ACTION_SEND);
5505172dee697c05235ddf932827d75e6fa0b81d382Mangesh Ghiware        intent.setType(GalleryUtils.MIME_TYPE_PANORAMA);
5515172dee697c05235ddf932827d75e6fa0b81d382Mangesh Ghiware        Uri uri = manager.getContentUri(path);
5525172dee697c05235ddf932827d75e6fa0b81d382Mangesh Ghiware        intent.putExtra(Intent.EXTRA_STREAM, uri);
5535172dee697c05235ddf932827d75e6fa0b81d382Mangesh Ghiware        return intent;
554fb5571987f2555b04731b6f3e1c479efc16d542aWu-cheng Li    }
555fb5571987f2555b04731b6f3e1c479efc16d542aWu-cheng Li
556a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu    private void launchPhotoEditor() {
557a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu        MediaItem current = mModel.getMediaItem(0);
558a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu        if (current == null) return;
559a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu
560a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu        Intent intent = new Intent(ACTION_NEXTGEN_EDIT);
561a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu        intent.setData(mActivity.getDataManager().getContentUri(current.getPath())).setFlags(
562a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu                Intent.FLAG_GRANT_READ_URI_PERMISSION);
563a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu        if (mActivity.getPackageManager()
564a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu                .queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY).size() == 0) {
565a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu            intent.setAction(Intent.ACTION_EDIT);
566a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu        }
567a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu        ((Activity) mActivity).startActivityForResult(Intent.createChooser(intent, null),
568a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu                REQUEST_EDIT);
569a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu    }
570a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu
5712bb717f1ea38e2ce33dd102a23afe6bfacb5675cOwen Lin    private void updateShareURI(Path path) {
57224081fe26ca25448ddb9c8f9cc7f406d26344decOwen Lin        DataManager manager = mActivity.getDataManager();
5735172dee697c05235ddf932827d75e6fa0b81d382Mangesh Ghiware        mActionBar.setShareIntents(
5745172dee697c05235ddf932827d75e6fa0b81d382Mangesh Ghiware                createSharePanoramaIntent(path),
5755172dee697c05235ddf932827d75e6fa0b81d382Mangesh Ghiware                createShareIntent(path));
57624081fe26ca25448ddb9c8f9cc7f406d26344decOwen Lin        Uri uri = manager.getContentUri(path);
577ddf0225a5192a589fc578945f56440b09bf74d12John Reck        setNfcBeamPushUri(uri);
578cf46a3abc26aac7cdb6b6993aeade053304b71d9Ray Chen    }
579cf46a3abc26aac7cdb6b6993aeade053304b71d9Ray Chen
580f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private void updateCurrentPhoto(MediaItem photo) {
581f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        if (mCurrentPhoto == photo) return;
582f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mCurrentPhoto = photo;
583f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        if (mCurrentPhoto == null) return;
584c7e3c76d6965f520a9651d309052c5f01726cd58Bobby Georgescu
585c7e3c76d6965f520a9651d309052c5f01726cd58Bobby Georgescu        // If by swiping or deletion the user ends up on an action item
586c7e3c76d6965f520a9651d309052c5f01726cd58Bobby Georgescu        // and zoomed in, zoom out so that the context of the action is
587c7e3c76d6965f520a9651d309052c5f01726cd58Bobby Georgescu        // more clear
588c7e3c76d6965f520a9651d309052c5f01726cd58Bobby Georgescu        if ((photo.getSupportedOperations() & MediaObject.SUPPORT_ACTION) != 0
589c7e3c76d6965f520a9651d309052c5f01726cd58Bobby Georgescu                && !mPhotoView.getFilmMode()) {
590c7e3c76d6965f520a9651d309052c5f01726cd58Bobby Georgescu            mPhotoView.setFilmMode(true);
591c7e3c76d6965f520a9651d309052c5f01726cd58Bobby Georgescu        }
592c7e3c76d6965f520a9651d309052c5f01726cd58Bobby Georgescu
593f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        updateMenuOperations();
594ed46d77c16cd80357f4a0feada2435dfba8104a6Yuli Huang        updateTitle();
595f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu        if (mBottomControls != null) mBottomControls.refresh();
596f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        if (mShowDetails) {
597995c4566bed7df1aa48ba7e1351f964efa73880bMichael Kolb            mDetailsHelper.reloadDetails();
598f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
599898a2f4540635528a0916b0a6b0a177869854ae9Wu-cheng Li        if ((mSecureAlbum == null)
600898a2f4540635528a0916b0a6b0a177869854ae9Wu-cheng Li                && (photo.getSupportedOperations() & MediaItem.SUPPORT_SHARE) != 0) {
60115b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang            updateShareURI(photo.getPath());
60215b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang        }
603f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
604f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
605ed46d77c16cd80357f4a0feada2435dfba8104a6Yuli Huang    private void updateTitle() {
606ed46d77c16cd80357f4a0feada2435dfba8104a6Yuli Huang        if (mCurrentPhoto == null) return;
607ed46d77c16cd80357f4a0feada2435dfba8104a6Yuli Huang        boolean showTitle = mActivity.getAndroidContext().getResources().getBoolean(
608ed46d77c16cd80357f4a0feada2435dfba8104a6Yuli Huang                R.bool.show_action_bar_title);
6092bb717f1ea38e2ce33dd102a23afe6bfacb5675cOwen Lin        if (showTitle && mCurrentPhoto.getName() != null) {
610ed46d77c16cd80357f4a0feada2435dfba8104a6Yuli Huang            mActionBar.setTitle(mCurrentPhoto.getName());
6112bb717f1ea38e2ce33dd102a23afe6bfacb5675cOwen Lin        } else {
612ed46d77c16cd80357f4a0feada2435dfba8104a6Yuli Huang            mActionBar.setTitle("");
6132bb717f1ea38e2ce33dd102a23afe6bfacb5675cOwen Lin        }
614ed46d77c16cd80357f4a0feada2435dfba8104a6Yuli Huang    }
615ed46d77c16cd80357f4a0feada2435dfba8104a6Yuli Huang
616f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private void updateMenuOperations() {
61724081fe26ca25448ddb9c8f9cc7f406d26344decOwen Lin        Menu menu = mActionBar.getMenu();
61824081fe26ca25448ddb9c8f9cc7f406d26344decOwen Lin
61924081fe26ca25448ddb9c8f9cc7f406d26344decOwen Lin        // it could be null if onCreateActionBar has not been called yet
62024081fe26ca25448ddb9c8f9cc7f406d26344decOwen Lin        if (menu == null) return;
62124081fe26ca25448ddb9c8f9cc7f406d26344decOwen Lin
6227eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu        setGridButtonVisibility(mPhotoView.getFilmMode());
6237eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu
62424081fe26ca25448ddb9c8f9cc7f406d26344decOwen Lin        MenuItem item = menu.findItem(R.id.action_slideshow);
62553fe9f72433f2fdae30e1708c5933390202cbcf5John Reck        if (item != null) {
62653fe9f72433f2fdae30e1708c5933390202cbcf5John Reck            item.setVisible((mSecureAlbum == null) && canDoSlideShow());
62753fe9f72433f2fdae30e1708c5933390202cbcf5John Reck        }
6282066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang        if (mCurrentPhoto == null) return;
62924081fe26ca25448ddb9c8f9cc7f406d26344decOwen Lin
630f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        int supportedOperations = mCurrentPhoto.getSupportedOperations();
631898a2f4540635528a0916b0a6b0a177869854ae9Wu-cheng Li        if (mSecureAlbum != null) {
63224081fe26ca25448ddb9c8f9cc7f406d26344decOwen Lin            supportedOperations &= MediaObject.SUPPORT_DELETE;
6338fe22ecb8e744a09a2e0d867f876ecbf74c82298John Reck        } else if (!mHaveImageEditor) {
634f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            supportedOperations &= ~MediaObject.SUPPORT_EDIT;
635f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
63624081fe26ca25448ddb9c8f9cc7f406d26344decOwen Lin        MenuExecutor.updateMenuOperation(menu, supportedOperations);
637f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
638f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
6392066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang    private boolean canDoSlideShow() {
6402066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang        if (mMediaSet == null || mCurrentPhoto == null) {
6412066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang            return false;
6422066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang        }
6432066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang        if (mCurrentPhoto.getMediaType() != MediaObject.MEDIA_TYPE_IMAGE) {
6442066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang            return false;
6452066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang        }
6466b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang        if (MtpSource.isMtpPath(mOriginalSetPathString)) {
6472066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang            return false;
6482066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang        }
6492066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang        return true;
6502066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang    }
6512066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang
65261f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang    //////////////////////////////////////////////////////////////////////////
65361f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang    //  Action Bar show/hide management
65461f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang    //////////////////////////////////////////////////////////////////////////
65561f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang
656f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private void showBars() {
657f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        if (mShowBars) return;
658f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mShowBars = true;
659e6251df06f0b3c8f556043f8b725b4b19be7474dChih-Chung Chang        mOrientationManager.unlockOrientation();
660f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mActionBar.show();
6610b2486cff0c1b951c54325596256b986307f7f3aChih-Chung Chang        mActivity.getGLRoot().setLightsOutMode(false);
66261f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang        refreshHidingMessage();
663f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu        if (mBottomControls != null) mBottomControls.refresh();
664f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
665f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
666f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private void hideBars() {
667f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        if (!mShowBars) return;
668f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mShowBars = false;
669f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mActionBar.hide();
6700b2486cff0c1b951c54325596256b986307f7f3aChih-Chung Chang        mActivity.getGLRoot().setLightsOutMode(true);
67161f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang        mHandler.removeMessages(MSG_HIDE_BARS);
672f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu        if (mBottomControls != null) mBottomControls.refresh();
673f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
674f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
675f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private void refreshHidingMessage() {
676f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mHandler.removeMessages(MSG_HIDE_BARS);
6777eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu        if (!mIsMenuVisible && !mPhotoView.getFilmMode()) {
678f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            mHandler.sendEmptyMessageDelayed(MSG_HIDE_BARS, HIDE_BARS_TIMEOUT);
679f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
680f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
681f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
682aeb3062e84ed28f0e25a73f511f287ae0a3e4294Chih-Chung Chang    private boolean canShowBars() {
683aeb3062e84ed28f0e25a73f511f287ae0a3e4294Chih-Chung Chang        // No bars if we are showing camera preview.
68456bdcb7272f222fde5e4c6fc133cb490b31c7667Bobby Georgescu        if (mAppBridge != null && mCurrentIndex == 0
68556bdcb7272f222fde5e4c6fc133cb490b31c7667Bobby Georgescu                && !mPhotoView.getFilmMode()) return false;
68656bdcb7272f222fde5e4c6fc133cb490b31c7667Bobby Georgescu
687aeb3062e84ed28f0e25a73f511f287ae0a3e4294Chih-Chung Chang        // No bars if it's not allowed.
688aeb3062e84ed28f0e25a73f511f287ae0a3e4294Chih-Chung Chang        if (!mActionBarAllowed) return false;
689aeb3062e84ed28f0e25a73f511f287ae0a3e4294Chih-Chung Chang
690aeb3062e84ed28f0e25a73f511f287ae0a3e4294Chih-Chung Chang        return true;
691aeb3062e84ed28f0e25a73f511f287ae0a3e4294Chih-Chung Chang    }
692aeb3062e84ed28f0e25a73f511f287ae0a3e4294Chih-Chung Chang
693e6251df06f0b3c8f556043f8b725b4b19be7474dChih-Chung Chang    private void wantBars() {
694e6251df06f0b3c8f556043f8b725b4b19be7474dChih-Chung Chang        if (canShowBars()) showBars();
695e6251df06f0b3c8f556043f8b725b4b19be7474dChih-Chung Chang    }
696e6251df06f0b3c8f556043f8b725b4b19be7474dChih-Chung Chang
69761f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang    private void toggleBars() {
698f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        if (mShowBars) {
699f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            hideBars();
700aeb3062e84ed28f0e25a73f511f287ae0a3e4294Chih-Chung Chang        } else {
701e6251df06f0b3c8f556043f8b725b4b19be7474dChih-Chung Chang            if (canShowBars()) showBars();
702f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
703f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
704f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
70561f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang    private void updateBars() {
706e6251df06f0b3c8f556043f8b725b4b19be7474dChih-Chung Chang        if (!canShowBars()) {
70761f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang            hideBars();
70861f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang        }
709f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
710f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
711f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    @Override
7122ef46ed28b28b355d7f3f1432c7b1196b832a859Chih-Chung Chang    public void onOrientationCompensationChanged() {
7132ef46ed28b28b355d7f3f1432c7b1196b832a859Chih-Chung Chang        mActivity.getGLRoot().requestLayoutContentPane();
714bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    }
715bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang
716bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    @Override
717f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    protected void onBackPressed() {
718f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        if (mShowDetails) {
719f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            hideDetails();
7203b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang        } else if (mAppBridge == null || !switchWithCaptureAnimation(-1)) {
721bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang            // We are leaving this page. Set the result now.
722bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang            setResult();
7237eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu            if (mStartInFilmstrip && !mPhotoView.getFilmMode()) {
7247eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu                mPhotoView.setFilmMode(true);
7257eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu            } else if (mTreatBackAsUp) {
72654fe6202b6f7d233e7645c121321fe0f3d20fc8bYuli Huang                onUpPressed();
72754fe6202b6f7d233e7645c121321fe0f3d20fc8bYuli Huang            } else {
72854fe6202b6f7d233e7645c121321fe0f3d20fc8bYuli Huang                super.onBackPressed();
72954fe6202b6f7d233e7645c121321fe0f3d20fc8bYuli Huang            }
730f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
731f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
732f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
733b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang    private void onUpPressed() {
734833f775afc9515567dc5aaf0cafe20e006e77545Bobby Georgescu        if ((mStartInFilmstrip || mAppBridge != null)
735833f775afc9515567dc5aaf0cafe20e006e77545Bobby Georgescu                && !mPhotoView.getFilmMode()) {
7367eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu            mPhotoView.setFilmMode(true);
7377eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu            return;
7387eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu        }
7397eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu
740b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang        if (mActivity.getStateManager().getStateCount() > 1) {
7417eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu            setResult();
742b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang            super.onBackPressed();
743ba12eae90b5b1a80ee002aa0df8c5c5189c4faa3Chih-Chung Chang            return;
74466ca848b2f58b813d366642088d274a1b7c4a90cChih-Chung Chang        }
74566ca848b2f58b813d366642088d274a1b7c4a90cChih-Chung Chang
74666ca848b2f58b813d366642088d274a1b7c4a90cChih-Chung Chang        if (mOriginalSetPathString == null) return;
74766ca848b2f58b813d366642088d274a1b7c4a90cChih-Chung Chang
74866ca848b2f58b813d366642088d274a1b7c4a90cChih-Chung Chang        if (mAppBridge == null) {
749b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang            // We're in view mode so set up the stacks on our own.
750b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang            Bundle data = new Bundle(getData());
751b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang            data.putString(AlbumPage.KEY_MEDIA_PATH, mOriginalSetPathString);
752b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang            data.putString(AlbumPage.KEY_PARENT_MEDIA_PATH,
753b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang                    mActivity.getDataManager().getTopSetPath(
754b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang                            DataManager.INCLUDE_ALL));
755b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang            mActivity.getStateManager().switchState(this, AlbumPage.class, data);
75666ca848b2f58b813d366642088d274a1b7c4a90cChih-Chung Chang        } else {
757833f775afc9515567dc5aaf0cafe20e006e77545Bobby Georgescu            GalleryUtils.startGalleryActivity(mActivity);
758b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang        }
759b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang    }
760b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang
761bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    private void setResult() {
762bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang        Intent result = null;
7637eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu        result = new Intent();
7647eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu        result.putExtra(KEY_RETURN_INDEX_HINT, mCurrentIndex);
765bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang        setStateResult(Activity.RESULT_OK, result);
766bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    }
767bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang
768bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    //////////////////////////////////////////////////////////////////////////
769bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    //  AppBridge.Server interface
770bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    //////////////////////////////////////////////////////////////////////////
771bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang
772bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    @Override
7732ef46ed28b28b355d7f3f1432c7b1196b832a859Chih-Chung Chang    public void setCameraRelativeFrame(Rect frame) {
7742ef46ed28b28b355d7f3f1432c7b1196b832a859Chih-Chung Chang        mPhotoView.setCameraRelativeFrame(frame);
775bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    }
776bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang
777bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    @Override
7782c6173822a612597c79be41b126367ddfbb5d518Chih-Chung Chang    public boolean switchWithCaptureAnimation(int offset) {
7792c6173822a612597c79be41b126367ddfbb5d518Chih-Chung Chang        return mPhotoView.switchWithCaptureAnimation(offset);
7802c6173822a612597c79be41b126367ddfbb5d518Chih-Chung Chang    }
7812c6173822a612597c79be41b126367ddfbb5d518Chih-Chung Chang
782f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    @Override
7836575794a9c09f22d5721e212c093e0a2df376d0cChih-Chung Chang    public void setSwipingEnabled(boolean enabled) {
7846575794a9c09f22d5721e212c093e0a2df376d0cChih-Chung Chang        mPhotoView.setSwipingEnabled(enabled);
7856575794a9c09f22d5721e212c093e0a2df376d0cChih-Chung Chang    }
7866575794a9c09f22d5721e212c093e0a2df376d0cChih-Chung Chang
7876575794a9c09f22d5721e212c093e0a2df376d0cChih-Chung Chang    @Override
7883b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang    public void notifyScreenNailChanged() {
7893b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang        mScreenNailItem.setScreenNail(mAppBridge.attachScreenNail());
7903b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang        mScreenNailSet.notifyChange();
7913b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang    }
7923b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang
7933b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang    @Override
794a0ce682e40c39ce046c48d8a7f989fff01bb9f2cWu-cheng Li    public void addSecureAlbumItem(boolean isVideo, int id) {
795a0ce682e40c39ce046c48d8a7f989fff01bb9f2cWu-cheng Li        mSecureAlbum.addMediaItem(isVideo, id);
796a0ce682e40c39ce046c48d8a7f989fff01bb9f2cWu-cheng Li    }
797a0ce682e40c39ce046c48d8a7f989fff01bb9f2cWu-cheng Li
798a0ce682e40c39ce046c48d8a7f989fff01bb9f2cWu-cheng Li    @Override
799f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    protected boolean onCreateActionBar(Menu menu) {
800b21b8e58a604f6c701245d84b141b5b87663192bOwen Lin        mActionBar.createActionBarMenu(R.menu.photo, menu);
8018fe22ecb8e744a09a2e0d867f876ecbf74c82298John Reck        mHaveImageEditor = GalleryUtils.isEditorAvailable(mActivity, "image/*");
802f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        updateMenuOperations();
803ed46d77c16cd80357f4a0feada2435dfba8104a6Yuli Huang        updateTitle();
804b21b8e58a604f6c701245d84b141b5b87663192bOwen Lin        return true;
805f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
806f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
807d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin    private MenuExecutor.ProgressListener mConfirmDialogListener =
808d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin            new MenuExecutor.ProgressListener() {
809d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin        @Override
810d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin        public void onProgressUpdate(int index) {}
811d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin
812d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin        @Override
813d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin        public void onProgressComplete(int result) {}
814d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin
815d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin        @Override
816d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin        public void onConfirmDialogShown() {
817d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin            mHandler.removeMessages(MSG_HIDE_BARS);
818d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin        }
819d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin
820d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin        @Override
821d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin        public void onConfirmDialogDismissed(boolean confirmed) {
822d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin            refreshHidingMessage();
823d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin        }
824ba50b9420e64731fd5aa8b1410e1f36457a1635aBobby Georgescu
825ba50b9420e64731fd5aa8b1410e1f36457a1635aBobby Georgescu        @Override
826ba50b9420e64731fd5aa8b1410e1f36457a1635aBobby Georgescu        public void onProgressStart() {}
827d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin    };
828d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin
829f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    @Override
830f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    protected boolean onItemSelected(MenuItem item) {
831d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu        if (mModel == null) return true;
832d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin        refreshHidingMessage();
833616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin        MediaItem current = mModel.getMediaItem(0);
834f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
835f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        if (current == null) {
836f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            // item is not ready, ignore
837f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            return true;
838f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
839f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
840f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        int currentIndex = mModel.getCurrentIndex();
841f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        Path path = current.getPath();
842f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
843f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        DataManager manager = mActivity.getDataManager();
844f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        int action = item.getItemId();
8459a033b07b8e0d9fe7419b7a0d876e9c7febf43c8Ray Chen        String confirmMsg = null;
846f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        switch (action) {
84784c220f10a643927c8a2126de8a755d8d7f7ec9eRay Chen            case android.R.id.home: {
848b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang                onUpPressed();
84984c220f10a643927c8a2126de8a755d8d7f7ec9eRay Chen                return true;
85084c220f10a643927c8a2126de8a755d8d7f7ec9eRay Chen            }
8517eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu            case R.id.action_grid: {
8527eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu                if (mStartedFromAlbumPage) {
8537eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu                    onUpPressed();
8547eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu                } else {
8557eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu                    preparePhotoFallbackView();
8567eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu                    Bundle data = new Bundle(getData());
8577eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu                    data.putString(AlbumPage.KEY_MEDIA_PATH, mOriginalSetPathString);
8587eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu                    data.putString(AlbumPage.KEY_PARENT_MEDIA_PATH,
8597eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu                            mActivity.getDataManager().getTopSetPath(
8607eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu                                    DataManager.INCLUDE_ALL));
86100ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu
862e06c9f109f06813ca1f8a0abb549d51aefd4973dBobby Georgescu                    // We only show cluster menu in the first AlbumPage in stack
86300ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu                    // TODO: Enable this when running from the camera app
864e06c9f109f06813ca1f8a0abb549d51aefd4973dBobby Georgescu                    boolean inAlbum = mActivity.getStateManager().hasStateClass(AlbumPage.class);
86500ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu                    data.putBoolean(AlbumPage.KEY_SHOW_CLUSTER_MENU, !inAlbum
86600ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu                            && mAppBridge == null);
86700ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu
86800ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu                    data.putBoolean(PhotoPage.KEY_APP_BRIDGE, mAppBridge != null);
86900ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu
87000ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu                    // Account for live preview being first item
87100ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu                    mActivity.getTransitionStore().put(KEY_RETURN_INDEX_HINT,
87200ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu                            mAppBridge != null ? mCurrentIndex - 1 : mCurrentIndex);
87300ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu
8747eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu                    mActivity.getStateManager().startState(AlbumPage.class, data);
8757eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu                }
8767eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu                return true;
8777eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu            }
878f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            case R.id.action_slideshow: {
879f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                Bundle data = new Bundle();
8806cf807453fb58ccd4cc513ff187b306c7090e67cOwen Lin                data.putString(SlideshowPage.KEY_SET_PATH, mMediaSet.getPath().toString());
881604f053d040782159b61d3b74ee533bc2c0ccdd0Ray Chen                data.putString(SlideshowPage.KEY_ITEM_PATH, path.toString());
882f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                data.putInt(SlideshowPage.KEY_PHOTO_INDEX, currentIndex);
883f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                data.putBoolean(SlideshowPage.KEY_REPEAT, true);
884f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                mActivity.getStateManager().startStateForResult(
885f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                        SlideshowPage.class, REQUEST_SLIDESHOW, data);
886f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                return true;
887f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            }
888f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            case R.id.action_crop: {
889898a2f4540635528a0916b0a6b0a177869854ae9Wu-cheng Li                Activity activity = mActivity;
890f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                Intent intent = new Intent(CropImage.CROP_ACTION);
891f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                intent.setClass(activity, CropImage.class);
892f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                intent.setData(manager.getContentUri(path));
893f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                activity.startActivityForResult(intent, PicasaSource.isPicasaImage(current)
894f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                        ? REQUEST_CROP_PICASA
895f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                        : REQUEST_CROP);
896f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                return true;
897f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            }
89850ea2d2938218ac6b2039f0e42998cfbbc45d1f1Teng-Hui Zhu            case R.id.action_trim: {
8993f1f1baf3a674927e25cd5cd885fb372796bd3a0Teng-Hui Zhu                Intent intent = new Intent(mActivity, TrimVideo.class);
9003f1f1baf3a674927e25cd5cd885fb372796bd3a0Teng-Hui Zhu                intent.setData(manager.getContentUri(path));
90115ff1b1ca52bea348b8a490b5b5abe53fa43eaf2Teng-Hui Zhu                // We need the file path to wrap this into a RandomAccessFile.
90215ff1b1ca52bea348b8a490b5b5abe53fa43eaf2Teng-Hui Zhu                intent.putExtra(KEY_MEDIA_ITEM_PATH, current.getFilePath());
9033f1f1baf3a674927e25cd5cd885fb372796bd3a0Teng-Hui Zhu                mActivity.startActivityForResult(intent, REQUEST_TRIM);
90450ea2d2938218ac6b2039f0e42998cfbbc45d1f1Teng-Hui Zhu                return true;
90550ea2d2938218ac6b2039f0e42998cfbbc45d1f1Teng-Hui Zhu            }
906f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang            case R.id.action_edit: {
907a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu                launchPhotoEditor();
908f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang                return true;
909f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang            }
910f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            case R.id.action_details: {
911f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                if (mShowDetails) {
912f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                    hideDetails();
913f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                } else {
914995c4566bed7df1aa48ba7e1351f964efa73880bMichael Kolb                    showDetails();
915f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                }
916f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                return true;
917f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            }
91867098d1a72fd04e2af06d3a5939cde28c65f70d9Ray Chen            case R.id.action_delete:
9199a033b07b8e0d9fe7419b7a0d876e9c7febf43c8Ray Chen                confirmMsg = mActivity.getResources().getQuantityString(
9209a033b07b8e0d9fe7419b7a0d876e9c7febf43c8Ray Chen                        R.plurals.delete_selection, 1);
921f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            case R.id.action_setas:
922f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            case R.id.action_rotate_ccw:
923f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            case R.id.action_rotate_cw:
924f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            case R.id.action_show_on_map:
925f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                mSelectionManager.deSelectAll();
926f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                mSelectionManager.toggle(path);
927d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin                mMenuExecutor.onMenuClicked(item, confirmMsg, mConfirmDialogListener);
928f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                return true;
929f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            case R.id.action_import:
930f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                mSelectionManager.deSelectAll();
931f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                mSelectionManager.toggle(path);
9329a033b07b8e0d9fe7419b7a0d876e9c7febf43c8Ray Chen                mMenuExecutor.onMenuClicked(item, confirmMsg,
933f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                        new ImportCompleteListener(mActivity));
934f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                return true;
935fb5571987f2555b04731b6f3e1c479efc16d542aWu-cheng Li            case R.id.action_share:
936898a2f4540635528a0916b0a6b0a177869854ae9Wu-cheng Li                Activity activity = mActivity;
937fb5571987f2555b04731b6f3e1c479efc16d542aWu-cheng Li                Intent intent = createShareIntent(mCurrentPhoto.getPath());
938fb5571987f2555b04731b6f3e1c479efc16d542aWu-cheng Li                activity.startActivity(Intent.createChooser(intent,
939fb5571987f2555b04731b6f3e1c479efc16d542aWu-cheng Li                        activity.getString(R.string.share)));
940fb5571987f2555b04731b6f3e1c479efc16d542aWu-cheng Li                return true;
941f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            default :
942f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                return false;
943f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
944f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
945f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
946f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private void hideDetails() {
947f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mShowDetails = false;
9484105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen        mDetailsHelper.hide();
949f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
950f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
951995c4566bed7df1aa48ba7e1351f964efa73880bMichael Kolb    private void showDetails() {
952f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mShowDetails = true;
9534105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen        if (mDetailsHelper == null) {
9544105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen            mDetailsHelper = new DetailsHelper(mActivity, mRootPane, new MyDetailsSource());
9554105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen            mDetailsHelper.setCloseListener(new CloseListener() {
95606c6401eededc2ec842ba4994a838c2ded0a666cPin Ting                @Override
957f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                public void onClose() {
958f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                    hideDetails();
959f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                }
960f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            });
961f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
9624105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen        mDetailsHelper.show();
963f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
964f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
965bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    ////////////////////////////////////////////////////////////////////////////
966bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    //  Callbacks from PhotoView
967bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    ////////////////////////////////////////////////////////////////////////////
968bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    @Override
969f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public void onSingleTapUp(int x, int y) {
970bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang        if (mAppBridge != null) {
971bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang            if (mAppBridge.onSingleTapUp(x, y)) return;
972014d9586d8145a33f4e99eaad570587f6d650026Wu-cheng Li        }
973014d9586d8145a33f4e99eaad570587f6d650026Wu-cheng Li
974616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin        MediaItem item = mModel.getMediaItem(0);
975b5dc542fbaeaf99bebdcf775ef0e034e89e88eaeWu-cheng Li        if (item == null || item == mScreenNailItem) {
976b5dc542fbaeaf99bebdcf775ef0e034e89e88eaeWu-cheng Li            // item is not ready or it is camera preview, ignore
977f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            return;
978f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
979f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
9808868aa1b2d199e7fa869c9c5fad3079175621002Wu-cheng Li        int supported = item.getSupportedOperations();
981898a2f4540635528a0916b0a6b0a177869854ae9Wu-cheng Li        boolean playVideo = (mSecureAlbum == null) &&
9828868aa1b2d199e7fa869c9c5fad3079175621002Wu-cheng Li                ((supported & MediaItem.SUPPORT_PLAY) != 0);
983bef18c1e167f5835c8f854e76a91da63b700f93bWu-cheng Li        boolean viewPanorama = (mSecureAlbum == null) &&
9848868aa1b2d199e7fa869c9c5fad3079175621002Wu-cheng Li                ((supported & MediaItem.SUPPORT_PANORAMA) != 0);
9858868aa1b2d199e7fa869c9c5fad3079175621002Wu-cheng Li        boolean unlock = ((supported & MediaItem.SUPPORT_UNLOCK) != 0);
986c7e3c76d6965f520a9651d309052c5f01726cd58Bobby Georgescu        boolean goBack = ((supported & MediaItem.SUPPORT_BACK) != 0);
987f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
988f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        if (playVideo) {
989f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            // determine if the point is at center (1/6) of the photo view.
990f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            // (The position of the "play" icon is at center (1/6) of the photo)
991f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            int w = mPhotoView.getWidth();
992f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            int h = mPhotoView.getHeight();
993f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            playVideo = (Math.abs(x - w / 2) * 12 <= w)
994f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                && (Math.abs(y - h / 2) * 12 <= h);
995f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
996f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
997f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        if (playVideo) {
998898a2f4540635528a0916b0a6b0a177869854ae9Wu-cheng Li            playVideo(mActivity, item.getPlayUri(), item.getName());
99983be4e0c9b8e3372eff8f9b1a396afd961b72921Angus Kong        } else if (viewPanorama) {
1000f8a39c644637a15b9291eb9299762b8cf91cd76aGeorge Mount            LightCycleHelper.viewPanorama(mActivity, item.getContentUri());
1001c7e3c76d6965f520a9651d309052c5f01726cd58Bobby Georgescu        } else if (goBack) {
1002c7e3c76d6965f520a9651d309052c5f01726cd58Bobby Georgescu            onBackPressed();
10038868aa1b2d199e7fa869c9c5fad3079175621002Wu-cheng Li        } else if (unlock) {
10048868aa1b2d199e7fa869c9c5fad3079175621002Wu-cheng Li            mActivity.getStateManager().finishState(this);
1005f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        } else {
100661f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang            toggleBars();
1007f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
1008f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
1009f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
1010bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    @Override
1011bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    public void lockOrientation() {
1012bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang        mHandler.sendEmptyMessage(MSG_LOCK_ORIENTATION);
1013bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    }
1014bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang
1015bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    @Override
1016bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    public void unlockOrientation() {
101706c6401eededc2ec842ba4994a838c2ded0a666cPin Ting        mHandler.sendEmptyMessage(MSG_UNLOCK_ORIENTATION);
1018bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    }
1019bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang
1020bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    @Override
102161f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang    public void onActionBarAllowed(boolean allowed) {
102261f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang        mActionBarAllowed = allowed;
102361f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang        mHandler.sendEmptyMessage(MSG_UPDATE_ACTION_BAR);
102461f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang    }
102561f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang
102661f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang    @Override
1027e6251df06f0b3c8f556043f8b725b4b19be7474dChih-Chung Chang    public void onActionBarWanted() {
1028e6251df06f0b3c8f556043f8b725b4b19be7474dChih-Chung Chang        mHandler.sendEmptyMessage(MSG_WANT_BARS);
1029e6251df06f0b3c8f556043f8b725b4b19be7474dChih-Chung Chang    }
1030e6251df06f0b3c8f556043f8b725b4b19be7474dChih-Chung Chang
1031e6251df06f0b3c8f556043f8b725b4b19be7474dChih-Chung Chang    @Override
1032bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    public void onFullScreenChanged(boolean full) {
1033bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang        Message m = mHandler.obtainMessage(
1034bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang                MSG_ON_FULL_SCREEN_CHANGED, full ? 1 : 0, 0);
1035bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang        m.sendToTarget();
1036bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    }
1037bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang
10386b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang    // How we do delete/undo:
10396b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang    //
10406b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang    // When the user choose to delete a media item, we just tell the
10416b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang    // FilterDeleteSet to hide that item. If the user choose to undo it, we
10426b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang    // again tell FilterDeleteSet not to hide it. If the user choose to commit
10436b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang    // the deletion, we then actually delete the media item.
10446b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang    @Override
10456b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang    public void onDeleteImage(Path path, int offset) {
10466118af9ddad8acc050133154f8f60c842c7f9bfaChih-Chung Chang        onCommitDeleteImage();  // commit the previous deletion
10476b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang        mDeletePath = path;
10486b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang        mDeleteIsFocus = (offset == 0);
10496118af9ddad8acc050133154f8f60c842c7f9bfaChih-Chung Chang        mMediaSet.addDeletion(path, mCurrentIndex + offset);
10506b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang    }
10516b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang
10526b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang    @Override
10536b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang    public void onUndoDeleteImage() {
10546118af9ddad8acc050133154f8f60c842c7f9bfaChih-Chung Chang        if (mDeletePath == null) return;
10556b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang        // If the deletion was done on the focused item, we want the model to
10566b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang        // focus on it when it is undeleted.
10576b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang        if (mDeleteIsFocus) mModel.setFocusHintPath(mDeletePath);
10586118af9ddad8acc050133154f8f60c842c7f9bfaChih-Chung Chang        mMediaSet.removeDeletion(mDeletePath);
10596b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang        mDeletePath = null;
10606b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang    }
10616b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang
10626b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang    @Override
10636b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang    public void onCommitDeleteImage() {
10646b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang        if (mDeletePath == null) return;
10656b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang        mSelectionManager.deSelectAll();
10666b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang        mSelectionManager.toggle(mDeletePath);
10676b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang        mMenuExecutor.onMenuClicked(R.id.action_delete, null, true, false);
10686b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang        mDeletePath = null;
10696b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang    }
10706b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang
1071f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public static void playVideo(Activity activity, Uri uri, String title) {
1072f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        try {
1073f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            Intent intent = new Intent(Intent.ACTION_VIEW)
1074a3871050845b4921379add2b126add3cfbab1109Ray Chen                    .setDataAndType(uri, "video/*")
1075a3871050845b4921379add2b126add3cfbab1109Ray Chen                    .putExtra(Intent.EXTRA_TITLE, title)
1076a3871050845b4921379add2b126add3cfbab1109Ray Chen                    .putExtra(MovieActivity.KEY_TREAT_UP_AS_BACK, true);
107771cd89a38752bc22ae0ec2df965e4280b776623cChih-Chung Chang            activity.startActivityForResult(intent, REQUEST_PLAY_VIDEO);
1078f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        } catch (ActivityNotFoundException e) {
1079f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            Toast.makeText(activity, activity.getString(R.string.video_err),
1080f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                    Toast.LENGTH_SHORT).show();
1081f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
1082f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
1083f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
1084f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang    private void setCurrentPhotoByIntent(Intent intent) {
1085f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang        if (intent == null) return;
1086f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang        Path path = mApplication.getDataManager()
1087f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang                .findPathByUri(intent.getData(), intent.getType());
1088f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang        if (path != null) {
1089f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang            mModel.setCurrentPhoto(path, mCurrentIndex);
1090f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang        }
1091f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang    }
1092f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang
1093f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    @Override
1094f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    protected void onStateResult(int requestCode, int resultCode, Intent data) {
109571cd89a38752bc22ae0ec2df965e4280b776623cChih-Chung Chang        mHasActivityResult = true;
1096f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        switch (requestCode) {
1097f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang            case REQUEST_EDIT:
1098f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang                setCurrentPhotoByIntent(data);
1099f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang                break;
1100f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            case REQUEST_CROP:
1101f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                if (resultCode == Activity.RESULT_OK) {
1102f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang                    setCurrentPhotoByIntent(data);
1103f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                }
1104f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                break;
1105f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            case REQUEST_CROP_PICASA: {
1106f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang                if (resultCode == Activity.RESULT_OK) {
1107f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang                    Context context = mActivity.getAndroidContext();
110888cc2ca5f5596762a5546ec7426756f2036be455Yuli Huang                    String message = context.getString(R.string.crop_saved,
1109f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang                            context.getString(R.string.folder_download));
1110f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang                    Toast.makeText(context, message, Toast.LENGTH_SHORT).show();
1111f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang                }
1112f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                break;
1113f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            }
1114f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            case REQUEST_SLIDESHOW: {
1115f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                if (data == null) break;
1116f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                String path = data.getStringExtra(SlideshowPage.KEY_ITEM_PATH);
1117f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                int index = data.getIntExtra(SlideshowPage.KEY_PHOTO_INDEX, 0);
1118f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                if (path != null) {
1119f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                    mModel.setCurrentPhoto(Path.fromString(path), index);
1120f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                }
1121f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            }
1122f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
1123f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
1124f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
112514d3289b4867c21da93ec4032119c0091bc78c30George Mount    @Override
112614d3289b4867c21da93ec4032119c0091bc78c30George Mount    protected void clearStateResult() {
112714d3289b4867c21da93ec4032119c0091bc78c30George Mount        mHasActivityResult = false;
112814d3289b4867c21da93ec4032119c0091bc78c30George Mount    }
112914d3289b4867c21da93ec4032119c0091bc78c30George Mount
1130616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin    private class PreparePhotoFallback implements OnGLIdleListener {
1131616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin        private PhotoFallbackEffect mPhotoFallback = new PhotoFallbackEffect();
1132616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin        private boolean mResultReady = false;
1133616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin
1134616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin        public synchronized PhotoFallbackEffect get() {
1135616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin            while (!mResultReady) {
1136616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin                Utils.waitWithoutInterrupt(this);
1137616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin            }
1138616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin            return mPhotoFallback;
1139616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin        }
1140616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin
1141616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin        @Override
1142616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin        public boolean onGLIdle(GLCanvas canvas, boolean renderRequested) {
1143616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin            mPhotoFallback = mPhotoView.buildFallbackEffect(mRootPane, canvas);
1144616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin            synchronized (this) {
1145616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin                mResultReady = true;
1146616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin                notifyAll();
1147616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin            }
1148616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin            return false;
1149616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin        }
1150616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin    }
1151616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin
1152616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin    private void preparePhotoFallbackView() {
1153616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin        GLRoot root = mActivity.getGLRoot();
1154616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin        PreparePhotoFallback task = new PreparePhotoFallback();
1155616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin        root.unlockRenderThread();
1156616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin        PhotoFallbackEffect anim;
1157616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin        try {
1158616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin            root.addOnGLIdleListener(task);
1159616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin            anim = task.get();
1160616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin        } finally {
1161616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin            root.lockRenderThread();
1162616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin        }
1163616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin        mActivity.getTransitionStore().put(
1164616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin                AlbumPage.KEY_RESUME_ANIMATION, anim);
1165616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin    }
1166616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin
1167f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    @Override
1168f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public void onPause() {
1169d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin        super.onPause();
1170d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin        mIsActive = false;
1171d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin
1172bd7c016d728853d38f98a3c6077b7bd9b08858b9Yuli Huang        mActivity.getGLRoot().unfreeze();
1173bd7c016d728853d38f98a3c6077b7bd9b08858b9Yuli Huang        mHandler.removeMessages(MSG_UNFREEZE_GLROOT);
1174253c5aec7692afdd7880fbd169d4b44d5679cbc0Chih-Chung Chang
11754105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen        DetailsHelper.pause();
1176d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu        if (mModel != null) {
1177d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu            if (isFinishing()) preparePhotoFallbackView();
1178d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu            mModel.pause();
1179d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu        }
1180f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mPhotoView.pause();
1181f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mHandler.removeMessages(MSG_HIDE_BARS);
1182f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mActionBar.removeOnMenuVisibilityListener(mMenuVisibilityListener);
118333ef03776b7734717b16f6fc861b831fb1b1dfacMartijn Coenen
11846b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang        onCommitDeleteImage();
11852785956f8f5654966a41e20f482f4af3057eea3fChih-Chung Chang        mMenuExecutor.pause();
11866118af9ddad8acc050133154f8f60c842c7f9bfaChih-Chung Chang        if (mMediaSet != null) mMediaSet.clearDeletion();
1187f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
1188f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
1189f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    @Override
1190bd7c016d728853d38f98a3c6077b7bd9b08858b9Yuli Huang    public void onCurrentImageUpdated() {
1191bd7c016d728853d38f98a3c6077b7bd9b08858b9Yuli Huang        mActivity.getGLRoot().unfreeze();
1192bd7c016d728853d38f98a3c6077b7bd9b08858b9Yuli Huang    }
1193bd7c016d728853d38f98a3c6077b7bd9b08858b9Yuli Huang
11947eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu    private void setGridButtonVisibility(boolean enabled) {
11957eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu        Menu menu = mActionBar.getMenu();
11967eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu        if (menu == null) return;
11977eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu        MenuItem item = menu.findItem(R.id.action_grid);
1198fc3651d38708c6475b808b6fad27ee66bdd6ee04Wu-cheng Li        if (item != null) item.setVisible((mSecureAlbum == null) && enabled);
11997eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu    }
12007eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu
12017eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu    public void onFilmModeChanged(boolean enabled) {
12027eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu        mHandler.sendEmptyMessage(MSG_REFRESH_GRID_BUTTON);
1203f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu        mHandler.sendEmptyMessage(MSG_REFRESH_BOTTOM_CONTROLS);
12047eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu        if (enabled) {
12057eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu            mHandler.removeMessages(MSG_HIDE_BARS);
12067eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu        } else {
12077eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu            refreshHidingMessage();
12087eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu        }
12097eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu    }
12107eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu
12117eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu    private void transitionFromAlbumPageIfNeeded() {
12127eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu        TransitionStore transitions = mActivity.getTransitionStore();
12137eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu
12147eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu        int albumPageTransition = transitions.get(
12157eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu                KEY_ALBUMPAGE_TRANSITION, MSG_ALBUMPAGE_NONE);
12167eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu
121700ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu        if (albumPageTransition == MSG_ALBUMPAGE_NONE && mAppBridge != null) {
121800ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu            // Generally, resuming the PhotoPage when in Camera should
121900ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu            // reset to the capture mode to allow quick photo taking
122000ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu            mCurrentIndex = 0;
122100ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu            mPhotoView.resetToFirstPicture();
122200ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu        } else {
122300ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu            int resumeIndex = transitions.get(KEY_INDEX_HINT, -1);
122400ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu            if (resumeIndex >= 0) {
122500ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu                if (mAppBridge != null) {
122600ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu                    // Account for live preview being the first item
122700ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu                    resumeIndex++;
122800ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu                }
122900ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu                if (resumeIndex < mMediaSet.getMediaItemCount()) {
123000ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu                    mCurrentIndex = resumeIndex;
123100ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu                    mModel.moveTo(mCurrentIndex);
123200ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu                }
123300ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu            }
123400ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu        }
123500ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu
123600ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu        if (albumPageTransition == MSG_ALBUMPAGE_RESUMED) {
123700ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu            mPhotoView.setFilmMode(mStartInFilmstrip || mAppBridge != null);
123800ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu        } else if (albumPageTransition == MSG_ALBUMPAGE_PICKED) {
123900ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu            mPhotoView.setFilmMode(false);
12407eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu        }
12417eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu
124251bc561e85053abfd7fda695e3cd20710acca85cBobby Georgescu        mFadeOutTexture = transitions.get(PreparePageFadeoutTexture.KEY_FADE_TEXTURE);
12437eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu        if (mFadeOutTexture != null) {
12447eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu            mBackgroundFade.start();
12457eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu            BitmapScreenNail.disableDrawPlaceholder();
12467eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu            mOpenAnimationRect =
12477eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu                    albumPageTransition == MSG_ALBUMPAGE_NONE ?
12487eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu                    (Rect) mData.getParcelable(KEY_OPEN_ANIMATION_RECT) :
12497eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu                    (Rect) transitions.get(KEY_OPEN_ANIMATION_RECT);
12507eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu            mPhotoView.setOpenAnimationRect(mOpenAnimationRect);
12517eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu            mBackgroundFade.start();
12527eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu        }
12537eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu    }
12547eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu
1255bd7c016d728853d38f98a3c6077b7bd9b08858b9Yuli Huang    @Override
1256f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    protected void onResume() {
1257f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        super.onResume();
12587eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu
1259d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu        if (mModel == null) {
1260d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu            mActivity.getStateManager().finishState(this);
1261d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu            return;
1262d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu        }
12637eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu        transitionFromAlbumPageIfNeeded();
12647eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu
1265d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin        mActivity.getGLRoot().freeze();
1266f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mIsActive = true;
1267f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        setContentPane(mRootPane);
126804ac045bf8da5082bbb0bdc9ea5f9c9b5b796ad0Yuli Huang
1269f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mModel.resume();
1270f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mPhotoView.resume();
1271898a2f4540635528a0916b0a6b0a177869854ae9Wu-cheng Li        mActionBar.setDisplayOptions(
1272898a2f4540635528a0916b0a6b0a177869854ae9Wu-cheng Li                ((mSecureAlbum == null) && (mSetPathString != null)), true);
1273f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mActionBar.addOnMenuVisibilityListener(mMenuVisibilityListener);
127400ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu        if (!mShowBars) {
127500ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu            mActionBar.hide();
127600ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu            mActivity.getGLRoot().setLightsOutMode(true);
1277bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang        }
12788fe22ecb8e744a09a2e0d867f876ecbf74c82298John Reck        boolean haveImageEditor = GalleryUtils.isEditorAvailable(mActivity, "image/*");
12798fe22ecb8e744a09a2e0d867f876ecbf74c82298John Reck        if (haveImageEditor != mHaveImageEditor) {
12808fe22ecb8e744a09a2e0d867f876ecbf74c82298John Reck            mHaveImageEditor = haveImageEditor;
12818fe22ecb8e744a09a2e0d867f876ecbf74c82298John Reck            updateMenuOperations();
12828fe22ecb8e744a09a2e0d867f876ecbf74c82298John Reck        }
128300ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu
128471cd89a38752bc22ae0ec2df965e4280b776623cChih-Chung Chang        mHasActivityResult = false;
1285bd7c016d728853d38f98a3c6077b7bd9b08858b9Yuli Huang        mHandler.sendEmptyMessageDelayed(MSG_UNFREEZE_GLROOT, UNFREEZE_GLROOT_TIMEOUT);
1286f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
1287f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
128815b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang    @Override
128915b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang    protected void onDestroy() {
1290bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang        if (mAppBridge != null) {
1291253c5aec7692afdd7880fbd169d4b44d5679cbc0Chih-Chung Chang            mAppBridge.setServer(null);
12923b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang            mScreenNailItem.setScreenNail(null);
1293bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang            mAppBridge.detachScreenNail();
1294bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang            mAppBridge = null;
12953b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang            mScreenNailSet = null;
12963b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang            mScreenNailItem = null;
1297b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang        }
1298bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang        mOrientationManager.removeListener(this);
12992ef46ed28b28b355d7f3f1432c7b1196b832a859Chih-Chung Chang        mActivity.getGLRoot().setOrientationSource(null);
1300f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu        if (mBottomControls != null) mBottomControls.cleanup();
1301aeb3062e84ed28f0e25a73f511f287ae0a3e4294Chih-Chung Chang
1302aeb3062e84ed28f0e25a73f511f287ae0a3e4294Chih-Chung Chang        // Remove all pending messages.
1303aeb3062e84ed28f0e25a73f511f287ae0a3e4294Chih-Chung Chang        mHandler.removeCallbacksAndMessages(null);
130415b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang        super.onDestroy();
130515b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang    }
130615b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang
1307f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private class MyDetailsSource implements DetailsSource {
13086cf807453fb58ccd4cc513ff187b306c7090e67cOwen Lin
13096cf807453fb58ccd4cc513ff187b306c7090e67cOwen Lin        @Override
1310f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        public MediaDetails getDetails() {
1311616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin            return mModel.getMediaItem(0).getDetails();
1312f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
13136cf807453fb58ccd4cc513ff187b306c7090e67cOwen Lin
13146cf807453fb58ccd4cc513ff187b306c7090e67cOwen Lin        @Override
1315f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        public int size() {
1316f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            return mMediaSet != null ? mMediaSet.getMediaItemCount() : 1;
1317f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
13186cf807453fb58ccd4cc513ff187b306c7090e67cOwen Lin
13196cf807453fb58ccd4cc513ff187b306c7090e67cOwen Lin        @Override
1320995c4566bed7df1aa48ba7e1351f964efa73880bMichael Kolb        public int setIndex() {
1321995c4566bed7df1aa48ba7e1351f964efa73880bMichael Kolb            return mModel.getCurrentIndex();
13224105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen        }
1323f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
1324f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin}
1325