Add FileProvider

pull/467/head
Alex Baker 9 years ago
parent 5b3530306f
commit 86f35273de

@ -276,6 +276,16 @@
android:readPermission="org.tasks.READ" android:readPermission="org.tasks.READ"
android:writePermission="org.tasks.WRITE" /> android:writePermission="org.tasks.WRITE" />
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="org.tasks.files"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_provider_paths" />
</provider>
<!-- ========================================================= Plugins = --> <!-- ========================================================= Plugins = -->
<activity <activity

@ -8,11 +8,9 @@ package com.todoroo.astrid.files;
import android.annotation.SuppressLint; import android.annotation.SuppressLint;
import android.app.Activity; import android.app.Activity;
import android.content.ActivityNotFoundException; import android.content.ActivityNotFoundException;
import android.content.ClipData;
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.media.MediaPlayer; import android.media.MediaPlayer;
import android.net.Uri;
import android.os.Bundle; import android.os.Bundle;
import android.support.annotation.Nullable; import android.support.annotation.Nullable;
import android.text.TextUtils; import android.text.TextUtils;
@ -33,6 +31,7 @@ import com.todoroo.astrid.data.TaskAttachment;
import org.tasks.R; import org.tasks.R;
import org.tasks.activities.AddAttachmentActivity; import org.tasks.activities.AddAttachmentActivity;
import org.tasks.dialogs.DialogBuilder; import org.tasks.dialogs.DialogBuilder;
import org.tasks.files.FileHelper;
import org.tasks.injection.ForActivity; import org.tasks.injection.ForActivity;
import org.tasks.injection.FragmentComponent; import org.tasks.injection.FragmentComponent;
import org.tasks.ui.TaskEditControlFragment; import org.tasks.ui.TaskEditControlFragment;
@ -47,8 +46,6 @@ import butterknife.BindView;
import butterknife.OnClick; import butterknife.OnClick;
import timber.log.Timber; import timber.log.Timber;
import static com.todoroo.andlib.utility.AndroidUtilities.atLeastLollipop;
public class FilesControlSet extends TaskEditControlFragment { public class FilesControlSet extends TaskEditControlFragment {
public static final int TAG = R.string.TEA_ctrl_files_pref; public static final int TAG = R.string.TEA_ctrl_files_pref;
@ -212,14 +209,7 @@ public class FilesControlSet extends TaskEditControlFragment {
play(m.getFilePath(), () -> showFromIntent(filePath, fileType)); play(m.getFilePath(), () -> showFromIntent(filePath, fileType));
} else if (fileType.startsWith(TaskAttachment.FILE_TYPE_IMAGE)) { } else if (fileType.startsWith(TaskAttachment.FILE_TYPE_IMAGE)) {
try { try {
Intent intent = new Intent(Intent.ACTION_VIEW); Intent intent = FileHelper.getReadableActionView(context, filePath, TaskAttachment.FILE_TYPE_IMAGE + "*");
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));
}
getActivity().startActivity(intent); getActivity().startActivity(intent);
} catch(ActivityNotFoundException e) { } catch(ActivityNotFoundException e) {
Timber.e(e, e.getMessage()); Timber.e(e, e.getMessage());
@ -247,9 +237,7 @@ public class FilesControlSet extends TaskEditControlFragment {
private void showFromIntent(String file, String type) { private void showFromIntent(String file, String type) {
try { try {
Intent intent = new Intent(Intent.ACTION_VIEW); Intent intent = FileHelper.getReadableActionView(context, file, type);
intent.setDataAndType(Uri.fromFile(new File(file)), type);
intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
getActivity().startActivity(intent); getActivity().startActivity(intent);
} catch (ActivityNotFoundException e) { } catch (ActivityNotFoundException e) {
Timber.e(e, e.getMessage()); Timber.e(e, e.getMessage());

@ -9,6 +9,7 @@ import android.app.Activity;
import android.content.Intent; import android.content.Intent;
import android.graphics.Color; import android.graphics.Color;
import android.net.Uri; import android.net.Uri;
import android.support.v4.content.FileProvider;
import android.text.Html; import android.text.Html;
import android.text.Spanned; import android.text.Spanned;
import android.text.format.DateUtils; import android.text.format.DateUtils;
@ -27,8 +28,10 @@ import com.todoroo.astrid.data.Task;
import com.todoroo.astrid.data.UserActivity; import com.todoroo.astrid.data.UserActivity;
import org.tasks.R; import org.tasks.R;
import org.tasks.files.FileHelper;
import org.tasks.preferences.Preferences; import org.tasks.preferences.Preferences;
import java.io.File;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections; import java.util.Collections;
@ -139,8 +142,11 @@ public class CommentsController {
commentPictureView.setImageBitmap(sampleBitmap(path, commentPictureView.getLayoutParams().width, commentPictureView.getLayoutParams().height)); commentPictureView.setImageBitmap(sampleBitmap(path, commentPictureView.getLayoutParams().width, commentPictureView.getLayoutParams().height));
view.setOnClickListener(v -> { 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 intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(updateBitmap, "image/*"); intent.setDataAndType(uri, "image/*");
FileHelper.grantReadPermissions(activity, intent, uri);
activity.startActivity(intent); activity.startActivity(intent);
}); });
} else { } else {

@ -1,11 +1,13 @@
package org.tasks.activities; package org.tasks.activities;
import android.annotation.SuppressLint; import android.annotation.SuppressLint;
import android.content.ClipData;
import android.content.Intent; import android.content.Intent;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.net.Uri; import android.net.Uri;
import android.os.Bundle; import android.os.Bundle;
import android.provider.MediaStore; import android.provider.MediaStore;
import android.support.v4.content.FileProvider;
import android.widget.Toast; import android.widget.Toast;
import org.tasks.R; import org.tasks.R;
@ -15,6 +17,7 @@ import org.tasks.preferences.Preferences;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.util.List;
import java.util.concurrent.atomic.AtomicReference; import java.util.concurrent.atomic.AtomicReference;
import javax.inject.Inject; 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(); Toast.makeText(this, R.string.external_storage_unavailable, Toast.LENGTH_LONG).show();
} else { } else {
final Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); final Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
Uri uri = Uri.fromFile(output); Uri uri = FileProvider.getUriForFile(this, "org.tasks.files", output);
intent.setFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
intent.putExtra(MediaStore.EXTRA_OUTPUT, uri); intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);
if (atLeastLollipop()) { if (atLeastLollipop()) {
intent.setClipData(ClipData.newRawUri(null, uri)); intent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
} else {
List<ResolveInfo> 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); startActivityForResult(intent, REQUEST_CODE_CAMERA);
} }

@ -1,9 +1,19 @@
package org.tasks.files; package org.tasks.files;
import android.app.Activity; 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.database.Cursor;
import android.net.Uri; import android.net.Uri;
import android.provider.MediaStore; 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 class FileHelper {
public static String getPathFromUri(Activity activity, Uri uri) { public static String getPathFromUri(Activity activity, Uri uri) {
@ -19,4 +29,31 @@ public class FileHelper {
return uri.getPath(); 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<ResolveInfo> 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);
}
}
}
}
} }

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
<external-path name="external_files" path="."/>
</paths>
Loading…
Cancel
Save