Loading app/src/main/java/at/bitfire/davdroid/ReLoginWithOidcActivity.kt +40 −25 Original line number Diff line number Diff line Loading @@ -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 Loading @@ -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() Loading @@ -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? { Loading @@ -99,6 +110,10 @@ class ReLoginWithOidcActivity : AppCompatActivity() { future.result?.getParcelable(KEY_INTENT) } } companion object { private var isAccountRemoved = false } } typealias AliasFuture = AccountManagerFuture<Bundle> Loading
app/src/main/java/at/bitfire/davdroid/ReLoginWithOidcActivity.kt +40 −25 Original line number Diff line number Diff line Loading @@ -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 Loading @@ -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() Loading @@ -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? { Loading @@ -99,6 +110,10 @@ class ReLoginWithOidcActivity : AppCompatActivity() { future.result?.getParcelable(KEY_INTENT) } } companion object { private var isAccountRemoved = false } } typealias AliasFuture = AccountManagerFuture<Bundle>