screen_ui: Allow setting screen margin space.
For round screen or screens with rounded corners, we don't want to show
texts within the margin which could otherwise be invisible.
Move the density computation to ScreenRecoveryUI ctor so that the value
can be used earlier.
Note that this is similar to the existing stuff in wear UI (outer_width,
outer_height). This CL gets ScreenRecoveryUI and WearRecoveryUI one-step
closer.
Bug: 62732748
Test: Setting and not setting margin_{width,height}_ on angler. Check the
recovery texts (recovery menu as well as 'View recovery logs').
Change-Id: Ibf6238c9cc8949a42ed8a410e1c09d55b0b5a151
(cherry picked from commit 87f4650874)
This commit is contained in:
+66
-66
@@ -43,8 +43,6 @@
|
|||||||
#include "screen_ui.h"
|
#include "screen_ui.h"
|
||||||
#include "ui.h"
|
#include "ui.h"
|
||||||
|
|
||||||
#define TEXT_INDENT 4
|
|
||||||
|
|
||||||
// Return the current time as a double (including fractions of a second).
|
// Return the current time as a double (including fractions of a second).
|
||||||
static double now() {
|
static double now() {
|
||||||
struct timeval tv;
|
struct timeval tv;
|
||||||
@@ -53,7 +51,8 @@ static double now() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
ScreenRecoveryUI::ScreenRecoveryUI()
|
ScreenRecoveryUI::ScreenRecoveryUI()
|
||||||
: currentIcon(NONE),
|
: density_(static_cast<float>(android::base::GetIntProperty("ro.sf.lcd_density", 160)) / 160.f),
|
||||||
|
currentIcon(NONE),
|
||||||
progressBarType(EMPTY),
|
progressBarType(EMPTY),
|
||||||
progressScopeStart(0),
|
progressScopeStart(0),
|
||||||
progressScopeSize(0),
|
progressScopeSize(0),
|
||||||
@@ -79,6 +78,8 @@ ScreenRecoveryUI::ScreenRecoveryUI()
|
|||||||
animation_fps(30), // TODO: there's currently no way to infer this.
|
animation_fps(30), // TODO: there's currently no way to infer this.
|
||||||
stage(-1),
|
stage(-1),
|
||||||
max_stage(-1),
|
max_stage(-1),
|
||||||
|
margin_width_(0),
|
||||||
|
margin_height_(0),
|
||||||
updateMutex(PTHREAD_MUTEX_INITIALIZER) {}
|
updateMutex(PTHREAD_MUTEX_INITIALIZER) {}
|
||||||
|
|
||||||
GRSurface* ScreenRecoveryUI::GetCurrentFrame() {
|
GRSurface* ScreenRecoveryUI::GetCurrentFrame() {
|
||||||
@@ -278,65 +279,66 @@ static const char* LONG_PRESS_HELP[] = {
|
|||||||
NULL
|
NULL
|
||||||
};
|
};
|
||||||
|
|
||||||
// Redraw everything on the screen. Does not flip pages.
|
// Redraws everything on the screen. Does not flip pages. Should only be called with updateMutex
|
||||||
// Should only be called with updateMutex locked.
|
// locked.
|
||||||
void ScreenRecoveryUI::draw_screen_locked() {
|
void ScreenRecoveryUI::draw_screen_locked() {
|
||||||
if (!show_text) {
|
if (!show_text) {
|
||||||
draw_background_locked();
|
draw_background_locked();
|
||||||
draw_foreground_locked();
|
draw_foreground_locked();
|
||||||
} else {
|
return;
|
||||||
gr_color(0, 0, 0, 255);
|
}
|
||||||
gr_clear();
|
|
||||||
|
|
||||||
int y = 0;
|
gr_color(0, 0, 0, 255);
|
||||||
if (show_menu) {
|
gr_clear();
|
||||||
std::string recovery_fingerprint =
|
|
||||||
android::base::GetProperty("ro.bootimage.build.fingerprint", "");
|
|
||||||
|
|
||||||
SetColor(INFO);
|
static constexpr int TEXT_INDENT = 4;
|
||||||
DrawTextLine(TEXT_INDENT, &y, "Android Recovery", true);
|
int x = TEXT_INDENT + margin_width_;
|
||||||
for (auto& chunk : android::base::Split(recovery_fingerprint, ":")) {
|
int y = margin_height_;
|
||||||
DrawTextLine(TEXT_INDENT, &y, chunk.c_str(), false);
|
if (show_menu) {
|
||||||
}
|
std::string recovery_fingerprint =
|
||||||
DrawTextLines(TEXT_INDENT, &y, HasThreeButtons() ? REGULAR_HELP : LONG_PRESS_HELP);
|
android::base::GetProperty("ro.bootimage.build.fingerprint", "");
|
||||||
|
|
||||||
SetColor(HEADER);
|
SetColor(INFO);
|
||||||
DrawTextLines(TEXT_INDENT, &y, menu_headers_);
|
DrawTextLine(x, &y, "Android Recovery", true);
|
||||||
|
for (const auto& chunk : android::base::Split(recovery_fingerprint, ":")) {
|
||||||
SetColor(MENU);
|
DrawTextLine(x, &y, chunk.c_str(), false);
|
||||||
DrawHorizontalRule(&y);
|
|
||||||
y += 4;
|
|
||||||
for (int i = 0; i < menu_items; ++i) {
|
|
||||||
if (i == menu_sel) {
|
|
||||||
// Draw the highlight bar.
|
|
||||||
SetColor(IsLongPress() ? MENU_SEL_BG_ACTIVE : MENU_SEL_BG);
|
|
||||||
gr_fill(0, y - 2, gr_fb_width(), y + char_height_ + 2);
|
|
||||||
// Bold white text for the selected item.
|
|
||||||
SetColor(MENU_SEL_FG);
|
|
||||||
gr_text(gr_sys_font(), 4, y, menu_[i], true);
|
|
||||||
SetColor(MENU);
|
|
||||||
} else {
|
|
||||||
gr_text(gr_sys_font(), 4, y, menu_[i], false);
|
|
||||||
}
|
|
||||||
y += char_height_ + 4;
|
|
||||||
}
|
|
||||||
DrawHorizontalRule(&y);
|
|
||||||
}
|
|
||||||
|
|
||||||
// display from the bottom up, until we hit the top of the
|
|
||||||
// screen, the bottom of the menu, or we've displayed the
|
|
||||||
// entire text buffer.
|
|
||||||
SetColor(LOG);
|
|
||||||
int row = (text_top_ + text_rows_ - 1) % text_rows_;
|
|
||||||
size_t count = 0;
|
|
||||||
for (int ty = gr_fb_height() - char_height_;
|
|
||||||
ty >= y && count < text_rows_;
|
|
||||||
ty -= char_height_, ++count) {
|
|
||||||
gr_text(gr_sys_font(), 0, ty, text_[row], false);
|
|
||||||
--row;
|
|
||||||
if (row < 0) row = text_rows_ - 1;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
DrawTextLines(x, &y, HasThreeButtons() ? REGULAR_HELP : LONG_PRESS_HELP);
|
||||||
|
|
||||||
|
SetColor(HEADER);
|
||||||
|
DrawTextLines(x, &y, menu_headers_);
|
||||||
|
|
||||||
|
SetColor(MENU);
|
||||||
|
DrawHorizontalRule(&y);
|
||||||
|
y += 4;
|
||||||
|
for (int i = 0; i < menu_items; ++i) {
|
||||||
|
if (i == menu_sel) {
|
||||||
|
// Draw the highlight bar.
|
||||||
|
SetColor(IsLongPress() ? MENU_SEL_BG_ACTIVE : MENU_SEL_BG);
|
||||||
|
gr_fill(0, y - 2, gr_fb_width(), y + char_height_ + 2);
|
||||||
|
// Bold white text for the selected item.
|
||||||
|
SetColor(MENU_SEL_FG);
|
||||||
|
gr_text(gr_sys_font(), 4, y, menu_[i], true);
|
||||||
|
SetColor(MENU);
|
||||||
|
} else {
|
||||||
|
gr_text(gr_sys_font(), 4, y, menu_[i], false);
|
||||||
|
}
|
||||||
|
y += char_height_ + 4;
|
||||||
|
}
|
||||||
|
DrawHorizontalRule(&y);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Display from the bottom up, until we hit the top of the screen, the bottom of the menu, or
|
||||||
|
// we've displayed the entire text buffer.
|
||||||
|
SetColor(LOG);
|
||||||
|
int row = (text_top_ + text_rows_ - 1) % text_rows_;
|
||||||
|
size_t count = 0;
|
||||||
|
for (int ty = gr_fb_height() - margin_height_ - char_height_;
|
||||||
|
ty >= y && count < text_rows_; ty -= char_height_, ++count) {
|
||||||
|
gr_text(gr_sys_font(), 0, ty, text_[row], false);
|
||||||
|
--row;
|
||||||
|
if (row < 0) row = text_rows_ - 1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Redraw everything on the screen and flip the screen (make it visible).
|
// Redraw everything on the screen and flip the screen (make it visible).
|
||||||
@@ -446,14 +448,14 @@ void ScreenRecoveryUI::SetSystemUpdateText(bool security_update) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool ScreenRecoveryUI::InitTextParams() {
|
bool ScreenRecoveryUI::InitTextParams() {
|
||||||
if (gr_init() < 0) {
|
if (gr_init() < 0) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
gr_font_size(gr_sys_font(), &char_width_, &char_height_);
|
gr_font_size(gr_sys_font(), &char_width_, &char_height_);
|
||||||
text_rows_ = gr_fb_height() / char_height_;
|
text_rows_ = (gr_fb_height() - margin_height_ * 2) / char_height_;
|
||||||
text_cols_ = gr_fb_width() / char_width_;
|
text_cols_ = (gr_fb_width() - margin_width_ * 2) / char_width_;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool ScreenRecoveryUI::Init(const std::string& locale) {
|
bool ScreenRecoveryUI::Init(const std::string& locale) {
|
||||||
@@ -462,8 +464,6 @@ bool ScreenRecoveryUI::Init(const std::string& locale) {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
density_ = static_cast<float>(android::base::GetIntProperty("ro.sf.lcd_density", 160)) / 160.f;
|
|
||||||
|
|
||||||
// Are we portrait or landscape?
|
// Are we portrait or landscape?
|
||||||
layout_ = (gr_fb_width() > gr_fb_height()) ? LANDSCAPE : PORTRAIT;
|
layout_ = (gr_fb_width() > gr_fb_height()) ? LANDSCAPE : PORTRAIT;
|
||||||
// Are we the large variant of our base layout?
|
// Are we the large variant of our base layout?
|
||||||
|
|||||||
+9
-2
@@ -72,10 +72,11 @@ class ScreenRecoveryUI : public RecoveryUI {
|
|||||||
void SetColor(UIElement e);
|
void SetColor(UIElement e);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
// The scale factor from dp to pixels. 1.0 for mdpi, 4.0 for xxxhdpi.
|
||||||
|
const float density_;
|
||||||
|
|
||||||
Icon currentIcon;
|
Icon currentIcon;
|
||||||
|
|
||||||
// The scale factor from dp to pixels. 1.0 for mdpi, 4.0 for xxxhdpi.
|
|
||||||
float density_;
|
|
||||||
// The layout to use.
|
// The layout to use.
|
||||||
int layout_;
|
int layout_;
|
||||||
|
|
||||||
@@ -135,6 +136,12 @@ class ScreenRecoveryUI : public RecoveryUI {
|
|||||||
|
|
||||||
int char_width_;
|
int char_width_;
|
||||||
int char_height_;
|
int char_height_;
|
||||||
|
|
||||||
|
// The margin that we don't want to use for showing texts (e.g. round screen, or screen with
|
||||||
|
// rounded corners).
|
||||||
|
int margin_width_;
|
||||||
|
int margin_height_;
|
||||||
|
|
||||||
pthread_mutex_t updateMutex;
|
pthread_mutex_t updateMutex;
|
||||||
|
|
||||||
virtual bool InitTextParams();
|
virtual bool InitTextParams();
|
||||||
|
|||||||
Reference in New Issue
Block a user