Added account option for IMAP IDLE restart

pull/209/head
M66B 3 years ago
parent d51ffd7972
commit 1b382c3fcc

File diff suppressed because it is too large Load Diff

@ -72,7 +72,7 @@ import io.requery.android.database.sqlite.SQLiteDatabase;
// https://developer.android.com/topic/libraries/architecture/room.html
@Database(
version = 242,
version = 243,
entities = {
EntityIdentity.class,
EntityAccount.class,
@ -2450,13 +2450,20 @@ public abstract class DB extends RoomDatabase {
db.execSQL("DROP VIEW `folder_view`");
db.execSQL("CREATE VIEW IF NOT EXISTS `folder_view` AS " + TupleFolderView.query);
}
}).addMigrations(new Migration(241, 242) {
@Override
public void migrate(@NonNull SupportSQLiteDatabase db) {
logMigration(startVersion, endVersion);
db.execSQL("ALTER TABLE `account` ADD COLUMN `unicode` INTEGER NOT NULL DEFAULT 0");
}
}).addMigrations(new Migration(242, 243) {
@Override
public void migrate(@NonNull SupportSQLiteDatabase db) {
logMigration(startVersion, endVersion);
db.execSQL("ALTER TABLE `account` ADD COLUMN `keep_alive_noop` INTEGER NOT NULL DEFAULT 0");
db.execSQL("UPDATE account SET keep_alive_noop = 1" +
" WHERE host = 'outlook.office365.com' AND pop = " + EntityAccount.TYPE_IMAP);
}
}).addMigrations(new Migration(998, 999) {
@Override
public void migrate(@NonNull SupportSQLiteDatabase db) {

@ -84,6 +84,7 @@ public class EmailProvider implements Parcelable {
public int order;
public String type;
public int keepalive;
public boolean noop;
public boolean partial;
public boolean useip;
public boolean appPassword;
@ -236,6 +237,7 @@ public class EmailProvider implements Parcelable {
provider.order = getAttributeIntValue(xml, "order", Integer.MAX_VALUE);
provider.keepalive = getAttributeIntValue(xml, "keepalive", 0);
provider.noop = getAttributeBooleanValue(xml, "noop", false);
provider.partial = getAttributeBooleanValue(xml, "partial", true);
provider.useip = getAttributeBooleanValue(xml, "useip", true);
provider.appPassword = getAttributeBooleanValue(xml, "appPassword", false);

@ -130,6 +130,8 @@ public class EntityAccount extends EntityOrder implements Serializable {
@NonNull
public Integer poll_interval = DEFAULT_KEEP_ALIVE_INTERVAL;
@NonNull
public Boolean keep_alive_noop = false;
@NonNull
public Boolean keep_alive_ok = false;
@NonNull
public Integer keep_alive_failed = 0;

@ -122,6 +122,7 @@ public class FragmentAccount extends FragmentBase {
private CheckBox cbBrowse;
private CheckBox cbAutoSeen;
private EditText etInterval;
private CheckBox cbNoop;
private CheckBox cbPartialFetch;
private CheckBox cbIgnoreSize;
private RadioGroup rgDate;
@ -233,6 +234,7 @@ public class FragmentAccount extends FragmentBase {
cbBrowse = view.findViewById(R.id.cbBrowse);
cbAutoSeen = view.findViewById(R.id.cbAutoSeen);
etInterval = view.findViewById(R.id.etInterval);
cbNoop = view.findViewById(R.id.cbNoop);
cbPartialFetch = view.findViewById(R.id.cbPartialFetch);
cbIgnoreSize = view.findViewById(R.id.cbIgnoreSize);
rgDate = view.findViewById(R.id.rgDate);
@ -313,6 +315,7 @@ public class FragmentAccount extends FragmentBase {
etName.setText(position > 1 ? provider.name : null);
etInterval.setText(provider.keepalive > 0 ? Integer.toString(provider.keepalive) : null);
cbNoop.setChecked(provider.noop);
cbPartialFetch.setChecked(provider.partial);
tvSentWarning.setVisibility(View.GONE);
@ -899,6 +902,7 @@ public class FragmentAccount extends FragmentBase {
args.putBoolean("browse", cbBrowse.isChecked());
args.putBoolean("auto_seen", cbAutoSeen.isChecked());
args.putString("interval", etInterval.getText().toString());
args.putBoolean("noop", cbNoop.isChecked());
args.putBoolean("partial_fetch", cbPartialFetch.isChecked());
args.putBoolean("ignore_size", cbIgnoreSize.isChecked());
args.putBoolean("use_date", rgDate.getCheckedRadioButtonId() == R.id.radio_date_header);
@ -971,6 +975,7 @@ public class FragmentAccount extends FragmentBase {
boolean browse = args.getBoolean("browse");
boolean auto_seen = args.getBoolean("auto_seen");
String interval = args.getString("interval");
boolean noop = args.getBoolean("noop");
boolean partial_fetch = args.getBoolean("partial_fetch");
boolean ignore_size = args.getBoolean("ignore_size");
boolean use_date = args.getBoolean("use_date");
@ -1075,6 +1080,8 @@ public class FragmentAccount extends FragmentBase {
return true;
if (!Objects.equals(account.poll_interval, poll_interval))
return true;
if (!Objects.equals(account.keep_alive_noop, noop))
return true;
if (!Objects.equals(account.partial_fetch, partial_fetch))
return true;
if (!Objects.equals(account.ignore_size, ignore_size))
@ -1222,7 +1229,7 @@ public class FragmentAccount extends FragmentBase {
account.keep_alive_succeeded = 0;
}
account.poll_interval = Math.max(1, poll_interval);
account.keep_alive_noop = noop;
account.partial_fetch = partial_fetch;
account.ignore_size = ignore_size;
account.use_date = use_date;
@ -1588,6 +1595,7 @@ public class FragmentAccount extends FragmentBase {
cbBrowse.setChecked(account == null ? true : account.browse);
cbAutoSeen.setChecked(account == null ? true : account.auto_seen);
etInterval.setText(account == null ? "" : Long.toString(account.poll_interval));
cbNoop.setChecked(account == null ? true : account.keep_alive_noop);
cbPartialFetch.setChecked(account == null ? true : account.partial_fetch);
cbIgnoreSize.setChecked(account == null ? false : account.ignore_size);
cbUnicode.setChecked(account == null ? false : account.unicode);

@ -863,6 +863,7 @@ public class FragmentOAuth extends FragmentBase {
if (provider.keepalive > 0)
account.poll_interval = provider.keepalive;
account.keep_alive_noop = provider.noop;
account.partial_fetch = provider.partial;

@ -535,6 +535,7 @@ public class FragmentQuickSetup extends FragmentBase {
if (provider.keepalive > 0)
account.poll_interval = provider.keepalive;
account.keep_alive_noop = provider.noop;
account.partial_fetch = provider.partial;

@ -1518,7 +1518,7 @@ public class ServiceSynchronize extends ServiceBase implements SharedPreferences
if (account.protocol != EntityAccount.TYPE_IMAP)
iservice.setLeaveOnServer(account.leave_on_server);
if ("outlook.office365.com".equalsIgnoreCase(account.host)) {
if (account.keep_alive_noop) {
int timeout = prefs.getInt("timeout", EmailService.DEFAULT_CONNECT_TIMEOUT);
iservice.setRestartIdleInterval(timeout * 2 * 6); // 20 x 2 x 6 = 4 min
}

@ -611,6 +611,25 @@
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/etInterval" />
<CheckBox
android:id="@+id/cbNoop"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="12dp"
android:text="@string/title_keep_alive_noop"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/tvIntervalRemark" />
<TextView
android:id="@+id/tvNoopRemark"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/title_account_noop_hint"
android:textAppearance="@style/TextAppearance.AppCompat.Small"
android:textStyle="italic"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/cbNoop" />
<CheckBox
android:id="@+id/cbPartialFetch"
android:layout_width="wrap_content"
@ -618,7 +637,7 @@
android:layout_marginTop="12dp"
android:text="@string/title_partial_fetch"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/tvIntervalRemark" />
app:layout_constraintTop_toBottomOf="@id/tvNoopRemark" />
<TextView
android:id="@+id/tvPartialFetchRemark"
@ -1094,7 +1113,7 @@
cbSynchronize,cbIgnoreSchedule,cbOnDemand,tvLeave,cbPrimary,
cbBrowse,tvBrowseHint,
cbAutoSeen,
tvInterval,etInterval,tvIntervalRemark,
tvInterval,etInterval,tvIntervalRemark,cbNoop,tvNoopRemark,
cbPartialFetch,tvPartialFetchRemark,cbIgnoreSize,rgDate,tvDateRemark,
cbUnicode,cbUnmeteredOnly" />

@ -975,6 +975,7 @@
<string name="title_account_category">Category</string>
<string name="title_account_name_hint">Used to differentiate folders</string>
<string name="title_account_interval_hint">Frequency of refreshing the connection for push messages or frequency of checking for new messages</string>
<string name="title_account_noop_hint">This will refresh the connection more actively, but also use more battery power</string>
<string name="title_account_partial_fetch_hint">Disable this only in case of empty messages or corrupt attachments</string>
<string name="title_color">Color</string>
<string name="title_background">Background</string>
@ -1020,6 +1021,7 @@
<string name="title_max_messages">Maximum number of messages to download (blank for all)</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_noop">Restart IMAP IDLE periodically</string>
<string name="title_partial_fetch" translatable="false">Partial fetch</string>
<string name="title_ignore_size" translatable="false">Ignore bodystructure size</string>
<string name="title_server_time">Use received time (server)</string>

@ -44,6 +44,7 @@
name="Outlook"
domain="outlook\\..*"
link="https://github.com/M66B/FairEmail/blob/master/FAQ.md#user-content-faq14"
noop="true"
order="2"
partial="false"
useip="false">
@ -60,6 +61,7 @@
name="Live"
domain="live\\..*"
link="https://github.com/M66B/FairEmail/blob/master/FAQ.md#user-content-faq14"
noop="true"
order="3"
partial="false"
useip="false">
@ -76,6 +78,7 @@
name="Hotmail"
domain="hotmail\\..*"
link="https://github.com/M66B/FairEmail/blob/master/FAQ.md#user-content-faq14"
noop="true"
order="4"
partial="false"
useip="false">
@ -106,6 +109,7 @@
description="Outlook/Office 365"
id="office365"
link="https://github.com/M66B/FairEmail/blob/master/FAQ.md#user-content-faq14"
noop="true"
order="5"
partial="false"
useip="false">
@ -142,6 +146,7 @@
description="Outlook"
id="outlook"
link="https://github.com/M66B/FairEmail/blob/master/FAQ.md#user-content-faq14"
noop="true"
order="5"
partial="false"
useip="false">

Loading…
Cancel
Save