checkPermissionStatus method

  1. @override
Future<String> checkPermissionStatus(
  1. String permission
)
override

Check status of a specific permission

Implementation

@override
Future<String> checkPermissionStatus(String permission) async {
  try {
    debugPrint('Checking permission status for: $permission');

    // Special handling for storage on newer Android versions
    if (permission == 'android.permission.READ_EXTERNAL_STORAGE' ||
        permission == 'android.permission.WRITE_EXTERNAL_STORAGE') {
      if (Platform.isAndroid) {
        try {
          final androidVersion = await methodChannel.invokeMethod<int>(
            'getAndroidVersion',
          );
          if (androidVersion != null && androidVersion >= 30) {
            // For Android 11+, check whether we have modern storage access
            final hasAccess = await methodChannel.invokeMethod<bool>(
              'hasModernStorageAccess',
            );
            return hasAccess == true ? 'GRANTED' : 'DENIED';
          }
        } catch (e) {
          debugPrint('Error checking modern storage access: $e');
        }
      }
    }

    // Special handling for alarm permission
    if (permission == 'android.permission.SET_ALARM') {
      if (Platform.isAndroid) {
        try {
          final androidVersion = await methodChannel.invokeMethod<int>(
            'getAndroidVersion',
          );
          if (androidVersion != null && androidVersion >= 31) {
            // For Android 12+, check if we can schedule exact alarms
            final canSchedule = await methodChannel.invokeMethod<bool>(
              'canScheduleExactAlarms',
            );
            return canSchedule == true ? 'GRANTED' : 'DENIED';
          }
        } catch (e) {
          debugPrint('Error checking alarm permission: $e');
        }
      } else if (Platform.isIOS) {
        // On iOS, check notification permission instead
        return await checkPermissionStatus('ios.permission.NOTIFICATIONS');
      }
    }

    // Handle platform-specific permission names
    String platformPermission = permission;
    if (Platform.isIOS && permission.startsWith('android.')) {
      // Map Android permission to iOS equivalent if needed
      switch (permission) {
        case 'android.permission.READ_PHONE_STATE':
          return 'NOT_SUPPORTED';
        // Add other mappings as needed
      }
    }

    final result = await methodChannel.invokeMethod<String>(
      'checkPermissionStatus',
      {'permission': platformPermission},
    );
    debugPrint('Permission status result: $result');
    return result ?? 'DENIED';
  } on PlatformException catch (e) {
    debugPrint('Error checking permission status: ${e.message}');
    if (e.code == 'PERMISSION_NOT_FOUND') {
      return 'NOT_SUPPORTED';
    }
    return 'ERROR';
  }
}