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