Show explicit geofence permission status

This commit is contained in:
Artem Kokos
2026-05-15 10:32:23 +07:00
parent d796537917
commit 8b9a25e746
5 changed files with 294 additions and 1 deletions

View File

@@ -0,0 +1,13 @@
enum NotificationPermissionStatus {
enabled,
disabled,
unsupported;
static NotificationPermissionStatus fromPlatformValue(String? value) {
return switch (value) {
'enabled' => NotificationPermissionStatus.enabled,
'disabled' => NotificationPermissionStatus.disabled,
_ => NotificationPermissionStatus.unsupported,
};
}
}

View File

@@ -1,3 +1,4 @@
import 'package:flutter/services.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:geolocator/geolocator.dart';
@@ -5,6 +6,7 @@ import '../../homes/providers/homes_providers.dart';
import '../../shared/providers/core_providers.dart';
import '../models/app_theme_preset.dart';
import '../models/geofence_system_state.dart';
import '../models/notification_permission_status.dart';
final initialAppThemePresetProvider = Provider<AppThemePreset>(
(ref) => AppThemePreset.fallback,
@@ -87,3 +89,45 @@ final geofenceSystemStatusProvider = FutureProvider<GeofenceSystemState>((
hasCoordinates: currentHome?.hasCoordinates == true,
);
});
abstract class NotificationPermissionStatusService {
Future<NotificationPermissionStatus> inspect();
Future<void> openSettings();
}
class DeviceNotificationPermissionStatusService
implements NotificationPermissionStatusService {
static const _channel = MethodChannel('ignis/geofence_automation');
@override
Future<NotificationPermissionStatus> inspect() async {
try {
final value = await _channel.invokeMethod<String>(
'getNotificationPermissionStatus',
);
return NotificationPermissionStatus.fromPlatformValue(value);
} on MissingPluginException {
return NotificationPermissionStatus.unsupported;
}
}
@override
Future<void> openSettings() async {
try {
await _channel.invokeMethod<void>('openNotificationSettings');
} on MissingPluginException {
return;
}
}
}
final notificationPermissionStatusServiceProvider =
Provider<NotificationPermissionStatusService>(
(ref) => DeviceNotificationPermissionStatusService(),
);
final notificationPermissionStatusProvider =
FutureProvider<NotificationPermissionStatus>((ref) async {
return ref.watch(notificationPermissionStatusServiceProvider).inspect();
});