blob: ebfa98495fdefe2fa35732f59256263e664bab35 [file] [log] [blame]
/*
* Copyright (C) 2009 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.gallery3d.app;
import android.content.ContentResolver;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.Window;
import android.widget.Toast;
import com.android.gallery3d.R;
import com.android.gallery3d.common.Utils;
import com.android.gallery3d.data.DataManager;
import com.android.gallery3d.data.MediaItem;
import com.android.gallery3d.data.MediaSet;
import com.android.gallery3d.data.Path;
import com.android.gallery3d.picasasource.PicasaSource;
import com.android.gallery3d.ui.GLRoot;
import com.android.gallery3d.util.GalleryUtils;
public final class Gallery extends AbstractGalleryActivity {
public static final String EXTRA_SLIDESHOW = "slideshow";
public static final String EXTRA_CROP = "crop";
public static final String ACTION_REVIEW = "com.android.camera.action.REVIEW";
public static final String KEY_GET_CONTENT = "get-content";
public static final String KEY_GET_ALBUM = "get-album";
public static final String KEY_TYPE_BITS = "type-bits";
public static final String KEY_MEDIA_TYPES = "mediaTypes";
private static final String TAG = "Gallery";
private GalleryActionBar mActionBar;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_ACTION_BAR);
requestWindowFeature(Window.FEATURE_ACTION_BAR_OVERLAY);
requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
setContentView(R.layout.main);
mActionBar = new GalleryActionBar(this);
if (savedInstanceState != null) {
getStateManager().restoreFromState(savedInstanceState);
} else {
initializeByIntent();
}
}
private void initializeByIntent() {
Intent intent = getIntent();
String action = intent.getAction();
if (Intent.ACTION_GET_CONTENT.equalsIgnoreCase(action)) {
startGetContent(intent);
} else if (Intent.ACTION_PICK.equalsIgnoreCase(action)) {
// We do NOT really support the PICK intent. Handle it as
// the GET_CONTENT. However, we need to translate the type
// in the intent here.
Log.w(TAG, "action PICK is not supported");
String type = Utils.ensureNotNull(intent.getType());
if (type.startsWith("vnd.android.cursor.dir/")) {
if (type.endsWith("/image")) intent.setType("image/*");
if (type.endsWith("/video")) intent.setType("video/*");
}
startGetContent(intent);
} else if (Intent.ACTION_VIEW.equalsIgnoreCase(action)
|| ACTION_REVIEW.equalsIgnoreCase(action)){
startViewAction(intent);
} else {
startDefaultPage();
}
}
public void startDefaultPage() {
PicasaSource.showSignInReminder(this);
Bundle data = new Bundle();
data.putString(AlbumSetPage.KEY_MEDIA_PATH,
getDataManager().getTopSetPath(DataManager.INCLUDE_ALL));
getStateManager().startState(AlbumSetPage.class, data);
}
private void startGetContent(Intent intent) {
Bundle data = intent.getExtras() != null
? new Bundle(intent.getExtras())
: new Bundle();
data.putBoolean(KEY_GET_CONTENT, true);
int typeBits = GalleryUtils.determineTypeBits(this, intent);
data.putInt(KEY_TYPE_BITS, typeBits);
data.putString(AlbumSetPage.KEY_MEDIA_PATH,
getDataManager().getTopSetPath(typeBits));
getStateManager().setLaunchGalleryOnTop(true);
getStateManager().startState(AlbumSetPage.class, data);
}
private String getContentType(Intent intent) {
String type = intent.getType();
if (type != null) return type;
Uri uri = intent.getData();
try {
return getContentResolver().getType(uri);
} catch (Throwable t) {
Log.w(TAG, "get type fail", t);
return null;
}
}
private void startViewAction(Intent intent) {
Boolean slideshow = intent.getBooleanExtra(EXTRA_SLIDESHOW, false);
getStateManager().setLaunchGalleryOnTop(true);
if (slideshow) {
getActionBar().hide();
DataManager manager = getDataManager();
Path path = manager.findPathByUri(intent.getData());
if (path == null || manager.getMediaObject(path)
instanceof MediaItem) {
path = Path.fromString(
manager.getTopSetPath(DataManager.INCLUDE_IMAGE));
}
Bundle data = new Bundle();
data.putString(SlideshowPage.KEY_SET_PATH, path.toString());
data.putBoolean(SlideshowPage.KEY_RANDOM_ORDER, true);
data.putBoolean(SlideshowPage.KEY_REPEAT, true);
getStateManager().startState(SlideshowPage.class, data);
} else {
Bundle data = new Bundle();
DataManager dm = getDataManager();
Uri uri = intent.getData();
String contentType = getContentType(intent);
if (contentType == null) {
Toast.makeText(this,
R.string.no_such_item, Toast.LENGTH_LONG).show();
finish();
return;
}
if (uri == null) {
int typeBits = GalleryUtils.determineTypeBits(this, intent);
data.putInt(KEY_TYPE_BITS, typeBits);
data.putString(AlbumSetPage.KEY_MEDIA_PATH,
getDataManager().getTopSetPath(typeBits));
getStateManager().setLaunchGalleryOnTop(true);
getStateManager().startState(AlbumSetPage.class, data);
} else if (contentType.startsWith(
ContentResolver.CURSOR_DIR_BASE_TYPE)) {
int mediaType = intent.getIntExtra(KEY_MEDIA_TYPES, 0);
if (mediaType != 0) {
uri = uri.buildUpon().appendQueryParameter(
KEY_MEDIA_TYPES, String.valueOf(mediaType))
.build();
}
Path setPath = dm.findPathByUri(uri);
MediaSet mediaSet = null;
if (setPath != null) {
mediaSet = (MediaSet) dm.getMediaObject(setPath);
}
if (mediaSet != null) {
if (mediaSet.isLeafAlbum()) {
data.putString(AlbumPage.KEY_MEDIA_PATH, setPath.toString());
getStateManager().startState(AlbumPage.class, data);
} else {
data.putString(AlbumSetPage.KEY_MEDIA_PATH, setPath.toString());
getStateManager().startState(AlbumSetPage.class, data);
}
} else {
startDefaultPage();
}
} else {
Path itemPath = dm.findPathByUri(uri);
Path albumPath = dm.getDefaultSetOf(itemPath);
// TODO: Make this parameter public so other activities can reference it.
boolean singleItemOnly = intent.getBooleanExtra("SingleItemOnly", false);
if (!singleItemOnly && albumPath != null) {
data.putString(PhotoPage.KEY_MEDIA_SET_PATH,
albumPath.toString());
}
data.putString(PhotoPage.KEY_MEDIA_ITEM_PATH, itemPath.toString());
getStateManager().startState(PhotoPage.class, data);
}
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
super.onCreateOptionsMenu(menu);
return getStateManager().createOptionsMenu(menu);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
GLRoot root = getGLRoot();
root.lockRenderThread();
try {
return getStateManager().itemSelected(item);
} finally {
root.unlockRenderThread();
}
}
@Override
public void onBackPressed() {
// send the back event to the top sub-state
GLRoot root = getGLRoot();
root.lockRenderThread();
try {
getStateManager().onBackPressed();
} finally {
root.unlockRenderThread();
}
}
@Override
public void onDestroy() {
super.onDestroy();
GLRoot root = getGLRoot();
root.lockRenderThread();
try {
getStateManager().destroy();
} finally {
root.unlockRenderThread();
}
}
@Override
protected void onResume() {
Utils.assertTrue(getStateManager().getStateCount() > 0);
super.onResume();
}
@Override
public GalleryActionBar getGalleryActionBar() {
return mActionBar;
}
}