1f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin/*
2f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * Copyright (C) 2009 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
19fe49be45412f8d0f68343662318e73822da486c8Owen Linimport android.app.Dialog;
201d33c69510326298c524593a8fb5d65b571013dcPin Tingimport android.content.AsyncQueryHandler;
21f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport android.content.ContentResolver;
22fe49be45412f8d0f68343662318e73822da486c8Owen Linimport android.content.DialogInterface;
23fe49be45412f8d0f68343662318e73822da486c8Owen Linimport android.content.DialogInterface.OnCancelListener;
24f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport android.content.Intent;
251d33c69510326298c524593a8fb5d65b571013dcPin Tingimport android.database.Cursor;
26f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport android.net.Uri;
27f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport android.os.Bundle;
281d33c69510326298c524593a8fb5d65b571013dcPin Tingimport android.provider.OpenableColumns;
29f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport android.view.Menu;
30f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport android.view.Window;
31f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport android.widget.Toast;
32f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
33dbf4ba12afba115888493caa34937643257e2bb1Ray Chenimport com.android.gallery3d.R;
34dbf4ba12afba115888493caa34937643257e2bb1Ray Chenimport com.android.gallery3d.common.Utils;
35dbf4ba12afba115888493caa34937643257e2bb1Ray Chenimport com.android.gallery3d.data.DataManager;
36dbf4ba12afba115888493caa34937643257e2bb1Ray Chenimport com.android.gallery3d.data.MediaItem;
37dbf4ba12afba115888493caa34937643257e2bb1Ray Chenimport com.android.gallery3d.data.MediaSet;
38dbf4ba12afba115888493caa34937643257e2bb1Ray Chenimport com.android.gallery3d.data.Path;
39dbf4ba12afba115888493caa34937643257e2bb1Ray Chenimport com.android.gallery3d.picasasource.PicasaSource;
40dbf4ba12afba115888493caa34937643257e2bb1Ray Chenimport com.android.gallery3d.ui.GLRoot;
41dbf4ba12afba115888493caa34937643257e2bb1Ray Chenimport com.android.gallery3d.util.GalleryUtils;
42dbf4ba12afba115888493caa34937643257e2bb1Ray Chen
43fe49be45412f8d0f68343662318e73822da486c8Owen Linpublic final class Gallery extends AbstractGalleryActivity implements OnCancelListener {
44f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public static final String EXTRA_SLIDESHOW = "slideshow";
45afb3d1d8f341620f6b69d47d52b515f53817aa91Yuli Huang    public static final String EXTRA_DREAM = "dream";
46f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public static final String EXTRA_CROP = "crop";
47f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
48f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public static final String ACTION_REVIEW = "com.android.camera.action.REVIEW";
49f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public static final String KEY_GET_CONTENT = "get-content";
50f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public static final String KEY_GET_ALBUM = "get-album";
51f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public static final String KEY_TYPE_BITS = "type-bits";
52f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public static final String KEY_MEDIA_TYPES = "mediaTypes";
53f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
54f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private static final String TAG = "Gallery";
55fe49be45412f8d0f68343662318e73822da486c8Owen Lin    private Dialog mVersionCheckDialog;
56f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
57f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    @Override
58f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    protected void onCreate(Bundle savedInstanceState) {
59f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        super.onCreate(savedInstanceState);
60f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        requestWindowFeature(Window.FEATURE_ACTION_BAR);
61f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        requestWindowFeature(Window.FEATURE_ACTION_BAR_OVERLAY);
62f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
63f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        setContentView(R.layout.main);
64f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
65f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        if (savedInstanceState != null) {
66f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            getStateManager().restoreFromState(savedInstanceState);
67f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        } else {
68f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            initializeByIntent();
69f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
70f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
71f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
72f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private void initializeByIntent() {
73f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        Intent intent = getIntent();
74f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        String action = intent.getAction();
75f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
76f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        if (Intent.ACTION_GET_CONTENT.equalsIgnoreCase(action)) {
77f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            startGetContent(intent);
78f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        } else if (Intent.ACTION_PICK.equalsIgnoreCase(action)) {
79f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            // We do NOT really support the PICK intent. Handle it as
80f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            // the GET_CONTENT. However, we need to translate the type
81f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            // in the intent here.
82f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            Log.w(TAG, "action PICK is not supported");
83f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            String type = Utils.ensureNotNull(intent.getType());
84f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            if (type.startsWith("vnd.android.cursor.dir/")) {
85f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                if (type.endsWith("/image")) intent.setType("image/*");
86f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                if (type.endsWith("/video")) intent.setType("video/*");
87f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            }
88f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            startGetContent(intent);
89f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        } else if (Intent.ACTION_VIEW.equalsIgnoreCase(action)
90f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                || ACTION_REVIEW.equalsIgnoreCase(action)){
91f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            startViewAction(intent);
92f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        } else {
93f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            startDefaultPage();
94f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
95f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
96f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
97f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public void startDefaultPage() {
98dbf4ba12afba115888493caa34937643257e2bb1Ray Chen        PicasaSource.showSignInReminder(this);
99f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        Bundle data = new Bundle();
100f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        data.putString(AlbumSetPage.KEY_MEDIA_PATH,
101f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                getDataManager().getTopSetPath(DataManager.INCLUDE_ALL));
102f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        getStateManager().startState(AlbumSetPage.class, data);
103fe49be45412f8d0f68343662318e73822da486c8Owen Lin        mVersionCheckDialog = PicasaSource.getVersionCheckDialog(this);
104fe49be45412f8d0f68343662318e73822da486c8Owen Lin        if (mVersionCheckDialog != null) {
105fe49be45412f8d0f68343662318e73822da486c8Owen Lin            mVersionCheckDialog.setOnCancelListener(this);
106fe49be45412f8d0f68343662318e73822da486c8Owen Lin        }
107f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
108f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
109f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private void startGetContent(Intent intent) {
110f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        Bundle data = intent.getExtras() != null
111f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                ? new Bundle(intent.getExtras())
112f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                : new Bundle();
113f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        data.putBoolean(KEY_GET_CONTENT, true);
114f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        int typeBits = GalleryUtils.determineTypeBits(this, intent);
115f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        data.putInt(KEY_TYPE_BITS, typeBits);
116f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        data.putString(AlbumSetPage.KEY_MEDIA_PATH,
117f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                getDataManager().getTopSetPath(typeBits));
118f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        getStateManager().startState(AlbumSetPage.class, data);
119f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
120f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
121f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private String getContentType(Intent intent) {
122f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        String type = intent.getType();
123f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        if (type != null) return type;
124f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
125f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        Uri uri = intent.getData();
126f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        try {
127f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            return getContentResolver().getType(uri);
128f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        } catch (Throwable t) {
129f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            Log.w(TAG, "get type fail", t);
130f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            return null;
131f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
132f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
133f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
134f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private void startViewAction(Intent intent) {
135f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        Boolean slideshow = intent.getBooleanExtra(EXTRA_SLIDESHOW, false);
136f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        if (slideshow) {
137f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            getActionBar().hide();
138f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            DataManager manager = getDataManager();
13921a412c93c9b0401b039f4eb86d4950752e5bb84Owen Lin            Path path = manager.findPathByUri(intent.getData(), intent.getType());
140f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            if (path == null || manager.getMediaObject(path)
141f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                    instanceof MediaItem) {
142f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                path = Path.fromString(
143f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                        manager.getTopSetPath(DataManager.INCLUDE_IMAGE));
144f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            }
145f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            Bundle data = new Bundle();
146f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            data.putString(SlideshowPage.KEY_SET_PATH, path.toString());
147f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            data.putBoolean(SlideshowPage.KEY_RANDOM_ORDER, true);
148f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            data.putBoolean(SlideshowPage.KEY_REPEAT, true);
149afb3d1d8f341620f6b69d47d52b515f53817aa91Yuli Huang            if (intent.getBooleanExtra(EXTRA_DREAM, false)) {
150afb3d1d8f341620f6b69d47d52b515f53817aa91Yuli Huang                data.putBoolean(SlideshowPage.KEY_DREAM, true);
151afb3d1d8f341620f6b69d47d52b515f53817aa91Yuli Huang            }
152f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            getStateManager().startState(SlideshowPage.class, data);
153f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        } else {
154f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            Bundle data = new Bundle();
155f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            DataManager dm = getDataManager();
156f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            Uri uri = intent.getData();
157f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            String contentType = getContentType(intent);
158f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            if (contentType == null) {
159f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                Toast.makeText(this,
160f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                        R.string.no_such_item, Toast.LENGTH_LONG).show();
161f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                finish();
162f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                return;
163f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            }
164bd47a5c6bcdcb127adb13c454fec00d4989c50b6Chih-Chung Chang            if (uri == null) {
165bd47a5c6bcdcb127adb13c454fec00d4989c50b6Chih-Chung Chang                int typeBits = GalleryUtils.determineTypeBits(this, intent);
166bd47a5c6bcdcb127adb13c454fec00d4989c50b6Chih-Chung Chang                data.putInt(KEY_TYPE_BITS, typeBits);
167bd47a5c6bcdcb127adb13c454fec00d4989c50b6Chih-Chung Chang                data.putString(AlbumSetPage.KEY_MEDIA_PATH,
168bd47a5c6bcdcb127adb13c454fec00d4989c50b6Chih-Chung Chang                        getDataManager().getTopSetPath(typeBits));
169bd47a5c6bcdcb127adb13c454fec00d4989c50b6Chih-Chung Chang                getStateManager().startState(AlbumSetPage.class, data);
170bd47a5c6bcdcb127adb13c454fec00d4989c50b6Chih-Chung Chang            } else if (contentType.startsWith(
171f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                    ContentResolver.CURSOR_DIR_BASE_TYPE)) {
172f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                int mediaType = intent.getIntExtra(KEY_MEDIA_TYPES, 0);
173f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                if (mediaType != 0) {
174f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                    uri = uri.buildUpon().appendQueryParameter(
175f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                            KEY_MEDIA_TYPES, String.valueOf(mediaType))
176f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                            .build();
177f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                }
17821a412c93c9b0401b039f4eb86d4950752e5bb84Owen Lin                Path setPath = dm.findPathByUri(uri, null);
179bd47a5c6bcdcb127adb13c454fec00d4989c50b6Chih-Chung Chang                MediaSet mediaSet = null;
180bd47a5c6bcdcb127adb13c454fec00d4989c50b6Chih-Chung Chang                if (setPath != null) {
181bd47a5c6bcdcb127adb13c454fec00d4989c50b6Chih-Chung Chang                    mediaSet = (MediaSet) dm.getMediaObject(setPath);
182bd47a5c6bcdcb127adb13c454fec00d4989c50b6Chih-Chung Chang                }
183bd47a5c6bcdcb127adb13c454fec00d4989c50b6Chih-Chung Chang                if (mediaSet != null) {
184bd47a5c6bcdcb127adb13c454fec00d4989c50b6Chih-Chung Chang                    if (mediaSet.isLeafAlbum()) {
185bd47a5c6bcdcb127adb13c454fec00d4989c50b6Chih-Chung Chang                        data.putString(AlbumPage.KEY_MEDIA_PATH, setPath.toString());
18684c220f10a643927c8a2126de8a755d8d7f7ec9eRay Chen                        data.putString(AlbumPage.KEY_PARENT_MEDIA_PATH,
18784c220f10a643927c8a2126de8a755d8d7f7ec9eRay Chen                                dm.getTopSetPath(DataManager.INCLUDE_ALL));
188bd47a5c6bcdcb127adb13c454fec00d4989c50b6Chih-Chung Chang                        getStateManager().startState(AlbumPage.class, data);
189bd47a5c6bcdcb127adb13c454fec00d4989c50b6Chih-Chung Chang                    } else {
190bd47a5c6bcdcb127adb13c454fec00d4989c50b6Chih-Chung Chang                        data.putString(AlbumSetPage.KEY_MEDIA_PATH, setPath.toString());
191bd47a5c6bcdcb127adb13c454fec00d4989c50b6Chih-Chung Chang                        getStateManager().startState(AlbumSetPage.class, data);
192bd47a5c6bcdcb127adb13c454fec00d4989c50b6Chih-Chung Chang                    }
193f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                } else {
194f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                    startDefaultPage();
195f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                }
196f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            } else {
19721a412c93c9b0401b039f4eb86d4950752e5bb84Owen Lin                Path itemPath = dm.findPathByUri(uri, intent.getType());
198f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                Path albumPath = dm.getDefaultSetOf(itemPath);
199c0ba0936bac7d56b92a409380c4d378ed2c272b0Ray Chen                // TODO: Make this parameter public so other activities can reference it.
200c0ba0936bac7d56b92a409380c4d378ed2c272b0Ray Chen                boolean singleItemOnly = intent.getBooleanExtra("SingleItemOnly", false);
2011d33c69510326298c524593a8fb5d65b571013dcPin Ting                if (!singleItemOnly && (albumPath != null)) {
2021d33c69510326298c524593a8fb5d65b571013dcPin Ting                    data.putString(PhotoPage.KEY_MEDIA_SET_PATH, albumPath.toString());
203f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                }
204f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                data.putString(PhotoPage.KEY_MEDIA_ITEM_PATH, itemPath.toString());
20554fe6202b6f7d233e7645c121321fe0f3d20fc8bYuli Huang                if (intent.getBooleanExtra(PhotoPage.KEY_TREAT_BACK_AS_UP, false)) {
20654fe6202b6f7d233e7645c121321fe0f3d20fc8bYuli Huang                    data.putBoolean(PhotoPage.KEY_TREAT_BACK_AS_UP, true);
20754fe6202b6f7d233e7645c121321fe0f3d20fc8bYuli Huang                }
208186f8b21cdbe6881a1e7fd452e3ef32e1d81d90fPin Ting
2091d33c69510326298c524593a8fb5d65b571013dcPin Ting                // Displays the filename as title, reading the filename from the interface:
2101d33c69510326298c524593a8fb5d65b571013dcPin Ting                // {@link android.provider.OpenableColumns#DISPLAY_NAME}.
2111d33c69510326298c524593a8fb5d65b571013dcPin Ting                AsyncQueryHandler queryHandler = new AsyncQueryHandler(getContentResolver()) {
2121d33c69510326298c524593a8fb5d65b571013dcPin Ting                    @Override
2131d33c69510326298c524593a8fb5d65b571013dcPin Ting                    protected void onQueryComplete(int token, Object cookie, Cursor cursor) {
2141d33c69510326298c524593a8fb5d65b571013dcPin Ting                        try {
2151d33c69510326298c524593a8fb5d65b571013dcPin Ting                            if ((cursor != null) && cursor.moveToFirst()) {
2161d33c69510326298c524593a8fb5d65b571013dcPin Ting                                String displayName = cursor.getString(0);
2171d33c69510326298c524593a8fb5d65b571013dcPin Ting
2181d33c69510326298c524593a8fb5d65b571013dcPin Ting                                // Just show empty title if other apps don't set DISPLAY_NAME
2191d33c69510326298c524593a8fb5d65b571013dcPin Ting                                setTitle((displayName == null) ? "" : displayName);
2201d33c69510326298c524593a8fb5d65b571013dcPin Ting                            }
2211d33c69510326298c524593a8fb5d65b571013dcPin Ting                        } finally {
2221d33c69510326298c524593a8fb5d65b571013dcPin Ting                            Utils.closeSilently(cursor);
2231d33c69510326298c524593a8fb5d65b571013dcPin Ting                        }
2241d33c69510326298c524593a8fb5d65b571013dcPin Ting                    }
2251d33c69510326298c524593a8fb5d65b571013dcPin Ting                };
2261d33c69510326298c524593a8fb5d65b571013dcPin Ting                queryHandler.startQuery(0, null, uri, new String[] {OpenableColumns.DISPLAY_NAME},
2271d33c69510326298c524593a8fb5d65b571013dcPin Ting                        null, null, null);
228186f8b21cdbe6881a1e7fd452e3ef32e1d81d90fPin Ting
229f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                getStateManager().startState(PhotoPage.class, data);
230f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            }
231f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
232f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
233f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
234f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    @Override
235f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public boolean onCreateOptionsMenu(Menu menu) {
236f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        super.onCreateOptionsMenu(menu);
237f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        return getStateManager().createOptionsMenu(menu);
238f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
239f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
240f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    @Override
241f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    protected void onResume() {
242f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        Utils.assertTrue(getStateManager().getStateCount() > 0);
243f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        super.onResume();
244fe49be45412f8d0f68343662318e73822da486c8Owen Lin        if (mVersionCheckDialog != null) {
245fe49be45412f8d0f68343662318e73822da486c8Owen Lin            mVersionCheckDialog.show();
246fe49be45412f8d0f68343662318e73822da486c8Owen Lin        }
247fe49be45412f8d0f68343662318e73822da486c8Owen Lin    }
248fe49be45412f8d0f68343662318e73822da486c8Owen Lin
249fe49be45412f8d0f68343662318e73822da486c8Owen Lin    @Override
250fe49be45412f8d0f68343662318e73822da486c8Owen Lin    protected void onPause() {
251fe49be45412f8d0f68343662318e73822da486c8Owen Lin        super.onPause();
252fe49be45412f8d0f68343662318e73822da486c8Owen Lin        if (mVersionCheckDialog != null) {
253fe49be45412f8d0f68343662318e73822da486c8Owen Lin            mVersionCheckDialog.dismiss();
254fe49be45412f8d0f68343662318e73822da486c8Owen Lin        }
255f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
256f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
257f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    @Override
258fe49be45412f8d0f68343662318e73822da486c8Owen Lin    public void onCancel(DialogInterface dialog) {
259fe49be45412f8d0f68343662318e73822da486c8Owen Lin        if (dialog == mVersionCheckDialog) {
260fe49be45412f8d0f68343662318e73822da486c8Owen Lin            mVersionCheckDialog = null;
261fe49be45412f8d0f68343662318e73822da486c8Owen Lin        }
262fe49be45412f8d0f68343662318e73822da486c8Owen Lin    }
263f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin}
264