
* Allow multiple wakeup modes at the same time. This commit adds multiple wakeup modes support. It does so by storing them as a uint8_t bitfield enum. It changes the following functions: Since multiple modes can be on now, older version would not cut it: WakeUpMode getWakeupMode() -> std::bitset<3> getWakeUpModes() Where each bit corresponds to a WakeUpMode We still need a way to check whether a specific wakeup mode is on, so: bool isWakeUpModeOn(const WakeUpMode mode) This function was changed to work correctly with the new implementation. setWakeUpMode(WakeupMode mode, bool enable) Previously, systemtask would exit SystemTask::OnTouchEvent() if the wake up mode was None or RaiseWrist, to prevent waking up when a touch was received. However, after enabling using multiple WakeUpModes, this caused a bug where when RaiseWrist was checked with SingleTap or DoubleTap, the tap detection wouldn't work. This commit fixes that bug. Next commit will update the settings WakeUpMode select UI to reflect these changes. Signed-off-by: Kozova1 <mug66kk@gmail.com> * Updated UI to reflect multiple WakeUp sources being available. Signed-off-by: Kozova1 <mug66kk@gmail.com>
108 lines
4.2 KiB
C++
108 lines
4.2 KiB
C++
#include "SettingWakeUp.h"
|
|
#include <lvgl/lvgl.h>
|
|
#include "displayapp/DisplayApp.h"
|
|
#include "displayapp/screens/Screen.h"
|
|
#include "displayapp/screens/Symbols.h"
|
|
#include "components/settings/Settings.h"
|
|
|
|
using namespace Pinetime::Applications::Screens;
|
|
|
|
namespace {
|
|
static void event_handler(lv_obj_t* obj, lv_event_t event) {
|
|
SettingWakeUp* screen = static_cast<SettingWakeUp*>(obj->user_data);
|
|
screen->UpdateSelected(obj, event);
|
|
}
|
|
}
|
|
|
|
SettingWakeUp::SettingWakeUp(Pinetime::Applications::DisplayApp* app, Pinetime::Controllers::Settings& settingsController)
|
|
: Screen(app), settingsController {settingsController} {
|
|
ignoringEvents = false;
|
|
lv_obj_t* container1 = lv_cont_create(lv_scr_act(), nullptr);
|
|
|
|
lv_obj_set_style_local_bg_opa(container1, LV_CONT_PART_MAIN, LV_STATE_DEFAULT, LV_OPA_TRANSP);
|
|
lv_obj_set_style_local_pad_all(container1, LV_CONT_PART_MAIN, LV_STATE_DEFAULT, 10);
|
|
lv_obj_set_style_local_pad_inner(container1, LV_CONT_PART_MAIN, LV_STATE_DEFAULT, 5);
|
|
lv_obj_set_style_local_border_width(container1, LV_CONT_PART_MAIN, LV_STATE_DEFAULT, 0);
|
|
|
|
lv_obj_set_pos(container1, 10, 60);
|
|
lv_obj_set_width(container1, LV_HOR_RES - 20);
|
|
lv_obj_set_height(container1, LV_VER_RES - 50);
|
|
lv_cont_set_layout(container1, LV_LAYOUT_COLUMN_LEFT);
|
|
|
|
lv_obj_t* title = lv_label_create(lv_scr_act(), nullptr);
|
|
lv_label_set_text_static(title, "Wake Up");
|
|
lv_label_set_align(title, LV_LABEL_ALIGN_CENTER);
|
|
lv_obj_align(title, lv_scr_act(), LV_ALIGN_IN_TOP_MID, 15, 15);
|
|
|
|
lv_obj_t* icon = lv_label_create(lv_scr_act(), nullptr);
|
|
lv_obj_set_style_local_text_color(icon, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_ORANGE);
|
|
lv_label_set_text_static(icon, Symbols::clock);
|
|
lv_label_set_align(icon, LV_LABEL_ALIGN_CENTER);
|
|
lv_obj_align(icon, title, LV_ALIGN_OUT_LEFT_MID, -10, 0);
|
|
|
|
optionsTotal = 0;
|
|
cbOption[optionsTotal] = lv_checkbox_create(container1, nullptr);
|
|
lv_checkbox_set_text_static(cbOption[optionsTotal], " Single Tap");
|
|
cbOption[optionsTotal]->user_data = this;
|
|
lv_obj_set_event_cb(cbOption[optionsTotal], event_handler);
|
|
if (settingsController.isWakeUpModeOn(Pinetime::Controllers::Settings::WakeUpMode::SingleTap)) {
|
|
lv_checkbox_set_checked(cbOption[optionsTotal], true);
|
|
}
|
|
optionsTotal++;
|
|
cbOption[optionsTotal] = lv_checkbox_create(container1, nullptr);
|
|
lv_checkbox_set_text_static(cbOption[optionsTotal], " Double Tap");
|
|
cbOption[optionsTotal]->user_data = this;
|
|
lv_obj_set_event_cb(cbOption[optionsTotal], event_handler);
|
|
if (settingsController.isWakeUpModeOn(Pinetime::Controllers::Settings::WakeUpMode::DoubleTap)) {
|
|
lv_checkbox_set_checked(cbOption[optionsTotal], true);
|
|
}
|
|
optionsTotal++;
|
|
cbOption[optionsTotal] = lv_checkbox_create(container1, nullptr);
|
|
lv_checkbox_set_text_static(cbOption[optionsTotal], " Raise Wrist");
|
|
cbOption[optionsTotal]->user_data = this;
|
|
lv_obj_set_event_cb(cbOption[optionsTotal], event_handler);
|
|
if (settingsController.isWakeUpModeOn(Pinetime::Controllers::Settings::WakeUpMode::RaiseWrist)) {
|
|
lv_checkbox_set_checked(cbOption[optionsTotal], true);
|
|
}
|
|
optionsTotal++;
|
|
}
|
|
|
|
SettingWakeUp::~SettingWakeUp() {
|
|
lv_obj_clean(lv_scr_act());
|
|
settingsController.SaveSettings();
|
|
}
|
|
|
|
bool SettingWakeUp::Refresh() {
|
|
return running;
|
|
}
|
|
|
|
void SettingWakeUp::UpdateSelected(lv_obj_t* object, lv_event_t event) {
|
|
using WakeUpMode = Pinetime::Controllers::Settings::WakeUpMode;
|
|
if (event == LV_EVENT_VALUE_CHANGED && !ignoringEvents) {
|
|
ignoringEvents = true;
|
|
|
|
// Find the index of the checkbox that triggered the event
|
|
int index = 0;
|
|
for (; index < optionsTotal; ++index) {
|
|
if (cbOption[index] == object) {
|
|
break;
|
|
}
|
|
}
|
|
|
|
// Toggle needed wakeup mode
|
|
auto mode = static_cast<WakeUpMode>(index);
|
|
auto currentState = settingsController.isWakeUpModeOn(mode);
|
|
settingsController.setWakeUpMode(mode, !currentState);
|
|
|
|
// Update checkbox according to current wakeup modes.
|
|
// This is needed because we can have extra logic when setting or unsetting wakeup modes,
|
|
// for example, when setting SingleTap, DoubleTap is unset and vice versa.
|
|
auto modes = settingsController.getWakeUpModes();
|
|
for (int i = 0; i < optionsTotal; ++i) {
|
|
lv_checkbox_set_checked(cbOption[i], modes[i]);
|
|
}
|
|
|
|
ignoringEvents = false;
|
|
}
|
|
}
|