diff --git a/app/src/main/java/eu/faircode/email/EntityAttachment.java b/app/src/main/java/eu/faircode/email/EntityAttachment.java index 58bc8d07ee..4381abcb2b 100644 --- a/app/src/main/java/eu/faircode/email/EntityAttachment.java +++ b/app/src/main/java/eu/faircode/email/EntityAttachment.java @@ -22,9 +22,11 @@ package eu.faircode.email; import static androidx.room.ForeignKey.CASCADE; import android.content.Context; +import android.content.SharedPreferences; import android.text.TextUtils; import androidx.annotation.NonNull; +import androidx.preference.PreferenceManager; import androidx.room.Entity; import androidx.room.ForeignKey; import androidx.room.Index; @@ -112,7 +114,14 @@ public class EntityAttachment { } static File getFile(Context context, long id, String name) { - File dir = new File(context.getFilesDir(), "attachments"); + SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); + boolean external_storage = prefs.getBoolean("external_storage", false); + + File root = (external_storage + ? context.getExternalFilesDir(null) + : context.getFilesDir()); + + File dir = new File(root, "attachments"); if (!dir.exists()) dir.mkdir(); String filename = Long.toString(id); diff --git a/app/src/main/java/eu/faircode/email/FragmentOptionsMisc.java b/app/src/main/java/eu/faircode/email/FragmentOptionsMisc.java index ffd47b9502..0f7b5b7299 100644 --- a/app/src/main/java/eu/faircode/email/FragmentOptionsMisc.java +++ b/app/src/main/java/eu/faircode/email/FragmentOptionsMisc.java @@ -39,7 +39,6 @@ import android.text.SpannableStringBuilder; import android.text.Spanned; import android.text.style.RelativeSizeSpan; import android.text.style.StyleSpan; -import android.text.style.TypefaceSpan; import android.util.Pair; import android.view.LayoutInflater; import android.view.Menu; @@ -134,6 +133,7 @@ public class FragmentOptionsMisc extends FragmentBase implements SharedPreferenc private Button btnRepair; private SwitchCompat swAutostart; + private SwitchCompat swExternalStorage; private TextView tvRoomQueryThreads; private SeekBar sbRoomQueryThreads; private ImageButton ibRoom; @@ -190,6 +190,7 @@ public class FragmentOptionsMisc extends FragmentBase implements SharedPreferenc "updates", "weekly", "show_changelog", "experiments", "crash_reports", "cleanup_attachments", "protocol", "debug", "log_level", "test1", "test2", "test3", "test4", "test5", + // "external_storage", "query_threads", "wal", "checkpoints", "sqlite_cache", "chunk_size", "undo_manager", "webview_legacy", "use_modseq", "uid_command", "perform_expunge", "uid_expunge", @@ -280,6 +281,7 @@ public class FragmentOptionsMisc extends FragmentBase implements SharedPreferenc btnRepair = view.findViewById(R.id.btnRepair); swAutostart = view.findViewById(R.id.swAutostart); + swExternalStorage = view.findViewById(R.id.swExternalStorage); tvRoomQueryThreads = view.findViewById(R.id.tvRoomQueryThreads); sbRoomQueryThreads = view.findViewById(R.id.sbRoomQueryThreads); ibRoom = view.findViewById(R.id.ibRoom); @@ -776,6 +778,50 @@ public class FragmentOptionsMisc extends FragmentBase implements SharedPreferenc } }); + swExternalStorage.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { + @Override + public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { + prefs.edit().putBoolean("external_storage", isChecked).apply(); + + Bundle args = new Bundle(); + args.putBoolean("external_storage", isChecked); + + new SimpleTask() { + @Override + protected Void onExecute(Context context, Bundle args) throws IOException { + boolean external_storage = args.getBoolean("external_storage"); + + File source = (!external_storage + ? context.getExternalFilesDir(null) + : context.getFilesDir()); + + File target = (external_storage + ? context.getExternalFilesDir(null) + : context.getFilesDir()); + + source = new File(source, "attachments"); + target = new File(target, "attachments"); + + File[] attachments = source.listFiles(); + if (attachments != null) + for (File attachment : attachments) { + File dest = new File(target, attachment.getName()); + Log.i("Move " + attachment + " to " + dest); + Helper.copy(attachment, dest); + attachment.delete(); + } + + return null; + } + + @Override + protected void onException(Bundle args, Throwable ex) { + Log.unexpectedError(getParentFragmentManager(), ex); + } + }.execute(FragmentOptionsMisc.this, args, "external"); + } + }); + sbRoomQueryThreads.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { @Override public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { @@ -1125,6 +1171,7 @@ public class FragmentOptionsMisc extends FragmentBase implements SharedPreferenc files.addAll(getFiles(context.getCacheDir(), MIN_FILE_SIZE)); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) files.addAll(getFiles(context.getDataDir(), MIN_FILE_SIZE)); + files.addAll(getFiles(context.getExternalFilesDir(null), MIN_FILE_SIZE)); Collections.sort(files, new Comparator() { @Override @@ -1158,6 +1205,7 @@ public class FragmentOptionsMisc extends FragmentBase implements SharedPreferenc ? null : context.getDataDir()); File filesDir = context.getFilesDir(); File cacheDir = context.getCacheDir(); + File externalDir = context.getExternalFilesDir(null); if (dataDir != null) ssb.append("Data: ").append(dataDir.getAbsolutePath()).append("\r\n"); @@ -1165,6 +1213,8 @@ public class FragmentOptionsMisc extends FragmentBase implements SharedPreferenc ssb.append("Files: ").append(filesDir.getAbsolutePath()).append("\r\n"); if (cacheDir != null) ssb.append("Cache: ").append(cacheDir.getAbsolutePath()).append("\r\n"); + if (externalDir != null) + ssb.append("External: ").append(externalDir.getAbsolutePath()).append("\r\n"); ssb.append("\r\n"); for (File file : files) { @@ -1432,6 +1482,7 @@ public class FragmentOptionsMisc extends FragmentBase implements SharedPreferenc swTest5.setChecked(prefs.getBoolean("test5", false)); swAutostart.setChecked(Helper.isComponentEnabled(getContext(), ReceiverAutoStart.class)); + swExternalStorage.setChecked(prefs.getBoolean("external_storage", false)); int query_threads = prefs.getInt("query_threads", DB.DEFAULT_QUERY_THREADS); tvRoomQueryThreads.setText(getString(R.string.title_advanced_room_query_threads, NF.format(query_threads))); diff --git a/app/src/main/res/layout/fragment_options_misc.xml b/app/src/main/res/layout/fragment_options_misc.xml index b5dd2d7789..a1a38aa1ef 100644 --- a/app/src/main/res/layout/fragment_options_misc.xml +++ b/app/src/main/res/layout/fragment_options_misc.xml @@ -702,6 +702,17 @@ app:layout_constraintTop_toBottomOf="@id/btnRepair" app:switchPadding="12dp" /> + + + app:layout_constraintTop_toBottomOf="@id/swExternalStorage" /> Test #5 Repair Autostart + External storage ROOM query threads: %1$s WAL Checkpoints diff --git a/app/src/main/res/xml/fileprovider_paths.xml b/app/src/main/res/xml/fileprovider_paths.xml index fe1f98813c..9254c420aa 100644 --- a/app/src/main/res/xml/fileprovider_paths.xml +++ b/app/src/main/res/xml/fileprovider_paths.xml @@ -3,6 +3,9 @@ +