diff options
author | Danesh Mondegarian <daneshm90@gmail.com> | 2014-12-14 12:00:27 -0800 |
---|---|---|
committer | Danesh Mondegarian <daneshm90@gmail.com> | 2014-12-14 12:04:56 -0800 |
commit | 86d69be562a3e5d5d9879a21709fd1aa0bec909d (patch) | |
tree | 9b350d06a4500f92349ff2f90f7efcdd78d61e56 /src | |
parent | fb3405904df8f9261c2e19f7e86c9975871990f7 (diff) | |
download | android_packages_apps_CMFileManager-86d69be562a3e5d5d9879a21709fd1aa0bec909d.tar.gz android_packages_apps_CMFileManager-86d69be562a3e5d5d9879a21709fd1aa0bec909d.tar.bz2 android_packages_apps_CMFileManager-86d69be562a3e5d5d9879a21709fd1aa0bec909d.zip |
CMFileManager : Pass appropriate media type uri when ACTION_VIEW
Passing the appropriate uri and not the generic File table uri,
allows apps such as gallery to allow paging in the appropriate folder.
Change-Id: I622680d0e27c304fb83532ccc2e026ff9e112a5b
Diffstat (limited to 'src')
4 files changed, 73 insertions, 12 deletions
diff --git a/src/com/cyanogenmod/filemanager/activities/PickerActivity.java b/src/com/cyanogenmod/filemanager/activities/PickerActivity.java index 52297519..3fe9c5d1 100644 --- a/src/com/cyanogenmod/filemanager/activities/PickerActivity.java +++ b/src/com/cyanogenmod/filemanager/activities/PickerActivity.java @@ -434,7 +434,7 @@ public class PickerActivity extends Activity // Return the picked file, as expected (this activity should fill the intent data // and return RESULT_OK result) Intent result = new Intent(); - result.setData(getResultUriForFileFromIntent(getContentResolver(), src, getIntent())); + result.setData(getResultUriForFileFromIntent(this, src, getIntent())); setResult(Activity.RESULT_OK, result); finish(); @@ -496,9 +496,9 @@ public class PickerActivity extends Activity return file.getParentFile(); } - private static Uri getResultUriForFileFromIntent(ContentResolver cr, File src, Intent intent) { + private static Uri getResultUriForFileFromIntent(Context context, File src, Intent intent) { // Try to find the preferred uri scheme - Uri result = MediaHelper.fileToContentUri(cr, src); + Uri result = MediaHelper.fileToContentUri(context, src); if (result == null) { result = Uri.fromFile(src); } diff --git a/src/com/cyanogenmod/filemanager/ui/policy/IntentsActionPolicy.java b/src/com/cyanogenmod/filemanager/ui/policy/IntentsActionPolicy.java index 47be24ee..026e31c1 100644 --- a/src/com/cyanogenmod/filemanager/ui/policy/IntentsActionPolicy.java +++ b/src/com/cyanogenmod/filemanager/ui/policy/IntentsActionPolicy.java @@ -668,8 +668,7 @@ public final class IntentsActionPolicy extends ActionsPolicy { // Try to resolve media data or return a file uri final File file = new File(fso.getFullPath()); - ContentResolver cr = ctx.getContentResolver(); - Uri uri = MediaHelper.fileToContentUri(cr, file); + Uri uri = MediaHelper.fileToContentUri(ctx, file); if (uri == null) { uri = Uri.fromFile(file); } diff --git a/src/com/cyanogenmod/filemanager/util/MediaHelper.java b/src/com/cyanogenmod/filemanager/util/MediaHelper.java index bb6a9c6b..d3d29318 100644 --- a/src/com/cyanogenmod/filemanager/util/MediaHelper.java +++ b/src/com/cyanogenmod/filemanager/util/MediaHelper.java @@ -17,6 +17,7 @@ package com.cyanogenmod.filemanager.util; import android.content.ContentResolver; +import android.content.Context; import android.database.Cursor; import android.net.Uri; import android.os.UserHandle; @@ -113,16 +114,16 @@ public final class MediaHelper { * @param file The file reference * @return Uri The content uri or null if file not exists in the media database */ - public static Uri fileToContentUri(ContentResolver cr, File file) { + public static Uri fileToContentUri(Context context, File file) { // Normalize the path to ensure media search final String normalizedPath = normalizeMediaPath(file.getAbsolutePath()); // Check in external and internal storages - Uri uri = fileToContentUri(cr, normalizedPath, EXTERNAL_VOLUME); + Uri uri = fileToContentUri(context, normalizedPath, EXTERNAL_VOLUME); if (uri != null) { return uri; } - uri = fileToContentUri(cr, normalizedPath, INTERNAL_VOLUME); + uri = fileToContentUri(context, normalizedPath, INTERNAL_VOLUME); if (uri != null) { return uri; } @@ -137,16 +138,44 @@ public final class MediaHelper { * @param volume The volume * @return Uri The content uri or null if file not exists in the media database */ - private static Uri fileToContentUri(ContentResolver cr, String path, String volume) { - final String[] projection = {BaseColumns._ID, MediaStore.Files.FileColumns.MEDIA_TYPE}; + private static Uri fileToContentUri(Context context, String path, String volume) { + String[] projection = null; final String where = MediaColumns.DATA + " = ?"; + File file = new File(path); Uri baseUri = MediaStore.Files.getContentUri(volume); + boolean isMimeTypeImage = false, isMimeTypeVideo = false, isMimeTypeAudio = false; + isMimeTypeImage = MimeTypeHelper.KnownMimeTypeResolver.isImage(context, file); + if (!isMimeTypeImage) { + isMimeTypeVideo = MimeTypeHelper.KnownMimeTypeResolver.isVideo(context, file); + if (!isMimeTypeVideo) { + isMimeTypeAudio = MimeTypeHelper.KnownMimeTypeResolver.isAudio(context, file); + } + } + if (isMimeTypeImage || isMimeTypeVideo || isMimeTypeAudio) { + projection = new String[]{BaseColumns._ID}; + if (isMimeTypeImage) { + baseUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI; + } else if (isMimeTypeVideo) { + baseUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI; + } else if (isMimeTypeAudio) { + baseUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI; + } + } else { + projection = new String[]{BaseColumns._ID, MediaStore.Files.FileColumns.MEDIA_TYPE}; + } + ContentResolver cr = context.getContentResolver(); Cursor c = cr.query(baseUri, projection, where, new String[]{path}, null); try { if (c != null && c.moveToNext()) { - int type = c.getInt(c.getColumnIndexOrThrow( + boolean isValid = false; + if (isMimeTypeImage || isMimeTypeVideo || isMimeTypeAudio) { + isValid = true; + } else { + int type = c.getInt(c.getColumnIndexOrThrow( MediaStore.Files.FileColumns.MEDIA_TYPE)); - if (type != 0) { + isValid = type != 0; + } + if (isValid) { // Do not force to use content uri for no media files long id = c.getLong(c.getColumnIndexOrThrow(BaseColumns._ID)); return Uri.withAppendedPath(baseUri, String.valueOf(id)); diff --git a/src/com/cyanogenmod/filemanager/util/MimeTypeHelper.java b/src/com/cyanogenmod/filemanager/util/MimeTypeHelper.java index 38212a20..ebcdcadb 100644 --- a/src/com/cyanogenmod/filemanager/util/MimeTypeHelper.java +++ b/src/com/cyanogenmod/filemanager/util/MimeTypeHelper.java @@ -615,5 +615,38 @@ public final class MimeTypeHelper { public static boolean isVideo(Context context, FileSystemObject fso) { return MimeTypeHelper.getCategory(context, fso).compareTo(MimeTypeCategory.VIDEO) == 0; } + + /** + * Method that returns if the File is an image file. + * + * @param context The current context + * @param file The File to check + * @return boolean If the File is an image file. + */ + public static boolean isImage(Context context, File file) { + return MimeTypeHelper.getCategory(context, file).compareTo(MimeTypeCategory.IMAGE) == 0; + } + + /** + * Method that returns if the File is an video file. + * + * @param context The current context + * @param file The File to check + * @return boolean If the File is an video file. + */ + public static boolean isVideo(Context context, File file) { + return MimeTypeHelper.getCategory(context, file).compareTo(MimeTypeCategory.VIDEO) == 0; + } + + /** + * Method that returns if the File is an audio file. + * + * @param context The current context + * @param file The File to check + * @return boolean If the File is an audio file. + */ + public static boolean isAudio(Context context, File file) { + return MimeTypeHelper.getCategory(context, file).compareTo(MimeTypeCategory.AUDIO) == 0; + } } } |