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

Commit 5f680480 authored by Vincent Bourgmayer's avatar Vincent Bourgmayer
Browse files

refactor: rewrite ReLoginWithOidcActivity

parent ba200223
Loading
Loading
Loading
Loading
Loading
+40 −25
Original line number Diff line number Diff line
@@ -4,6 +4,7 @@

package at.bitfire.davdroid

import android.accounts.Account
import android.accounts.AccountManager
import android.accounts.AccountManager.KEY_ACCOUNT_NAME
import android.accounts.AccountManager.KEY_BOOLEAN_RESULT
@@ -19,6 +20,15 @@ import at.bitfire.davdroid.log.Logger

class ReLoginWithOidcActivity : AppCompatActivity() {

    private lateinit var eAccountType: String
    private lateinit var accountManager: AccountManager


    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        eAccountType = applicationContext.getString(R.string.eelo_account_type)
        accountManager = AccountManager.get(this)
    }

    override fun onStart() {
        super.onStart()
@@ -29,67 +39,68 @@ class ReLoginWithOidcActivity : AppCompatActivity() {
            return
        }

        logoutAccount(accountName)
        val account = getAccount(accountName)

        if (isAccountRemoved && account == null) {
            Logger.log.info("Vincent: call loginAccount()")
            loginAccount(eAccountType)
        } else if (!isAccountRemoved && account != null) {
            Logger.log.info("Vincent: call logoutAccount()")
            logoutAccount(account)
        } else {
            finish()
        }
    }

    private fun logoutAccount(accountName: String)
    {
        val accountManager = AccountManager.get(this)
        val eAccountType = applicationContext.getString(R.string.eelo_account_type)
    private fun getAccount(accountName: String) : Account? {
        val eAccounts = accountManager.getAccountsByType(eAccountType)
        return eAccounts.firstOrNull { it.name == accountName  }
    }


    private fun logoutAccount(account: Account)
    {
        val callback: (AliasFuture) -> Unit =  { future ->
            val success = future.result.getBoolean(KEY_BOOLEAN_RESULT)

            if (success) {
                isAccountRemoved = true
                Logger.log.info("Vincent: Account removed. Now will sign in again with OIDC")
                loginAccount(eAccountType)
            } else {
                Logger.log.info("failed to remove account: $accountName")
                Logger.log.info("failed to remove /e/OS account")
                Handler(Looper.getMainLooper()).post {
                    finish()
                }
            }
        }

        val activity = this

        eAccounts.firstOrNull() {
            it.name == accountName
        } ?.run {
        try {
            Logger.log.info("Vincent: about to call accountManager.removeAccount")
            accountManager.removeAccount(this, activity, callback, null)
        } ?: finish()
            accountManager.removeAccount(account, this, callback, null)
        } catch (exception: Exception) {
            Logger.log.warning("Cannot remove account: ${account.name} : ${exception.message}")
        }
    }

    private fun loginAccount(accountType: String) {
        val accountManager = AccountManager.get(this)

        val callback: (AliasFuture) -> Unit = { future ->
            val intent = getIntentFromFuture(future)
            Logger.log.info("Vincent: callback for login account. About to start intent(is null ?: ${intent == null})")
            intent?.let(::startActivity)
            Logger.log.info("Vincent: callback for login account. Intent started. About to finish ${this.javaClass}")

            Handler(Looper.getMainLooper()).post {
                finish()
            }
        }

        try {
            accountManager.addAccount(
                accountType,
                null,
                null,
                null,
                null,
                { future -> callback(future)},
                null
            )
            accountManager.addAccount(accountType,null, null, null, null, callback, null)
        } catch (exception: Exception) {
            Logger.log.warning("${exception.javaClass}: can't add account: ${exception.message}")
            finish()
        }

    }

    private fun getIntentFromFuture(future: AliasFuture): Intent? {
@@ -99,6 +110,10 @@ class ReLoginWithOidcActivity : AppCompatActivity() {
            future.result?.getParcelable(KEY_INTENT)
        }
    }

    companion object {
        private var isAccountRemoved = false
    }
}

typealias AliasFuture = AccountManagerFuture<Bundle>