Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

settings: Add setting for auto-opening apps #2004

Open
wants to merge 5 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions src/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -416,6 +416,7 @@ list(APPEND SOURCE_FILES
displayapp/screens/settings/SettingSetDate.cpp
displayapp/screens/settings/SettingSetTime.cpp
displayapp/screens/settings/SettingChimes.cpp
displayapp/screens/settings/SettingAutoOpen.cpp
displayapp/screens/settings/SettingShakeThreshold.cpp
displayapp/screens/settings/SettingBluetooth.cpp

Expand Down
5 changes: 4 additions & 1 deletion src/components/ble/MusicService.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
*/
#include "components/ble/MusicService.h"
#include "components/ble/NimbleController.h"
#include "systemtask/SystemTask.h"
#include <cstring>

namespace {
Expand Down Expand Up @@ -53,7 +54,8 @@ namespace {
}
}

Pinetime::Controllers::MusicService::MusicService(Pinetime::Controllers::NimbleController& nimble) : nimble(nimble) {
Pinetime::Controllers::MusicService::MusicService(Pinetime::System::SystemTask& systemTask, Pinetime::Controllers::NimbleController& nimble)
: systemTask {systemTask}, nimble(nimble) {
characteristicDefinition[0] = {.uuid = &msEventCharUuid.u,
.access_cb = MusicCallback,
.arg = this,
Expand Down Expand Up @@ -152,6 +154,7 @@ int Pinetime::Controllers::MusicService::OnCommand(struct ble_gatt_access_ctxt*
// These variables need to be updated, because the progress may not be updated immediately,
// leading to getProgress() returning an incorrect position.
if (playing) {
systemTask.PushMessage(Pinetime::System::Messages::OnMusicStarted);
trackProgressUpdateTime = xTaskGetTickCount();
} else {
trackProgress +=
Expand Down
8 changes: 7 additions & 1 deletion src/components/ble/MusicService.h
Original file line number Diff line number Diff line change
Expand Up @@ -27,12 +27,17 @@
#undef min

namespace Pinetime {

namespace System {
class SystemTask;
}

namespace Controllers {
class NimbleController;

class MusicService {
public:
explicit MusicService(NimbleController& nimble);
explicit MusicService(Pinetime::System::SystemTask& systemTask, NimbleController& nimble);

void Init();

Expand Down Expand Up @@ -87,6 +92,7 @@ namespace Pinetime {
bool repeat {false};
bool shuffle {false};

Pinetime::System::SystemTask& systemTask;
NimbleController& nimble;
};
}
Expand Down
4 changes: 3 additions & 1 deletion src/components/ble/NavigationService.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
*/

#include "components/ble/NavigationService.h"
#include "systemtask/SystemTask.h"

namespace {
// 0001yyxx-78fc-48fe-8e23-433b3a1942d0
Expand All @@ -43,7 +44,7 @@ namespace {
}
} // namespace

Pinetime::Controllers::NavigationService::NavigationService() {
Pinetime::Controllers::NavigationService::NavigationService(Pinetime::System::SystemTask& systemTask) : systemTask {systemTask} {
characteristicDefinition[0] = {.uuid = &navFlagCharUuid.u,
.access_cb = NAVCallback,
.arg = this,
Expand Down Expand Up @@ -96,6 +97,7 @@ int Pinetime::Controllers::NavigationService::OnCommand(struct ble_gatt_access_c
} else if (ble_uuid_cmp(ctxt->chr->uuid, &navProgressCharUuid.u) == 0) {
m_progress = data[0];
}
systemTask.PushMessage(Pinetime::System::Messages::OnNavChange);
}
return 0;
}
Expand Down
9 changes: 8 additions & 1 deletion src/components/ble/NavigationService.h
Original file line number Diff line number Diff line change
Expand Up @@ -27,11 +27,16 @@
#undef min

namespace Pinetime {

namespace System {
class SystemTask;
}

namespace Controllers {

class NavigationService {
public:
NavigationService();
explicit NavigationService(Pinetime::System::SystemTask& systemTask);

void Init();

Expand All @@ -53,6 +58,8 @@ namespace Pinetime {
std::string m_narrative;
std::string m_manDist;
int m_progress;

Pinetime::System::SystemTask& systemTask;
};
}
}
3 changes: 2 additions & 1 deletion src/components/ble/NimbleController.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -42,8 +42,9 @@ NimbleController::NimbleController(Pinetime::System::SystemTask& systemTask,
anService {systemTask, notificationManager},
alertNotificationClient {systemTask, notificationManager},
currentTimeService {dateTimeController},
musicService {*this},
musicService {systemTask, *this},
weatherService {dateTimeController},
navService {systemTask},
batteryInformationService {batteryController},
immediateAlertService {systemTask, notificationManager},
heartRateService {*this, heartRateController},
Expand Down
18 changes: 18 additions & 0 deletions src/components/settings/Settings.h
Original file line number Diff line number Diff line change
Expand Up @@ -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 AutoOpen : uint8_t { Battery = 0, Music = 1, Navigation = 2 };
enum class Colors : uint8_t {
White,
Silver,
Expand Down Expand Up @@ -268,6 +269,21 @@ namespace Pinetime {
return getWakeUpModes()[static_cast<size_t>(mode)];
}

void SetAutoOpen(AutoOpen app, bool enabled) {
if (enabled != IsAutoOpenOn(app)) {
settingsChanged = true;
}
settings.autoOpen.set(static_cast<size_t>(app), enabled);
}

bool IsAutoOpenOn(const AutoOpen app) const {
return GetAutoOpen()[static_cast<size_t>(app)];
}

std::bitset<3> GetAutoOpen() const {
return settings.autoOpen;
}

void SetBrightness(Controllers::BrightnessController::Levels level) {
if (level != settings.brightLevel) {
settingsChanged = true;
Expand Down Expand Up @@ -325,6 +341,8 @@ namespace Pinetime {
uint16_t shakeWakeThreshold = 150;

Controllers::BrightnessController::Levels brightLevel = Controllers::BrightnessController::Levels::Medium;

std::bitset<3> autoOpen {0b000};
};

SettingsData settings;
Expand Down
46 changes: 45 additions & 1 deletion src/displayapp/DisplayApp.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,7 @@
#include "displayapp/screens/settings/SettingSteps.h"
#include "displayapp/screens/settings/SettingSetDateTime.h"
#include "displayapp/screens/settings/SettingChimes.h"
#include "displayapp/screens/settings/SettingAutoOpen.h"
#include "displayapp/screens/settings/SettingShakeThreshold.h"
#include "displayapp/screens/settings/SettingBluetooth.h"

Expand Down Expand Up @@ -322,6 +323,22 @@ void DisplayApp::Refresh() {
case Messages::NewNotification:
LoadNewScreen(Apps::NotificationsPreview, DisplayApp::FullRefreshDirections::Down);
break;
case Messages::MusicStarted:
if (currentApp == Apps::Clock && AppAvailable(Apps::Music)) {
if (state != States::Running) {
PushMessageToSystemTask(System::Messages::GoToRunning);
}
LoadNewScreen(Apps::Music, DisplayApp::FullRefreshDirections::Up);
}
break;
case Messages::NavStarted:
if (currentApp == Apps::Clock && AppAvailable(Apps::Navigation)) {
if (state != States::Running) {
PushMessageToSystemTask(System::Messages::GoToRunning);
}
LoadNewScreen(Apps::Navigation, DisplayApp::FullRefreshDirections::Up);
}
break;
case Messages::TimerDone:
if (state != States::Running) {
PushMessageToSystemTask(System::Messages::GoToRunning);
Expand Down Expand Up @@ -437,7 +454,24 @@ void DisplayApp::Refresh() {
motorController.RunForDuration(35);
break;
case Messages::OnChargingEvent:
motorController.RunForDuration(15);
switch (currentApp) {
case Apps::Clock:
if (batteryController.IsCharging() && settingsController.IsAutoOpenOn(Controllers::Settings::AutoOpen::Battery)) {
// Open the battery app if on the clock screen
LoadNewScreen(Apps::BatteryInfo, DisplayApp::FullRefreshDirections::None);
}
break;
case Apps::BatteryInfo:
if (!batteryController.IsCharging()) {
// Close the battery app after being unplugged
LoadNewScreen(Apps::Clock, DisplayApp::FullRefreshDirections::None);
}
break;
default:
// Vibrate normally otherwise as to not close any open app
motorController.RunForDuration(15);
break;
}
break;
}
}
Expand Down Expand Up @@ -576,6 +610,9 @@ void DisplayApp::LoadScreen(Apps app, DisplayApp::FullRefreshDirections directio
case Apps::SettingChimes:
currentScreen = std::make_unique<Screens::SettingChimes>(settingsController);
break;
case Apps::SettingAutoOpen:
currentScreen = std::make_unique<Screens::SettingAutoOpen>(settingsController);
break;
case Apps::SettingShakeThreshold:
currentScreen = std::make_unique<Screens::SettingShakeThreshold>(settingsController, motionController, *systemTask);
break;
Expand Down Expand Up @@ -614,6 +651,13 @@ void DisplayApp::LoadScreen(Apps app, DisplayApp::FullRefreshDirections directio
currentApp = app;
}

bool DisplayApp::AppAvailable(Apps app) {
const auto* d = std::find_if(userApps.begin(), userApps.end(), [app](const AppDescription& appDescription) {
return appDescription.app == app;
});
return d != userApps.end();
}

void DisplayApp::PushMessage(Messages msg) {
if (in_isr()) {
BaseType_t xHigherPriorityTaskWoken = pdFALSE;
Expand Down
1 change: 1 addition & 0 deletions src/displayapp/DisplayApp.h
Original file line number Diff line number Diff line change
Expand Up @@ -131,6 +131,7 @@ namespace Pinetime {
DisplayApp::FullRefreshDirections nextDirection;
System::BootErrors bootError;
void ApplyBrightness();
bool AppAvailable(Apps app);

static constexpr size_t returnAppStackSize = 10;
Utility::StaticStack<Apps, returnAppStackSize> returnAppStack;
Expand Down
2 changes: 2 additions & 0 deletions src/displayapp/Messages.h
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,8 @@ namespace Pinetime {
ButtonLongerPressed,
ButtonDoubleClicked,
NewNotification,
MusicStarted,
NavStarted,
TimerDone,
BleFirmwareUpdateStarted,
// Resets the screen timeout timer when awake
Expand Down
1 change: 1 addition & 0 deletions src/displayapp/apps/Apps.h.in
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@ namespace Pinetime {
SettingSteps,
SettingSetDateTime,
SettingChimes,
SettingAutoOpen,
SettingShakeThreshold,
SettingBluetooth,
Error
Expand Down
2 changes: 1 addition & 1 deletion src/displayapp/fonts/fonts.json
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
},
{
"file": "FontAwesome5-Solid+Brands+Regular.woff",
"range": "0xf294, 0xf242, 0xf54b, 0xf21e, 0xf1e6, 0xf017, 0xf129, 0xf03a, 0xf185, 0xf560, 0xf001, 0xf3fd, 0xf1fc, 0xf45d, 0xf59f, 0xf5a0, 0xf027, 0xf028, 0xf6a9, 0xf04b, 0xf04c, 0xf048, 0xf051, 0xf095, 0xf3dd, 0xf04d, 0xf2f2, 0xf024, 0xf252, 0xf569, 0xf06e, 0xf015, 0xf00c, 0xf0f3, 0xf522, 0xf743"
"range": "0xf294, 0xf242, 0xf54b, 0xf21e, 0xf1e6, 0xf017, 0xf129, 0xf03a, 0xf185, 0xf560, 0xf001, 0xf3fd, 0xf1fc, 0xf45d, 0xf59f, 0xf5a0, 0xf027, 0xf028, 0xf6a9, 0xf04b, 0xf04c, 0xf048, 0xf051, 0xf095, 0xf3dd, 0xf04d, 0xf2f2, 0xf024, 0xf252, 0xf569, 0xf06e, 0xf015, 0xf00c, 0xf0f3, 0xf522, 0xf743, 0xf0ad"
}
],
"bpp": 1,
Expand Down
1 change: 1 addition & 0 deletions src/displayapp/screens/Symbols.h
Original file line number Diff line number Diff line change
Expand Up @@ -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* wrench = "\xEF\x82\xAD";

// fontawesome_weathericons.c
// static constexpr const char* sun = "\xEF\x86\x85";
Expand Down
75 changes: 75 additions & 0 deletions src/displayapp/screens/settings/SettingAutoOpen.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
#include "displayapp/screens/settings/SettingAutoOpen.h"
#include <lvgl/lvgl.h>
#include "displayapp/DisplayApp.h"
#include "displayapp/screens/Screen.h"
#include "displayapp/screens/Symbols.h"

using namespace Pinetime::Applications::Screens;

constexpr std::array<SettingAutoOpen::Option, 3> SettingAutoOpen::options;

namespace {
void event_handler(lv_obj_t* obj, lv_event_t event) {
auto* screen = static_cast<SettingAutoOpen*>(obj->user_data);
if (event == LV_EVENT_VALUE_CHANGED) {
screen->UpdateSelected(obj);
}
}
}

SettingAutoOpen::SettingAutoOpen(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, "Auto Open");
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::wrench);
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.IsAutoOpenOn(static_cast<Controllers::Settings::AutoOpen>(i))) {
lv_checkbox_set_checked(cbOption[i], true);
}
cbOption[i]->user_data = this;
lv_obj_set_event_cb(cbOption[i], event_handler);
}
}

SettingAutoOpen::~SettingAutoOpen() {
lv_obj_clean(lv_scr_act());
settingsController.SaveSettings();
}

void SettingAutoOpen::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.IsAutoOpenOn(options[i].app);
settingsController.SetAutoOpen(options[i].app, !currentState);
break;
}
}

// Update checkbox according to current apps.
auto apps = settingsController.GetAutoOpen();
for (size_t i = 0; i < options.size(); ++i) {
lv_checkbox_set_checked(cbOption[i], apps[i]);
}
}
Loading
Loading