diff --git a/l10n/intl_en.arb b/l10n/intl_en.arb index 756eee974..538834452 100644 --- a/l10n/intl_en.arb +++ b/l10n/intl_en.arb @@ -87,8 +87,10 @@ "calendar_export_question": "Which calendar do you want to export to?", "calendar_name": "Calendar name", "calendar_select": "Please select a calendar", - "calendar_cancel": "Cancel", - "calendar_export": "Export", + "calendar_cancel_button": "Cancel", + "calendar_export_button": "Export", + "calendar_permission_denied_modal_title": "Permission denied", + "calendar_permission_denied": "You denied the app the permission to edit your calendar. Change this preference in system settings to use this feature.", "grades_title": "Grades", "grades_msg_no_grades": "No grade available\nPull to refresh", diff --git a/l10n/intl_fr.arb b/l10n/intl_fr.arb index 2ad726e09..ac0052ca8 100644 --- a/l10n/intl_fr.arb +++ b/l10n/intl_fr.arb @@ -87,8 +87,10 @@ "calendar_export_question": "Vers quel calendrier voulez-vous exporter cet événement?", "calendar_name": "Nom du calendrier", "calendar_select": "Veuillez sélectionner un calendrier", - "calendar_cancel": "Annuler", - "calendar_export": "Exporter", + "calendar_cancel_button": "Annuler", + "calendar_export_button": "Exporter", + "calendar_permission_denied_modal_title": "Permission Refusée", + "calendar_permission_denied": "Vous n'avez pas accordé la permission d'accéder à votre calendrier. Veuillez l'activer dans les paramètres système de l'application.", "grades_title": "Notes", "grades_msg_no_grades": "Aucune note disponible.\nTirez pour rafraichir", diff --git a/lib/features/schedule/widgets/calendar_selector.dart b/lib/features/schedule/widgets/calendar_selector.dart index 6a4e28d1e..953d1df34 100644 --- a/lib/features/schedule/widgets/calendar_selector.dart +++ b/lib/features/schedule/widgets/calendar_selector.dart @@ -25,6 +25,9 @@ class CalendarSelectionWidget extends StatelessWidget { future: CalendarUtils.nativeCalendars, builder: (context, AsyncSnapshot> calendars) { + if (calendars.error != null) { + return lackingPermissionsDialog(context); + } if (!calendars.hasData) { return const Center( child: CircularProgressIndicator(), @@ -81,7 +84,7 @@ class CalendarSelectionWidget extends StatelessWidget { actions: [ TextButton( onPressed: () => Navigator.of(context).pop(), - child: const Text('Cancel'), + child: Text(translations.calendar_cancel_button), ), TextButton( onPressed: () { @@ -119,7 +122,7 @@ class CalendarSelectionWidget extends StatelessWidget { } }); }, - child: const Text('Export'), + child: Text(translations.calendar_export_button), ), ], ); @@ -128,4 +131,19 @@ class CalendarSelectionWidget extends StatelessWidget { }, ); } + + AlertDialog lackingPermissionsDialog(BuildContext context) { + return AlertDialog( + title: Text(translations.calendar_permission_denied_modal_title), + content: Text(translations.calendar_permission_denied), + actions: [ + TextButton( + child: Text(translations.calendar_cancel_button), + onPressed: () { + Navigator.of(context).pop(); + }, + ), + ], + ); + } } diff --git a/lib/utils/calendar_utils.dart b/lib/utils/calendar_utils.dart index d4d395bc1..2789f8534 100644 --- a/lib/utils/calendar_utils.dart +++ b/lib/utils/calendar_utils.dart @@ -41,9 +41,13 @@ mixin CalendarUtils { DeviceCalendarPlugin(); static Future> get nativeCalendars async { - final Result> calendarFetchResult = - await DeviceCalendarPlugin().retrieveCalendars(); - return calendarFetchResult.data!; + if (await checkPermissions()) { + final Result> calendarFetchResult = + await DeviceCalendarPlugin().retrieveCalendars(); + return calendarFetchResult.data!; + } + // User denied calendar access + throw Error(); } /// Fetches a calendar by name from the native calendar app diff --git a/pubspec.yaml b/pubspec.yaml index 3139a79b6..47c5309b0 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -5,7 +5,7 @@ description: The 4th generation of ÉTSMobile, the main gateway between the Éco # pub.dev using `pub publish`. This is preferred for private packages. publish_to: 'none' # Remove this line if you wish to publish to pub.dev -version: 4.45.0+1 +version: 4.46.0+1 environment: sdk: '>=3.3.0 <4.0.0'