Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 6b5fdade authored by Mathew Smith's avatar Mathew Smith Committed by Romain Hunault
Browse files

Import e accounts from account manager

parent 9903349d
Loading
Loading
Loading
Loading
+7 −1
Original line number Diff line number Diff line
<?xml version="1.0" encoding="utf-8"?>
<manifest package="com.fsck.k9.ui" />
<manifest package="com.fsck.k9.ui"
    xmlns:android="http://schemas.android.com/apk/res/android">

    <uses-permission android:name="android.permission.AUTHENTICATE_ACCOUNTS" />
    <uses-permission android:name="android.permission.MANAGE_ACCOUNTS" />
    <uses-permission android:name="android.permission.GET_ACCOUNTS" />
</manifest>
+75 −1
Original line number Diff line number Diff line
package com.fsck.k9.activity

import android.accounts.AccountManager
import android.annotation.SuppressLint
import android.app.SearchManager
import android.content.Context
@@ -32,10 +33,15 @@ import com.fsck.k9.Preferences
import com.fsck.k9.account.BackgroundAccountRemover
import com.fsck.k9.activity.compose.MessageActions
import com.fsck.k9.activity.setup.AccountSetupBasics
import com.fsck.k9.activity.setup.accountmanager.AccountManagerConstants.ACCOUNT_EMAIL_ADDRESS_KEY
import com.fsck.k9.activity.setup.accountmanager.AccountManagerConstants.EELO_ACCOUNT_TYPE
import com.fsck.k9.activity.setup.accountmanager.AccountManagerConstants.GOOGLE_ACCOUNT_TYPE
import com.fsck.k9.activity.setup.accountmanager.EeloAccountCreator
import com.fsck.k9.controller.MessageReference
import com.fsck.k9.fragment.MessageListFragment
import com.fsck.k9.fragment.MessageListFragment.MessageListFragmentListener
import com.fsck.k9.helper.Contacts
import com.fsck.k9.helper.EmailHelper
import com.fsck.k9.helper.ParcelableUtil
import com.fsck.k9.mailstore.SearchStatusManager
import com.fsck.k9.mailstore.StorageManager
@@ -130,11 +136,22 @@ open class MessageList :
    private var viewSwitcher: ViewSwitcher? = null
    private lateinit var recentChangesSnackbar: Snackbar

    private lateinit var accountManager: AccountManager

    public override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        val accounts = preferences.accounts
        var accounts = preferences.accounts
        deleteIncompleteAccounts(accounts)

        accountManager = AccountManager.get(this)

