POP3: reversed message order support

pull/212/head
M66B 3 years ago
parent 89f2cee08c
commit 22f4725be0

@ -2981,7 +2981,8 @@ class Core {
List<TupleUidl> ids = db.message().getUidls(folder.id); List<TupleUidl> ids = db.message().getUidls(folder.id);
int max = (account.max_messages == null int max = (account.max_messages == null
? imessages.length ? 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; boolean sync = true;
if (!hasUidl && sync_quick_pop && !force && if (!hasUidl && sync_quick_pop && !force &&
@ -3003,6 +3004,7 @@ class Core {
" device=" + ids.size() + " device=" + ids.size() +
" server=" + imessages.length + " server=" + imessages.length +
" max=" + max + "/" + account.max_messages + " max=" + max + "/" + account.max_messages +
" reversed=" + reversed +
" last=" + folder.last_sync_count + " last=" + folder.last_sync_count +
" sync=" + sync + " sync=" + sync +
" uidl=" + hasUidl); " uidl=" + hasUidl);
@ -3075,7 +3077,7 @@ class Core {
} }
boolean _new = true; 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"); state.ensureRunning("Sync/POP3");
Message imessage = imessages[i]; Message imessage = imessages[i];
@ -3392,8 +3394,8 @@ class Core {
} }
if (account.max_messages != null && !account.leave_on_device) { if (account.max_messages != null && !account.leave_on_device) {
int hidden = db.message().setMessagesUiHide(folder.id, account.max_messages); int hidden = db.message().setMessagesUiHide(folder.id, Math.abs(account.max_messages));
int deleted = db.message().deleteMessagesKeep(folder.id, account.max_messages + 100); int deleted = db.message().deleteMessagesKeep(folder.id, Math.abs(account.max_messages) + 100);
EntityLog.log(context, account.name + " POP" + EntityLog.log(context, account.name + " POP" +
" cleanup max=" + account.max_messages + "" + " cleanup max=" + account.max_messages + "" +
" hidden=" + hidden + " deleted=" + deleted); " hidden=" + hidden + " deleted=" + deleted);

@ -58,7 +58,6 @@ public class EntityAccount extends EntityOrder implements Serializable {
// https://tools.ietf.org/html/rfc2177 // https://tools.ietf.org/html/rfc2177
static final int DEFAULT_KEEP_ALIVE_INTERVAL = 15; // minutes static final int DEFAULT_KEEP_ALIVE_INTERVAL = 15; // minutes
static final int DEFAULT_POLL_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 static final int QUOTA_WARNING = 95; // percent
@ -120,7 +119,7 @@ public class EntityAccount extends EntityOrder implements Serializable {
public Boolean leave_deleted = false; public Boolean leave_deleted = false;
@NonNull @NonNull
public Boolean leave_on_device = false; public Boolean leave_on_device = false;
public Integer max_messages; // POP3 public Integer max_messages = null; // POP3
@NonNull @NonNull
public Boolean auto_seen = true; public Boolean auto_seen = true;
@ColumnInfo(name = "separator") @ColumnInfo(name = "separator")

@ -529,11 +529,9 @@ public class FragmentGmail extends FragmentBase {
account.synchronize = true; account.synchronize = true;
account.primary = (primary == null); 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.leave_on_device = true;
account.max_messages = EntityAccount.DEFAULT_MAX_MESSAGES;
}
account.created = new Date().getTime(); account.created = new Date().getTime();
account.last_connected = account.created; account.last_connected = account.created;

@ -891,9 +891,6 @@ public class FragmentOAuth extends FragmentBase {
account.partial_fetch = provider.partial; account.partial_fetch = provider.partial;
account.raw_fetch = provider.raw; account.raw_fetch = provider.raw;
if (pop)
account.max_messages = EntityAccount.DEFAULT_MAX_MESSAGES;
account.created = new Date().getTime(); account.created = new Date().getTime();
account.last_connected = account.created; account.last_connected = account.created;

@ -445,6 +445,8 @@ public class FragmentPop extends FragmentBase {
if (TextUtils.isEmpty(interval)) if (TextUtils.isEmpty(interval))
interval = Integer.toString(EntityAccount.DEFAULT_POLL_INTERVAL); interval = Integer.toString(EntityAccount.DEFAULT_POLL_INTERVAL);
Integer max_messages = (TextUtils.isEmpty(max) ? null : Integer.parseInt(max)); 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)); int poll_interval = Math.max(1, Integer.parseInt(interval));
if (TextUtils.isEmpty(name)) if (TextUtils.isEmpty(name))
@ -793,11 +795,10 @@ public class FragmentPop extends FragmentBase {
cbLeaveDeleted.setChecked(account == null ? true : account.leave_deleted); cbLeaveDeleted.setChecked(account == null ? true : account.leave_deleted);
cbLeaveDevice.setChecked(account == null ? false : account.leave_on_device); cbLeaveDevice.setChecked(account == null ? false : account.leave_on_device);
if (account != null && account.max_messages == null) if (account != null && account.max_messages != null)
etMax.setText(null); etMax.setText(Integer.toString(account.max_messages));
else else
etMax.setText(Integer.toString(account == null etMax.setText(null);
? EntityAccount.DEFAULT_MAX_MESSAGES : account.max_messages));
etInterval.setText(account == null ? "" : Long.toString(account.poll_interval)); etInterval.setText(account == null ? "" : Long.toString(account.poll_interval));
cbUnmetered.setChecked(jcondition.optBoolean("unmetered")); cbUnmetered.setChecked(jcondition.optBoolean("unmetered"));

@ -469,12 +469,22 @@
android:id="@+id/etMax" android:id="@+id/etMax"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:inputType="number" android:inputType="numberSigned"
android:maxLength="9" android:maxLength="9"
android:textAppearance="@style/TextAppearance.AppCompat.Medium" android:textAppearance="@style/TextAppearance.AppCompat.Medium"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/tvMax" /> app:layout_constraintTop_toBottomOf="@id/tvMax" />
<TextView
android:id="@+id/tvMaxRemark"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/title_max_messages_remark"
android:textAppearance="@style/TextAppearance.AppCompat.Small"
android:textStyle="italic"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/etMax" />
<!-- keep alive --> <!-- keep alive -->
<TextView <TextView
@ -485,7 +495,7 @@
android:text="@string/title_keep_poll_interval" android:text="@string/title_keep_poll_interval"
android:textAppearance="@style/TextAppearance.AppCompat.Small" android:textAppearance="@style/TextAppearance.AppCompat.Small"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/etMax" /> app:layout_constraintTop_toBottomOf="@id/tvMaxRemark" />
<eu.faircode.email.EditTextPlain <eu.faircode.email.EditTextPlain
android:id="@+id/etInterval" android:id="@+id/etInterval"

@ -1112,6 +1112,10 @@
<string name="title_leave_deleted">Leave deleted messages on server</string> <string name="title_leave_deleted">Leave deleted messages on server</string>
<string name="title_leave_on_device">Leave messages on device</string> <string name="title_leave_on_device">Leave messages on device</string>
<string name="title_max_messages">Maximum number of messages to download (blank for all)</string> <string name="title_max_messages">Maximum number of messages to download (blank for all)</string>
<string name="title_max_messages_remark">
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)
</string>
<string name="title_keep_poll_interval">Poll interval (minutes)</string> <string name="title_keep_poll_interval">Poll interval (minutes)</string>
<string name="title_keep_alive_interval">Keep-alive interval (minutes)</string> <string name="title_keep_alive_interval">Keep-alive interval (minutes)</string>
<string name="title_keep_alive_noop">Restart IMAP IDLE periodically</string> <string name="title_keep_alive_noop">Restart IMAP IDLE periodically</string>

Loading…
Cancel
Save