diff --git a/src/main/AndroidManifest.xml b/src/main/AndroidManifest.xml index e8babf95f..f68b86328 100644 --- a/src/main/AndroidManifest.xml +++ b/src/main/AndroidManifest.xml @@ -276,6 +276,16 @@ android:readPermission="org.tasks.READ" android:writePermission="org.tasks.WRITE" /> + + + + showFromIntent(filePath, fileType)); } else if (fileType.startsWith(TaskAttachment.FILE_TYPE_IMAGE)) { try { - Intent intent = new Intent(Intent.ACTION_VIEW); - Uri uri = Uri.fromFile(new File(filePath)); - intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); - intent.setFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION); - intent.setDataAndType(uri, TaskAttachment.FILE_TYPE_IMAGE + "*"); - if (atLeastLollipop()) { - intent.setClipData(ClipData.newRawUri(null, uri)); - } + Intent intent = FileHelper.getReadableActionView(context, filePath, TaskAttachment.FILE_TYPE_IMAGE + "*"); getActivity().startActivity(intent); } catch(ActivityNotFoundException e) { Timber.e(e, e.getMessage()); @@ -247,9 +237,7 @@ public class FilesControlSet extends TaskEditControlFragment { private void showFromIntent(String file, String type) { try { - Intent intent = new Intent(Intent.ACTION_VIEW); - intent.setDataAndType(Uri.fromFile(new File(file)), type); - intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); + Intent intent = FileHelper.getReadableActionView(context, file, type); getActivity().startActivity(intent); } catch (ActivityNotFoundException e) { Timber.e(e, e.getMessage()); diff --git a/src/main/java/com/todoroo/astrid/notes/CommentsController.java b/src/main/java/com/todoroo/astrid/notes/CommentsController.java index fad5a5625..bb1e1ad76 100644 --- a/src/main/java/com/todoroo/astrid/notes/CommentsController.java +++ b/src/main/java/com/todoroo/astrid/notes/CommentsController.java @@ -9,6 +9,7 @@ import android.app.Activity; import android.content.Intent; import android.graphics.Color; import android.net.Uri; +import android.support.v4.content.FileProvider; import android.text.Html; import android.text.Spanned; import android.text.format.DateUtils; @@ -27,8 +28,10 @@ import com.todoroo.astrid.data.Task; import com.todoroo.astrid.data.UserActivity; import org.tasks.R; +import org.tasks.files.FileHelper; import org.tasks.preferences.Preferences; +import java.io.File; import java.util.ArrayList; import java.util.Collections; @@ -139,8 +142,11 @@ public class CommentsController { commentPictureView.setImageBitmap(sampleBitmap(path, commentPictureView.getLayoutParams().width, commentPictureView.getLayoutParams().height)); view.setOnClickListener(v -> { + File file = new File(updateBitmap.getPath()); + Uri uri = FileProvider.getUriForFile(activity, "org.tasks.files", file.getAbsoluteFile()); Intent intent = new Intent(Intent.ACTION_VIEW); - intent.setDataAndType(updateBitmap, "image/*"); + intent.setDataAndType(uri, "image/*"); + FileHelper.grantReadPermissions(activity, intent, uri); activity.startActivity(intent); }); } else { diff --git a/src/main/java/org/tasks/activities/CameraActivity.java b/src/main/java/org/tasks/activities/CameraActivity.java index bd86d820a..167a91501 100644 --- a/src/main/java/org/tasks/activities/CameraActivity.java +++ b/src/main/java/org/tasks/activities/CameraActivity.java @@ -1,11 +1,13 @@ package org.tasks.activities; import android.annotation.SuppressLint; -import android.content.ClipData; import android.content.Intent; +import android.content.pm.PackageManager; +import android.content.pm.ResolveInfo; import android.net.Uri; import android.os.Bundle; import android.provider.MediaStore; +import android.support.v4.content.FileProvider; import android.widget.Toast; import org.tasks.R; @@ -15,6 +17,7 @@ import org.tasks.preferences.Preferences; import java.io.File; import java.io.IOException; +import java.util.List; import java.util.concurrent.atomic.AtomicReference; import javax.inject.Inject; @@ -47,12 +50,19 @@ public class CameraActivity extends InjectingAppCompatActivity { Toast.makeText(this, R.string.external_storage_unavailable, Toast.LENGTH_LONG).show(); } else { final Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); - Uri uri = Uri.fromFile(output); - intent.setFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION); - intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); + Uri uri = FileProvider.getUriForFile(this, "org.tasks.files", output); intent.putExtra(MediaStore.EXTRA_OUTPUT, uri); if (atLeastLollipop()) { - intent.setClipData(ClipData.newRawUri(null, uri)); + intent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION); + } else { + List resolveInfoList = getPackageManager() + .queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY); + for (ResolveInfo resolveInfo : resolveInfoList) { + grantUriPermission( + resolveInfo.activityInfo.packageName, + uri, + Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION); + } } startActivityForResult(intent, REQUEST_CODE_CAMERA); } diff --git a/src/main/java/org/tasks/files/FileHelper.java b/src/main/java/org/tasks/files/FileHelper.java index c16119b05..44e5b46ee 100644 --- a/src/main/java/org/tasks/files/FileHelper.java +++ b/src/main/java/org/tasks/files/FileHelper.java @@ -1,9 +1,19 @@ package org.tasks.files; import android.app.Activity; +import android.content.Context; +import android.content.Intent; +import android.content.pm.PackageManager; +import android.content.pm.ResolveInfo; import android.database.Cursor; import android.net.Uri; import android.provider.MediaStore; +import android.support.v4.content.FileProvider; + +import java.io.File; +import java.util.List; + +import static com.todoroo.andlib.utility.AndroidUtilities.atLeastLollipop; public class FileHelper { public static String getPathFromUri(Activity activity, Uri uri) { @@ -19,4 +29,31 @@ public class FileHelper { return uri.getPath(); } } + + public static Intent getReadableActionView(Context context, String path, String type) { + Intent intent = new Intent(Intent.ACTION_VIEW); + Uri uri = FileProvider.getUriForFile(context, "org.tasks.files", new File(path)); + intent.setDataAndType(uri, type); + grantReadPermissions(context, intent, uri); + return intent; + } + + public static void grantReadPermissions(Context context, Intent intent, Uri uri) { + if (atLeastLollipop()) { + intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); + } else { + if (atLeastLollipop()) { + intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); + } else { + List resolveInfoList = context.getPackageManager() + .queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY); + for (ResolveInfo resolveInfo : resolveInfoList) { + context.grantUriPermission( + resolveInfo.activityInfo.packageName, + uri, + Intent.FLAG_GRANT_READ_URI_PERMISSION); + } + } + } + } } diff --git a/src/main/res/xml/file_provider_paths.xml b/src/main/res/xml/file_provider_paths.xml new file mode 100644 index 000000000..ffa74ab56 --- /dev/null +++ b/src/main/res/xml/file_provider_paths.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file