Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 86d69be5 authored by Danesh Mondegarian's avatar Danesh Mondegarian
Browse files

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
parent fb340590
Loading
Loading
Loading
Loading
+3 −3
Original line number Diff line number Diff line
@@ -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);
        }
+1 −2
Original line number Diff line number Diff line
@@ -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);
        }
+36 −7
Original line number Diff line number Diff line
@@ -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()) {
                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));
+33 −0
Original line number Diff line number Diff line
@@ -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;
        }
    }
}