Skip to content

Commit b2b2df3

Browse files
committed
alarm: Long press to stop alarm
This change prevents accidentally turning off alarm by ensuring that there is a deliberate long press, similar to resetting the Timer app.
1 parent 7128fc0 commit b2b2df3

File tree

2 files changed

+59
-4
lines changed

2 files changed

+59
-4
lines changed

src/displayapp/screens/Alarm.cpp

Lines changed: 48 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,14 @@ Alarm::Alarm(Controllers::AlarmController& alarmController,
7474
lv_label_set_text_static(colonLabel, ":");
7575
lv_obj_align(colonLabel, lv_scr_act(), LV_ALIGN_CENTER, 0, -29);
7676

77+
progressStop = lv_bar_create(lv_scr_act(), nullptr);
78+
lv_bar_set_range(progressStop, 0, progressBarSize);
79+
lv_bar_set_value(progressStop, 0, LV_ANIM_OFF);
80+
lv_obj_set_size(progressStop, progressBarSize, 10);
81+
lv_obj_align(progressStop, nullptr, LV_ALIGN_IN_TOP_MID, 0, 0);
82+
lv_obj_set_style_local_bg_color(progressStop, LV_BAR_PART_INDIC, LV_STATE_DEFAULT, LV_COLOR_ORANGE);
83+
lv_obj_set_hidden(progressStop, true);
84+
7785
btnStop = lv_btn_create(lv_scr_act(), nullptr);
7886
btnStop->user_data = this;
7987
lv_obj_set_event_cb(btnStop, btnEventHandler);
@@ -122,12 +130,28 @@ Alarm::Alarm(Controllers::AlarmController& alarmController,
122130
} else {
123131
SetSwitchState(LV_ANIM_OFF);
124132
}
133+
134+
taskRefresh = lv_task_create(RefreshTaskCallback, 50, LV_TASK_PRIO_MID, this);
135+
}
136+
137+
void Alarm::Refresh() {
138+
if (stopBtnPressTime.has_value()) {
139+
TickType_t elapsed = xTaskGetTickCount() - stopBtnPressTime.value();
140+
if (elapsed >= longPressTimeout) {
141+
ResetStopProgress();
142+
StopAlerting();
143+
} else {
144+
lv_coord_t stopPosition = (elapsed * progressBarSize) / longPressTimeout;
145+
UpdateStopProgress(stopPosition);
146+
}
147+
}
125148
}
126149

127150
Alarm::~Alarm() {
128151
if (alarmController.IsAlerting()) {
129152
StopAlerting();
130153
}
154+
lv_task_del(taskRefresh);
131155
lv_obj_clean(lv_scr_act());
132156
alarmController.SaveAlarm();
133157
}
@@ -139,12 +163,32 @@ void Alarm::DisableAlarm() {
139163
}
140164
}
141165

166+
void Alarm::StopButtonPressed() {
167+
stopBtnPressTime = xTaskGetTickCount();
168+
UpdateStopProgress(0);
169+
lv_obj_set_hidden(progressStop, false);
170+
}
171+
172+
void Alarm::ResetStopProgress() {
173+
stopBtnPressTime = std::nullopt;
174+
UpdateStopProgress(0);
175+
lv_obj_set_hidden(progressStop, true);
176+
}
177+
178+
void Alarm::UpdateStopProgress(lv_coord_t stopPosition) {
179+
lv_bar_set_value(progressStop, progressBarSize - stopPosition, LV_ANIM_OFF);
180+
}
181+
142182
void Alarm::OnButtonEvent(lv_obj_t* obj, lv_event_t event) {
143-
if (event == LV_EVENT_CLICKED) {
144-
if (obj == btnStop) {
145-
StopAlerting();
146-
return;
183+
if (obj == btnStop) {
184+
if (event == LV_EVENT_PRESSED) {
185+
StopButtonPressed();
186+
} else if (event == LV_EVENT_RELEASED || event == LV_EVENT_PRESS_LOST) {
187+
ResetStopProgress();
147188
}
189+
return;
190+
}
191+
if (event == LV_EVENT_CLICKED) {
148192
if (obj == btnInfo) {
149193
ShowInfo();
150194
return;

src/displayapp/screens/Alarm.h

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
#include "displayapp/Controllers.h"
2525
#include "systemtask/WakeLock.h"
2626
#include "Symbols.h"
27+
#include <optional>
2728

2829
namespace Pinetime {
2930
namespace Applications {
@@ -35,12 +36,15 @@ namespace Pinetime {
3536
System::SystemTask& systemTask,
3637
Controllers::MotorController& motorController);
3738
~Alarm() override;
39+
void Refresh() override;
3840
void SetAlerting();
3941
void OnButtonEvent(lv_obj_t* obj, lv_event_t event);
4042
bool OnButtonPushed() override;
4143
bool OnTouchEvent(TouchEvents event) override;
4244
void OnValueChanged();
4345
void StopAlerting();
46+
void StopButtonPressed();
47+
void ResetStopProgress();
4448

4549
private:
4650
Controllers::AlarmController& alarmController;
@@ -51,6 +55,7 @@ namespace Pinetime {
5155
lv_obj_t* lblampm = nullptr;
5256
lv_obj_t* txtMessage = nullptr;
5357
lv_obj_t* btnMessage = nullptr;
58+
lv_task_t* taskRefresh = nullptr;
5459
lv_task_t* taskStopAlarm = nullptr;
5560

5661
enum class EnableButtonState { On, Off, Alerting };
@@ -62,8 +67,14 @@ namespace Pinetime {
6267
void HideInfo();
6368
void ToggleRecurrence();
6469
void UpdateAlarmTime();
70+
void UpdateStopProgress(lv_coord_t stopPosition);
6571
Widgets::Counter hourCounter = Widgets::Counter(0, 23, jetbrains_mono_76);
6672
Widgets::Counter minuteCounter = Widgets::Counter(0, 59, jetbrains_mono_76);
73+
74+
lv_obj_t* progressStop;
75+
std::optional<TickType_t> stopBtnPressTime;
76+
static constexpr TickType_t longPressTimeout = pdMS_TO_TICKS(1000);
77+
static constexpr lv_coord_t progressBarSize = 240;
6778
};
6879
}
6980

0 commit comments

Comments
 (0)