@@ -23,12 +23,20 @@ using namespace Pinetime::Applications::Screens;
2323using Pinetime::Controllers::AlarmController;
2424
2525static void btnEventHandler (lv_obj_t * obj, lv_event_t event) {
26- Alarm * screen = static_cast <Alarm*>(obj->user_data );
26+ auto * screen = static_cast <Alarm*>(obj->user_data );
2727 screen->OnButtonEvent (obj, event);
2828}
2929
30- Alarm::Alarm (DisplayApp* app, Controllers::AlarmController& alarmController, Pinetime::Controllers::Settings& settingsController)
31- : Screen(app), alarmController {alarmController}, settingsController {settingsController} {
30+ static void StopAlarmTaskCallback (lv_task_t * task) {
31+ auto * screen = static_cast <Alarm*>(task->user_data );
32+ screen->StopAlerting ();
33+ }
34+
35+ Alarm::Alarm (DisplayApp* app,
36+ Controllers::AlarmController& alarmController,
37+ Pinetime::Controllers::Settings& settingsController,
38+ System::SystemTask& systemTask)
39+ : Screen(app), alarmController {alarmController}, settingsController {settingsController}, systemTask {systemTask} {
3240
3341 time = lv_label_create (lv_scr_act (), nullptr );
3442 lv_obj_set_style_local_text_font (time, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, &jetbrains_mono_76);
@@ -122,17 +130,16 @@ Alarm::Alarm(DisplayApp* app, Controllers::AlarmController& alarmController, Pin
122130}
123131
124132Alarm::~Alarm () {
133+ if (alarmController.State () == AlarmController::AlarmState::Alerting) {
134+ StopAlerting ();
135+ }
125136 lv_obj_clean (lv_scr_act ());
126137}
127138
128139void Alarm::OnButtonEvent (lv_obj_t * obj, lv_event_t event) {
129140 using Pinetime::Controllers::AlarmController;
130141 if (event == LV_EVENT_CLICKED) {
131142 if (obj == btnStop) {
132- if (alarmController.State () == AlarmController::AlarmState::Alerting) {
133- alarmController.StopAlerting ();
134- }
135- SetSwitchState (LV_ANIM_OFF);
136143 StopAlerting ();
137144 return ;
138145 }
@@ -205,9 +212,18 @@ bool Alarm::OnButtonPushed() {
205212 HideInfo ();
206213 return true ;
207214 }
215+ if (alarmController.State () == AlarmController::AlarmState::Alerting) {
216+ StopAlerting ();
217+ return true ;
218+ }
208219 return false ;
209220}
210221
222+ bool Alarm::OnTouchEvent (Pinetime::Applications::TouchEvents event) {
223+ // Don't allow closing the screen by swiping while the alarm is alerting
224+ return alarmController.State () == AlarmController::AlarmState::Alerting && event == TouchEvents::SwipeDown;
225+ }
226+
211227void Alarm::UpdateAlarmTime () {
212228 if (settingsController.GetClockType () == Controllers::Settings::ClockType::H12) {
213229 switch (alarmHours) {
@@ -237,9 +253,18 @@ void Alarm::UpdateAlarmTime() {
237253void Alarm::SetAlerting () {
238254 lv_obj_set_hidden (enableSwitch, true );
239255 lv_obj_set_hidden (btnStop, false );
256+ taskStopAlarm = lv_task_create (StopAlarmTaskCallback, pdMS_TO_TICKS (60 * 1000 ), LV_TASK_PRIO_MID, this );
257+ systemTask.PushMessage (System::Messages::DisableSleeping);
240258}
241259
242260void Alarm::StopAlerting () {
261+ alarmController.StopAlerting ();
262+ SetSwitchState (LV_ANIM_OFF);
263+ if (taskStopAlarm != nullptr ) {
264+ lv_task_del (taskStopAlarm);
265+ taskStopAlarm = nullptr ;
266+ }
267+ systemTask.PushMessage (System::Messages::EnableSleeping);
243268 lv_obj_set_hidden (enableSwitch, false );
244269 lv_obj_set_hidden (btnStop, true );
245270}
0 commit comments