requestPermission method

Future<PermissionStatus> requestPermission()

Requests notification permission outside of the initial login flow.

Returns PermissionStatus from permission_handler so the UI has full control over what to show the user:

Implementation

Future<PermissionStatus> requestPermission() async {
  final PermissionStatus status = await Permission.notification.status;

  _logger.info('[Notifications] requestPermission — current status: ${status.name}');

  if (status.isGranted) {
    if (!_initialized) await initNotifications();
    return PermissionStatus.granted;
  }

  // iOS 14+: partial grant — notifications work with limitations, treat as granted.
  if (status.isLimited) {
    _logger.info('[Notifications] Permission limited (iOS 14+) — treating as granted.');
    if (!_initialized) await initNotifications();
    return PermissionStatus.limited;
  }

  // Device policy (parental controls/MDM) blocks notifications — user cannot change this.
  // Opening settings will not help, so we return early without prompting.
  if (status.isRestricted) {
    _logger.info('[Notifications] Permission restricted by device policy.');
    return PermissionStatus.restricted;
  }

  if (status.isPermanentlyDenied) {
    _logger.info('[Notifications] Permission permanently denied.');
    return PermissionStatus.permanentlyDenied;
  }

  // Status is denied — show the system prompt again.
  final PermissionStatus result = await Permission.notification.request();

  _logger.info('[Notifications] Re-request result: ${result.name}');

  if (result.isGranted) {
    await initNotifications();
    return PermissionStatus.granted;
  }

  if (result.isLimited) {
    _logger.info('[Notifications] Permission limited (iOS 14+) after request — treating as granted.');
    await initNotifications();
    return PermissionStatus.limited;
  }

  if (result.isRestricted) {
    _logger.info('[Notifications] Permission restricted by device policy after request.');
    return PermissionStatus.restricted;
  }

  if (result.isPermanentlyDenied) {
    _logger.info('[Notifications] Permission permanently denied after re-request.');
    return PermissionStatus.permanentlyDenied;
  }

  return PermissionStatus.denied;
}