From 4926c869b9865bc7046875499090d86f37615dcb Mon Sep 17 00:00:00 2001 From: Hyperling Date: Mon, 28 Sep 2026 07:58:15 -0700 Subject: [PATCH] main, use global variables for now to decide between notifications and alarms on Android, may become a setting later. --- lib/main.dart | 100 +++++++++++++++++++++++++++----------------------- 1 file changed, 55 insertions(+), 45 deletions(-) diff --git a/lib/main.dart b/lib/main.dart index 53f9458..ae81f23 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -6,6 +6,7 @@ import 'package:geolocator/geolocator.dart'; import 'package:shared_preferences/shared_preferences.dart'; import 'package:flutter_local_notifications/flutter_local_notifications.dart'; import 'package:timezone/data/latest_all.dart' as tz; +import 'package:timezone/timezone.dart' as tz; import 'package:http/http.dart' as http; import 'package:alarm/alarm.dart'; @@ -25,6 +26,9 @@ void main() async { runApp(const SunsetAlarmApp()); } +const ANDROID_USE_NOTIF = false; +const ANDROID_USE_ALARM = !ANDROID_USE_NOTIF; + class SunsetAlarmApp extends StatelessWidget { const SunsetAlarmApp({super.key}); @@ -251,52 +255,58 @@ class _HomeScreenState extends State { 'Alarm Enabled @ ${alarmTime.hour.toString().padLeft(2, '0')}:${alarmTime.minute.toString().padLeft(2, '0')} (App Must Stay Open!)', ); } else if (Platform.isAndroid) { - /*** Notifcation Method - Works *** / - // Android: use zonedSchedule (works in background) - final tzAlarm = tz.TZDateTime.from(alarmTime, tz.local); - const androidDetails = AndroidNotificationDetails( - 'sunset_alarm', - 'Sunset Alarm', - channelDescription: 'Alarm X minutes before sunset', - importance: Importance.max, - priority: Priority.high, - fullScreenIntent: true, - category: AndroidNotificationCategory.alarm, - ); - await _notifications.zonedSchedule( - id: _alarmId, - title: 'Sunset in ${_minutesBefore} min', - body: 'The sun sets at $sunsetText. Time to get ready!', - scheduledDate: tzAlarm, - notificationDetails: const NotificationDetails(android: androidDetails), - androidScheduleMode: AndroidScheduleMode.alarmClock, - ); - _showSnack('Alarm scheduled!'); - debugPrint('DEBUG: Alarm time: ${tzAlarm.toString()}'); - debugPrint('DEBUG: Current time: ${DateTime.now().toUtc().toString()}'); - debugPrint('DEBUG: ${_notifications.toString()}'); + /*** Notifcation Method - Works ***/ + if (ANDROID_USE_NOTIF) { + // Android: use zonedSchedule (works in background) + final tzAlarm = tz.TZDateTime.from(alarmTime, tz.local); + const androidDetails = AndroidNotificationDetails( + 'sunset_alarm', + 'Sunset Alarm', + channelDescription: 'Alarm X minutes before sunset', + importance: Importance.max, + priority: Priority.high, + fullScreenIntent: true, + category: AndroidNotificationCategory.alarm, + ); + await _notifications.zonedSchedule( + id: _alarmId, + title: 'Sunset in ${_minutesBefore} min', + body: 'The sun sets at $sunsetText. Time to get ready!', + scheduledDate: tzAlarm, + notificationDetails: const NotificationDetails( + android: androidDetails, + ), + androidScheduleMode: AndroidScheduleMode.alarmClock, + ); + _showSnack('Alarm scheduled!'); + debugPrint('DEBUG: Alarm time: ${tzAlarm.toString()}'); + debugPrint('DEBUG: Current time: ${DateTime.now().toUtc().toString()}'); + debugPrint('DEBUG: ${_notifications.toString()}'); + } // End Notification Method ***/ /*** Alarm Method - WIP ***/ - // Schedule: - final settings = AlarmSettings( - id: _alarmId, - dateTime: alarmTime, - //assetAudioPath: 'assets/alarm.mp3', // use default rather than custom - loopAudio: true, // keeps ringing until dismissed - vibrate: true, - androidFullScreenIntent: true, // wakes screen like clock app - volumeSettings: VolumeSettings.fade( - //volume: 0.8, // use default rather than custom - fadeDuration: Duration(seconds: 60), - ), - notificationSettings: NotificationSettings( - title: 'Sunset Alarm', - body: 'Sun is setting in ${_minutesBefore} minute(s)!', - stopButton: 'Dismiss', - ), - ); - await Alarm.set(alarmSettings: settings); + if (ANDROID_USE_ALARM) { + // Schedule: + final settings = AlarmSettings( + id: _alarmId, + dateTime: alarmTime, + //assetAudioPath: 'assets/alarm.mp3', // use default rather than custom + loopAudio: true, // keeps ringing until dismissed + vibrate: true, + androidFullScreenIntent: true, // wakes screen like clock app + volumeSettings: VolumeSettings.fade( + //volume: 0.8, // use default rather than custom + fadeDuration: Duration(seconds: 60), + ), + notificationSettings: NotificationSettings( + title: 'Sunset Alarm', + body: 'Sun is setting in ${_minutesBefore} minute(s)!', + stopButton: 'Dismiss', + ), + ); + await Alarm.set(alarmSettings: settings); + } // End Alarm Method ***/ _showSnack('Alarm Scheduled @ ${alarmTime}'); } else { @@ -313,10 +323,10 @@ class _HomeScreenState extends State { _alarmTimer?.cancel(); if (!Platform.isLinux) { // Notification Method - //await _notifications.cancel(id: _alarmId); + if (ANDROID_USE_NOTIF) await _notifications.cancel(id: _alarmId); // Alarm Method - await Alarm.stop(_alarmId); + if (ANDROID_USE_ALARM) await Alarm.stop(_alarmId); } _showSnack('Alarm Cancelled'); }