From b44702a80ae8efcb3090aa6a4331ec3d93e04f10 Mon Sep 17 00:00:00 2001 From: fredchiou Date: Fri, 11 Feb 2022 16:39:53 +0800 Subject: recovery_ui:Add support for multiple connectors switch Bug: 199253219 Test: display can switch in recovery Change-Id: If58ea5423f64420db3e5bd9307194b56129d6543 --- recovery_ui/screen_ui.cpp | 54 ++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 53 insertions(+), 1 deletion(-) (limited to 'recovery_ui/screen_ui.cpp') diff --git a/recovery_ui/screen_ui.cpp b/recovery_ui/screen_ui.cpp index b2c828f34..ee3cbb134 100644 --- a/recovery_ui/screen_ui.cpp +++ b/recovery_ui/screen_ui.cpp @@ -48,6 +48,11 @@ #include "recovery_ui/device.h" #include "recovery_ui/ui.h" +enum DirectRenderManager { + DRM_INNER, + DRM_OUTER, +}; + // Return the current time as a double (including fractions of a second). static double now() { struct timeval tv; @@ -334,7 +339,8 @@ ScreenRecoveryUI::ScreenRecoveryUI(bool scrollable_menu) stage(-1), max_stage(-1), locale_(""), - rtl_locale_(false) {} + rtl_locale_(false), + is_graphics_available(false) {} ScreenRecoveryUI::~ScreenRecoveryUI() { progress_thread_stopped_ = true; @@ -906,6 +912,7 @@ bool ScreenRecoveryUI::Init(const std::string& locale) { if (!InitGraphics()) { return false; } + is_graphics_available = true; if (!InitTextParams()) { return false; @@ -950,6 +957,9 @@ bool ScreenRecoveryUI::Init(const std::string& locale) { // Keep the progress bar updated, even when the process is otherwise busy. progress_thread_ = std::thread(&ScreenRecoveryUI::ProgressThreadLoop, this); + // set the callback for hall sensor event + (void)ev_sync_sw_state([this](auto&& a, auto&& b) { return this->SetSwCallback(a, b);}); + return true; } @@ -1367,3 +1377,45 @@ void ScreenRecoveryUI::SetLocale(const std::string& new_locale) { } } } + +int ScreenRecoveryUI::SetSwCallback(int code, int value) { + if (!is_graphics_available) { return -1; } + if (code > SW_MAX) { return -1; } + if (code != SW_LID) { return 0; } + + /* detect dual display */ + if (!gr_has_multiple_connectors()) { return -1; } + + /* turn off all screen */ + gr_fb_blank(true, DirectRenderManager::DRM_INNER); + gr_fb_blank(true, DirectRenderManager::DRM_OUTER); + gr_color(0, 0, 0, 255); + gr_clear(); + + /* turn on the screen */ + gr_fb_blank(false, value); + gr_flip(); + + /* set the retation */ + std::string rotation_str; + if (value == DirectRenderManager::DRM_OUTER) { + rotation_str = + android::base::GetProperty("ro.minui.second_rotation", "ROTATION_NONE"); + } else { + rotation_str = + android::base::GetProperty("ro.minui.default_rotation", "ROTATION_NONE"); + } + + if (rotation_str == "ROTATION_RIGHT") { + gr_rotate(GRRotation::RIGHT); + } else if (rotation_str == "ROTATION_DOWN") { + gr_rotate(GRRotation::DOWN); + } else if (rotation_str == "ROTATION_LEFT") { + gr_rotate(GRRotation::LEFT); + } else { // "ROTATION_NONE" or unknown string + gr_rotate(GRRotation::NONE); + } + Redraw(); + + return 0; +} -- cgit v1.2.3