diff --git a/app/src/main/java/eu/faircode/email/FragmentOptions.java b/app/src/main/java/eu/faircode/email/FragmentOptions.java index 4453f67f23..15166b0873 100644 --- a/app/src/main/java/eu/faircode/email/FragmentOptions.java +++ b/app/src/main/java/eu/faircode/email/FragmentOptions.java @@ -25,7 +25,9 @@ import android.preference.PreferenceManager; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; +import android.widget.AdapterView; import android.widget.CompoundButton; +import android.widget.Spinner; import androidx.annotation.NonNull; import androidx.annotation.Nullable; @@ -42,6 +44,7 @@ public class FragmentOptions extends FragmentEx { private SwitchCompat swSwipe; private SwitchCompat swNav; private SwitchCompat swInsecure; + private Spinner spDownload; private SwitchCompat swDebug; @Override @@ -62,6 +65,7 @@ public class FragmentOptions extends FragmentEx { swSwipe = view.findViewById(R.id.swSwipe); swNav = view.findViewById(R.id.swNav); swInsecure = view.findViewById(R.id.swInsecure); + spDownload = view.findViewById(R.id.spDownload); swDebug = view.findViewById(R.id.swDebug); // Wire controls @@ -152,6 +156,25 @@ public class FragmentOptions extends FragmentEx { } }); + int download = prefs.getInt("download", 32768); + final int[] values = getResources().getIntArray(R.array.downloadValues); + for (int i = 0; i < values.length; i++) + if (values[i] == download) { + spDownload.setSelection(i); + break; + } + spDownload.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { + @Override + public void onItemSelected(AdapterView parent, View view, int position, long id) { + prefs.edit().putInt("download", values[position]).apply(); + } + + @Override + public void onNothingSelected(AdapterView parent) { + prefs.edit().remove("download").apply(); + } + }); + swDebug.setChecked(prefs.getBoolean("debug", false)); swDebug.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { @Override diff --git a/app/src/main/java/eu/faircode/email/ServiceSynchronize.java b/app/src/main/java/eu/faircode/email/ServiceSynchronize.java index 0c4ba64906..d098c313a0 100644 --- a/app/src/main/java/eu/faircode/email/ServiceSynchronize.java +++ b/app/src/main/java/eu/faircode/email/ServiceSynchronize.java @@ -133,8 +133,6 @@ public class ServiceSynchronize extends LifecycleService { private static final int CONNECT_BACKOFF_MAX = 1024; // seconds (1024 sec ~ 17 min) private static final int SYNC_BATCH_SIZE = 20; private static final int DOWNLOAD_BATCH_SIZE = 20; - private static final int MESSAGE_AUTO_DOWNLOAD_SIZE = 32 * 1024; // bytes - private static final int ATTACHMENT_AUTO_DOWNLOAD_SIZE = 32 * 1024; // bytes private static final long RECONNECT_BACKOFF = 90 * 1000L; // milliseconds static final int PI_CLEAR = 1; @@ -1848,6 +1846,11 @@ public class ServiceSynchronize extends LifecycleService { } private static void downloadMessage(Context context, EntityFolder folder, IMAPFolder ifolder, IMAPMessage imessage, long id) throws MessagingException, IOException { + SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); + long download = prefs.getInt("download", 32768); + if (download == 0) + download = Long.MAX_VALUE; + DB db = DB.getInstance(context); EntityMessage message = db.message().getMessage(id); if (message == null) @@ -1860,13 +1863,13 @@ public class ServiceSynchronize extends LifecycleService { boolean fetch = false; if (!message.content) - if (!metered || (message.size != null && message.size < MESSAGE_AUTO_DOWNLOAD_SIZE)) + if (!metered || (message.size != null && message.size < download)) fetch = true; if (!fetch) for (EntityAttachment attachment : attachments) if (!attachment.available) - if (!metered || (attachment.size != null && attachment.size < ATTACHMENT_AUTO_DOWNLOAD_SIZE)) { + if (!metered || (attachment.size != null && attachment.size < download)) { fetch = true; break; } @@ -1886,7 +1889,7 @@ public class ServiceSynchronize extends LifecycleService { } if (!message.content) - if (!metered || (message.size != null && message.size < MESSAGE_AUTO_DOWNLOAD_SIZE)) { + if (!metered || (message.size != null && message.size < download)) { message.write(context, helper.getHtml()); db.message().setMessageContent(message.id, true); Log.i(Helper.TAG, folder.name + " downloaded message id=" + message.id + " size=" + message.size); @@ -1896,7 +1899,7 @@ public class ServiceSynchronize extends LifecycleService { for (int i = 0; i < attachments.size(); i++) { EntityAttachment attachment = attachments.get(i); if (!attachment.available) - if (!metered || (attachment.size != null && attachment.size < ATTACHMENT_AUTO_DOWNLOAD_SIZE)) { + if (!metered || (attachment.size != null && attachment.size < download)) { if (iattachments == null) iattachments = helper.getAttachments(); attachment.part = iattachments.get(i).part; diff --git a/app/src/main/res/layout/fragment_options.xml b/app/src/main/res/layout/fragment_options.xml index cd1a69897b..c40f7e7c6a 100644 --- a/app/src/main/res/layout/fragment_options.xml +++ b/app/src/main/res/layout/fragment_options.xml @@ -101,6 +101,28 @@ app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@id/swNav" /> + + + + + app:layout_constraintTop_toBottomOf="@id/tvDownload" /> \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 2a0096acef..62dbc14ae2 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -90,6 +90,7 @@ Browse messages on the server Swipe actions Previous/next navigation + Automatically download messages and attachments on a metered connection up to Debug mode Select … @@ -307,6 +308,30 @@ Please describe the problem and indicate the time of the problem: Please describe what you were doing when the app crashed: + + 16 KB + 32 KB + 64 KB + 128 KB + 256 KB + 512 KB + 1 MB + 2 MB + + + + + 16384 + 32768 + 65536 + 131072 + 262144 + 524288 + 1048576 + 2097152 + 0 + + @color/red @color/pink