diff --git a/app/src/main/java/app/pachli/usecase/LogoutUsecase.kt b/app/src/main/java/app/pachli/usecase/LogoutUsecase.kt index bd4483ab9..fc0dae630 100644 --- a/app/src/main/java/app/pachli/usecase/LogoutUsecase.kt +++ b/app/src/main/java/app/pachli/usecase/LogoutUsecase.kt @@ -14,6 +14,7 @@ import app.pachli.core.network.retrofit.MastodonApi import app.pachli.util.removeShortcut import dagger.hilt.android.qualifiers.ApplicationContext import javax.inject.Inject +import timber.log.Timber class LogoutUsecase @Inject constructor( @ApplicationContext private val context: Context, @@ -37,11 +38,15 @@ class LogoutUsecase @Inject constructor( val clientId = activeAccount.clientId val clientSecret = activeAccount.clientSecret if (clientId != null && clientSecret != null) { - api.revokeOAuthToken( - clientId = clientId, - clientSecret = clientSecret, - token = activeAccount.accessToken, - ) + try { + api.revokeOAuthToken( + clientId = clientId, + clientSecret = clientSecret, + token = activeAccount.accessToken, + ) + } catch (e: Exception) { + Timber.e(e, "Could not revoke OAuth token, continuing") + } } // disable push notifications diff --git a/core/accounts/src/main/kotlin/app/pachli/core/accounts/AccountManager.kt b/core/accounts/src/main/kotlin/app/pachli/core/accounts/AccountManager.kt index 02dabce97..76ccf94e3 100644 --- a/core/accounts/src/main/kotlin/app/pachli/core/accounts/AccountManager.kt +++ b/core/accounts/src/main/kotlin/app/pachli/core/accounts/AccountManager.kt @@ -130,10 +130,25 @@ class AccountManager @Inject constructor( * @param account the account to save */ fun saveAccount(account: AccountEntity) { - if (account.id != 0L) { - Timber.d("saveAccount: saving account with id %d", account.id) - accountDao.insertOrReplace(account) + if (account.id == 0L) { + Timber.e("Trying to save account with ID = 0, ignoring") + return } + + // Work around saveAccount() being called after account deletion + // For example: + // - Have two accounts, A and B, signed in with A, looking at home timeline for A + // - Log out of A. This triggers deletion of account A from the database + // - Shortly afterwards the timeline activity/fragment ends, and it tries to save + // the visible ID back to the database, which creates the AccountEntity record + // that was just deleted, but in a partial state. + if (accounts.find { it.id == account.id } == null) { + Timber.e("Trying to save account with ID = %d which does not exist, ignoring", account.id) + return + } + + Timber.d("saveAccount: saving account with id %d", account.id) + accountDao.insertOrReplace(account) } /**