diff --git a/src/components/settings/Settings.h b/src/components/settings/Settings.h index 81cf4923..f2561ec8 100644 --- a/src/components/settings/Settings.h +++ b/src/components/settings/Settings.h @@ -13,6 +13,7 @@ namespace Pinetime { enum class Notification : uint8_t { On, Off, Sleep }; enum class ChimesOption : uint8_t { None, Hours, HalfHours }; enum class WakeUpMode : uint8_t { SingleTap = 0, DoubleTap = 1, RaiseWrist = 2, Shake = 3, LowerWrist = 4 }; + enum class QuickApp : uint8_t { MusicPlayer = 0, Calculator = 1, Flashlight = 2, Step = 3, HeartRate = 4 }; //, Alarm = 5, Timer = 6, Stopwatch = 7 }; enum class Colors : uint8_t { White, Silver, @@ -241,6 +242,34 @@ namespace Pinetime { return getWakeUpModes()[static_cast(mode)]; } + + + + + // New Settings + void SetQuickRModes(QuickApp App_now, bool enabled) { + if (enabled != isQuickROn(App_now)) { + settingsChanged = true; + } + settings.quickApp.set(static_cast(App_now), enabled); + }; + + std::bitset<5> getQuickRModes() const { + return settings.quickApp; + } + + bool isQuickROn(const QuickApp app_holder) const { + return getQuickRModes()[static_cast(app_holder)]; + } + + + + + + + + + void SetBrightness(Controllers::BrightnessController::Levels level) { if (level != settings.brightLevel) { settingsChanged = true; @@ -279,6 +308,7 @@ namespace Pinetime { struct SettingsData { uint32_t version = settingsVersion; uint32_t stepsGoal = 10000; + uint32_t setquickr = 10000; uint32_t screenTimeOut = 15000; ClockType clockType = ClockType::H24; @@ -292,6 +322,7 @@ namespace Pinetime { WatchFaceInfineat watchFaceInfineat; std::bitset<5> wakeUpMode {0}; + std::bitset<5> quickApp {0}; uint16_t shakeWakeThreshold = 150; Controllers::BrightnessController::Levels brightLevel = Controllers::BrightnessController::Levels::Medium; diff --git a/src/displayapp/Apps.h b/src/displayapp/Apps.h index c8a48228..1e951938 100644 --- a/src/displayapp/Apps.h +++ b/src/displayapp/Apps.h @@ -38,7 +38,8 @@ namespace Pinetime { SettingShakeThreshold, SettingBluetooth, Error, - Calculator + Calculator, + SettingQuickR }; } } diff --git a/src/displayapp/DisplayApp.cpp b/src/displayapp/DisplayApp.cpp index a547cfbc..4cfdd344 100644 --- a/src/displayapp/DisplayApp.cpp +++ b/src/displayapp/DisplayApp.cpp @@ -51,6 +51,7 @@ #include "displayapp/screens/settings/SettingChimes.h" #include "displayapp/screens/settings/SettingShakeThreshold.h" #include "displayapp/screens/settings/SettingBluetooth.h" +#include "displayapp/screens/settings/SettingQuickR.h" #include "libs/lv_conf.h" @@ -293,6 +294,11 @@ void DisplayApp::Refresh() { } }; + std::bitset<5> quick_app = settingsController.getQuickRModes(); + bool value = (quick_app[0] ? 1 : 0 ); + NRF_LOG_INFO("Value of Quick app: %i", value); + + if (!currentScreen->OnTouchEvent(gesture)) { if (currentApp == Apps::Clock || currentApp == Apps::Music || currentApp == Apps::Calculator || currentApp == Apps::QuickSettings) { switch (gesture) { @@ -313,18 +319,18 @@ void DisplayApp::Refresh() { case TouchEvents::SwipeRight: if (currentApp == Apps::Clock) { LoadNewScreen(Apps::QuickSettings, DisplayApp::FullRefreshDirections::RightAnim); - } else if (currentApp == Apps::QuickSettings) { + } else if (currentApp == Apps::QuickSettings && quick_app[1]) { LoadNewScreen(Apps::Calculator, DisplayApp::FullRefreshDirections::RightAnim); - } else if (currentApp == Apps::Calculator) { + } else if (currentApp == Apps::Calculator && quick_app[0]) { LoadNewScreen(Apps::Music, DisplayApp::FullRefreshDirections::RightAnim); } else { LoadNewScreen(Apps::Clock, DisplayApp::FullRefreshDirections::RightAnim); } break; case TouchEvents::SwipeLeft: - if (currentApp == Apps::Clock) { + if (currentApp == Apps::Clock && quick_app[0]) { LoadNewScreen(Apps::Music, DisplayApp::FullRefreshDirections::LeftAnim); - } else if (currentApp == Apps::Music) { + } else if (currentApp == Apps::Music && quick_app[1]) { LoadNewScreen(Apps::Calculator, DisplayApp::FullRefreshDirections::LeftAnim); } else if (currentApp == Apps::Calculator) { LoadNewScreen(Apps::QuickSettings, DisplayApp::FullRefreshDirections::LeftAnim); @@ -583,6 +589,9 @@ void DisplayApp::LoadScreen(Apps app, DisplayApp::FullRefreshDirections directio case Apps::Calculator: currentScreen = std::make_unique(); break; + case Apps::SettingQuickR: + currentScreen = std::make_unique(settingsController); + break; } currentApp = app; } diff --git a/src/displayapp/screens/settings/SettingQuickR.cpp b/src/displayapp/screens/settings/SettingQuickR.cpp new file mode 100644 index 00000000..6b4e98a9 --- /dev/null +++ b/src/displayapp/screens/settings/SettingQuickR.cpp @@ -0,0 +1,77 @@ +#include "displayapp/screens/settings/SettingQuickR.h" +#include +#include "displayapp/DisplayApp.h" +#include "displayapp/screens/Symbols.h" +#include "displayapp/InfiniTimeTheme.h" + +using namespace Pinetime::Applications::Screens; + + + +namespace { + void event_handler(lv_obj_t* obj, lv_event_t event) { + auto* screen = static_cast(obj->user_data); + if (event == LV_EVENT_VALUE_CHANGED) { + screen->UpdateSelected(obj); + } + } +} + +SettingQuickR::SettingQuickR(Pinetime::Controllers::Settings& settingsController) : settingsController {settingsController} { + 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, 35); + lv_obj_set_width(container1, LV_HOR_RES - 20); + lv_obj_set_height(container1, LV_VER_RES - 20); + 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, "Quick Ring"); + 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::check); + lv_label_set_align(icon, LV_LABEL_ALIGN_CENTER); + lv_obj_align(icon, title, LV_ALIGN_OUT_LEFT_MID, -10, 0); + + for (unsigned int i = 0; i < options.size(); i++) { + cbOption[i] = lv_checkbox_create(container1, nullptr); + lv_checkbox_set_text(cbOption[i], options[i].name); + if (settingsController.isQuickROn(static_cast(i))) { + lv_checkbox_set_checked(cbOption[i], true); + } + cbOption[i]->user_data = this; + lv_obj_set_event_cb(cbOption[i], event_handler); + } +} + +SettingQuickR::~SettingQuickR() { + lv_obj_clean(lv_scr_act()); + settingsController.SaveSettings(); +} + +void SettingQuickR::UpdateSelected(lv_obj_t* object) { + // Find the index of the checkbox that triggered the event + for (size_t i = 0; i < options.size(); i++) { + if (cbOption[i] == object) { + bool currentState = settingsController.isQuickROn(options[i].quickApp); + settingsController.SetQuickRModes(options[i].quickApp, !currentState); + break; + } + } + + // 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.getQuickRModes(); + for (size_t i = 0; i < options.size(); ++i) { + lv_checkbox_set_checked(cbOption[i], modes[i]); + } +} diff --git a/src/displayapp/screens/settings/SettingQuickR.h b/src/displayapp/screens/settings/SettingQuickR.h new file mode 100644 index 00000000..c7d7c74a --- /dev/null +++ b/src/displayapp/screens/settings/SettingQuickR.h @@ -0,0 +1,42 @@ +#pragma once + +#include +#include +#include +#include "components/settings/Settings.h" +#include "displayapp/screens/Screen.h" + +namespace Pinetime { + + namespace Applications { + namespace Screens { + + class SettingQuickR : public Screen { + public: + SettingQuickR(Pinetime::Controllers::Settings& settingsController); + ~SettingQuickR() override; + void UpdateSelected(lv_obj_t* object); + + private: + struct Option { + Controllers::Settings::QuickApp quickApp; + const char* name; + }; + + static constexpr std::array options = {{ + {Controllers::Settings::QuickApp::MusicPlayer, "Music Player"}, + {Controllers::Settings::QuickApp::Calculator, "Calculator"}, + {Controllers::Settings::QuickApp::Flashlight, "Flashlight"}, + {Controllers::Settings::QuickApp::Step, "Steps"}, + {Controllers::Settings::QuickApp::HeartRate, "Heart Rate"}, +// {Controllers::Settings::QuickApp::Alarm, "Alarm"}, +// {Controllers::Settings::QuickApp::Timer, "Timer"}, +// {Controllers::Settings::QuickApp::Stopwatch, "Stopwatch"}, + }}; + + lv_obj_t* cbOption[options.size()]; + Controllers::Settings& settingsController; + }; + } + } +} diff --git a/src/displayapp/screens/settings/Settings.h b/src/displayapp/screens/settings/Settings.h index 3f809753..c21fa234 100644 --- a/src/displayapp/screens/settings/Settings.h +++ b/src/displayapp/screens/settings/Settings.h @@ -29,7 +29,7 @@ namespace Pinetime { static constexpr int entriesPerScreen = 4; // Increment this when more space is needed - static constexpr int nScreens = 3; + static constexpr int nScreens = 4; static constexpr std::array entries {{ {Symbols::sun, "Display", Apps::SettingDisplay}, @@ -40,11 +40,14 @@ namespace Pinetime { {Symbols::shoe, "Steps", Apps::SettingSteps}, {Symbols::clock, "Date&Time", Apps::SettingSetDateTime}, {Symbols::batteryHalf, "Battery", Apps::BatteryInfo}, - {Symbols::clock, "Chimes", Apps::SettingChimes}, + {Symbols::check, "QuickRing", Apps::SettingQuickR}, + + {Symbols::clock, "Chimes", Apps::SettingChimes}, {Symbols::tachometer, "Shake Calib.", Apps::SettingShakeThreshold}, {Symbols::check, "Firmware", Apps::FirmwareValidation}, {Symbols::bluetooth, "Bluetooth", Apps::SettingBluetooth}, + {Symbols::list, "About", Apps::SysInfo}, // {Symbols::none, "None", Apps::None},