Add airplane mode feature
Implements 'Airplane mode' feature to disable and enable bluetooth/ble Adds airplaneMode as a non-persisted setting Adds a setting menu for switching airplane mode on and off Displays an airplane symbol on the Digital watch face and the PineTimeStyle watch face when airplane mode is enabled Always enables bluetooth/ble on boot (disable airplane mode) Alphabetizes the settings menu options Style cleanups Closes #632
This commit is contained in:
@@ -2,9 +2,11 @@
|
||||
#include "displayapp/screens/Symbols.h"
|
||||
using namespace Pinetime::Applications::Screens;
|
||||
|
||||
const char* BleIcon::GetIcon(bool isConnected) {
|
||||
if (isConnected)
|
||||
const char* BleIcon::GetIcon(Pinetime::Controllers::Ble::ConnectStates state) {
|
||||
if (state == Pinetime::Controllers::Ble::ConnectStates::Connected)
|
||||
return Symbols::bluetooth;
|
||||
else if (state == Pinetime::Controllers::Ble::ConnectStates::Airplane)
|
||||
return Symbols::airplane;
|
||||
else
|
||||
return "";
|
||||
}
|
||||
return Symbols::none;
|
||||
}
|
||||
|
@@ -1,12 +1,14 @@
|
||||
#pragma once
|
||||
|
||||
#include "components/ble/BleController.h"
|
||||
|
||||
namespace Pinetime {
|
||||
namespace Applications {
|
||||
namespace Screens {
|
||||
class BleIcon {
|
||||
public:
|
||||
static const char* GetIcon(bool isConnected);
|
||||
static const char* GetIcon(Pinetime::Controllers::Ble::ConnectStates state);
|
||||
};
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -208,10 +208,10 @@ void PineTimeStyle::SetBatteryIcon() {
|
||||
}
|
||||
|
||||
void PineTimeStyle::AlignIcons() {
|
||||
if (notificationState.Get() && bleState.Get()) {
|
||||
if (notificationState.Get() && bleState.Get() != Pinetime::Controllers::Ble::ConnectStates::Disconnected) {
|
||||
lv_obj_align(bleIcon, sidebar, LV_ALIGN_IN_TOP_MID, 8, 25);
|
||||
lv_obj_align(notificationIcon, sidebar, LV_ALIGN_IN_TOP_MID, -8, 25);
|
||||
} else if (notificationState.Get() && !bleState.Get()) {
|
||||
} else if (notificationState.Get() && bleState.Get() == Pinetime::Controllers::Ble::ConnectStates::Disconnected) {
|
||||
lv_obj_align(notificationIcon, sidebar, LV_ALIGN_IN_TOP_MID, 0, 25);
|
||||
} else {
|
||||
lv_obj_align(bleIcon, sidebar, LV_ALIGN_IN_TOP_MID, 0, 25);
|
||||
@@ -234,7 +234,7 @@ void PineTimeStyle::Refresh() {
|
||||
}
|
||||
}
|
||||
|
||||
bleState = bleController.IsConnected();
|
||||
bleState = bleController.GetConnectState();
|
||||
if (bleState.IsUpdated()) {
|
||||
lv_label_set_text(bleIcon, BleIcon::GetIcon(bleState.Get()));
|
||||
AlignIcons();
|
||||
|
@@ -6,6 +6,7 @@
|
||||
#include <memory>
|
||||
#include "displayapp/screens/Screen.h"
|
||||
#include "components/datetime/DateTimeController.h"
|
||||
#include "components/ble/BleController.h"
|
||||
|
||||
namespace Pinetime {
|
||||
namespace Controllers {
|
||||
@@ -36,13 +37,13 @@ namespace Pinetime {
|
||||
char displayedChar[5];
|
||||
|
||||
uint16_t currentYear = 1970;
|
||||
Pinetime::Controllers::DateTime::Months currentMonth = Pinetime::Controllers::DateTime::Months::Unknown;
|
||||
Pinetime::Controllers::DateTime::Days currentDayOfWeek = Pinetime::Controllers::DateTime::Days::Unknown;
|
||||
Controllers::DateTime::Months currentMonth = Pinetime::Controllers::DateTime::Months::Unknown;
|
||||
Controllers::DateTime::Days currentDayOfWeek = Pinetime::Controllers::DateTime::Days::Unknown;
|
||||
uint8_t currentDay = 0;
|
||||
|
||||
DirtyValue<uint8_t> batteryPercentRemaining {};
|
||||
DirtyValue<bool> isCharging {};
|
||||
DirtyValue<bool> bleState {};
|
||||
DirtyValue<Controllers::Ble::ConnectStates> bleState {};
|
||||
DirtyValue<std::chrono::time_point<std::chrono::system_clock, std::chrono::nanoseconds>> currentDateTime {};
|
||||
DirtyValue<bool> motionSensorOk {};
|
||||
DirtyValue<uint32_t> stepCount {};
|
||||
|
@@ -44,6 +44,7 @@ namespace Pinetime {
|
||||
static constexpr const char* chartLine = "\xEF\x88\x81";
|
||||
static constexpr const char* eye = "\xEF\x81\xAE";
|
||||
static constexpr const char* home = "\xEF\x80\x95";
|
||||
static constexpr const char* airplane = "\xEF\x81\xB2";
|
||||
|
||||
// lv_font_sys_48.c
|
||||
static constexpr const char* settings = "\xEE\xA4\x82"; // e902
|
||||
|
@@ -119,7 +119,7 @@ void WatchFaceDigital::Refresh() {
|
||||
lv_label_set_text(batteryIcon, BatteryIcon::GetBatteryIcon(batteryPercent));
|
||||
}
|
||||
|
||||
bleState = bleController.IsConnected();
|
||||
bleState = bleController.GetConnectState();
|
||||
if (bleState.IsUpdated()) {
|
||||
lv_label_set_text(bleIcon, BleIcon::GetIcon(bleState.Get()));
|
||||
}
|
||||
|
@@ -6,6 +6,7 @@
|
||||
#include <memory>
|
||||
#include "displayapp/screens/Screen.h"
|
||||
#include "components/datetime/DateTimeController.h"
|
||||
#include "components/ble/BleController.h"
|
||||
|
||||
namespace Pinetime {
|
||||
namespace Controllers {
|
||||
@@ -38,13 +39,13 @@ namespace Pinetime {
|
||||
char displayedChar[5] {};
|
||||
|
||||
uint16_t currentYear = 1970;
|
||||
Pinetime::Controllers::DateTime::Months currentMonth = Pinetime::Controllers::DateTime::Months::Unknown;
|
||||
Pinetime::Controllers::DateTime::Days currentDayOfWeek = Pinetime::Controllers::DateTime::Days::Unknown;
|
||||
Controllers::DateTime::Months currentMonth = Pinetime::Controllers::DateTime::Months::Unknown;
|
||||
Controllers::DateTime::Days currentDayOfWeek = Pinetime::Controllers::DateTime::Days::Unknown;
|
||||
uint8_t currentDay = 0;
|
||||
|
||||
DirtyValue<uint8_t> batteryPercentRemaining {};
|
||||
DirtyValue<bool> powerPresent {};
|
||||
DirtyValue<bool> bleState {};
|
||||
DirtyValue<Controllers::Ble::ConnectStates> bleState {};
|
||||
DirtyValue<std::chrono::time_point<std::chrono::system_clock, std::chrono::nanoseconds>> currentDateTime {};
|
||||
DirtyValue<bool> motionSensorOk {};
|
||||
DirtyValue<uint32_t> stepCount {};
|
||||
|
89
src/displayapp/screens/settings/SettingAirplaneMode.cpp
Normal file
89
src/displayapp/screens/settings/SettingAirplaneMode.cpp
Normal file
@@ -0,0 +1,89 @@
|
||||
#include "displayapp/screens/settings/SettingAirplaneMode.h"
|
||||
#include <lvgl/lvgl.h>
|
||||
#include "displayapp/DisplayApp.h"
|
||||
#include "displayapp/Messages.h"
|
||||
#include "displayapp/screens/Styles.h"
|
||||
#include "displayapp/screens/Screen.h"
|
||||
#include "displayapp/screens/Symbols.h"
|
||||
|
||||
using namespace Pinetime::Applications::Screens;
|
||||
|
||||
namespace {
|
||||
static void event_handler(lv_obj_t* obj, lv_event_t event) {
|
||||
SettingAirplaneMode* screen = static_cast<SettingAirplaneMode*>(obj->user_data);
|
||||
screen->UpdateSelected(obj, event);
|
||||
}
|
||||
}
|
||||
|
||||
constexpr std::array<const char*, 2> SettingAirplaneMode::options;
|
||||
|
||||
SettingAirplaneMode::SettingAirplaneMode(Pinetime::Applications::DisplayApp* app, Pinetime::Controllers::Settings& settingsController)
|
||||
: Screen(app), 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, 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, "Airplane mode");
|
||||
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::airplane);
|
||||
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]);
|
||||
cbOption[i]->user_data = this;
|
||||
lv_obj_set_event_cb(cbOption[i], event_handler);
|
||||
SetRadioButtonStyle(cbOption[i]);
|
||||
}
|
||||
|
||||
if (settingsController.GetAirplaneMode() == false) {
|
||||
lv_checkbox_set_checked(cbOption[0], true);
|
||||
priorMode = false;
|
||||
} else {
|
||||
lv_checkbox_set_checked(cbOption[1], true);
|
||||
priorMode = true;
|
||||
}
|
||||
}
|
||||
|
||||
SettingAirplaneMode::~SettingAirplaneMode() {
|
||||
lv_obj_clean(lv_scr_act());
|
||||
// Do not call SaveSettings - see src/components/settings/Settings.h
|
||||
if (priorMode != settingsController.GetAirplaneMode()) {
|
||||
app->PushMessage(Pinetime::Applications::Display::Messages::AirplaneModeToggle);
|
||||
}
|
||||
}
|
||||
|
||||
void SettingAirplaneMode::UpdateSelected(lv_obj_t* object, lv_event_t event) {
|
||||
if (event == LV_EVENT_VALUE_CHANGED) {
|
||||
for (unsigned int i = 0; i < options.size(); i++) {
|
||||
if (object == cbOption[i]) {
|
||||
lv_checkbox_set_checked(cbOption[i], true);
|
||||
|
||||
if (i == 0) {
|
||||
settingsController.SetAirplaneMode(false);
|
||||
};
|
||||
if (i == 1) {
|
||||
settingsController.SetAirplaneMode(true);
|
||||
};
|
||||
|
||||
} else {
|
||||
lv_checkbox_set_checked(cbOption[i], false);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
30
src/displayapp/screens/settings/SettingAirplaneMode.h
Normal file
30
src/displayapp/screens/settings/SettingAirplaneMode.h
Normal file
@@ -0,0 +1,30 @@
|
||||
#pragma once
|
||||
|
||||
#include <array>
|
||||
#include <cstdint>
|
||||
#include <lvgl/lvgl.h>
|
||||
|
||||
#include "components/settings/Settings.h"
|
||||
#include "displayapp/screens/Screen.h"
|
||||
|
||||
namespace Pinetime {
|
||||
|
||||
namespace Applications {
|
||||
namespace Screens {
|
||||
|
||||
class SettingAirplaneMode : public Screen {
|
||||
public:
|
||||
SettingAirplaneMode(DisplayApp* app, Pinetime::Controllers::Settings& settingsController);
|
||||
~SettingAirplaneMode() override;
|
||||
|
||||
void UpdateSelected(lv_obj_t* object, lv_event_t event);
|
||||
|
||||
private:
|
||||
static constexpr std::array<const char*, 2> options = {" No", " Yes"};
|
||||
Controllers::Settings& settingsController;
|
||||
lv_obj_t* cbOption[options.size()];
|
||||
bool priorMode;
|
||||
};
|
||||
}
|
||||
}
|
||||
}
|
@@ -36,10 +36,10 @@ bool Settings::OnTouchEvent(Pinetime::Applications::TouchEvents event) {
|
||||
std::unique_ptr<Screen> Settings::CreateScreen1() {
|
||||
|
||||
std::array<Screens::List::Applications, 4> applications {{
|
||||
{Symbols::sun, "Display", Apps::SettingDisplay},
|
||||
{Symbols::eye, "Wake Up", Apps::SettingWakeUp},
|
||||
{Symbols::clock, "Time format", Apps::SettingTimeFormat},
|
||||
{Symbols::home, "Watch face", Apps::SettingWatchFace},
|
||||
{Symbols::list, "About", Apps::SysInfo},
|
||||
{Symbols::airplane, "Airplane mode", Apps::SettingAirplaneMode},
|
||||
{Symbols::batteryHalf, "Battery", Apps::BatteryInfo},
|
||||
{Symbols::sun, "Display", Apps::SettingDisplay}
|
||||
}};
|
||||
|
||||
return std::make_unique<Screens::List>(0, 3, app, settingsController, applications);
|
||||
@@ -48,10 +48,10 @@ std::unique_ptr<Screen> Settings::CreateScreen1() {
|
||||
std::unique_ptr<Screen> Settings::CreateScreen2() {
|
||||
|
||||
std::array<Screens::List::Applications, 4> applications {{
|
||||
{Symbols::shoe, "Steps", Apps::SettingSteps},
|
||||
{Symbols::check, "Firmware", Apps::FirmwareValidation},
|
||||
{Symbols::paintbrush, "PTS colors", Apps::SettingPineTimeStyle},
|
||||
{Symbols::clock, "Set date", Apps::SettingSetDate},
|
||||
{Symbols::clock, "Set time", Apps::SettingSetTime},
|
||||
{Symbols::batteryHalf, "Battery", Apps::BatteryInfo}
|
||||
{Symbols::clock, "Set time", Apps::SettingSetTime}
|
||||
}};
|
||||
|
||||
return std::make_unique<Screens::List>(1, 3, app, settingsController, applications);
|
||||
@@ -60,10 +60,10 @@ std::unique_ptr<Screen> Settings::CreateScreen2() {
|
||||
std::unique_ptr<Screen> Settings::CreateScreen3() {
|
||||
|
||||
std::array<Screens::List::Applications, 4> applications {{
|
||||
{Symbols::paintbrush, "PTS Colors", Apps::SettingPineTimeStyle},
|
||||
{Symbols::check, "Firmware", Apps::FirmwareValidation},
|
||||
{Symbols::list, "About", Apps::SysInfo},
|
||||
{Symbols::none, "None", Apps::None},
|
||||
{Symbols::shoe, "Steps", Apps::SettingSteps},
|
||||
{Symbols::clock, "Time format", Apps::SettingTimeFormat},
|
||||
{Symbols::eye, "Wake up", Apps::SettingWakeUp},
|
||||
{Symbols::home, "Watch face", Apps::SettingWatchFace}
|
||||
}};
|
||||
|
||||
return std::make_unique<Screens::List>(2, 3, app, settingsController, applications);
|
||||
|
Reference in New Issue
Block a user