diff options
author | Steve Kondik <shade@chemlab.org> | 2014-09-12 18:52:28 -0700 |
---|---|---|
committer | Tom Marshall <tdm@cyngn.com> | 2015-11-25 15:35:22 -0800 |
commit | f868d833885bd6118b13eae5a7347f9dd9aeda75 (patch) | |
tree | 0acd839eb7e4008ff1ad137ae610afd0fdeb85bb | |
parent | 8e614b89838dda1adff952c0bfbb02721bb5db2b (diff) | |
download | bootable_recovery-f868d833885bd6118b13eae5a7347f9dd9aeda75.zip bootable_recovery-f868d833885bd6118b13eae5a7347f9dd9aeda75.tar.gz bootable_recovery-f868d833885bd6118b13eae5a7347f9dd9aeda75.tar.bz2 |
sr: Fix the progress bar
* The progress thread is running all the time, which causes the device
to heat up while in recovery. Start this thread only when the
progress mode is set to something other than EMPTY, and add a
terminating condition so that it exits when finished.
* Incorporate Tom's patch to keep it updated when visible, since
both are needed to get working progress indications without
killing batteries.
* Clear buffer in draw_progress_locked() and always call this in
update_progress_locked(). This is necessary to ensure that all
backing frames in the graphics implementation get updated because
we aren't guaranteed to have any particular number of backing
frames.
* Remove dialogs on wipe operations since we are using the progress
animation now.
* Set progress indicator after showing "Formatting" text to avoid
momentary flicker.
Change-Id: Ib70d2cb25f01d9920ffb698b5b5b47af827ef483
-rw-r--r-- | recovery.cpp | 13 | ||||
-rw-r--r-- | screen_ui.cpp | 22 |
2 files changed, 16 insertions, 19 deletions
diff --git a/recovery.cpp b/recovery.cpp index f260854..f1c65ce 100644 --- a/recovery.cpp +++ b/recovery.cpp @@ -554,9 +554,6 @@ typedef struct _saved_log_file { static bool erase_volume(const char* volume, bool force = false) { bool is_cache = (strcmp(volume, CACHE_ROOT) == 0); - ui->SetBackground(RecoveryUI::ERASING); - ui->SetProgressType(RecoveryUI::INDETERMINATE); - saved_log_file* head = NULL; if (!force && is_cache) { @@ -606,6 +603,9 @@ static bool erase_volume(const char* volume, bool force = false) { ui->Print("Formatting %s...\n", volume); + ui->SetBackground(RecoveryUI::ERASING); + ui->SetProgressType(RecoveryUI::INDETERMINATE); + if (volume[0] == '/') { ensure_path_unmounted(volume); } @@ -870,15 +870,8 @@ static bool wipe_cache(bool should_confirm, Device* device) { modified_flash = true; ui->Print("\n-- Wiping cache...\n"); - ui->DialogShowInfo("Wiping cache ..."); bool success = erase_volume("/cache"); ui->Print("Cache wipe %s.\n", success ? "complete" : "failed"); - if (!should_confirm || success) { - ui->DialogDismiss(); - } - else { - ui->DialogShowErrorLog("Cache wipe failed"); - } return success; } diff --git a/screen_ui.cpp b/screen_ui.cpp index 464e77d..2bb7112 100644 --- a/screen_ui.cpp +++ b/screen_ui.cpp @@ -139,6 +139,9 @@ void ScreenRecoveryUI::draw_background_locked(Icon icon) { void ScreenRecoveryUI::draw_progress_locked() { if (currentIcon == D_ERROR) return; + gr_color(0, 0, 0, 255); + gr_clear(); + if (currentIcon == INSTALLING_UPDATE || currentIcon == ERASING) { GRSurface* icon = installation[installingFrame]; gr_blit(icon, 0, 0, gr_get_width(icon), gr_get_height(icon), iconX, iconY); @@ -394,12 +397,7 @@ void ScreenRecoveryUI::update_screen_locked() { // Updates only the progress bar, if possible, otherwise redraws the screen. // Should only be called with updateMutex locked. void ScreenRecoveryUI::update_progress_locked() { - if (show_text || !pagesIdentical) { - draw_screen_locked(); // Must redraw the whole screen - pagesIdentical = true; - } else { - draw_progress_locked(); // Draw only the progress bar and overlays - } + draw_progress_locked(); gr_flip(); } @@ -426,7 +424,7 @@ void ScreenRecoveryUI::ProgressThreadLoop() { // update the installation animation, if active // skip this if we have a text overlay (too expensive to update) if ((currentIcon == INSTALLING_UPDATE || currentIcon == ERASING) && - installing_frames > 0 && !show_text) { + installing_frames > 0) { installingFrame = (installingFrame + 1) % installing_frames; redraw = 1; } @@ -446,11 +444,16 @@ void ScreenRecoveryUI::ProgressThreadLoop() { if (redraw) update_progress_locked(); pthread_mutex_unlock(&updateMutex); + + if (progressBarType == EMPTY) + break; + double end = now(); // minimum of 20ms delay between frames double delay = interval - (end-start); if (delay < 0.02) delay = 0.02; usleep((long)(delay * 1000000)); + } } @@ -530,8 +533,6 @@ void ScreenRecoveryUI::Init() { LoadLocalizedBitmap("no_command_text", &backgroundText[NO_COMMAND]); LoadLocalizedBitmap("error_text", &backgroundText[D_ERROR]); - pthread_create(&progress_thread_, nullptr, ProgressThreadStartRoutine, this); - RecoveryUI::Init(); } @@ -574,6 +575,9 @@ void ScreenRecoveryUI::SetProgressType(ProgressType type) { pthread_mutex_lock(&updateMutex); if (progressBarType != type) { progressBarType = type; + if (progressBarType != EMPTY) { + pthread_create(&progress_thread_, nullptr, ProgressThreadStartRoutine, this); + } } progressScopeStart = 0; progressScopeSize = 0; |