@@ -4,6 +4,7 @@ import 'package:on_time_front/core/di/di_setup.dart';
44import 'package:on_time_front/core/logging/app_logger.dart' ;
55import 'package:on_time_front/core/services/alarm_scheduler_service.dart' ;
66import 'package:on_time_front/core/services/fallback_alarm_notification_service.dart' ;
7+ import 'package:on_time_front/domain/entities/alarm_delivery_policy.dart' ;
78import 'package:on_time_front/domain/entities/alarm_entities.dart' ;
89import 'package:on_time_front/domain/repositories/alarm_repository.dart' ;
910import 'package:on_time_front/domain/use-cases/cancel_all_alarms_use_case.dart' ;
@@ -45,14 +46,14 @@ class AlarmGateCubit extends Cubit<AlarmGateState> {
4546 bool enableAlarmsOnGrant = false ,
4647 }) async {
4748 final capabilities = await _alarmSchedulerService.getCapabilities ();
48- final permission = await _checkEffectivePermission (capabilities);
49- if (permission == AlarmPermissionState .unsupported ) {
49+ final delivery = await _checkDeliveryPolicy (capabilities);
50+ if (delivery.policy.isUnsupported ) {
5051 emit (const AlarmGateState .unsupported ());
5152 return ;
5253 }
5354
5455 final prefs = await SharedPreferences .getInstance ();
55- if (permission == AlarmPermissionState .granted ) {
56+ if (delivery.policy.canDeliver ) {
5657 await prefs.remove (_dismissedKey);
5758 if (enableAlarmsOnGrant) {
5859 await _enableAlarmsBestEffort ();
@@ -62,7 +63,7 @@ class AlarmGateCubit extends Cubit<AlarmGateState> {
6263 }
6364
6465 if (disableAlarmsWhenPermissionMissing &&
65- ! await _hasGrantedFallbackPermission (capabilities) ) {
66+ delivery.policy.shouldDisableAlarms ) {
6667 await _disableAlarmsBestEffort ();
6768 }
6869
@@ -76,57 +77,58 @@ class AlarmGateCubit extends Cubit<AlarmGateState> {
7677
7778 Future <AlarmPermissionState > requestPermission () async {
7879 final capabilities = await _alarmSchedulerService.getCapabilities ();
79- final permission = await _requestEffectivePermission (capabilities);
80- if (permission == AlarmPermissionState .unsupported) {
80+ final delivery = await _requestDeliveryPolicy (capabilities);
81+ final permission = delivery.permissionState;
82+ if (delivery.policy.isUnsupported) {
8183 emit (const AlarmGateState .unsupported ());
8284 return permission;
8385 }
8486
85- if (permission == AlarmPermissionState .granted ) {
87+ if (delivery.policy.canDeliver ) {
8688 final prefs = await SharedPreferences .getInstance ();
8789 await prefs.remove (_dismissedKey);
8890 await _enableAlarmsBestEffort ();
8991 emit (const AlarmGateState .allowed ());
9092 return permission;
9193 }
9294
93- if (! await _hasGrantedFallbackPermission (capabilities) ) {
95+ if (delivery.policy.shouldDisableAlarms ) {
9496 await _disableAlarmsBestEffort ();
9597 }
9698 emit (const AlarmGateState .required ());
9799 return permission;
98100 }
99101
100- Future <AlarmPermissionState > _checkEffectivePermission (
102+ Future <_EvaluatedAlarmDelivery > _checkDeliveryPolicy (
101103 AlarmSchedulerCapabilities capabilities,
102104 ) async {
103105 final nativePermission = await _checkNativePermission (capabilities);
104- if (nativePermission == AlarmPermissionState .granted) {
105- return nativePermission;
106- }
107-
108- if (nativePermission == AlarmPermissionState .unsupported) {
109- return _checkFallbackPermission (capabilities);
110- }
111- return nativePermission;
106+ final fallbackPermission = await _checkFallbackPermission (capabilities);
107+ return _EvaluatedAlarmDelivery (
108+ policy: AlarmDeliveryPolicy .evaluate (
109+ capabilities: capabilities,
110+ nativePermission: nativePermission,
111+ fallbackPermission: fallbackPermission,
112+ ),
113+ nativePermission: nativePermission,
114+ fallbackPermission: fallbackPermission,
115+ );
112116 }
113117
114- Future <AlarmPermissionState > _requestEffectivePermission (
118+ Future <_EvaluatedAlarmDelivery > _requestDeliveryPolicy (
115119 AlarmSchedulerCapabilities capabilities,
116120 ) async {
117121 final nativePermission = await _requestNativePermission (capabilities);
118- if (nativePermission == AlarmPermissionState .granted) {
119- return nativePermission;
120- }
121-
122- if (nativePermission == AlarmPermissionState .unsupported) {
123- return _requestFallbackPermission (capabilities);
124- }
125122 final fallbackPermission = await _requestFallbackPermission (capabilities);
126- if (fallbackPermission == AlarmPermissionState .granted) {
127- return fallbackPermission;
128- }
129- return nativePermission;
123+ return _EvaluatedAlarmDelivery (
124+ policy: AlarmDeliveryPolicy .evaluate (
125+ capabilities: capabilities,
126+ nativePermission: nativePermission,
127+ fallbackPermission: fallbackPermission,
128+ ),
129+ nativePermission: nativePermission,
130+ fallbackPermission: fallbackPermission,
131+ );
130132 }
131133
132134 Future <AlarmPermissionState > _checkNativePermission (
@@ -171,7 +173,8 @@ class AlarmGateCubit extends Cubit<AlarmGateState> {
171173 final prefs = await SharedPreferences .getInstance ();
172174 await prefs.setBool (_dismissedKey, true );
173175 final capabilities = await _alarmSchedulerService.getCapabilities ();
174- if (! await _hasGrantedFallbackPermission (capabilities)) {
176+ final delivery = await _checkDeliveryPolicy (capabilities);
177+ if (delivery.policy.shouldDisableAlarms) {
175178 await _disableAlarmsBestEffort ();
176179 }
177180 emit (const AlarmGateState .dismissed ());
@@ -183,13 +186,6 @@ class AlarmGateCubit extends Cubit<AlarmGateState> {
183186 capabilities.nativeAlarmProvider == AlarmProvider .iosAlarmKit;
184187 }
185188
186- Future <bool > _hasGrantedFallbackPermission (
187- AlarmSchedulerCapabilities capabilities,
188- ) async {
189- return await _checkFallbackPermission (capabilities) ==
190- AlarmPermissionState .granted;
191- }
192-
193189 Future <void > _enableAlarmsBestEffort () async {
194190 try {
195191 await _alarmRepository.updateAlarmSettings (alarmsEnabled: true );
@@ -212,3 +208,25 @@ class AlarmGateCubit extends Cubit<AlarmGateState> {
212208 }
213209 }
214210}
211+
212+ class _EvaluatedAlarmDelivery {
213+ const _EvaluatedAlarmDelivery ({
214+ required this .policy,
215+ required this .nativePermission,
216+ required this .fallbackPermission,
217+ });
218+
219+ final AlarmDeliveryPolicy policy;
220+ final AlarmPermissionState nativePermission;
221+ final AlarmPermissionState fallbackPermission;
222+
223+ AlarmPermissionState get permissionState {
224+ if (policy.canDeliver) return AlarmPermissionState .granted;
225+ if (policy.isUnsupported) return AlarmPermissionState .unsupported;
226+ if (policy.blockingPermissionIssue ==
227+ AlarmPermissionIssue .notificationPermissionDenied) {
228+ return fallbackPermission;
229+ }
230+ return nativePermission;
231+ }
232+ }
0 commit comments