1.0.0 #2

Merged
me merged 26 commits from dev into main 2026-09-28 10:50:03 -07:00
Showing only changes of commit 4926c869b9 - Show all commits
+55 -45
View File
@@ -6,6 +6,7 @@ import 'package:geolocator/geolocator.dart';
import 'package:shared_preferences/shared_preferences.dart'; import 'package:shared_preferences/shared_preferences.dart';
import 'package:flutter_local_notifications/flutter_local_notifications.dart'; import 'package:flutter_local_notifications/flutter_local_notifications.dart';
import 'package:timezone/data/latest_all.dart' as tz; 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:http/http.dart' as http;
import 'package:alarm/alarm.dart'; import 'package:alarm/alarm.dart';
@@ -25,6 +26,9 @@ void main() async {
runApp(const SunsetAlarmApp()); runApp(const SunsetAlarmApp());
} }
const ANDROID_USE_NOTIF = false;
const ANDROID_USE_ALARM = !ANDROID_USE_NOTIF;
class SunsetAlarmApp extends StatelessWidget { class SunsetAlarmApp extends StatelessWidget {
const SunsetAlarmApp({super.key}); const SunsetAlarmApp({super.key});
@@ -251,52 +255,58 @@ class _HomeScreenState extends State<HomeScreen> {
'Alarm Enabled @ ${alarmTime.hour.toString().padLeft(2, '0')}:${alarmTime.minute.toString().padLeft(2, '0')} (App Must Stay Open!)', 'Alarm Enabled @ ${alarmTime.hour.toString().padLeft(2, '0')}:${alarmTime.minute.toString().padLeft(2, '0')} (App Must Stay Open!)',
); );
} else if (Platform.isAndroid) { } else if (Platform.isAndroid) {
/*** Notifcation Method - Works *** / /*** Notifcation Method - Works ***/
// Android: use zonedSchedule (works in background) if (ANDROID_USE_NOTIF) {
final tzAlarm = tz.TZDateTime.from(alarmTime, tz.local); // Android: use zonedSchedule (works in background)
const androidDetails = AndroidNotificationDetails( final tzAlarm = tz.TZDateTime.from(alarmTime, tz.local);
'sunset_alarm', const androidDetails = AndroidNotificationDetails(
'Sunset Alarm', 'sunset_alarm',
channelDescription: 'Alarm X minutes before sunset', 'Sunset Alarm',
importance: Importance.max, channelDescription: 'Alarm X minutes before sunset',
priority: Priority.high, importance: Importance.max,
fullScreenIntent: true, priority: Priority.high,
category: AndroidNotificationCategory.alarm, fullScreenIntent: true,
); category: AndroidNotificationCategory.alarm,
await _notifications.zonedSchedule( );
id: _alarmId, await _notifications.zonedSchedule(
title: 'Sunset in ${_minutesBefore} min', id: _alarmId,
body: 'The sun sets at $sunsetText. Time to get ready!', title: 'Sunset in ${_minutesBefore} min',
scheduledDate: tzAlarm, body: 'The sun sets at $sunsetText. Time to get ready!',
notificationDetails: const NotificationDetails(android: androidDetails), scheduledDate: tzAlarm,
androidScheduleMode: AndroidScheduleMode.alarmClock, notificationDetails: const NotificationDetails(
); android: androidDetails,
_showSnack('Alarm scheduled!'); ),
debugPrint('DEBUG: Alarm time: ${tzAlarm.toString()}'); androidScheduleMode: AndroidScheduleMode.alarmClock,
debugPrint('DEBUG: Current time: ${DateTime.now().toUtc().toString()}'); );
debugPrint('DEBUG: ${_notifications.toString()}'); _showSnack('Alarm scheduled!');
debugPrint('DEBUG: Alarm time: ${tzAlarm.toString()}');
debugPrint('DEBUG: Current time: ${DateTime.now().toUtc().toString()}');
debugPrint('DEBUG: ${_notifications.toString()}');
}
// End Notification Method ***/ // End Notification Method ***/
/*** Alarm Method - WIP ***/ /*** Alarm Method - WIP ***/
// Schedule: if (ANDROID_USE_ALARM) {
final settings = AlarmSettings( // Schedule:
id: _alarmId, final settings = AlarmSettings(
dateTime: alarmTime, id: _alarmId,
//assetAudioPath: 'assets/alarm.mp3', // use default rather than custom dateTime: alarmTime,
loopAudio: true, // keeps ringing until dismissed //assetAudioPath: 'assets/alarm.mp3', // use default rather than custom
vibrate: true, loopAudio: true, // keeps ringing until dismissed
androidFullScreenIntent: true, // wakes screen like clock app vibrate: true,
volumeSettings: VolumeSettings.fade( androidFullScreenIntent: true, // wakes screen like clock app
//volume: 0.8, // use default rather than custom volumeSettings: VolumeSettings.fade(
fadeDuration: Duration(seconds: 60), //volume: 0.8, // use default rather than custom
), fadeDuration: Duration(seconds: 60),
notificationSettings: NotificationSettings( ),
title: 'Sunset Alarm', notificationSettings: NotificationSettings(
body: 'Sun is setting in ${_minutesBefore} minute(s)!', title: 'Sunset Alarm',
stopButton: 'Dismiss', body: 'Sun is setting in ${_minutesBefore} minute(s)!',
), stopButton: 'Dismiss',
); ),
await Alarm.set(alarmSettings: settings); );
await Alarm.set(alarmSettings: settings);
}
// End Alarm Method ***/ // End Alarm Method ***/
_showSnack('Alarm Scheduled @ ${alarmTime}'); _showSnack('Alarm Scheduled @ ${alarmTime}');
} else { } else {
@@ -313,10 +323,10 @@ class _HomeScreenState extends State<HomeScreen> {
_alarmTimer?.cancel(); _alarmTimer?.cancel();
if (!Platform.isLinux) { if (!Platform.isLinux) {
// Notification Method // Notification Method
//await _notifications.cancel(id: _alarmId); if (ANDROID_USE_NOTIF) await _notifications.cancel(id: _alarmId);
// Alarm Method // Alarm Method
await Alarm.stop(_alarmId); if (ANDROID_USE_ALARM) await Alarm.stop(_alarmId);
} }
_showSnack('Alarm Cancelled'); _showSnack('Alarm Cancelled');
} }