From 28f45caa11e0adbb208ba65b88b7ea399d584ba7 Mon Sep 17 00:00:00 2001 From: Michele Bini Date: Thu, 14 Apr 2022 14:01:14 +0200 Subject: Reduce battery usage by turning the backlight back to the normal setting when the flashlight is turned off by tapping the screen. Start the app with the flashlight on. Simplify code. diff --git a/src/displayapp/screens/FlashLight.cpp b/src/displayapp/screens/FlashLight.cpp index c4d0264..3f90750 100644 --- a/src/displayapp/screens/FlashLight.cpp +++ b/src/displayapp/screens/FlashLight.cpp @@ -9,6 +9,8 @@ namespace { auto* screen = static_cast(obj->user_data); screen->OnClickEvent(obj, event); } + + typedef Pinetime::Controllers::BrightnessController::Levels Levels; } FlashLight::FlashLight(Pinetime::Applications::DisplayApp* app, @@ -19,8 +21,6 @@ FlashLight::FlashLight(Pinetime::Applications::DisplayApp* app, brightnessController {brightnessController} { - brightnessController.Backup(); - brightnessLevel = brightnessController.Level(); flashLight = lv_label_create(lv_scr_act(), nullptr); @@ -38,8 +38,7 @@ FlashLight::FlashLight(Pinetime::Applications::DisplayApp* app, lv_obj_align(indicators[0], indicators[1], LV_ALIGN_OUT_LEFT_MID, -8, 0); lv_obj_align(indicators[2], indicators[1], LV_ALIGN_OUT_RIGHT_MID, 8, 0); - SetIndicators(); - SetColors(); + Update(true, brightnessLevel); backgroundAction = lv_label_create(lv_scr_act(), nullptr); lv_label_set_long_mode(backgroundAction, LV_LABEL_LONG_CROP); @@ -49,56 +48,60 @@ FlashLight::FlashLight(Pinetime::Applications::DisplayApp* app, lv_obj_set_click(backgroundAction, true); backgroundAction->user_data = this; lv_obj_set_event_cb(backgroundAction, event_handler); - systemTask.PushMessage(Pinetime::System::Messages::DisableSleeping); } FlashLight::~FlashLight() { + Update(false, brightnessLevel); lv_obj_clean(lv_scr_act()); - lv_obj_set_style_local_bg_color(lv_scr_act(), LV_OBJ_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_BLACK); - brightnessController.Restore(); systemTask.PushMessage(Pinetime::System::Messages::EnableSleeping); } -void FlashLight::SetColors() { - if (isOn) { - lv_obj_set_style_local_bg_color(lv_scr_act(), LV_OBJ_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_WHITE); - lv_obj_set_style_local_text_color(flashLight, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_GRAY); - for (auto & i : indicators) { - lv_obj_set_style_local_bg_color(i, LV_OBJ_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_GRAY); - lv_obj_set_style_local_bg_color(i, LV_OBJ_PART_MAIN, LV_STATE_DISABLED, LV_COLOR_WHITE); - lv_obj_set_style_local_border_color(i, LV_OBJ_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_GRAY); - } - } else { - lv_obj_set_style_local_bg_color(lv_scr_act(), LV_OBJ_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_BLACK); - lv_obj_set_style_local_text_color(flashLight, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_WHITE); - for (auto & i : indicators) { - lv_obj_set_style_local_bg_color(i, LV_OBJ_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_WHITE); - lv_obj_set_style_local_bg_color(i, LV_OBJ_PART_MAIN, LV_STATE_DISABLED, LV_COLOR_BLACK); - lv_obj_set_style_local_border_color(i, LV_OBJ_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_WHITE); - } - } -} - -void FlashLight::SetIndicators() { - using namespace Pinetime::Controllers; - - if (brightnessLevel == BrightnessController::Levels::High) { +void FlashLight::Update(bool on, Controllers::BrightnessController::Levels level) { + brightnessLevel = level; + + if (brightnessLevel == Controllers::BrightnessController::Levels::High) { lv_obj_set_state(indicators[1], LV_STATE_DEFAULT); lv_obj_set_state(indicators[2], LV_STATE_DEFAULT); - } else if (brightnessLevel == BrightnessController::Levels::Medium) { + } else if (brightnessLevel == Controllers::BrightnessController::Levels::Medium) { lv_obj_set_state(indicators[1], LV_STATE_DEFAULT); lv_obj_set_state(indicators[2], LV_STATE_DISABLED); } else { lv_obj_set_state(indicators[1], LV_STATE_DISABLED); lv_obj_set_state(indicators[2], LV_STATE_DISABLED); } + + if (on != isOn) { + isOn = on; + if (isOn) { + brightnessController.Backup(); + lv_obj_set_style_local_bg_color(lv_scr_act(), LV_OBJ_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_WHITE); + lv_obj_set_style_local_text_color(flashLight, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_GRAY); + for (auto & i : indicators) { + lv_obj_set_style_local_bg_color(i, LV_OBJ_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_GRAY); + lv_obj_set_style_local_bg_color(i, LV_OBJ_PART_MAIN, LV_STATE_DISABLED, LV_COLOR_WHITE); + lv_obj_set_style_local_border_color(i, LV_OBJ_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_GRAY); + } + } else { + brightnessController.Restore(); + lv_obj_set_style_local_bg_color(lv_scr_act(), LV_OBJ_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_BLACK); + lv_obj_set_style_local_text_color(flashLight, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_WHITE); + for (auto & i : indicators) { + lv_obj_set_style_local_bg_color(i, LV_OBJ_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_WHITE); + lv_obj_set_style_local_bg_color(i, LV_OBJ_PART_MAIN, LV_STATE_DISABLED, LV_COLOR_BLACK); + lv_obj_set_style_local_border_color(i, LV_OBJ_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_WHITE); + } + } + } + + if (isOn) { + brightnessController.Set(brightnessLevel); + } } void FlashLight::OnClickEvent(lv_obj_t* obj, lv_event_t event) { if (obj == backgroundAction && event == LV_EVENT_CLICKED) { - isOn = !isOn; - SetColors(); + Update(!isOn, brightnessLevel); } } @@ -106,26 +109,15 @@ bool FlashLight::OnTouchEvent(Pinetime::Applications::TouchEvents event) { using namespace Pinetime::Controllers; if (event == TouchEvents::SwipeLeft) { - if (brightnessLevel == BrightnessController::Levels::High) { - brightnessLevel = BrightnessController::Levels::Medium; - brightnessController.Set(brightnessLevel); - SetIndicators(); - } else if (brightnessLevel == BrightnessController::Levels::Medium) { - brightnessLevel = BrightnessController::Levels::Low; - brightnessController.Set(brightnessLevel); - SetIndicators(); + if (brightnessLevel >= Levels::Medium) { + Update(isOn, static_cast( static_cast< std::underlying_type_t >(brightnessLevel) - 1) ); } return true; } + if (event == TouchEvents::SwipeRight) { - if (brightnessLevel == BrightnessController::Levels::Low) { - brightnessLevel = BrightnessController::Levels::Medium; - brightnessController.Set(brightnessLevel); - SetIndicators(); - } else if (brightnessLevel == BrightnessController::Levels::Medium) { - brightnessLevel = BrightnessController::Levels::High; - brightnessController.Set(brightnessLevel); - SetIndicators(); + if (brightnessLevel <= Levels::Medium) { + Update(isOn, static_cast( static_cast< std::underlying_type_t >(brightnessLevel) + 1) ); } return true; } diff --git a/src/displayapp/screens/FlashLight.h b/src/displayapp/screens/FlashLight.h index e91a103..76dda78 100644 --- a/src/displayapp/screens/FlashLight.h +++ b/src/displayapp/screens/FlashLight.h @@ -20,8 +20,7 @@ namespace Pinetime { void OnClickEvent(lv_obj_t* obj, lv_event_t event); private: - void SetIndicators(); - void SetColors(); + void Update(bool on, Pinetime::Controllers::BrightnessController::Levels level); Pinetime::System::SystemTask& systemTask; Controllers::BrightnessController& brightnessController; -- cgit v0.10.2