diff options
Diffstat (limited to 'src/com/android/gallery3d/data')
-rw-r--r-- | src/com/android/gallery3d/data/DecodeUtils.java | 44 | ||||
-rwxr-xr-x[-rw-r--r--] | src/com/android/gallery3d/data/FaceClustering.java | 2 | ||||
-rw-r--r-- | src/com/android/gallery3d/data/FilterDeleteSet.java | 5 | ||||
-rw-r--r-- | src/com/android/gallery3d/data/FilterTypeSet.java | 3 | ||||
-rw-r--r-- | src/com/android/gallery3d/data/ImageCacheRequest.java | 21 | ||||
-rw-r--r-- | src/com/android/gallery3d/data/LocalAlbum.java | 6 | ||||
-rw-r--r-- | src/com/android/gallery3d/data/LocalAlbumSet.java | 2 | ||||
-rw-r--r-- | src/com/android/gallery3d/data/LocalImage.java | 55 | ||||
-rw-r--r-- | src/com/android/gallery3d/data/LocalVideo.java | 26 | ||||
-rw-r--r-- | src/com/android/gallery3d/data/MediaDetails.java | 29 | ||||
-rw-r--r-- | src/com/android/gallery3d/data/MediaItem.java | 1 | ||||
-rw-r--r-- | src/com/android/gallery3d/data/MediaObject.java | 3 | ||||
-rw-r--r-- | src/com/android/gallery3d/data/MediaSet.java | 5 | ||||
-rw-r--r-- | src/com/android/gallery3d/data/SecureAlbum.java | 2 | ||||
-rw-r--r-- | src/com/android/gallery3d/data/UriImage.java | 40 | ||||
-rw-r--r-- | src/com/android/gallery3d/data/UriSource.java | 15 |
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) |