diff --git a/lib/app/data/providers/secure_storage_provider.dart b/lib/app/data/providers/secure_storage_provider.dart index 24592e8d..3e8ea00f 100644 --- a/lib/app/data/providers/secure_storage_provider.dart +++ b/lib/app/data/providers/secure_storage_provider.dart @@ -111,6 +111,9 @@ class SecureStorageProvider { Future read24HoursEnabled({required String key}) async { return await _secureStorage.read(key: key) == 'true'; } + Future readFlipToSnooze({required String key}) async { + return await _secureStorage.read(key: key) == 'true'; + } Future write24HoursEnabled({ required String key, diff --git a/lib/app/modules/alarmRing/controllers/alarm_ring_controller.dart b/lib/app/modules/alarmRing/controllers/alarm_ring_controller.dart index bfea9389..73e4b0c0 100644 --- a/lib/app/modules/alarmRing/controllers/alarm_ring_controller.dart +++ b/lib/app/modules/alarmRing/controllers/alarm_ring_controller.dart @@ -20,6 +20,7 @@ import 'package:ultimate_alarm_clock/app/utils/audio_utils.dart'; import 'package:ultimate_alarm_clock/app/utils/utils.dart'; import 'package:vibration/vibration.dart'; +import 'package:sensors_plus/sensors_plus.dart'; import '../../home/controllers/home_controller.dart'; @@ -33,6 +34,7 @@ class AlarmControlController extends GetxController { RxInt minutes = 1.obs; RxInt seconds = 0.obs; RxBool showButton = false.obs; + StreamSubscription? _sensorSubscription; HomeController homeController = Get.find(); SettingsController settingsController = Get.find(); RxBool get is24HourFormat => settingsController.is24HrsEnabled; @@ -47,15 +49,18 @@ class AlarmControlController extends GetxController { late Timer guardianTimer; RxInt guardianCoundown = 120.obs; + + + getNextAlarm() async { UserModel? _userModel = await SecureStorageProvider().retrieveUserModel(); AlarmModel _alarmRecord = homeController.genFakeAlarmModel(); AlarmModel isarLatestAlarm = - await IsarDb.getLatestAlarm(_alarmRecord, true); + await IsarDb.getLatestAlarm(_alarmRecord, true); AlarmModel firestoreLatestAlarm = - await FirestoreDb.getLatestAlarm(_userModel, _alarmRecord, true); + await FirestoreDb.getLatestAlarm(_userModel, _alarmRecord, true); AlarmModel latestAlarm = - Utils.getFirstScheduledAlarm(isarLatestAlarm, firestoreLatestAlarm); + Utils.getFirstScheduledAlarm(isarLatestAlarm, firestoreLatestAlarm); debugPrint('LATEST : ${latestAlarm.alarmTime}'); return latestAlarm; @@ -81,8 +86,8 @@ class AlarmControlController extends GetxController { timer.cancel(); vibrationTimer = Timer.periodic(const Duration(milliseconds: 3500), (Timer timer) { - Vibration.vibrate(pattern: [500, 3000]); - }); + Vibration.vibrate(pattern: [500, 3000]); + }); AudioUtils.playAlarm(alarmRecord: currentlyRingingAlarm.value); @@ -121,7 +126,7 @@ class AlarmControlController extends GetxController { double vol = currentlyRingingAlarm.value.volMin / 10.0; double diff = (currentlyRingingAlarm.value.volMax - - currentlyRingingAlarm.value.volMin) / + currentlyRingingAlarm.value.volMin) / 10.0; int len = currentlyRingingAlarm.value.gradient * 1000; double steps = (diff / 0.01).abs(); @@ -153,10 +158,21 @@ class AlarmControlController extends GetxController { } }); } + void startListeningToFlip() { + _sensorSubscription = accelerometerEvents.listen((event) { + if (event.z < -8) { // Device is flipped (screen down) + if (!isSnoozing.value && settingsController.isFlipToSnooze.value == true) { + startSnooze(); + } + } + }); + } @override void onInit() async { super.onInit(); + startListeningToFlip(); + currentlyRingingAlarm.value = Get.arguments; print('hwyooo ${currentlyRingingAlarm.value.isGuardian}'); IsarDb() @@ -168,7 +184,7 @@ class AlarmControlController extends GetxController { currentlyRingingAlarm.value.isCall ? Utils.dialNumber(currentlyRingingAlarm.value.guardian) : Utils.sendSMS(currentlyRingingAlarm.value.guardian, - "Your Friend is not waking up \n - Ultimate Alarm Clock"); + "Your Friend is not waking up \n - Ultimate Alarm Clock"); timer.cancel(); } else { guardianCoundown.value = guardianCoundown.value - 1; @@ -176,6 +192,8 @@ class AlarmControlController extends GetxController { }); } + + showButton.value = true; initialVolume = await FlutterVolumeController.getVolume( stream: AudioStream.alarm, @@ -197,8 +215,8 @@ class AlarmControlController extends GetxController { } vibrationTimer = Timer.periodic(const Duration(milliseconds: 3500), (Timer timer) { - Vibration.vibrate(pattern: [500, 3000]); - }); + Vibration.vibrate(pattern: [500, 3000]); + }); // Preventing app from being minimized! _subscription = FGBGEvents.stream.listen((event) { @@ -261,7 +279,7 @@ class AlarmControlController extends GetxController { // Finding the next alarm to ring AlarmModel latestAlarm = await getNextAlarm(); TimeOfDay latestAlarmTimeOfDay = - Utils.stringToTimeOfDay(latestAlarm.alarmTime); + Utils.stringToTimeOfDay(latestAlarm.alarmTime); // } // This condition will never satisfy because this will only @@ -269,8 +287,8 @@ class AlarmControlController extends GetxController { if (latestAlarm.isEnabled == false) { debugPrint( 'STOPPED IF CONDITION with latest = ' - '${latestAlarmTimeOfDay.toString()} and ' - 'current = ${currentTime.toString()}', + '${latestAlarmTimeOfDay.toString()} and ' + 'current = ${currentTime.toString()}', ); await alarmChannel.invokeMethod('cancelAllScheduledAlarms'); @@ -305,7 +323,10 @@ class AlarmControlController extends GetxController { initialVolume, stream: AudioStream.alarm, ); + + _subscription.cancel(); _currentTimeTimer?.cancel(); + _sensorSubscription?.cancel(); } } diff --git a/lib/app/modules/settings/controllers/settings_controller.dart b/lib/app/modules/settings/controllers/settings_controller.dart index 5db0c333..d314fef5 100644 --- a/lib/app/modules/settings/controllers/settings_controller.dart +++ b/lib/app/modules/settings/controllers/settings_controller.dart @@ -22,6 +22,8 @@ class SettingsController extends GetxController { final _hapticFeedbackKey = 'haptic_feedback'; var is24HrsEnabled = false.obs; final _f24HrsEnabledKey = '24_hours_format'; + var isFlipToSnooze = false.obs; + final _flipToSnooze = 'flip_to_snooze'; var isSortedAlarmListEnabled = true.obs; final _sortedAlarmListKey = 'sorted_alarm_list'; var currentLanguage = 'en_US'.obs; @@ -166,6 +168,8 @@ class SettingsController extends GetxController { is24HrsEnabled.value = await _secureStorageProvider.read24HoursEnabled(key: _f24HrsEnabledKey); + isFlipToSnooze.value = + await _secureStorageProvider.readFlipToSnooze(key: _flipToSnooze); isSortedAlarmListEnabled.value = await _secureStorageProvider .readSortedAlarmListValue(key: _sortedAlarmListKey); @@ -220,6 +224,16 @@ class SettingsController extends GetxController { is24HrsEnabled.value = enabled; _save24HoursFormatPreference(); } + void _savePreferenceFTS() async { + await _secureStorageProvider.writeHapticFeedbackValue( + key: _flipToSnooze, + isHapticFeedbackEnabled: isFlipToSnooze.value, + ); + } + void toggleFlipToSnooze(bool enabled) { + isFlipToSnooze.value = enabled; + _savePreferenceFTS(); + } void _saveSortedAlarmListPreference() async { await _secureStorageProvider.writeSortedAlarmListValue( diff --git a/lib/app/modules/settings/views/enable_flip_to_snooze.dart b/lib/app/modules/settings/views/enable_flip_to_snooze.dart new file mode 100644 index 00000000..3d67ba00 --- /dev/null +++ b/lib/app/modules/settings/views/enable_flip_to_snooze.dart @@ -0,0 +1,63 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:ultimate_alarm_clock/app/modules/settings/controllers/settings_controller.dart'; +import 'package:ultimate_alarm_clock/app/modules/settings/controllers/theme_controller.dart'; +import 'package:ultimate_alarm_clock/app/utils/utils.dart'; +import 'package:ultimate_alarm_clock/app/utils/constants.dart'; + +class EnableFlipToSnooze extends StatefulWidget { + const EnableFlipToSnooze({ + super.key, + required this.controller, + required this.height, + required this.width, + required this.themeController, + }); + + final SettingsController controller; + final ThemeController themeController; + + final double height; + final double width; + + @override + State createState() => _EnableFlipToSnoozeState(); +} + +class _EnableFlipToSnoozeState extends State { + @override + Widget build(BuildContext context) { + return Container( + width: widget.width * 0.91, + height: widget.height * 0.1, + decoration: Utils.getCustomTileBoxDecoration( + isLightMode: + widget.themeController.currentTheme.value == ThemeMode.light, + ), + child: Padding( + padding: const EdgeInsets.only(left: 30, right: 20), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Expanded( + child: Text( + 'Enable Flip To Snooze'.tr, + style: Theme.of(context).textTheme.bodyLarge, + ), + ), + Obx( + () => Switch.adaptive( + value: widget.controller.isFlipToSnooze.value, + activeColor: ksecondaryColor, + onChanged: (bool value) async { + widget.controller.toggleFlipToSnooze(value); + Utils.hapticFeedback(); + }, + ), + ), + ], + ), + ), + ); + } +} diff --git a/lib/app/modules/settings/views/settings_view.dart b/lib/app/modules/settings/views/settings_view.dart index bdcbaa3b..643e5e4f 100644 --- a/lib/app/modules/settings/views/settings_view.dart +++ b/lib/app/modules/settings/views/settings_view.dart @@ -1,9 +1,8 @@ import 'package:flutter/material.dart'; - import 'package:get/get.dart'; import 'package:ultimate_alarm_clock/app/modules/settings/views/customize_undo_duration.dart'; - import 'package:ultimate_alarm_clock/app/modules/settings/views/enable_24Hour_format.dart'; +import 'package:ultimate_alarm_clock/app/modules/settings/views/enable_flip_to_snooze.dart'; import 'package:ultimate_alarm_clock/app/modules/settings/views/enable_haptic_feedback.dart'; import 'package:ultimate_alarm_clock/app/modules/settings/views/enable_sorted_alarm_list.dart'; import 'package:ultimate_alarm_clock/app/modules/settings/views/language_menu.dart'; @@ -87,6 +86,15 @@ class SettingsView extends GetView { const SizedBox( height: 20, ), + EnableFlipToSnooze( + controller: controller, + height: height, + width: width, + themeController: controller.themeController, + ), + const SizedBox( + height: 20, + ), ThemeValueTile( controller: controller, height: height, diff --git a/pubspec.yaml b/pubspec.yaml index ddf51bbd..ea1939f0 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -37,6 +37,7 @@ dependencies: vibration: ^1.8.1 file_picker: ^6.1.1 audioplayers: ^5.2.1 + sensors_plus: ^1.4.1 rxdart: ^0.27.7 flutter: sdk: flutter