From 510589f39edd6dd3ee8953a2a3db5a98d9b7796f Mon Sep 17 00:00:00 2001 From: Ludvig Hansson Date: Mon, 7 Nov 2022 12:39:20 +0100 Subject: [PATCH] support wrist orientation in recovery/fastbootd Add support for wrist orientation in recovery. Feature controlled by the property "config.enable_wristorientation". Read 'ro.boot.wrist_orientation' property to determine if screen orientation should be flipped and swipes inverted. Bug: 257123026 Bug: 309982093 Test: build boot/recovery Test: recovery/fastbootd uses same orientation as android Change-Id: I29e0e682cca81d302dae502382b6270afe105d72 --- minui/graphics.cpp | 4 ++ minui/include/minui/minui.h | 3 ++ recovery_ui/include/recovery_ui/wear_ui.h | 2 + recovery_ui/ui.cpp | 22 ++++++++++- recovery_ui/wear_ui.cpp | 45 +++++++++++++++++++++++ 5 files changed, 75 insertions(+), 1 deletion(-) diff --git a/minui/graphics.cpp b/minui/graphics.cpp index 41a36611..cc820948 100644 --- a/minui/graphics.cpp +++ b/minui/graphics.cpp @@ -503,6 +503,10 @@ void gr_rotate(GRRotation rot) { rotation = rot; } +GRRotation gr_get_rotation() { + return rotation; +} + bool gr_has_multiple_connectors() { return gr_backend->HasMultipleConnectors(); } diff --git a/minui/include/minui/minui.h b/minui/include/minui/minui.h index 2353ed3b..6a71ad3f 100644 --- a/minui/include/minui/minui.h +++ b/minui/include/minui/minui.h @@ -153,6 +153,9 @@ unsigned int gr_get_height(const GRSurface* surface); // Sets rotation, flips gr_fb_width/height if 90 degree rotation difference void gr_rotate(GRRotation rotation); +// Get current rotation +GRRotation gr_get_rotation(); + // Returns the current PixelFormat being used. PixelFormat gr_pixel_format(); diff --git a/recovery_ui/include/recovery_ui/wear_ui.h b/recovery_ui/include/recovery_ui/wear_ui.h index e27e9408..5dc432a6 100644 --- a/recovery_ui/include/recovery_ui/wear_ui.h +++ b/recovery_ui/include/recovery_ui/wear_ui.h @@ -26,6 +26,8 @@ class WearRecoveryUI : public ScreenRecoveryUI { public: WearRecoveryUI(); + bool Init(const std::string& locale) override; + void SetStage(int current, int max) override; protected: diff --git a/recovery_ui/ui.cpp b/recovery_ui/ui.cpp index 8bc02444..9b0fd94c 100644 --- a/recovery_ui/ui.cpp +++ b/recovery_ui/ui.cpp @@ -197,8 +197,23 @@ bool RecoveryUI::Init(const std::string& /* locale */) { return true; } +enum SwipeDirection { UP, DOWN, RIGHT, LEFT }; + +static SwipeDirection FlipSwipeDirection(SwipeDirection direction) { + switch (direction) { + case UP: + return SwipeDirection::DOWN; + case DOWN: + return SwipeDirection::UP; + case RIGHT: + return SwipeDirection::LEFT; + case LEFT: + return SwipeDirection::RIGHT; + } +} + void RecoveryUI::OnTouchDetected(int dx, int dy) { - enum SwipeDirection { UP, DOWN, RIGHT, LEFT } direction; + SwipeDirection direction; // We only consider a valid swipe if: // - the delta along one axis is below touch_low_threshold_; @@ -219,6 +234,11 @@ void RecoveryUI::OnTouchDetected(int dx, int dy) { return; } + // Flip swipe direction if screen is rotated upside down + if (gr_get_rotation() == GRRotation::DOWN) { + direction = FlipSwipeDirection(direction); + } + LOG(DEBUG) << "Swipe direction=" << direction; switch (direction) { case SwipeDirection::UP: diff --git a/recovery_ui/wear_ui.cpp b/recovery_ui/wear_ui.cpp index 7b9ecf8e..552f0cfd 100644 --- a/recovery_ui/wear_ui.cpp +++ b/recovery_ui/wear_ui.cpp @@ -22,6 +22,7 @@ #include #include +#include #include #include @@ -44,6 +45,50 @@ WearRecoveryUI::WearRecoveryUI() touch_screen_allowed_ = true; } +static void FlipOrientation() { + auto rotation = gr_get_rotation(); + if (rotation == GRRotation::NONE) { + gr_rotate(GRRotation::DOWN); + } else if (rotation == GRRotation::DOWN) { + gr_rotate(GRRotation::NONE); + } else { + LOG(WARNING) << "Unsupported rotation for wrist orientation" << static_cast(rotation); + } +} + +// Match values in +// frameworks/opt/wear/src/com/android/clockwork/wristorientation/WristOrientationService.java +enum class WristOrientation : unsigned { + LEFT_WRIST_ROTATION_0 = 0, + LEFT_WRIST_ROTATION_180 = 1, + RIGHT_WRIST_ROTATION_0 = 2, + RIGHT_WRIST_ROTATION_180 = 3, +}; + +static void InitWristOrientation() { + auto prop = android::base::GetUintProperty("ro.boot.wrist_orientation", 0u); + WristOrientation orientation{ prop }; + if (orientation == WristOrientation::LEFT_WRIST_ROTATION_180 || + orientation == WristOrientation::RIGHT_WRIST_ROTATION_180) { + LOG(INFO) + << "InitWristOrientation(): flipping orientation because, 'ro.boot.wrist_orientation'=" + << prop; + + FlipOrientation(); + } +} + +bool WearRecoveryUI::Init(const std::string& locale) { + auto result = ScreenRecoveryUI::Init(locale); + auto wrist_orientation_enabled = + android::base::GetBoolProperty("config.enable_wristorientation", false); + LOG(INFO) << "WearRecoveryUI::Init(): enable_wristorientation=" << wrist_orientation_enabled; + if (wrist_orientation_enabled) { + InitWristOrientation(); + } + return result; +} + // Draw background frame on the screen. Does not flip pages. // Should only be called with updateMutex locked. // TODO merge drawing routines with screen_ui