Skip to content

Commit 82cd3a5

Browse files
authored
feat: Added flip to snooze (#741)
1 parent e691078 commit 82cd3a5

File tree

6 files changed

+124
-14
lines changed

6 files changed

+124
-14
lines changed

lib/app/data/providers/secure_storage_provider.dart

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,9 @@ class SecureStorageProvider {
111111
Future<bool> read24HoursEnabled({required String key}) async {
112112
return await _secureStorage.read(key: key) == 'true';
113113
}
114+
Future<bool> readFlipToSnooze({required String key}) async {
115+
return await _secureStorage.read(key: key) == 'true';
116+
}
114117

115118
Future<void> write24HoursEnabled({
116119
required String key,

lib/app/modules/alarmRing/controllers/alarm_ring_controller.dart

Lines changed: 33 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import 'package:ultimate_alarm_clock/app/utils/audio_utils.dart';
2020

2121
import 'package:ultimate_alarm_clock/app/utils/utils.dart';
2222
import 'package:vibration/vibration.dart';
23+
import 'package:sensors_plus/sensors_plus.dart';
2324

2425
import '../../home/controllers/home_controller.dart';
2526

@@ -33,6 +34,7 @@ class AlarmControlController extends GetxController {
3334
RxInt minutes = 1.obs;
3435
RxInt seconds = 0.obs;
3536
RxBool showButton = false.obs;
37+
StreamSubscription? _sensorSubscription;
3638
HomeController homeController = Get.find<HomeController>();
3739
SettingsController settingsController = Get.find<SettingsController>();
3840
RxBool get is24HourFormat => settingsController.is24HrsEnabled;
@@ -47,15 +49,18 @@ class AlarmControlController extends GetxController {
4749
late Timer guardianTimer;
4850
RxInt guardianCoundown = 120.obs;
4951

52+
53+
54+
5055
getNextAlarm() async {
5156
UserModel? _userModel = await SecureStorageProvider().retrieveUserModel();
5257
AlarmModel _alarmRecord = homeController.genFakeAlarmModel();
5358
AlarmModel isarLatestAlarm =
54-
await IsarDb.getLatestAlarm(_alarmRecord, true);
59+
await IsarDb.getLatestAlarm(_alarmRecord, true);
5560
AlarmModel firestoreLatestAlarm =
56-
await FirestoreDb.getLatestAlarm(_userModel, _alarmRecord, true);
61+
await FirestoreDb.getLatestAlarm(_userModel, _alarmRecord, true);
5762
AlarmModel latestAlarm =
58-
Utils.getFirstScheduledAlarm(isarLatestAlarm, firestoreLatestAlarm);
63+
Utils.getFirstScheduledAlarm(isarLatestAlarm, firestoreLatestAlarm);
5964
debugPrint('LATEST : ${latestAlarm.alarmTime}');
6065

6166
return latestAlarm;
@@ -81,8 +86,8 @@ class AlarmControlController extends GetxController {
8186
timer.cancel();
8287
vibrationTimer =
8388
Timer.periodic(const Duration(milliseconds: 3500), (Timer timer) {
84-
Vibration.vibrate(pattern: [500, 3000]);
85-
});
89+
Vibration.vibrate(pattern: [500, 3000]);
90+
});
8691

8792
AudioUtils.playAlarm(alarmRecord: currentlyRingingAlarm.value);
8893

@@ -121,7 +126,7 @@ class AlarmControlController extends GetxController {
121126

122127
double vol = currentlyRingingAlarm.value.volMin / 10.0;
123128
double diff = (currentlyRingingAlarm.value.volMax -
124-
currentlyRingingAlarm.value.volMin) /
129+
currentlyRingingAlarm.value.volMin) /
125130
10.0;
126131
int len = currentlyRingingAlarm.value.gradient * 1000;
127132
double steps = (diff / 0.01).abs();
@@ -153,10 +158,21 @@ class AlarmControlController extends GetxController {
153158
}
154159
});
155160
}
161+
void startListeningToFlip() {
162+
_sensorSubscription = accelerometerEvents.listen((event) {
163+
if (event.z < -8) { // Device is flipped (screen down)
164+
if (!isSnoozing.value && settingsController.isFlipToSnooze.value == true) {
165+
startSnooze();
166+
}
167+
}
168+
});
169+
}
156170

157171
@override
158172
void onInit() async {
159173
super.onInit();
174+
startListeningToFlip();
175+
160176
currentlyRingingAlarm.value = Get.arguments;
161177
print('hwyooo ${currentlyRingingAlarm.value.isGuardian}');
162178
IsarDb()
@@ -168,14 +184,16 @@ class AlarmControlController extends GetxController {
168184
currentlyRingingAlarm.value.isCall
169185
? Utils.dialNumber(currentlyRingingAlarm.value.guardian)
170186
: Utils.sendSMS(currentlyRingingAlarm.value.guardian,
171-
"Your Friend is not waking up \n - Ultimate Alarm Clock");
187+
"Your Friend is not waking up \n - Ultimate Alarm Clock");
172188
timer.cancel();
173189
} else {
174190
guardianCoundown.value = guardianCoundown.value - 1;
175191
}
176192
});
177193
}
178194

