PhotoPage.java revision c6781c0c0d8d193863ca09455a5bda3d542db493
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;
2504ac045bf8da5082bbb0bdc9ea5f9c9b5b796ad0Yuli Huangimport android.graphics.Rect;
26604f053d040782159b61d3b74ee533bc2c0ccdd0Ray Chenimport android.net.Uri;
2733ef03776b7734717b16f6fc861b831fb1b1dfacMartijn Coenenimport android.nfc.NfcAdapter;
28604f053d040782159b61d3b74ee533bc2c0ccdd0Ray Chenimport android.os.Bundle;
29604f053d040782159b61d3b74ee533bc2c0ccdd0Ray Chenimport android.os.Handler;
30604f053d040782159b61d3b74ee533bc2c0ccdd0Ray Chenimport android.os.Message;
31f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescuimport android.view.animation.AccelerateInterpolator;
32604f053d040782159b61d3b74ee533bc2c0ccdd0Ray Chenimport android.widget.Toast;
33604f053d040782159b61d3b74ee533bc2c0ccdd0Ray Chen
34b21b8e58a604f6c701245d84b141b5b87663192bOwen Linimport com.actionbarsherlock.app.ActionBar.OnMenuVisibilityListener;
35b21b8e58a604f6c701245d84b141b5b87663192bOwen Linimport com.actionbarsherlock.view.Menu;
36b21b8e58a604f6c701245d84b141b5b87663192bOwen Linimport com.actionbarsherlock.view.MenuItem;
37f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.R;
38f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescuimport com.android.gallery3d.anim.FloatAnimation;
39fc86994f86f8cfb31e151c9e730dc1e9dc7b3349Yuli Huangimport com.android.gallery3d.common.ApiHelper;
40616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Linimport com.android.gallery3d.common.Utils;
41f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.data.DataManager;
426b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Changimport com.android.gallery3d.data.FilterDeleteSet;
4383be4e0c9b8e3372eff8f9b1a396afd961b72921Angus Kongimport com.android.gallery3d.data.LocalImage;
44f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.data.MediaDetails;
45f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.data.MediaItem;
46f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.data.MediaObject;
47f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.data.MediaSet;
486b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Changimport com.android.gallery3d.data.MtpSource;
49f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.data.Path;
50a0ce682e40c39ce046c48d8a7f989fff01bb9f2cWu-cheng Liimport com.android.gallery3d.data.SecureAlbum;
51a0ce682e40c39ce046c48d8a7f989fff01bb9f2cWu-cheng Liimport com.android.gallery3d.data.SecureSource;
523b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Changimport com.android.gallery3d.data.SnailAlbum;
533b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Changimport com.android.gallery3d.data.SnailItem;
5415b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Changimport com.android.gallery3d.data.SnailSource;
55f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.picasasource.PicasaSource;
56f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescuimport com.android.gallery3d.ui.AnimationTime;
5724081fe26ca25448ddb9c8f9cc7f406d26344decOwen Linimport com.android.gallery3d.ui.BitmapScreenNail;
584105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chenimport com.android.gallery3d.ui.DetailsHelper;
594105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chenimport com.android.gallery3d.ui.DetailsHelper.CloseListener;
604105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chenimport com.android.gallery3d.ui.DetailsHelper.DetailsSource;
61f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.ui.GLCanvas;
62616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Linimport com.android.gallery3d.ui.GLRoot;
63616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Linimport com.android.gallery3d.ui.GLRoot.OnGLIdleListener;
64f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.ui.GLView;
65f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.ui.ImportCompleteListener;
66f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.ui.MenuExecutor;
67616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Linimport com.android.gallery3d.ui.PhotoFallbackEffect;
6821a412c93c9b0401b039f4eb86d4950752e5bb84Owen Linimport com.android.gallery3d.ui.PhotoView;
69f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescuimport com.android.gallery3d.ui.RawTexture;
70f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.ui.SelectionManager;
71f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.ui.SynchronizedHandler;
72f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.util.GalleryUtils;
73c6781c0c0d8d193863ca09455a5bda3d542db493Bobby Georgescuimport com.android.gallery3d.util.LightCycleHelper;
7466ca848b2f58b813d366642088d274a1b7c4a90cChih-Chung Changimport com.android.gallery3d.util.MediaSetUtils;
75f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
76bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Changpublic class PhotoPage extends ActivityState implements
7761f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang        PhotoView.Listener, OrientationManager.Listener, AppBridge.Server {
78f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private static final String TAG = "PhotoPage";
79f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
80f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private static final int MSG_HIDE_BARS = 1;
81bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    private static final int MSG_LOCK_ORIENTATION = 2;
82bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    private static final int MSG_UNLOCK_ORIENTATION = 3;
83bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    private static final int MSG_ON_FULL_SCREEN_CHANGED = 4;
8461f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang    private static final int MSG_UPDATE_ACTION_BAR = 5;
85bd7c016d728853d38f98a3c6077b7bd9b08858b9Yuli Huang    private static final int MSG_UNFREEZE_GLROOT = 6;
86e6251df06f0b3c8f556043f8b725b4b19be7474dChih-Chung Chang    private static final int MSG_WANT_BARS = 7;
877eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu    private static final int MSG_REFRESH_GRID_BUTTON = 8;
886cf807453fb58ccd4cc513ff187b306c7090e67cOwen Lin
89f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private static final int HIDE_BARS_TIMEOUT = 3500;
90bd7c016d728853d38f98a3c6077b7bd9b08858b9Yuli Huang    private static final int UNFREEZE_GLROOT_TIMEOUT = 250;
91f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
92f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private static final int REQUEST_SLIDESHOW = 1;
93f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private static final int REQUEST_CROP = 2;
94f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private static final int REQUEST_CROP_PICASA = 3;
95f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang    private static final int REQUEST_EDIT = 4;
9671cd89a38752bc22ae0ec2df965e4280b776623cChih-Chung Chang    private static final int REQUEST_PLAY_VIDEO = 5;
97f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
98f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public static final String KEY_MEDIA_SET_PATH = "media-set-path";
99f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public static final String KEY_MEDIA_ITEM_PATH = "media-item-path";
100f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public static final String KEY_INDEX_HINT = "index-hint";
10104ac045bf8da5082bbb0bdc9ea5f9c9b5b796ad0Yuli Huang    public static final String KEY_OPEN_ANIMATION_RECT = "open-animation-rect";
102bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    public static final String KEY_APP_BRIDGE = "app-bridge";
10354fe6202b6f7d233e7645c121321fe0f3d20fc8bYuli Huang    public static final String KEY_TREAT_BACK_AS_UP = "treat-back-as-up";
1047eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu    public static final String KEY_START_IN_FILMSTRIP = "start-in-filmstrip";
105bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    public static final String KEY_RETURN_INDEX_HINT = "return-index-hint";
106f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
1077eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu    public static final String KEY_ALBUMPAGE_TRANSITION = "albumpage-transition";
1087eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu    public static final int MSG_ALBUMPAGE_NONE = 0;
1097eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu    public static final int MSG_ALBUMPAGE_STARTED = 1;
1107eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu    public static final int MSG_ALBUMPAGE_RESUMED = 2;
1117eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu    public static final int MSG_ALBUMPAGE_PICKED = 4;
1127eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu
113f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private GalleryApp mApplication;
114f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private SelectionManager mSelectionManager;
115f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
116f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private PhotoView mPhotoView;
117f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private PhotoPage.Model mModel;
1184105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen    private DetailsHelper mDetailsHelper;
119f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private boolean mShowDetails;
120f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
121f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    // mMediaSet could be null if there is no KEY_MEDIA_SET_PATH supplied.
122f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    // E.g., viewing a photo in gmail attachment
1236b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang    private FilterDeleteSet mMediaSet;
124f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
125a0ce682e40c39ce046c48d8a7f989fff01bb9f2cWu-cheng Li    // The mediaset used by camera launched from secure lock screen.
126a0ce682e40c39ce046c48d8a7f989fff01bb9f2cWu-cheng Li    private SecureAlbum mSecureAlbum;
127a0ce682e40c39ce046c48d8a7f989fff01bb9f2cWu-cheng Li
128f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private int mCurrentIndex = 0;
129f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private Handler mHandler;
130113bfc77c4468411da9ae1290553c3be89f8df9aOwen Lin    private boolean mShowBars = true;
13161f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang    private volatile boolean mActionBarAllowed = true;
1328cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen    private GalleryActionBar mActionBar;
133f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private boolean mIsMenuVisible;
134f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private MediaItem mCurrentPhoto = null;
135f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private MenuExecutor mMenuExecutor;
136f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private boolean mIsActive;
13784c220f10a643927c8a2126de8a755d8d7f7ec9eRay Chen    private String mSetPathString;
138b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang    // This is the original mSetPathString before adding the camera preview item.
139b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang    private String mOriginalSetPathString;
140bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    private AppBridge mAppBridge;
1413b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang    private SnailItem mScreenNailItem;
1423b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang    private SnailAlbum mScreenNailSet;
143bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    private OrientationManager mOrientationManager;
14471cd89a38752bc22ae0ec2df965e4280b776623cChih-Chung Chang    private boolean mHasActivityResult;
14554fe6202b6f7d233e7645c121321fe0f3d20fc8bYuli Huang    private boolean mTreatBackAsUp;
1467eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu    private boolean mStartInFilmstrip;
1477eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu    private boolean mStartedFromAlbumPage;
14815b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang
149f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu    private RawTexture mFadeOutTexture;
150f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu    private Rect mOpenAnimationRect;
1517eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu    public static final int ANIM_TIME_OPENING = 300;
152f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu
1536b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang    // The item that is deleted (but it can still be undeleted before commiting)
1546b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang    private Path mDeletePath;
1556b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang    private boolean mDeleteIsFocus;  // whether the deleted item was in focus
1566b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang
15733ef03776b7734717b16f6fc861b831fb1b1dfacMartijn Coenen    private NfcAdapter mNfcAdapter;
15833ef03776b7734717b16f6fc861b831fb1b1dfacMartijn Coenen
1592bb717f1ea38e2ce33dd102a23afe6bfacb5675cOwen Lin    private final MyMenuVisibilityListener mMenuVisibilityListener =
1602bb717f1ea38e2ce33dd102a23afe6bfacb5675cOwen Lin            new MyMenuVisibilityListener();
1612bb717f1ea38e2ce33dd102a23afe6bfacb5675cOwen Lin
162f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public static interface Model extends PhotoView.Model {
163f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        public void resume();
164f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        public void pause();
165f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        public boolean isEmpty();
166f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        public void setCurrentPhoto(Path path, int indexHint);
167f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
168f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
169f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private class MyMenuVisibilityListener implements OnMenuVisibilityListener {
17006c6401eededc2ec842ba4994a838c2ded0a666cPin Ting        @Override
171f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        public void onMenuVisibilityChanged(boolean isVisible) {
172f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            mIsMenuVisible = isVisible;
173f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            refreshHidingMessage();
174f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
175f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
176f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
177f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu    private static class BackgroundFadeOut extends FloatAnimation {
178f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu        public BackgroundFadeOut() {
179f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu            super(1f, 0f, ANIM_TIME_OPENING);
180f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu            setInterpolator(new AccelerateInterpolator(2f));
181f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu        }
182f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu    }
183f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu
184f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu    private final FloatAnimation mBackgroundFade = new BackgroundFadeOut();
185f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
186915c2c5b2c367df71599370613af0924bd7c4887Bobby Georgescu    @Override
187915c2c5b2c367df71599370613af0924bd7c4887Bobby Georgescu    protected int getBackgroundColorId() {
188915c2c5b2c367df71599370613af0924bd7c4887Bobby Georgescu        return R.color.photo_background;
189915c2c5b2c367df71599370613af0924bd7c4887Bobby Georgescu    }
190915c2c5b2c367df71599370613af0924bd7c4887Bobby Georgescu
191f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu    private final GLView mRootPane = new GLView() {
192f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        @Override
193f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        protected void renderBackground(GLCanvas view) {
19483be4e0c9b8e3372eff8f9b1a396afd961b72921Angus Kong            if (mFadeOutTexture != null) {
19583be4e0c9b8e3372eff8f9b1a396afd961b72921Angus Kong                if (mBackgroundFade.calculate(AnimationTime.get())) invalidate();
19683be4e0c9b8e3372eff8f9b1a396afd961b72921Angus Kong                if (!mBackgroundFade.isActive()) {
197f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu                    mFadeOutTexture = null;
198f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu                    mOpenAnimationRect = null;
199f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu                    BitmapScreenNail.enableDrawPlaceholder();
200f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu                } else {
201f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu                    float fadeAlpha = mBackgroundFade.get();
20283be4e0c9b8e3372eff8f9b1a396afd961b72921Angus Kong                    if (fadeAlpha < 1f) {
203915c2c5b2c367df71599370613af0924bd7c4887Bobby Georgescu                        view.clearBuffer(getBackgroundColor());
204f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu                        view.setAlpha(fadeAlpha);
205f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu                    }
206f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu                    mFadeOutTexture.draw(view, 0, 0);
20702ef48574ef7099ebaa0386bd6fd676bd2fd5489Bobby Georgescu                    view.setAlpha(1f - fadeAlpha);
208f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu                    return;
209f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu                }
210f4a707f9716874025b189d0e4ca4dfad0d7abbabBobby Georgescu            }
211915c2c5b2c367df71599370613af0924bd7c4887Bobby Georgescu            view.clearBuffer(getBackgroundColor());
212f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
213f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
214f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        @Override
215f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        protected void onLayout(
216f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                boolean changed, int left, int top, int right, int bottom) {
217f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            mPhotoView.layout(0, 0, right - left, bottom - top);
218f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            if (mShowDetails) {
2198cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen                mDetailsHelper.layout(left, mActionBar.getHeight(), right, bottom);
220f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            }
221f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
222f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    };
223f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
224f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    @Override
225f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public void onCreate(Bundle data, Bundle restoreState) {
22645c56f2d34c71d0bc9b84ebeef6d1314738d0fc0Bobby Georgescu        super.onCreate(data, restoreState);
2278cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen        mActionBar = mActivity.getGalleryActionBar();
228f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mSelectionManager = new SelectionManager(mActivity, false);
229f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mMenuExecutor = new MenuExecutor(mActivity, mSelectionManager);
230f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
231f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mPhotoView = new PhotoView(mActivity);
232bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang        mPhotoView.setListener(this);
233f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mRootPane.addComponent(mPhotoView);
23483be4e0c9b8e3372eff8f9b1a396afd961b72921Angus Kong        mApplication = (GalleryApp) ((Activity) mActivity).getApplication();
235bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang        mOrientationManager = mActivity.getOrientationManager();
236bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang        mOrientationManager.addListener(this);
2372ef46ed28b28b355d7f3f1432c7b1196b832a859Chih-Chung Chang        mActivity.getGLRoot().setOrientationSource(mOrientationManager);
238f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
23984c220f10a643927c8a2126de8a755d8d7f7ec9eRay Chen        mSetPathString = data.getString(KEY_MEDIA_SET_PATH);
240b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang        mOriginalSetPathString = mSetPathString;
24133ef03776b7734717b16f6fc861b831fb1b1dfacMartijn Coenen        mNfcAdapter = NfcAdapter.getDefaultAdapter(mActivity.getAndroidContext());
2427eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu        String itemPathString = data.getString(KEY_MEDIA_ITEM_PATH);
2437eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu        Path itemPath = itemPathString != null ?
2447eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu                Path.fromString(data.getString(KEY_MEDIA_ITEM_PATH)) :
2457eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu                    null;
24654fe6202b6f7d233e7645c121321fe0f3d20fc8bYuli Huang        mTreatBackAsUp = data.getBoolean(KEY_TREAT_BACK_AS_UP, false);
2477eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu        mStartInFilmstrip =
2487eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu            data.getBoolean(KEY_START_IN_FILMSTRIP, false);
2497eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu        mStartedFromAlbumPage =
2507eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu                data.getInt(KEY_ALBUMPAGE_TRANSITION,
2517eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu                        MSG_ALBUMPAGE_NONE) == MSG_ALBUMPAGE_STARTED;
2527eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu        setGridButtonVisibility(!mStartedFromAlbumPage);
25384c220f10a643927c8a2126de8a755d8d7f7ec9eRay Chen        if (mSetPathString != null) {
254bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang            mAppBridge = (AppBridge) data.getParcelable(KEY_APP_BRIDGE);
255bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang            if (mAppBridge != null) {
2567eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu                mFlags |= FLAG_HIDE_ACTION_BAR | FLAG_HIDE_STATUS_BAR;
2577eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu                mShowBars = false;
2587eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu
259253c5aec7692afdd7880fbd169d4b44d5679cbc0Chih-Chung Chang                mAppBridge.setServer(this);
260bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang                mOrientationManager.lockOrientation();
261b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang
262bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang                // Get the ScreenNail from AppBridge and register it.
2633b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang                int id = SnailSource.newId();
264b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang                Path screenNailSetPath = SnailSource.getSetPath(id);
265bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang                Path screenNailItemPath = SnailSource.getItemPath(id);
2663b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang                mScreenNailSet = (SnailAlbum) mActivity.getDataManager()
2673b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang                        .getMediaObject(screenNailSetPath);
2683b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang                mScreenNailItem = (SnailItem) mActivity.getDataManager()
269bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang                        .getMediaObject(screenNailItemPath);
2703b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang                mScreenNailItem.setScreenNail(mAppBridge.attachScreenNail());
271b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang
272a0ce682e40c39ce046c48d8a7f989fff01bb9f2cWu-cheng Li                // Check if the path is a secure album.
273a0ce682e40c39ce046c48d8a7f989fff01bb9f2cWu-cheng Li                if (SecureSource.isSecurePath(mSetPathString)) {
274a0ce682e40c39ce046c48d8a7f989fff01bb9f2cWu-cheng Li                    mSecureAlbum = (SecureAlbum) mActivity.getDataManager()
275a0ce682e40c39ce046c48d8a7f989fff01bb9f2cWu-cheng Li                            .getMediaSet(mSetPathString);
276efd480e85dc5bd0d2ca0ac82d03e141212388830Wu-cheng Li                    // Set the flag to be on top of the lock screen.
277efd480e85dc5bd0d2ca0ac82d03e141212388830Wu-cheng Li                    mFlags |= FLAG_SHOW_WHEN_LOCKED;
278a0ce682e40c39ce046c48d8a7f989fff01bb9f2cWu-cheng Li                }
279a0ce682e40c39ce046c48d8a7f989fff01bb9f2cWu-cheng Li
2803b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang                // Combine the original MediaSet with the one for ScreenNail
2813b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang                // from AppBridge.
282b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang                mSetPathString = "/combo/item/{" + screenNailSetPath +
283b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang                        "," + mSetPathString + "}";
284b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang
285b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang                // Start from the screen nail.
286bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang                itemPath = screenNailItemPath;
287b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang            }
288b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang
2896118af9ddad8acc050133154f8f60c842c7f9bfaChih-Chung Chang            MediaSet originalSet = mActivity.getDataManager()
2906118af9ddad8acc050133154f8f60c842c7f9bfaChih-Chung Chang                    .getMediaSet(mSetPathString);
2916118af9ddad8acc050133154f8f60c842c7f9bfaChih-Chung Chang            mSelectionManager.setSourceMediaSet(originalSet);
2926b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang            mSetPathString = "/filter/delete/{" + mSetPathString + "}";
2936b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang            mMediaSet = (FilterDeleteSet) mActivity.getDataManager()
2946b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang                    .getMediaSet(mSetPathString);
295f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            mCurrentIndex = data.getInt(KEY_INDEX_HINT, 0);
296f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            if (mMediaSet == null) {
29784c220f10a643927c8a2126de8a755d8d7f7ec9eRay Chen                Log.w(TAG, "failed to restore " + mSetPathString);
298f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            }
2997eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu            if (itemPath == null) {
3007eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu               itemPath = mMediaSet.getMediaItem(mCurrentIndex, 1)
3017eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu                       .get(0).getPath();
3027eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu            }
303f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            PhotoDataAdapter pda = new PhotoDataAdapter(
304bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang                    mActivity, mPhotoView, mMediaSet, itemPath, mCurrentIndex,
30543a80fd806247cb50e81bacda3ad21d210e9ae88Angus Kong                    mAppBridge == null ? -1 : 0,
306dbb6acc204ba6f095eb0e49e1298e9ceda2c3096Wu-cheng Li                    mAppBridge == null ? false : mAppBridge.isPanorama(),
307dbb6acc204ba6f095eb0e49e1298e9ceda2c3096Wu-cheng Li                    mAppBridge == null ? false : mAppBridge.isStaticCamera());
308f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            mModel = pda;
309f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            mPhotoView.setModel(mModel);
310f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
311f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            pda.setDataListener(new PhotoDataAdapter.DataListener() {
312f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
313113bfc77c4468411da9ae1290553c3be89f8df9aOwen Lin                @Override
314f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                public void onPhotoChanged(int index, Path item) {
315f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                    mCurrentIndex = index;
316f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                    if (item != null) {
317616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin                        MediaItem photo = mModel.getMediaItem(0);
318f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                        if (photo != null) updateCurrentPhoto(photo);
319f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                    }
32061f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang                    updateBars();
321f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                }
322f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
323f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                @Override
324f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                public void onLoadingFinished() {
325f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                    if (!mModel.isEmpty()) {
326616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin                        MediaItem photo = mModel.getMediaItem(0);
327f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                        if (photo != null) updateCurrentPhoto(photo);
328f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                    } else if (mIsActive) {
329c370476adcf29f311ceec70a119792a0168781e9Chih-Chung Chang                        // We only want to finish the PhotoPage if there is no
330c370476adcf29f311ceec70a119792a0168781e9Chih-Chung Chang                        // deletion that the user can undo.
331c370476adcf29f311ceec70a119792a0168781e9Chih-Chung Chang                        if (mMediaSet.getNumberOfDeletions() == 0) {
332c370476adcf29f311ceec70a119792a0168781e9Chih-Chung Chang                            mActivity.getStateManager().finishState(
333c370476adcf29f311ceec70a119792a0168781e9Chih-Chung Chang                                    PhotoPage.this);
334c370476adcf29f311ceec70a119792a0168781e9Chih-Chung Chang                        }
335f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                    }
336f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                }
337f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
338f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                @Override
339f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                public void onLoadingStarted() {
340f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                }
341f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            });
342f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        } else {
343f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            // Get default media set by the URI
344f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            MediaItem mediaItem = (MediaItem)
345f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                    mActivity.getDataManager().getMediaObject(itemPath);
346f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            mModel = new SinglePhotoDataAdapter(mActivity, mPhotoView, mediaItem);
347f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            mPhotoView.setModel(mModel);
348f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            updateCurrentPhoto(mediaItem);
349f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
350cf46a3abc26aac7cdb6b6993aeade053304b71d9Ray Chen
351f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mHandler = new SynchronizedHandler(mActivity.getGLRoot()) {
352f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            @Override
353f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            public void handleMessage(Message message) {
354f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                switch (message.what) {
355f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                    case MSG_HIDE_BARS: {
356f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                        hideBars();
357f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                        break;
358f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                    }
3597eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu                    case MSG_REFRESH_GRID_BUTTON: {
3607eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu                        setGridButtonVisibility(mPhotoView.getFilmMode());
3617eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu                        break;
3627eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu                    }
363bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang                    case MSG_LOCK_ORIENTATION: {
364bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang                        mOrientationManager.lockOrientation();
365bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang                        break;
366bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang                    }
367bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang                    case MSG_UNLOCK_ORIENTATION: {
368bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang                        mOrientationManager.unlockOrientation();
369bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang                        break;
370bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang                    }
371bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang                    case MSG_ON_FULL_SCREEN_CHANGED: {
372bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang                        mAppBridge.onFullScreenChanged(message.arg1 == 1);
373bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang                        break;
374bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang                    }
37561f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang                    case MSG_UPDATE_ACTION_BAR: {
37661f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang                        updateBars();
37761f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang                        break;
37861f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang                    }
379e6251df06f0b3c8f556043f8b725b4b19be7474dChih-Chung Chang                    case MSG_WANT_BARS: {
380e6251df06f0b3c8f556043f8b725b4b19be7474dChih-Chung Chang                        wantBars();
381e6251df06f0b3c8f556043f8b725b4b19be7474dChih-Chung Chang                        break;
382e6251df06f0b3c8f556043f8b725b4b19be7474dChih-Chung Chang                    }
383bd7c016d728853d38f98a3c6077b7bd9b08858b9Yuli Huang                    case MSG_UNFREEZE_GLROOT: {
384bd7c016d728853d38f98a3c6077b7bd9b08858b9Yuli Huang                        mActivity.getGLRoot().unfreeze();
385bd7c016d728853d38f98a3c6077b7bd9b08858b9Yuli Huang                        break;
386bd7c016d728853d38f98a3c6077b7bd9b08858b9Yuli Huang                    }
387f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                    default: throw new AssertionError(message.what);
388f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                }
389f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            }
390f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        };
391f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
3927eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu        mPhotoView.setFilmMode(mStartInFilmstrip);
393f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
394f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
3956772173d2a49b87a1d209f42fe52b5f830596f99Chih-Chung Chang    @TargetApi(ApiHelper.VERSION_CODES.JELLY_BEAN)
396fc86994f86f8cfb31e151c9e730dc1e9dc7b3349Yuli Huang    private void setNfcBeamPushUris(Uri[] uris) {
3976772173d2a49b87a1d209f42fe52b5f830596f99Chih-Chung Chang        if (mNfcAdapter != null && ApiHelper.HAS_SET_BEAM_PUSH_URIS) {
39824081fe26ca25448ddb9c8f9cc7f406d26344decOwen Lin            mNfcAdapter.setBeamPushUris(uris, mActivity);
399fc86994f86f8cfb31e151c9e730dc1e9dc7b3349Yuli Huang        }
400fc86994f86f8cfb31e151c9e730dc1e9dc7b3349Yuli Huang    }
401fc86994f86f8cfb31e151c9e730dc1e9dc7b3349Yuli Huang
402fb5571987f2555b04731b6f3e1c479efc16d542aWu-cheng Li    private Intent createShareIntent(Path path) {
403fb5571987f2555b04731b6f3e1c479efc16d542aWu-cheng Li        DataManager manager = mActivity.getDataManager();
404fb5571987f2555b04731b6f3e1c479efc16d542aWu-cheng Li        int type = manager.getMediaType(path);
405fb5571987f2555b04731b6f3e1c479efc16d542aWu-cheng Li        Intent intent = new Intent(Intent.ACTION_SEND);
406fb5571987f2555b04731b6f3e1c479efc16d542aWu-cheng Li        intent.setType(MenuExecutor.getMimeType(type));
4072bb717f1ea38e2ce33dd102a23afe6bfacb5675cOwen Lin        Uri uri = manager.getContentUri(path);
408fb5571987f2555b04731b6f3e1c479efc16d542aWu-cheng Li        intent.putExtra(Intent.EXTRA_STREAM, uri);
409fb5571987f2555b04731b6f3e1c479efc16d542aWu-cheng Li        return intent;
410fb5571987f2555b04731b6f3e1c479efc16d542aWu-cheng Li
411fb5571987f2555b04731b6f3e1c479efc16d542aWu-cheng Li    }
412fb5571987f2555b04731b6f3e1c479efc16d542aWu-cheng Li
4132bb717f1ea38e2ce33dd102a23afe6bfacb5675cOwen Lin    private void updateShareURI(Path path) {
41424081fe26ca25448ddb9c8f9cc7f406d26344decOwen Lin        DataManager manager = mActivity.getDataManager();
41524081fe26ca25448ddb9c8f9cc7f406d26344decOwen Lin        Uri uri = manager.getContentUri(path);
41624081fe26ca25448ddb9c8f9cc7f406d26344decOwen Lin        mActionBar.setShareIntent(createShareIntent(path));
41724081fe26ca25448ddb9c8f9cc7f406d26344decOwen Lin        setNfcBeamPushUris(new Uri[]{uri});
418cf46a3abc26aac7cdb6b6993aeade053304b71d9Ray Chen    }
419cf46a3abc26aac7cdb6b6993aeade053304b71d9Ray Chen
420f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private void updateCurrentPhoto(MediaItem photo) {
421f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        if (mCurrentPhoto == photo) return;
422f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mCurrentPhoto = photo;
423f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        if (mCurrentPhoto == null) return;
424f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        updateMenuOperations();
425ed46d77c16cd80357f4a0feada2435dfba8104a6Yuli Huang        updateTitle();
426f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        if (mShowDetails) {
427995c4566bed7df1aa48ba7e1351f964efa73880bMichael Kolb            mDetailsHelper.reloadDetails();
428f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
429898a2f4540635528a0916b0a6b0a177869854ae9Wu-cheng Li        if ((mSecureAlbum == null)
430898a2f4540635528a0916b0a6b0a177869854ae9Wu-cheng Li                && (photo.getSupportedOperations() & MediaItem.SUPPORT_SHARE) != 0) {
43115b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang            updateShareURI(photo.getPath());
43215b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang        }
433f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
434f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
435ed46d77c16cd80357f4a0feada2435dfba8104a6Yuli Huang    private void updateTitle() {
436ed46d77c16cd80357f4a0feada2435dfba8104a6Yuli Huang        if (mCurrentPhoto == null) return;
437ed46d77c16cd80357f4a0feada2435dfba8104a6Yuli Huang        boolean showTitle = mActivity.getAndroidContext().getResources().getBoolean(
438ed46d77c16cd80357f4a0feada2435dfba8104a6Yuli Huang                R.bool.show_action_bar_title);
4392bb717f1ea38e2ce33dd102a23afe6bfacb5675cOwen Lin        if (showTitle && mCurrentPhoto.getName() != null) {
440ed46d77c16cd80357f4a0feada2435dfba8104a6Yuli Huang            mActionBar.setTitle(mCurrentPhoto.getName());
4412bb717f1ea38e2ce33dd102a23afe6bfacb5675cOwen Lin        } else {
442ed46d77c16cd80357f4a0feada2435dfba8104a6Yuli Huang            mActionBar.setTitle("");
4432bb717f1ea38e2ce33dd102a23afe6bfacb5675cOwen Lin        }
444ed46d77c16cd80357f4a0feada2435dfba8104a6Yuli Huang    }
445ed46d77c16cd80357f4a0feada2435dfba8104a6Yuli Huang
446f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private void updateMenuOperations() {
44724081fe26ca25448ddb9c8f9cc7f406d26344decOwen Lin        Menu menu = mActionBar.getMenu();
44824081fe26ca25448ddb9c8f9cc7f406d26344decOwen Lin
44924081fe26ca25448ddb9c8f9cc7f406d26344decOwen Lin        // it could be null if onCreateActionBar has not been called yet
45024081fe26ca25448ddb9c8f9cc7f406d26344decOwen Lin        if (menu == null) return;
45124081fe26ca25448ddb9c8f9cc7f406d26344decOwen Lin
4527eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu        setGridButtonVisibility(mPhotoView.getFilmMode());
4537eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu
45424081fe26ca25448ddb9c8f9cc7f406d26344decOwen Lin        MenuItem item = menu.findItem(R.id.action_slideshow);
455898a2f4540635528a0916b0a6b0a177869854ae9Wu-cheng Li        item.setVisible((mSecureAlbum == null) && canDoSlideShow());
4562066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang        if (mCurrentPhoto == null) return;
45724081fe26ca25448ddb9c8f9cc7f406d26344decOwen Lin
458f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        int supportedOperations = mCurrentPhoto.getSupportedOperations();
459898a2f4540635528a0916b0a6b0a177869854ae9Wu-cheng Li        if (mSecureAlbum != null) {
46024081fe26ca25448ddb9c8f9cc7f406d26344decOwen Lin            supportedOperations &= MediaObject.SUPPORT_DELETE;
461898a2f4540635528a0916b0a6b0a177869854ae9Wu-cheng Li        } else if (!GalleryUtils.isEditorAvailable(mActivity, "image/*")) {
462f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            supportedOperations &= ~MediaObject.SUPPORT_EDIT;
463f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
46424081fe26ca25448ddb9c8f9cc7f406d26344decOwen Lin        MenuExecutor.updateMenuOperation(menu, supportedOperations);
465f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
466f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
4672066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang    private boolean canDoSlideShow() {
4682066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang        if (mMediaSet == null || mCurrentPhoto == null) {
4692066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang            return false;
4702066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang        }
4712066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang        if (mCurrentPhoto.getMediaType() != MediaObject.MEDIA_TYPE_IMAGE) {
4722066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang            return false;
4732066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang        }
4746b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang        if (MtpSource.isMtpPath(mOriginalSetPathString)) {
4752066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang            return false;
4762066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang        }
4772066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang        return true;
4782066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang    }
4792066200f8fd0a2ed5b97e53115eb5de6b56320e1Chih-Chung Chang
48061f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang    //////////////////////////////////////////////////////////////////////////
48161f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang    //  Action Bar show/hide management
48261f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang    //////////////////////////////////////////////////////////////////////////
48361f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang
484f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private void showBars() {
485f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        if (mShowBars) return;
486f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mShowBars = true;
487e6251df06f0b3c8f556043f8b725b4b19be7474dChih-Chung Chang        mOrientationManager.unlockOrientation();
488f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mActionBar.show();
4890b2486cff0c1b951c54325596256b986307f7f3aChih-Chung Chang        mActivity.getGLRoot().setLightsOutMode(false);
49061f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang        refreshHidingMessage();
491f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
492f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
493f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private void hideBars() {
494f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        if (!mShowBars) return;
495f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mShowBars = false;
496f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mActionBar.hide();
4970b2486cff0c1b951c54325596256b986307f7f3aChih-Chung Chang        mActivity.getGLRoot().setLightsOutMode(true);
49861f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang        mHandler.removeMessages(MSG_HIDE_BARS);
499f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
500f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
501f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private void refreshHidingMessage() {
502f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mHandler.removeMessages(MSG_HIDE_BARS);
5037eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu        if (!mIsMenuVisible && !mPhotoView.getFilmMode()) {
504f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            mHandler.sendEmptyMessageDelayed(MSG_HIDE_BARS, HIDE_BARS_TIMEOUT);
505f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
506f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
507f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
508aeb3062e84ed28f0e25a73f511f287ae0a3e4294Chih-Chung Chang    private boolean canShowBars() {
509aeb3062e84ed28f0e25a73f511f287ae0a3e4294Chih-Chung Chang        // No bars if we are showing camera preview.
510aeb3062e84ed28f0e25a73f511f287ae0a3e4294Chih-Chung Chang        if (mAppBridge != null && mCurrentIndex == 0) return false;
511aeb3062e84ed28f0e25a73f511f287ae0a3e4294Chih-Chung Chang        // No bars if it's not allowed.
512aeb3062e84ed28f0e25a73f511f287ae0a3e4294Chih-Chung Chang        if (!mActionBarAllowed) return false;
513aeb3062e84ed28f0e25a73f511f287ae0a3e4294Chih-Chung Chang
514aeb3062e84ed28f0e25a73f511f287ae0a3e4294Chih-Chung Chang        return true;
515aeb3062e84ed28f0e25a73f511f287ae0a3e4294Chih-Chung Chang    }
516aeb3062e84ed28f0e25a73f511f287ae0a3e4294Chih-Chung Chang
517e6251df06f0b3c8f556043f8b725b4b19be7474dChih-Chung Chang    private void wantBars() {
518e6251df06f0b3c8f556043f8b725b4b19be7474dChih-Chung Chang        if (canShowBars()) showBars();
519e6251df06f0b3c8f556043f8b725b4b19be7474dChih-Chung Chang    }
520e6251df06f0b3c8f556043f8b725b4b19be7474dChih-Chung Chang
52161f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang    private void toggleBars() {
522f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        if (mShowBars) {
523f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            hideBars();
524aeb3062e84ed28f0e25a73f511f287ae0a3e4294Chih-Chung Chang        } else {
525e6251df06f0b3c8f556043f8b725b4b19be7474dChih-Chung Chang            if (canShowBars()) showBars();
526f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
527f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
528f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
52961f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang    private void updateBars() {
530e6251df06f0b3c8f556043f8b725b4b19be7474dChih-Chung Chang        if (!canShowBars()) {
53161f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang            hideBars();
53261f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang        }
533f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
534f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
535f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    @Override
5362ef46ed28b28b355d7f3f1432c7b1196b832a859Chih-Chung Chang    public void onOrientationCompensationChanged() {
5372ef46ed28b28b355d7f3f1432c7b1196b832a859Chih-Chung Chang        mActivity.getGLRoot().requestLayoutContentPane();
538bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    }
539bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang
540bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    @Override
541f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    protected void onBackPressed() {
542f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        if (mShowDetails) {
543f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            hideDetails();
5443b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang        } else if (mAppBridge == null || !switchWithCaptureAnimation(-1)) {
545bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang            // We are leaving this page. Set the result now.
546bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang            setResult();
5477eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu            if (mStartInFilmstrip && !mPhotoView.getFilmMode()) {
5487eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu                mPhotoView.setFilmMode(true);
5497eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu            } else if (mTreatBackAsUp) {
55054fe6202b6f7d233e7645c121321fe0f3d20fc8bYuli Huang                onUpPressed();
55154fe6202b6f7d233e7645c121321fe0f3d20fc8bYuli Huang            } else {
55254fe6202b6f7d233e7645c121321fe0f3d20fc8bYuli Huang                super.onBackPressed();
55354fe6202b6f7d233e7645c121321fe0f3d20fc8bYuli Huang            }
554f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
555f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
556f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
557b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang    private void onUpPressed() {
5587eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu        if (mStartInFilmstrip && !mPhotoView.getFilmMode()) {
5597eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu            mPhotoView.setFilmMode(true);
5607eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu            return;
5617eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu        }
5627eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu
563b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang        if (mActivity.getStateManager().getStateCount() > 1) {
5647eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu            setResult();
565b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang            super.onBackPressed();
566ba12eae90b5b1a80ee002aa0df8c5c5189c4faa3Chih-Chung Chang            return;
56766ca848b2f58b813d366642088d274a1b7c4a90cChih-Chung Chang        }
56866ca848b2f58b813d366642088d274a1b7c4a90cChih-Chung Chang
56966ca848b2f58b813d366642088d274a1b7c4a90cChih-Chung Chang        if (mOriginalSetPathString == null) return;
57066ca848b2f58b813d366642088d274a1b7c4a90cChih-Chung Chang
57166ca848b2f58b813d366642088d274a1b7c4a90cChih-Chung Chang        if (mAppBridge == null) {
572b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang            // We're in view mode so set up the stacks on our own.
573b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang            Bundle data = new Bundle(getData());
574b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang            data.putString(AlbumPage.KEY_MEDIA_PATH, mOriginalSetPathString);
575b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang            data.putString(AlbumPage.KEY_PARENT_MEDIA_PATH,
576b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang                    mActivity.getDataManager().getTopSetPath(
577b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang                            DataManager.INCLUDE_ALL));
578b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang            mActivity.getStateManager().switchState(this, AlbumPage.class, data);
57966ca848b2f58b813d366642088d274a1b7c4a90cChih-Chung Chang        } else {
58066ca848b2f58b813d366642088d274a1b7c4a90cChih-Chung Chang            // Start the real gallery activity to view the camera roll.
58166ca848b2f58b813d366642088d274a1b7c4a90cChih-Chung Chang            Uri uri = Uri.parse("content://media/external/file?bucketId="
58266ca848b2f58b813d366642088d274a1b7c4a90cChih-Chung Chang                    + MediaSetUtils.CAMERA_BUCKET_ID);
58366ca848b2f58b813d366642088d274a1b7c4a90cChih-Chung Chang            Intent intent = new Intent(Intent.ACTION_VIEW);
58466ca848b2f58b813d366642088d274a1b7c4a90cChih-Chung Chang            intent.setDataAndType(uri, ContentResolver.CURSOR_DIR_BASE_TYPE + "/image");
58566ca848b2f58b813d366642088d274a1b7c4a90cChih-Chung Chang            ((Activity) mActivity).startActivity(intent);
586b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang        }
587b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang    }
588b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang
589bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    private void setResult() {
590bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang        Intent result = null;
5917eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu        result = new Intent();
5927eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu        result.putExtra(KEY_RETURN_INDEX_HINT, mCurrentIndex);
593bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang        setStateResult(Activity.RESULT_OK, result);
594bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    }
595bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang
596bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    //////////////////////////////////////////////////////////////////////////
597bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    //  AppBridge.Server interface
598bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    //////////////////////////////////////////////////////////////////////////
599bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang
600bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    @Override
6012ef46ed28b28b355d7f3f1432c7b1196b832a859Chih-Chung Chang    public void setCameraRelativeFrame(Rect frame) {
6022ef46ed28b28b355d7f3f1432c7b1196b832a859Chih-Chung Chang        mPhotoView.setCameraRelativeFrame(frame);
603bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    }
604bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang
605bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    @Override
6062c6173822a612597c79be41b126367ddfbb5d518Chih-Chung Chang    public boolean switchWithCaptureAnimation(int offset) {
6072c6173822a612597c79be41b126367ddfbb5d518Chih-Chung Chang        return mPhotoView.switchWithCaptureAnimation(offset);
6082c6173822a612597c79be41b126367ddfbb5d518Chih-Chung Chang    }
6092c6173822a612597c79be41b126367ddfbb5d518Chih-Chung Chang
610f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    @Override
6116575794a9c09f22d5721e212c093e0a2df376d0cChih-Chung Chang    public void setSwipingEnabled(boolean enabled) {
6126575794a9c09f22d5721e212c093e0a2df376d0cChih-Chung Chang        mPhotoView.setSwipingEnabled(enabled);
6136575794a9c09f22d5721e212c093e0a2df376d0cChih-Chung Chang    }
6146575794a9c09f22d5721e212c093e0a2df376d0cChih-Chung Chang
6156575794a9c09f22d5721e212c093e0a2df376d0cChih-Chung Chang    @Override
6163b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang    public void notifyScreenNailChanged() {
6173b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang        mScreenNailItem.setScreenNail(mAppBridge.attachScreenNail());
6183b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang        mScreenNailSet.notifyChange();
6193b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang    }
6203b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang
6213b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang    @Override
622a0ce682e40c39ce046c48d8a7f989fff01bb9f2cWu-cheng Li    public void addSecureAlbumItem(boolean isVideo, int id) {
623a0ce682e40c39ce046c48d8a7f989fff01bb9f2cWu-cheng Li        mSecureAlbum.addMediaItem(isVideo, id);
624a0ce682e40c39ce046c48d8a7f989fff01bb9f2cWu-cheng Li    }
625a0ce682e40c39ce046c48d8a7f989fff01bb9f2cWu-cheng Li
626a0ce682e40c39ce046c48d8a7f989fff01bb9f2cWu-cheng Li    @Override
627f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    protected boolean onCreateActionBar(Menu menu) {
628b21b8e58a604f6c701245d84b141b5b87663192bOwen Lin        mActionBar.createActionBarMenu(R.menu.photo, menu);
629f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        updateMenuOperations();
630ed46d77c16cd80357f4a0feada2435dfba8104a6Yuli Huang        updateTitle();
631b21b8e58a604f6c701245d84b141b5b87663192bOwen Lin        return true;
632f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
633f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
634d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin    private MenuExecutor.ProgressListener mConfirmDialogListener =
635d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin            new MenuExecutor.ProgressListener() {
636d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin        @Override
637d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin        public void onProgressUpdate(int index) {}
638d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin
639d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin        @Override
640d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin        public void onProgressComplete(int result) {}
641d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin
642d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin        @Override
643d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin        public void onConfirmDialogShown() {
644d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin            mHandler.removeMessages(MSG_HIDE_BARS);
645d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin        }
646d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin
647d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin        @Override
648d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin        public void onConfirmDialogDismissed(boolean confirmed) {
649d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin            refreshHidingMessage();
650d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin        }
651ba50b9420e64731fd5aa8b1410e1f36457a1635aBobby Georgescu
652ba50b9420e64731fd5aa8b1410e1f36457a1635aBobby Georgescu        @Override
653ba50b9420e64731fd5aa8b1410e1f36457a1635aBobby Georgescu        public void onProgressStart() {}
654d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin    };
655d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin
656f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    @Override
657f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    protected boolean onItemSelected(MenuItem item) {
658d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin        refreshHidingMessage();
659616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin        MediaItem current = mModel.getMediaItem(0);
660f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
661f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        if (current == null) {
662f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            // item is not ready, ignore
663f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            return true;
664f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
665f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
666f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        int currentIndex = mModel.getCurrentIndex();
667f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        Path path = current.getPath();
668f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
669f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        DataManager manager = mActivity.getDataManager();
670f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        int action = item.getItemId();
6719a033b07b8e0d9fe7419b7a0d876e9c7febf43c8Ray Chen        String confirmMsg = null;
672f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        switch (action) {
67384c220f10a643927c8a2126de8a755d8d7f7ec9eRay Chen            case android.R.id.home: {
674b1e9fd893d62adae1f92d29dfc08bc76f8764491Chih-Chung Chang                onUpPressed();
67584c220f10a643927c8a2126de8a755d8d7f7ec9eRay Chen                return true;
67684c220f10a643927c8a2126de8a755d8d7f7ec9eRay Chen            }
6777eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu            case R.id.action_grid: {
6787eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu                if (mStartedFromAlbumPage) {
6797eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu                    onUpPressed();
6807eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu                } else {
6817eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu                    preparePhotoFallbackView();
6827eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu                    Bundle data = new Bundle(getData());
6837eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu                    data.putString(AlbumPage.KEY_MEDIA_PATH, mOriginalSetPathString);
6847eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu                    data.putString(AlbumPage.KEY_PARENT_MEDIA_PATH,
6857eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu                            mActivity.getDataManager().getTopSetPath(
6867eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu                                    DataManager.INCLUDE_ALL));
6877eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu                    mActivity.getTransitionStore().put(
6887eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu                            KEY_RETURN_INDEX_HINT, mCurrentIndex);
6897eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu                    mActivity.getStateManager().startState(AlbumPage.class, data);
6907eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu                }
6917eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu                return true;
6927eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu            }
693f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            case R.id.action_slideshow: {
694f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                Bundle data = new Bundle();
6956cf807453fb58ccd4cc513ff187b306c7090e67cOwen Lin                data.putString(SlideshowPage.KEY_SET_PATH, mMediaSet.getPath().toString());
696604f053d040782159b61d3b74ee533bc2c0ccdd0Ray Chen                data.putString(SlideshowPage.KEY_ITEM_PATH, path.toString());
697f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                data.putInt(SlideshowPage.KEY_PHOTO_INDEX, currentIndex);
698f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                data.putBoolean(SlideshowPage.KEY_REPEAT, true);
699f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                mActivity.getStateManager().startStateForResult(
700f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                        SlideshowPage.class, REQUEST_SLIDESHOW, data);
701f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                return true;
702f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            }
703f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            case R.id.action_crop: {
704898a2f4540635528a0916b0a6b0a177869854ae9Wu-cheng Li                Activity activity = mActivity;
705f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                Intent intent = new Intent(CropImage.CROP_ACTION);
706f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                intent.setClass(activity, CropImage.class);
707f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                intent.setData(manager.getContentUri(path));
708f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                activity.startActivityForResult(intent, PicasaSource.isPicasaImage(current)
709f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                        ? REQUEST_CROP_PICASA
710f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                        : REQUEST_CROP);
711f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                return true;
712f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            }
71350ea2d2938218ac6b2039f0e42998cfbbc45d1f1Teng-Hui Zhu            case R.id.action_trim: {
71450ea2d2938218ac6b2039f0e42998cfbbc45d1f1Teng-Hui Zhu                // TODO: Add trimming activity here.
71550ea2d2938218ac6b2039f0e42998cfbbc45d1f1Teng-Hui Zhu                return true;
71650ea2d2938218ac6b2039f0e42998cfbbc45d1f1Teng-Hui Zhu            }
717f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang            case R.id.action_edit: {
718f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang                Intent intent = new Intent(Intent.ACTION_EDIT)
719f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang                        .setData(manager.getContentUri(path))
720f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang                        .setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
721f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang                ((Activity) mActivity).startActivityForResult(Intent.createChooser(intent, null),
722f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang                        REQUEST_EDIT);
723f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang                return true;
724f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang            }
725f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            case R.id.action_details: {
726f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                if (mShowDetails) {
727f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                    hideDetails();
728f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                } else {
729995c4566bed7df1aa48ba7e1351f964efa73880bMichael Kolb                    showDetails();
730f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                }
731f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                return true;
732f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            }
73367098d1a72fd04e2af06d3a5939cde28c65f70d9Ray Chen            case R.id.action_delete:
7349a033b07b8e0d9fe7419b7a0d876e9c7febf43c8Ray Chen                confirmMsg = mActivity.getResources().getQuantityString(
7359a033b07b8e0d9fe7419b7a0d876e9c7febf43c8Ray Chen                        R.plurals.delete_selection, 1);
736f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            case R.id.action_setas:
737f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            case R.id.action_rotate_ccw:
738f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            case R.id.action_rotate_cw:
739f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            case R.id.action_show_on_map:
740f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                mSelectionManager.deSelectAll();
741f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                mSelectionManager.toggle(path);
742d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin                mMenuExecutor.onMenuClicked(item, confirmMsg, mConfirmDialogListener);
743f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                return true;
744f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            case R.id.action_import:
745f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                mSelectionManager.deSelectAll();
746f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                mSelectionManager.toggle(path);
7479a033b07b8e0d9fe7419b7a0d876e9c7febf43c8Ray Chen                mMenuExecutor.onMenuClicked(item, confirmMsg,
748f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                        new ImportCompleteListener(mActivity));
749f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                return true;
750fb5571987f2555b04731b6f3e1c479efc16d542aWu-cheng Li            case R.id.action_share:
751898a2f4540635528a0916b0a6b0a177869854ae9Wu-cheng Li                Activity activity = mActivity;
752fb5571987f2555b04731b6f3e1c479efc16d542aWu-cheng Li                Intent intent = createShareIntent(mCurrentPhoto.getPath());
753fb5571987f2555b04731b6f3e1c479efc16d542aWu-cheng Li                activity.startActivity(Intent.createChooser(intent,
754fb5571987f2555b04731b6f3e1c479efc16d542aWu-cheng Li                        activity.getString(R.string.share)));
755fb5571987f2555b04731b6f3e1c479efc16d542aWu-cheng Li                return true;
756f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            default :
757f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                return false;
758f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
759f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
760f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
761f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private void hideDetails() {
762f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mShowDetails = false;
7634105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen        mDetailsHelper.hide();
764f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
765f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
766995c4566bed7df1aa48ba7e1351f964efa73880bMichael Kolb    private void showDetails() {
767f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mShowDetails = true;
7684105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen        if (mDetailsHelper == null) {
7694105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen            mDetailsHelper = new DetailsHelper(mActivity, mRootPane, new MyDetailsSource());
7704105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen            mDetailsHelper.setCloseListener(new CloseListener() {
77106c6401eededc2ec842ba4994a838c2ded0a666cPin Ting                @Override
772f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                public void onClose() {
773f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                    hideDetails();
774f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                }
775f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            });
776f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
7774105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen        mDetailsHelper.show();
778f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
779f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
780bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    ////////////////////////////////////////////////////////////////////////////
781bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    //  Callbacks from PhotoView
782bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    ////////////////////////////////////////////////////////////////////////////
783bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    @Override
784f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public void onSingleTapUp(int x, int y) {
785bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang        if (mAppBridge != null) {
786bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang            if (mAppBridge.onSingleTapUp(x, y)) return;
787014d9586d8145a33f4e99eaad570587f6d650026Wu-cheng Li        }
788014d9586d8145a33f4e99eaad570587f6d650026Wu-cheng Li
789616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin        MediaItem item = mModel.getMediaItem(0);
790b5dc542fbaeaf99bebdcf775ef0e034e89e88eaeWu-cheng Li        if (item == null || item == mScreenNailItem) {
791b5dc542fbaeaf99bebdcf775ef0e034e89e88eaeWu-cheng Li            // item is not ready or it is camera preview, ignore
792f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            return;
793f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
794f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
795898a2f4540635528a0916b0a6b0a177869854ae9Wu-cheng Li        boolean playVideo = (mSecureAlbum == null) &&
796898a2f4540635528a0916b0a6b0a177869854ae9Wu-cheng Li                ((item.getSupportedOperations() & MediaItem.SUPPORT_PLAY) != 0);
79783be4e0c9b8e3372eff8f9b1a396afd961b72921Angus Kong        boolean viewPanorama =
79883be4e0c9b8e3372eff8f9b1a396afd961b72921Angus Kong                (item.getSupportedOperations() & MediaItem.SUPPORT_VIEW_PANORAMA) != 0;
799f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
800f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        if (playVideo) {
801f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            // determine if the point is at center (1/6) of the photo view.
802f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            // (The position of the "play" icon is at center (1/6) of the photo)
803f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            int w = mPhotoView.getWidth();
804f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            int h = mPhotoView.getHeight();
805f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            playVideo = (Math.abs(x - w / 2) * 12 <= w)
806f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                && (Math.abs(y - h / 2) * 12 <= h);
807f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
808f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
809f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        if (playVideo) {
810898a2f4540635528a0916b0a6b0a177869854ae9Wu-cheng Li            playVideo(mActivity, item.getPlayUri(), item.getName());
81183be4e0c9b8e3372eff8f9b1a396afd961b72921Angus Kong        } else if (viewPanorama) {
81283be4e0c9b8e3372eff8f9b1a396afd961b72921Angus Kong            LocalImage img = (LocalImage) item;
81383be4e0c9b8e3372eff8f9b1a396afd961b72921Angus Kong            LightCycleHelper.viewPanorama(
81483be4e0c9b8e3372eff8f9b1a396afd961b72921Angus Kong                    mActivity, img.getContentUri(), img.getMimeType());
815f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        } else {
81661f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang            toggleBars();
817f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
818f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
819f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
820bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    @Override
821bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    public void lockOrientation() {
822bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang        mHandler.sendEmptyMessage(MSG_LOCK_ORIENTATION);
823bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    }
824bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang
825bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    @Override
826bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    public void unlockOrientation() {
82706c6401eededc2ec842ba4994a838c2ded0a666cPin Ting        mHandler.sendEmptyMessage(MSG_UNLOCK_ORIENTATION);
828bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    }
829bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang
830bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    @Override
83161f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang    public void onActionBarAllowed(boolean allowed) {
83261f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang        mActionBarAllowed = allowed;
83361f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang        mHandler.sendEmptyMessage(MSG_UPDATE_ACTION_BAR);
83461f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang    }
83561f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang
83661f94714c3702115d2f89bb5f8829697be0c3680Chih-Chung Chang    @Override
837e6251df06f0b3c8f556043f8b725b4b19be7474dChih-Chung Chang    public void onActionBarWanted() {
838e6251df06f0b3c8f556043f8b725b4b19be7474dChih-Chung Chang        mHandler.sendEmptyMessage(MSG_WANT_BARS);
839e6251df06f0b3c8f556043f8b725b4b19be7474dChih-Chung Chang    }
840e6251df06f0b3c8f556043f8b725b4b19be7474dChih-Chung Chang
841e6251df06f0b3c8f556043f8b725b4b19be7474dChih-Chung Chang    @Override
842bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    public void onFullScreenChanged(boolean full) {
843bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang        Message m = mHandler.obtainMessage(
844bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang                MSG_ON_FULL_SCREEN_CHANGED, full ? 1 : 0, 0);
845bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang        m.sendToTarget();
846bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    }
847bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang
8486b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang    // How we do delete/undo:
8496b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang    //
8506b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang    // When the user choose to delete a media item, we just tell the
8516b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang    // FilterDeleteSet to hide that item. If the user choose to undo it, we
8526b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang    // again tell FilterDeleteSet not to hide it. If the user choose to commit
8536b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang    // the deletion, we then actually delete the media item.
8546b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang    @Override
8556b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang    public void onDeleteImage(Path path, int offset) {
8566118af9ddad8acc050133154f8f60c842c7f9bfaChih-Chung Chang        onCommitDeleteImage();  // commit the previous deletion
8576b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang        mDeletePath = path;
8586b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang        mDeleteIsFocus = (offset == 0);
8596118af9ddad8acc050133154f8f60c842c7f9bfaChih-Chung Chang        mMediaSet.addDeletion(path, mCurrentIndex + offset);
8606b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang    }
8616b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang
8626b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang    @Override
8636b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang    public void onUndoDeleteImage() {
8646118af9ddad8acc050133154f8f60c842c7f9bfaChih-Chung Chang        if (mDeletePath == null) return;
8656b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang        // If the deletion was done on the focused item, we want the model to
8666b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang        // focus on it when it is undeleted.
8676b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang        if (mDeleteIsFocus) mModel.setFocusHintPath(mDeletePath);
8686118af9ddad8acc050133154f8f60c842c7f9bfaChih-Chung Chang        mMediaSet.removeDeletion(mDeletePath);
8696b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang        mDeletePath = null;
8706b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang    }
8716b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang
8726b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang    @Override
8736b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang    public void onCommitDeleteImage() {
8746b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang        if (mDeletePath == null) return;
8756b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang        mSelectionManager.deSelectAll();
8766b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang        mSelectionManager.toggle(mDeletePath);
8776b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang        mMenuExecutor.onMenuClicked(R.id.action_delete, null, true, false);
8786b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang        mDeletePath = null;
8796b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang    }
8806b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang
881f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public static void playVideo(Activity activity, Uri uri, String title) {
882f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        try {
883f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            Intent intent = new Intent(Intent.ACTION_VIEW)
884a3871050845b4921379add2b126add3cfbab1109Ray Chen                    .setDataAndType(uri, "video/*")
885a3871050845b4921379add2b126add3cfbab1109Ray Chen                    .putExtra(Intent.EXTRA_TITLE, title)
886a3871050845b4921379add2b126add3cfbab1109Ray Chen                    .putExtra(MovieActivity.KEY_TREAT_UP_AS_BACK, true);
88771cd89a38752bc22ae0ec2df965e4280b776623cChih-Chung Chang            activity.startActivityForResult(intent, REQUEST_PLAY_VIDEO);
888f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        } catch (ActivityNotFoundException e) {
889f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            Toast.makeText(activity, activity.getString(R.string.video_err),
890f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                    Toast.LENGTH_SHORT).show();
891f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
892f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
893f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
894f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang    private void setCurrentPhotoByIntent(Intent intent) {
895f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang        if (intent == null) return;
896f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang        Path path = mApplication.getDataManager()
897f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang                .findPathByUri(intent.getData(), intent.getType());
898f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang        if (path != null) {
899f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang            mModel.setCurrentPhoto(path, mCurrentIndex);
900f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang        }
901f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang    }
902f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang
903f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    @Override
904f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    protected void onStateResult(int requestCode, int resultCode, Intent data) {
90571cd89a38752bc22ae0ec2df965e4280b776623cChih-Chung Chang        mHasActivityResult = true;
906f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        switch (requestCode) {
907f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang            case REQUEST_EDIT:
908f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang                setCurrentPhotoByIntent(data);
909f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang                break;
910f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            case REQUEST_CROP:
911f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                if (resultCode == Activity.RESULT_OK) {
912f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang                    setCurrentPhotoByIntent(data);
913f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                }
914f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                break;
915f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            case REQUEST_CROP_PICASA: {
916f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang                if (resultCode == Activity.RESULT_OK) {
917f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang                    Context context = mActivity.getAndroidContext();
91888cc2ca5f5596762a5546ec7426756f2036be455Yuli Huang                    String message = context.getString(R.string.crop_saved,
919f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang                            context.getString(R.string.folder_download));
920f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang                    Toast.makeText(context, message, Toast.LENGTH_SHORT).show();
921f50ce2b708c0c70930a346206fdd526f53ae6004Yuli Huang                }
922f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                break;
923f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            }
924f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            case REQUEST_SLIDESHOW: {
925f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                if (data == null) break;
926f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                String path = data.getStringExtra(SlideshowPage.KEY_ITEM_PATH);
927f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                int index = data.getIntExtra(SlideshowPage.KEY_PHOTO_INDEX, 0);
928f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                if (path != null) {
929f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                    mModel.setCurrentPhoto(Path.fromString(path), index);
930f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                }
931f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            }
932f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
933f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
934f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
93514d3289b4867c21da93ec4032119c0091bc78c30George Mount    @Override
93614d3289b4867c21da93ec4032119c0091bc78c30George Mount    protected void clearStateResult() {
93714d3289b4867c21da93ec4032119c0091bc78c30George Mount        mHasActivityResult = false;
93814d3289b4867c21da93ec4032119c0091bc78c30George Mount    }
93914d3289b4867c21da93ec4032119c0091bc78c30George Mount
940616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin    private class PreparePhotoFallback implements OnGLIdleListener {
941616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin        private PhotoFallbackEffect mPhotoFallback = new PhotoFallbackEffect();
942616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin        private boolean mResultReady = false;
943616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin
944616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin        public synchronized PhotoFallbackEffect get() {
945616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin            while (!mResultReady) {
946616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin                Utils.waitWithoutInterrupt(this);
947616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin            }
948616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin            return mPhotoFallback;
949616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin        }
950616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin
951616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin        @Override
952616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin        public boolean onGLIdle(GLCanvas canvas, boolean renderRequested) {
953616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin            mPhotoFallback = mPhotoView.buildFallbackEffect(mRootPane, canvas);
954616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin            synchronized (this) {
955616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin                mResultReady = true;
956616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin                notifyAll();
957616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin            }
958616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin            return false;
959616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin        }
960616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin    }
961616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin
962616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin    private void preparePhotoFallbackView() {
963616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin        GLRoot root = mActivity.getGLRoot();
964616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin        PreparePhotoFallback task = new PreparePhotoFallback();
965616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin        root.unlockRenderThread();
966616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin        PhotoFallbackEffect anim;
967616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin        try {
968616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin            root.addOnGLIdleListener(task);
969616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin            anim = task.get();
970616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin        } finally {
971616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin            root.lockRenderThread();
972616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin        }
973616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin        mActivity.getTransitionStore().put(
974616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin                AlbumPage.KEY_RESUME_ANIMATION, anim);
975616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin    }
976616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin
977f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    @Override
978f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public void onPause() {
979d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin        super.onPause();
980d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin        mIsActive = false;
981d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin
982bd7c016d728853d38f98a3c6077b7bd9b08858b9Yuli Huang        mActivity.getGLRoot().unfreeze();
983bd7c016d728853d38f98a3c6077b7bd9b08858b9Yuli Huang        mHandler.removeMessages(MSG_UNFREEZE_GLROOT);
984616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin        if (isFinishing()) preparePhotoFallbackView();
985253c5aec7692afdd7880fbd169d4b44d5679cbc0Chih-Chung Chang
9864105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen        DetailsHelper.pause();
987f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mPhotoView.pause();
988f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mModel.pause();
989f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mHandler.removeMessages(MSG_HIDE_BARS);
990f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mActionBar.removeOnMenuVisibilityListener(mMenuVisibilityListener);
99133ef03776b7734717b16f6fc861b831fb1b1dfacMartijn Coenen
9926b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang        onCommitDeleteImage();
9932785956f8f5654966a41e20f482f4af3057eea3fChih-Chung Chang        mMenuExecutor.pause();
9946118af9ddad8acc050133154f8f60c842c7f9bfaChih-Chung Chang        if (mMediaSet != null) mMediaSet.clearDeletion();
995f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
996f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
997f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    @Override
998bd7c016d728853d38f98a3c6077b7bd9b08858b9Yuli Huang    public void onCurrentImageUpdated() {
999bd7c016d728853d38f98a3c6077b7bd9b08858b9Yuli Huang        mActivity.getGLRoot().unfreeze();
1000bd7c016d728853d38f98a3c6077b7bd9b08858b9Yuli Huang    }
1001bd7c016d728853d38f98a3c6077b7bd9b08858b9Yuli Huang
10027eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu    private void setGridButtonVisibility(boolean enabled) {
10037eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu        Menu menu = mActionBar.getMenu();
10047eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu        if (menu == null) return;
10057eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu        MenuItem item = menu.findItem(R.id.action_grid);
10067eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu        if (item != null) item.setVisible(enabled);
10077eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu    }
10087eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu
10097eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu    public void onFilmModeChanged(boolean enabled) {
10107eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu        mHandler.sendEmptyMessage(MSG_REFRESH_GRID_BUTTON);
10117eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu        if (enabled) {
10127eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu            mHandler.removeMessages(MSG_HIDE_BARS);
10137eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu        } else {
10147eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu            refreshHidingMessage();
10157eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu        }
10167eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu    }
10177eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu
10187eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu    private void transitionFromAlbumPageIfNeeded() {
10197eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu        TransitionStore transitions = mActivity.getTransitionStore();
10207eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu
10217eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu        int resumeIndex = transitions.get(KEY_INDEX_HINT, -1);
10227eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu        if (resumeIndex >= 0) {
10237eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu            mCurrentIndex = resumeIndex;
10247eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu            mModel.setCurrentPhoto((Path)transitions.get(KEY_MEDIA_SET_PATH), mCurrentIndex);
10257eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu            mPhotoView.switchToImage(mCurrentIndex);
10267eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu        }
10277eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu
10287eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu        int albumPageTransition = transitions.get(
10297eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu                KEY_ALBUMPAGE_TRANSITION, MSG_ALBUMPAGE_NONE);
10307eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu
10317eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu        if(albumPageTransition != MSG_ALBUMPAGE_NONE) {
10327eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu            mPhotoView.setFilmMode(mStartInFilmstrip
10337eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu                    && albumPageTransition == MSG_ALBUMPAGE_RESUMED);
10347eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu        }
10357eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu
10367eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu        mFadeOutTexture = transitions.get(AlbumPage.KEY_FADE_TEXTURE);
10377eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu        if (mFadeOutTexture != null) {
10387eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu            mBackgroundFade.start();
10397eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu            BitmapScreenNail.disableDrawPlaceholder();
10407eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu            mOpenAnimationRect =
10417eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu                    albumPageTransition == MSG_ALBUMPAGE_NONE ?
10427eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu                    (Rect) mData.getParcelable(KEY_OPEN_ANIMATION_RECT) :
10437eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu                    (Rect) transitions.get(KEY_OPEN_ANIMATION_RECT);
10447eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu            mPhotoView.setOpenAnimationRect(mOpenAnimationRect);
10457eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu            mBackgroundFade.start();
10467eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu        }
10477eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu    }
10487eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu
1049bd7c016d728853d38f98a3c6077b7bd9b08858b9Yuli Huang    @Override
1050f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    protected void onResume() {
1051f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        super.onResume();
10527eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu
10537eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu        transitionFromAlbumPageIfNeeded();
10547eea4d3ac59aa88d327fc0d58f5e4052f43c54c9Bobby Georgescu
1055d759b7c1fc449f4f0ef91997738bbef1bbd96677Owen Lin        mActivity.getGLRoot().freeze();
1056f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mIsActive = true;
1057f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        setContentPane(mRootPane);
105804ac045bf8da5082bbb0bdc9ea5f9c9b5b796ad0Yuli Huang
1059f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mModel.resume();
1060f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mPhotoView.resume();
1061898a2f4540635528a0916b0a6b0a177869854ae9Wu-cheng Li        mActionBar.setDisplayOptions(
1062898a2f4540635528a0916b0a6b0a177869854ae9Wu-cheng Li                ((mSecureAlbum == null) && (mSetPathString != null)), true);
1063f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mActionBar.addOnMenuVisibilityListener(mMenuVisibilityListener);
106433ef03776b7734717b16f6fc861b831fb1b1dfacMartijn Coenen
106571cd89a38752bc22ae0ec2df965e4280b776623cChih-Chung Chang        if (mAppBridge != null && !mHasActivityResult) {
106633f8567dd5003e4bb342683f3768ab7552648b02Chih-Chung Chang            mPhotoView.resetToFirstPicture();
1067bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang        }
106871cd89a38752bc22ae0ec2df965e4280b776623cChih-Chung Chang        mHasActivityResult = false;
1069bd7c016d728853d38f98a3c6077b7bd9b08858b9Yuli Huang        mHandler.sendEmptyMessageDelayed(MSG_UNFREEZE_GLROOT, UNFREEZE_GLROOT_TIMEOUT);
1070f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
1071f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
107215b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang    @Override
107315b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang    protected void onDestroy() {
1074bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang        if (mAppBridge != null) {
1075253c5aec7692afdd7880fbd169d4b44d5679cbc0Chih-Chung Chang            mAppBridge.setServer(null);
10763b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang            mScreenNailItem.setScreenNail(null);
1077bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang            mAppBridge.detachScreenNail();
1078bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang            mAppBridge = null;
10793b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang            mScreenNailSet = null;
10803b4a8aeb0353fa18a2b5267b3952a80a6c6d4d13Chih-Chung Chang            mScreenNailItem = null;
1081b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang        }
1082bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang        mOrientationManager.removeListener(this);
10832ef46ed28b28b355d7f3f1432c7b1196b832a859Chih-Chung Chang        mActivity.getGLRoot().setOrientationSource(null);
1084aeb3062e84ed28f0e25a73f511f287ae0a3e4294Chih-Chung Chang
1085aeb3062e84ed28f0e25a73f511f287ae0a3e4294Chih-Chung Chang        // Remove all pending messages.
1086aeb3062e84ed28f0e25a73f511f287ae0a3e4294Chih-Chung Chang        mHandler.removeCallbacksAndMessages(null);
108715b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang        super.onDestroy();
108815b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang    }
108915b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang
1090f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private class MyDetailsSource implements DetailsSource {
10916cf807453fb58ccd4cc513ff187b306c7090e67cOwen Lin
10926cf807453fb58ccd4cc513ff187b306c7090e67cOwen Lin        @Override
1093f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        public MediaDetails getDetails() {
1094616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin            return mModel.getMediaItem(0).getDetails();
1095f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
10966cf807453fb58ccd4cc513ff187b306c7090e67cOwen Lin
10976cf807453fb58ccd4cc513ff187b306c7090e67cOwen Lin        @Override
1098f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        public int size() {
1099f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            return mMediaSet != null ? mMediaSet.getMediaItemCount() : 1;
1100f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
11016cf807453fb58ccd4cc513ff187b306c7090e67cOwen Lin
11026cf807453fb58ccd4cc513ff187b306c7090e67cOwen Lin        @Override
1103995c4566bed7df1aa48ba7e1351f964efa73880bMichael Kolb        public int setIndex() {
1104995c4566bed7df1aa48ba7e1351f964efa73880bMichael Kolb            return mModel.getCurrentIndex();
11054105e22d72d7a44e67cba4a58ad88018ed664d10Ray Chen        }
1106f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
1107f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin}
1108