initializeNotifications method

Future<NotificationInitResult> initializeNotifications()

Initialize notifications manually.

Use this when AppConfigBase.fcmAutoInitialize is false and you want to trigger notification setup at a specific point in your app flow.

This method:

  1. Checks if FCM is enabled in configuration
  2. Requests notification permissions from the user
  3. Initializes FCM token management if permission is granted

Returns a NotificationInitResult indicating the outcome:

Example:

// After onboarding or at the right moment
final result = await notificationService.initializeNotifications();
if (result == NotificationInitResult.success) {
  showSnackbar('Notifications enabled!');
}

Implementation

Future<NotificationInitResult> initializeNotifications() async {
  if (!AppConfigBase.useFCM) {
    logd('initializeNotifications: FCM is disabled in AppConfigBase');
    return NotificationInitResult.fcmDisabledConfig;
  }

  if (_hasFcmTokenInitialized) {
    logd('initializeNotifications: Already initialized');
    return NotificationInitResult.alreadyInitialized;
  }

  try {
    // Get status before request to detect blocked requests
    final statusBefore = await getPermissionStatus();

    // Request permission
    final permissionResult = await requestPermissions();

    // Check for blocked request (status unchanged from notDetermined)
    if (statusBefore == NotificationPermissionStatus.notDetermined &&
        permissionResult == NotificationPermissionStatus.notDetermined) {
      logw('Permission request may have been blocked by system');
      return NotificationInitResult.permissionRequestBlocked;
    }

    if (permissionResult == NotificationPermissionStatus.authorized ||
        permissionResult == NotificationPermissionStatus.provisional) {
      // Permission granted - initialize FCM token if callback is set
      if (_onTokenChanged != null) {
        await initializeFcmToken(onTokenChanged: _onTokenChanged!);
      }
      logi('Notifications initialized successfully');
      return NotificationInitResult.success;
    } else if (permissionResult == NotificationPermissionStatus.denied) {
      // Check if this is a permanent denial
      final canPrompt = await _permissionHelper.canPromptForPermission();
      if (!canPrompt) {
        return NotificationInitResult.permissionPermanentlyDenied;
      }
      return NotificationInitResult.permissionDenied;
    } else {
      return NotificationInitResult.permissionPermanentlyDenied;
    }
  } catch (e, stackTrace) {
    loge(e, 'initializeNotifications failed', stackTrace);
    _onError?.call('initializeNotifications failed: $e', stackTrace);
    return NotificationInitResult.error;
  }
}