195+
196+
179197
showButton.value = true;
180198
initialVolume = await FlutterVolumeController.getVolume(
181199
stream: AudioStream.alarm,
@@ -197,8 +215,8 @@ class AlarmControlController extends GetxController {
197215
}
198216
vibrationTimer =
199217
Timer.periodic(const Duration(milliseconds: 3500), (Timer timer) {
200-
Vibration.vibrate(pattern: [500, 3000]);
201-
});
218+
Vibration.vibrate(pattern: [500, 3000]);
219+
});
202220

203221
// Preventing app from being minimized!
204222
_subscription = FGBGEvents.stream.listen((event) {
@@ -261,16 +279,16 @@ class AlarmControlController extends GetxController {
261279
// Finding the next alarm to ring
262280
AlarmModel latestAlarm = await getNextAlarm();
263281
TimeOfDay latestAlarmTimeOfDay =
264-
Utils.stringToTimeOfDay(latestAlarm.alarmTime);
282+
Utils.stringToTimeOfDay(latestAlarm.alarmTime);
265283

266284
// }
267285
// This condition will never satisfy because this will only
268286
// occur if fake model is returned as latest alarm
269287
if (latestAlarm.isEnabled == false) {
270288
debugPrint(
271289
'STOPPED IF CONDITION with latest = '
272-
'${latestAlarmTimeOfDay.toString()} and '
273-
'current = ${currentTime.toString()}',
290+
'${latestAlarmTimeOfDay.toString()} and '
291+
'current = ${currentTime.toString()}',
274292
);
275293

276294
await alarmChannel.invokeMethod('cancelAllScheduledAlarms');
@@ -305,7 +323,10 @@ class AlarmControlController extends GetxController {
305323
initialVolume,
306324
stream: AudioStream.alarm,
307325
);
326+
327+
308328
_subscription.cancel();
309329
_currentTimeTimer?.cancel();
330+
_sensorSubscription?.cancel();
310331
}
311332
}

lib/app/modules/settings/controllers/settings_controller.dart

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@ class SettingsController extends GetxController {
2222
final _hapticFeedbackKey = 'haptic_feedback';
2323
var is24HrsEnabled = false.obs;
2424
final _f24HrsEnabledKey = '24_hours_format';
25+
var isFlipToSnooze = false.obs;
26+
final _flipToSnooze = 'flip_to_snooze';
2527
var isSortedAlarmListEnabled = true.obs;
2628
final _sortedAlarmListKey = 'sorted_alarm_list';
2729
var currentLanguage = 'en_US'.obs;
@@ -166,6 +168,8 @@ class SettingsController extends GetxController {
166168

167169
is24HrsEnabled.value =
168170
await _secureStorageProvider.read24HoursEnabled(key: _f24HrsEnabledKey);
171+
isFlipToSnooze.value =
172+
await _secureStorageProvider.readFlipToSnooze(key: _flipToSnooze);
169173

170174
isSortedAlarmListEnabled.value = await _secureStorageProvider
171175
.readSortedAlarmListValue(key: _sortedAlarmListKey);
@@ -220,6 +224,16 @@ class SettingsController extends GetxController {
220224
is24HrsEnabled.value = enabled;
221225
_save24HoursFormatPreference();
222226
}
227+
void _savePreferenceFTS() async {
228+
await _secureStorageProvider.writeHapticFeedbackValue(
229+
key: _flipToSnooze,
230+
isHapticFeedbackEnabled: isFlipToSnooze.value,
231+
);
232+
}
233+
void toggleFlipToSnooze(bool enabled) {
234+
isFlipToSnooze.value = enabled;
235+
_savePreferenceFTS();
236+
}
223237

224238
void _saveSortedAlarmListPreference() async {
225239
await _secureStorageProvider.writeSortedAlarmListValue(
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
import 'package:flutter/material.dart';
2+
import 'package:get/get.dart';
3+
import 'package:ultimate_alarm_clock/app/modules/settings/controllers/settings_controller.dart';
4+
import 'package:ultimate_alarm_clock/app/modules/settings/controllers/theme_controller.dart';
5+
import 'package:ultimate_alarm_clock/app/utils/utils.dart';
6+
import 'package:ultimate_alarm_clock/app/utils/constants.dart';
7+
8+
class EnableFlipToSnooze extends StatefulWidget {
9+
const EnableFlipToSnooze({
10+
super.key,
11+
required this.controller,
12+
required this.height,
13+
required this.width,
14+
required this.themeController,
15+
});
16+
17+
final SettingsController controller;
18+
final ThemeController themeController;
19+
20+
final double height;
21+
final double width;
22+
23+
@override
24+
State<EnableFlipToSnooze> createState() => _EnableFlipToSnoozeState();
25+
}
26+
27+
class _EnableFlipToSnoozeState extends State<EnableFlipToSnooze> {
28+
@override
29+
Widget build(BuildContext context) {
30+
return Container(
31+
width: widget.width * 0.91,
32+
height: widget.height * 0.1,
33+
decoration: Utils.getCustomTileBoxDecoration(
34+
isLightMode:
35+
widget.themeController.currentTheme.value == ThemeMode.light,
36+
),
37+
child: Padding(
38+
padding: const EdgeInsets.only(left: 30, right: 20),
39+
child: Row(
40+
mainAxisAlignment: MainAxisAlignment.spaceBetween,
41+
children: [
42+
Expanded(
43+
child: Text(
44+
'Enable Flip To Snooze'.tr,
45+
style: Theme.of(context).textTheme.bodyLarge,
46+
),
47+
),
48+
Obx(
49+
() => Switch.adaptive(
50+
value: widget.controller.isFlipToSnooze.value,
51+
activeColor: ksecondaryColor,
52+
onChanged: (bool value) async {
53+
widget.controller.toggleFlipToSnooze(value);
54+
Utils.hapticFeedback();
55+
},
56+
),
57+
),
58+
],
59+
),
60+
),
61+
);
62+
}
63+
}

lib/app/modules/settings/views/settings_view.dart

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,8 @@
11
import 'package:flutter/material.dart';
2-
32
import 'package:get/get.dart';
43
import 'package:ultimate_alarm_clock/app/modules/settings/views/customize_undo_duration.dart';
5-
64
import 'package:ultimate_alarm_clock/app/modules/settings/views/enable_24Hour_format.dart';
5+
import 'package:ultimate_alarm_clock/app/modules/settings/views/enable_flip_to_snooze.dart';
76
import 'package:ultimate_alarm_clock/app/modules/settings/views/enable_haptic_feedback.dart';
87
import 'package:ultimate_alarm_clock/app/modules/settings/views/enable_sorted_alarm_list.dart';
98
import 'package:ultimate_alarm_clock/app/modules/settings/views/language_menu.dart';
@@ -87,6 +86,15 @@ class SettingsView extends GetView<SettingsController> {
8786
const SizedBox(
8887
height: 20,
8988
),
89+
EnableFlipToSnooze(
90+
controller: controller,
91+
height: height,
92+
width: width,
93+
themeController: controller.themeController,
94+
),
95+
const SizedBox(
96+
height: 20,
97+
),
9098
ThemeValueTile(
9199
controller: controller,
92100
height: height,

pubspec.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ dependencies:
3737
vibration: ^1.8.1
3838
file_picker: ^6.1.1
3939
audioplayers: ^5.2.1
40+
sensors_plus: ^1.4.1
4041
rxdart: ^0.27.7
4142
flutter:
4243
sdk: flutter

0 commit comments

Comments
 (0)