PhotoPage.java revision 833f775afc9515567dc5aaf0cafe20e006e77545
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;
2266ca848b2f58b813d366642088d274a1b7c4a90cChih-Chung Changimport android.content.ContentResolver;
23604f053d040782159b61d3b74ee533bc2c0ccdd0Ray Chenimport android.content.Context;
24604f053d040782159b61d3b74ee533bc2c0ccdd0Ray Chenimport android.content.Intent;
25a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescuimport android.content.pm.PackageManager;
2604ac045bf8da5082bbb0bdc9ea5f9c9b5b796ad0Yuli Huangimport android.graphics.Rect;
27604f053d040782159b61d3b74ee533bc2c0ccdd0Ray Chenimport android.net.Uri;
2833ef03776b7734717b16f6fc861b831fb1b1dfacMartijn Coenenimport android.nfc.NfcAdapter;
29ddf0225a5192a589fc578945f56440b09bf74d12John Reckimport android.nfc.NfcAdapter.CreateBeamUrisCallback;
30ddf0225a5192a589fc578945f56440b09bf74d12John Reckimport android.nfc.NfcEvent;
31604f053d040782159b61d3b74ee533bc2c0ccdd0Ray Chenimport android.os.Bundle;
32604f053d040782159b61d3b74ee533bc2c0ccdd0Ray Chenimport android.os.Handler;
33604f053d040782159b61d3b74ee533bc2c0ccdd0Ray Chenimport android.os.Message;
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;
7866ca848b2f58b813d366642088d274a1b7c4a90cChih-Chung Changimport com.android.gallery3d.util.MediaSetUtils;
79f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
80bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Changpublic class PhotoPage extends ActivityState implements
81f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu        PhotoView.Listener, OrientationManager.Listener, AppBridge.Server,
82f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu        PhotoPageBottomControls.Delegate {
83f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private static final String TAG = "PhotoPage";
84f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
85f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private static final int MSG_HIDE_BARS = 1;
86bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    private static final int MSG_LOCK_ORIENTATION = 2;
87bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    private static final int MSG_UNLOCK_ORIENTATION = 3;
88bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    private static final int MSG_ON_FULL_SCREEN_CHANGED = 4;
8961f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang    private static final int MSG_UPDATE_ACTION_BAR = 5;
90bd7c016d728853d38f98a3c6077b7bd9b08858b9Yuli Huang    private static final int MSG_UNFREEZE_GLROOT = 6;
91e6251df06f0b3c8f556043f8b725b4b19be7474dChih-Chung Chang    private static final int MSG_WANT_BARS = 7;
927eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu    private static final int MSG_REFRESH_GRID_BUTTON = 8;
93f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu    private static final int MSG_REFRESH_BOTTOM_CONTROLS = 9;
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;
144f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu    private PhotoPageBottomControls mBottomControls;
145f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private MediaItem mCurrentPhoto = null;
146f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private MenuExecutor mMenuExecutor;
147f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private boolean mIsActive;
14884c220f10a643927c8a2126de8a755d8d7f7ec9eRay Chen    private String mSetPathString;
149b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang    // This is the original mSetPathString before adding the camera preview item.
150b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang    private String mOriginalSetPathString;
151bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    private AppBridge mAppBridge;
1523b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang    private SnailItem mScreenNailItem;
1533b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang    private SnailAlbum mScreenNailSet;
154bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    private OrientationManager mOrientationManager;
15571cd89a38752bc22ae0ec2df965e4280b776623cChih-Chung Chang    private boolean mHasActivityResult;
15654fe6202b6f7d233e7645c121321fe0f3d20fc8bYuli Huang    private boolean mTreatBackAsUp;
1577eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu    private boolean mStartInFilmstrip;
1587eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu    private boolean mStartedFromAlbumPage;
15915b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang
160f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu    private RawTexture mFadeOutTexture;
161f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu    private Rect mOpenAnimationRect;
1627eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu    public static final int ANIM_TIME_OPENING = 300;
163f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu
1646b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang    // The item that is deleted (but it can still be undeleted before commiting)
1656b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang    private Path mDeletePath;
1666b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang    private boolean mDeleteIsFocus;  // whether the deleted item was in focus
1676b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang
168ddf0225a5192a589fc578945f56440b09bf74d12John Reck    private Uri[] mNfcPushUris = new Uri[1];
16933ef03776b7734717b16f6fc861b831fb1b1dfacMartijn Coenen
1702bb717f1ea38e2ce33dd102a23afe6bfacb5675cOwen Lin    private final MyMenuVisibilityListener mMenuVisibilityListener =
1712bb717f1ea38e2ce33dd102a23afe6bfacb5675cOwen Lin            new MyMenuVisibilityListener();
1722bb717f1ea38e2ce33dd102a23afe6bfacb5675cOwen Lin
173f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public static interface Model extends PhotoView.Model {
174f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        public void resume();
175f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        public void pause();
176f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        public boolean isEmpty();
177f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        public void setCurrentPhoto(Path path, int indexHint);
178f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
179f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
180f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private class MyMenuVisibilityListener implements OnMenuVisibilityListener {
18106c6401eededc2ec842ba4994a838c2ded0a666cPin Ting        @Override
182f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        public void onMenuVisibilityChanged(boolean isVisible) {
183f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            mIsMenuVisible = isVisible;
184f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            refreshHidingMessage();
185f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
186f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
187f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
188f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu    private static class BackgroundFadeOut extends FloatAnimation {
189f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu        public BackgroundFadeOut() {
190f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu            super(1f, 0f, ANIM_TIME_OPENING);
191f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu            setInterpolator(new AccelerateInterpolator(2f));
192f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu        }
193f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu    }
194f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu
195f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu    private final FloatAnimation mBackgroundFade = new BackgroundFadeOut();
196f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
197915c2c5b2c367df71599370613af0924bd7c4887Bobby Georgescu    @Override
198915c2c5b2c367df71599370613af0924bd7c4887Bobby Georgescu    protected int getBackgroundColorId() {
199915c2c5b2c367df71599370613af0924bd7c4887Bobby Georgescu        return R.color.photo_background;
200915c2c5b2c367df71599370613af0924bd7c4887Bobby Georgescu    }
201915c2c5b2c367df71599370613af0924bd7c4887Bobby Georgescu
202f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu    private final GLView mRootPane = new GLView() {
203f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        @Override
204f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        protected void renderBackground(GLCanvas view) {
20583be4e0c9b8e3372eff8f9b1a396afd961b72921Angus Kong            if (mFadeOutTexture != null) {
20683be4e0c9b8e3372eff8f9b1a396afd961b72921Angus Kong                if (mBackgroundFade.calculate(AnimationTime.get())) invalidate();
20783be4e0c9b8e3372eff8f9b1a396afd961b72921Angus Kong                if (!mBackgroundFade.isActive()) {
208f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu                    mFadeOutTexture = null;
209f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu                    mOpenAnimationRect = null;
210f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu                    BitmapScreenNail.enableDrawPlaceholder();
211f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu                } else {
212f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu                    float fadeAlpha = mBackgroundFade.get();
21383be4e0c9b8e3372eff8f9b1a396afd961b72921Angus Kong                    if (fadeAlpha < 1f) {
214915c2c5b2c367df71599370613af0924bd7c4887Bobby Georgescu                        view.clearBuffer(getBackgroundColor());
215f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu                        view.setAlpha(fadeAlpha);
216f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu                    }
217f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu                    mFadeOutTexture.draw(view, 0, 0);
21802ef48574ef7099ebaa0386bd6fd676bd2fd5489Bobby Georgescu                    view.setAlpha(1f - fadeAlpha);
219f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu                    return;
220f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu                }
221f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu            }
222915c2c5b2c367df71599370613af0924bd7c4887Bobby Georgescu            view.clearBuffer(getBackgroundColor());
223f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
224f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
225f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        @Override
226f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        protected void onLayout(
227f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                boolean changed, int left, int top, int right, int bottom) {
228f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            mPhotoView.layout(0, 0, right - left, bottom - top);
229f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            if (mShowDetails) {
2308cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen                mDetailsHelper.layout(left, mActionBar.getHeight(), right, bottom);
231f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            }
232f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
233f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    };
234f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
235f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    @Override
236f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public void onCreate(Bundle data, Bundle restoreState) {
23745c56f2d34c71d0bc9b84ebeef6d1314738d0fc0Bobby Georgescu        super.onCreate(data, restoreState);
2388cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen        mActionBar = mActivity.getGalleryActionBar();
239f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mSelectionManager = new SelectionManager(mActivity, false);
240f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mMenuExecutor = new MenuExecutor(mActivity, mSelectionManager);
241f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
242f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mPhotoView = new PhotoView(mActivity);
243bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang        mPhotoView.setListener(this);
244f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mRootPane.addComponent(mPhotoView);
24583be4e0c9b8e3372eff8f9b1a396afd961b72921Angus Kong        mApplication = (GalleryApp) ((Activity) mActivity).getApplication();
246bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang        mOrientationManager = mActivity.getOrientationManager();
247bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang        mOrientationManager.addListener(this);
2482ef46ed28b28b355d7f3f1432c7b1196b832a859Chih-Chung Chang        mActivity.getGLRoot().setOrientationSource(mOrientationManager);
249f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
250d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu        mHandler = new SynchronizedHandler(mActivity.getGLRoot()) {
251d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu            @Override
252d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu            public void handleMessage(Message message) {
253d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu                switch (message.what) {
254d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu                    case MSG_HIDE_BARS: {
255d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu                        hideBars();
256d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu                        break;
257d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu                    }
258d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu                    case MSG_REFRESH_GRID_BUTTON: {
259d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu                        setGridButtonVisibility(mPhotoView.getFilmMode());
260d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu                        break;
261d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu                    }
262f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu                    case MSG_REFRESH_BOTTOM_CONTROLS: {
263f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu                        if (mBottomControls != null) mBottomControls.refresh();
264d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu                        break;
265d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu                    }
266d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu                    case MSG_LOCK_ORIENTATION: {
267d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu                        mOrientationManager.lockOrientation();
268d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu                        break;
269d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu                    }
270d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu                    case MSG_UNLOCK_ORIENTATION: {
271d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu                        mOrientationManager.unlockOrientation();
272d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu                        break;
273d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu                    }
274d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu                    case MSG_ON_FULL_SCREEN_CHANGED: {
275d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu                        mAppBridge.onFullScreenChanged(message.arg1 == 1);
276d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu                        break;
277d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu                    }
278d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu                    case MSG_UPDATE_ACTION_BAR: {
279d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu                        updateBars();
280d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu                        break;
281d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu                    }
282d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu                    case MSG_WANT_BARS: {
283d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu                        wantBars();
284d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu                        break;
285d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu                    }
286d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu                    case MSG_UNFREEZE_GLROOT: {
287d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu                        mActivity.getGLRoot().unfreeze();
288d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu                        break;
289d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu                    }
290d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu                    default: throw new AssertionError(message.what);
291d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu                }
292d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu            }
293d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu        };
294d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu
29584c220f10a643927c8a2126de8a755d8d7f7ec9eRay Chen        mSetPathString = data.getString(KEY_MEDIA_SET_PATH);
296b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang        mOriginalSetPathString = mSetPathString;
297ddf0225a5192a589fc578945f56440b09bf74d12John Reck        setupNfcBeamPush();
2987eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu        String itemPathString = data.getString(KEY_MEDIA_ITEM_PATH);
2997eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu        Path itemPath = itemPathString != null ?
3007eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu                Path.fromString(data.getString(KEY_MEDIA_ITEM_PATH)) :
3017eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu                    null;
30254fe6202b6f7d233e7645c121321fe0f3d20fc8bYuli Huang        mTreatBackAsUp = data.getBoolean(KEY_TREAT_BACK_AS_UP, false);
3037eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu        mStartInFilmstrip =
3047eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu            data.getBoolean(KEY_START_IN_FILMSTRIP, false);
3057eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu        mStartedFromAlbumPage =
3067eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu                data.getInt(KEY_ALBUMPAGE_TRANSITION,
3077eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu                        MSG_ALBUMPAGE_NONE) == MSG_ALBUMPAGE_STARTED;
3087eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu        setGridButtonVisibility(!mStartedFromAlbumPage);
30984c220f10a643927c8a2126de8a755d8d7f7ec9eRay Chen        if (mSetPathString != null) {
310bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang            mAppBridge = (AppBridge) data.getParcelable(KEY_APP_BRIDGE);
311bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang            if (mAppBridge != null) {
3127eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu                mShowBars = false;
3137eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu
314253c5aec7692afdd7880fbd169d4b44d5679cbc0Chih-Chung Chang                mAppBridge.setServer(this);
315bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang                mOrientationManager.lockOrientation();
316b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang
317bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang                // Get the ScreenNail from AppBridge and register it.
3183b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang                int id = SnailSource.newId();
319b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang                Path screenNailSetPath = SnailSource.getSetPath(id);
320bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang                Path screenNailItemPath = SnailSource.getItemPath(id);
3213b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang                mScreenNailSet = (SnailAlbum) mActivity.getDataManager()
3223b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang                        .getMediaObject(screenNailSetPath);
3233b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang                mScreenNailItem = (SnailItem) mActivity.getDataManager()
324bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang                        .getMediaObject(screenNailItemPath);
3253b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang                mScreenNailItem.setScreenNail(mAppBridge.attachScreenNail());
326b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang
327a0ce682e40c39ce046c48d8a7f989fff01bb9f2cWu-cheng Li                // Check if the path is a secure album.
328a0ce682e40c39ce046c48d8a7f989fff01bb9f2cWu-cheng Li                if (SecureSource.isSecurePath(mSetPathString)) {
329a0ce682e40c39ce046c48d8a7f989fff01bb9f2cWu-cheng Li                    mSecureAlbum = (SecureAlbum) mActivity.getDataManager()
330a0ce682e40c39ce046c48d8a7f989fff01bb9f2cWu-cheng Li                            .getMediaSet(mSetPathString);
33123e595f0c656ebaeb63f78e3018b5830628c5afeWu-cheng Li                }
33223e595f0c656ebaeb63f78e3018b5830628c5afeWu-cheng Li                if (data.getBoolean(KEY_SHOW_WHEN_LOCKED, false)) {
333efd480e85dc5bd0d2ca0ac82d03e141212388830Wu-cheng Li                    // Set the flag to be on top of the lock screen.
334efd480e85dc5bd0d2ca0ac82d03e141212388830Wu-cheng Li                    mFlags |= FLAG_SHOW_WHEN_LOCKED;
335a0ce682e40c39ce046c48d8a7f989fff01bb9f2cWu-cheng Li                }
336a0ce682e40c39ce046c48d8a7f989fff01bb9f2cWu-cheng Li
3373b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang                // Combine the original MediaSet with the one for ScreenNail
3383b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang                // from AppBridge.
339b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang                mSetPathString = "/combo/item/{" + screenNailSetPath +
340b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang                        "," + mSetPathString + "}";
341b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang
342b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang                // Start from the screen nail.
343bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang                itemPath = screenNailItemPath;
344b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang            }
345b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang
3466118af9ddad8acc050133154f8f60c842c7f9bfaChih-Chung Chang            MediaSet originalSet = mActivity.getDataManager()
3476118af9ddad8acc050133154f8f60c842c7f9bfaChih-Chung Chang                    .getMediaSet(mSetPathString);
3486118af9ddad8acc050133154f8f60c842c7f9bfaChih-Chung Chang            mSelectionManager.setSourceMediaSet(originalSet);
3496b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang            mSetPathString = "/filter/delete/{" + mSetPathString + "}";
3506b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang            mMediaSet = (FilterDeleteSet) mActivity.getDataManager()
3516b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang                    .getMediaSet(mSetPathString);
352f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            mCurrentIndex = data.getInt(KEY_INDEX_HINT, 0);
353f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            if (mMediaSet == null) {
35484c220f10a643927c8a2126de8a755d8d7f7ec9eRay Chen                Log.w(TAG, "failed to restore " + mSetPathString);
355f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            }
3567eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu            if (itemPath == null) {
3573eb2e643a40d1be77998373343cdf8b14764f58cBobby Georgescu                int mediaItemCount = mMediaSet.getMediaItemCount();
3583eb2e643a40d1be77998373343cdf8b14764f58cBobby Georgescu                if (mediaItemCount > 0) {
3593eb2e643a40d1be77998373343cdf8b14764f58cBobby Georgescu                    if (mCurrentIndex >= mediaItemCount) mCurrentIndex = 0;
360d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu                    itemPath = mMediaSet.getMediaItem(mCurrentIndex, 1)
361d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu                        .get(0).getPath();
362d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu                } else {
3633eb2e643a40d1be77998373343cdf8b14764f58cBobby Georgescu                    // Bail out, PhotoPage can't load on an empty album
364d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu                    return;
365d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu                }
3667eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu            }
367f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            PhotoDataAdapter pda = new PhotoDataAdapter(
368bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang                    mActivity, mPhotoView, mMediaSet, itemPath, mCurrentIndex,
36943a80fd806247cb50e81bacda3ad21d210e9ae88Angus Kong                    mAppBridge == null ? -1 : 0,
370dbb6acc204ba6f095eb0e49e1298e9ceda2c3096Wu-cheng Li                    mAppBridge == null ? false : mAppBridge.isPanorama(),
371dbb6acc204ba6f095eb0e49e1298e9ceda2c3096Wu-cheng Li                    mAppBridge == null ? false : mAppBridge.isStaticCamera());
372f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            mModel = pda;
373f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            mPhotoView.setModel(mModel);
374f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
375f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            pda.setDataListener(new PhotoDataAdapter.DataListener() {
376f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
377113bfc77c4468411da9ae1290553c3be89f8df9aOwen Lin                @Override
378f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                public void onPhotoChanged(int index, Path item) {
37900ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu                    int oldIndex = mCurrentIndex;
380f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                    mCurrentIndex = index;
381f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                    if (item != null) {
382616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin                        MediaItem photo = mModel.getMediaItem(0);
383f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                        if (photo != null) updateCurrentPhoto(photo);
384f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                    }
38500ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu                    if (mAppBridge != null) {
38600ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu                        if (oldIndex == 0 && mCurrentIndex > 0
38700ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu                                && !mPhotoView.getFilmMode()) {
38800ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu                            mPhotoView.setFilmMode(true);
38900ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu                        }
39000ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu                    }
39161f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang                    updateBars();
39200ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu
39300ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu                    // Reset the timeout for the bars after a swipe
39400ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu                    refreshHidingMessage();
395f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                }
396f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
397f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                @Override
398f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                public void onLoadingFinished() {
399f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                    if (!mModel.isEmpty()) {
400616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin                        MediaItem photo = mModel.getMediaItem(0);
401f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                        if (photo != null) updateCurrentPhoto(photo);
402f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                    } else if (mIsActive) {
403c370476adcf29f311ceec70a119792a0168781e9Chih-Chung Chang                        // We only want to finish the PhotoPage if there is no
404c370476adcf29f311ceec70a119792a0168781e9Chih-Chung Chang                        // deletion that the user can undo.
405c370476adcf29f311ceec70a119792a0168781e9Chih-Chung Chang                        if (mMediaSet.getNumberOfDeletions() == 0) {
406c370476adcf29f311ceec70a119792a0168781e9Chih-Chung Chang                            mActivity.getStateManager().finishState(
407c370476adcf29f311ceec70a119792a0168781e9Chih-Chung Chang                                    PhotoPage.this);
408c370476adcf29f311ceec70a119792a0168781e9Chih-Chung Chang                        }
409f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                    }
410f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                }
411f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
412f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                @Override
413f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                public void onLoadingStarted() {
414f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                }
415f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            });
416f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        } else {
417f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            // Get default media set by the URI
418f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            MediaItem mediaItem = (MediaItem)
419f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                    mActivity.getDataManager().getMediaObject(itemPath);
420f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            mModel = new SinglePhotoDataAdapter(mActivity, mPhotoView, mediaItem);
421f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            mPhotoView.setModel(mModel);
422f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            updateCurrentPhoto(mediaItem);
423f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
424cf46a3abc26aac7cdb6b6993aeade053304b71d9Ray Chen
425b265ebb01cc046b74329eeb28dbecb24e0f953d2Bobby Georgescu        mPhotoView.setFilmMode(mStartInFilmstrip && mMediaSet.getMediaItemCount() > 1);
426f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu        if (mSecureAlbum == null) {
427f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu            RelativeLayout galleryRoot = (RelativeLayout) ((Activity) mActivity)
428f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu                        .findViewById(mAppBridge != null ? R.id.content : R.id.gallery_root);
429f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu            if (galleryRoot != null) {
430f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu                mBottomControls = new PhotoPageBottomControls(this, mActivity, galleryRoot);
431f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu            }
432f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu        }
433a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu    }
434a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu
435f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu    public boolean canDisplayBottomControls() {
436f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu        return mShowBars && !mPhotoView.getFilmMode();
437a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu    }
438a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu
439f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu    public boolean canDisplayBottomControl(int control) {
440f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu        if (mCurrentPhoto == null) return false;
441f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu        switch(control) {
442f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu            case R.id.photopage_bottom_control_edit:
443f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu                return mCurrentPhoto.getMediaType() == MediaObject.MEDIA_TYPE_IMAGE;
444f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu            case R.id.photopage_bottom_control_panorama:
445f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu                return (mCurrentPhoto.getSupportedOperations()
4464f32d514ee7474d867d04bf3934f9e11e9e92783Mangesh Ghiware                        & MediaItem.SUPPORT_PANORAMA) != 0;
447f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu            default:
448f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu                return false;
449f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu        }
450a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu    }
451a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu
452f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu    public void onBottomControlClicked(int control) {
453f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu        switch(control) {
454f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu            case R.id.photopage_bottom_control_edit:
455f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu                launchPhotoEditor();
456f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu                return;
457f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu            case R.id.photopage_bottom_control_panorama:
458f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu                LightCycleHelper.viewPanorama(mActivity, mCurrentPhoto.getContentUri());
459f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu                return;
460f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu            default:
461f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu                return;
462a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu        }
463f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
464f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
4656772173d2a49b87a1d209f42fe52b5f830596f99Chih-Chung Chang    @TargetApi(ApiHelper.VERSION_CODES.JELLY_BEAN)
466ddf0225a5192a589fc578945f56440b09bf74d12John Reck    private void setupNfcBeamPush() {
467ddf0225a5192a589fc578945f56440b09bf74d12John Reck        if (!ApiHelper.HAS_SET_BEAM_PUSH_URIS) return;
468ddf0225a5192a589fc578945f56440b09bf74d12John Reck
469ddf0225a5192a589fc578945f56440b09bf74d12John Reck        NfcAdapter adapter = NfcAdapter.getDefaultAdapter(mActivity);
470ddf0225a5192a589fc578945f56440b09bf74d12John Reck        if (adapter != null) {
471ddf0225a5192a589fc578945f56440b09bf74d12John Reck            adapter.setBeamPushUrisCallback(new CreateBeamUrisCallback() {
472ddf0225a5192a589fc578945f56440b09bf74d12John Reck                @Override
473ddf0225a5192a589fc578945f56440b09bf74d12John Reck                public Uri[] createBeamUris(NfcEvent event) {
474ddf0225a5192a589fc578945f56440b09bf74d12John Reck                    return mNfcPushUris;
475ddf0225a5192a589fc578945f56440b09bf74d12John Reck                }
476ddf0225a5192a589fc578945f56440b09bf74d12John Reck            }, mActivity);
477fc86994f86f8cfb31e151c9e730dc1e9dc7b3349Yuli Huang        }
478fc86994f86f8cfb31e151c9e730dc1e9dc7b3349Yuli Huang    }
479fc86994f86f8cfb31e151c9e730dc1e9dc7b3349Yuli Huang
480ddf0225a5192a589fc578945f56440b09bf74d12John Reck    private void setNfcBeamPushUri(Uri uri) {
481ddf0225a5192a589fc578945f56440b09bf74d12John Reck        mNfcPushUris[0] = uri;
482ddf0225a5192a589fc578945f56440b09bf74d12John Reck    }
483ddf0225a5192a589fc578945f56440b09bf74d12John Reck
484fb5571987f2555b04731b6f3e1c479efc16d542aWu-cheng Li    private Intent createShareIntent(Path path) {
485fb5571987f2555b04731b6f3e1c479efc16d542aWu-cheng Li        DataManager manager = mActivity.getDataManager();
486fb5571987f2555b04731b6f3e1c479efc16d542aWu-cheng Li        int type = manager.getMediaType(path);
4874f32d514ee7474d867d04bf3934f9e11e9e92783Mangesh Ghiware        int support = manager.getSupportedOperations(path);
4884f32d514ee7474d867d04bf3934f9e11e9e92783Mangesh Ghiware        boolean isPanorama = (support & MediaObject.SUPPORT_PANORAMA) != 0;
489fb5571987f2555b04731b6f3e1c479efc16d542aWu-cheng Li        Intent intent = new Intent(Intent.ACTION_SEND);
4904f32d514ee7474d867d04bf3934f9e11e9e92783Mangesh Ghiware        intent.setType(MenuExecutor.getMimeType(type, isPanorama));
4912bb717f1ea38e2ce33dd102a23afe6bfacb5675cOwen Lin        Uri uri = manager.getContentUri(path);
492fb5571987f2555b04731b6f3e1c479efc16d542aWu-cheng Li        intent.putExtra(Intent.EXTRA_STREAM, uri);
493fb5571987f2555b04731b6f3e1c479efc16d542aWu-cheng Li        return intent;
494fb5571987f2555b04731b6f3e1c479efc16d542aWu-cheng Li
495fb5571987f2555b04731b6f3e1c479efc16d542aWu-cheng Li    }
496fb5571987f2555b04731b6f3e1c479efc16d542aWu-cheng Li
497a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu    private void launchPhotoEditor() {
498a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu        MediaItem current = mModel.getMediaItem(0);
499a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu        if (current == null) return;
500a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu
501a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu        Intent intent = new Intent(ACTION_NEXTGEN_EDIT);
502a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu        intent.setData(mActivity.getDataManager().getContentUri(current.getPath())).setFlags(
503a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu                Intent.FLAG_GRANT_READ_URI_PERMISSION);
504a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu        if (mActivity.getPackageManager()
505a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu                .queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY).size() == 0) {
506a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu            intent.setAction(Intent.ACTION_EDIT);
507a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu        }
508a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu        ((Activity) mActivity).startActivityForResult(Intent.createChooser(intent, null),
509a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu                REQUEST_EDIT);
510a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu    }
511a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu
5122bb717f1ea38e2ce33dd102a23afe6bfacb5675cOwen Lin    private void updateShareURI(Path path) {
51324081fe26ca25448ddb9c8f9cc7f406d26344decOwen Lin        DataManager manager = mActivity.getDataManager();
51424081fe26ca25448ddb9c8f9cc7f406d26344decOwen Lin        Uri uri = manager.getContentUri(path);
51524081fe26ca25448ddb9c8f9cc7f406d26344decOwen Lin        mActionBar.setShareIntent(createShareIntent(path));
516ddf0225a5192a589fc578945f56440b09bf74d12John Reck        setNfcBeamPushUri(uri);
517cf46a3abc26aac7cdb6b6993aeade053304b71d9Ray Chen    }
518cf46a3abc26aac7cdb6b6993aeade053304b71d9Ray Chen
519f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private void updateCurrentPhoto(MediaItem photo) {
520f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        if (mCurrentPhoto == photo) return;
521f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mCurrentPhoto = photo;
522f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        if (mCurrentPhoto == null) return;
523f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        updateMenuOperations();
524ed46d77c16cd80357f4a0feada2435dfba8104a6Yuli Huang        updateTitle();
525f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu        if (mBottomControls != null) mBottomControls.refresh();
526f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        if (mShowDetails) {
527995c4566bed7df1aa48ba7e1351f964efa73880bMichael Kolb            mDetailsHelper.reloadDetails();
528f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
529898a2f4540635528a0916b0a6b0a177869854ae9Wu-cheng Li        if ((mSecureAlbum == null)
530898a2f4540635528a0916b0a6b0a177869854ae9Wu-cheng Li                && (photo.getSupportedOperations() & MediaItem.SUPPORT_SHARE) != 0) {
53115b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang            updateShareURI(photo.getPath());
53215b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang        }
533f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
534f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
535ed46d77c16cd80357f4a0feada2435dfba8104a6Yuli Huang    private void updateTitle() {
536ed46d77c16cd80357f4a0feada2435dfba8104a6Yuli Huang        if (mCurrentPhoto == null) return;
537ed46d77c16cd80357f4a0feada2435dfba8104a6Yuli Huang        boolean showTitle = mActivity.getAndroidContext().getResources().getBoolean(
538ed46d77c16cd80357f4a0feada2435dfba8104a6Yuli Huang                R.bool.show_action_bar_title);
5392bb717f1ea38e2ce33dd102a23afe6bfacb5675cOwen Lin        if (showTitle && mCurrentPhoto.getName() != null) {
540ed46d77c16cd80357f4a0feada2435dfba8104a6Yuli Huang            mActionBar.setTitle(mCurrentPhoto.getName());
5412bb717f1ea38e2ce33dd102a23afe6bfacb5675cOwen Lin        } else {
542ed46d77c16cd80357f4a0feada2435dfba8104a6Yuli Huang            mActionBar.setTitle("");
5432bb717f1ea38e2ce33dd102a23afe6bfacb5675cOwen Lin        }
544ed46d77c16cd80357f4a0feada2435dfba8104a6Yuli Huang    }
545ed46d77c16cd80357f4a0feada2435dfba8104a6Yuli Huang
546f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private void updateMenuOperations() {
54724081fe26ca25448ddb9c8f9cc7f406d26344decOwen Lin        Menu menu = mActionBar.getMenu();
54824081fe26ca25448ddb9c8f9cc7f406d26344decOwen Lin
54924081fe26ca25448ddb9c8f9cc7f406d26344decOwen Lin        // it could be null if onCreateActionBar has not been called yet
55024081fe26ca25448ddb9c8f9cc7f406d26344decOwen Lin        if (menu == null) return;
55124081fe26ca25448ddb9c8f9cc7f406d26344decOwen Lin
5527eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu        setGridButtonVisibility(mPhotoView.getFilmMode());
5537eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu
55424081fe26ca25448ddb9c8f9cc7f406d26344decOwen Lin        MenuItem item = menu.findItem(R.id.action_slideshow);
555898a2f4540635528a0916b0a6b0a177869854ae9Wu-cheng Li        item.setVisible((mSecureAlbum == null) && canDoSlideShow());
5562066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang        if (mCurrentPhoto == null) return;
55724081fe26ca25448ddb9c8f9cc7f406d26344decOwen Lin
558f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        int supportedOperations = mCurrentPhoto.getSupportedOperations();
559898a2f4540635528a0916b0a6b0a177869854ae9Wu-cheng Li        if (mSecureAlbum != null) {
56024081fe26ca25448ddb9c8f9cc7f406d26344decOwen Lin            supportedOperations &= MediaObject.SUPPORT_DELETE;
561898a2f4540635528a0916b0a6b0a177869854ae9Wu-cheng Li        } else if (!GalleryUtils.isEditorAvailable(mActivity, "image/*")) {
562f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            supportedOperations &= ~MediaObject.SUPPORT_EDIT;
563f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
56424081fe26ca25448ddb9c8f9cc7f406d26344decOwen Lin        MenuExecutor.updateMenuOperation(menu, supportedOperations);
565f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
566f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
5672066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang    private boolean canDoSlideShow() {
5682066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang        if (mMediaSet == null || mCurrentPhoto == null) {
5692066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang            return false;
5702066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang        }
5712066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang        if (mCurrentPhoto.getMediaType() != MediaObject.MEDIA_TYPE_IMAGE) {
5722066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang            return false;
5732066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang        }
5746b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang        if (MtpSource.isMtpPath(mOriginalSetPathString)) {
5752066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang            return false;
5762066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang        }
5772066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang        return true;
5782066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang    }
5792066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang
58061f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang    //////////////////////////////////////////////////////////////////////////
58161f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang    //  Action Bar show/hide management
58261f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang    //////////////////////////////////////////////////////////////////////////
58361f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang
584f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private void showBars() {
585f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        if (mShowBars) return;
586f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mShowBars = true;
587e6251df06f0b3c8f556043f8b725b4b19be7474dChih-Chung Chang        mOrientationManager.unlockOrientation();
588f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mActionBar.show();
5890b2486cff0c1b951c54325596256b986307f7f3aChih-Chung Chang        mActivity.getGLRoot().setLightsOutMode(false);
59061f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang        refreshHidingMessage();
591f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu        if (mBottomControls != null) mBottomControls.refresh();
592f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
593f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
594f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private void hideBars() {
595f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        if (!mShowBars) return;
596f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mShowBars = false;
597f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mActionBar.hide();
5980b2486cff0c1b951c54325596256b986307f7f3aChih-Chung Chang        mActivity.getGLRoot().setLightsOutMode(true);
59961f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang        mHandler.removeMessages(MSG_HIDE_BARS);
600f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu        if (mBottomControls != null) mBottomControls.refresh();
601f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
602f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
603f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private void refreshHidingMessage() {
604f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mHandler.removeMessages(MSG_HIDE_BARS);
6057eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu        if (!mIsMenuVisible && !mPhotoView.getFilmMode()) {
606f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            mHandler.sendEmptyMessageDelayed(MSG_HIDE_BARS, HIDE_BARS_TIMEOUT);
607f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
608f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
609f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
610aeb3062e84ed28f0e25a73f511f287ae0a3e4294Chih-Chung Chang    private boolean canShowBars() {
611aeb3062e84ed28f0e25a73f511f287ae0a3e4294Chih-Chung Chang        // No bars if we are showing camera preview.
61256bdcb7272f222fde5e4c6fc133cb490b31c7667Bobby Georgescu        if (mAppBridge != null && mCurrentIndex == 0
61356bdcb7272f222fde5e4c6fc133cb490b31c7667Bobby Georgescu                && !mPhotoView.getFilmMode()) return false;
61456bdcb7272f222fde5e4c6fc133cb490b31c7667Bobby Georgescu
615aeb3062e84ed28f0e25a73f511f287ae0a3e4294Chih-Chung Chang        // No bars if it's not allowed.
616aeb3062e84ed28f0e25a73f511f287ae0a3e4294Chih-Chung Chang        if (!mActionBarAllowed) return false;
617aeb3062e84ed28f0e25a73f511f287ae0a3e4294Chih-Chung Chang
618aeb3062e84ed28f0e25a73f511f287ae0a3e4294Chih-Chung Chang        return true;
619aeb3062e84ed28f0e25a73f511f287ae0a3e4294Chih-Chung Chang    }
620aeb3062e84ed28f0e25a73f511f287ae0a3e4294Chih-Chung Chang
621e6251df06f0b3c8f556043f8b725b4b19be7474dChih-Chung Chang    private void wantBars() {
622e6251df06f0b3c8f556043f8b725b4b19be7474dChih-Chung Chang        if (canShowBars()) showBars();
623e6251df06f0b3c8f556043f8b725b4b19be7474dChih-Chung Chang    }
624e6251df06f0b3c8f556043f8b725b4b19be7474dChih-Chung Chang
62561f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang    private void toggleBars() {
626f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        if (mShowBars) {
627f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            hideBars();
628aeb3062e84ed28f0e25a73f511f287ae0a3e4294Chih-Chung Chang        } else {
629e6251df06f0b3c8f556043f8b725b4b19be7474dChih-Chung Chang            if (canShowBars()) showBars();
630f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
631f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
632f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
63361f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang    private void updateBars() {
634e6251df06f0b3c8f556043f8b725b4b19be7474dChih-Chung Chang        if (!canShowBars()) {
63561f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang            hideBars();
63661f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang        }
637f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
638f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
639f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    @Override
6402ef46ed28b28b355d7f3f1432c7b1196b832a859Chih-Chung Chang    public void onOrientationCompensationChanged() {
6412ef46ed28b28b355d7f3f1432c7b1196b832a859Chih-Chung Chang        mActivity.getGLRoot().requestLayoutContentPane();
642bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    }
643bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang
644bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    @Override
645f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    protected void onBackPressed() {
646f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        if (mShowDetails) {
647f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            hideDetails();
6483b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang        } else if (mAppBridge == null || !switchWithCaptureAnimation(-1)) {
649bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang            // We are leaving this page. Set the result now.
650bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang            setResult();
6517eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu            if (mStartInFilmstrip && !mPhotoView.getFilmMode()) {
6527eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu                mPhotoView.setFilmMode(true);
6537eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu            } else if (mTreatBackAsUp) {
65454fe6202b6f7d233e7645c121321fe0f3d20fc8bYuli Huang                onUpPressed();
65554fe6202b6f7d233e7645c121321fe0f3d20fc8bYuli Huang            } else {
65654fe6202b6f7d233e7645c121321fe0f3d20fc8bYuli Huang                super.onBackPressed();
65754fe6202b6f7d233e7645c121321fe0f3d20fc8bYuli Huang            }
658f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
659f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
660f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
661b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang    private void onUpPressed() {
662833f775afc9515567dc5aaf0cafe20e006e77545Bobby Georgescu        if ((mStartInFilmstrip || mAppBridge != null)
663833f775afc9515567dc5aaf0cafe20e006e77545Bobby Georgescu                && !mPhotoView.getFilmMode()) {
6647eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu            mPhotoView.setFilmMode(true);
6657eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu            return;
6667eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu        }
6677eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu
668b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang        if (mActivity.getStateManager().getStateCount() > 1) {
6697eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu            setResult();
670b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang            super.onBackPressed();
671ba12eae90b5b1a80ee002aa0df8c5c5189c4faa3Chih-Chung Chang            return;
67266ca848b2f58b813d366642088d274a1b7c4a90cChih-Chung Chang        }
67366ca848b2f58b813d366642088d274a1b7c4a90cChih-Chung Chang
67466ca848b2f58b813d366642088d274a1b7c4a90cChih-Chung Chang        if (mOriginalSetPathString == null) return;
67566ca848b2f58b813d366642088d274a1b7c4a90cChih-Chung Chang
67666ca848b2f58b813d366642088d274a1b7c4a90cChih-Chung Chang        if (mAppBridge == null) {
677b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang            // We're in view mode so set up the stacks on our own.
678b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang            Bundle data = new Bundle(getData());
679b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang            data.putString(AlbumPage.KEY_MEDIA_PATH, mOriginalSetPathString);
680b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang            data.putString(AlbumPage.KEY_PARENT_MEDIA_PATH,
681b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang                    mActivity.getDataManager().getTopSetPath(
682b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang                            DataManager.INCLUDE_ALL));
683b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang            mActivity.getStateManager().switchState(this, AlbumPage.class, data);
68466ca848b2f58b813d366642088d274a1b7c4a90cChih-Chung Chang        } else {
685833f775afc9515567dc5aaf0cafe20e006e77545Bobby Georgescu            GalleryUtils.startGalleryActivity(mActivity);
686b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang        }
687b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang    }
688b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang
689bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    private void setResult() {
690bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang        Intent result = null;
6917eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu        result = new Intent();
6927eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu        result.putExtra(KEY_RETURN_INDEX_HINT, mCurrentIndex);
693bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang        setStateResult(Activity.RESULT_OK, result);
694bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    }
695bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang
696bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    //////////////////////////////////////////////////////////////////////////
697bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    //  AppBridge.Server interface
698bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    //////////////////////////////////////////////////////////////////////////
699bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang
700bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    @Override
7012ef46ed28b28b355d7f3f1432c7b1196b832a859Chih-Chung Chang    public void setCameraRelativeFrame(Rect frame) {
7022ef46ed28b28b355d7f3f1432c7b1196b832a859Chih-Chung Chang        mPhotoView.setCameraRelativeFrame(frame);
703bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    }
704bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang
705bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    @Override
7062c6173822a612597c79be41b126367ddfbb5d518Chih-Chung Chang    public boolean switchWithCaptureAnimation(int offset) {
7072c6173822a612597c79be41b126367ddfbb5d518Chih-Chung Chang        return mPhotoView.switchWithCaptureAnimation(offset);
7082c6173822a612597c79be41b126367ddfbb5d518Chih-Chung Chang    }
7092c6173822a612597c79be41b126367ddfbb5d518Chih-Chung Chang
710f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    @Override
7116575794a9c09f22d5721e212c093e0a2df376d0cChih-Chung Chang    public void setSwipingEnabled(boolean enabled) {
7126575794a9c09f22d5721e212c093e0a2df376d0cChih-Chung Chang        mPhotoView.setSwipingEnabled(enabled);
7136575794a9c09f22d5721e212c093e0a2df376d0cChih-Chung Chang    }
7146575794a9c09f22d5721e212c093e0a2df376d0cChih-Chung Chang
7156575794a9c09f22d5721e212c093e0a2df376d0cChih-Chung Chang    @Override
7163b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang    public void notifyScreenNailChanged() {
7173b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang        mScreenNailItem.setScreenNail(mAppBridge.attachScreenNail());
7183b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang        mScreenNailSet.notifyChange();
7193b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang    }
7203b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang
7213b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang    @Override
722a0ce682e40c39ce046c48d8a7f989fff01bb9f2cWu-cheng Li    public void addSecureAlbumItem(boolean isVideo, int id) {
723a0ce682e40c39ce046c48d8a7f989fff01bb9f2cWu-cheng Li        mSecureAlbum.addMediaItem(isVideo, id);
724a0ce682e40c39ce046c48d8a7f989fff01bb9f2cWu-cheng Li    }
725a0ce682e40c39ce046c48d8a7f989fff01bb9f2cWu-cheng Li
726a0ce682e40c39ce046c48d8a7f989fff01bb9f2cWu-cheng Li    @Override
727f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    protected boolean onCreateActionBar(Menu menu) {
728b21b8e58a604f6c701245d84b141b5b87663192bOwen Lin        mActionBar.createActionBarMenu(R.menu.photo, menu);
729f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        updateMenuOperations();
730ed46d77c16cd80357f4a0feada2435dfba8104a6Yuli Huang        updateTitle();
731b21b8e58a604f6c701245d84b141b5b87663192bOwen Lin        return true;
732f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
733f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
734d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin    private MenuExecutor.ProgressListener mConfirmDialogListener =
735d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin            new MenuExecutor.ProgressListener() {
736d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin        @Override
737d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin        public void onProgressUpdate(int index) {}
738d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin
739d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin        @Override
740d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin        public void onProgressComplete(int result) {}
741d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin
742d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin        @Override
743d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin        public void onConfirmDialogShown() {
744d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin            mHandler.removeMessages(MSG_HIDE_BARS);
745d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin        }
746d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin
747d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin        @Override
748d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin        public void onConfirmDialogDismissed(boolean confirmed) {
749d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin            refreshHidingMessage();
750d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin        }
751ba50b9420e64731fd5aa8b1410e1f36457a1635aBobby Georgescu
752ba50b9420e64731fd5aa8b1410e1f36457a1635aBobby Georgescu        @Override
753ba50b9420e64731fd5aa8b1410e1f36457a1635aBobby Georgescu        public void onProgressStart() {}
754d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin    };
755d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin
756f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    @Override
757f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    protected boolean onItemSelected(MenuItem item) {
758d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu        if (mModel == null) return true;
759d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin        refreshHidingMessage();
760616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin        MediaItem current = mModel.getMediaItem(0);
761f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
762f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        if (current == null) {
763f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            // item is not ready, ignore
764f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            return true;
765f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
766f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
767f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        int currentIndex = mModel.getCurrentIndex();
768f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        Path path = current.getPath();
769f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
770f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        DataManager manager = mActivity.getDataManager();
771f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        int action = item.getItemId();
7729a033b07b8e0d9fe7419b7a0d876e9c7febf43c8Ray Chen        String confirmMsg = null;
773f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        switch (action) {
77484c220f10a643927c8a2126de8a755d8d7f7ec9eRay Chen            case android.R.id.home: {
775b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang                onUpPressed();
77684c220f10a643927c8a2126de8a755d8d7f7ec9eRay Chen                return true;
77784c220f10a643927c8a2126de8a755d8d7f7ec9eRay Chen            }
7787eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu            case R.id.action_grid: {
7797eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu                if (mStartedFromAlbumPage) {
7807eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu                    onUpPressed();
7817eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu                } else {
7827eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu                    preparePhotoFallbackView();
7837eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu                    Bundle data = new Bundle(getData());
7847eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu                    data.putString(AlbumPage.KEY_MEDIA_PATH, mOriginalSetPathString);
7857eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu                    data.putString(AlbumPage.KEY_PARENT_MEDIA_PATH,
7867eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu                            mActivity.getDataManager().getTopSetPath(
7877eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu                                    DataManager.INCLUDE_ALL));
78800ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu
789e06c9f109f06813ca1f8a0abb549d51aefd4973dBobby Georgescu                    // We only show cluster menu in the first AlbumPage in stack
79000ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu                    // TODO: Enable this when running from the camera app
791e06c9f109f06813ca1f8a0abb549d51aefd4973dBobby Georgescu                    boolean inAlbum = mActivity.getStateManager().hasStateClass(AlbumPage.class);
79200ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu                    data.putBoolean(AlbumPage.KEY_SHOW_CLUSTER_MENU, !inAlbum
79300ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu                            && mAppBridge == null);
79400ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu
79500ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu                    data.putBoolean(PhotoPage.KEY_APP_BRIDGE, mAppBridge != null);
79600ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu
79700ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu                    // Account for live preview being first item
79800ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu                    mActivity.getTransitionStore().put(KEY_RETURN_INDEX_HINT,
79900ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu                            mAppBridge != null ? mCurrentIndex - 1 : mCurrentIndex);
80000ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu
8017eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu                    mActivity.getStateManager().startState(AlbumPage.class, data);
8027eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu                }
8037eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu                return true;
8047eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu            }
805f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            case R.id.action_slideshow: {
806f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                Bundle data = new Bundle();
8076cf807453fb58ccd4cc513ff187b306c7090e67cOwen Lin                data.putString(SlideshowPage.KEY_SET_PATH, mMediaSet.getPath().toString());
808604f053d040782159b61d3b74ee533bc2c0ccdd0Ray Chen                data.putString(SlideshowPage.KEY_ITEM_PATH, path.toString());
809f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                data.putInt(SlideshowPage.KEY_PHOTO_INDEX, currentIndex);
810f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                data.putBoolean(SlideshowPage.KEY_REPEAT, true);
811f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                mActivity.getStateManager().startStateForResult(
812f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                        SlideshowPage.class, REQUEST_SLIDESHOW, data);
813f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                return true;
814f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            }
815f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            case R.id.action_crop: {
816898a2f4540635528a0916b0a6b0a177869854ae9Wu-cheng Li                Activity activity = mActivity;
817f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                Intent intent = new Intent(CropImage.CROP_ACTION);
818f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                intent.setClass(activity, CropImage.class);
819f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                intent.setData(manager.getContentUri(path));
820f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                activity.startActivityForResult(intent, PicasaSource.isPicasaImage(current)
821f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                        ? REQUEST_CROP_PICASA
822f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                        : REQUEST_CROP);
823f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                return true;
824f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            }
82550ea2d2938218ac6b2039f0e42998cfbbc45d1f1Teng-Hui Zhu            case R.id.action_trim: {
8263f1f1baf3a674927e25cd5cd885fb372796bd3a0Teng-Hui Zhu                Intent intent = new Intent(mActivity, TrimVideo.class);
8273f1f1baf3a674927e25cd5cd885fb372796bd3a0Teng-Hui Zhu                intent.setData(manager.getContentUri(path));
82815ff1b1ca52bea348b8a490b5b5abe53fa43eaf2Teng-Hui Zhu                // We need the file path to wrap this into a RandomAccessFile.
82915ff1b1ca52bea348b8a490b5b5abe53fa43eaf2Teng-Hui Zhu                intent.putExtra(KEY_MEDIA_ITEM_PATH, current.getFilePath());
8303f1f1baf3a674927e25cd5cd885fb372796bd3a0Teng-Hui Zhu                mActivity.startActivityForResult(intent, REQUEST_TRIM);
83150ea2d2938218ac6b2039f0e42998cfbbc45d1f1Teng-Hui Zhu                return true;
83250ea2d2938218ac6b2039f0e42998cfbbc45d1f1Teng-Hui Zhu            }
833f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang            case R.id.action_edit: {
834a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu                launchPhotoEditor();
835f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang                return true;
836f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang            }
837f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            case R.id.action_details: {
838f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                if (mShowDetails) {
839f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                    hideDetails();
840f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                } else {
841995c4566bed7df1aa48ba7e1351f964efa73880bMichael Kolb                    showDetails();
842f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                }
843f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                return true;
844f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            }
84567098d1a72fd04e2af06d3a5939cde28c65f70d9Ray Chen            case R.id.action_delete:
8469a033b07b8e0d9fe7419b7a0d876e9c7febf43c8Ray Chen                confirmMsg = mActivity.getResources().getQuantityString(
8479a033b07b8e0d9fe7419b7a0d876e9c7febf43c8Ray Chen                        R.plurals.delete_selection, 1);
848f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            case R.id.action_setas:
849f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            case R.id.action_rotate_ccw:
850f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            case R.id.action_rotate_cw:
851f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            case R.id.action_show_on_map:
852f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                mSelectionManager.deSelectAll();
853f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                mSelectionManager.toggle(path);
854d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin                mMenuExecutor.onMenuClicked(item, confirmMsg, mConfirmDialogListener);
855f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                return true;
856f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            case R.id.action_import:
857f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                mSelectionManager.deSelectAll();
858f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                mSelectionManager.toggle(path);
8599a033b07b8e0d9fe7419b7a0d876e9c7febf43c8Ray Chen                mMenuExecutor.onMenuClicked(item, confirmMsg,
860f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                        new ImportCompleteListener(mActivity));
861f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                return true;
862fb5571987f2555b04731b6f3e1c479efc16d542aWu-cheng Li            case R.id.action_share:
863898a2f4540635528a0916b0a6b0a177869854ae9Wu-cheng Li                Activity activity = mActivity;
864fb5571987f2555b04731b6f3e1c479efc16d542aWu-cheng Li                Intent intent = createShareIntent(mCurrentPhoto.getPath());
865fb5571987f2555b04731b6f3e1c479efc16d542aWu-cheng Li                activity.startActivity(Intent.createChooser(intent,
866fb5571987f2555b04731b6f3e1c479efc16d542aWu-cheng Li                        activity.getString(R.string.share)));
867fb5571987f2555b04731b6f3e1c479efc16d542aWu-cheng Li                return true;
868f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            default :
869f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                return false;
870f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
871f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
872f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
873f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private void hideDetails() {
874f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mShowDetails = false;
8754105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen        mDetailsHelper.hide();
876f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
877f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
878995c4566bed7df1aa48ba7e1351f964efa73880bMichael Kolb    private void showDetails() {
879f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mShowDetails = true;
8804105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen        if (mDetailsHelper == null) {
8814105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen            mDetailsHelper = new DetailsHelper(mActivity, mRootPane, new MyDetailsSource());
8824105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen            mDetailsHelper.setCloseListener(new CloseListener() {
88306c6401eededc2ec842ba4994a838c2ded0a666cPin Ting                @Override
884f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                public void onClose() {
885f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                    hideDetails();
886f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                }
887f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            });
888f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
8894105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen        mDetailsHelper.show();
890f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
891f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
892bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    ////////////////////////////////////////////////////////////////////////////
893bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    //  Callbacks from PhotoView
894bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    ////////////////////////////////////////////////////////////////////////////
895bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    @Override
896f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public void onSingleTapUp(int x, int y) {
897bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang        if (mAppBridge != null) {
898bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang            if (mAppBridge.onSingleTapUp(x, y)) return;
899014d9586d8145a33f4e99eaad570587f6d650026Wu-cheng Li        }
900014d9586d8145a33f4e99eaad570587f6d650026Wu-cheng Li
901616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin        MediaItem item = mModel.getMediaItem(0);
902b5dc542fbaeaf99bebdcf775ef0e034e89e88eaeWu-cheng Li        if (item == null || item == mScreenNailItem) {
903b5dc542fbaeaf99bebdcf775ef0e034e89e88eaeWu-cheng Li            // item is not ready or it is camera preview, ignore
904f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            return;
905f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
906f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
9078868aa1b2d199e7fa869c9c5fad3079175621002Wu-cheng Li        int supported = item.getSupportedOperations();
908898a2f4540635528a0916b0a6b0a177869854ae9Wu-cheng Li        boolean playVideo = (mSecureAlbum == null) &&
9098868aa1b2d199e7fa869c9c5fad3079175621002Wu-cheng Li                ((supported & MediaItem.SUPPORT_PLAY) != 0);
910bef18c1e167f5835c8f854e76a91da63b700f93bWu-cheng Li        boolean viewPanorama = (mSecureAlbum == null) &&
9118868aa1b2d199e7fa869c9c5fad3079175621002Wu-cheng Li                ((supported & MediaItem.SUPPORT_PANORAMA) != 0);
9128868aa1b2d199e7fa869c9c5fad3079175621002Wu-cheng Li        boolean unlock = ((supported & MediaItem.SUPPORT_UNLOCK) != 0);
913f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
914f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        if (playVideo) {
915f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            // determine if the point is at center (1/6) of the photo view.
916f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            // (The position of the "play" icon is at center (1/6) of the photo)
917f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            int w = mPhotoView.getWidth();
918f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            int h = mPhotoView.getHeight();
919f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            playVideo = (Math.abs(x - w / 2) * 12 <= w)
920f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                && (Math.abs(y - h / 2) * 12 <= h);
921f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
922f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
923f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        if (playVideo) {
924898a2f4540635528a0916b0a6b0a177869854ae9Wu-cheng Li            playVideo(mActivity, item.getPlayUri(), item.getName());
92583be4e0c9b8e3372eff8f9b1a396afd961b72921Angus Kong        } else if (viewPanorama) {
926f8a39c644637a15b9291eb9299762b8cf91cd76aGeorge Mount            LightCycleHelper.viewPanorama(mActivity, item.getContentUri());
9278868aa1b2d199e7fa869c9c5fad3079175621002Wu-cheng Li        } else if (unlock) {
9288868aa1b2d199e7fa869c9c5fad3079175621002Wu-cheng Li            mActivity.getStateManager().finishState(this);
929f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        } else {
93061f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang            toggleBars();
931f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
932f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
933f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
934bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    @Override
935bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    public void lockOrientation() {
936bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang        mHandler.sendEmptyMessage(MSG_LOCK_ORIENTATION);
937bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    }
938bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang
939bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    @Override
940bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    public void unlockOrientation() {
94106c6401eededc2ec842ba4994a838c2ded0a666cPin Ting        mHandler.sendEmptyMessage(MSG_UNLOCK_ORIENTATION);
942bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    }
943bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang
944bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    @Override
94561f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang    public void onActionBarAllowed(boolean allowed) {
94661f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang        mActionBarAllowed = allowed;
94761f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang        mHandler.sendEmptyMessage(MSG_UPDATE_ACTION_BAR);
94861f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang    }
94961f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang
95061f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang    @Override
951e6251df06f0b3c8f556043f8b725b4b19be7474dChih-Chung Chang    public void onActionBarWanted() {
952e6251df06f0b3c8f556043f8b725b4b19be7474dChih-Chung Chang        mHandler.sendEmptyMessage(MSG_WANT_BARS);
953e6251df06f0b3c8f556043f8b725b4b19be7474dChih-Chung Chang    }
954e6251df06f0b3c8f556043f8b725b4b19be7474dChih-Chung Chang
955e6251df06f0b3c8f556043f8b725b4b19be7474dChih-Chung Chang    @Override
956bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    public void onFullScreenChanged(boolean full) {
957bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang        Message m = mHandler.obtainMessage(
958bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang                MSG_ON_FULL_SCREEN_CHANGED, full ? 1 : 0, 0);
959bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang        m.sendToTarget();
960bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    }
961bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang
9626b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang    // How we do delete/undo:
9636b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang    //
9646b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang    // When the user choose to delete a media item, we just tell the
9656b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang    // FilterDeleteSet to hide that item. If the user choose to undo it, we
9666b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang    // again tell FilterDeleteSet not to hide it. If the user choose to commit
9676b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang    // the deletion, we then actually delete the media item.
9686b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang    @Override
9696b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang    public void onDeleteImage(Path path, int offset) {
9706118af9ddad8acc050133154f8f60c842c7f9bfaChih-Chung Chang        onCommitDeleteImage();  // commit the previous deletion
9716b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang        mDeletePath = path;
9726b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang        mDeleteIsFocus = (offset == 0);
9736118af9ddad8acc050133154f8f60c842c7f9bfaChih-Chung Chang        mMediaSet.addDeletion(path, mCurrentIndex + offset);
9746b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang    }
9756b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang
9766b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang    @Override
9776b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang    public void onUndoDeleteImage() {
9786118af9ddad8acc050133154f8f60c842c7f9bfaChih-Chung Chang        if (mDeletePath == null) return;
9796b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang        // If the deletion was done on the focused item, we want the model to
9806b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang        // focus on it when it is undeleted.
9816b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang        if (mDeleteIsFocus) mModel.setFocusHintPath(mDeletePath);
9826118af9ddad8acc050133154f8f60c842c7f9bfaChih-Chung Chang        mMediaSet.removeDeletion(mDeletePath);
9836b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang        mDeletePath = null;
9846b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang    }
9856b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang
9866b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang    @Override
9876b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang    public void onCommitDeleteImage() {
9886b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang        if (mDeletePath == null) return;
9896b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang        mSelectionManager.deSelectAll();
9906b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang        mSelectionManager.toggle(mDeletePath);
9916b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang        mMenuExecutor.onMenuClicked(R.id.action_delete, null, true, false);
9926b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang        mDeletePath = null;
9936b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang    }
9946b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang
995f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public static void playVideo(Activity activity, Uri uri, String title) {
996f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        try {
997f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            Intent intent = new Intent(Intent.ACTION_VIEW)
998a3871050845b4921379add2b126add3cfbab1109Ray Chen                    .setDataAndType(uri, "video/*")
999a3871050845b4921379add2b126add3cfbab1109Ray Chen                    .putExtra(Intent.EXTRA_TITLE, title)
1000a3871050845b4921379add2b126add3cfbab1109Ray Chen                    .putExtra(MovieActivity.KEY_TREAT_UP_AS_BACK, true);
100171cd89a38752bc22ae0ec2df965e4280b776623cChih-Chung Chang            activity.startActivityForResult(intent, REQUEST_PLAY_VIDEO);
1002f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        } catch (ActivityNotFoundException e) {
1003f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            Toast.makeText(activity, activity.getString(R.string.video_err),
1004f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                    Toast.LENGTH_SHORT).show();
1005f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
1006f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
1007f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
1008f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang    private void setCurrentPhotoByIntent(Intent intent) {
1009f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang        if (intent == null) return;
1010f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang        Path path = mApplication.getDataManager()
1011f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang                .findPathByUri(intent.getData(), intent.getType());
1012f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang        if (path != null) {
1013f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang            mModel.setCurrentPhoto(path, mCurrentIndex);
1014f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang        }
1015f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang    }
1016f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang
1017f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    @Override
1018f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    protected void onStateResult(int requestCode, int resultCode, Intent data) {
101971cd89a38752bc22ae0ec2df965e4280b776623cChih-Chung Chang        mHasActivityResult = true;
1020f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        switch (requestCode) {
1021f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang            case REQUEST_EDIT:
1022f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang                setCurrentPhotoByIntent(data);
1023f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang                break;
1024f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            case REQUEST_CROP:
1025f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                if (resultCode == Activity.RESULT_OK) {
1026f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang                    setCurrentPhotoByIntent(data);
1027f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                }
1028f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                break;
1029f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            case REQUEST_CROP_PICASA: {
1030f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang                if (resultCode == Activity.RESULT_OK) {
1031f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang                    Context context = mActivity.getAndroidContext();
103288cc2ca5f5596762a5546ec7426756f2036be455Yuli Huang                    String message = context.getString(R.string.crop_saved,
1033f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang                            context.getString(R.string.folder_download));
1034f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang                    Toast.makeText(context, message, Toast.LENGTH_SHORT).show();
1035f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang                }
1036f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                break;
1037f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            }
1038f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            case REQUEST_SLIDESHOW: {
1039f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                if (data == null) break;
1040f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                String path = data.getStringExtra(SlideshowPage.KEY_ITEM_PATH);
1041f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                int index = data.getIntExtra(SlideshowPage.KEY_PHOTO_INDEX, 0);
1042f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                if (path != null) {
1043f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                    mModel.setCurrentPhoto(Path.fromString(path), index);
1044f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                }
1045f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            }
1046f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
1047f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
1048f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
104914d3289b4867c21da93ec4032119c0091bc78c30George Mount    @Override
105014d3289b4867c21da93ec4032119c0091bc78c30George Mount    protected void clearStateResult() {
105114d3289b4867c21da93ec4032119c0091bc78c30George Mount        mHasActivityResult = false;
105214d3289b4867c21da93ec4032119c0091bc78c30George Mount    }
105314d3289b4867c21da93ec4032119c0091bc78c30George Mount
1054616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin    private class PreparePhotoFallback implements OnGLIdleListener {
1055616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin        private PhotoFallbackEffect mPhotoFallback = new PhotoFallbackEffect();
1056616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin        private boolean mResultReady = false;
1057616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin
1058616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin        public synchronized PhotoFallbackEffect get() {
1059616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin            while (!mResultReady) {
1060616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin                Utils.waitWithoutInterrupt(this);
1061616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin            }
1062616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin            return mPhotoFallback;
1063616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin        }
1064616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin
1065616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin        @Override
1066616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin        public boolean onGLIdle(GLCanvas canvas, boolean renderRequested) {
1067616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin            mPhotoFallback = mPhotoView.buildFallbackEffect(mRootPane, canvas);
1068616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin            synchronized (this) {
1069616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin                mResultReady = true;
1070616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin                notifyAll();
1071616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin            }
1072616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin            return false;
1073616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin        }
1074616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin    }
1075616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin
1076616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin    private void preparePhotoFallbackView() {
1077616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin        GLRoot root = mActivity.getGLRoot();
1078616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin        PreparePhotoFallback task = new PreparePhotoFallback();
1079616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin        root.unlockRenderThread();
1080616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin        PhotoFallbackEffect anim;
1081616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin        try {
1082616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin            root.addOnGLIdleListener(task);
1083616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin            anim = task.get();
1084616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin        } finally {
1085616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin            root.lockRenderThread();
1086616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin        }
1087616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin        mActivity.getTransitionStore().put(
1088616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin                AlbumPage.KEY_RESUME_ANIMATION, anim);
1089616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin    }
1090616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin
1091f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    @Override
1092f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public void onPause() {
1093d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin        super.onPause();
1094d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin        mIsActive = false;
1095d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin
1096bd7c016d728853d38f98a3c6077b7bd9b08858b9Yuli Huang        mActivity.getGLRoot().unfreeze();
1097bd7c016d728853d38f98a3c6077b7bd9b08858b9Yuli Huang        mHandler.removeMessages(MSG_UNFREEZE_GLROOT);
1098253c5aec7692afdd7880fbd169d4b44d5679cbc0Chih-Chung Chang
10994105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen        DetailsHelper.pause();
1100d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu        if (mModel != null) {
1101d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu            if (isFinishing()) preparePhotoFallbackView();
1102d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu            mModel.pause();
1103d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu        }
1104f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mPhotoView.pause();
1105f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mHandler.removeMessages(MSG_HIDE_BARS);
1106f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mActionBar.removeOnMenuVisibilityListener(mMenuVisibilityListener);
110733ef03776b7734717b16f6fc861b831fb1b1dfacMartijn Coenen
11086b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang        onCommitDeleteImage();
11092785956f8f5654966a41e20f482f4af3057eea3fChih-Chung Chang        mMenuExecutor.pause();
11106118af9ddad8acc050133154f8f60c842c7f9bfaChih-Chung Chang        if (mMediaSet != null) mMediaSet.clearDeletion();
1111f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
1112f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
1113f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    @Override
1114bd7c016d728853d38f98a3c6077b7bd9b08858b9Yuli Huang    public void onCurrentImageUpdated() {
1115bd7c016d728853d38f98a3c6077b7bd9b08858b9Yuli Huang        mActivity.getGLRoot().unfreeze();
1116bd7c016d728853d38f98a3c6077b7bd9b08858b9Yuli Huang    }
1117bd7c016d728853d38f98a3c6077b7bd9b08858b9Yuli Huang
11187eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu    private void setGridButtonVisibility(boolean enabled) {
11197eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu        Menu menu = mActionBar.getMenu();
11207eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu        if (menu == null) return;
11217eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu        MenuItem item = menu.findItem(R.id.action_grid);
1122fc3651d38708c6475b808b6fad27ee66bdd6ee04Wu-cheng Li        if (item != null) item.setVisible((mSecureAlbum == null) && enabled);
11237eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu    }
11247eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu
11257eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu    public void onFilmModeChanged(boolean enabled) {
11267eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu        mHandler.sendEmptyMessage(MSG_REFRESH_GRID_BUTTON);
1127f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu        mHandler.sendEmptyMessage(MSG_REFRESH_BOTTOM_CONTROLS);
11287eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu        if (enabled) {
11297eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu            mHandler.removeMessages(MSG_HIDE_BARS);
11307eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu        } else {
11317eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu            refreshHidingMessage();
11327eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu        }
11337eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu    }
11347eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu
11357eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu    private void transitionFromAlbumPageIfNeeded() {
11367eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu        TransitionStore transitions = mActivity.getTransitionStore();
11377eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu
11387eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu        int albumPageTransition = transitions.get(
11397eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu                KEY_ALBUMPAGE_TRANSITION, MSG_ALBUMPAGE_NONE);
11407eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu
114100ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu        if (albumPageTransition == MSG_ALBUMPAGE_NONE && mAppBridge != null) {
114200ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu            // Generally, resuming the PhotoPage when in Camera should
114300ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu            // reset to the capture mode to allow quick photo taking
114400ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu            mCurrentIndex = 0;
114500ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu            mPhotoView.resetToFirstPicture();
114600ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu        } else {
114700ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu            int resumeIndex = transitions.get(KEY_INDEX_HINT, -1);
114800ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu            if (resumeIndex >= 0) {
114900ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu                if (mAppBridge != null) {
115000ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu                    // Account for live preview being the first item
115100ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu                    resumeIndex++;
115200ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu                }
115300ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu                if (resumeIndex < mMediaSet.getMediaItemCount()) {
115400ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu                    mCurrentIndex = resumeIndex;
115500ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu                    mModel.moveTo(mCurrentIndex);
115600ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu                }
115700ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu            }
115800ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu        }
115900ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu
116000ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu        if (albumPageTransition == MSG_ALBUMPAGE_RESUMED) {
116100ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu            mPhotoView.setFilmMode(mStartInFilmstrip || mAppBridge != null);
116200ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu        } else if (albumPageTransition == MSG_ALBUMPAGE_PICKED) {
116300ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu            mPhotoView.setFilmMode(false);
11647eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu        }
11657eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu
116651bc561e85053abfd7fda695e3cd20710acca85cBobby Georgescu        mFadeOutTexture = transitions.get(PreparePageFadeoutTexture.KEY_FADE_TEXTURE);
11677eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu        if (mFadeOutTexture != null) {
11687eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu            mBackgroundFade.start();
11697eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu            BitmapScreenNail.disableDrawPlaceholder();
11707eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu            mOpenAnimationRect =
11717eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu                    albumPageTransition == MSG_ALBUMPAGE_NONE ?
11727eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu                    (Rect) mData.getParcelable(KEY_OPEN_ANIMATION_RECT) :
11737eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu                    (Rect) transitions.get(KEY_OPEN_ANIMATION_RECT);
11747eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu            mPhotoView.setOpenAnimationRect(mOpenAnimationRect);
11757eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu            mBackgroundFade.start();
11767eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu        }
11777eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu    }
11787eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu
1179bd7c016d728853d38f98a3c6077b7bd9b08858b9Yuli Huang    @Override
1180f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    protected void onResume() {
1181f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        super.onResume();
11827eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu
1183d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu        if (mModel == null) {
1184d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu            mActivity.getStateManager().finishState(this);
1185d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu            return;
1186d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu        }
11877eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu        transitionFromAlbumPageIfNeeded();
11887eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu
1189d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin        mActivity.getGLRoot().freeze();
1190f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mIsActive = true;
1191f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        setContentPane(mRootPane);
119204ac045bf8da5082bbb0bdc9ea5f9c9b5b796ad0Yuli Huang
1193f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mModel.resume();
1194f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mPhotoView.resume();
1195898a2f4540635528a0916b0a6b0a177869854ae9Wu-cheng Li        mActionBar.setDisplayOptions(
1196898a2f4540635528a0916b0a6b0a177869854ae9Wu-cheng Li                ((mSecureAlbum == null) && (mSetPathString != null)), true);
1197f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mActionBar.addOnMenuVisibilityListener(mMenuVisibilityListener);
119800ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu        if (!mShowBars) {
119900ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu            mActionBar.hide();
120000ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu            mActivity.getGLRoot().setLightsOutMode(true);
1201bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang        }
120200ccf35f8ec016b2cb8fdcf0c65ba643dca54a14Bobby Georgescu
120371cd89a38752bc22ae0ec2df965e4280b776623cChih-Chung Chang        mHasActivityResult = false;
1204bd7c016d728853d38f98a3c6077b7bd9b08858b9Yuli Huang        mHandler.sendEmptyMessageDelayed(MSG_UNFREEZE_GLROOT, UNFREEZE_GLROOT_TIMEOUT);
1205f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
1206f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
120715b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang    @Override
120815b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang    protected void onDestroy() {
1209bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang        if (mAppBridge != null) {
1210253c5aec7692afdd7880fbd169d4b44d5679cbc0Chih-Chung Chang            mAppBridge.setServer(null);
12113b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang            mScreenNailItem.setScreenNail(null);
1212bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang            mAppBridge.detachScreenNail();
1213bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang            mAppBridge = null;
12143b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang            mScreenNailSet = null;
12153b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang            mScreenNailItem = null;
1216b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang        }
1217bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang        mOrientationManager.removeListener(this);
12182ef46ed28b28b355d7f3f1432c7b1196b832a859Chih-Chung Chang        mActivity.getGLRoot().setOrientationSource(null);
1219f44499dda32783cc74643723ed01ce636e81b186Bobby Georgescu        if (mBottomControls != null) mBottomControls.cleanup();
1220aeb3062e84ed28f0e25a73f511f287ae0a3e4294Chih-Chung Chang
1221aeb3062e84ed28f0e25a73f511f287ae0a3e4294Chih-Chung Chang        // Remove all pending messages.
1222aeb3062e84ed28f0e25a73f511f287ae0a3e4294Chih-Chung Chang        mHandler.removeCallbacksAndMessages(null);
122315b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang        super.onDestroy();
122415b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang    }
122515b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang
1226f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private class MyDetailsSource implements DetailsSource {
12276cf807453fb58ccd4cc513ff187b306c7090e67cOwen Lin
12286cf807453fb58ccd4cc513ff187b306c7090e67cOwen Lin        @Override
1229f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        public MediaDetails getDetails() {
1230616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin            return mModel.getMediaItem(0).getDetails();
1231f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
12326cf807453fb58ccd4cc513ff187b306c7090e67cOwen Lin
12336cf807453fb58ccd4cc513ff187b306c7090e67cOwen Lin        @Override
1234f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        public int size() {
1235f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            return mMediaSet != null ? mMediaSet.getMediaItemCount() : 1;
1236f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
12376cf807453fb58ccd4cc513ff187b306c7090e67cOwen Lin
12386cf807453fb58ccd4cc513ff187b306c7090e67cOwen Lin        @Override
1239995c4566bed7df1aa48ba7e1351f964efa73880bMichael Kolb        public int setIndex() {
1240995c4566bed7df1aa48ba7e1351f964efa73880bMichael Kolb            return mModel.getCurrentIndex();
12414105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen        }
1242f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
1243f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin}
1244