diff --git a/app/src/main/java/eu/faircode/email/FragmentOptionsSynchronize.java b/app/src/main/java/eu/faircode/email/FragmentOptionsSynchronize.java index 231848ef34..e0c452fdb1 100644 --- a/app/src/main/java/eu/faircode/email/FragmentOptionsSynchronize.java +++ b/app/src/main/java/eu/faircode/email/FragmentOptionsSynchronize.java @@ -80,6 +80,7 @@ public class FragmentOptionsSynchronize extends FragmentBase implements SharedPr private TextView tvSubscriptionPro; private SwitchCompat swCheckMx; private SwitchCompat swCheckReply; + private SwitchCompat swTuneKeepAlive; private Group grpExempted; private AdapterAccountExempted adapter; @@ -88,7 +89,7 @@ public class FragmentOptionsSynchronize extends FragmentBase implements SharedPr "enabled", "poll_interval", "schedule", "schedule_start", "schedule_end", "sync_nodate", "sync_unseen", "sync_flagged", "delete_unseen", "sync_kept", "gmail_thread_id", "sync_folders", "sync_shared_folders", "subscriptions", - "check_mx", "check_reply" + "check_mx", "check_reply", "tune_keep_alive" }; @Override @@ -129,6 +130,7 @@ public class FragmentOptionsSynchronize extends FragmentBase implements SharedPr tvSubscriptionPro = view.findViewById(R.id.tvSubscriptionPro); swCheckMx = view.findViewById(R.id.swCheckMx); swCheckReply = view.findViewById(R.id.swCheckReply); + swTuneKeepAlive = view.findViewById(R.id.swTuneKeepAlive); grpExempted = view.findViewById(R.id.grpExempted); setOptions(); @@ -308,6 +310,13 @@ public class FragmentOptionsSynchronize extends FragmentBase implements SharedPr } }); + swTuneKeepAlive.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { + @Override + public void onCheckedChanged(CompoundButton compoundButton, boolean checked) { + prefs.edit().putBoolean("tune_keep_alive", checked).apply(); + } + }); + DB db = DB.getInstance(getContext()); db.account().liveSynchronizingAccounts().observe(getViewLifecycleOwner(), new Observer>() { @Override @@ -397,6 +406,7 @@ public class FragmentOptionsSynchronize extends FragmentBase implements SharedPr swSubscriptions.setEnabled(pro); swCheckMx.setChecked(prefs.getBoolean("check_mx", false)); swCheckReply.setChecked(prefs.getBoolean("check_reply", false)); + swTuneKeepAlive.setChecked(prefs.getBoolean("tune_keep_alive", true)); } private String formatHour(Context context, int minutes) { diff --git a/app/src/main/java/eu/faircode/email/ServiceSynchronize.java b/app/src/main/java/eu/faircode/email/ServiceSynchronize.java index 3b43f43b2f..a3fe4fcb65 100644 --- a/app/src/main/java/eu/faircode/email/ServiceSynchronize.java +++ b/app/src/main/java/eu/faircode/email/ServiceSynchronize.java @@ -1376,14 +1376,14 @@ public class ServiceSynchronize extends ServiceBase implements SharedPreferences boolean first = true; while (state.isRunning()) { long idleTime = state.getIdleTime(); - boolean auto_optimize = prefs.getBoolean("auto_optimize", false); - boolean optimize = (auto_optimize && !first && + boolean tune_keep_alive = prefs.getBoolean("tune_keep_alive", true); + boolean tune = (tune_keep_alive && !first && !account.keep_alive_ok && account.poll_interval > 9 && Math.abs(idleTime - account.poll_interval * 60 * 1000L) < 60 * 1000L); - if (auto_optimize && !first && !account.keep_alive_ok) + if (tune_keep_alive && !first && !account.keep_alive_ok) EntityLog.log(ServiceSynchronize.this, account.name + - " Optimize interval=" + account.poll_interval + - " idle=" + idleTime + "/" + optimize); + " Tune interval=" + account.poll_interval + + " idle=" + idleTime + "/" + tune); try { if (!state.isRecoverable()) throw new StoreClosedException(iservice.getStore(), "Unrecoverable"); @@ -1414,7 +1414,7 @@ public class ServiceSynchronize extends ServiceBase implements SharedPreferences Log.i(folder.name + " poll count=" + folder.poll_count); } } catch (Throwable ex) { - if (optimize) { + if (tune) { account.keep_alive_failed++; account.keep_alive_succeeded = 0; if (account.keep_alive_failed >= 3) { @@ -1433,7 +1433,7 @@ public class ServiceSynchronize extends ServiceBase implements SharedPreferences throw ex; } - if (optimize) { + if (tune) { account.keep_alive_failed = 0; account.keep_alive_succeeded++; db.account().setAccountKeepAliveValues(account.id, diff --git a/app/src/main/res/layout/fragment_options_synchronize.xml b/app/src/main/res/layout/fragment_options_synchronize.xml index 06a1b48b3a..56863369d0 100644 --- a/app/src/main/res/layout/fragment_options_synchronize.xml +++ b/app/src/main/res/layout/fragment_options_synchronize.xml @@ -516,6 +516,18 @@ app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@id/swCheckReply" /> + + Synchronize folder list Synchronize shared folder lists Manage folder subscriptions + Check sender email addresses on synchronizing messages + Check reply email addresses on synchronizing messages + Automatically tune the keep-alive interval Show keyboard by default Suggest locally stored contacts @@ -477,20 +480,18 @@ Synchronizing periodically will compare local and remote messages each and every time, which is an expensive operation possibly resulting in extra battery usage, especially when there are a lot of messages to synchronize. Always synchronizing will avoid this by continuous monitoring for changes only. This option can be optimized automatically (miscellaneous settings) Tap on a time to set a time - Check sender email addresses on synchronizing messages - Check reply email addresses on synchronizing messages Some providers store messages with an unknown, invalid or future date as messages without date Some providers don\'t support this properly, which may cause synchronizing none or all messages When disabled, unread messages are kept on the device forever This will transfer extra data and consume extra battery power, especially if a lot of messages are stored on the device Disabling this will reduce data and battery usage somewhat, but will disable updating the list of folders too + This will check if DNS MX records exist This will slow down synchronizing messages + This will check if domain name of the sender and reply addresses are the same In addition to contacts provided by Android. Contact data will be stored for newly sent or received messages only when enabled. Insert \'-- \' between the text and the signature Show a warning when the message text or the subject is empty or when an attachment might be missing - This will check if DNS MX records exist - This will check if domain name of the sender and reply addresses are the same Metered connections are generally mobile connections or paid Wi-Fi hotspots Disabling this option will disable receiving and sending messages on mobile internet connections