diff --git a/app/src/main/java/eu/faircode/email/ConnectionHelper.java b/app/src/main/java/eu/faircode/email/ConnectionHelper.java index 814b393b03..bcac5b0fa8 100644 --- a/app/src/main/java/eu/faircode/email/ConnectionHelper.java +++ b/app/src/main/java/eu/faircode/email/ConnectionHelper.java @@ -1,5 +1,6 @@ package eu.faircode.email; +import android.accounts.AccountsException; import android.content.Context; import android.content.SharedPreferences; import android.net.ConnectivityManager; @@ -14,12 +15,15 @@ import android.telephony.TelephonyManager; import androidx.annotation.Nullable; import androidx.preference.PreferenceManager; +import com.sun.mail.iap.ConnectionException; + import org.xbill.DNS.Lookup; import org.xbill.DNS.MXRecord; import org.xbill.DNS.Record; import org.xbill.DNS.SimpleResolver; import org.xbill.DNS.Type; +import java.io.IOException; import java.net.InetAddress; import java.net.UnknownHostException; import java.util.Arrays; @@ -277,6 +281,27 @@ public class ConnectionHelper { return true; } + static boolean isIoError(Throwable ex) { + while (ex != null) { + if (isMaxConnections(ex.getMessage()) || + ex instanceof IOException || + ex instanceof ConnectionException || + ex instanceof AccountsException || + "failed to connect".equals(ex.getMessage())) + return true; + ex = ex.getCause(); + } + return false; + } + + static boolean isMaxConnections(String message) { + return (message != null && + (message.contains("Too many simultaneous connections") /* Gmail */ || + message.contains("Maximum number of connections") /* ... from user+IP exceeded */ /* Dovecot */ || + message.contains("Too many concurrent connections") /* ... to this mailbox */ || + message.contains("User is authenticated but not connected") /* Outlook */)); + } + static boolean vpnActive(Context context) { ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); if (cm == null) diff --git a/app/src/main/java/eu/faircode/email/ServiceSynchronize.java b/app/src/main/java/eu/faircode/email/ServiceSynchronize.java index bcb39e6ac2..319ace36b5 100644 --- a/app/src/main/java/eu/faircode/email/ServiceSynchronize.java +++ b/app/src/main/java/eu/faircode/email/ServiceSynchronize.java @@ -19,7 +19,6 @@ package eu.faircode.email; Copyright 2018-2020 by Marcel Bokhorst (M66B) */ -import android.accounts.AccountsException; import android.app.AlarmManager; import android.app.NotificationManager; import android.app.PendingIntent; @@ -49,11 +48,9 @@ import androidx.lifecycle.MutableLiveData; import androidx.lifecycle.Observer; import androidx.preference.PreferenceManager; -import com.sun.mail.iap.ConnectionException; import com.sun.mail.imap.IMAPFolder; import com.sun.mail.imap.IMAPStore; -import java.io.IOException; import java.text.DateFormat; import java.util.ArrayList; import java.util.Arrays; @@ -858,7 +855,7 @@ public class ServiceSynchronize extends ServiceBase implements SharedPreferences EntityLog.log(ServiceSynchronize.this, account.name + " alert: " + message); - if (!isMaxConnections(message)) + if (!ConnectionHelper.isMaxConnections(message)) try { NotificationManager nm = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); nm.notify("alert:" + account.id, 1, @@ -885,21 +882,7 @@ public class ServiceSynchronize extends ServiceBase implements SharedPreferences } catch (Throwable ex) { // Immediately report auth errors if (ex instanceof AuthenticationFailedException) { - boolean ioError = false; - Throwable c = ex; - while (c != null) { - if (isMaxConnections(c.getMessage()) || - c instanceof IOException || - c instanceof ConnectionException || - c instanceof AccountsException || - "failed to connect".equals(ex.getMessage())) { - ioError = true; - break; - } - c = c.getCause(); - } - - if (!ioError) { + if (!ConnectionHelper.isIoError(ex)) { Log.e(ex); try { NotificationManager nm = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); @@ -1578,14 +1561,6 @@ public class ServiceSynchronize extends ServiceBase implements SharedPreferences } } - private boolean isMaxConnections(String message) { - return (message != null && - (message.contains("Too many simultaneous connections") /* Gmail */ || - message.contains("Maximum number of connections") /* ... from user+IP exceeded */ /* Dovecot */ || - message.contains("Too many concurrent connections") /* ... to this mailbox */ || - message.contains("User is authenticated but not connected") /* Outlook */)); - } - private void optimizeAccount(Context context, EntityAccount account, String reason) { SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); boolean auto_optimize = prefs.getBoolean("auto_optimize", false);