From 22f4725be010438dc59a6b5317e3f6e599fdb372 Mon Sep 17 00:00:00 2001 From: M66B Date: Wed, 15 Feb 2023 17:37:15 +0100 Subject: [PATCH] POP3: reversed message order support --- app/src/main/java/eu/faircode/email/Core.java | 10 ++++++---- .../main/java/eu/faircode/email/EntityAccount.java | 3 +-- .../main/java/eu/faircode/email/FragmentGmail.java | 6 ++---- .../main/java/eu/faircode/email/FragmentOAuth.java | 3 --- .../main/java/eu/faircode/email/FragmentPop.java | 9 +++++---- app/src/main/res/layout/fragment_pop.xml | 14 ++++++++++++-- app/src/main/res/values/strings.xml | 4 ++++ 7 files changed, 30 insertions(+), 19 deletions(-) diff --git a/app/src/main/java/eu/faircode/email/Core.java b/app/src/main/java/eu/faircode/email/Core.java index 153fbff6b2..44d1c806f7 100644 --- a/app/src/main/java/eu/faircode/email/Core.java +++ b/app/src/main/java/eu/faircode/email/Core.java @@ -2981,7 +2981,8 @@ class Core { List ids = db.message().getUidls(folder.id); int max = (account.max_messages == null ? imessages.length - : Math.min(imessages.length, account.max_messages)); + : Math.min(imessages.length, Math.abs(account.max_messages))); + boolean reversed = (account.max_messages != null && account.max_messages < 0); boolean sync = true; if (!hasUidl && sync_quick_pop && !force && @@ -3003,6 +3004,7 @@ class Core { " device=" + ids.size() + " server=" + imessages.length + " max=" + max + "/" + account.max_messages + + " reversed=" + reversed + " last=" + folder.last_sync_count + " sync=" + sync + " uidl=" + hasUidl); @@ -3075,7 +3077,7 @@ class Core { } boolean _new = true; - for (int i = imessages.length - 1; i >= imessages.length - max; i--) { + for (int i = reversed ? 0 : imessages.length - 1; reversed ? i < max : i >= imessages.length - max; i += reversed ? 1 : -1) { state.ensureRunning("Sync/POP3"); Message imessage = imessages[i]; @@ -3392,8 +3394,8 @@ class Core { } if (account.max_messages != null && !account.leave_on_device) { - int hidden = db.message().setMessagesUiHide(folder.id, account.max_messages); - int deleted = db.message().deleteMessagesKeep(folder.id, account.max_messages + 100); + int hidden = db.message().setMessagesUiHide(folder.id, Math.abs(account.max_messages)); + int deleted = db.message().deleteMessagesKeep(folder.id, Math.abs(account.max_messages) + 100); EntityLog.log(context, account.name + " POP" + " cleanup max=" + account.max_messages + "" + " hidden=" + hidden + " deleted=" + deleted); diff --git a/app/src/main/java/eu/faircode/email/EntityAccount.java b/app/src/main/java/eu/faircode/email/EntityAccount.java index 9ae81ad8f4..b6ce1970e3 100644 --- a/app/src/main/java/eu/faircode/email/EntityAccount.java +++ b/app/src/main/java/eu/faircode/email/EntityAccount.java @@ -58,7 +58,6 @@ public class EntityAccount extends EntityOrder implements Serializable { // https://tools.ietf.org/html/rfc2177 static final int DEFAULT_KEEP_ALIVE_INTERVAL = 15; // minutes static final int DEFAULT_POLL_INTERVAL = 15; // minutes - static final int DEFAULT_MAX_MESSAGES = 250; // POP3 static final int QUOTA_WARNING = 95; // percent @@ -120,7 +119,7 @@ public class EntityAccount extends EntityOrder implements Serializable { public Boolean leave_deleted = false; @NonNull public Boolean leave_on_device = false; - public Integer max_messages; // POP3 + public Integer max_messages = null; // POP3 @NonNull public Boolean auto_seen = true; @ColumnInfo(name = "separator") diff --git a/app/src/main/java/eu/faircode/email/FragmentGmail.java b/app/src/main/java/eu/faircode/email/FragmentGmail.java index 4ccca3fd3e..83dd6757de 100644 --- a/app/src/main/java/eu/faircode/email/FragmentGmail.java +++ b/app/src/main/java/eu/faircode/email/FragmentGmail.java @@ -529,11 +529,9 @@ public class FragmentGmail extends FragmentBase { account.synchronize = true; account.primary = (primary == null); - if (pop) { - // https://support.google.com/mail/answer/7104828 + // https://support.google.com/mail/answer/7104828 + if (pop) account.leave_on_device = true; - account.max_messages = EntityAccount.DEFAULT_MAX_MESSAGES; - } account.created = new Date().getTime(); account.last_connected = account.created; diff --git a/app/src/main/java/eu/faircode/email/FragmentOAuth.java b/app/src/main/java/eu/faircode/email/FragmentOAuth.java index c22a1b2f2f..f4ca777c75 100644 --- a/app/src/main/java/eu/faircode/email/FragmentOAuth.java +++ b/app/src/main/java/eu/faircode/email/FragmentOAuth.java @@ -891,9 +891,6 @@ public class FragmentOAuth extends FragmentBase { account.partial_fetch = provider.partial; account.raw_fetch = provider.raw; - if (pop) - account.max_messages = EntityAccount.DEFAULT_MAX_MESSAGES; - account.created = new Date().getTime(); account.last_connected = account.created; diff --git a/app/src/main/java/eu/faircode/email/FragmentPop.java b/app/src/main/java/eu/faircode/email/FragmentPop.java index d39e468540..5d44e556a1 100644 --- a/app/src/main/java/eu/faircode/email/FragmentPop.java +++ b/app/src/main/java/eu/faircode/email/FragmentPop.java @@ -445,6 +445,8 @@ public class FragmentPop extends FragmentBase { if (TextUtils.isEmpty(interval)) interval = Integer.toString(EntityAccount.DEFAULT_POLL_INTERVAL); Integer max_messages = (TextUtils.isEmpty(max) ? null : Integer.parseInt(max)); + if (max_messages != null && max_messages == 0) + max_messages = null; int poll_interval = Math.max(1, Integer.parseInt(interval)); if (TextUtils.isEmpty(name)) @@ -793,11 +795,10 @@ public class FragmentPop extends FragmentBase { cbLeaveDeleted.setChecked(account == null ? true : account.leave_deleted); cbLeaveDevice.setChecked(account == null ? false : account.leave_on_device); - if (account != null && account.max_messages == null) - etMax.setText(null); + if (account != null && account.max_messages != null) + etMax.setText(Integer.toString(account.max_messages)); else - etMax.setText(Integer.toString(account == null - ? EntityAccount.DEFAULT_MAX_MESSAGES : account.max_messages)); + etMax.setText(null); etInterval.setText(account == null ? "" : Long.toString(account.poll_interval)); cbUnmetered.setChecked(jcondition.optBoolean("unmetered")); diff --git a/app/src/main/res/layout/fragment_pop.xml b/app/src/main/res/layout/fragment_pop.xml index e56bb9d7ce..2f7e09152c 100644 --- a/app/src/main/res/layout/fragment_pop.xml +++ b/app/src/main/res/layout/fragment_pop.xml @@ -469,12 +469,22 @@ android:id="@+id/etMax" android:layout_width="match_parent" android:layout_height="wrap_content" - android:inputType="number" + android:inputType="numberSigned" android:maxLength="9" android:textAppearance="@style/TextAppearance.AppCompat.Medium" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@id/tvMax" /> + + + app:layout_constraintTop_toBottomOf="@id/tvMaxRemark" /> Leave deleted messages on server Leave messages on device Maximum number of messages to download (blank for all) + + Enter a positive number to download the messages at the end (most common) + and a negative number to download the messages at the beginning (least common) + Poll interval (minutes) Keep-alive interval (minutes) Restart IMAP IDLE periodically