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 d8e689fece43d08f96b52f98e00565823ab77af9..0719bebc13b03caa98924b5c015260265afdac36 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/at/bitfire/davdroid/ui/account/AccountSettingsScreen.kt b/app/src/main/kotlin/at/bitfire/davdroid/ui/account/AccountSettingsScreen.kt index 70f7f9278ac21f75c2ba5e317b3453ceec7e4a59..91755aa3ce30bbd75133334999a3ab13ae9a2d6e 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, 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 8d2070fb80606423db2d9654ba2f83b96a774a1b..2dc734ddb6cda429bd7f34c960bc1308159e7a8b 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,13 +19,18 @@ 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 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.R +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 +82,19 @@ 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) + } + + 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 8e8adc9808ad89e8242c4ae5d23b033d4e3882e2..0e3c1e2add9c1e92f03f6477e3b00a817e69740d 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