diff --git a/app/src/main/java/eu/faircode/email/ActivityBase.java b/app/src/main/java/eu/faircode/email/ActivityBase.java index 49ab8ed273..e9817ccab9 100644 --- a/app/src/main/java/eu/faircode/email/ActivityBase.java +++ b/app/src/main/java/eu/faircode/email/ActivityBase.java @@ -26,6 +26,7 @@ import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; import android.content.res.Configuration; +import android.net.Uri; import android.os.Build; import android.os.Bundle; import android.os.Handler; @@ -42,12 +43,16 @@ import android.widget.Toast; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.appcompat.app.AppCompatActivity; +import androidx.core.content.FileProvider; +import androidx.documentfile.provider.DocumentFile; import androidx.lifecycle.Lifecycle; import androidx.lifecycle.LifecycleObserver; import androidx.lifecycle.LifecycleOwner; import androidx.lifecycle.OnLifecycleEvent; import androidx.preference.PreferenceManager; +import java.io.File; +import java.io.FileOutputStream; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; @@ -366,6 +371,7 @@ abstract class ActivityBase extends AppCompatActivity implements SharedPreferenc if (!this.getClass().equals(ActivityMain.class) && Helper.shouldAuthenticate(this)) { Intent intent = getIntent(); finishAndRemoveTask(); + processStreams(intent); Intent main = new Intent(this, ActivityMain.class) .putExtra("intent", intent); main.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); @@ -373,6 +379,63 @@ abstract class ActivityBase extends AppCompatActivity implements SharedPreferenc } } + private void processStreams(Intent intent) { + intent.setClipData(null); + + if (intent.hasExtra(Intent.EXTRA_STREAM)) { + if (Intent.ACTION_SEND_MULTIPLE.equals(intent.getAction())) { + ArrayList uris = intent.getParcelableArrayListExtra(Intent.EXTRA_STREAM); + if (uris == null) + intent.removeExtra(Intent.EXTRA_STREAM); + else { + ArrayList processed = new ArrayList<>(); + for (Uri uri : uris) + processed.add(processUri(uri)); + intent.putParcelableArrayListExtra(Intent.EXTRA_STREAM, processed); + } + } else { + Uri uri = intent.getParcelableExtra(Intent.EXTRA_STREAM); + if (uri == null) + intent.removeExtra(Intent.EXTRA_STREAM); + else + intent.putExtra(Intent.EXTRA_STREAM, processUri(uri)); + } + } + } + + private Uri processUri(Uri uri) { + try { + String fname = null; + try { + DocumentFile dfile = DocumentFile.fromSingleUri(this, uri); + if (dfile != null) + fname = dfile.getName(); + } catch (SecurityException ex) { + Log.e(ex); + } + + if (TextUtils.isEmpty(fname)) + fname = uri.getLastPathSegment(); + + if (TextUtils.isEmpty(fname)) + return uri; + + File dir = new File(getCacheDir(), "shared"); + if (!dir.exists()) + dir.mkdir(); + + File file = new File(dir, fname); + + Log.i("Copying shared file to " + file); + Helper.copy(getContentResolver().openInputStream(uri), new FileOutputStream(file)); + + return FileProvider.getUriForFile(this, BuildConfig.APPLICATION_ID, file); + } catch (Throwable ex) { + Log.w(ex); + return uri; + } + } + @Override public void startActivity(Intent intent) { try { diff --git a/app/src/main/java/eu/faircode/email/WorkerCleanup.java b/app/src/main/java/eu/faircode/email/WorkerCleanup.java index e5e1f57956..e83be17a13 100644 --- a/app/src/main/java/eu/faircode/email/WorkerCleanup.java +++ b/app/src/main/java/eu/faircode/email/WorkerCleanup.java @@ -190,6 +190,7 @@ public class WorkerCleanup extends Worker { File[] references = new File(context.getFilesDir(), "references").listFiles(); File[] photos = new File(context.getCacheDir(), "photo").listFiles(); File[] calendars = new File(context.getCacheDir(), "calendar").listFiles(); + File[] shared = new File(context.getCacheDir(), "shared").listFiles(); if (messages != null) files.addAll(Arrays.asList(messages)); @@ -201,6 +202,8 @@ public class WorkerCleanup extends Worker { files.addAll(Arrays.asList(photos)); if (calendars != null) files.addAll(Arrays.asList(calendars)); + if (shared != null) + files.addAll(Arrays.asList(shared)); // Cleanup message files Log.i("Cleanup message files"); diff --git a/app/src/main/res/xml/fileprovider_paths.xml b/app/src/main/res/xml/fileprovider_paths.xml index 2cebe8595b..fe1f98813c 100644 --- a/app/src/main/res/xml/fileprovider_paths.xml +++ b/app/src/main/res/xml/fileprovider_paths.xml @@ -15,4 +15,7 @@ +