From 8dc7839db0ba486c3d5692e75d54e73520ba6162 Mon Sep 17 00:00:00 2001 From: Alex Baker Date: Tue, 8 Jan 2019 14:14:49 -0600 Subject: [PATCH] Fix some storage access framework issues --- .../main/java/org/tasks/files/FileHelper.java | 37 ++++++++++++++----- 1 file changed, 28 insertions(+), 9 deletions(-) diff --git a/app/src/main/java/org/tasks/files/FileHelper.java b/app/src/main/java/org/tasks/files/FileHelper.java index 09311e733..b5bf7888e 100644 --- a/app/src/main/java/org/tasks/files/FileHelper.java +++ b/app/src/main/java/org/tasks/files/FileHelper.java @@ -1,5 +1,6 @@ package org.tasks.files; +import android.annotation.TargetApi; import android.app.Activity; import android.content.ContentResolver; import android.content.Context; @@ -8,13 +9,13 @@ import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; import android.database.Cursor; import android.net.Uri; +import android.os.Build; import android.provider.OpenableColumns; import android.webkit.MimeTypeMap; import android.widget.Toast; import com.google.common.io.ByteStreams; import com.google.common.io.Files; -import com.todoroo.astrid.utility.Constants; import org.tasks.R; @@ -29,21 +30,25 @@ import java.util.List; import javax.annotation.Nullable; import androidx.documentfile.provider.DocumentFile; +import timber.log.Timber; +import static android.content.ContentResolver.SCHEME_CONTENT; +import static android.provider.DocumentsContract.EXTRA_INITIAL_URI; import static androidx.core.content.FileProvider.getUriForFile; import static com.google.common.collect.Iterables.any; import static com.todoroo.andlib.utility.AndroidUtilities.atLeastKitKat; import static com.todoroo.andlib.utility.AndroidUtilities.atLeastLollipop; +import static com.todoroo.andlib.utility.AndroidUtilities.preLollipop; +import static com.todoroo.astrid.utility.Constants.FILE_PROVIDER_AUTHORITY; public class FileHelper { public static Intent newFilePickerIntent(Activity activity, Uri initial, String... mimeTypes) { if (atLeastKitKat()) { Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT); + intent.putExtra("android.content.extra.SHOW_ADVANCED",true); intent.addCategory(Intent.CATEGORY_OPENABLE); - if (initial != null) { - intent.setData(initial); - } + setInitialUri(activity, intent, initial); if (mimeTypes.length == 1) { intent.setType(mimeTypes[0]); } else { @@ -71,6 +76,7 @@ public class FileHelper { | Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_PREFIX_URI_PERMISSION); intent.putExtra("android.content.extra.SHOW_ADVANCED",true); + setInitialUri(activity, intent, initial); activity.startActivityForResult(intent, rc); } else { Intent intent = new Intent(activity, FileExplore.class); @@ -82,6 +88,19 @@ public class FileHelper { } } + @TargetApi(Build.VERSION_CODES.O) + private static void setInitialUri(Context context, Intent intent, Uri uri) { + if (uri == null || preLollipop() || !uri.getScheme().equals(SCHEME_CONTENT)) { + return; + } + + try { + intent.putExtra(EXTRA_INITIAL_URI, DocumentFile.fromTreeUri(context, uri).getUri()); + } catch (Exception e) { + Timber.e(e); + } + } + public static void delete(Context context, Uri uri) { if (uri == null) { return; @@ -116,7 +135,7 @@ public class FileHelper { switch (uri.getScheme()) { case ContentResolver.SCHEME_FILE: return uri.getLastPathSegment(); - case ContentResolver.SCHEME_CONTENT: + case SCHEME_CONTENT: Cursor cursor = context.getContentResolver().query(uri, null, null, null, null); if (cursor != null && cursor.moveToFirst()) { try { @@ -143,10 +162,10 @@ public class FileHelper { String mimeType = getMimeType(context, uri); Intent intent = new Intent(Intent.ACTION_VIEW); - if (uri.getScheme().equals(ContentResolver.SCHEME_CONTENT)) { - uri = copyToUri(context, Uri.fromFile(context.getCacheDir()), uri); + if (uri.getScheme().equals(SCHEME_CONTENT)) { + uri = copyToUri(context, Uri.fromFile(context.getExternalCacheDir()), uri); } - Uri share = getUriForFile(context, Constants.FILE_PROVIDER_AUTHORITY, new File(uri.getPath())); + Uri share = getUriForFile(context, FILE_PROVIDER_AUTHORITY, new File(uri.getPath())); intent.setDataAndType(share, mimeType); grantReadPermissions(context, intent, share); PackageManager packageManager = context.getPackageManager(); @@ -225,7 +244,7 @@ public class FileHelper { } String tempName = baseName; switch (uri.getScheme()) { - case ContentResolver.SCHEME_CONTENT: + case SCHEME_CONTENT: DocumentFile dir = DocumentFile.fromTreeUri(context, uri); List documentFiles = Arrays.asList(dir.listFiles()); while (true) {