Update recovery UI.

* Use new animation.
* Use new non-holo progress bars.
* Use recommended spacing for recovery UI.

Bug: http://b/26548285
Change-Id: I8411e89d6a6a9ce638b8645e19e5082d0d968cee
This commit is contained in:
Elliott Hughes
2016-04-20 17:22:16 -07:00
parent ca5003e033
commit faf36e04ed
502 changed files with 80 additions and 50 deletions

View File

@@ -78,9 +78,8 @@ ScreenRecoveryUI::ScreenRecoveryUI() :
animation_fps(30), // TODO: there's currently no way to infer this.
stage(-1),
max_stage(-1),
updateMutex(PTHREAD_MUTEX_INITIALIZER),
rtl_locale(false) {
pthread_mutex_init(&updateMutex, nullptr);
}
GRSurface* ScreenRecoveryUI::GetCurrentFrame() {
@@ -100,6 +99,35 @@ GRSurface* ScreenRecoveryUI::GetCurrentText() {
}
}
int ScreenRecoveryUI::PixelsFromDp(int dp) {
return dp * density_;
}
// Here's the intended layout:
// 162dp
// icon (200dp)
// 62dp
// text (14sp)
// 24dp
// progress (2dp)
// 172dp
// Note that "baseline" is actually the *top* of each icon (because that's how our drawing
// routines work), so that's the more useful measurement.
int ScreenRecoveryUI::GetAnimationBaseline() {
return GetTextBaseline() - PixelsFromDp(68) - gr_get_height(loopFrames[0]);
}
int ScreenRecoveryUI::GetTextBaseline() {
return GetProgressBaseline() - PixelsFromDp(32) - gr_get_height(installing_text);
}
int ScreenRecoveryUI::GetProgressBaseline() {
return gr_fb_height() - PixelsFromDp(is_large_ ? 340 : 194) - gr_get_height(progressBarFill);
}
// Clear the screen and draw the currently selected background icon (if any).
// Should only be called with updateMutex locked.
void ScreenRecoveryUI::draw_background_locked() {
@@ -108,61 +136,49 @@ void ScreenRecoveryUI::draw_background_locked() {
gr_clear();
if (currentIcon != NONE) {
GRSurface* surface = GetCurrentFrame();
GRSurface* text_surface = GetCurrentText();
int iconWidth = gr_get_width(surface);
int iconHeight = gr_get_height(surface);
int textWidth = gr_get_width(text_surface);
int textHeight = gr_get_height(text_surface);
int stageHeight = gr_get_height(stageMarkerEmpty);
int sh = (max_stage >= 0) ? stageHeight : 0;
iconX = (gr_fb_width() - iconWidth) / 2;
iconY = (gr_fb_height() - (iconHeight+textHeight+40+sh)) / 2;
int textX = (gr_fb_width() - textWidth) / 2;
int textY = ((gr_fb_height() - (iconHeight+textHeight+40+sh)) / 2) + iconHeight + 40;
gr_blit(surface, 0, 0, iconWidth, iconHeight, iconX, iconY);
if (stageHeight > 0) {
int sw = gr_get_width(stageMarkerEmpty);
if (max_stage != -1) {
int stage_height = gr_get_height(stageMarkerEmpty);
int stage_width = gr_get_width(stageMarkerEmpty);
int x = (gr_fb_width() - max_stage * gr_get_width(stageMarkerEmpty)) / 2;
int y = iconY + iconHeight + 20;
int y = gr_fb_height() - stage_height;
for (int i = 0; i < max_stage; ++i) {
gr_blit((i < stage) ? stageMarkerFill : stageMarkerEmpty,
0, 0, sw, stageHeight, x, y);
x += sw;
GRSurface* stage_surface = (i < stage) ? stageMarkerFill : stageMarkerEmpty;
gr_blit(stage_surface, 0, 0, stage_width, stage_height, x, y);
x += stage_width;
}
}
GRSurface* text_surface = GetCurrentText();
int text_x = (gr_fb_width() - gr_get_width(text_surface)) / 2;
int text_y = GetTextBaseline();
gr_color(255, 255, 255, 255);
gr_texticon(textX, textY, text_surface);
gr_texticon(text_x, text_y, text_surface);
}
}
// Draw the progress bar (if any) on the screen. Does not flip pages.
// Draws the animation and progress bar (if any) on the screen.
// Does not flip pages.
// Should only be called with updateMutex locked.
void ScreenRecoveryUI::draw_progress_locked() {
if (currentIcon == ERROR) return;
if (currentIcon == INSTALLING_UPDATE || currentIcon == ERASING) {
void ScreenRecoveryUI::draw_foreground_locked() {
if (currentIcon != NONE) {
GRSurface* frame = GetCurrentFrame();
gr_blit(frame, 0, 0, gr_get_width(frame), gr_get_height(frame), iconX, iconY);
int frame_width = gr_get_width(frame);
int frame_height = gr_get_height(frame);
int frame_x = (gr_fb_width() - frame_width) / 2;
int frame_y = GetAnimationBaseline();
gr_blit(frame, 0, 0, frame_width, frame_height, frame_x, frame_y);
}
if (progressBarType != EMPTY) {
int iconHeight = gr_get_height(loopFrames[0]);
int width = gr_get_width(progressBarEmpty);
int height = gr_get_height(progressBarEmpty);
int dx = (gr_fb_width() - width)/2;
int dy = (3*gr_fb_height() + iconHeight - 2*height)/4;
int progress_x = (gr_fb_width() - width)/2;
int progress_y = GetProgressBaseline();
// Erase behind the progress bar (in case this was a progress-only update)
gr_color(0, 0, 0, 255);
gr_fill(dx, dy, width, height);
gr_fill(progress_x, progress_y, width, height);
if (progressBarType == DETERMINATE) {
float p = progressScopeStart + progress * progressScopeSize;
@@ -171,18 +187,20 @@ void ScreenRecoveryUI::draw_progress_locked() {
if (rtl_locale) {
// Fill the progress bar from right to left.
if (pos > 0) {
gr_blit(progressBarFill, width-pos, 0, pos, height, dx+width-pos, dy);
gr_blit(progressBarFill, width-pos, 0, pos, height,
progress_x+width-pos, progress_y);
}
if (pos < width-1) {
gr_blit(progressBarEmpty, 0, 0, width-pos, height, dx, dy);
gr_blit(progressBarEmpty, 0, 0, width-pos, height, progress_x, progress_y);
}
} else {
// Fill the progress bar from left to right.
if (pos > 0) {
gr_blit(progressBarFill, 0, 0, pos, height, dx, dy);
gr_blit(progressBarFill, 0, 0, pos, height, progress_x, progress_y);
}
if (pos < width-1) {
gr_blit(progressBarEmpty, pos, 0, width-pos, height, dx+pos, dy);
gr_blit(progressBarEmpty, pos, 0, width-pos, height,
progress_x+pos, progress_y);
}
}
}
@@ -253,7 +271,7 @@ static const char* LONG_PRESS_HELP[] = {
void ScreenRecoveryUI::draw_screen_locked() {
if (!show_text) {
draw_background_locked();
draw_progress_locked();
draw_foreground_locked();
} else {
gr_color(0, 0, 0, 255);
gr_clear();
@@ -323,7 +341,7 @@ void ScreenRecoveryUI::update_progress_locked() {
draw_screen_locked(); // Must redraw the whole screen
pagesIdentical = true;
} else {
draw_progress_locked(); // Draw only the progress bar and overlays
draw_foreground_locked(); // Draw only the progress bar and overlays
}
gr_flip();
}
@@ -385,14 +403,14 @@ void ScreenRecoveryUI::ProgressThreadLoop() {
void ScreenRecoveryUI::LoadBitmap(const char* filename, GRSurface** surface) {
int result = res_create_display_surface(filename, surface);
if (result < 0) {
LOGE("missing bitmap %s (error %d)\n", filename, result);
LOGE("couldn't load bitmap %s (error %d)\n", filename, result);
}
}
void ScreenRecoveryUI::LoadLocalizedBitmap(const char* filename, GRSurface** surface) {
int result = res_create_localized_alpha_surface(filename, locale, surface);
if (result < 0) {
LOGE("missing bitmap %s (error %d)\n", filename, result);
LOGE("couldn't load bitmap %s (error %d)\n", filename, result);
}
}
@@ -408,6 +426,9 @@ static char** Alloc2d(size_t rows, size_t cols) {
void ScreenRecoveryUI::Init() {
gr_init();
density_ = static_cast<float>(property_get_int32("ro.sf.lcd_density", 160)) / 160.f;
is_large_ = gr_fb_height() > PixelsFromDp(800);
gr_font_size(&char_width_, &char_height_);
text_rows_ = gr_fb_height() / char_height_;
text_cols_ = gr_fb_width() / char_width_;
@@ -459,12 +480,13 @@ void ScreenRecoveryUI::LoadAnimation() {
introFrames = new GRSurface*[intro_frames];
for (int i = 0; i < intro_frames; ++i) {
LoadBitmap(android::base::StringPrintf("intro%02d", i).c_str(), &introFrames[i]);
// TODO: remember the names above, so we don't have to hard-code the number of 0s.
LoadBitmap(android::base::StringPrintf("intro%05d", i).c_str(), &introFrames[i]);
}
loopFrames = new GRSurface*[loop_frames];
for (int i = 0; i < loop_frames; ++i) {
LoadBitmap(android::base::StringPrintf("loop%02d", i).c_str(), &loopFrames[i]);
LoadBitmap(android::base::StringPrintf("loop%05d", i).c_str(), &loopFrames[i]);
}
}