PhotoPage.java revision f8a39c644637a15b9291eb9299762b8cf91cd76a
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;
29604f053d040782159b61d3b74ee533bc2c0ccdd0Ray Chenimport android.os.Bundle;
30604f053d040782159b61d3b74ee533bc2c0ccdd0Ray Chenimport android.os.Handler;
31604f053d040782159b61d3b74ee533bc2c0ccdd0Ray Chenimport android.os.Message;
32a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescuimport android.view.View;
33a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescuimport android.view.View.OnClickListener;
34f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescuimport android.view.animation.AccelerateInterpolator;
35a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescuimport android.widget.ImageView;
36a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescuimport android.widget.RelativeLayout;
37604f053d040782159b61d3b74ee533bc2c0ccdd0Ray Chenimport android.widget.Toast;
38604f053d040782159b61d3b74ee533bc2c0ccdd0Ray Chen
39b21b8e58a604f6c701245d84b141b5b87663192bOwen Linimport com.actionbarsherlock.app.ActionBar.OnMenuVisibilityListener;
40b21b8e58a604f6c701245d84b141b5b87663192bOwen Linimport com.actionbarsherlock.view.Menu;
41b21b8e58a604f6c701245d84b141b5b87663192bOwen Linimport com.actionbarsherlock.view.MenuItem;
42f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.R;
43f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescuimport com.android.gallery3d.anim.FloatAnimation;
44fc86994f86f8cfb31e151c9e730dc1e9dc7b3349Yuli Huangimport com.android.gallery3d.common.ApiHelper;
45616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Linimport com.android.gallery3d.common.Utils;
46f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.data.DataManager;
476b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Changimport com.android.gallery3d.data.FilterDeleteSet;
48f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.data.MediaDetails;
49f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.data.MediaItem;
50f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.data.MediaObject;
51f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.data.MediaSet;
526b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Changimport com.android.gallery3d.data.MtpSource;
53f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.data.Path;
54a0ce682e40c39ce046c48d8a7f989fff01bb9f2cWu-cheng Liimport com.android.gallery3d.data.SecureAlbum;
55a0ce682e40c39ce046c48d8a7f989fff01bb9f2cWu-cheng Liimport com.android.gallery3d.data.SecureSource;
563b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Changimport com.android.gallery3d.data.SnailAlbum;
573b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Changimport com.android.gallery3d.data.SnailItem;
5815b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Changimport com.android.gallery3d.data.SnailSource;
59f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.picasasource.PicasaSource;
60f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescuimport com.android.gallery3d.ui.AnimationTime;
6124081fe26ca25448ddb9c8f9cc7f406d26344decOwen Linimport com.android.gallery3d.ui.BitmapScreenNail;
624105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chenimport com.android.gallery3d.ui.DetailsHelper;
634105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chenimport com.android.gallery3d.ui.DetailsHelper.CloseListener;
644105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chenimport com.android.gallery3d.ui.DetailsHelper.DetailsSource;
65f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.ui.GLCanvas;
66616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Linimport com.android.gallery3d.ui.GLRoot;
67616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Linimport com.android.gallery3d.ui.GLRoot.OnGLIdleListener;
68f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.ui.GLView;
69f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.ui.ImportCompleteListener;
70f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.ui.MenuExecutor;
71616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Linimport com.android.gallery3d.ui.PhotoFallbackEffect;
7221a412c93c9b0401b039f4eb86d4950752e5bb84Owen Linimport com.android.gallery3d.ui.PhotoView;
7351bc561e85053abfd7fda695e3cd20710acca85cBobby Georgescuimport com.android.gallery3d.ui.PreparePageFadeoutTexture;
74f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescuimport com.android.gallery3d.ui.RawTexture;
75f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.ui.SelectionManager;
76f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.ui.SynchronizedHandler;
77f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.util.GalleryUtils;
78c6781c0c0d8d193863ca09455a5bda3d542db493Bobby Georgescuimport com.android.gallery3d.util.LightCycleHelper;
7966ca848b2f58b813d366642088d274a1b7c4a90cChih-Chung Changimport com.android.gallery3d.util.MediaSetUtils;
80f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
81bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Changpublic class PhotoPage extends ActivityState implements
8261f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang        PhotoView.Listener, OrientationManager.Listener, AppBridge.Server {
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;
93a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu    private static final int MSG_REFRESH_EDIT_BUTTON = 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";
113f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
1147eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu    public static final String KEY_ALBUMPAGE_TRANSITION = "albumpage-transition";
1157eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu    public static final int MSG_ALBUMPAGE_NONE = 0;
1167eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu    public static final int MSG_ALBUMPAGE_STARTED = 1;
1177eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu    public static final int MSG_ALBUMPAGE_RESUMED = 2;
1187eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu    public static final int MSG_ALBUMPAGE_PICKED = 4;
1197eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu
120a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu    public static final String ACTION_NEXTGEN_EDIT = "action_nextgen_edit";
121a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu
122f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private GalleryApp mApplication;
123f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private SelectionManager mSelectionManager;
124f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
125f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private PhotoView mPhotoView;
126f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private PhotoPage.Model mModel;
1274105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen    private DetailsHelper mDetailsHelper;
128f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private boolean mShowDetails;
129f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
130f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    // mMediaSet could be null if there is no KEY_MEDIA_SET_PATH supplied.
131f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    // E.g., viewing a photo in gmail attachment
1326b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang    private FilterDeleteSet mMediaSet;
133f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
134a0ce682e40c39ce046c48d8a7f989fff01bb9f2cWu-cheng Li    // The mediaset used by camera launched from secure lock screen.
135a0ce682e40c39ce046c48d8a7f989fff01bb9f2cWu-cheng Li    private SecureAlbum mSecureAlbum;
136a0ce682e40c39ce046c48d8a7f989fff01bb9f2cWu-cheng Li
137f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private int mCurrentIndex = 0;
138f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private Handler mHandler;
139113bfc77c4468411da9ae1290553c3be89f8df9aOwen Lin    private boolean mShowBars = true;
14061f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang    private volatile boolean mActionBarAllowed = true;
1418cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen    private GalleryActionBar mActionBar;
142f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private boolean mIsMenuVisible;
143f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private MediaItem mCurrentPhoto = null;
144f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private MenuExecutor mMenuExecutor;
145f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private boolean mIsActive;
14684c220f10a643927c8a2126de8a755d8d7f7ec9eRay Chen    private String mSetPathString;
147b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang    // This is the original mSetPathString before adding the camera preview item.
148b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang    private String mOriginalSetPathString;
149bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    private AppBridge mAppBridge;
1503b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang    private SnailItem mScreenNailItem;
1513b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang    private SnailAlbum mScreenNailSet;
152bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    private OrientationManager mOrientationManager;
15371cd89a38752bc22ae0ec2df965e4280b776623cChih-Chung Chang    private boolean mHasActivityResult;
15454fe6202b6f7d233e7645c121321fe0f3d20fc8bYuli Huang    private boolean mTreatBackAsUp;
1557eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu    private boolean mStartInFilmstrip;
1567eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu    private boolean mStartedFromAlbumPage;
15715b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang
158f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu    private RawTexture mFadeOutTexture;
159f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu    private Rect mOpenAnimationRect;
1607eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu    public static final int ANIM_TIME_OPENING = 300;
161f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu
1626b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang    // The item that is deleted (but it can still be undeleted before commiting)
1636b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang    private Path mDeletePath;
1646b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang    private boolean mDeleteIsFocus;  // whether the deleted item was in focus
1656b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang
16633ef03776b7734717b16f6fc861b831fb1b1dfacMartijn Coenen    private NfcAdapter mNfcAdapter;
16733ef03776b7734717b16f6fc861b831fb1b1dfacMartijn Coenen
1682bb717f1ea38e2ce33dd102a23afe6bfacb5675cOwen Lin    private final MyMenuVisibilityListener mMenuVisibilityListener =
1692bb717f1ea38e2ce33dd102a23afe6bfacb5675cOwen Lin            new MyMenuVisibilityListener();
1702bb717f1ea38e2ce33dd102a23afe6bfacb5675cOwen Lin
171f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public static interface Model extends PhotoView.Model {
172f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        public void resume();
173f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        public void pause();
174f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        public boolean isEmpty();
175f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        public void setCurrentPhoto(Path path, int indexHint);
176f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
177f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
178f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private class MyMenuVisibilityListener implements OnMenuVisibilityListener {
17906c6401eededc2ec842ba4994a838c2ded0a666cPin Ting        @Override
180f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        public void onMenuVisibilityChanged(boolean isVisible) {
181f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            mIsMenuVisible = isVisible;
182f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            refreshHidingMessage();
183f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
184f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
185f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
186f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu    private static class BackgroundFadeOut extends FloatAnimation {
187f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu        public BackgroundFadeOut() {
188f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu            super(1f, 0f, ANIM_TIME_OPENING);
189f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu            setInterpolator(new AccelerateInterpolator(2f));
190f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu        }
191f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu    }
192f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu
193f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu    private final FloatAnimation mBackgroundFade = new BackgroundFadeOut();
194f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
195915c2c5b2c367df71599370613af0924bd7c4887Bobby Georgescu    @Override
196915c2c5b2c367df71599370613af0924bd7c4887Bobby Georgescu    protected int getBackgroundColorId() {
197915c2c5b2c367df71599370613af0924bd7c4887Bobby Georgescu        return R.color.photo_background;
198915c2c5b2c367df71599370613af0924bd7c4887Bobby Georgescu    }
199915c2c5b2c367df71599370613af0924bd7c4887Bobby Georgescu
200f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu    private final GLView mRootPane = new GLView() {
201f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        @Override
202f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        protected void renderBackground(GLCanvas view) {
20383be4e0c9b8e3372eff8f9b1a396afd961b72921Angus Kong            if (mFadeOutTexture != null) {
20483be4e0c9b8e3372eff8f9b1a396afd961b72921Angus Kong                if (mBackgroundFade.calculate(AnimationTime.get())) invalidate();
20583be4e0c9b8e3372eff8f9b1a396afd961b72921Angus Kong                if (!mBackgroundFade.isActive()) {
206f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu                    mFadeOutTexture = null;
207f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu                    mOpenAnimationRect = null;
208f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu                    BitmapScreenNail.enableDrawPlaceholder();
209f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu                } else {
210f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu                    float fadeAlpha = mBackgroundFade.get();
21183be4e0c9b8e3372eff8f9b1a396afd961b72921Angus Kong                    if (fadeAlpha < 1f) {
212915c2c5b2c367df71599370613af0924bd7c4887Bobby Georgescu                        view.clearBuffer(getBackgroundColor());
213f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu                        view.setAlpha(fadeAlpha);
214f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu                    }
215f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu                    mFadeOutTexture.draw(view, 0, 0);
21602ef48574ef7099ebaa0386bd6fd676bd2fd5489Bobby Georgescu                    view.setAlpha(1f - fadeAlpha);
217f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu                    return;
218f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu                }
219f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu            }
220915c2c5b2c367df71599370613af0924bd7c4887Bobby Georgescu            view.clearBuffer(getBackgroundColor());
221f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
222f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
223f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        @Override
224f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        protected void onLayout(
225f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                boolean changed, int left, int top, int right, int bottom) {
226f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            mPhotoView.layout(0, 0, right - left, bottom - top);
227f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            if (mShowDetails) {
2288cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen                mDetailsHelper.layout(left, mActionBar.getHeight(), right, bottom);
229f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            }
230f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
231f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    };
232f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
233f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    @Override
234f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public void onCreate(Bundle data, Bundle restoreState) {
23545c56f2d34c71d0bc9b84ebeef6d1314738d0fc0Bobby Georgescu        super.onCreate(data, restoreState);
2368cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen        mActionBar = mActivity.getGalleryActionBar();
237f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mSelectionManager = new SelectionManager(mActivity, false);
238f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mMenuExecutor = new MenuExecutor(mActivity, mSelectionManager);
239f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
240f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mPhotoView = new PhotoView(mActivity);
241bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang        mPhotoView.setListener(this);
242f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mRootPane.addComponent(mPhotoView);
24383be4e0c9b8e3372eff8f9b1a396afd961b72921Angus Kong        mApplication = (GalleryApp) ((Activity) mActivity).getApplication();
244bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang        mOrientationManager = mActivity.getOrientationManager();
245bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang        mOrientationManager.addListener(this);
2462ef46ed28b28b355d7f3f1432c7b1196b832a859Chih-Chung Chang        mActivity.getGLRoot().setOrientationSource(mOrientationManager);
247f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
248d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu        mHandler = new SynchronizedHandler(mActivity.getGLRoot()) {
249d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu            @Override
250d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu            public void handleMessage(Message message) {
251d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu                switch (message.what) {
252d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu                    case MSG_HIDE_BARS: {
253d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu                        hideBars();
254d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu                        break;
255d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu                    }
256d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu                    case MSG_REFRESH_GRID_BUTTON: {
257d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu                        setGridButtonVisibility(mPhotoView.getFilmMode());
258d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu                        break;
259d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu                    }
260d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu                    case MSG_REFRESH_EDIT_BUTTON: {
261d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu                        refreshEditButton();
262d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu                        break;
263d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu                    }
264d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu                    case MSG_LOCK_ORIENTATION: {
265d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu                        mOrientationManager.lockOrientation();
266d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu                        break;
267d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu                    }
268d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu                    case MSG_UNLOCK_ORIENTATION: {
269d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu                        mOrientationManager.unlockOrientation();
270d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu                        break;
271d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu                    }
272d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu                    case MSG_ON_FULL_SCREEN_CHANGED: {
273d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu                        mAppBridge.onFullScreenChanged(message.arg1 == 1);
274d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu                        break;
275d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu                    }
276d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu                    case MSG_UPDATE_ACTION_BAR: {
277d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu                        updateBars();
278d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu                        break;
279d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu                    }
280d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu                    case MSG_WANT_BARS: {
281d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu                        wantBars();
282d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu                        break;
283d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu                    }
284d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu                    case MSG_UNFREEZE_GLROOT: {
285d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu                        mActivity.getGLRoot().unfreeze();
286d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu                        break;
287d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu                    }
288d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu                    default: throw new AssertionError(message.what);
289d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu                }
290d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu            }
291d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu        };
292d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu
29384c220f10a643927c8a2126de8a755d8d7f7ec9eRay Chen        mSetPathString = data.getString(KEY_MEDIA_SET_PATH);
294b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang        mOriginalSetPathString = mSetPathString;
29533ef03776b7734717b16f6fc861b831fb1b1dfacMartijn Coenen        mNfcAdapter = NfcAdapter.getDefaultAdapter(mActivity.getAndroidContext());
2967eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu        String itemPathString = data.getString(KEY_MEDIA_ITEM_PATH);
2977eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu        Path itemPath = itemPathString != null ?
2987eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu                Path.fromString(data.getString(KEY_MEDIA_ITEM_PATH)) :
2997eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu                    null;
30054fe6202b6f7d233e7645c121321fe0f3d20fc8bYuli Huang        mTreatBackAsUp = data.getBoolean(KEY_TREAT_BACK_AS_UP, false);
3017eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu        mStartInFilmstrip =
3027eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu            data.getBoolean(KEY_START_IN_FILMSTRIP, false);
3037eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu        mStartedFromAlbumPage =
3047eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu                data.getInt(KEY_ALBUMPAGE_TRANSITION,
3057eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu                        MSG_ALBUMPAGE_NONE) == MSG_ALBUMPAGE_STARTED;
3067eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu        setGridButtonVisibility(!mStartedFromAlbumPage);
30784c220f10a643927c8a2126de8a755d8d7f7ec9eRay Chen        if (mSetPathString != null) {
308bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang            mAppBridge = (AppBridge) data.getParcelable(KEY_APP_BRIDGE);
309bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang            if (mAppBridge != null) {
3107eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu                mFlags |= FLAG_HIDE_ACTION_BAR | FLAG_HIDE_STATUS_BAR;
3117eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu                mShowBars = false;
3127eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu
313253c5aec7692afdd7880fbd169d4b44d5679cbc0Chih-Chung Chang                mAppBridge.setServer(this);
314bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang                mOrientationManager.lockOrientation();
315b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang
316bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang                // Get the ScreenNail from AppBridge and register it.
3173b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang                int id = SnailSource.newId();
318b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang                Path screenNailSetPath = SnailSource.getSetPath(id);
319bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang                Path screenNailItemPath = SnailSource.getItemPath(id);
3203b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang                mScreenNailSet = (SnailAlbum) mActivity.getDataManager()
3213b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang                        .getMediaObject(screenNailSetPath);
3223b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang                mScreenNailItem = (SnailItem) mActivity.getDataManager()
323bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang                        .getMediaObject(screenNailItemPath);
3243b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang                mScreenNailItem.setScreenNail(mAppBridge.attachScreenNail());
325b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang
326a0ce682e40c39ce046c48d8a7f989fff01bb9f2cWu-cheng Li                // Check if the path is a secure album.
327a0ce682e40c39ce046c48d8a7f989fff01bb9f2cWu-cheng Li                if (SecureSource.isSecurePath(mSetPathString)) {
328a0ce682e40c39ce046c48d8a7f989fff01bb9f2cWu-cheng Li                    mSecureAlbum = (SecureAlbum) mActivity.getDataManager()
329a0ce682e40c39ce046c48d8a7f989fff01bb9f2cWu-cheng Li                            .getMediaSet(mSetPathString);
330efd480e85dc5bd0d2ca0ac82d03e141212388830Wu-cheng Li                    // Set the flag to be on top of the lock screen.
331efd480e85dc5bd0d2ca0ac82d03e141212388830Wu-cheng Li                    mFlags |= FLAG_SHOW_WHEN_LOCKED;
332a0ce682e40c39ce046c48d8a7f989fff01bb9f2cWu-cheng Li                }
333a0ce682e40c39ce046c48d8a7f989fff01bb9f2cWu-cheng Li
3343b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang                // Combine the original MediaSet with the one for ScreenNail
3353b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang                // from AppBridge.
336b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang                mSetPathString = "/combo/item/{" + screenNailSetPath +
337b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang                        "," + mSetPathString + "}";
338b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang
339b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang                // Start from the screen nail.
340bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang                itemPath = screenNailItemPath;
341b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang            }
342b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang
3436118af9ddad8acc050133154f8f60c842c7f9bfaChih-Chung Chang            MediaSet originalSet = mActivity.getDataManager()
3446118af9ddad8acc050133154f8f60c842c7f9bfaChih-Chung Chang                    .getMediaSet(mSetPathString);
3456118af9ddad8acc050133154f8f60c842c7f9bfaChih-Chung Chang            mSelectionManager.setSourceMediaSet(originalSet);
3466b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang            mSetPathString = "/filter/delete/{" + mSetPathString + "}";
3476b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang            mMediaSet = (FilterDeleteSet) mActivity.getDataManager()
3486b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang                    .getMediaSet(mSetPathString);
349f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            mCurrentIndex = data.getInt(KEY_INDEX_HINT, 0);
350f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            if (mMediaSet == null) {
35184c220f10a643927c8a2126de8a755d8d7f7ec9eRay Chen                Log.w(TAG, "failed to restore " + mSetPathString);
352f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            }
3537eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu            if (itemPath == null) {
354d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu                if (mMediaSet.getMediaItemCount() > 0) {
355d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu                    itemPath = mMediaSet.getMediaItem(mCurrentIndex, 1)
356d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu                        .get(0).getPath();
357d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu                } else {
358d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu                    return;
359d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu                }
3607eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu            }
361f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            PhotoDataAdapter pda = new PhotoDataAdapter(
362bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang                    mActivity, mPhotoView, mMediaSet, itemPath, mCurrentIndex,
36343a80fd806247cb50e81bacda3ad21d210e9ae88Angus Kong                    mAppBridge == null ? -1 : 0,
364dbb6acc204ba6f095eb0e49e1298e9ceda2c3096Wu-cheng Li                    mAppBridge == null ? false : mAppBridge.isPanorama(),
365dbb6acc204ba6f095eb0e49e1298e9ceda2c3096Wu-cheng Li                    mAppBridge == null ? false : mAppBridge.isStaticCamera());
366f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            mModel = pda;
367f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            mPhotoView.setModel(mModel);
368f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
369f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            pda.setDataListener(new PhotoDataAdapter.DataListener() {
370f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
371113bfc77c4468411da9ae1290553c3be89f8df9aOwen Lin                @Override
372f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                public void onPhotoChanged(int index, Path item) {
373f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                    mCurrentIndex = index;
374f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                    if (item != null) {
375616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin                        MediaItem photo = mModel.getMediaItem(0);
376f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                        if (photo != null) updateCurrentPhoto(photo);
377f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                    }
37861f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang                    updateBars();
379f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                }
380f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
381f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                @Override
382f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                public void onLoadingFinished() {
383f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                    if (!mModel.isEmpty()) {
384616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin                        MediaItem photo = mModel.getMediaItem(0);
385f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                        if (photo != null) updateCurrentPhoto(photo);
386f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                    } else if (mIsActive) {
387c370476adcf29f311ceec70a119792a0168781e9Chih-Chung Chang                        // We only want to finish the PhotoPage if there is no
388c370476adcf29f311ceec70a119792a0168781e9Chih-Chung Chang                        // deletion that the user can undo.
389c370476adcf29f311ceec70a119792a0168781e9Chih-Chung Chang                        if (mMediaSet.getNumberOfDeletions() == 0) {
390c370476adcf29f311ceec70a119792a0168781e9Chih-Chung Chang                            mActivity.getStateManager().finishState(
391c370476adcf29f311ceec70a119792a0168781e9Chih-Chung Chang                                    PhotoPage.this);
392c370476adcf29f311ceec70a119792a0168781e9Chih-Chung Chang                        }
393f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                    }
394f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                }
395f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
396f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                @Override
397f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                public void onLoadingStarted() {
398f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                }
399f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            });
400f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        } else {
401f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            // Get default media set by the URI
402f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            MediaItem mediaItem = (MediaItem)
403f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                    mActivity.getDataManager().getMediaObject(itemPath);
404f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            mModel = new SinglePhotoDataAdapter(mActivity, mPhotoView, mediaItem);
405f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            mPhotoView.setModel(mModel);
406f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            updateCurrentPhoto(mediaItem);
407f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
408cf46a3abc26aac7cdb6b6993aeade053304b71d9Ray Chen
409b265ebb01cc046b74329eeb28dbecb24e0f953d2Bobby Georgescu        mPhotoView.setFilmMode(mStartInFilmstrip && mMediaSet.getMediaItemCount() > 1);
410a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu        setupEditButton();
411a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu    }
412a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu
413a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu    private ImageView mEditButton;
414a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu    private void setupEditButton() {
41558f898c9cc0228f084d903b5d27ae609cedfc9b9Wu-cheng Li        if (mSecureAlbum != null) return;
416a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu        RelativeLayout galleryRoot = (RelativeLayout) ((Activity) mActivity)
417a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu                .findViewById(mAppBridge != null ? R.id.content : R.id.gallery_root);
418a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu        if (galleryRoot == null) return;
419a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu
420a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu        mEditButton = new ImageView(mActivity);
421a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu        mEditButton.setImageResource(R.drawable.photoeditor_artistic);
422a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu        mEditButton.setOnClickListener(new OnClickListener() {
423a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu            @Override
424a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu            public void onClick(View arg0) {
425a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu                launchPhotoEditor();
426a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu            }
427a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu        });
428a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu        RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(
429a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu                RelativeLayout.LayoutParams.WRAP_CONTENT,
430a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu                RelativeLayout.LayoutParams.WRAP_CONTENT);
431a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu        lp.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM);
432a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu        galleryRoot.addView(mEditButton, lp);
433a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu        refreshEditButton();
434a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu    }
435a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu
436a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu    private void cleanupEditButton() {
43758f898c9cc0228f084d903b5d27ae609cedfc9b9Wu-cheng Li        if (mEditButton == null) return;
438a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu        RelativeLayout galleryRoot = (RelativeLayout) ((Activity) mActivity)
439a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu                .findViewById(mAppBridge != null ? R.id.content : R.id.gallery_root);
440a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu        if (galleryRoot == null) return;
441a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu        galleryRoot.removeView(mEditButton);
442a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu        mEditButton = null;
443a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu    }
444a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu
445a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu    private void refreshEditButton() {
446a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu        if (mEditButton == null) return;
447d4553b1337cf6729ee3bc572b9cb3841145db7ddBobby Georgescu        if (mShowBars && mCurrentPhoto != null && !mPhotoView.getFilmMode()
44814ad4efd409887a0f4cd90e29818c8c3bd2ece8fBobby Georgescu                && mCurrentPhoto.getMediaType() == MediaObject.MEDIA_TYPE_IMAGE) {
449a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu            mEditButton.setVisibility(View.VISIBLE);
450a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu        } else {
451a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu            mEditButton.setVisibility(View.GONE);
452a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu        }
453f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
454f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
4556772173d2a49b87a1d209f42fe52b5f830596f99Chih-Chung Chang    @TargetApi(ApiHelper.VERSION_CODES.JELLY_BEAN)
456fc86994f86f8cfb31e151c9e730dc1e9dc7b3349Yuli Huang    private void setNfcBeamPushUris(Uri[] uris) {
4576772173d2a49b87a1d209f42fe52b5f830596f99Chih-Chung Chang        if (mNfcAdapter != null && ApiHelper.HAS_SET_BEAM_PUSH_URIS) {
45824081fe26ca25448ddb9c8f9cc7f406d26344decOwen Lin            mNfcAdapter.setBeamPushUris(uris, mActivity);
459fc86994f86f8cfb31e151c9e730dc1e9dc7b3349Yuli Huang        }
460fc86994f86f8cfb31e151c9e730dc1e9dc7b3349Yuli Huang    }
461fc86994f86f8cfb31e151c9e730dc1e9dc7b3349Yuli Huang
462fb5571987f2555b04731b6f3e1c479efc16d542aWu-cheng Li    private Intent createShareIntent(Path path) {
463fb5571987f2555b04731b6f3e1c479efc16d542aWu-cheng Li        DataManager manager = mActivity.getDataManager();
464fb5571987f2555b04731b6f3e1c479efc16d542aWu-cheng Li        int type = manager.getMediaType(path);
465fb5571987f2555b04731b6f3e1c479efc16d542aWu-cheng Li        Intent intent = new Intent(Intent.ACTION_SEND);
466fb5571987f2555b04731b6f3e1c479efc16d542aWu-cheng Li        intent.setType(MenuExecutor.getMimeType(type));
4672bb717f1ea38e2ce33dd102a23afe6bfacb5675cOwen Lin        Uri uri = manager.getContentUri(path);
468fb5571987f2555b04731b6f3e1c479efc16d542aWu-cheng Li        intent.putExtra(Intent.EXTRA_STREAM, uri);
469fb5571987f2555b04731b6f3e1c479efc16d542aWu-cheng Li        return intent;
470fb5571987f2555b04731b6f3e1c479efc16d542aWu-cheng Li
471fb5571987f2555b04731b6f3e1c479efc16d542aWu-cheng Li    }
472fb5571987f2555b04731b6f3e1c479efc16d542aWu-cheng Li
473a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu    private void launchPhotoEditor() {
474a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu        MediaItem current = mModel.getMediaItem(0);
475a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu        if (current == null) return;
476a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu
477a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu        Intent intent = new Intent(ACTION_NEXTGEN_EDIT);
478a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu        intent.setData(mActivity.getDataManager().getContentUri(current.getPath())).setFlags(
479a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu                Intent.FLAG_GRANT_READ_URI_PERMISSION);
480a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu        if (mActivity.getPackageManager()
481a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu                .queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY).size() == 0) {
482a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu            intent.setAction(Intent.ACTION_EDIT);
483a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu        }
484a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu        ((Activity) mActivity).startActivityForResult(Intent.createChooser(intent, null),
485a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu                REQUEST_EDIT);
486a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu    }
487a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu
4882bb717f1ea38e2ce33dd102a23afe6bfacb5675cOwen Lin    private void updateShareURI(Path path) {
48924081fe26ca25448ddb9c8f9cc7f406d26344decOwen Lin        DataManager manager = mActivity.getDataManager();
49024081fe26ca25448ddb9c8f9cc7f406d26344decOwen Lin        Uri uri = manager.getContentUri(path);
49124081fe26ca25448ddb9c8f9cc7f406d26344decOwen Lin        mActionBar.setShareIntent(createShareIntent(path));
49224081fe26ca25448ddb9c8f9cc7f406d26344decOwen Lin        setNfcBeamPushUris(new Uri[]{uri});
493cf46a3abc26aac7cdb6b6993aeade053304b71d9Ray Chen    }
494cf46a3abc26aac7cdb6b6993aeade053304b71d9Ray Chen
495f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private void updateCurrentPhoto(MediaItem photo) {
496f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        if (mCurrentPhoto == photo) return;
497f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mCurrentPhoto = photo;
498f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        if (mCurrentPhoto == null) return;
499f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        updateMenuOperations();
500ed46d77c16cd80357f4a0feada2435dfba8104a6Yuli Huang        updateTitle();
50114ad4efd409887a0f4cd90e29818c8c3bd2ece8fBobby Georgescu        refreshEditButton();
502f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        if (mShowDetails) {
503995c4566bed7df1aa48ba7e1351f964efa73880bMichael Kolb            mDetailsHelper.reloadDetails();
504f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
505898a2f4540635528a0916b0a6b0a177869854ae9Wu-cheng Li        if ((mSecureAlbum == null)
506898a2f4540635528a0916b0a6b0a177869854ae9Wu-cheng Li                && (photo.getSupportedOperations() & MediaItem.SUPPORT_SHARE) != 0) {
50715b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang            updateShareURI(photo.getPath());
50815b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang        }
509f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
510f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
511ed46d77c16cd80357f4a0feada2435dfba8104a6Yuli Huang    private void updateTitle() {
512ed46d77c16cd80357f4a0feada2435dfba8104a6Yuli Huang        if (mCurrentPhoto == null) return;
513ed46d77c16cd80357f4a0feada2435dfba8104a6Yuli Huang        boolean showTitle = mActivity.getAndroidContext().getResources().getBoolean(
514ed46d77c16cd80357f4a0feada2435dfba8104a6Yuli Huang                R.bool.show_action_bar_title);
5152bb717f1ea38e2ce33dd102a23afe6bfacb5675cOwen Lin        if (showTitle && mCurrentPhoto.getName() != null) {
516ed46d77c16cd80357f4a0feada2435dfba8104a6Yuli Huang            mActionBar.setTitle(mCurrentPhoto.getName());
5172bb717f1ea38e2ce33dd102a23afe6bfacb5675cOwen Lin        } else {
518ed46d77c16cd80357f4a0feada2435dfba8104a6Yuli Huang            mActionBar.setTitle("");
5192bb717f1ea38e2ce33dd102a23afe6bfacb5675cOwen Lin        }
520ed46d77c16cd80357f4a0feada2435dfba8104a6Yuli Huang    }
521ed46d77c16cd80357f4a0feada2435dfba8104a6Yuli Huang
522f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private void updateMenuOperations() {
52324081fe26ca25448ddb9c8f9cc7f406d26344decOwen Lin        Menu menu = mActionBar.getMenu();
52424081fe26ca25448ddb9c8f9cc7f406d26344decOwen Lin
52524081fe26ca25448ddb9c8f9cc7f406d26344decOwen Lin        // it could be null if onCreateActionBar has not been called yet
52624081fe26ca25448ddb9c8f9cc7f406d26344decOwen Lin        if (menu == null) return;
52724081fe26ca25448ddb9c8f9cc7f406d26344decOwen Lin
5287eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu        setGridButtonVisibility(mPhotoView.getFilmMode());
5297eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu
53024081fe26ca25448ddb9c8f9cc7f406d26344decOwen Lin        MenuItem item = menu.findItem(R.id.action_slideshow);
531898a2f4540635528a0916b0a6b0a177869854ae9Wu-cheng Li        item.setVisible((mSecureAlbum == null) && canDoSlideShow());
5322066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang        if (mCurrentPhoto == null) return;
53324081fe26ca25448ddb9c8f9cc7f406d26344decOwen Lin
534f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        int supportedOperations = mCurrentPhoto.getSupportedOperations();
535898a2f4540635528a0916b0a6b0a177869854ae9Wu-cheng Li        if (mSecureAlbum != null) {
53624081fe26ca25448ddb9c8f9cc7f406d26344decOwen Lin            supportedOperations &= MediaObject.SUPPORT_DELETE;
537898a2f4540635528a0916b0a6b0a177869854ae9Wu-cheng Li        } else if (!GalleryUtils.isEditorAvailable(mActivity, "image/*")) {
538f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            supportedOperations &= ~MediaObject.SUPPORT_EDIT;
539f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
54024081fe26ca25448ddb9c8f9cc7f406d26344decOwen Lin        MenuExecutor.updateMenuOperation(menu, supportedOperations);
541f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
542f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
5432066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang    private boolean canDoSlideShow() {
5442066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang        if (mMediaSet == null || mCurrentPhoto == null) {
5452066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang            return false;
5462066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang        }
5472066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang        if (mCurrentPhoto.getMediaType() != MediaObject.MEDIA_TYPE_IMAGE) {
5482066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang            return false;
5492066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang        }
5506b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang        if (MtpSource.isMtpPath(mOriginalSetPathString)) {
5512066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang            return false;
5522066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang        }
5532066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang        return true;
5542066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang    }
5552066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang
55661f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang    //////////////////////////////////////////////////////////////////////////
55761f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang    //  Action Bar show/hide management
55861f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang    //////////////////////////////////////////////////////////////////////////
55961f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang
560f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private void showBars() {
561f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        if (mShowBars) return;
562f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mShowBars = true;
563e6251df06f0b3c8f556043f8b725b4b19be7474dChih-Chung Chang        mOrientationManager.unlockOrientation();
564f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mActionBar.show();
5650b2486cff0c1b951c54325596256b986307f7f3aChih-Chung Chang        mActivity.getGLRoot().setLightsOutMode(false);
56661f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang        refreshHidingMessage();
567a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu        refreshEditButton();
568f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
569f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
570f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private void hideBars() {
571f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        if (!mShowBars) return;
572f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mShowBars = false;
573f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mActionBar.hide();
5740b2486cff0c1b951c54325596256b986307f7f3aChih-Chung Chang        mActivity.getGLRoot().setLightsOutMode(true);
57561f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang        mHandler.removeMessages(MSG_HIDE_BARS);
576a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu        refreshEditButton();
577f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
578f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
579f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private void refreshHidingMessage() {
580f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mHandler.removeMessages(MSG_HIDE_BARS);
5817eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu        if (!mIsMenuVisible && !mPhotoView.getFilmMode()) {
582f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            mHandler.sendEmptyMessageDelayed(MSG_HIDE_BARS, HIDE_BARS_TIMEOUT);
583f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
584f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
585f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
586aeb3062e84ed28f0e25a73f511f287ae0a3e4294Chih-Chung Chang    private boolean canShowBars() {
587aeb3062e84ed28f0e25a73f511f287ae0a3e4294Chih-Chung Chang        // No bars if we are showing camera preview.
588aeb3062e84ed28f0e25a73f511f287ae0a3e4294Chih-Chung Chang        if (mAppBridge != null && mCurrentIndex == 0) return false;
589aeb3062e84ed28f0e25a73f511f287ae0a3e4294Chih-Chung Chang        // No bars if it's not allowed.
590aeb3062e84ed28f0e25a73f511f287ae0a3e4294Chih-Chung Chang        if (!mActionBarAllowed) return false;
591aeb3062e84ed28f0e25a73f511f287ae0a3e4294Chih-Chung Chang
592aeb3062e84ed28f0e25a73f511f287ae0a3e4294Chih-Chung Chang        return true;
593aeb3062e84ed28f0e25a73f511f287ae0a3e4294Chih-Chung Chang    }
594aeb3062e84ed28f0e25a73f511f287ae0a3e4294Chih-Chung Chang
595e6251df06f0b3c8f556043f8b725b4b19be7474dChih-Chung Chang    private void wantBars() {
596e6251df06f0b3c8f556043f8b725b4b19be7474dChih-Chung Chang        if (canShowBars()) showBars();
597e6251df06f0b3c8f556043f8b725b4b19be7474dChih-Chung Chang    }
598e6251df06f0b3c8f556043f8b725b4b19be7474dChih-Chung Chang
59961f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang    private void toggleBars() {
600f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        if (mShowBars) {
601f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            hideBars();
602aeb3062e84ed28f0e25a73f511f287ae0a3e4294Chih-Chung Chang        } else {
603e6251df06f0b3c8f556043f8b725b4b19be7474dChih-Chung Chang            if (canShowBars()) showBars();
604f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
605f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
606f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
60761f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang    private void updateBars() {
608e6251df06f0b3c8f556043f8b725b4b19be7474dChih-Chung Chang        if (!canShowBars()) {
60961f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang            hideBars();
61061f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang        }
611f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
612f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
613f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    @Override
6142ef46ed28b28b355d7f3f1432c7b1196b832a859Chih-Chung Chang    public void onOrientationCompensationChanged() {
6152ef46ed28b28b355d7f3f1432c7b1196b832a859Chih-Chung Chang        mActivity.getGLRoot().requestLayoutContentPane();
616bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    }
617bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang
618bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    @Override
619f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    protected void onBackPressed() {
620f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        if (mShowDetails) {
621f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            hideDetails();
6223b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang        } else if (mAppBridge == null || !switchWithCaptureAnimation(-1)) {
623bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang            // We are leaving this page. Set the result now.
624bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang            setResult();
6257eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu            if (mStartInFilmstrip && !mPhotoView.getFilmMode()) {
6267eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu                mPhotoView.setFilmMode(true);
6277eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu            } else if (mTreatBackAsUp) {
62854fe6202b6f7d233e7645c121321fe0f3d20fc8bYuli Huang                onUpPressed();
62954fe6202b6f7d233e7645c121321fe0f3d20fc8bYuli Huang            } else {
63054fe6202b6f7d233e7645c121321fe0f3d20fc8bYuli Huang                super.onBackPressed();
63154fe6202b6f7d233e7645c121321fe0f3d20fc8bYuli Huang            }
632f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
633f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
634f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
635b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang    private void onUpPressed() {
6367eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu        if (mStartInFilmstrip && !mPhotoView.getFilmMode()) {
6377eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu            mPhotoView.setFilmMode(true);
6387eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu            return;
6397eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu        }
6407eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu
641b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang        if (mActivity.getStateManager().getStateCount() > 1) {
6427eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu            setResult();
643b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang            super.onBackPressed();
644ba12eae90b5b1a80ee002aa0df8c5c5189c4faa3Chih-Chung Chang            return;
64566ca848b2f58b813d366642088d274a1b7c4a90cChih-Chung Chang        }
64666ca848b2f58b813d366642088d274a1b7c4a90cChih-Chung Chang
64766ca848b2f58b813d366642088d274a1b7c4a90cChih-Chung Chang        if (mOriginalSetPathString == null) return;
64866ca848b2f58b813d366642088d274a1b7c4a90cChih-Chung Chang
64966ca848b2f58b813d366642088d274a1b7c4a90cChih-Chung Chang        if (mAppBridge == null) {
650b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang            // We're in view mode so set up the stacks on our own.
651b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang            Bundle data = new Bundle(getData());
652b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang            data.putString(AlbumPage.KEY_MEDIA_PATH, mOriginalSetPathString);
653b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang            data.putString(AlbumPage.KEY_PARENT_MEDIA_PATH,
654b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang                    mActivity.getDataManager().getTopSetPath(
655b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang                            DataManager.INCLUDE_ALL));
656b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang            mActivity.getStateManager().switchState(this, AlbumPage.class, data);
65766ca848b2f58b813d366642088d274a1b7c4a90cChih-Chung Chang        } else {
65866ca848b2f58b813d366642088d274a1b7c4a90cChih-Chung Chang            // Start the real gallery activity to view the camera roll.
65966ca848b2f58b813d366642088d274a1b7c4a90cChih-Chung Chang            Uri uri = Uri.parse("content://media/external/file?bucketId="
66066ca848b2f58b813d366642088d274a1b7c4a90cChih-Chung Chang                    + MediaSetUtils.CAMERA_BUCKET_ID);
66166ca848b2f58b813d366642088d274a1b7c4a90cChih-Chung Chang            Intent intent = new Intent(Intent.ACTION_VIEW);
66266ca848b2f58b813d366642088d274a1b7c4a90cChih-Chung Chang            intent.setDataAndType(uri, ContentResolver.CURSOR_DIR_BASE_TYPE + "/image");
66366ca848b2f58b813d366642088d274a1b7c4a90cChih-Chung Chang            ((Activity) mActivity).startActivity(intent);
664b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang        }
665b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang    }
666b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang
667bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    private void setResult() {
668bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang        Intent result = null;
6697eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu        result = new Intent();
6707eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu        result.putExtra(KEY_RETURN_INDEX_HINT, mCurrentIndex);
671bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang        setStateResult(Activity.RESULT_OK, result);
672bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    }
673bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang
674bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    //////////////////////////////////////////////////////////////////////////
675bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    //  AppBridge.Server interface
676bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    //////////////////////////////////////////////////////////////////////////
677bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang
678bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    @Override
6792ef46ed28b28b355d7f3f1432c7b1196b832a859Chih-Chung Chang    public void setCameraRelativeFrame(Rect frame) {
6802ef46ed28b28b355d7f3f1432c7b1196b832a859Chih-Chung Chang        mPhotoView.setCameraRelativeFrame(frame);
681bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    }
682bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang
683bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    @Override
6842c6173822a612597c79be41b126367ddfbb5d518Chih-Chung Chang    public boolean switchWithCaptureAnimation(int offset) {
6852c6173822a612597c79be41b126367ddfbb5d518Chih-Chung Chang        return mPhotoView.switchWithCaptureAnimation(offset);
6862c6173822a612597c79be41b126367ddfbb5d518Chih-Chung Chang    }
6872c6173822a612597c79be41b126367ddfbb5d518Chih-Chung Chang
688f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    @Override
6896575794a9c09f22d5721e212c093e0a2df376d0cChih-Chung Chang    public void setSwipingEnabled(boolean enabled) {
6906575794a9c09f22d5721e212c093e0a2df376d0cChih-Chung Chang        mPhotoView.setSwipingEnabled(enabled);
6916575794a9c09f22d5721e212c093e0a2df376d0cChih-Chung Chang    }
6926575794a9c09f22d5721e212c093e0a2df376d0cChih-Chung Chang
6936575794a9c09f22d5721e212c093e0a2df376d0cChih-Chung Chang    @Override
6943b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang    public void notifyScreenNailChanged() {
6953b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang        mScreenNailItem.setScreenNail(mAppBridge.attachScreenNail());
6963b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang        mScreenNailSet.notifyChange();
6973b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang    }
6983b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang
6993b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang    @Override
700a0ce682e40c39ce046c48d8a7f989fff01bb9f2cWu-cheng Li    public void addSecureAlbumItem(boolean isVideo, int id) {
701a0ce682e40c39ce046c48d8a7f989fff01bb9f2cWu-cheng Li        mSecureAlbum.addMediaItem(isVideo, id);
702a0ce682e40c39ce046c48d8a7f989fff01bb9f2cWu-cheng Li    }
703a0ce682e40c39ce046c48d8a7f989fff01bb9f2cWu-cheng Li
704a0ce682e40c39ce046c48d8a7f989fff01bb9f2cWu-cheng Li    @Override
705f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    protected boolean onCreateActionBar(Menu menu) {
706b21b8e58a604f6c701245d84b141b5b87663192bOwen Lin        mActionBar.createActionBarMenu(R.menu.photo, menu);
707f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        updateMenuOperations();
708ed46d77c16cd80357f4a0feada2435dfba8104a6Yuli Huang        updateTitle();
709b21b8e58a604f6c701245d84b141b5b87663192bOwen Lin        return true;
710f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
711f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
712d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin    private MenuExecutor.ProgressListener mConfirmDialogListener =
713d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin            new MenuExecutor.ProgressListener() {
714d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin        @Override
715d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin        public void onProgressUpdate(int index) {}
716d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin
717d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin        @Override
718d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin        public void onProgressComplete(int result) {}
719d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin
720d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin        @Override
721d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin        public void onConfirmDialogShown() {
722d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin            mHandler.removeMessages(MSG_HIDE_BARS);
723d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin        }
724d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin
725d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin        @Override
726d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin        public void onConfirmDialogDismissed(boolean confirmed) {
727d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin            refreshHidingMessage();
728d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin        }
729ba50b9420e64731fd5aa8b1410e1f36457a1635aBobby Georgescu
730ba50b9420e64731fd5aa8b1410e1f36457a1635aBobby Georgescu        @Override
731ba50b9420e64731fd5aa8b1410e1f36457a1635aBobby Georgescu        public void onProgressStart() {}
732d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin    };
733d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin
734f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    @Override
735f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    protected boolean onItemSelected(MenuItem item) {
736d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu        if (mModel == null) return true;
737d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin        refreshHidingMessage();
738616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin        MediaItem current = mModel.getMediaItem(0);
739f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
740f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        if (current == null) {
741f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            // item is not ready, ignore
742f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            return true;
743f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
744f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
745f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        int currentIndex = mModel.getCurrentIndex();
746f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        Path path = current.getPath();
747f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
748f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        DataManager manager = mActivity.getDataManager();
749f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        int action = item.getItemId();
7509a033b07b8e0d9fe7419b7a0d876e9c7febf43c8Ray Chen        String confirmMsg = null;
751f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        switch (action) {
75284c220f10a643927c8a2126de8a755d8d7f7ec9eRay Chen            case android.R.id.home: {
753b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang                onUpPressed();
75484c220f10a643927c8a2126de8a755d8d7f7ec9eRay Chen                return true;
75584c220f10a643927c8a2126de8a755d8d7f7ec9eRay Chen            }
7567eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu            case R.id.action_grid: {
7577eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu                if (mStartedFromAlbumPage) {
7587eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu                    onUpPressed();
7597eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu                } else {
7607eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu                    preparePhotoFallbackView();
7617eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu                    Bundle data = new Bundle(getData());
7627eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu                    data.putString(AlbumPage.KEY_MEDIA_PATH, mOriginalSetPathString);
7637eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu                    data.putString(AlbumPage.KEY_PARENT_MEDIA_PATH,
7647eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu                            mActivity.getDataManager().getTopSetPath(
7657eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu                                    DataManager.INCLUDE_ALL));
7667eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu                    mActivity.getTransitionStore().put(
7677eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu                            KEY_RETURN_INDEX_HINT, mCurrentIndex);
7687eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu                    mActivity.getStateManager().startState(AlbumPage.class, data);
7697eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu                }
7707eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu                return true;
7717eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu            }
772f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            case R.id.action_slideshow: {
773f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                Bundle data = new Bundle();
7746cf807453fb58ccd4cc513ff187b306c7090e67cOwen Lin                data.putString(SlideshowPage.KEY_SET_PATH, mMediaSet.getPath().toString());
775604f053d040782159b61d3b74ee533bc2c0ccdd0Ray Chen                data.putString(SlideshowPage.KEY_ITEM_PATH, path.toString());
776f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                data.putInt(SlideshowPage.KEY_PHOTO_INDEX, currentIndex);
777f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                data.putBoolean(SlideshowPage.KEY_REPEAT, true);
778f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                mActivity.getStateManager().startStateForResult(
779f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                        SlideshowPage.class, REQUEST_SLIDESHOW, data);
780f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                return true;
781f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            }
782f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            case R.id.action_crop: {
783898a2f4540635528a0916b0a6b0a177869854ae9Wu-cheng Li                Activity activity = mActivity;
784f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                Intent intent = new Intent(CropImage.CROP_ACTION);
785f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                intent.setClass(activity, CropImage.class);
786f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                intent.setData(manager.getContentUri(path));
787f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                activity.startActivityForResult(intent, PicasaSource.isPicasaImage(current)
788f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                        ? REQUEST_CROP_PICASA
789f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                        : REQUEST_CROP);
790f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                return true;
791f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            }
79250ea2d2938218ac6b2039f0e42998cfbbc45d1f1Teng-Hui Zhu            case R.id.action_trim: {
7933f1f1baf3a674927e25cd5cd885fb372796bd3a0Teng-Hui Zhu                Intent intent = new Intent(mActivity, TrimVideo.class);
7943f1f1baf3a674927e25cd5cd885fb372796bd3a0Teng-Hui Zhu                intent.setData(manager.getContentUri(path));
7953f1f1baf3a674927e25cd5cd885fb372796bd3a0Teng-Hui Zhu                mActivity.startActivityForResult(intent, REQUEST_TRIM);
79650ea2d2938218ac6b2039f0e42998cfbbc45d1f1Teng-Hui Zhu                return true;
79750ea2d2938218ac6b2039f0e42998cfbbc45d1f1Teng-Hui Zhu            }
798f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang            case R.id.action_edit: {
799a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu                launchPhotoEditor();
800f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang                return true;
801f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang            }
802f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            case R.id.action_details: {
803f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                if (mShowDetails) {
804f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                    hideDetails();
805f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                } else {
806995c4566bed7df1aa48ba7e1351f964efa73880bMichael Kolb                    showDetails();
807f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                }
808f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                return true;
809f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            }
81067098d1a72fd04e2af06d3a5939cde28c65f70d9Ray Chen            case R.id.action_delete:
8119a033b07b8e0d9fe7419b7a0d876e9c7febf43c8Ray Chen                confirmMsg = mActivity.getResources().getQuantityString(
8129a033b07b8e0d9fe7419b7a0d876e9c7febf43c8Ray Chen                        R.plurals.delete_selection, 1);
813f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            case R.id.action_setas:
814f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            case R.id.action_rotate_ccw:
815f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            case R.id.action_rotate_cw:
816f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            case R.id.action_show_on_map:
817f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                mSelectionManager.deSelectAll();
818f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                mSelectionManager.toggle(path);
819d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin                mMenuExecutor.onMenuClicked(item, confirmMsg, mConfirmDialogListener);
820f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                return true;
821f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            case R.id.action_import:
822f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                mSelectionManager.deSelectAll();
823f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                mSelectionManager.toggle(path);
8249a033b07b8e0d9fe7419b7a0d876e9c7febf43c8Ray Chen                mMenuExecutor.onMenuClicked(item, confirmMsg,
825f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                        new ImportCompleteListener(mActivity));
826f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                return true;
827fb5571987f2555b04731b6f3e1c479efc16d542aWu-cheng Li            case R.id.action_share:
828898a2f4540635528a0916b0a6b0a177869854ae9Wu-cheng Li                Activity activity = mActivity;
829fb5571987f2555b04731b6f3e1c479efc16d542aWu-cheng Li                Intent intent = createShareIntent(mCurrentPhoto.getPath());
830fb5571987f2555b04731b6f3e1c479efc16d542aWu-cheng Li                activity.startActivity(Intent.createChooser(intent,
831fb5571987f2555b04731b6f3e1c479efc16d542aWu-cheng Li                        activity.getString(R.string.share)));
832fb5571987f2555b04731b6f3e1c479efc16d542aWu-cheng Li                return true;
833f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            default :
834f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                return false;
835f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
836f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
837f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
838f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private void hideDetails() {
839f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mShowDetails = false;
8404105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen        mDetailsHelper.hide();
841f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
842f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
843995c4566bed7df1aa48ba7e1351f964efa73880bMichael Kolb    private void showDetails() {
844f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mShowDetails = true;
8454105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen        if (mDetailsHelper == null) {
8464105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen            mDetailsHelper = new DetailsHelper(mActivity, mRootPane, new MyDetailsSource());
8474105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen            mDetailsHelper.setCloseListener(new CloseListener() {
84806c6401eededc2ec842ba4994a838c2ded0a666cPin Ting                @Override
849f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                public void onClose() {
850f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                    hideDetails();
851f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                }
852f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            });
853f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
8544105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen        mDetailsHelper.show();
855f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
856f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
857bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    ////////////////////////////////////////////////////////////////////////////
858bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    //  Callbacks from PhotoView
859bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    ////////////////////////////////////////////////////////////////////////////
860bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    @Override
861f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public void onSingleTapUp(int x, int y) {
862bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang        if (mAppBridge != null) {
863bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang            if (mAppBridge.onSingleTapUp(x, y)) return;
864014d9586d8145a33f4e99eaad570587f6d650026Wu-cheng Li        }
865014d9586d8145a33f4e99eaad570587f6d650026Wu-cheng Li
866616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin        MediaItem item = mModel.getMediaItem(0);
867b5dc542fbaeaf99bebdcf775ef0e034e89e88eaeWu-cheng Li        if (item == null || item == mScreenNailItem) {
868b5dc542fbaeaf99bebdcf775ef0e034e89e88eaeWu-cheng Li            // item is not ready or it is camera preview, ignore
869f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            return;
870f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
871f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
872898a2f4540635528a0916b0a6b0a177869854ae9Wu-cheng Li        boolean playVideo = (mSecureAlbum == null) &&
873898a2f4540635528a0916b0a6b0a177869854ae9Wu-cheng Li                ((item.getSupportedOperations() & MediaItem.SUPPORT_PLAY) != 0);
874bef18c1e167f5835c8f854e76a91da63b700f93bWu-cheng Li        boolean viewPanorama = (mSecureAlbum == null) &&
87583be4e0c9b8e3372eff8f9b1a396afd961b72921Angus Kong                (item.getSupportedOperations() & MediaItem.SUPPORT_VIEW_PANORAMA) != 0;
876f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
877f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        if (playVideo) {
878f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            // determine if the point is at center (1/6) of the photo view.
879f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            // (The position of the "play" icon is at center (1/6) of the photo)
880f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            int w = mPhotoView.getWidth();
881f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            int h = mPhotoView.getHeight();
882f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            playVideo = (Math.abs(x - w / 2) * 12 <= w)
883f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                && (Math.abs(y - h / 2) * 12 <= h);
884f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
885f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
886f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        if (playVideo) {
887898a2f4540635528a0916b0a6b0a177869854ae9Wu-cheng Li            playVideo(mActivity, item.getPlayUri(), item.getName());
88883be4e0c9b8e3372eff8f9b1a396afd961b72921Angus Kong        } else if (viewPanorama) {
889f8a39c644637a15b9291eb9299762b8cf91cd76aGeorge Mount            LightCycleHelper.viewPanorama(mActivity, item.getContentUri());
890f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        } else {
89161f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang            toggleBars();
892f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
893f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
894f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
895bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    @Override
896bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    public void lockOrientation() {
897bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang        mHandler.sendEmptyMessage(MSG_LOCK_ORIENTATION);
898bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    }
899bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang
900bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    @Override
901bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    public void unlockOrientation() {
90206c6401eededc2ec842ba4994a838c2ded0a666cPin Ting        mHandler.sendEmptyMessage(MSG_UNLOCK_ORIENTATION);
903bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    }
904bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang
905bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    @Override
90661f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang    public void onActionBarAllowed(boolean allowed) {
90761f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang        mActionBarAllowed = allowed;
90861f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang        mHandler.sendEmptyMessage(MSG_UPDATE_ACTION_BAR);
90961f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang    }
91061f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang
91161f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang    @Override
912e6251df06f0b3c8f556043f8b725b4b19be7474dChih-Chung Chang    public void onActionBarWanted() {
913e6251df06f0b3c8f556043f8b725b4b19be7474dChih-Chung Chang        mHandler.sendEmptyMessage(MSG_WANT_BARS);
914e6251df06f0b3c8f556043f8b725b4b19be7474dChih-Chung Chang    }
915e6251df06f0b3c8f556043f8b725b4b19be7474dChih-Chung Chang
916e6251df06f0b3c8f556043f8b725b4b19be7474dChih-Chung Chang    @Override
917bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    public void onFullScreenChanged(boolean full) {
918bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang        Message m = mHandler.obtainMessage(
919bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang                MSG_ON_FULL_SCREEN_CHANGED, full ? 1 : 0, 0);
920bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang        m.sendToTarget();
921bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    }
922bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang
9236b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang    // How we do delete/undo:
9246b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang    //
9256b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang    // When the user choose to delete a media item, we just tell the
9266b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang    // FilterDeleteSet to hide that item. If the user choose to undo it, we
9276b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang    // again tell FilterDeleteSet not to hide it. If the user choose to commit
9286b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang    // the deletion, we then actually delete the media item.
9296b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang    @Override
9306b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang    public void onDeleteImage(Path path, int offset) {
9316118af9ddad8acc050133154f8f60c842c7f9bfaChih-Chung Chang        onCommitDeleteImage();  // commit the previous deletion
9326b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang        mDeletePath = path;
9336b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang        mDeleteIsFocus = (offset == 0);
9346118af9ddad8acc050133154f8f60c842c7f9bfaChih-Chung Chang        mMediaSet.addDeletion(path, mCurrentIndex + offset);
9356b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang    }
9366b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang
9376b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang    @Override
9386b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang    public void onUndoDeleteImage() {
9396118af9ddad8acc050133154f8f60c842c7f9bfaChih-Chung Chang        if (mDeletePath == null) return;
9406b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang        // If the deletion was done on the focused item, we want the model to
9416b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang        // focus on it when it is undeleted.
9426b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang        if (mDeleteIsFocus) mModel.setFocusHintPath(mDeletePath);
9436118af9ddad8acc050133154f8f60c842c7f9bfaChih-Chung Chang        mMediaSet.removeDeletion(mDeletePath);
9446b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang        mDeletePath = null;
9456b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang    }
9466b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang
9476b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang    @Override
9486b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang    public void onCommitDeleteImage() {
9496b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang        if (mDeletePath == null) return;
9506b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang        mSelectionManager.deSelectAll();
9516b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang        mSelectionManager.toggle(mDeletePath);
9526b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang        mMenuExecutor.onMenuClicked(R.id.action_delete, null, true, false);
9536b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang        mDeletePath = null;
9546b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang    }
9556b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang
956f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public static void playVideo(Activity activity, Uri uri, String title) {
957f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        try {
958f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            Intent intent = new Intent(Intent.ACTION_VIEW)
959a3871050845b4921379add2b126add3cfbab1109Ray Chen                    .setDataAndType(uri, "video/*")
960a3871050845b4921379add2b126add3cfbab1109Ray Chen                    .putExtra(Intent.EXTRA_TITLE, title)
961a3871050845b4921379add2b126add3cfbab1109Ray Chen                    .putExtra(MovieActivity.KEY_TREAT_UP_AS_BACK, true);
96271cd89a38752bc22ae0ec2df965e4280b776623cChih-Chung Chang            activity.startActivityForResult(intent, REQUEST_PLAY_VIDEO);
963f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        } catch (ActivityNotFoundException e) {
964f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            Toast.makeText(activity, activity.getString(R.string.video_err),
965f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                    Toast.LENGTH_SHORT).show();
966f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
967f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
968f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
969f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang    private void setCurrentPhotoByIntent(Intent intent) {
970f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang        if (intent == null) return;
971f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang        Path path = mApplication.getDataManager()
972f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang                .findPathByUri(intent.getData(), intent.getType());
973f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang        if (path != null) {
974f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang            mModel.setCurrentPhoto(path, mCurrentIndex);
975f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang        }
976f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang    }
977f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang
978f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    @Override
979f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    protected void onStateResult(int requestCode, int resultCode, Intent data) {
98071cd89a38752bc22ae0ec2df965e4280b776623cChih-Chung Chang        mHasActivityResult = true;
981f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        switch (requestCode) {
982f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang            case REQUEST_EDIT:
983f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang                setCurrentPhotoByIntent(data);
984f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang                break;
985f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            case REQUEST_CROP:
986f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                if (resultCode == Activity.RESULT_OK) {
987f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang                    setCurrentPhotoByIntent(data);
988f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                }
989f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                break;
990f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            case REQUEST_CROP_PICASA: {
991f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang                if (resultCode == Activity.RESULT_OK) {
992f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang                    Context context = mActivity.getAndroidContext();
99388cc2ca5f5596762a5546ec7426756f2036be455Yuli Huang                    String message = context.getString(R.string.crop_saved,
994f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang                            context.getString(R.string.folder_download));
995f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang                    Toast.makeText(context, message, Toast.LENGTH_SHORT).show();
996f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang                }
997f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                break;
998f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            }
999f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            case REQUEST_SLIDESHOW: {
1000f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                if (data == null) break;
1001f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                String path = data.getStringExtra(SlideshowPage.KEY_ITEM_PATH);
1002f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                int index = data.getIntExtra(SlideshowPage.KEY_PHOTO_INDEX, 0);
1003f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                if (path != null) {
1004f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                    mModel.setCurrentPhoto(Path.fromString(path), index);
1005f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                }
1006f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            }
1007f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
1008f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
1009f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
101014d3289b4867c21da93ec4032119c0091bc78c30George Mount    @Override
101114d3289b4867c21da93ec4032119c0091bc78c30George Mount    protected void clearStateResult() {
101214d3289b4867c21da93ec4032119c0091bc78c30George Mount        mHasActivityResult = false;
101314d3289b4867c21da93ec4032119c0091bc78c30George Mount    }
101414d3289b4867c21da93ec4032119c0091bc78c30George Mount
1015616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin    private class PreparePhotoFallback implements OnGLIdleListener {
1016616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin        private PhotoFallbackEffect mPhotoFallback = new PhotoFallbackEffect();
1017616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin        private boolean mResultReady = false;
1018616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin
1019616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin        public synchronized PhotoFallbackEffect get() {
1020616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin            while (!mResultReady) {
1021616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin                Utils.waitWithoutInterrupt(this);
1022616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin            }
1023616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin            return mPhotoFallback;
1024616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin        }
1025616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin
1026616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin        @Override
1027616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin        public boolean onGLIdle(GLCanvas canvas, boolean renderRequested) {
1028616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin            mPhotoFallback = mPhotoView.buildFallbackEffect(mRootPane, canvas);
1029616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin            synchronized (this) {
1030616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin                mResultReady = true;
1031616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin                notifyAll();
1032616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin            }
1033616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin            return false;
1034616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin        }
1035616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin    }
1036616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin
1037616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin    private void preparePhotoFallbackView() {
1038616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin        GLRoot root = mActivity.getGLRoot();
1039616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin        PreparePhotoFallback task = new PreparePhotoFallback();
1040616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin        root.unlockRenderThread();
1041616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin        PhotoFallbackEffect anim;
1042616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin        try {
1043616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin            root.addOnGLIdleListener(task);
1044616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin            anim = task.get();
1045616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin        } finally {
1046616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin            root.lockRenderThread();
1047616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin        }
1048616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin        mActivity.getTransitionStore().put(
1049616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin                AlbumPage.KEY_RESUME_ANIMATION, anim);
1050616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin    }
1051616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin
1052f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    @Override
1053f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public void onPause() {
1054d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin        super.onPause();
1055d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin        mIsActive = false;
1056d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin
1057bd7c016d728853d38f98a3c6077b7bd9b08858b9Yuli Huang        mActivity.getGLRoot().unfreeze();
1058bd7c016d728853d38f98a3c6077b7bd9b08858b9Yuli Huang        mHandler.removeMessages(MSG_UNFREEZE_GLROOT);
1059253c5aec7692afdd7880fbd169d4b44d5679cbc0Chih-Chung Chang
10604105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen        DetailsHelper.pause();
1061d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu        if (mModel != null) {
1062d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu            if (isFinishing()) preparePhotoFallbackView();
1063d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu            mModel.pause();
1064d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu        }
1065f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mPhotoView.pause();
1066f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mHandler.removeMessages(MSG_HIDE_BARS);
1067f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mActionBar.removeOnMenuVisibilityListener(mMenuVisibilityListener);
106833ef03776b7734717b16f6fc861b831fb1b1dfacMartijn Coenen
10696b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang        onCommitDeleteImage();
10702785956f8f5654966a41e20f482f4af3057eea3fChih-Chung Chang        mMenuExecutor.pause();
10716118af9ddad8acc050133154f8f60c842c7f9bfaChih-Chung Chang        if (mMediaSet != null) mMediaSet.clearDeletion();
1072f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
1073f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
1074f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    @Override
1075bd7c016d728853d38f98a3c6077b7bd9b08858b9Yuli Huang    public void onCurrentImageUpdated() {
1076bd7c016d728853d38f98a3c6077b7bd9b08858b9Yuli Huang        mActivity.getGLRoot().unfreeze();
1077bd7c016d728853d38f98a3c6077b7bd9b08858b9Yuli Huang    }
1078bd7c016d728853d38f98a3c6077b7bd9b08858b9Yuli Huang
10797eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu    private void setGridButtonVisibility(boolean enabled) {
10807eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu        Menu menu = mActionBar.getMenu();
10817eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu        if (menu == null) return;
10827eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu        MenuItem item = menu.findItem(R.id.action_grid);
10837eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu        if (item != null) item.setVisible(enabled);
10847eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu    }
10857eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu
10867eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu    public void onFilmModeChanged(boolean enabled) {
10877eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu        mHandler.sendEmptyMessage(MSG_REFRESH_GRID_BUTTON);
1088a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu        mHandler.sendEmptyMessage(MSG_REFRESH_EDIT_BUTTON);
10897eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu        if (enabled) {
10907eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu            mHandler.removeMessages(MSG_HIDE_BARS);
10917eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu        } else {
10927eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu            refreshHidingMessage();
10937eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu        }
10947eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu    }
10957eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu
10967eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu    private void transitionFromAlbumPageIfNeeded() {
10977eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu        TransitionStore transitions = mActivity.getTransitionStore();
10987eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu
10997eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu        int resumeIndex = transitions.get(KEY_INDEX_HINT, -1);
11007eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu        if (resumeIndex >= 0) {
11017eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu            mCurrentIndex = resumeIndex;
11027eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu            mModel.setCurrentPhoto((Path)transitions.get(KEY_MEDIA_SET_PATH), mCurrentIndex);
11037eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu            mPhotoView.switchToImage(mCurrentIndex);
11047eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu        }
11057eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu
11067eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu        int albumPageTransition = transitions.get(
11077eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu                KEY_ALBUMPAGE_TRANSITION, MSG_ALBUMPAGE_NONE);
11087eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu
11097eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu        if(albumPageTransition != MSG_ALBUMPAGE_NONE) {
11107eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu            mPhotoView.setFilmMode(mStartInFilmstrip
11117eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu                    && albumPageTransition == MSG_ALBUMPAGE_RESUMED);
11127eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu        }
11137eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu
111451bc561e85053abfd7fda695e3cd20710acca85cBobby Georgescu        mFadeOutTexture = transitions.get(PreparePageFadeoutTexture.KEY_FADE_TEXTURE);
11157eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu        if (mFadeOutTexture != null) {
11167eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu            mBackgroundFade.start();
11177eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu            BitmapScreenNail.disableDrawPlaceholder();
11187eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu            mOpenAnimationRect =
11197eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu                    albumPageTransition == MSG_ALBUMPAGE_NONE ?
11207eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu                    (Rect) mData.getParcelable(KEY_OPEN_ANIMATION_RECT) :
11217eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu                    (Rect) transitions.get(KEY_OPEN_ANIMATION_RECT);
11227eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu            mPhotoView.setOpenAnimationRect(mOpenAnimationRect);
11237eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu            mBackgroundFade.start();
11247eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu        }
11257eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu    }
11267eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu
1127bd7c016d728853d38f98a3c6077b7bd9b08858b9Yuli Huang    @Override
1128f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    protected void onResume() {
1129f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        super.onResume();
11307eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu
1131d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu        if (mModel == null) {
1132d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu            mActivity.getStateManager().finishState(this);
1133d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu            return;
1134d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu        }
11357eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu        transitionFromAlbumPageIfNeeded();
11367eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu
1137d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin        mActivity.getGLRoot().freeze();
1138f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mIsActive = true;
1139f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        setContentPane(mRootPane);
114004ac045bf8da5082bbb0bdc9ea5f9c9b5b796ad0Yuli Huang
1141f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mModel.resume();
1142f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mPhotoView.resume();
1143898a2f4540635528a0916b0a6b0a177869854ae9Wu-cheng Li        mActionBar.setDisplayOptions(
1144898a2f4540635528a0916b0a6b0a177869854ae9Wu-cheng Li                ((mSecureAlbum == null) && (mSetPathString != null)), true);
1145f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mActionBar.addOnMenuVisibilityListener(mMenuVisibilityListener);
114633ef03776b7734717b16f6fc861b831fb1b1dfacMartijn Coenen
114771cd89a38752bc22ae0ec2df965e4280b776623cChih-Chung Chang        if (mAppBridge != null && !mHasActivityResult) {
114833f8567dd5003e4bb342683f3768ab7552648b02Chih-Chung Chang            mPhotoView.resetToFirstPicture();
1149bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang        }
115071cd89a38752bc22ae0ec2df965e4280b776623cChih-Chung Chang        mHasActivityResult = false;
1151bd7c016d728853d38f98a3c6077b7bd9b08858b9Yuli Huang        mHandler.sendEmptyMessageDelayed(MSG_UNFREEZE_GLROOT, UNFREEZE_GLROOT_TIMEOUT);
1152f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
1153f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
115415b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang    @Override
115515b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang    protected void onDestroy() {
1156bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang        if (mAppBridge != null) {
1157253c5aec7692afdd7880fbd169d4b44d5679cbc0Chih-Chung Chang            mAppBridge.setServer(null);
11583b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang            mScreenNailItem.setScreenNail(null);
1159bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang            mAppBridge.detachScreenNail();
1160bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang            mAppBridge = null;
11613b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang            mScreenNailSet = null;
11623b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang            mScreenNailItem = null;
1163b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang        }
1164bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang        mOrientationManager.removeListener(this);
11652ef46ed28b28b355d7f3f1432c7b1196b832a859Chih-Chung Chang        mActivity.getGLRoot().setOrientationSource(null);
1166a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu        cleanupEditButton();
1167aeb3062e84ed28f0e25a73f511f287ae0a3e4294Chih-Chung Chang
1168aeb3062e84ed28f0e25a73f511f287ae0a3e4294Chih-Chung Chang        // Remove all pending messages.
1169aeb3062e84ed28f0e25a73f511f287ae0a3e4294Chih-Chung Chang        mHandler.removeCallbacksAndMessages(null);
117015b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang        super.onDestroy();
117115b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang    }
117215b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang
1173f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private class MyDetailsSource implements DetailsSource {
11746cf807453fb58ccd4cc513ff187b306c7090e67cOwen Lin
11756cf807453fb58ccd4cc513ff187b306c7090e67cOwen Lin        @Override
1176f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        public MediaDetails getDetails() {
1177616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin            return mModel.getMediaItem(0).getDetails();
1178f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
11796cf807453fb58ccd4cc513ff187b306c7090e67cOwen Lin
11806cf807453fb58ccd4cc513ff187b306c7090e67cOwen Lin        @Override
1181f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        public int size() {
1182f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            return mMediaSet != null ? mMediaSet.getMediaItemCount() : 1;
1183f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
11846cf807453fb58ccd4cc513ff187b306c7090e67cOwen Lin
11856cf807453fb58ccd4cc513ff187b306c7090e67cOwen Lin        @Override
1186995c4566bed7df1aa48ba7e1351f964efa73880bMichael Kolb        public int setIndex() {
1187995c4566bed7df1aa48ba7e1351f964efa73880bMichael Kolb            return mModel.getCurrentIndex();
11884105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen        }
1189f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
1190f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin}
1191