summaryrefslogtreecommitdiffstats
path: root/src/com/android/gallery3d/data
diff options
context:
space:
mode:
Diffstat (limited to 'src/com/android/gallery3d/data')
-rw-r--r--src/com/android/gallery3d/data/DecodeUtils.java44
-rwxr-xr-x[-rw-r--r--]src/com/android/gallery3d/data/FaceClustering.java2
-rw-r--r--src/com/android/gallery3d/data/FilterDeleteSet.java5
-rw-r--r--src/com/android/gallery3d/data/FilterTypeSet.java3
-rw-r--r--src/com/android/gallery3d/data/ImageCacheRequest.java21
-rw-r--r--src/com/android/gallery3d/data/LocalAlbum.java6
-rw-r--r--src/com/android/gallery3d/data/LocalAlbumSet.java2
-rw-r--r--src/com/android/gallery3d/data/LocalImage.java55
-rw-r--r--src/com/android/gallery3d/data/LocalVideo.java26
-rw-r--r--src/com/android/gallery3d/data/MediaDetails.java29
-rw-r--r--src/com/android/gallery3d/data/MediaItem.java1
-rw-r--r--src/com/android/gallery3d/data/MediaObject.java3
-rw-r--r--src/com/android/gallery3d/data/MediaSet.java5
-rw-r--r--src/com/android/gallery3d/data/SecureAlbum.java2
-rw-r--r--src/com/android/gallery3d/data/UriImage.java40
-rw-r--r--src/com/android/gallery3d/data/UriSource.java15
16 files changed, 223 insertions, 36 deletions
diff --git a/src/com/android/gallery3d/data/DecodeUtils.java b/src/com/android/gallery3d/data/DecodeUtils.java
index 2853baffb..7e10191b7 100644
--- a/src/com/android/gallery3d/data/DecodeUtils.java
+++ b/src/com/android/gallery3d/data/DecodeUtils.java
@@ -17,6 +17,7 @@
package com.android.gallery3d.data;
import android.annotation.TargetApi;
+import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.Bitmap.Config;
import android.graphics.BitmapFactory;
@@ -32,6 +33,7 @@ import com.android.gallery3d.ui.Log;
import com.android.gallery3d.util.ThreadPool.CancelListener;
import com.android.gallery3d.util.ThreadPool.JobContext;
+import java.io.File;
import java.io.FileDescriptor;
import java.io.FileInputStream;
import java.io.InputStream;
@@ -308,4 +310,46 @@ public class DecodeUtils {
decodeBounds(jc, fileDescriptor, options);
return GalleryBitmapPool.getInstance().get(options.outWidth, options.outHeight);
}
+
+ public static Bitmap decodeBitmap(Resources res, int resId, int reqWidth, int reqHeight) {
+ // First decode with inJustDecodeBounds=true to check dimensions
+ final BitmapFactory.Options options = new BitmapFactory.Options();
+ options.inJustDecodeBounds = true;
+ BitmapFactory.decodeResource(res, resId, options);
+
+ // Calculate inSampleSize (use 1024 as maximum size, the minimum supported
+ // by all the gles20 devices)
+ options.inSampleSize = calculateBitmapRatio(
+ options,
+ Math.min(reqWidth, 1024),
+ Math.min(reqHeight, 1024));
+
+ // Decode the bitmap with inSampleSize set
+ options.inJustDecodeBounds = false;
+ options.inPreferQualityOverSpeed = false;
+ options.inPurgeable = true;
+ options.inInputShareable = true;
+ options.inDither = true;
+ return BitmapFactory.decodeResource(res, resId, options);
+ }
+
+ private static int calculateBitmapRatio(Options options, int reqWidth, int reqHeight) {
+ // Raw height and width of image
+ final int height = options.outHeight;
+ final int width = options.outWidth;
+ int inSampleSize = 1;
+
+ if (height > reqHeight || width > reqWidth) {
+ // Calculate ratios of height and width to requested height and width
+ final int heightRatio = Math.round((float) height / (float) reqHeight);
+ final int widthRatio = Math.round((float) width / (float) reqWidth);
+
+ // Choose the smallest ratio as inSampleSize value, this will guarantee
+ // a final image with both dimensions larger than or equal to the
+ // requested height and width.
+ inSampleSize = heightRatio < widthRatio ? heightRatio : widthRatio;
+ }
+
+ return inSampleSize;
+ }
}
diff --git a/src/com/android/gallery3d/data/FaceClustering.java b/src/com/android/gallery3d/data/FaceClustering.java
index 819915edb..a0d567902 100644..100755
--- a/src/com/android/gallery3d/data/FaceClustering.java
+++ b/src/com/android/gallery3d/data/FaceClustering.java
@@ -83,7 +83,7 @@ public class FaceClustering extends Clustering {
}
public FaceClustering(Context context) {
- mUntaggedString = context.getResources().getString(R.string.untagged);
+ mUntaggedString = context.getResources().getString(R.string.no_faces);
mContext = context;
}
diff --git a/src/com/android/gallery3d/data/FilterDeleteSet.java b/src/com/android/gallery3d/data/FilterDeleteSet.java
index c76412ff8..f7329739d 100644
--- a/src/com/android/gallery3d/data/FilterDeleteSet.java
+++ b/src/com/android/gallery3d/data/FilterDeleteSet.java
@@ -223,6 +223,11 @@ public class FilterDeleteSet extends MediaSet implements ContentListener {
return mDataVersion;
}
+ @Override
+ public int getCurrectSize() {
+ return mCurrent.size();
+ }
+
private void sendRequest(int type, Path path, int indexHint) {
Request r = new Request(type, path, indexHint);
synchronized (mRequests) {
diff --git a/src/com/android/gallery3d/data/FilterTypeSet.java b/src/com/android/gallery3d/data/FilterTypeSet.java
index 477ef73ad..e778ceb12 100644
--- a/src/com/android/gallery3d/data/FilterTypeSet.java
+++ b/src/com/android/gallery3d/data/FilterTypeSet.java
@@ -102,7 +102,8 @@ public class FilterTypeSet extends MediaSet implements ContentListener {
mBaseSet.enumerateMediaItems(new MediaSet.ItemConsumer() {
@Override
public void consume(int index, MediaItem item) {
- if (item.getMediaType() == mMediaType) {
+ if (item.getMediaType() == mMediaType
+ || item.getMediaType() == MediaObject.MEDIA_TYPE_DRM_IMAGE) {
if (index < 0 || index >= total) return;
Path path = item.getPath();
buf[index] = path;
diff --git a/src/com/android/gallery3d/data/ImageCacheRequest.java b/src/com/android/gallery3d/data/ImageCacheRequest.java
index 6cbc5c5ea..faca5d7d8 100644
--- a/src/com/android/gallery3d/data/ImageCacheRequest.java
+++ b/src/com/android/gallery3d/data/ImageCacheRequest.java
@@ -16,8 +16,10 @@
package com.android.gallery3d.data;
+import android.drm.DrmHelper;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
+import android.text.TextUtils;
import com.android.gallery3d.app.GalleryApp;
import com.android.gallery3d.common.BitmapUtils;
@@ -32,6 +34,8 @@ abstract class ImageCacheRequest implements Job<Bitmap> {
private Path mPath;
private int mType;
private int mTargetSize;
+ private String mFilePath;
+ private String mMimeType;
private long mTimeModified;
public ImageCacheRequest(GalleryApp application,
@@ -43,6 +47,14 @@ abstract class ImageCacheRequest implements Job<Bitmap> {
mTimeModified = timeModified;
}
+ public ImageCacheRequest(GalleryApp application,
+ Path path, long timeModified, int type, int targetSize, String filepath, String mimeType) {
+ this(application, path, timeModified, type,
+ targetSize);
+ mFilePath = filepath;
+ mMimeType = mimeType;
+ }
+
private String debugTag() {
return mPath + "," + mTimeModified + "," +
((mType == MediaItem.TYPE_THUMBNAIL) ? "THUMB" :
@@ -51,6 +63,14 @@ abstract class ImageCacheRequest implements Job<Bitmap> {
@Override
public Bitmap run(JobContext jc) {
+ if (!TextUtils.isEmpty(mFilePath) && !TextUtils.isEmpty(mMimeType)
+ && !mMimeType.startsWith("video/")) {
+ if (DrmHelper.isDrmFile(mFilePath)
+ && mType != MediaItem.TYPE_MICROTHUMBNAIL) {
+ return onDecodeOriginal(jc, mType);
+ }
+ }
+
ImageCacheService cacheService = mApplication.getImageCacheService();
BytesBuffer buffer = MediaItem.getBytesBufferPool().get();
@@ -76,6 +96,7 @@ abstract class ImageCacheRequest implements Job<Bitmap> {
} finally {
MediaItem.getBytesBufferPool().recycle(buffer);
}
+
Bitmap bitmap = onDecodeOriginal(jc, mType);
if (jc.isCancelled()) return null;
diff --git a/src/com/android/gallery3d/data/LocalAlbum.java b/src/com/android/gallery3d/data/LocalAlbum.java
index 7b7015af6..0757d8883 100644
--- a/src/com/android/gallery3d/data/LocalAlbum.java
+++ b/src/com/android/gallery3d/data/LocalAlbum.java
@@ -95,7 +95,7 @@ public class LocalAlbum extends MediaSet {
@Override
public boolean isCameraRoll() {
- return mBucketId == MediaSetUtils.CAMERA_BUCKET_ID;
+ return mBucketId == MediaSetUtils.getCameraBucketId();
}
@Override
@@ -279,7 +279,7 @@ public class LocalAlbum extends MediaSet {
public static String getLocalizedName(Resources res, int bucketId,
String name) {
- if (bucketId == MediaSetUtils.CAMERA_BUCKET_ID) {
+ if (bucketId == MediaSetUtils.getCameraBucketId()) {
return res.getString(R.string.folder_camera);
} else if (bucketId == MediaSetUtils.DOWNLOAD_BUCKET_ID) {
return res.getString(R.string.folder_download);
@@ -297,7 +297,7 @@ public class LocalAlbum extends MediaSet {
// Relative path is the absolute path minus external storage path
public static String getRelativePath(int bucketId) {
String relativePath = "/";
- if (bucketId == MediaSetUtils.CAMERA_BUCKET_ID) {
+ if (bucketId == MediaSetUtils.getCameraBucketId()) {
relativePath += BucketNames.CAMERA;
} else if (bucketId == MediaSetUtils.DOWNLOAD_BUCKET_ID) {
relativePath += BucketNames.DOWNLOAD;
diff --git a/src/com/android/gallery3d/data/LocalAlbumSet.java b/src/com/android/gallery3d/data/LocalAlbumSet.java
index b2b4b8c5d..877eaff5c 100644
--- a/src/com/android/gallery3d/data/LocalAlbumSet.java
+++ b/src/com/android/gallery3d/data/LocalAlbumSet.java
@@ -113,7 +113,7 @@ public class LocalAlbumSet extends MediaSet
int offset = 0;
// Move camera and download bucket to the front, while keeping the
// order of others.
- int index = findBucket(entries, MediaSetUtils.CAMERA_BUCKET_ID);
+ int index = findBucket(entries, MediaSetUtils.getCameraBucketId());
if (index != -1) {
circularShiftRight(entries, offset++, index);
}
diff --git a/src/com/android/gallery3d/data/LocalImage.java b/src/com/android/gallery3d/data/LocalImage.java
index 2b01c1e22..1b0384548 100644
--- a/src/com/android/gallery3d/data/LocalImage.java
+++ b/src/com/android/gallery3d/data/LocalImage.java
@@ -20,6 +20,7 @@ import android.annotation.TargetApi;
import android.content.ContentResolver;
import android.content.ContentValues;
import android.database.Cursor;
+import android.drm.DrmHelper;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.BitmapRegionDecoder;
@@ -173,7 +174,7 @@ public class LocalImage extends LocalMediaItem {
@Override
public Job<Bitmap> requestImage(int type) {
return new LocalImageRequest(mApplication, mPath, dateModifiedInSec,
- type, filePath);
+ type, filePath, mimeType);
}
public static class LocalImageRequest extends ImageCacheRequest {
@@ -186,10 +187,23 @@ public class LocalImage extends LocalMediaItem {
mLocalFilePath = localFilePath;
}
+ LocalImageRequest(GalleryApp application, Path path, long timeModified,
+ int type, String localFilePath, String mimeType) {
+ super(application, path, timeModified, type,
+ MediaItem.getTargetSize(type),localFilePath, mimeType);
+ mLocalFilePath = localFilePath;
+ }
+
@Override
public Bitmap onDecodeOriginal(JobContext jc, final int type) {
BitmapFactory.Options options = new BitmapFactory.Options();
options.inPreferredConfig = Bitmap.Config.ARGB_8888;
+
+ if (DrmHelper.isDrmFile(mLocalFilePath)) {
+ return DecodeUtils.ensureGLCompatibleBitmap(DrmHelper
+ .getBitmap(mLocalFilePath, options));
+ }
+
int targetSize = MediaItem.getTargetSize(type);
// try to decode from JPEG EXIF
@@ -230,24 +244,41 @@ public class LocalImage extends LocalMediaItem {
@Override
public BitmapRegionDecoder run(JobContext jc) {
+ if (DrmHelper.isDrmFile(mLocalFilePath)) {
+ return DrmHelper.createBitmapRegionDecoder(mLocalFilePath,
+ false);
+ }
+
return DecodeUtils.createBitmapRegionDecoder(jc, mLocalFilePath, false);
}
}
@Override
public int getSupportedOperations() {
- int operation = SUPPORT_DELETE | SUPPORT_SHARE | SUPPORT_CROP
+ int operation = SUPPORT_DELETE | SUPPORT_INFO;
+ if (DrmHelper.isDrmFile(getFilePath())) {
+ if (DrmHelper.isDrmFLBlocking(mApplication.getAndroidContext(),
+ getFilePath())) {
+ operation |= SUPPORT_SETAS;
+ }
+ operation |= SUPPORT_DRM_INFO | SUPPORT_FULL_IMAGE;
+ if (DrmHelper.isShareableDrmFile(getFilePath())) {
+ operation |= SUPPORT_SHARE;
+ }
+ } else {
+ operation = SUPPORT_DELETE | SUPPORT_SHARE | SUPPORT_CROP
| SUPPORT_SETAS | SUPPORT_PRINT | SUPPORT_INFO;
- if (BitmapUtils.isSupportedByRegionDecoder(mimeType)) {
- operation |= SUPPORT_FULL_IMAGE | SUPPORT_EDIT;
- }
+ if (BitmapUtils.isSupportedByRegionDecoder(mimeType)) {
+ operation |= SUPPORT_FULL_IMAGE | SUPPORT_EDIT;
+ }
- if (BitmapUtils.isRotationSupported(mimeType)) {
- operation |= SUPPORT_ROTATE;
- }
+ if (BitmapUtils.isRotationSupported(mimeType)) {
+ operation |= SUPPORT_ROTATE;
+ }
- if (GalleryUtils.isValidLocation(latitude, longitude)) {
- operation |= SUPPORT_SHOW_ON_MAP;
+ if (GalleryUtils.isValidLocation(latitude, longitude)) {
+ operation |= SUPPORT_SHOW_ON_MAP;
+ }
}
return operation;
}
@@ -313,6 +344,10 @@ public class LocalImage extends LocalMediaItem {
@Override
public int getMediaType() {
+ if (DrmHelper.isDrmFile(getFilePath())) {
+ return MEDIA_TYPE_DRM_IMAGE;
+ }
+
return MEDIA_TYPE_IMAGE;
}
diff --git a/src/com/android/gallery3d/data/LocalVideo.java b/src/com/android/gallery3d/data/LocalVideo.java
index 4b8774ca4..7fafe97ae 100644
--- a/src/com/android/gallery3d/data/LocalVideo.java
+++ b/src/com/android/gallery3d/data/LocalVideo.java
@@ -18,6 +18,7 @@ package com.android.gallery3d.data;
import android.content.ContentResolver;
import android.database.Cursor;
+import android.drm.DrmHelper;
import android.graphics.Bitmap;
import android.graphics.BitmapRegionDecoder;
import android.net.Uri;
@@ -153,7 +154,7 @@ public class LocalVideo extends LocalMediaItem {
@Override
public Job<Bitmap> requestImage(int type) {
return new LocalVideoRequest(mApplication, getPath(), dateModifiedInSec,
- type, filePath);
+ type, filePath, mimeType);
}
public static class LocalVideoRequest extends ImageCacheRequest {
@@ -166,6 +167,13 @@ public class LocalVideo extends LocalMediaItem {
mLocalFilePath = localFilePath;
}
+ LocalVideoRequest(GalleryApp application, Path path, long timeModified,
+ int type, String localFilePath, String mimeType) {
+ super(application, path, timeModified, type,
+ MediaItem.getTargetSize(type), localFilePath, mimeType);
+ mLocalFilePath = localFilePath;
+ }
+
@Override
public Bitmap onDecodeOriginal(JobContext jc, int type) {
Bitmap bitmap = BitmapUtils.createVideoThumbnail(mLocalFilePath);
@@ -182,7 +190,17 @@ public class LocalVideo extends LocalMediaItem {
@Override
public int getSupportedOperations() {
- return SUPPORT_DELETE | SUPPORT_SHARE | SUPPORT_PLAY | SUPPORT_INFO | SUPPORT_TRIM | SUPPORT_MUTE;
+ if (DrmHelper.isDrmFile(getFilePath())) {
+ int operation = SUPPORT_DELETE | SUPPORT_PLAY | SUPPORT_INFO
+ | SUPPORT_DRM_INFO;
+ if (DrmHelper.isShareableDrmFile(getFilePath())) {
+ operation |= SUPPORT_SHARE;
+ }
+ return operation;
+ }
+
+ return SUPPORT_DELETE | SUPPORT_SHARE | SUPPORT_PLAY | SUPPORT_INFO
+ | SUPPORT_TRIM | SUPPORT_MUTE;
}
@Override
@@ -211,6 +229,10 @@ public class LocalVideo extends LocalMediaItem {
@Override
public int getMediaType() {
+ if (DrmHelper.isDrmFile(getFilePath())) {
+ return MEDIA_TYPE_DRM_VIDEO;
+ }
+
return MEDIA_TYPE_VIDEO;
}
diff --git a/src/com/android/gallery3d/data/MediaDetails.java b/src/com/android/gallery3d/data/MediaDetails.java
index cac524b88..225266029 100644
--- a/src/com/android/gallery3d/data/MediaDetails.java
+++ b/src/com/android/gallery3d/data/MediaDetails.java
@@ -17,15 +17,11 @@
package com.android.gallery3d.data;
import com.android.gallery3d.R;
-import com.android.gallery3d.common.Utils;
import com.android.gallery3d.exif.ExifInterface;
import com.android.gallery3d.exif.ExifTag;
-import com.android.gallery3d.exif.Rational;
-import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
-import java.io.InputStream;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map.Entry;
@@ -50,15 +46,16 @@ public class MediaDetails implements Iterable<Entry<Integer, Object>> {
public static final int INDEX_SIZE = 10;
// for EXIF
- public static final int INDEX_MAKE = 100;
- public static final int INDEX_MODEL = 101;
- public static final int INDEX_FLASH = 102;
- public static final int INDEX_FOCAL_LENGTH = 103;
- public static final int INDEX_WHITE_BALANCE = 104;
- public static final int INDEX_APERTURE = 105;
- public static final int INDEX_SHUTTER_SPEED = 106;
- public static final int INDEX_EXPOSURE_TIME = 107;
- public static final int INDEX_ISO = 108;
+ public static final int INDEX_DATETIME_ORIGINAL = 100;
+ public static final int INDEX_MAKE = 101;
+ public static final int INDEX_MODEL = 102;
+ public static final int INDEX_FLASH = 103;
+ public static final int INDEX_FOCAL_LENGTH = 104;
+ public static final int INDEX_WHITE_BALANCE = 105;
+ public static final int INDEX_APERTURE = 106;
+ public static final int INDEX_SHUTTER_SPEED = 107;
+ public static final int INDEX_EXPOSURE_TIME = 108;
+ public static final int INDEX_ISO = 109;
// Put this last because it may be long.
public static final int INDEX_PATH = 200;
@@ -148,6 +145,12 @@ public class MediaDetails implements Iterable<Entry<Integer, Object>> {
MediaDetails.INDEX_WIDTH);
setExifData(details, exif.getTag(ExifInterface.TAG_IMAGE_LENGTH),
MediaDetails.INDEX_HEIGHT);
+ ExifTag recordTag = exif.getTag(ExifInterface.TAG_DATE_TIME_ORIGINAL);
+ if (recordTag == null)
+ recordTag = exif.getTag(ExifInterface.TAG_DATE_TIME_DIGITIZED);
+ if (recordTag == null)
+ recordTag = exif.getTag(ExifInterface.TAG_DATE_TIME);
+ setExifData(details, recordTag, MediaDetails.INDEX_DATETIME_ORIGINAL);
setExifData(details, exif.getTag(ExifInterface.TAG_MAKE),
MediaDetails.INDEX_MAKE);
setExifData(details, exif.getTag(ExifInterface.TAG_MODEL),
diff --git a/src/com/android/gallery3d/data/MediaItem.java b/src/com/android/gallery3d/data/MediaItem.java
index 59ea86551..92ac88dc6 100644
--- a/src/com/android/gallery3d/data/MediaItem.java
+++ b/src/com/android/gallery3d/data/MediaItem.java
@@ -37,6 +37,7 @@ public abstract class MediaItem extends MediaObject {
public static final int IMAGE_ERROR = -1;
public static final String MIME_TYPE_JPEG = "image/jpeg";
+ public static final String MIME_TYPE_GIF = "image/gif";
private static final int BYTESBUFFE_POOL_SIZE = 4;
private static final int BYTESBUFFER_SIZE = 200 * 1024;
diff --git a/src/com/android/gallery3d/data/MediaObject.java b/src/com/android/gallery3d/data/MediaObject.java
index 530ee306e..6e3867647 100644
--- a/src/com/android/gallery3d/data/MediaObject.java
+++ b/src/com/android/gallery3d/data/MediaObject.java
@@ -42,12 +42,15 @@ public abstract class MediaObject {
public static final int SUPPORT_CAMERA_SHORTCUT = 1 << 15;
public static final int SUPPORT_MUTE = 1 << 16;
public static final int SUPPORT_PRINT = 1 << 17;
+ public static final int SUPPORT_DRM_INFO = 1 << 18;
public static final int SUPPORT_ALL = 0xffffffff;
// These are the bits returned from getMediaType():
public static final int MEDIA_TYPE_UNKNOWN = 1;
public static final int MEDIA_TYPE_IMAGE = 2;
public static final int MEDIA_TYPE_VIDEO = 4;
+ public static final int MEDIA_TYPE_DRM_VIDEO = 5;
+ public static final int MEDIA_TYPE_DRM_IMAGE = 6;
public static final int MEDIA_TYPE_ALL = MEDIA_TYPE_IMAGE | MEDIA_TYPE_VIDEO;
public static final String MEDIA_TYPE_IMAGE_STRING = "image";
diff --git a/src/com/android/gallery3d/data/MediaSet.java b/src/com/android/gallery3d/data/MediaSet.java
index 683aa6b32..4c009c735 100644
--- a/src/com/android/gallery3d/data/MediaSet.java
+++ b/src/com/android/gallery3d/data/MediaSet.java
@@ -87,6 +87,11 @@ public abstract class MediaSet extends MediaObject {
return 0;
}
+ public int getCurrectSize() {
+ // Dummy method, need to be override in implementation classes
+ return 0;
+ }
+
public MediaSet getSubMediaSet(int index) {
throw new IndexOutOfBoundsException();
}
diff --git a/src/com/android/gallery3d/data/SecureAlbum.java b/src/com/android/gallery3d/data/SecureAlbum.java
index 204f848f8..bb505a50f 100644
--- a/src/com/android/gallery3d/data/SecureAlbum.java
+++ b/src/com/android/gallery3d/data/SecureAlbum.java
@@ -151,7 +151,7 @@ public class SecureAlbum extends MediaSet implements StitchingChangeListener {
private boolean isCameraBucketEmpty(Uri baseUri) {
Uri uri = baseUri.buildUpon()
.appendQueryParameter("limit", "1").build();
- String[] selection = {String.valueOf(MediaSetUtils.CAMERA_BUCKET_ID)};
+ String[] selection = {String.valueOf(MediaSetUtils.getCameraBucketId())};
Cursor cursor = mContext.getContentResolver().query(uri, PROJECTION,
"bucket_id = ?", selection, null);
if (cursor == null) return true;
diff --git a/src/com/android/gallery3d/data/UriImage.java b/src/com/android/gallery3d/data/UriImage.java
index b3fe1de03..13176e4aa 100644
--- a/src/com/android/gallery3d/data/UriImage.java
+++ b/src/com/android/gallery3d/data/UriImage.java
@@ -17,6 +17,7 @@
package com.android.gallery3d.data;
import android.content.ContentResolver;
+import android.drm.DrmHelper;
import android.graphics.Bitmap;
import android.graphics.Bitmap.Config;
import android.graphics.BitmapFactory.Options;
@@ -58,12 +59,14 @@ public class UriImage extends MediaItem {
private PanoramaMetadataSupport mPanoramaMetadata = new PanoramaMetadataSupport(this);
private GalleryApp mApplication;
+ private String mFilePath;
public UriImage(GalleryApp application, Path path, Uri uri, String contentType) {
super(path, nextVersionNumber());
mUri = uri;
mApplication = Utils.checkNotNull(application);
mContentType = contentType;
+ mFilePath = DrmHelper.getFilePath(mApplication.getAndroidContext(), uri);
}
@Override
@@ -171,6 +174,14 @@ public class UriImage extends MediaItem {
private class RegionDecoderJob implements Job<BitmapRegionDecoder> {
@Override
public BitmapRegionDecoder run(JobContext jc) {
+ if (DrmHelper.isDrmFile(getFilePath())) {
+ BitmapRegionDecoder decoder = DrmHelper
+ .createBitmapRegionDecoder(getFilePath(), false);
+ mWidth = decoder.getWidth();
+ mHeight = decoder.getHeight();
+ return decoder;
+ }
+
if (!prepareInputFile(jc)) return null;
BitmapRegionDecoder decoder = DecodeUtils.createBitmapRegionDecoder(
jc, mFileDescriptor.getFileDescriptor(), false);
@@ -189,6 +200,10 @@ public class UriImage extends MediaItem {
@Override
public Bitmap run(JobContext jc) {
+ if (DrmHelper.isDrmFile(getFilePath())) {
+ return DecodeUtils.ensureGLCompatibleBitmap(DrmHelper.getBitmap(getFilePath()));
+ }
+
if (!prepareInputFile(jc)) return null;
int targetSize = MediaItem.getTargetSize(mType);
Options options = new Options();
@@ -211,10 +226,18 @@ public class UriImage extends MediaItem {
@Override
public int getSupportedOperations() {
- int supported = SUPPORT_PRINT | SUPPORT_SETAS;
- if (isSharable()) supported |= SUPPORT_SHARE;
- if (BitmapUtils.isSupportedByRegionDecoder(mContentType)) {
- supported |= SUPPORT_EDIT | SUPPORT_FULL_IMAGE;
+ int supported = 0;
+ if (DrmHelper.isDrmFile(getFilePath())) {
+ supported |= SUPPORT_DRM_INFO | SUPPORT_FULL_IMAGE;
+ if (DrmHelper.isShareableDrmFile(getFilePath())) {
+ supported |= SUPPORT_SHARE;
+ }
+ } else {
+ supported = SUPPORT_PRINT | SUPPORT_SETAS;
+ if (isSharable()) supported |= SUPPORT_SHARE;
+ if (BitmapUtils.isSupportedByRegionDecoder(mContentType)) {
+ supported |= SUPPORT_EDIT | SUPPORT_FULL_IMAGE;
+ }
}
return supported;
}
@@ -239,6 +262,10 @@ public class UriImage extends MediaItem {
@Override
public int getMediaType() {
+ if (DrmHelper.isDrmFile(getFilePath())) {
+ return MEDIA_TYPE_DRM_IMAGE;
+ }
+
return MEDIA_TYPE_IMAGE;
}
@@ -295,4 +322,9 @@ public class UriImage extends MediaItem {
public int getRotation() {
return mRotation;
}
+
+ @Override
+ public String getFilePath() {
+ return mFilePath;
+ }
}
diff --git a/src/com/android/gallery3d/data/UriSource.java b/src/com/android/gallery3d/data/UriSource.java
index f66bacd7b..b4bb16072 100644
--- a/src/com/android/gallery3d/data/UriSource.java
+++ b/src/com/android/gallery3d/data/UriSource.java
@@ -17,7 +17,9 @@
package com.android.gallery3d.data;
import android.content.ContentResolver;
+import android.drm.DrmHelper;
import android.net.Uri;
+import android.text.TextUtils;
import android.webkit.MimeTypeMap;
import com.android.gallery3d.app.GalleryApp;
@@ -73,6 +75,19 @@ class UriSource extends MediaSource {
@Override
public Path findPathByUri(Uri uri, String type) {
String mimeType = getMimeType(uri);
+ if (DrmHelper.isDrmMimeType(mimeType)) {
+ String path = DrmHelper.getFilePath(
+ mApplication.getAndroidContext(), uri);
+ if (!TextUtils.isEmpty(path)) {
+ try {
+ return Path.fromString("/uri/"
+ + URLEncoder.encode(path, CHARSET_UTF_8) + "/"
+ + URLEncoder.encode(type, CHARSET_UTF_8));
+ } catch (UnsupportedEncodingException e) {
+ throw new AssertionError(e);
+ }
+ }
+ }
// Try to find a most specific type but it has to be started with "image/"
if ((type == null) || (IMAGE_TYPE_ANY.equals(type)