summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorOwen Lin <owenlin@google.com>2012-04-20 18:42:22 +0800
committerOwen Lin <owenlin@google.com>2012-04-25 15:27:42 +0800
commit21a412c93c9b0401b039f4eb86d4950752e5bb84 (patch)
treeeaf079fb8ef3df692c9f462816aea15b81285e80 /src
parent714fe2055eed029fa2a622f2e2504524f4881ba2 (diff)
downloadandroid_packages_apps_Gallery2-21a412c93c9b0401b039f4eb86d4950752e5bb84.tar.gz
android_packages_apps_Gallery2-21a412c93c9b0401b039f4eb86d4950752e5bb84.tar.bz2
android_packages_apps_Gallery2-21a412c93c9b0401b039f4eb86d4950752e5bb84.zip
Fix NPE in Gallery.
This happens if user set type in an intent. But we get a different type from content resolver. Change-Id: Iabafce7f7aaff23a7a9ee09e1d38ab50049abc88 fix: 6358473
Diffstat (limited to 'src')
-rw-r--r--src/com/android/gallery3d/app/CropImage.java8
-rw-r--r--src/com/android/gallery3d/app/Gallery.java7
-rw-r--r--src/com/android/gallery3d/app/PhotoPage.java11
-rw-r--r--src/com/android/gallery3d/data/DataManager.java4
-rw-r--r--src/com/android/gallery3d/data/LocalSource.java2
-rw-r--r--src/com/android/gallery3d/data/MediaSource.java2
-rw-r--r--src/com/android/gallery3d/data/UriImage.java16
-rw-r--r--src/com/android/gallery3d/data/UriSource.java34
8 files changed, 39 insertions, 45 deletions
diff --git a/src/com/android/gallery3d/app/CropImage.java b/src/com/android/gallery3d/app/CropImage.java
index 7e1572f0c..40b357d72 100644
--- a/src/com/android/gallery3d/app/CropImage.java
+++ b/src/com/android/gallery3d/app/CropImage.java
@@ -887,13 +887,9 @@ public class CropImage extends AbstractGalleryActivity {
private MediaItem getMediaItemFromIntentData() {
Uri uri = getIntent().getData();
DataManager manager = getDataManager();
- if (uri == null) {
- Log.w(TAG, "no data given");
- return null;
- }
- Path path = manager.findPathByUri(uri);
+ Path path = manager.findPathByUri(uri, getIntent().getType());
if (path == null) {
- Log.w(TAG, "cannot get path for: " + uri);
+ Log.w(TAG, "cannot get path for: " + uri + ", or no data given");
return null;
}
return (MediaItem) manager.getMediaObject(path);
diff --git a/src/com/android/gallery3d/app/Gallery.java b/src/com/android/gallery3d/app/Gallery.java
index c8fbd537e..0fbe7ac0e 100644
--- a/src/com/android/gallery3d/app/Gallery.java
+++ b/src/com/android/gallery3d/app/Gallery.java
@@ -27,7 +27,6 @@ import android.net.Uri;
import android.os.Bundle;
import android.provider.OpenableColumns;
import android.view.Menu;
-import android.view.MenuItem;
import android.view.Window;
import android.widget.Toast;
@@ -137,7 +136,7 @@ public final class Gallery extends AbstractGalleryActivity implements OnCancelLi
if (slideshow) {
getActionBar().hide();
DataManager manager = getDataManager();
- Path path = manager.findPathByUri(intent.getData());
+ Path path = manager.findPathByUri(intent.getData(), intent.getType());
if (path == null || manager.getMediaObject(path)
instanceof MediaItem) {
path = Path.fromString(
@@ -173,7 +172,7 @@ public final class Gallery extends AbstractGalleryActivity implements OnCancelLi
KEY_MEDIA_TYPES, String.valueOf(mediaType))
.build();
}
- Path setPath = dm.findPathByUri(uri);
+ Path setPath = dm.findPathByUri(uri, null);
MediaSet mediaSet = null;
if (setPath != null) {
mediaSet = (MediaSet) dm.getMediaObject(setPath);
@@ -192,7 +191,7 @@ public final class Gallery extends AbstractGalleryActivity implements OnCancelLi
startDefaultPage();
}
} else {
- Path itemPath = dm.findPathByUri(uri);
+ Path itemPath = dm.findPathByUri(uri, intent.getType());
Path albumPath = dm.getDefaultSetOf(itemPath);
// TODO: Make this parameter public so other activities can reference it.
boolean singleItemOnly = intent.getBooleanExtra("SingleItemOnly", false);
diff --git a/src/com/android/gallery3d/app/PhotoPage.java b/src/com/android/gallery3d/app/PhotoPage.java
index 6e5343ba8..bdc406019 100644
--- a/src/com/android/gallery3d/app/PhotoPage.java
+++ b/src/com/android/gallery3d/app/PhotoPage.java
@@ -19,13 +19,10 @@ package com.android.gallery3d.app;
import android.app.ActionBar.OnMenuVisibilityListener;
import android.app.Activity;
import android.content.ActivityNotFoundException;
-import android.content.ContentResolver;
import android.content.Context;
import android.content.Intent;
import android.graphics.Rect;
import android.net.Uri;
-import android.nfc.NdefMessage;
-import android.nfc.NdefRecord;
import android.nfc.NfcAdapter;
import android.os.Bundle;
import android.os.Handler;
@@ -34,8 +31,6 @@ import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
-import android.view.View.MeasureSpec;
-import android.view.ViewGroup;
import android.view.WindowManager;
import android.widget.ShareActionProvider;
import android.widget.Toast;
@@ -57,9 +52,9 @@ import com.android.gallery3d.ui.GLCanvas;
import com.android.gallery3d.ui.GLView;
import com.android.gallery3d.ui.ImportCompleteListener;
import com.android.gallery3d.ui.MenuExecutor;
+import com.android.gallery3d.ui.PhotoView;
import com.android.gallery3d.ui.ScreenNail;
import com.android.gallery3d.ui.ScreenNailHolder;
-import com.android.gallery3d.ui.PhotoView;
import com.android.gallery3d.ui.SelectionManager;
import com.android.gallery3d.ui.SynchronizedHandler;
import com.android.gallery3d.ui.UserInteractionListener;
@@ -578,8 +573,8 @@ public class PhotoPage extends ActivityState
case REQUEST_CROP:
if (resultCode == Activity.RESULT_OK) {
if (data == null) break;
- Path path = mApplication
- .getDataManager().findPathByUri(data.getData());
+ Path path = mApplication.getDataManager()
+ .findPathByUri(data.getData(), data.getType());
if (path != null) {
mModel.setCurrentPhoto(path, mCurrentIndex);
}
diff --git a/src/com/android/gallery3d/data/DataManager.java b/src/com/android/gallery3d/data/DataManager.java
index 1da3b76ca..0eb6af55e 100644
--- a/src/com/android/gallery3d/data/DataManager.java
+++ b/src/com/android/gallery3d/data/DataManager.java
@@ -242,10 +242,10 @@ public class DataManager {
return getMediaObject(path).getMediaType();
}
- public Path findPathByUri(Uri uri) {
+ public Path findPathByUri(Uri uri, String type) {
if (uri == null) return null;
for (MediaSource source : mSourceMap.values()) {
- Path path = source.findPathByUri(uri);
+ Path path = source.findPathByUri(uri, type);
if (path != null) return path;
}
return null;
diff --git a/src/com/android/gallery3d/data/LocalSource.java b/src/com/android/gallery3d/data/LocalSource.java
index 19b2fec4f..6735b16e4 100644
--- a/src/com/android/gallery3d/data/LocalSource.java
+++ b/src/com/android/gallery3d/data/LocalSource.java
@@ -151,7 +151,7 @@ class LocalSource extends MediaSource {
}
@Override
- public Path findPathByUri(Uri uri) {
+ public Path findPathByUri(Uri uri, String type) {
try {
switch (mUriMatcher.match(uri)) {
case LOCAL_IMAGE_ITEM: {
diff --git a/src/com/android/gallery3d/data/MediaSource.java b/src/com/android/gallery3d/data/MediaSource.java
index 07479a7d0..9f7561ec6 100644
--- a/src/com/android/gallery3d/data/MediaSource.java
+++ b/src/com/android/gallery3d/data/MediaSource.java
@@ -34,7 +34,7 @@ public abstract class MediaSource {
return mPrefix;
}
- public Path findPathByUri(Uri uri) {
+ public Path findPathByUri(Uri uri, String type) {
return null;
}
diff --git a/src/com/android/gallery3d/data/UriImage.java b/src/com/android/gallery3d/data/UriImage.java
index 05850bbb3..b5bfe964b 100644
--- a/src/com/android/gallery3d/data/UriImage.java
+++ b/src/com/android/gallery3d/data/UriImage.java
@@ -23,7 +23,6 @@ import android.graphics.BitmapFactory.Options;
import android.graphics.BitmapRegionDecoder;
import android.net.Uri;
import android.os.ParcelFileDescriptor;
-import android.webkit.MimeTypeMap;
import com.android.gallery3d.app.GalleryApp;
import com.android.gallery3d.common.BitmapUtils;
@@ -58,22 +57,11 @@ public class UriImage extends MediaItem {
private GalleryApp mApplication;
- public UriImage(GalleryApp application, Path path, Uri uri) {
+ public UriImage(GalleryApp application, Path path, Uri uri, String contentType) {
super(path, nextVersionNumber());
mUri = uri;
mApplication = Utils.checkNotNull(application);
- mContentType = getMimeType(uri);
- }
-
- private String getMimeType(Uri uri) {
- if (ContentResolver.SCHEME_FILE.equals(uri.getScheme())) {
- String extension =
- MimeTypeMap.getFileExtensionFromUrl(uri.toString());
- String type = MimeTypeMap.getSingleton()
- .getMimeTypeFromExtension(extension.toLowerCase());
- if (type != null) return type;
- }
- return mApplication.getContentResolver().getType(uri);
+ mContentType = contentType;
}
@Override
diff --git a/src/com/android/gallery3d/data/UriSource.java b/src/com/android/gallery3d/data/UriSource.java
index ac53dd5e0..76f7ac0e5 100644
--- a/src/com/android/gallery3d/data/UriSource.java
+++ b/src/com/android/gallery3d/data/UriSource.java
@@ -16,7 +16,9 @@
package com.android.gallery3d.data;
+import android.content.ContentResolver;
import android.net.Uri;
+import android.webkit.MimeTypeMap;
import com.android.gallery3d.app.GalleryApp;
@@ -37,21 +39,35 @@ class UriSource extends MediaSource {
@Override
public MediaObject createMediaObject(Path path) {
String segment[] = path.split();
- if (segment.length != 2) {
+ if (segment.length != 3) {
throw new RuntimeException("bad path: " + path);
}
-
- String decoded = URLDecoder.decode(segment[1]);
- return new UriImage(mApplication, path, Uri.parse(decoded));
+ String uri = URLDecoder.decode(segment[1]);
+ String type = URLDecoder.decode(segment[2]);
+ return new UriImage(mApplication, path, Uri.parse(uri), type);
}
- @Override
- public Path findPathByUri(Uri uri) {
- String type = mApplication.getContentResolver().getType(uri);
+ private String getMimeType(Uri uri) {
+ if (ContentResolver.SCHEME_FILE.equals(uri.getScheme())) {
+ String extension =
+ MimeTypeMap.getFileExtensionFromUrl(uri.toString());
+ String type = MimeTypeMap.getSingleton()
+ .getMimeTypeFromExtension(extension.toLowerCase());
+ if (type != null) return type;
+ }
// Assume the type is image if the type cannot be resolved
// This could happen for "http" URI.
- if (type == null || type.startsWith("image/")) {
- return Path.fromString("/uri/" + URLEncoder.encode(uri.toString()));
+ String type = mApplication.getContentResolver().getType(uri);
+ if (type == null) type = "image/*";
+ return type;
+ }
+
+ @Override
+ public Path findPathByUri(Uri uri, String type) {
+ if (type == null) type = getMimeType(uri);
+ if (type.startsWith("image/")) {
+ return Path.fromString("/uri/" + URLEncoder.encode(uri.toString())
+ + "/" +URLEncoder.encode(type));
}
return null;
}