From d4f89627261aa62782c607c4d0ff87f67057d5c9 Mon Sep 17 00:00:00 2001 From: althafvly Date: Fri, 5 Sep 2025 10:28:41 +0530 Subject: [PATCH 1/3] AM: Cancel notifications for updated account --- .../davdroid/push/PushNotificationManager.kt | 15 ++++++++------- .../e/accountmanager/ui/setup/ReOAuthActivity.kt | 10 ++++++++++ 2 files changed, 18 insertions(+), 7 deletions(-) diff --git a/app/src/main/kotlin/at/bitfire/davdroid/push/PushNotificationManager.kt b/app/src/main/kotlin/at/bitfire/davdroid/push/PushNotificationManager.kt index d8e689fec..0719bebc1 100644 --- a/app/src/main/kotlin/at/bitfire/davdroid/push/PushNotificationManager.kt +++ b/app/src/main/kotlin/at/bitfire/davdroid/push/PushNotificationManager.kt @@ -23,13 +23,6 @@ class PushNotificationManager @Inject constructor( private val notificationRegistry: NotificationRegistry ) { - /** - * Generates the notification ID for a push notification. - */ - private fun notificationId(account: Account, dataType: SyncDataType): Int { - return account.name.hashCode() + account.type.hashCode() + dataType.hashCode() - } - /** * Sends a notification to inform the user that a push notification has been received, the * sync has been scheduled, but it still has not run. @@ -67,4 +60,12 @@ class PushNotificationManager @Inject constructor( .cancel(notificationId(account, dataType)) } + companion object { + /** + * Generates the notification ID for a push notification. + */ + fun notificationId(account: Account, dataType: SyncDataType): Int { + return account.name.hashCode() + account.type.hashCode() + dataType.hashCode() + } + } } diff --git a/app/src/main/kotlin/foundation/e/accountmanager/ui/setup/ReOAuthActivity.kt b/app/src/main/kotlin/foundation/e/accountmanager/ui/setup/ReOAuthActivity.kt index 8d2070fb8..a7702ce22 100644 --- a/app/src/main/kotlin/foundation/e/accountmanager/ui/setup/ReOAuthActivity.kt +++ b/app/src/main/kotlin/foundation/e/accountmanager/ui/setup/ReOAuthActivity.kt @@ -25,7 +25,10 @@ import androidx.activity.compose.setContent import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.ui.platform.LocalContext +import androidx.core.app.NotificationManagerCompat import androidx.hilt.navigation.compose.hiltViewModel +import at.bitfire.davdroid.push.PushNotificationManager +import at.bitfire.davdroid.sync.SyncDataType import at.bitfire.davdroid.ui.AppTheme import at.bitfire.davdroid.ui.account.AccountSettingsActivity import at.bitfire.davdroid.ui.account.AccountSettingsModel @@ -77,6 +80,13 @@ fun OAuthHandlerScreen( // Sync after authenticated AccountHelper.scheduleSyncWithDelay(context) + + // Cancel all notifications for this account + val notificationManager = NotificationManagerCompat.from(context) + for (dataType in SyncDataType.entries) { + val notificationId = PushNotificationManager.notificationId(account, dataType) + notificationManager.cancel(notificationId) + } } else { model.authCodeFailed() } -- GitLab From 7097c59849a703abd75ef72d2a5bc6562708d5cd Mon Sep 17 00:00:00 2001 From: althafvly Date: Fri, 5 Sep 2025 10:44:11 +0530 Subject: [PATCH 2/3] AM: unify re-OAuth flow to ensure consistent behavior --- .../ui/account/AccountSettingsScreen.kt | 18 ++++++------------ 1 file changed, 6 insertions(+), 12 deletions(-) diff --git a/app/src/main/kotlin/at/bitfire/davdroid/ui/account/AccountSettingsScreen.kt b/app/src/main/kotlin/at/bitfire/davdroid/ui/account/AccountSettingsScreen.kt index 70f7f9278..91755aa3c 100644 --- a/app/src/main/kotlin/at/bitfire/davdroid/ui/account/AccountSettingsScreen.kt +++ b/app/src/main/kotlin/at/bitfire/davdroid/ui/account/AccountSettingsScreen.kt @@ -6,8 +6,8 @@ package at.bitfire.davdroid.ui.account import android.accounts.Account import android.app.Activity +import android.content.Intent import android.security.KeyChain -import androidx.activity.compose.rememberLauncherForActivityResult import androidx.annotation.StringRes import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column @@ -69,6 +69,7 @@ import at.bitfire.davdroid.ui.composable.SettingsHeader import at.bitfire.davdroid.ui.composable.SwitchSetting import at.bitfire.davdroid.util.PermissionUtils import at.bitfire.vcard4android.GroupMethod +import foundation.e.accountmanager.ui.setup.ReOAuthActivity import kotlinx.coroutines.launch @Composable @@ -77,20 +78,13 @@ fun AccountSettingsScreen( account: Account, onNavWifiPermissionsScreen: () -> Unit ) { + val context = LocalContext.current val model = hiltViewModel { factory: AccountSettingsModel.Factory -> factory.create(account) } val uiState by model.uiState.collectAsState() val canAccessWifiSsid by PermissionUtils.rememberCanAccessWifiSsid() - // contract to open the browser for re-authentication - val authRequestContract = rememberLauncherForActivityResult(model.authorizationContract()) { authResponse -> - if (authResponse != null) - model.authenticate(authResponse) - else - model.authCodeFailed() - } - AppTheme { AccountSettingsScreen( accountName = account.name, @@ -123,9 +117,9 @@ fun AccountSettingsScreen( credentials = uiState.credentials, onUpdateCredentials = model::updateCredentials, onAuthenticateOAuth = { - val request = model.newAuthorizationRequest() - if (request != null) - authRequestContract.launch(request) + val intent = Intent(context, ReOAuthActivity::class.java) + intent.putExtra(AccountSettingsActivity.EXTRA_ACCOUNT, account) + context.startActivity(intent) }, isCredentialsUpdateAllowed = uiState.allowCredentialsChange, -- GitLab From e3300ddb182cb274ee98d9b7fc84a67114235b1c Mon Sep 17 00:00:00 2001 From: althafvly Date: Fri, 5 Sep 2025 10:45:09 +0530 Subject: [PATCH 3/3] AM: show toast after re-OAuth to notify update --- .../e/accountmanager/ui/setup/ReOAuthActivity.kt | 8 ++++++++ app/src/main/res/values/e_strings.xml | 1 + 2 files changed, 9 insertions(+) diff --git a/app/src/main/kotlin/foundation/e/accountmanager/ui/setup/ReOAuthActivity.kt b/app/src/main/kotlin/foundation/e/accountmanager/ui/setup/ReOAuthActivity.kt index a7702ce22..2dc734ddb 100644 --- a/app/src/main/kotlin/foundation/e/accountmanager/ui/setup/ReOAuthActivity.kt +++ b/app/src/main/kotlin/foundation/e/accountmanager/ui/setup/ReOAuthActivity.kt @@ -19,6 +19,7 @@ package foundation.e.accountmanager.ui.setup import android.accounts.Account import android.os.Bundle +import android.widget.Toast import androidx.activity.ComponentActivity import androidx.activity.compose.rememberLauncherForActivityResult import androidx.activity.compose.setContent @@ -27,6 +28,7 @@ import androidx.compose.runtime.LaunchedEffect import androidx.compose.ui.platform.LocalContext import androidx.core.app.NotificationManagerCompat import androidx.hilt.navigation.compose.hiltViewModel +import at.bitfire.davdroid.R import at.bitfire.davdroid.push.PushNotificationManager import at.bitfire.davdroid.sync.SyncDataType import at.bitfire.davdroid.ui.AppTheme @@ -87,6 +89,12 @@ fun OAuthHandlerScreen( val notificationId = PushNotificationManager.notificationId(account, dataType) notificationManager.cancel(notificationId) } + + Toast.makeText( + context, + context.getString(R.string.account_updated_toast), + Toast.LENGTH_SHORT + ).show() } else { model.authCodeFailed() } diff --git a/app/src/main/res/values/e_strings.xml b/app/src/main/res/values/e_strings.xml index 8e8adc980..0e3c1e2ad 100644 --- a/app/src/main/res/values/e_strings.xml +++ b/app/src/main/res/values/e_strings.xml @@ -36,4 +36,5 @@ Legacy Murena.io Authentication issue. Tap to sign in again + Account updated successfully -- GitLab