PhotoPage.java revision 14ad4efd409887a0f4cd90e29818c8c3bd2ece8f
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;
4883be4e0c9b8e3372eff8f9b1a396afd961b72921Angus Kongimport com.android.gallery3d.data.LocalImage;
49f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.data.MediaDetails;
50f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.data.MediaItem;
51f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.data.MediaObject;
52f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.data.MediaSet;
536b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Changimport com.android.gallery3d.data.MtpSource;
54f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.data.Path;
55a0ce682e40c39ce046c48d8a7f989fff01bb9f2cWu-cheng Liimport com.android.gallery3d.data.SecureAlbum;
56a0ce682e40c39ce046c48d8a7f989fff01bb9f2cWu-cheng Liimport com.android.gallery3d.data.SecureSource;
573b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Changimport com.android.gallery3d.data.SnailAlbum;
583b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Changimport com.android.gallery3d.data.SnailItem;
5915b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Changimport com.android.gallery3d.data.SnailSource;
60f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.picasasource.PicasaSource;
61f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescuimport com.android.gallery3d.ui.AnimationTime;
6224081fe26ca25448ddb9c8f9cc7f406d26344decOwen Linimport com.android.gallery3d.ui.BitmapScreenNail;
634105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chenimport com.android.gallery3d.ui.DetailsHelper;
644105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chenimport com.android.gallery3d.ui.DetailsHelper.CloseListener;
654105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chenimport com.android.gallery3d.ui.DetailsHelper.DetailsSource;
66f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.ui.GLCanvas;
67616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Linimport com.android.gallery3d.ui.GLRoot;
68616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Linimport com.android.gallery3d.ui.GLRoot.OnGLIdleListener;
69f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.ui.GLView;
70f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.ui.ImportCompleteListener;
71f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.ui.MenuExecutor;
72616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Linimport com.android.gallery3d.ui.PhotoFallbackEffect;
7321a412c93c9b0401b039f4eb86d4950752e5bb84Owen Linimport com.android.gallery3d.ui.PhotoView;
7451bc561e85053abfd7fda695e3cd20710acca85cBobby Georgescuimport com.android.gallery3d.ui.PreparePageFadeoutTexture;
75f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescuimport com.android.gallery3d.ui.RawTexture;
76f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.ui.SelectionManager;
77f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.ui.SynchronizedHandler;
78f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.util.GalleryUtils;
79c6781c0c0d8d193863ca09455a5bda3d542db493Bobby Georgescuimport com.android.gallery3d.util.LightCycleHelper;
8066ca848b2f58b813d366642088d274a1b7c4a90cChih-Chung Changimport com.android.gallery3d.util.MediaSetUtils;
81f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
82bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Changpublic class PhotoPage extends ActivityState implements
8361f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang        PhotoView.Listener, OrientationManager.Listener, AppBridge.Server {
84f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private static final String TAG = "PhotoPage";
85f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
86f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private static final int MSG_HIDE_BARS = 1;
87bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    private static final int MSG_LOCK_ORIENTATION = 2;
88bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    private static final int MSG_UNLOCK_ORIENTATION = 3;
89bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    private static final int MSG_ON_FULL_SCREEN_CHANGED = 4;
9061f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang    private static final int MSG_UPDATE_ACTION_BAR = 5;
91bd7c016d728853d38f98a3c6077b7bd9b08858b9Yuli Huang    private static final int MSG_UNFREEZE_GLROOT = 6;
92e6251df06f0b3c8f556043f8b725b4b19be7474dChih-Chung Chang    private static final int MSG_WANT_BARS = 7;
937eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu    private static final int MSG_REFRESH_GRID_BUTTON = 8;
94a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu    private static final int MSG_REFRESH_EDIT_BUTTON = 9;
956cf807453fb58ccd4cc513ff187b306c7090e67cOwen Lin
96f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private static final int HIDE_BARS_TIMEOUT = 3500;
97bd7c016d728853d38f98a3c6077b7bd9b08858b9Yuli Huang    private static final int UNFREEZE_GLROOT_TIMEOUT = 250;
98f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
99f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private static final int REQUEST_SLIDESHOW = 1;
100f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private static final int REQUEST_CROP = 2;
101f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private static final int REQUEST_CROP_PICASA = 3;
102f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang    private static final int REQUEST_EDIT = 4;
10371cd89a38752bc22ae0ec2df965e4280b776623cChih-Chung Chang    private static final int REQUEST_PLAY_VIDEO = 5;
1043f1f1baf3a674927e25cd5cd885fb372796bd3a0Teng-Hui Zhu    private static final int REQUEST_TRIM = 6;
105f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
106f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public static final String KEY_MEDIA_SET_PATH = "media-set-path";
107f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public static final String KEY_MEDIA_ITEM_PATH = "media-item-path";
108f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public static final String KEY_INDEX_HINT = "index-hint";
10904ac045bf8da5082bbb0bdc9ea5f9c9b5b796ad0Yuli Huang    public static final String KEY_OPEN_ANIMATION_RECT = "open-animation-rect";
110bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    public static final String KEY_APP_BRIDGE = "app-bridge";
11154fe6202b6f7d233e7645c121321fe0f3d20fc8bYuli Huang    public static final String KEY_TREAT_BACK_AS_UP = "treat-back-as-up";
1127eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu    public static final String KEY_START_IN_FILMSTRIP = "start-in-filmstrip";
113bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    public static final String KEY_RETURN_INDEX_HINT = "return-index-hint";
114f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
1157eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu    public static final String KEY_ALBUMPAGE_TRANSITION = "albumpage-transition";
1167eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu    public static final int MSG_ALBUMPAGE_NONE = 0;
1177eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu    public static final int MSG_ALBUMPAGE_STARTED = 1;
1187eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu    public static final int MSG_ALBUMPAGE_RESUMED = 2;
1197eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu    public static final int MSG_ALBUMPAGE_PICKED = 4;
1207eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu
121a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu    public static final String ACTION_NEXTGEN_EDIT = "action_nextgen_edit";
122a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu
123f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private GalleryApp mApplication;
124f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private SelectionManager mSelectionManager;
125f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
126f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private PhotoView mPhotoView;
127f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private PhotoPage.Model mModel;
1284105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen    private DetailsHelper mDetailsHelper;
129f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private boolean mShowDetails;
130f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
131f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    // mMediaSet could be null if there is no KEY_MEDIA_SET_PATH supplied.
132f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    // E.g., viewing a photo in gmail attachment
1336b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang    private FilterDeleteSet mMediaSet;
134f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
135a0ce682e40c39ce046c48d8a7f989fff01bb9f2cWu-cheng Li    // The mediaset used by camera launched from secure lock screen.
136a0ce682e40c39ce046c48d8a7f989fff01bb9f2cWu-cheng Li    private SecureAlbum mSecureAlbum;
137a0ce682e40c39ce046c48d8a7f989fff01bb9f2cWu-cheng Li
138f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private int mCurrentIndex = 0;
139f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private Handler mHandler;
140113bfc77c4468411da9ae1290553c3be89f8df9aOwen Lin    private boolean mShowBars = true;
14161f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang    private volatile boolean mActionBarAllowed = true;
1428cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen    private GalleryActionBar mActionBar;
143f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private boolean mIsMenuVisible;
144f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private MediaItem mCurrentPhoto = null;
145f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private MenuExecutor mMenuExecutor;
146f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private boolean mIsActive;
14784c220f10a643927c8a2126de8a755d8d7f7ec9eRay Chen    private String mSetPathString;
148b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang    // This is the original mSetPathString before adding the camera preview item.
149b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang    private String mOriginalSetPathString;
150bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    private AppBridge mAppBridge;
1513b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang    private SnailItem mScreenNailItem;
1523b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang    private SnailAlbum mScreenNailSet;
153bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    private OrientationManager mOrientationManager;
15471cd89a38752bc22ae0ec2df965e4280b776623cChih-Chung Chang    private boolean mHasActivityResult;
15554fe6202b6f7d233e7645c121321fe0f3d20fc8bYuli Huang    private boolean mTreatBackAsUp;
1567eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu    private boolean mStartInFilmstrip;
1577eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu    private boolean mStartedFromAlbumPage;
15815b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang
159f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu    private RawTexture mFadeOutTexture;
160f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu    private Rect mOpenAnimationRect;
1617eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu    public static final int ANIM_TIME_OPENING = 300;
162f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu
1636b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang    // The item that is deleted (but it can still be undeleted before commiting)
1646b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang    private Path mDeletePath;
1656b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang    private boolean mDeleteIsFocus;  // whether the deleted item was in focus
1666b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang
16733ef03776b7734717b16f6fc861b831fb1b1dfacMartijn Coenen    private NfcAdapter mNfcAdapter;
16833ef03776b7734717b16f6fc861b831fb1b1dfacMartijn Coenen
1692bb717f1ea38e2ce33dd102a23afe6bfacb5675cOwen Lin    private final MyMenuVisibilityListener mMenuVisibilityListener =
1702bb717f1ea38e2ce33dd102a23afe6bfacb5675cOwen Lin            new MyMenuVisibilityListener();
1712bb717f1ea38e2ce33dd102a23afe6bfacb5675cOwen Lin
172f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public static interface Model extends PhotoView.Model {
173f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        public void resume();
174f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        public void pause();
175f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        public boolean isEmpty();
176f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        public void setCurrentPhoto(Path path, int indexHint);
177f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
178f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
179f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private class MyMenuVisibilityListener implements OnMenuVisibilityListener {
18006c6401eededc2ec842ba4994a838c2ded0a666cPin Ting        @Override
181f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        public void onMenuVisibilityChanged(boolean isVisible) {
182f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            mIsMenuVisible = isVisible;
183f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            refreshHidingMessage();
184f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
185f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
186f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
187f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu    private static class BackgroundFadeOut extends FloatAnimation {
188f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu        public BackgroundFadeOut() {
189f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu            super(1f, 0f, ANIM_TIME_OPENING);
190f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu            setInterpolator(new AccelerateInterpolator(2f));
191f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu        }
192f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu    }
193f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu
194f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu    private final FloatAnimation mBackgroundFade = new BackgroundFadeOut();
195f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
196915c2c5b2c367df71599370613af0924bd7c4887Bobby Georgescu    @Override
197915c2c5b2c367df71599370613af0924bd7c4887Bobby Georgescu    protected int getBackgroundColorId() {
198915c2c5b2c367df71599370613af0924bd7c4887Bobby Georgescu        return R.color.photo_background;
199915c2c5b2c367df71599370613af0924bd7c4887Bobby Georgescu    }
200915c2c5b2c367df71599370613af0924bd7c4887Bobby Georgescu
201f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu    private final GLView mRootPane = new GLView() {
202f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        @Override
203f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        protected void renderBackground(GLCanvas view) {
20483be4e0c9b8e3372eff8f9b1a396afd961b72921Angus Kong            if (mFadeOutTexture != null) {
20583be4e0c9b8e3372eff8f9b1a396afd961b72921Angus Kong                if (mBackgroundFade.calculate(AnimationTime.get())) invalidate();
20683be4e0c9b8e3372eff8f9b1a396afd961b72921Angus Kong                if (!mBackgroundFade.isActive()) {
207f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu                    mFadeOutTexture = null;
208f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu                    mOpenAnimationRect = null;
209f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu                    BitmapScreenNail.enableDrawPlaceholder();
210f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu                } else {
211f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu                    float fadeAlpha = mBackgroundFade.get();
21283be4e0c9b8e3372eff8f9b1a396afd961b72921Angus Kong                    if (fadeAlpha < 1f) {
213915c2c5b2c367df71599370613af0924bd7c4887Bobby Georgescu                        view.clearBuffer(getBackgroundColor());
214f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu                        view.setAlpha(fadeAlpha);
215f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu                    }
216f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu                    mFadeOutTexture.draw(view, 0, 0);
21702ef48574ef7099ebaa0386bd6fd676bd2fd5489Bobby Georgescu                    view.setAlpha(1f - fadeAlpha);
218f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu                    return;
219f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu                }
220f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu            }
221915c2c5b2c367df71599370613af0924bd7c4887Bobby Georgescu            view.clearBuffer(getBackgroundColor());
222f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
223f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
224f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        @Override
225f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        protected void onLayout(
226f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                boolean changed, int left, int top, int right, int bottom) {
227f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            mPhotoView.layout(0, 0, right - left, bottom - top);
228f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            if (mShowDetails) {
2298cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen                mDetailsHelper.layout(left, mActionBar.getHeight(), right, bottom);
230f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            }
231f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
232f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    };
233f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
234f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    @Override
235f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public void onCreate(Bundle data, Bundle restoreState) {
23645c56f2d34c71d0bc9b84ebeef6d1314738d0fc0Bobby Georgescu        super.onCreate(data, restoreState);
2378cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen        mActionBar = mActivity.getGalleryActionBar();
238f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mSelectionManager = new SelectionManager(mActivity, false);
239f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mMenuExecutor = new MenuExecutor(mActivity, mSelectionManager);
240f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
241f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mPhotoView = new PhotoView(mActivity);
242bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang        mPhotoView.setListener(this);
243f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mRootPane.addComponent(mPhotoView);
24483be4e0c9b8e3372eff8f9b1a396afd961b72921Angus Kong        mApplication = (GalleryApp) ((Activity) mActivity).getApplication();
245bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang        mOrientationManager = mActivity.getOrientationManager();
246bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang        mOrientationManager.addListener(this);
2472ef46ed28b28b355d7f3f1432c7b1196b832a859Chih-Chung Chang        mActivity.getGLRoot().setOrientationSource(mOrientationManager);
248f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
249d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu        mHandler = new SynchronizedHandler(mActivity.getGLRoot()) {
250d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu            @Override
251d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu            public void handleMessage(Message message) {
252d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu                switch (message.what) {
253d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu                    case MSG_HIDE_BARS: {
254d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu                        hideBars();
255d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu                        break;
256d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu                    }
257d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu                    case MSG_REFRESH_GRID_BUTTON: {
258d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu                        setGridButtonVisibility(mPhotoView.getFilmMode());
259d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu                        break;
260d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu                    }
261d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu                    case MSG_REFRESH_EDIT_BUTTON: {
262d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu                        refreshEditButton();
263d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu                        break;
264d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu                    }
265d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu                    case MSG_LOCK_ORIENTATION: {
266d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu                        mOrientationManager.lockOrientation();
267d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu                        break;
268d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu                    }
269d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu                    case MSG_UNLOCK_ORIENTATION: {
270d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu                        mOrientationManager.unlockOrientation();
271d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu                        break;
272d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu                    }
273d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu                    case MSG_ON_FULL_SCREEN_CHANGED: {
274d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu                        mAppBridge.onFullScreenChanged(message.arg1 == 1);
275d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu                        break;
276d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu                    }
277d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu                    case MSG_UPDATE_ACTION_BAR: {
278d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu                        updateBars();
279d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu                        break;
280d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu                    }
281d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu                    case MSG_WANT_BARS: {
282d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu                        wantBars();
283d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu                        break;
284d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu                    }
285d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu                    case MSG_UNFREEZE_GLROOT: {
286d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu                        mActivity.getGLRoot().unfreeze();
287d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu                        break;
288d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu                    }
289d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu                    default: throw new AssertionError(message.what);
290d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu                }
291d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu            }
292d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu        };
293d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu
29484c220f10a643927c8a2126de8a755d8d7f7ec9eRay Chen        mSetPathString = data.getString(KEY_MEDIA_SET_PATH);
295b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang        mOriginalSetPathString = mSetPathString;
29633ef03776b7734717b16f6fc861b831fb1b1dfacMartijn Coenen        mNfcAdapter = NfcAdapter.getDefaultAdapter(mActivity.getAndroidContext());
2977eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu        String itemPathString = data.getString(KEY_MEDIA_ITEM_PATH);
2987eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu        Path itemPath = itemPathString != null ?
2997eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu                Path.fromString(data.getString(KEY_MEDIA_ITEM_PATH)) :
3007eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu                    null;
30154fe6202b6f7d233e7645c121321fe0f3d20fc8bYuli Huang        mTreatBackAsUp = data.getBoolean(KEY_TREAT_BACK_AS_UP, false);
3027eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu        mStartInFilmstrip =
3037eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu            data.getBoolean(KEY_START_IN_FILMSTRIP, false);
3047eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu        mStartedFromAlbumPage =
3057eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu                data.getInt(KEY_ALBUMPAGE_TRANSITION,
3067eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu                        MSG_ALBUMPAGE_NONE) == MSG_ALBUMPAGE_STARTED;
3077eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu        setGridButtonVisibility(!mStartedFromAlbumPage);
30884c220f10a643927c8a2126de8a755d8d7f7ec9eRay Chen        if (mSetPathString != null) {
309bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang            mAppBridge = (AppBridge) data.getParcelable(KEY_APP_BRIDGE);
310bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang            if (mAppBridge != null) {
3117eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu                mFlags |= FLAG_HIDE_ACTION_BAR | FLAG_HIDE_STATUS_BAR;
3127eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu                mShowBars = false;
3137eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu
314253c5aec7692afdd7880fbd169d4b44d5679cbc0Chih-Chung Chang                mAppBridge.setServer(this);
315bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang                mOrientationManager.lockOrientation();
316b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang
317bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang                // Get the ScreenNail from AppBridge and register it.
3183b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang                int id = SnailSource.newId();
319b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang                Path screenNailSetPath = SnailSource.getSetPath(id);
320bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang                Path screenNailItemPath = SnailSource.getItemPath(id);
3213b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang                mScreenNailSet = (SnailAlbum) mActivity.getDataManager()
3223b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang                        .getMediaObject(screenNailSetPath);
3233b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang                mScreenNailItem = (SnailItem) mActivity.getDataManager()
324bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang                        .getMediaObject(screenNailItemPath);
3253b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang                mScreenNailItem.setScreenNail(mAppBridge.attachScreenNail());
326b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang
327a0ce682e40c39ce046c48d8a7f989fff01bb9f2cWu-cheng Li                // Check if the path is a secure album.
328a0ce682e40c39ce046c48d8a7f989fff01bb9f2cWu-cheng Li                if (SecureSource.isSecurePath(mSetPathString)) {
329a0ce682e40c39ce046c48d8a7f989fff01bb9f2cWu-cheng Li                    mSecureAlbum = (SecureAlbum) mActivity.getDataManager()
330a0ce682e40c39ce046c48d8a7f989fff01bb9f2cWu-cheng Li                            .getMediaSet(mSetPathString);
331efd480e85dc5bd0d2ca0ac82d03e141212388830Wu-cheng Li                    // Set the flag to be on top of the lock screen.
332efd480e85dc5bd0d2ca0ac82d03e141212388830Wu-cheng Li                    mFlags |= FLAG_SHOW_WHEN_LOCKED;
333a0ce682e40c39ce046c48d8a7f989fff01bb9f2cWu-cheng Li                }
334a0ce682e40c39ce046c48d8a7f989fff01bb9f2cWu-cheng Li
3353b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang                // Combine the original MediaSet with the one for ScreenNail
3363b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang                // from AppBridge.
337b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang                mSetPathString = "/combo/item/{" + screenNailSetPath +
338b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang                        "," + mSetPathString + "}";
339b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang
340b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang                // Start from the screen nail.
341bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang                itemPath = screenNailItemPath;
342b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang            }
343b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang
3446118af9ddad8acc050133154f8f60c842c7f9bfaChih-Chung Chang            MediaSet originalSet = mActivity.getDataManager()
3456118af9ddad8acc050133154f8f60c842c7f9bfaChih-Chung Chang                    .getMediaSet(mSetPathString);
3466118af9ddad8acc050133154f8f60c842c7f9bfaChih-Chung Chang            mSelectionManager.setSourceMediaSet(originalSet);
3476b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang            mSetPathString = "/filter/delete/{" + mSetPathString + "}";
3486b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang            mMediaSet = (FilterDeleteSet) mActivity.getDataManager()
3496b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang                    .getMediaSet(mSetPathString);
350f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            mCurrentIndex = data.getInt(KEY_INDEX_HINT, 0);
351f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            if (mMediaSet == null) {
35284c220f10a643927c8a2126de8a755d8d7f7ec9eRay Chen                Log.w(TAG, "failed to restore " + mSetPathString);
353f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            }
3547eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu            if (itemPath == null) {
355d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu                mMediaSet.reload();
356d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu                if (mMediaSet.getMediaItemCount() > 0) {
357d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu                    itemPath = mMediaSet.getMediaItem(mCurrentIndex, 1)
358d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu                        .get(0).getPath();
359d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu                } else {
360d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu                    return;
361d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu                }
3627eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu            }
363f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            PhotoDataAdapter pda = new PhotoDataAdapter(
364bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang                    mActivity, mPhotoView, mMediaSet, itemPath, mCurrentIndex,
36543a80fd806247cb50e81bacda3ad21d210e9ae88Angus Kong                    mAppBridge == null ? -1 : 0,
366dbb6acc204ba6f095eb0e49e1298e9ceda2c3096Wu-cheng Li                    mAppBridge == null ? false : mAppBridge.isPanorama(),
367dbb6acc204ba6f095eb0e49e1298e9ceda2c3096Wu-cheng Li                    mAppBridge == null ? false : mAppBridge.isStaticCamera());
368f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            mModel = pda;
369f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            mPhotoView.setModel(mModel);
370f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
371f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            pda.setDataListener(new PhotoDataAdapter.DataListener() {
372f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
373113bfc77c4468411da9ae1290553c3be89f8df9aOwen Lin                @Override
374f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                public void onPhotoChanged(int index, Path item) {
375f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                    mCurrentIndex = index;
376f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                    if (item != null) {
377616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin                        MediaItem photo = mModel.getMediaItem(0);
378f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                        if (photo != null) updateCurrentPhoto(photo);
379f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                    }
38061f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang                    updateBars();
381f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                }
382f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
383f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                @Override
384f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                public void onLoadingFinished() {
385f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                    if (!mModel.isEmpty()) {
386616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin                        MediaItem photo = mModel.getMediaItem(0);
387f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                        if (photo != null) updateCurrentPhoto(photo);
388f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                    } else if (mIsActive) {
389c370476adcf29f311ceec70a119792a0168781e9Chih-Chung Chang                        // We only want to finish the PhotoPage if there is no
390c370476adcf29f311ceec70a119792a0168781e9Chih-Chung Chang                        // deletion that the user can undo.
391c370476adcf29f311ceec70a119792a0168781e9Chih-Chung Chang                        if (mMediaSet.getNumberOfDeletions() == 0) {
392c370476adcf29f311ceec70a119792a0168781e9Chih-Chung Chang                            mActivity.getStateManager().finishState(
393c370476adcf29f311ceec70a119792a0168781e9Chih-Chung Chang                                    PhotoPage.this);
394c370476adcf29f311ceec70a119792a0168781e9Chih-Chung Chang                        }
395f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                    }
396f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                }
397f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
398f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                @Override
399f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                public void onLoadingStarted() {
400f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                }
401f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            });
402f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        } else {
403f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            // Get default media set by the URI
404f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            MediaItem mediaItem = (MediaItem)
405f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                    mActivity.getDataManager().getMediaObject(itemPath);
406f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            mModel = new SinglePhotoDataAdapter(mActivity, mPhotoView, mediaItem);
407f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            mPhotoView.setModel(mModel);
408f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            updateCurrentPhoto(mediaItem);
409f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
410cf46a3abc26aac7cdb6b6993aeade053304b71d9Ray Chen
411b265ebb01cc046b74329eeb28dbecb24e0f953d2Bobby Georgescu        mPhotoView.setFilmMode(mStartInFilmstrip && mMediaSet.getMediaItemCount() > 1);
412a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu        setupEditButton();
413a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu    }
414a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu
415a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu    private ImageView mEditButton;
416a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu    private void setupEditButton() {
417a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu        RelativeLayout galleryRoot = (RelativeLayout) ((Activity) mActivity)
418a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu                .findViewById(mAppBridge != null ? R.id.content : R.id.gallery_root);
419a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu        if (galleryRoot == null) return;
420a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu
421a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu        mEditButton = new ImageView(mActivity);
422a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu        mEditButton.setImageResource(R.drawable.photoeditor_artistic);
423a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu        mEditButton.setOnClickListener(new OnClickListener() {
424a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu            @Override
425a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu            public void onClick(View arg0) {
426a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu                launchPhotoEditor();
427a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu            }
428a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu        });
429a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu        RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(
430a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu                RelativeLayout.LayoutParams.WRAP_CONTENT,
431a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu                RelativeLayout.LayoutParams.WRAP_CONTENT);
432a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu        lp.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM);
433a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu        galleryRoot.addView(mEditButton, lp);
434a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu        refreshEditButton();
435a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu    }
436a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu
437a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu    private void cleanupEditButton() {
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;
44714ad4efd409887a0f4cd90e29818c8c3bd2ece8fBobby Georgescu        if (mShowBars && mCurrentPhoto != null
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) {
88983be4e0c9b8e3372eff8f9b1a396afd961b72921Angus Kong            LocalImage img = (LocalImage) item;
8907108c4078436488ede37608c62a6b953b51db835George Mount            LightCycleHelper.viewPanorama(mActivity, img.getFilePath());
891f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        } else {
89261f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang            toggleBars();
893f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
894f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
895f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
896bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    @Override
897bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    public void lockOrientation() {
898bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang        mHandler.sendEmptyMessage(MSG_LOCK_ORIENTATION);
899bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    }
900bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang
901bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    @Override
902bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    public void unlockOrientation() {
90306c6401eededc2ec842ba4994a838c2ded0a666cPin Ting        mHandler.sendEmptyMessage(MSG_UNLOCK_ORIENTATION);
904bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    }
905bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang
906bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    @Override
90761f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang    public void onActionBarAllowed(boolean allowed) {
90861f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang        mActionBarAllowed = allowed;
90961f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang        mHandler.sendEmptyMessage(MSG_UPDATE_ACTION_BAR);
91061f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang    }
91161f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang
91261f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang    @Override
913e6251df06f0b3c8f556043f8b725b4b19be7474dChih-Chung Chang    public void onActionBarWanted() {
914e6251df06f0b3c8f556043f8b725b4b19be7474dChih-Chung Chang        mHandler.sendEmptyMessage(MSG_WANT_BARS);
915e6251df06f0b3c8f556043f8b725b4b19be7474dChih-Chung Chang    }
916e6251df06f0b3c8f556043f8b725b4b19be7474dChih-Chung Chang
917e6251df06f0b3c8f556043f8b725b4b19be7474dChih-Chung Chang    @Override
918bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    public void onFullScreenChanged(boolean full) {
919bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang        Message m = mHandler.obtainMessage(
920bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang                MSG_ON_FULL_SCREEN_CHANGED, full ? 1 : 0, 0);
921bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang        m.sendToTarget();
922bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    }
923bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang
9246b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang    // How we do delete/undo:
9256b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang    //
9266b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang    // When the user choose to delete a media item, we just tell the
9276b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang    // FilterDeleteSet to hide that item. If the user choose to undo it, we
9286b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang    // again tell FilterDeleteSet not to hide it. If the user choose to commit
9296b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang    // the deletion, we then actually delete the media item.
9306b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang    @Override
9316b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang    public void onDeleteImage(Path path, int offset) {
9326118af9ddad8acc050133154f8f60c842c7f9bfaChih-Chung Chang        onCommitDeleteImage();  // commit the previous deletion
9336b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang        mDeletePath = path;
9346b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang        mDeleteIsFocus = (offset == 0);
9356118af9ddad8acc050133154f8f60c842c7f9bfaChih-Chung Chang        mMediaSet.addDeletion(path, mCurrentIndex + offset);
9366b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang    }
9376b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang
9386b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang    @Override
9396b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang    public void onUndoDeleteImage() {
9406118af9ddad8acc050133154f8f60c842c7f9bfaChih-Chung Chang        if (mDeletePath == null) return;
9416b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang        // If the deletion was done on the focused item, we want the model to
9426b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang        // focus on it when it is undeleted.
9436b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang        if (mDeleteIsFocus) mModel.setFocusHintPath(mDeletePath);
9446118af9ddad8acc050133154f8f60c842c7f9bfaChih-Chung Chang        mMediaSet.removeDeletion(mDeletePath);
9456b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang        mDeletePath = null;
9466b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang    }
9476b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang
9486b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang    @Override
9496b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang    public void onCommitDeleteImage() {
9506b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang        if (mDeletePath == null) return;
9516b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang        mSelectionManager.deSelectAll();
9526b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang        mSelectionManager.toggle(mDeletePath);
9536b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang        mMenuExecutor.onMenuClicked(R.id.action_delete, null, true, false);
9546b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang        mDeletePath = null;
9556b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang    }
9566b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang
957f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public static void playVideo(Activity activity, Uri uri, String title) {
958f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        try {
959f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            Intent intent = new Intent(Intent.ACTION_VIEW)
960a3871050845b4921379add2b126add3cfbab1109Ray Chen                    .setDataAndType(uri, "video/*")
961a3871050845b4921379add2b126add3cfbab1109Ray Chen                    .putExtra(Intent.EXTRA_TITLE, title)
962a3871050845b4921379add2b126add3cfbab1109Ray Chen                    .putExtra(MovieActivity.KEY_TREAT_UP_AS_BACK, true);
96371cd89a38752bc22ae0ec2df965e4280b776623cChih-Chung Chang            activity.startActivityForResult(intent, REQUEST_PLAY_VIDEO);
964f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        } catch (ActivityNotFoundException e) {
965f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            Toast.makeText(activity, activity.getString(R.string.video_err),
966f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                    Toast.LENGTH_SHORT).show();
967f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
968f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
969f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
970f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang    private void setCurrentPhotoByIntent(Intent intent) {
971f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang        if (intent == null) return;
972f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang        Path path = mApplication.getDataManager()
973f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang                .findPathByUri(intent.getData(), intent.getType());
974f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang        if (path != null) {
975f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang            mModel.setCurrentPhoto(path, mCurrentIndex);
976f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang        }
977f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang    }
978f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang
979f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    @Override
980f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    protected void onStateResult(int requestCode, int resultCode, Intent data) {
98171cd89a38752bc22ae0ec2df965e4280b776623cChih-Chung Chang        mHasActivityResult = true;
982f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        switch (requestCode) {
983f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang            case REQUEST_EDIT:
984f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang                setCurrentPhotoByIntent(data);
985f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang                break;
986f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            case REQUEST_CROP:
987f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                if (resultCode == Activity.RESULT_OK) {
988f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang                    setCurrentPhotoByIntent(data);
989f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                }
990f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                break;
991f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            case REQUEST_CROP_PICASA: {
992f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang                if (resultCode == Activity.RESULT_OK) {
993f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang                    Context context = mActivity.getAndroidContext();
99488cc2ca5f5596762a5546ec7426756f2036be455Yuli Huang                    String message = context.getString(R.string.crop_saved,
995f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang                            context.getString(R.string.folder_download));
996f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang                    Toast.makeText(context, message, Toast.LENGTH_SHORT).show();
997f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang                }
998f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                break;
999f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            }
1000f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            case REQUEST_SLIDESHOW: {
1001f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                if (data == null) break;
1002f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                String path = data.getStringExtra(SlideshowPage.KEY_ITEM_PATH);
1003f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                int index = data.getIntExtra(SlideshowPage.KEY_PHOTO_INDEX, 0);
1004f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                if (path != null) {
1005f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                    mModel.setCurrentPhoto(Path.fromString(path), index);
1006f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                }
1007f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            }
1008f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
1009f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
1010f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
101114d3289b4867c21da93ec4032119c0091bc78c30George Mount    @Override
101214d3289b4867c21da93ec4032119c0091bc78c30George Mount    protected void clearStateResult() {
101314d3289b4867c21da93ec4032119c0091bc78c30George Mount        mHasActivityResult = false;
101414d3289b4867c21da93ec4032119c0091bc78c30George Mount    }
101514d3289b4867c21da93ec4032119c0091bc78c30George Mount
1016616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin    private class PreparePhotoFallback implements OnGLIdleListener {
1017616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin        private PhotoFallbackEffect mPhotoFallback = new PhotoFallbackEffect();
1018616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin        private boolean mResultReady = false;
1019616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin
1020616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin        public synchronized PhotoFallbackEffect get() {
1021616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin            while (!mResultReady) {
1022616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin                Utils.waitWithoutInterrupt(this);
1023616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin            }
1024616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin            return mPhotoFallback;
1025616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin        }
1026616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin
1027616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin        @Override
1028616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin        public boolean onGLIdle(GLCanvas canvas, boolean renderRequested) {
1029616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin            mPhotoFallback = mPhotoView.buildFallbackEffect(mRootPane, canvas);
1030616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin            synchronized (this) {
1031616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin                mResultReady = true;
1032616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin                notifyAll();
1033616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin            }
1034616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin            return false;
1035616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin        }
1036616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin    }
1037616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin
1038616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin    private void preparePhotoFallbackView() {
1039616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin        GLRoot root = mActivity.getGLRoot();
1040616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin        PreparePhotoFallback task = new PreparePhotoFallback();
1041616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin        root.unlockRenderThread();
1042616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin        PhotoFallbackEffect anim;
1043616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin        try {
1044616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin            root.addOnGLIdleListener(task);
1045616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin            anim = task.get();
1046616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin        } finally {
1047616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin            root.lockRenderThread();
1048616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin        }
1049616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin        mActivity.getTransitionStore().put(
1050616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin                AlbumPage.KEY_RESUME_ANIMATION, anim);
1051616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin    }
1052616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin
1053f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    @Override
1054f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public void onPause() {
1055d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin        super.onPause();
1056d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin        mIsActive = false;
1057d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin
1058bd7c016d728853d38f98a3c6077b7bd9b08858b9Yuli Huang        mActivity.getGLRoot().unfreeze();
1059bd7c016d728853d38f98a3c6077b7bd9b08858b9Yuli Huang        mHandler.removeMessages(MSG_UNFREEZE_GLROOT);
1060253c5aec7692afdd7880fbd169d4b44d5679cbc0Chih-Chung Chang
10614105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen        DetailsHelper.pause();
1062d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu        if (mModel != null) {
1063d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu            if (isFinishing()) preparePhotoFallbackView();
1064d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu            mModel.pause();
1065d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu        }
1066f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mPhotoView.pause();
1067f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mHandler.removeMessages(MSG_HIDE_BARS);
1068f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mActionBar.removeOnMenuVisibilityListener(mMenuVisibilityListener);
106933ef03776b7734717b16f6fc861b831fb1b1dfacMartijn Coenen
10706b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang        onCommitDeleteImage();
10712785956f8f5654966a41e20f482f4af3057eea3fChih-Chung Chang        mMenuExecutor.pause();
10726118af9ddad8acc050133154f8f60c842c7f9bfaChih-Chung Chang        if (mMediaSet != null) mMediaSet.clearDeletion();
1073f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
1074f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
1075f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    @Override
1076bd7c016d728853d38f98a3c6077b7bd9b08858b9Yuli Huang    public void onCurrentImageUpdated() {
1077bd7c016d728853d38f98a3c6077b7bd9b08858b9Yuli Huang        mActivity.getGLRoot().unfreeze();
1078bd7c016d728853d38f98a3c6077b7bd9b08858b9Yuli Huang    }
1079bd7c016d728853d38f98a3c6077b7bd9b08858b9Yuli Huang
10807eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu    private void setGridButtonVisibility(boolean enabled) {
10817eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu        Menu menu = mActionBar.getMenu();
10827eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu        if (menu == null) return;
10837eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu        MenuItem item = menu.findItem(R.id.action_grid);
10847eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu        if (item != null) item.setVisible(enabled);
10857eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu    }
10867eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu
10877eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu    public void onFilmModeChanged(boolean enabled) {
10887eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu        mHandler.sendEmptyMessage(MSG_REFRESH_GRID_BUTTON);
1089a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu        mHandler.sendEmptyMessage(MSG_REFRESH_EDIT_BUTTON);
10907eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu        if (enabled) {
10917eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu            mHandler.removeMessages(MSG_HIDE_BARS);
10927eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu        } else {
10937eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu            refreshHidingMessage();
10947eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu        }
10957eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu    }
10967eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu
10977eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu    private void transitionFromAlbumPageIfNeeded() {
10987eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu        TransitionStore transitions = mActivity.getTransitionStore();
10997eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu
11007eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu        int resumeIndex = transitions.get(KEY_INDEX_HINT, -1);
11017eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu        if (resumeIndex >= 0) {
11027eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu            mCurrentIndex = resumeIndex;
11037eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu            mModel.setCurrentPhoto((Path)transitions.get(KEY_MEDIA_SET_PATH), mCurrentIndex);
11047eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu            mPhotoView.switchToImage(mCurrentIndex);
11057eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu        }
11067eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu
11077eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu        int albumPageTransition = transitions.get(
11087eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu                KEY_ALBUMPAGE_TRANSITION, MSG_ALBUMPAGE_NONE);
11097eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu
11107eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu        if(albumPageTransition != MSG_ALBUMPAGE_NONE) {
11117eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu            mPhotoView.setFilmMode(mStartInFilmstrip
11127eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu                    && albumPageTransition == MSG_ALBUMPAGE_RESUMED);
11137eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu        }
11147eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu
111551bc561e85053abfd7fda695e3cd20710acca85cBobby Georgescu        mFadeOutTexture = transitions.get(PreparePageFadeoutTexture.KEY_FADE_TEXTURE);
11167eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu        if (mFadeOutTexture != null) {
11177eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu            mBackgroundFade.start();
11187eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu            BitmapScreenNail.disableDrawPlaceholder();
11197eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu            mOpenAnimationRect =
11207eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu                    albumPageTransition == MSG_ALBUMPAGE_NONE ?
11217eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu                    (Rect) mData.getParcelable(KEY_OPEN_ANIMATION_RECT) :
11227eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu                    (Rect) transitions.get(KEY_OPEN_ANIMATION_RECT);
11237eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu            mPhotoView.setOpenAnimationRect(mOpenAnimationRect);
11247eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu            mBackgroundFade.start();
11257eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu        }
11267eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu    }
11277eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu
1128bd7c016d728853d38f98a3c6077b7bd9b08858b9Yuli Huang    @Override
1129f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    protected void onResume() {
1130f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        super.onResume();
11317eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu
1132d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu        if (mModel == null) {
1133d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu            mActivity.getStateManager().finishState(this);
1134d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu            return;
1135d397378f8a1a2a1107e258155448b02599fdc2ceBobby Georgescu        }
11367eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu        transitionFromAlbumPageIfNeeded();
11377eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu
1138d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin        mActivity.getGLRoot().freeze();
1139f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mIsActive = true;
1140f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        setContentPane(mRootPane);
114104ac045bf8da5082bbb0bdc9ea5f9c9b5b796ad0Yuli Huang
1142f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mModel.resume();
1143f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mPhotoView.resume();
1144898a2f4540635528a0916b0a6b0a177869854ae9Wu-cheng Li        mActionBar.setDisplayOptions(
1145898a2f4540635528a0916b0a6b0a177869854ae9Wu-cheng Li                ((mSecureAlbum == null) && (mSetPathString != null)), true);
1146f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mActionBar.addOnMenuVisibilityListener(mMenuVisibilityListener);
114733ef03776b7734717b16f6fc861b831fb1b1dfacMartijn Coenen
114871cd89a38752bc22ae0ec2df965e4280b776623cChih-Chung Chang        if (mAppBridge != null && !mHasActivityResult) {
114933f8567dd5003e4bb342683f3768ab7552648b02Chih-Chung Chang            mPhotoView.resetToFirstPicture();
1150bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang        }
115171cd89a38752bc22ae0ec2df965e4280b776623cChih-Chung Chang        mHasActivityResult = false;
1152bd7c016d728853d38f98a3c6077b7bd9b08858b9Yuli Huang        mHandler.sendEmptyMessageDelayed(MSG_UNFREEZE_GLROOT, UNFREEZE_GLROOT_TIMEOUT);
1153f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
1154f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
115515b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang    @Override
115615b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang    protected void onDestroy() {
1157bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang        if (mAppBridge != null) {
1158253c5aec7692afdd7880fbd169d4b44d5679cbc0Chih-Chung Chang            mAppBridge.setServer(null);
11593b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang            mScreenNailItem.setScreenNail(null);
1160bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang            mAppBridge.detachScreenNail();
1161bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang            mAppBridge = null;
11623b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang            mScreenNailSet = null;
11633b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang            mScreenNailItem = null;
1164b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang        }
1165bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang        mOrientationManager.removeListener(this);
11662ef46ed28b28b355d7f3f1432c7b1196b832a859Chih-Chung Chang        mActivity.getGLRoot().setOrientationSource(null);
1167a9948ef755f665f1327ef80760df3858f1030454Bobby Georgescu        cleanupEditButton();
1168aeb3062e84ed28f0e25a73f511f287ae0a3e4294Chih-Chung Chang
1169aeb3062e84ed28f0e25a73f511f287ae0a3e4294Chih-Chung Chang        // Remove all pending messages.
1170aeb3062e84ed28f0e25a73f511f287ae0a3e4294Chih-Chung Chang        mHandler.removeCallbacksAndMessages(null);
117115b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang        super.onDestroy();
117215b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang    }
117315b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang
1174f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private class MyDetailsSource implements DetailsSource {
11756cf807453fb58ccd4cc513ff187b306c7090e67cOwen Lin
11766cf807453fb58ccd4cc513ff187b306c7090e67cOwen Lin        @Override
1177f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        public MediaDetails getDetails() {
1178616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin            return mModel.getMediaItem(0).getDetails();
1179f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
11806cf807453fb58ccd4cc513ff187b306c7090e67cOwen Lin
11816cf807453fb58ccd4cc513ff187b306c7090e67cOwen Lin        @Override
1182f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        public int size() {
1183f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            return mMediaSet != null ? mMediaSet.getMediaItemCount() : 1;
1184f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
11856cf807453fb58ccd4cc513ff187b306c7090e67cOwen Lin
11866cf807453fb58ccd4cc513ff187b306c7090e67cOwen Lin        @Override
1187995c4566bed7df1aa48ba7e1351f964efa73880bMichael Kolb        public int setIndex() {
1188995c4566bed7df1aa48ba7e1351f964efa73880bMichael Kolb            return mModel.getCurrentIndex();
11894105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen        }
1190f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
1191f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin}
1192