// TODO remove old accounts automatically
        if (addNewAccountsAutomatically(accounts)) {
            accounts = preferences.accounts
        }


        val hasAccountSetup = accounts.any { it.isFinishedSetup }
        if (!hasAccountSetup) {
            AccountSetupBasics.actionNewAccount(this)
@@ -1602,6 +1619,63 @@ open class MessageList :
        val noThreading: Boolean = false
    )

    private fun addNewAccountsAutomatically(accounts: List<Account>): Boolean {
        return try {
            val eeloAccounts: Array<android.accounts.Account> = getEeloAccountsOnDevice()
            val googleAccounts: Array<android.accounts.Account> = getGoogleAccountsOnDevice()
            var accountWasAdded = false
            for (eeloAccount in eeloAccounts) {
                val emailId: String = accountManager.getUserData(eeloAccount, ACCOUNT_EMAIL_ADDRESS_KEY)
                if (!emailId.contains("@")) continue
                var accountIsSignedIn = false
                for (account in accounts) {
                    if (emailId == account.email) {
                        accountIsSignedIn = true
                        break
                    }
                }
                if (!accountIsSignedIn) {
                    val password: String = accountManager.getPassword(eeloAccount)
                    EeloAccountCreator.createAccount(this, emailId, password)
                    accountWasAdded = true
                }
            }
//            for (googleAccount in googleAccounts) {
//                val emailId: String = accountManager.getUserData(
//                    googleAccount,
//                    ACCOUNT_EMAIL_ADDRESS_KEY
//                )
//                var accountIsSignedIn = false
//                for (account in accounts) {
//                    if (emailId == account.email) {
//                        if (account.name == null) { // we need to fix an old bug
//                            account.name = emailId
//                            account.save(Preferences.getPreferences(this))
//                        }
//                        accountIsSignedIn = true
//                        break
//                    }
//                }
//                if (!accountIsSignedIn) {
//                    GoogleAccountCreator.createAccount(this, emailId)
//                    accountWasAdded = true
//                }
//            }
            accountWasAdded
        } catch (e: SecurityException) {
            e.printStackTrace()
            false
        }
    }

    private fun getEeloAccountsOnDevice(): Array<android.accounts.Account> {
        return accountManager.getAccountsByType(EELO_ACCOUNT_TYPE)
    }

    private fun getGoogleAccountsOnDevice(): Array<android.accounts.Account> {
        return accountManager.getAccountsByType(GOOGLE_ACCOUNT_TYPE)
    }

    companion object : KoinComponent {
        private const val EXTRA_SEARCH = "search_bytes"
        private const val EXTRA_NO_THREADING = "no_threading"
+8 −0
Original line number Diff line number Diff line
package com.fsck.k9.activity.setup.accountmanager

object AccountManagerConstants {
    const val EELO_ACCOUNT_TYPE = "e.foundation.webdav.eelo"
    const val GOOGLE_ACCOUNT_TYPE = "e.foundation.webdav.google"
    const val ACCOUNT_EMAIL_ADDRESS_KEY = "email_address"
    const val MAIL_CONTENT_AUTHORITY = "foundation.e.mail.provider.AppContentProvider"
}
 No newline at end of file
+84 −0
Original line number Diff line number Diff line
package com.fsck.k9.activity.setup.accountmanager;


import android.content.Context;

import com.fsck.k9.Account;
import com.fsck.k9.Account.DeletePolicy;
import com.fsck.k9.Core;
import com.fsck.k9.DI;
import com.fsck.k9.Preferences;
import com.fsck.k9.account.AccountCreator;
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.ServerSettings;
import com.fsck.k9.ui.ConnectionSettings;
import timber.log.Timber;


public class EeloAccountCreator {
    private static final ProvidersXmlDiscovery providersXmlDiscovery = DI.get(ProvidersXmlDiscovery.class);
    private static final AccountCreator accountCreator = DI.get(AccountCreator.class);

    public static void createAccount(Context context, String emailId, String password) {
        Preferences preferences = Preferences.getPreferences(context);

        Account account = preferences.newAccount();
        account.setEmail(emailId);
        account.setDescription(emailId);

        ConnectionSettings connectionSettings = providersXmlDiscoveryDiscover(emailId);
        if (connectionSettings == null) {
            Timber.e("Error while trying to initialise account configuration.");
            return;
        }
        ServerSettings incomingSettings = connectionSettings.getIncoming();
        incomingSettings.newPassword(password);
        ServerSettings outgoingSettings = connectionSettings.getOutgoing();
        outgoingSettings.newPassword(password);
        account.setIncomingServerSettings(incomingSettings);
        account.setOutgoingServerSettings(outgoingSettings);

        DeletePolicy deletePolicy = accountCreator.getDefaultDeletePolicy(incomingSettings.type);
        account.setDeletePolicy(deletePolicy);

        preferences.saveAccount(account);
        Core.setServicesEnabled(context);
    }

    private static ConnectionSettings providersXmlDiscoveryDiscover(String email) {
        DiscoveryResults discoveryResults =
                providersXmlDiscovery.discover(email, DiscoveryTarget.INCOMING_AND_OUTGOING);
        if (discoveryResults == null ||
                (discoveryResults.getIncoming().size() < 1 || discoveryResults.getOutgoing().size() < 1)) {
            return null;
        }
        DiscoveredServerSettings incoming = discoveryResults.getIncoming().get(0);
        DiscoveredServerSettings outgoing = discoveryResults.getOutgoing().get(0);
        return new ConnectionSettings(
                new ServerSettings(
                        incoming.getProtocol(),
                        incoming.getHost(),
                        incoming.getPort(),
                        incoming.getSecurity(),
                        incoming.getAuthType(),
                        incoming.getUsername(),
                        null,
                        null
                ),
                new ServerSettings(
                        outgoing.getProtocol(),
                        outgoing.getHost(),
                        outgoing.getPort(),
                        outgoing.getSecurity(),
                        outgoing.getAuthType(),
                        outgoing.getUsername(),
                        null,
                        null
                )
        );
    }
}