From 539a630f77e1c99bde724cc98c4e64af98a36274 Mon Sep 17 00:00:00 2001 From: kashaf-ansari-dev Date: Mon, 13 Jul 2026 18:07:40 +0500 Subject: [PATCH] mobile: improve reminder permission settings flow on Android Signed-off-by: kashaf-ansari-dev --- apps/mobile/app/services/notifications.ts | 76 +++++++++++++---------- 1 file changed, 43 insertions(+), 33 deletions(-) diff --git a/apps/mobile/app/services/notifications.ts b/apps/mobile/app/services/notifications.ts index 85d7e414d..73ffa8e45 100644 --- a/apps/mobile/app/services/notifications.ts +++ b/apps/mobile/app/services/notifications.ts @@ -587,7 +587,7 @@ function openSettingsDialog(context: string) { Platform.OS === "ios" ? undefined : async () => { - return checkAndRequestPermissions(false); + resolve(true); }, onClose: () => { resolve(false); @@ -625,56 +625,66 @@ async function checkAndRequestPermissions( ): Promise { let permissionStatus = await notifee.getNotificationSettings(); if (Platform.OS === "android") { - if ( - permissionStatus.authorizationStatus === AuthorizationStatus.AUTHORIZED && - permissionStatus.android.alarm === 1 - ) + const hasNotificationPermission = + permissionStatus.authorizationStatus === AuthorizationStatus.AUTHORIZED; + const hasAlarmPermission = permissionStatus.android.alarm === 1; + + if (hasNotificationPermission && hasAlarmPermission) { return true; + } + if (permissionStatus.authorizationStatus === AuthorizationStatus.DENIED) { permissionStatus = await notifee.requestPermission(); } + + // Wait for user to return from exact alarm settings if (permissionStatus.android.alarm !== 1) { + const waitForAppFocus = waitForAppFocusAfterSettings(); + await notifee.openAlarmPermissionSettings(); + await waitForAppFocus; } permissionStatus = await notifee.getNotificationSettings(); - if ( + const authorized = permissionStatus.authorizationStatus === AuthorizationStatus.AUTHORIZED && - permissionStatus.android.alarm === 1 - ) + permissionStatus.android.alarm === 1; + + if (authorized) { return true; - - if (promptUser) { - const waitForAppFocus = waitForAppFocusAfterSettings(); - await notifee.openNotificationSettings(); - await waitForAppFocus; - permissionStatus = await notifee.getNotificationSettings(); - - const authorized = - permissionStatus.authorizationStatus === - AuthorizationStatus.AUTHORIZED && - permissionStatus.android.alarm === 1; - - if (authorized) { - eSendEvent(eCloseSimpleDialog); - return authorized; - } else { - return await openSettingsDialog("local"); - } } - return false; - } else { - permissionStatus = await notifee.requestPermission(); - if (permissionStatus.authorizationStatus === AuthorizationStatus.AUTHORIZED) - return true; if (promptUser) { - openSettingsDialog("local"); + const openSettings = await openSettingsDialog("local"); + if (openSettings) { + const waitForAppFocus = waitForAppFocusAfterSettings(); + await notifee.openNotificationSettings(); + await waitForAppFocus; + permissionStatus = await notifee.getNotificationSettings(); + const finalAuthorized = + permissionStatus.authorizationStatus === + AuthorizationStatus.AUTHORIZED && + permissionStatus.android.alarm === 1; + if (finalAuthorized) { + eSendEvent(eCloseSimpleDialog); + return true; + } + } + return false; } return false; } -} + // iOS + permissionStatus = await notifee.requestPermission(); + if (permissionStatus.authorizationStatus === AuthorizationStatus.AUTHORIZED) { + return true; + } + if (promptUser) { + await openSettingsDialog("local"); + } + return false; +} async function getTriggers( reminder: Reminder ): Promise<(Trigger & { id: string })[] | undefined> {