From 5cfbeafa82e78ab13b9c64e5287b23d94a476680 Mon Sep 17 00:00:00 2001 From: M66B Date: Fri, 27 Jan 2023 09:56:32 +0100 Subject: [PATCH] Added option to select default folder --- .../java/eu/faircode/email/ActivityEML.java | 2 +- .../eu/faircode/email/ActivitySignature.java | 4 +- .../java/eu/faircode/email/AdapterFolder.java | 2 +- .../eu/faircode/email/FragmentAnswer.java | 2 +- .../java/eu/faircode/email/FragmentBase.java | 20 +++++--- .../eu/faircode/email/FragmentContacts.java | 2 +- .../eu/faircode/email/FragmentMessages.java | 8 +-- .../faircode/email/FragmentOptionsBackup.java | 20 +++++--- .../email/FragmentOptionsBehavior.java | 51 ++++++++++++++++++- .../faircode/email/FragmentOptionsMisc.java | 2 +- .../java/eu/faircode/email/FragmentRules.java | 7 +-- .../main/java/eu/faircode/email/Helper.java | 10 ++-- .../res/layout/fragment_options_behavior.xml | 36 ++++++++++++- app/src/main/res/values/strings.xml | 5 ++ 14 files changed, 137 insertions(+), 34 deletions(-) diff --git a/app/src/main/java/eu/faircode/email/ActivityEML.java b/app/src/main/java/eu/faircode/email/ActivityEML.java index b9ff33b037..10c043101b 100644 --- a/app/src/main/java/eu/faircode/email/ActivityEML.java +++ b/app/src/main/java/eu/faircode/email/ActivityEML.java @@ -392,7 +392,7 @@ public class ActivityEML extends ActivityBase { create.setType(apart.attachment.getMimeType()); if (!TextUtils.isEmpty(apart.attachment.name)) create.putExtra(Intent.EXTRA_TITLE, apart.attachment.name); - Helper.openAdvanced(create); + Helper.openAdvanced(ActivityEML.this, create); if (create.resolveActivity(getPackageManager()) == null) // system whitelisted ToastEx.makeText(ActivityEML.this, R.string.title_no_saf, Toast.LENGTH_LONG).show(); else diff --git a/app/src/main/java/eu/faircode/email/ActivitySignature.java b/app/src/main/java/eu/faircode/email/ActivitySignature.java index d7e029d17d..99f38a11e9 100644 --- a/app/src/main/java/eu/faircode/email/ActivitySignature.java +++ b/app/src/main/java/eu/faircode/email/ActivitySignature.java @@ -309,7 +309,7 @@ public class ActivitySignature extends ActivityBase { intent.addCategory(Intent.CATEGORY_OPENABLE); intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); intent.setType("text/*"); - Helper.openAdvanced(intent); + Helper.openAdvanced(ActivitySignature.this, intent); startActivityForResult(intent, REQUEST_FILE); } @@ -414,7 +414,7 @@ public class ActivitySignature extends ActivityBase { intent.addFlags(Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION); intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); intent.setType("image/*"); - Helper.openAdvanced(intent); + Helper.openAdvanced(ActivitySignature.this, intent); startActivityForResult(intent, REQUEST_IMAGE); } diff --git a/app/src/main/java/eu/faircode/email/AdapterFolder.java b/app/src/main/java/eu/faircode/email/AdapterFolder.java index b1989f51c4..f34cd01744 100644 --- a/app/src/main/java/eu/faircode/email/AdapterFolder.java +++ b/app/src/main/java/eu/faircode/email/AdapterFolder.java @@ -1170,7 +1170,7 @@ public class AdapterFolder extends RecyclerView.Adapter= Build.VERSION_CODES.O) continue; @@ -1444,10 +1447,11 @@ public class FragmentOptionsBackup extends FragmentBase implements SharedPrefere } private void askPassword(final boolean export) { - Intent intent = (export ? getIntentExport() : getIntentImport()); - PackageManager pm = getContext().getPackageManager(); + final Context context = getContext(); + Intent intent = (export ? getIntentExport(context) : getIntentImport(context)); + PackageManager pm = context.getPackageManager(); if (intent.resolveActivity(pm) == null) { // // system/GET_CONTENT whitelisted - ToastEx.makeText(getContext(), R.string.title_no_saf, Toast.LENGTH_LONG).show(); + ToastEx.makeText(context, R.string.title_no_saf, Toast.LENGTH_LONG).show(); return; } @@ -1461,18 +1465,18 @@ public class FragmentOptionsBackup extends FragmentBase implements SharedPrefere } } - private static Intent getIntentExport() { + private static Intent getIntentExport(Context context) { Intent intent = new Intent(Intent.ACTION_CREATE_DOCUMENT); intent.addCategory(Intent.CATEGORY_OPENABLE); intent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION); intent.setType("*/*"); intent.putExtra(Intent.EXTRA_TITLE, "fairemail_" + new SimpleDateFormat("yyyyMMdd").format(new Date().getTime()) + ".backup"); - Helper.openAdvanced(intent); + Helper.openAdvanced(context, intent); return intent; } - private static Intent getIntentImport() { + private static Intent getIntentImport(Context context) { Intent intent = new Intent(Intent.ACTION_GET_CONTENT); intent.addCategory(Intent.CATEGORY_OPENABLE); intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); diff --git a/app/src/main/java/eu/faircode/email/FragmentOptionsBehavior.java b/app/src/main/java/eu/faircode/email/FragmentOptionsBehavior.java index 87178073b8..2dd4f506a4 100644 --- a/app/src/main/java/eu/faircode/email/FragmentOptionsBehavior.java +++ b/app/src/main/java/eu/faircode/email/FragmentOptionsBehavior.java @@ -19,11 +19,15 @@ package eu.faircode.email; Copyright 2018-2023 by Marcel Bokhorst (M66B) */ +import static android.app.Activity.RESULT_OK; + import android.app.Dialog; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.content.SharedPreferences; +import android.content.pm.PackageManager; +import android.net.Uri; import android.os.Build; import android.os.Bundle; import android.text.Editable; @@ -103,10 +107,14 @@ public class FragmentOptionsBehavior extends FragmentBase implements SharedPrefe private SwitchCompat swResetSnooze; private SwitchCompat swAutoBlockSender; private SwitchCompat swSwipeReply; + private Button btnDefaultFolder; + private TextView tvDefaultFolder; final static int MAX_SWIPE_SENSITIVITY = 10; final static int DEFAULT_SWIPE_SENSITIVITY = 7; + final static int REQUEST_DEFAULT_FOLDER = 1; + private final static String[] RESET_OPTIONS = new String[]{ "restore_on_launch", "sync_on_launch", "double_back", "conversation_actions", "conversation_actions_replies", "language_detection", "photo_picker", "default_snooze", @@ -116,7 +124,7 @@ public class FragmentOptionsBehavior extends FragmentBase implements SharedPrefe "autoclose", "onclose", "autoclose_unseen", "autoclose_send", "collapse_marked", "undo_timeout", "autoread", "flag_snoozed", "autounflag", "auto_important", "reset_importance", "reset_snooze", "auto_block_sender", - "swipe_reply" + "swipe_reply", "default_folder" }; @Override @@ -174,6 +182,8 @@ public class FragmentOptionsBehavior extends FragmentBase implements SharedPrefe swResetSnooze = view.findViewById(R.id.swResetSnooze); swAutoBlockSender = view.findViewById(R.id.swAutoBlockSender); swSwipeReply = view.findViewById(R.id.swSwipeReply); + btnDefaultFolder = view.findViewById(R.id.btnDefaultFolder); + tvDefaultFolder = view.findViewById(R.id.tvDefaultFolder); setOptions(); @@ -539,6 +549,18 @@ public class FragmentOptionsBehavior extends FragmentBase implements SharedPrefe } }); + Intent tree = new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE); + Helper.openAdvanced(getContext(), tree); + PackageManager pm = getContext().getPackageManager(); + btnDefaultFolder.setEnabled(tree.resolveActivity(pm) != null && + Build.VERSION.SDK_INT >= Build.VERSION_CODES.O); + btnDefaultFolder.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + startActivityForResult(Helper.getChooser(getContext(), tree), REQUEST_DEFAULT_FOLDER); + } + }); + // Initialize FragmentDialogTheme.setBackground(getContext(), view, false); @@ -553,6 +575,24 @@ public class FragmentOptionsBehavior extends FragmentBase implements SharedPrefe super.onDestroyView(); } + @Override + public void onActivityResult(int requestCode, int resultCode, Intent data) { + super.onActivityResult(requestCode, resultCode, data); + + try { + switch (requestCode) { + case REQUEST_DEFAULT_FOLDER: + if (resultCode == RESULT_OK && data != null) + onDefaultFolder(data.getData()); + else + onDefaultFolder(null); + break; + } + } catch (Throwable ex) { + Log.e(ex); + } + } + @Override public void onSharedPreferenceChanged(SharedPreferences prefs, String key) { if ("default_snooze".equals(key)) @@ -655,6 +695,15 @@ public class FragmentOptionsBehavior extends FragmentBase implements SharedPrefe swResetSnooze.setChecked(prefs.getBoolean("reset_snooze", true)); swAutoBlockSender.setChecked(prefs.getBoolean("auto_block_sender", true)); swSwipeReply.setChecked(prefs.getBoolean("swipe_reply", false)); + tvDefaultFolder.setText(prefs.getString("default_folder", null)); + } + + private void onDefaultFolder(Uri uri) { + SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getContext()); + if (uri == null) + prefs.edit().remove("default_folder").apply(); + else + prefs.edit().putString("default_folder", uri.toString()).apply(); } public static class FragmentDialogSwipes extends FragmentDialogBase { diff --git a/app/src/main/java/eu/faircode/email/FragmentOptionsMisc.java b/app/src/main/java/eu/faircode/email/FragmentOptionsMisc.java index b1f7a1cead..d18c61a429 100644 --- a/app/src/main/java/eu/faircode/email/FragmentOptionsMisc.java +++ b/app/src/main/java/eu/faircode/email/FragmentOptionsMisc.java @@ -2502,7 +2502,7 @@ public class FragmentOptionsMisc extends FragmentBase implements SharedPreferenc intent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION); intent.setType("*/*"); intent.putExtra(Intent.EXTRA_TITLE, "classifier.json"); - Helper.openAdvanced(intent); + Helper.openAdvanced(context, intent); startActivityForResult(intent, REQUEST_CLASSIFIER); } diff --git a/app/src/main/java/eu/faircode/email/FragmentRules.java b/app/src/main/java/eu/faircode/email/FragmentRules.java index 28e208d363..10c12453e2 100644 --- a/app/src/main/java/eu/faircode/email/FragmentRules.java +++ b/app/src/main/java/eu/faircode/email/FragmentRules.java @@ -290,8 +290,9 @@ public class FragmentRules extends FragmentBase { } private void onMenuExport() { - if (!ActivityBilling.isPro(getContext())) { - startActivity(new Intent(getContext(), ActivityBilling.class)); + final Context context = getContext(); + if (!ActivityBilling.isPro(context)) { + startActivity(new Intent(context, ActivityBilling.class)); return; } @@ -301,7 +302,7 @@ public class FragmentRules extends FragmentBase { intent.setType("*/*"); intent.putExtra(Intent.EXTRA_TITLE, "fairemail_" + new SimpleDateFormat("yyyyMMdd").format(new Date().getTime()) + ".rules"); - Helper.openAdvanced(intent); + Helper.openAdvanced(context, intent); startActivityForResult(intent, REQUEST_EXPORT); } diff --git a/app/src/main/java/eu/faircode/email/Helper.java b/app/src/main/java/eu/faircode/email/Helper.java index a600f9adcf..e45cdfe940 100644 --- a/app/src/main/java/eu/faircode/email/Helper.java +++ b/app/src/main/java/eu/faircode/email/Helper.java @@ -62,6 +62,7 @@ import android.os.PowerManager; import android.os.StatFs; import android.os.storage.StorageManager; import android.provider.Browser; +import android.provider.DocumentsContract; import android.provider.Settings; import android.security.KeyChain; import android.security.KeyChainAliasCallback; @@ -2591,14 +2592,17 @@ public class Helper { return size; } - static void openAdvanced(Intent intent) { + static void openAdvanced(Context context, Intent intent) { // https://issuetracker.google.com/issues/72053350 intent.putExtra("android.content.extra.SHOW_ADVANCED", true); intent.putExtra("android.content.extra.FANCY", true); intent.putExtra("android.content.extra.SHOW_FILESIZE", true); intent.putExtra("android.provider.extra.SHOW_ADVANCED", true); - //File initial = Environment.getExternalStorageDirectory(); - //intent.putExtra(DocumentsContract.EXTRA_INITIAL_URI, Uri.fromFile(initial)); + + SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); + String default_folder = prefs.getString("default_folder", null); + if (default_folder != null) + intent.putExtra(DocumentsContract.EXTRA_INITIAL_URI, Uri.parse(default_folder)); } static class ByteArrayInOutStream extends ByteArrayOutputStream { diff --git a/app/src/main/res/layout/fragment_options_behavior.xml b/app/src/main/res/layout/fragment_options_behavior.xml index 61f73e01e6..6fe418691e 100644 --- a/app/src/main/res/layout/fragment_options_behavior.xml +++ b/app/src/main/res/layout/fragment_options_behavior.xml @@ -794,8 +794,42 @@ app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@id/swAutoBlockSender" app:switchPadding="12dp" /> + +