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
This commit is contained in:
parent
1fb40d753a
commit
510589f39e
5 changed files with 75 additions and 1 deletions
|
@ -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();
|
||||
}
|
||||
|
|
|
@ -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();
|
||||
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -22,6 +22,7 @@
|
|||
#include <string>
|
||||
#include <vector>
|
||||
|
||||
#include <android-base/logging.h>
|
||||
#include <android-base/properties.h>
|
||||
#include <android-base/strings.h>
|
||||
|
||||
|
@ -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<int>(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
|
||||
|
|
Loading…
Reference in a new issue