Loading ui.cpp +105 −24 Original line number Diff line number Diff line Loading @@ -32,7 +32,11 @@ #include <string> #include <android-base/file.h> #include <android-base/logging.h> #include <android-base/parseint.h> #include <android-base/properties.h> #include <android-base/strings.h> #include <cutils/android_reboot.h> #include <minui/minui.h> Loading @@ -40,11 +44,15 @@ #include "roots.h" #include "device.h" #define UI_WAIT_KEY_TIMEOUT_SEC 120 static constexpr int UI_WAIT_KEY_TIMEOUT_SEC = 120; static constexpr const char* BRIGHTNESS_FILE = "/sys/class/leds/lcd-backlight/brightness"; static constexpr const char* MAX_BRIGHTNESS_FILE = "/sys/class/leds/lcd-backlight/max_brightness"; RecoveryUI::RecoveryUI() : locale_(""), rtl_locale_(false), brightness_normal_(50), brightness_dimmed_(25), key_queue_len(0), key_last_down(-1), key_long_press(false), Loading @@ -54,7 +62,8 @@ RecoveryUI::RecoveryUI() last_key(-1), has_power_key(false), has_up_key(false), has_down_key(false) { has_down_key(false), screensaver_state_(ScreensaverState::DISABLED) { pthread_mutex_init(&key_queue_mutex, nullptr); pthread_cond_init(&key_queue_cond, nullptr); memset(key_pressed, 0, sizeof(key_pressed)); Loading @@ -80,6 +89,40 @@ static void* InputThreadLoop(void*) { return nullptr; } bool RecoveryUI::InitScreensaver() { // Disabled. if (brightness_normal_ == 0 || brightness_dimmed_ > brightness_normal_) { return false; } // Set the initial brightness level based on the max brightness. Note that reading the initial // value from BRIGHTNESS_FILE doesn't give the actual brightness value (bullhead, sailfish), so // we don't have a good way to query the default value. std::string content; if (!android::base::ReadFileToString(MAX_BRIGHTNESS_FILE, &content)) { LOG(WARNING) << "Failed to read max brightness: " << content; return false; } unsigned int max_value; if (!android::base::ParseUint(android::base::Trim(content), &max_value)) { LOG(WARNING) << "Failed to parse max brightness: " << content; return false; } brightness_normal_value_ = max_value * brightness_normal_ / 100.0; brightness_dimmed_value_ = max_value * brightness_dimmed_ / 100.0; if (!android::base::WriteStringToFile(std::to_string(brightness_normal_value_), BRIGHTNESS_FILE)) { PLOG(WARNING) << "Failed to set brightness"; return false; } LOG(INFO) << "Brightness: " << brightness_normal_value_ << " (" << brightness_normal_ << "%)"; screensaver_state_ = ScreensaverState::NORMAL; return true; } bool RecoveryUI::Init(const std::string& locale) { // Set up the locale info. SetLocale(locale); Loading @@ -88,6 +131,10 @@ bool RecoveryUI::Init(const std::string& locale) { ev_iterate_available_keys(std::bind(&RecoveryUI::OnKeyDetected, this, std::placeholders::_1)); if (!InitScreensaver()) { LOG(INFO) << "Screensaver disabled"; } pthread_create(&input_thread_, nullptr, InputThreadLoop, nullptr); return true; } Loading Loading @@ -236,6 +283,40 @@ int RecoveryUI::WaitKey() { while (key_queue_len == 0 && rc != ETIMEDOUT) { rc = pthread_cond_timedwait(&key_queue_cond, &key_queue_mutex, &timeout); } if (screensaver_state_ != ScreensaverState::DISABLED) { if (rc == ETIMEDOUT) { // Lower the brightness level: NORMAL -> DIMMED; DIMMED -> OFF. if (screensaver_state_ == ScreensaverState::NORMAL) { if (android::base::WriteStringToFile(std::to_string(brightness_dimmed_value_), BRIGHTNESS_FILE)) { LOG(INFO) << "Brightness: " << brightness_dimmed_value_ << " (" << brightness_dimmed_ << "%)"; screensaver_state_ = ScreensaverState::DIMMED; } } else if (screensaver_state_ == ScreensaverState::DIMMED) { if (android::base::WriteStringToFile("0", BRIGHTNESS_FILE)) { LOG(INFO) << "Brightness: 0 (off)"; screensaver_state_ = ScreensaverState::OFF; } } } else if (screensaver_state_ != ScreensaverState::NORMAL) { // Drop the first key if it's changing from OFF to NORMAL. if (screensaver_state_ == ScreensaverState::OFF) { if (key_queue_len > 0) { memcpy(&key_queue[0], &key_queue[1], sizeof(int) * --key_queue_len); } } // Reset the brightness to normal. if (android::base::WriteStringToFile(std::to_string(brightness_normal_value_), BRIGHTNESS_FILE)) { screensaver_state_ = ScreensaverState::NORMAL; LOG(INFO) << "Brightness: " << brightness_normal_value_ << " (" << brightness_normal_ << "%)"; } } } } while (IsUsbConnected() && key_queue_len == 0); int key = -1; Loading Loading @@ -330,7 +411,7 @@ RecoveryUI::KeyAction RecoveryUI::CheckKey(int key, bool is_long_press) { } last_key = key; return IsTextVisible() ? ENQUEUE : IGNORE; return (IsTextVisible() || screensaver_state_ == ScreensaverState::OFF) ? ENQUEUE : IGNORE; } void RecoveryUI::KeyLongPress(int) { Loading ui.h +15 −0 Original line number Diff line number Diff line Loading @@ -130,6 +130,13 @@ class RecoveryUI { std::string locale_; bool rtl_locale_; // The normal and dimmed brightness percentages (default: 50 and 25, which means 50% and 25% // of the max_brightness). Because the absolute values may vary across devices. These two // values can be configured via subclassing. Setting brightness_normal_ to 0 to disable // screensaver. unsigned int brightness_normal_; unsigned int brightness_dimmed_; private: // Key event input queue pthread_mutex_t key_queue_mutex; Loading Loading @@ -167,6 +174,14 @@ class RecoveryUI { void time_key(int key_code, int count); void SetLocale(const std::string&); enum class ScreensaverState { DISABLED, NORMAL, DIMMED, OFF }; ScreensaverState screensaver_state_; // The following two contain the absolute values computed from brightness_normal_ and // brightness_dimmed_ respectively. unsigned int brightness_normal_value_; unsigned int brightness_dimmed_value_; bool InitScreensaver(); }; #endif // RECOVERY_UI_H Loading
ui.cpp +105 −24 Original line number Diff line number Diff line Loading @@ -32,7 +32,11 @@ #include <string> #include <android-base/file.h> #include <android-base/logging.h> #include <android-base/parseint.h> #include <android-base/properties.h> #include <android-base/strings.h> #include <cutils/android_reboot.h> #include <minui/minui.h> Loading @@ -40,11 +44,15 @@ #include "roots.h" #include "device.h" #define UI_WAIT_KEY_TIMEOUT_SEC 120 static constexpr int UI_WAIT_KEY_TIMEOUT_SEC = 120; static constexpr const char* BRIGHTNESS_FILE = "/sys/class/leds/lcd-backlight/brightness"; static constexpr const char* MAX_BRIGHTNESS_FILE = "/sys/class/leds/lcd-backlight/max_brightness"; RecoveryUI::RecoveryUI() : locale_(""), rtl_locale_(false), brightness_normal_(50), brightness_dimmed_(25), key_queue_len(0), key_last_down(-1), key_long_press(false), Loading @@ -54,7 +62,8 @@ RecoveryUI::RecoveryUI() last_key(-1), has_power_key(false), has_up_key(false), has_down_key(false) { has_down_key(false), screensaver_state_(ScreensaverState::DISABLED) { pthread_mutex_init(&key_queue_mutex, nullptr); pthread_cond_init(&key_queue_cond, nullptr); memset(key_pressed, 0, sizeof(key_pressed)); Loading @@ -80,6 +89,40 @@ static void* InputThreadLoop(void*) { return nullptr; } bool RecoveryUI::InitScreensaver() { // Disabled. if (brightness_normal_ == 0 || brightness_dimmed_ > brightness_normal_) { return false; } // Set the initial brightness level based on the max brightness. Note that reading the initial // value from BRIGHTNESS_FILE doesn't give the actual brightness value (bullhead, sailfish), so // we don't have a good way to query the default value. std::string content; if (!android::base::ReadFileToString(MAX_BRIGHTNESS_FILE, &content)) { LOG(WARNING) << "Failed to read max brightness: " << content; return false; } unsigned int max_value; if (!android::base::ParseUint(android::base::Trim(content), &max_value)) { LOG(WARNING) << "Failed to parse max brightness: " << content; return false; } brightness_normal_value_ = max_value * brightness_normal_ / 100.0; brightness_dimmed_value_ = max_value * brightness_dimmed_ / 100.0; if (!android::base::WriteStringToFile(std::to_string(brightness_normal_value_), BRIGHTNESS_FILE)) { PLOG(WARNING) << "Failed to set brightness"; return false; } LOG(INFO) << "Brightness: " << brightness_normal_value_ << " (" << brightness_normal_ << "%)"; screensaver_state_ = ScreensaverState::NORMAL; return true; } bool RecoveryUI::Init(const std::string& locale) { // Set up the locale info. SetLocale(locale); Loading @@ -88,6 +131,10 @@ bool RecoveryUI::Init(const std::string& locale) { ev_iterate_available_keys(std::bind(&RecoveryUI::OnKeyDetected, this, std::placeholders::_1)); if (!InitScreensaver()) { LOG(INFO) << "Screensaver disabled"; } pthread_create(&input_thread_, nullptr, InputThreadLoop, nullptr); return true; } Loading Loading @@ -236,6 +283,40 @@ int RecoveryUI::WaitKey() { while (key_queue_len == 0 && rc != ETIMEDOUT) { rc = pthread_cond_timedwait(&key_queue_cond, &key_queue_mutex, &timeout); } if (screensaver_state_ != ScreensaverState::DISABLED) { if (rc == ETIMEDOUT) { // Lower the brightness level: NORMAL -> DIMMED; DIMMED -> OFF. if (screensaver_state_ == ScreensaverState::NORMAL) { if (android::base::WriteStringToFile(std::to_string(brightness_dimmed_value_), BRIGHTNESS_FILE)) { LOG(INFO) << "Brightness: " << brightness_dimmed_value_ << " (" << brightness_dimmed_ << "%)"; screensaver_state_ = ScreensaverState::DIMMED; } } else if (screensaver_state_ == ScreensaverState::DIMMED) { if (android::base::WriteStringToFile("0", BRIGHTNESS_FILE)) { LOG(INFO) << "Brightness: 0 (off)"; screensaver_state_ = ScreensaverState::OFF; } } } else if (screensaver_state_ != ScreensaverState::NORMAL) { // Drop the first key if it's changing from OFF to NORMAL. if (screensaver_state_ == ScreensaverState::OFF) { if (key_queue_len > 0) { memcpy(&key_queue[0], &key_queue[1], sizeof(int) * --key_queue_len); } } // Reset the brightness to normal. if (android::base::WriteStringToFile(std::to_string(brightness_normal_value_), BRIGHTNESS_FILE)) { screensaver_state_ = ScreensaverState::NORMAL; LOG(INFO) << "Brightness: " << brightness_normal_value_ << " (" << brightness_normal_ << "%)"; } } } } while (IsUsbConnected() && key_queue_len == 0); int key = -1; Loading Loading @@ -330,7 +411,7 @@ RecoveryUI::KeyAction RecoveryUI::CheckKey(int key, bool is_long_press) { } last_key = key; return IsTextVisible() ? ENQUEUE : IGNORE; return (IsTextVisible() || screensaver_state_ == ScreensaverState::OFF) ? ENQUEUE : IGNORE; } void RecoveryUI::KeyLongPress(int) { Loading
ui.h +15 −0 Original line number Diff line number Diff line Loading @@ -130,6 +130,13 @@ class RecoveryUI { std::string locale_; bool rtl_locale_; // The normal and dimmed brightness percentages (default: 50 and 25, which means 50% and 25% // of the max_brightness). Because the absolute values may vary across devices. These two // values can be configured via subclassing. Setting brightness_normal_ to 0 to disable // screensaver. unsigned int brightness_normal_; unsigned int brightness_dimmed_; private: // Key event input queue pthread_mutex_t key_queue_mutex; Loading Loading @@ -167,6 +174,14 @@ class RecoveryUI { void time_key(int key_code, int count); void SetLocale(const std::string&); enum class ScreensaverState { DISABLED, NORMAL, DIMMED, OFF }; ScreensaverState screensaver_state_; // The following two contain the absolute values computed from brightness_normal_ and // brightness_dimmed_ respectively. unsigned int brightness_normal_value_; unsigned int brightness_dimmed_value_; bool InitScreensaver(); }; #endif // RECOVERY_UI_H