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

Commit cb442188 authored by Vincent Bourgmayer's avatar Vincent Bourgmayer
Browse files

refactor: replace LogoutReceiver by ReLoginWithOidcActivity which has no UI

parent aa068885
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -30,7 +30,7 @@ android {

        setProperty "archivesBaseName", "davx5-ose-" + getVersionName()

        minSdkVersion 24        // Android 7.0
        minSdkVersion 26        // Android 9.0
        targetSdkVersion 33     // Android 13

        buildConfigField "String", "userAgent", "\"AccountManager\""
@@ -155,6 +155,7 @@ configurations {
dependencies {
    implementation "org.jetbrains.kotlin:kotlin-stdlib:${versions.kotlin}"
    implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.3'
    implementation 'androidx.activity:activity:1.9.3'
    testImplementation 'org.junit.jupiter:junit-jupiter:5.8.1'
    coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:2.0.3'

+208 −239

File changed.

Preview size limit exceeded, changes collapsed.

+63 −0
Original line number Diff line number Diff line
package at.bitfire.davdroid

import android.accounts.AccountManager
import android.accounts.AccountManager.KEY_BOOLEAN_RESULT
import android.accounts.AccountManagerFuture
import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import at.bitfire.davdroid.log.Logger

class ReLoginWithOidcActivity : AppCompatActivity() {
    override fun onStart() {
        super.onStart()

        val accountName = intent?.extras?.getString(AccountManager.KEY_ACCOUNT_NAME, null) ?: return
        val accountManager = AccountManager.get(this)

        val accountRemovalCallback: (AliasFuture) -> Unit =  { future ->
            val success = future.result.getBoolean(KEY_BOOLEAN_RESULT)
            Logger.log.info("$accountName removal succeed ?  $success")
            if (success) {
                loginAccount(accountManager)
            } else {
                Logger.log.info("failed to remove account: ${accountName} ")
            }
        }


        logoutAccount(accountName, accountManager, accountRemovalCallback)


    }


    private fun logoutAccount(accountName: String,
                              accountManager: AccountManager,
                              callback : (AliasFuture) -> Unit)
    {
        val eAccounts= accountManager.getAccountsByType(applicationContext.getString(R.string.eelo_account_type))
        val activity = this

        eAccounts.first { it.name == accountName }.run {
            Logger.log.info("try to remove account: ${this.name} ") //todo remove this before merge
            accountManager.removeAccount(this, activity, callback, null)

        } ?: finish()
    }

    private fun loginAccount(accountManager: AccountManager) {
        val eAccountType = applicationContext.getString(R.string.eelo_account_type)
        val authTokenType = null

        accountManager.startAddAccountSession(eAccountType,
            authTokenType,
            arrayOf(),
            null,
            this,
            { _ -> finish() },
            null
        )
    }
}

typealias AliasFuture = AccountManagerFuture<Bundle>
 No newline at end of file
+5 −3
Original line number Diff line number Diff line
@@ -13,6 +13,7 @@ import android.content.Intent
import androidx.core.app.NotificationCompat
import androidx.core.app.NotificationManagerCompat
import at.bitfire.davdroid.R
import at.bitfire.davdroid.ReLoginWithOidcActivity
import at.bitfire.davdroid.log.Logger
import at.bitfire.davdroid.settings.AccountSettings
import at.bitfire.davdroid.syncadapter.AccountUtils
@@ -72,13 +73,14 @@ class BootCompletedReceiver: BroadcastReceiver() {
    }

    private fun generateLogoutIntent(accountName: String, context: Context): PendingIntent {
        val logoutIntent = Intent(context, LogoutReceiver::class.java).apply {
        val reloginIntent = Intent(context, ReLoginWithOidcActivity::class.java).apply {
            flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK
            putExtra(AccountManager.KEY_ACCOUNT_NAME, accountName)
        }

        return  PendingIntent.getBroadcast(context,
        return  PendingIntent.getActivity(context,
            0,
            logoutIntent,
            reloginIntent,
            PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE)
    }
}
 No newline at end of file
+0 −31
Original line number Diff line number Diff line
package at.bitfire.davdroid.receiver

import android.accounts.Account
import android.accounts.AccountManager
import android.content.BroadcastReceiver
import android.content.Context
import android.content.Intent
import at.bitfire.davdroid.R
import at.bitfire.davdroid.log.Logger

class LogoutReceiver(): BroadcastReceiver() {
    override fun onReceive(context: Context?, intent: Intent?) {
        Logger.log.info("LogoutReceiver.onReceive()")
        if (context == null) return

        val accountName = intent?.extras?.getString(AccountManager.KEY_ACCOUNT_NAME, null) ?: return

        val accountManager = AccountManager.get(context)

        val eAccounts = accountManager.getAccountsByType(context.getString(R.string.eelo_account_type))

        eAccounts.forEach {
            if (it.name == accountName) {
            // todo: https://developer.android.com/reference/android/accounts/AccountManager#removeAccount(android.accounts.Account,%20android.app.Activity,%20android.accounts.AccountManagerCallback%3Candroid.os.Bundle%3E,%20android.os.Handler)
            accountManager.removeAccount(it, null,null, null)
            }
        }

        // todo https://developer.android.com/reference/android/accounts/AccountManager#startAddAccountSession(java.lang.String,%20java.lang.String,%20java.lang.String[],%20android.os.Bundle,%20android.app.Activity,%20android.accounts.AccountManagerCallback%3Candroid.os.Bundle%3E,%20android.os.Handler)
    }
}
 No newline at end of file