diff --git a/app/core/src/main/java/com/fsck/k9/backend/BackendManager.kt b/app/core/src/main/java/com/fsck/k9/backend/BackendManager.kt index 061084c591c6e08bd68f2fa8b68ce7bdece0bc90..25a1090177b4ff72a5ca4f5513e646b875d1bf80 100644 --- a/app/core/src/main/java/com/fsck/k9/backend/BackendManager.kt +++ b/app/core/src/main/java/com/fsck/k9/backend/BackendManager.kt @@ -3,20 +3,22 @@ package com.fsck.k9.backend import com.fsck.k9.Account import com.fsck.k9.backend.api.Backend import com.fsck.k9.mail.ServerSettings +import java.lang.Exception import java.util.concurrent.CopyOnWriteArraySet +import timber.log.Timber class BackendManager(private val backendFactories: Map) { private val backendCache = mutableMapOf() private val listeners = CopyOnWriteArraySet() - fun getBackend(account: Account): Backend { + fun getBackend(account: Account): Backend? { val newBackend = synchronized(backendCache) { val container = backendCache[account.uuid] if (container != null && isBackendStillValid(container, account)) { return container.backend } - createBackend(account).also { backend -> + createBackend(account)?.also { backend -> backendCache[account.uuid] = BackendContainer( backend, account.incomingServerSettings, @@ -43,10 +45,15 @@ class BackendManager(private val backendFactories: Map) notifyListeners(account) } - private fun createBackend(account: Account): Backend { - val serverType = account.incomingServerSettings.type - val backendFactory = backendFactories[serverType] ?: error("Unsupported account type") - return backendFactory.createBackend(account) + private fun createBackend(account: Account): Backend? { + return try { + val serverType = account.incomingServerSettings.type + val backendFactory = backendFactories[serverType] ?: error("Unsupported account type") + backendFactory.createBackend(account) + } catch (e: Exception) { + Timber.e(e) + null + } } fun addListener(listener: BackendChangedListener) { diff --git a/app/core/src/main/java/com/fsck/k9/controller/push/AccountPushController.kt b/app/core/src/main/java/com/fsck/k9/controller/push/AccountPushController.kt index c735c20bc6787ac251b3db3b37785739cc8f3d39..b47eba89a645c5c6e09aaadda009d44c2fc972c8 100644 --- a/app/core/src/main/java/com/fsck/k9/controller/push/AccountPushController.kt +++ b/app/core/src/main/java/com/fsck/k9/controller/push/AccountPushController.kt @@ -63,8 +63,8 @@ internal class AccountPushController( private fun startBackendPusher() { val backend = backendManager.getBackend(account) - backendPusher = backend.createPusher(backendPusherCallback).also { backendPusher -> - backendPusher.start() + backendPusher = backend?.createPusher(backendPusherCallback).also { backendPusher -> + backendPusher?.start() } } diff --git a/app/core/src/main/java/com/fsck/k9/controller/push/PushController.kt b/app/core/src/main/java/com/fsck/k9/controller/push/PushController.kt index 2917900576103a13298f387414681fc5d945a1c0..9edc8b295cb760b942413cf2b3ce39cece3d19d3 100644 --- a/app/core/src/main/java/com/fsck/k9/controller/push/PushController.kt +++ b/app/core/src/main/java/com/fsck/k9/controller/push/PushController.kt @@ -211,7 +211,7 @@ class PushController internal constructor( private fun getPushAccounts(): List { return preferences.accounts.filter { account -> - account.folderPushMode != FolderMode.NONE && backendManager.getBackend(account).isPushCapable + account.folderPushMode != FolderMode.NONE && backendManager.getBackend(account)?.isPushCapable ?: false } } private fun setPushNotificationState(notificationState: PushNotificationState) { diff --git a/app/ui/legacy/src/main/java/com/fsck/k9/activity/MessageList.kt b/app/ui/legacy/src/main/java/com/fsck/k9/activity/MessageList.kt index ec96a46b60e483c6311c1efb267225595d0d3f4d..f0223fbaffd1a3720dbe2e939504fe6015ea461b 100644 --- a/app/ui/legacy/src/main/java/com/fsck/k9/activity/MessageList.kt +++ b/app/ui/legacy/src/main/java/com/fsck/k9/activity/MessageList.kt @@ -1687,7 +1687,7 @@ open class MessageList : } if (!accountIsSignedIn) { val password: String = accountManager.getPassword(eeloAccount) - EeloAccountCreator.createAccount(this, emailId, password) + EeloAccountCreator.createAccount(this, emailId, password, false) accountWasAdded = true } } @@ -1707,7 +1707,7 @@ open class MessageList : } } if (!accountIsSignedIn) { - EeloAccountCreator.createAccount(this, emailId, "") + EeloAccountCreator.createAccount(this, emailId, "", true) accountWasAdded = true } } diff --git a/app/ui/legacy/src/main/java/com/fsck/k9/activity/setup/accountmanager/EeloAccountCreator.java b/app/ui/legacy/src/main/java/com/fsck/k9/activity/setup/accountmanager/EeloAccountCreator.java index b05af6f10d13605e50e3cc9df82031a9a9167a3a..25f1fbcf30d2aab53a133d0cf2053944f6ad5a69 100644 --- a/app/ui/legacy/src/main/java/com/fsck/k9/activity/setup/accountmanager/EeloAccountCreator.java +++ b/app/ui/legacy/src/main/java/com/fsck/k9/activity/setup/accountmanager/EeloAccountCreator.java @@ -13,8 +13,11 @@ import com.fsck.k9.autodiscovery.api.DiscoveredServerSettings; import com.fsck.k9.autodiscovery.api.DiscoveryResults; import com.fsck.k9.autodiscovery.api.DiscoveryTarget; import com.fsck.k9.autodiscovery.providersxml.ProvidersXmlDiscovery; +import com.fsck.k9.mail.AuthType; +import com.fsck.k9.mail.ConnectionSecurity; import com.fsck.k9.mail.ServerSettings; import com.fsck.k9.mailstore.SpecialLocalFoldersCreator; +import com.fsck.k9.preferences.Protocols; import com.fsck.k9.ui.ConnectionSettings; import timber.log.Timber; @@ -24,7 +27,7 @@ public class EeloAccountCreator { private static final AccountCreator accountCreator = DI.get(AccountCreator.class); private static final SpecialLocalFoldersCreator localFoldersCreator = DI.get(SpecialLocalFoldersCreator.class); - public static void createAccount(Context context, String emailId, String password) { + public static void createAccount(Context context, String emailId, String password, boolean isGoogleAccount) { Preferences preferences = Preferences.getPreferences(context); Account account = preferences.newAccount(); @@ -37,6 +40,12 @@ public class EeloAccountCreator { // connection details not predefined in the xml. Try to load from the api connectionSettings = EeloMailAutoConfigDiscovery.retrieveConfigFromApi(emailId); } + // providers.xml doesn't have the connection details & can't retrieve details from api + // & it is google account, meaning custom domain for google account is used. + // In this case, provide default gmail configuration. + if (connectionSettings == null && isGoogleAccount) { + connectionSettings = providersDefaultGoogleAccountDiscover(emailId); + } if (connectionSettings == null) { Timber.e("Error while trying to initialise account configuration."); return; @@ -88,5 +97,30 @@ public class EeloAccountCreator { ) ); } + + private static ConnectionSettings providersDefaultGoogleAccountDiscover(String email) { + return new ConnectionSettings( + new ServerSettings( + Protocols.IMAP, + "imap.gmail.com", + 993, + ConnectionSecurity.SSL_TLS_REQUIRED, + AuthType.XOAUTH2, + email, + null, + null + ), + new ServerSettings( + Protocols.SMTP, + "smtp.gmail.com", + 465, + ConnectionSecurity.SSL_TLS_REQUIRED, + AuthType.XOAUTH2, + email, + null, + null + ) + ); + } } diff --git a/app/ui/legacy/src/main/java/com/fsck/k9/activity/setup/accountmanager/EeloMailAutoConfigDiscovery.java b/app/ui/legacy/src/main/java/com/fsck/k9/activity/setup/accountmanager/EeloMailAutoConfigDiscovery.java index 9c914cbe9945d3451640590632b4ca4102755a23..91c8e4aae1808052f4dfd669e87d8ac6b28c5a6b 100644 --- a/app/ui/legacy/src/main/java/com/fsck/k9/activity/setup/accountmanager/EeloMailAutoConfigDiscovery.java +++ b/app/ui/legacy/src/main/java/com/fsck/k9/activity/setup/accountmanager/EeloMailAutoConfigDiscovery.java @@ -1,8 +1,6 @@ package com.fsck.k9.activity.setup.accountmanager; -import java.io.IOException; - import com.fsck.k9.autodiscovery.api.DiscoveredServerSettings; import com.fsck.k9.helper.EmailHelper; import com.fsck.k9.helper.Utility; @@ -48,7 +46,7 @@ public class EeloMailAutoConfigDiscovery { EeloMailAutoConfigResponse eeloMailAutoConfigResponse = response.body(); return providersAutoConfigDiscoveryDiscover(eeloMailAutoConfigResponse); } - } catch (IOException e) { + } catch (Exception e) { Timber.e(e); } return null;