diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 8d0b792cbd..7a37da12eb 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -417,6 +417,7 @@ list(APPEND SOURCE_FILES displayapp/screens/settings/SettingChimes.cpp displayapp/screens/settings/SettingShakeThreshold.cpp displayapp/screens/settings/SettingBluetooth.cpp + displayapp/screens/settings/SettingDoubleClick.cpp ## Watch faces displayapp/screens/WatchFaceAnalog.cpp diff --git a/src/components/settings/Settings.h b/src/components/settings/Settings.h index 063120774a..bfc5e085da 100644 --- a/src/components/settings/Settings.h +++ b/src/components/settings/Settings.h @@ -14,6 +14,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 DoubleClickAction : uint8_t { GoToNotifications, AudioNext }; enum class Colors : uint8_t { White, Silver, @@ -249,6 +250,16 @@ namespace Pinetime { return settings.wakeUpMode; } + void SetDoubleClickAction(DoubleClickAction action) { + if (settings.doubleClickAction != action) + settingsChanged = true; + settings.doubleClickAction = action; + } + + DoubleClickAction GetDoubleClickAction() { + return settings.doubleClickAction; + } + bool isWakeUpModeOn(const WakeUpMode mode) const { return getWakeUpModes()[static_cast(mode)]; } @@ -308,6 +319,7 @@ namespace Pinetime { uint16_t shakeWakeThreshold = 150; Controllers::BrightnessController::Levels brightLevel = Controllers::BrightnessController::Levels::Medium; + DoubleClickAction doubleClickAction; }; SettingsData settings; diff --git a/src/displayapp/DisplayApp.cpp b/src/displayapp/DisplayApp.cpp index e5329b2d9d..ca8fa93d8a 100644 --- a/src/displayapp/DisplayApp.cpp +++ b/src/displayapp/DisplayApp.cpp @@ -8,6 +8,7 @@ #include "components/ble/BleController.h" #include "components/datetime/DateTimeController.h" #include "components/ble/NotificationManager.h" +#include "components/ble/MusicService.h" #include "components/motion/MotionController.h" #include "components/motor/MotorController.h" #include "displayapp/screens/ApplicationList.h" @@ -48,6 +49,7 @@ #include "displayapp/screens/settings/SettingChimes.h" #include "displayapp/screens/settings/SettingShakeThreshold.h" #include "displayapp/screens/settings/SettingBluetooth.h" +#include "displayapp/screens/settings/SettingDoubleClick.h" #include "libs/lv_conf.h" #include "UserApps.h" @@ -360,9 +362,7 @@ void DisplayApp::Refresh() { LoadNewScreen(Apps::SysInfo, DisplayApp::FullRefreshDirections::Up); break; case Messages::ButtonDoubleClicked: - if (currentApp != Apps::Notifications && currentApp != Apps::NotificationsPreview) { - LoadNewScreen(Apps::Notifications, DisplayApp::FullRefreshDirections::Down); - } + HandleDoubleClick(); break; case Messages::BleFirmwareUpdateStarted: @@ -507,6 +507,9 @@ void DisplayApp::LoadScreen(Apps app, DisplayApp::FullRefreshDirections directio case Apps::SettingWakeUp: currentScreen = std::make_unique(settingsController); break; + case Apps::SettingDoubleClick: + currentScreen = std::make_unique(settingsController); + break; case Apps::SettingDisplay: currentScreen = std::make_unique(this, settingsController); break; @@ -632,3 +635,16 @@ void DisplayApp::ApplyBrightness() { } brightnessController.Set(brightness); } + +void DisplayApp::HandleDoubleClick() { + switch (settingsController.GetDoubleClickAction()) { + case Controllers::Settings::DoubleClickAction::GoToNotifications: + if (currentApp != Apps::Notifications && currentApp != Apps::NotificationsPreview) { + LoadNewScreen(Apps::Notifications, DisplayApp::FullRefreshDirections::Down); + } + break; + case Controllers::Settings::DoubleClickAction::AudioNext: + systemTask->nimble().music().event(Controllers::MusicService::EVENT_MUSIC_NEXT); + break; + } +} diff --git a/src/displayapp/DisplayApp.h b/src/displayapp/DisplayApp.h index 96bce4dd1d..7d0eccbbc7 100644 --- a/src/displayapp/DisplayApp.h +++ b/src/displayapp/DisplayApp.h @@ -129,6 +129,7 @@ namespace Pinetime { DisplayApp::FullRefreshDirections nextDirection; System::BootErrors bootError; void ApplyBrightness(); + void HandleDoubleClick(); static constexpr size_t returnAppStackSize = 10; Utility::StaticStack returnAppStack; diff --git a/src/displayapp/apps/Apps.h.in b/src/displayapp/apps/Apps.h.in index 77d3b366f3..937554310e 100644 --- a/src/displayapp/apps/Apps.h.in +++ b/src/displayapp/apps/Apps.h.in @@ -41,6 +41,7 @@ namespace Pinetime { SettingChimes, SettingShakeThreshold, SettingBluetooth, + SettingDoubleClick, Error, Weather }; diff --git a/src/displayapp/screens/Symbols.h b/src/displayapp/screens/Symbols.h index bd958b285f..f0515f621c 100644 --- a/src/displayapp/screens/Symbols.h +++ b/src/displayapp/screens/Symbols.h @@ -39,6 +39,7 @@ namespace Pinetime { static constexpr const char* eye = "\xEF\x81\xAE"; static constexpr const char* home = "\xEF\x80\x95"; static constexpr const char* sleep = "\xEE\xBD\x84"; + static constexpr const char* angleDoubleRight = "\xEF\x84\x81"; // fontawesome_weathericons.c // static constexpr const char* sun = "\xEF\x86\x85"; diff --git a/src/displayapp/screens/settings/SettingDoubleClick.cpp b/src/displayapp/screens/settings/SettingDoubleClick.cpp new file mode 100644 index 0000000000..f07fcac495 --- /dev/null +++ b/src/displayapp/screens/settings/SettingDoubleClick.cpp @@ -0,0 +1,61 @@ +#include "displayapp/screens/settings/SettingDoubleClick.h" +#include +#include "displayapp/DisplayApp.h" +#include "displayapp/screens/Styles.h" +#include "displayapp/screens/Screen.h" +#include "displayapp/screens/Symbols.h" + +using namespace Pinetime::Applications::Screens; + +namespace { + struct Option { + Pinetime::Controllers::Settings::DoubleClickAction action; + const char* name; + }; + + constexpr std::array options = {{ + {Pinetime::Controllers::Settings::DoubleClickAction::GoToNotifications, "Notifications"}, + {Pinetime::Controllers::Settings::DoubleClickAction::AudioNext, "Audio Next"}, + }}; + + std::array CreateOptionArray() { + std::array optionArray; + for (size_t i = 0; i < CheckboxList::MaxItems; i++) { + if (i >= options.size()) { + optionArray[i].name = ""; + optionArray[i].enabled = false; + } else { + optionArray[i].name = options[i].name; + optionArray[i].enabled = true; + } + } + return optionArray; + } + + uint32_t GetDefaultOption(Pinetime::Controllers::Settings::DoubleClickAction currentOption) { + for (size_t i = 0; i < options.size(); i++) { + if (options[i].action == currentOption) { + return i; + } + } + return 0; + } +} + +SettingDoubleClick::SettingDoubleClick(Pinetime::Controllers::Settings& settingsController) + : checkboxList( + 0, + 1, + "Double Click", + Symbols::angleDoubleRight, + GetDefaultOption(settingsController.GetDoubleClickAction()), + [&settings = settingsController](uint32_t index) { + settings.SetDoubleClickAction(options[index].action); + settings.SaveSettings(); + }, + CreateOptionArray()) { +} + +SettingDoubleClick::~SettingDoubleClick() { + lv_obj_clean(lv_scr_act()); +} diff --git a/src/displayapp/screens/settings/SettingDoubleClick.h b/src/displayapp/screens/settings/SettingDoubleClick.h new file mode 100644 index 0000000000..ecf4599ad8 --- /dev/null +++ b/src/displayapp/screens/settings/SettingDoubleClick.h @@ -0,0 +1,26 @@ +#pragma once + +#include +#include +#include + +#include "components/settings/Settings.h" +#include "displayapp/screens/Screen.h" +#include "displayapp/screens/CheckboxList.h" + +namespace Pinetime { + + namespace Applications { + namespace Screens { + + class SettingDoubleClick : public Screen { + public: + SettingDoubleClick(Pinetime::Controllers::Settings& settingsController); + ~SettingDoubleClick() override; + + private: + CheckboxList checkboxList; + }; + } + } +} diff --git a/src/displayapp/screens/settings/Settings.h b/src/displayapp/screens/settings/Settings.h index a21b4ccd85..2f7bd463ac 100644 --- a/src/displayapp/screens/settings/Settings.h +++ b/src/displayapp/screens/settings/Settings.h @@ -34,9 +34,10 @@ namespace Pinetime { static constexpr std::array entries {{ {Symbols::sun, "Display", Apps::SettingDisplay}, {Symbols::eye, "Wake Up", Apps::SettingWakeUp}, + {Symbols::angleDoubleRight, "Double Click", Apps::SettingDoubleClick}, {Symbols::clock, "Time format", Apps::SettingTimeFormat}, - {Symbols::home, "Watch face", Apps::SettingWatchFace}, + {Symbols::home, "Watch face", Apps::SettingWatchFace}, {Symbols::shoe, "Steps", Apps::SettingSteps}, {Symbols::clock, "Date&Time", Apps::SettingSetDateTime}, {Symbols::cloudSunRain, "Weather", Apps::SettingWeatherFormat},