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

Commit d8778969 authored by Ricki Hirner's avatar Ricki Hirner
Browse files

Catch DB errors while renaming account

parent 5f5da468
Loading
Loading
Loading
Loading
+1 −42
Original line number Diff line number Diff line
@@ -12,16 +12,10 @@ import android.app.Service
import android.content.Context
import android.content.Intent
import android.os.Bundle
import androidx.annotation.WorkerThread
import at.bitfire.davdroid.R
import at.bitfire.davdroid.log.Logger
import at.bitfire.davdroid.model.AppDatabase
import at.bitfire.davdroid.resource.LocalAddressBook
import at.bitfire.davdroid.ui.setup.LoginActivity
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import java.util.logging.Level


/**
@@ -32,41 +26,6 @@ import java.util.logging.Level
 */
class AccountAuthenticatorService: Service(), OnAccountsUpdateListener {

    companion object {

        @WorkerThread
        @Synchronized
        fun cleanupAccounts(context: Context) {
            Logger.log.info("Cleaning up orphaned accounts")

            val accountManager = AccountManager.get(context)
            val accountNames = accountManager.getAccountsByType(context.getString(R.string.account_type))
                    .map { it.name }

            // delete orphaned address book accounts
            accountManager.getAccountsByType(context.getString(R.string.account_type_address_book))
                    .map { LocalAddressBook(context, it, null) }
                    .forEach {
                        try {
                            if (!accountNames.contains(it.mainAccount.name))
                                it.delete()
                        } catch(e: Exception) {
                            Logger.log.log(Level.SEVERE, "Couldn't delete address book account", e)
                        }
                    }

            // delete orphaned services in DB
            val db = AppDatabase.getInstance(context)
            val serviceDao = db.serviceDao()
            if (accountNames.isEmpty())
                serviceDao.deleteAll()
            else
                serviceDao.deleteExceptAccounts(accountNames.toTypedArray())
        }

    }


    private lateinit var accountManager: AccountManager
    private lateinit var accountAuthenticator: AccountAuthenticator

@@ -88,7 +47,7 @@ class AccountAuthenticatorService: Service(), OnAccountsUpdateListener {

    override fun onAccountsUpdated(accounts: Array<out Account>?) {
        CoroutineScope(Dispatchers.Default).launch {
            cleanupAccounts(this@AccountAuthenticatorService)
            AccountUtils.cleanupAccounts(this@AccountAuthenticatorService)
        }
    }

+35 −0
Original line number Diff line number Diff line
@@ -4,10 +4,45 @@ import android.accounts.Account
import android.accounts.AccountManager
import android.content.Context
import android.os.Bundle
import androidx.annotation.AnyThread
import at.bitfire.davdroid.R
import at.bitfire.davdroid.log.Logger
import at.bitfire.davdroid.model.AppDatabase
import at.bitfire.davdroid.resource.LocalAddressBook
import java.util.logging.Level

object AccountUtils {

    @AnyThread
    @Synchronized
    fun cleanupAccounts(context: Context) {
        Logger.log.info("Cleaning up orphaned accounts")

        val accountManager = AccountManager.get(context)
        val accountNames = accountManager.getAccountsByType(context.getString(R.string.account_type))
            .map { it.name }

        // delete orphaned address book accounts
        accountManager.getAccountsByType(context.getString(R.string.account_type_address_book))
            .map { LocalAddressBook(context, it, null) }
            .forEach {
                try {
                    if (!accountNames.contains(it.mainAccount.name))
                        it.delete()
                } catch(e: Exception) {
                    Logger.log.log(Level.SEVERE, "Couldn't delete address book account", e)
                }
            }

        // delete orphaned services in DB
        val db = AppDatabase.getInstance(context)
        val serviceDao = db.serviceDao()
        if (accountNames.isEmpty())
            serviceDao.deleteAll()
        else
            serviceDao.deleteExceptAccounts(accountNames.toTypedArray())
    }

    /**
     * Creates an account and makes sure the user data are set correctly.
     *
+7 −1
Original line number Diff line number Diff line
@@ -145,7 +145,13 @@ class RenameAccountFragment: DialogFragment() {

            // update account name references in database
            val db = AppDatabase.getInstance(context)
            try {
                db.serviceDao().renameAccount(oldAccount.name, newName)
            } catch (e: Exception) {
                Toast.makeText(context, R.string.account_rename_couldnt_rename, Toast.LENGTH_LONG).show()
                Logger.log.log(Level.SEVERE, "Couldn't update service DB", e)
                return
            }

            // update main account of address book accounts
            if (ContextCompat.checkSelfPermission(context, Manifest.permission.WRITE_CONTACTS) == PackageManager.PERMISSION_GRANTED)