diff options
-rw-r--r-- | device.h | 6 | ||||
-rw-r--r-- | recovery.cpp | 12 | ||||
-rw-r--r-- | screen_ui.cpp | 9 | ||||
-rw-r--r-- | screen_ui.h | 7 | ||||
-rw-r--r-- | stub_ui.h | 3 | ||||
-rw-r--r-- | ui.h | 2 |
6 files changed, 29 insertions, 10 deletions
@@ -58,6 +58,12 @@ class Device { return ui_; } + // Sets the UI object to the given UI. Used to override the default UI in case initialization + // failed, or we want a stub for some reason. + virtual void SetUI(RecoveryUI* ui) { + ui_ = ui; + } + // Called when recovery starts up (after the UI has been obtained and initialized and after the // arguments have been parsed, but before anything else). virtual void StartRecovery() {}; diff --git a/recovery.cpp b/recovery.cpp index 8dc04a852..95118ffb6 100644 --- a/recovery.cpp +++ b/recovery.cpp @@ -88,7 +88,6 @@ static constexpr const char* SDCARD_ROOT = "/sdcard"; // into target_files.zip. Assert the version defined in code and in Android.mk are consistent. static_assert(kRecoveryApiVersion == RECOVERY_API_VERSION, "Mismatching recovery API versions."); -static std::string locale; static bool has_cache = false; RecoveryUI* ui = nullptr; @@ -231,7 +230,8 @@ static void set_sdcard_update_bootloader_message() { // Clear the recovery command and prepare to boot a (hopefully working) system, // copy our log file to cache as well (for the system to read). This function is // idempotent: call it as many times as you like. -static void finish_recovery() { +static void finish_recovery(Device* device) { + std::string locale = device->GetUI()->GetLocale(); // Save the locale to cache, so if recovery is next started up without a '--locale' argument // (e.g., directly from the bootloader) it will use the last-known locale. if (!locale.empty() && has_cache) { @@ -808,7 +808,7 @@ static int apply_from_sdcard(Device* device, bool* wipe_cache) { // which is to reboot or shutdown depending on if the --shutdown_after flag was passed to recovery. static Device::BuiltinAction prompt_and_wait(Device* device, int status) { for (;;) { - finish_recovery(); + finish_recovery(device); switch (status) { case INSTALL_SUCCESS: case INSTALL_NONE: @@ -896,7 +896,7 @@ static Device::BuiltinAction prompt_and_wait(Device* device, int status) { case Device::RUN_LOCALE_TEST: { ScreenRecoveryUI* screen_ui = static_cast<ScreenRecoveryUI*>(ui); - screen_ui->CheckBackgroundTextImages(locale); + screen_ui->CheckBackgroundTextImages(); break; } case Device::MOUNT_SYSTEM: @@ -1104,6 +1104,7 @@ int start_recovery(int argc, char** argv) { bool shutdown_after = false; int retry_count = 0; bool security_update = false; + std::string locale; int arg; int option_index; @@ -1181,6 +1182,7 @@ int start_recovery(int argc, char** argv) { ui = new StubRecoveryUI(); } } + device->SetUI(ui); // Set background string to "installing security update" for security update, // otherwise set it to "installing system update". @@ -1347,7 +1349,7 @@ int start_recovery(int argc, char** argv) { } // Save logs and clean up before rebooting or shutting down. - finish_recovery(); + finish_recovery(device); switch (after) { case Device::SHUTDOWN: diff --git a/screen_ui.cpp b/screen_ui.cpp index 7ae81e55f..90e0e30af 100644 --- a/screen_ui.cpp +++ b/screen_ui.cpp @@ -372,7 +372,7 @@ void ScreenRecoveryUI::SelectAndShowBackgroundText(const std::vector<std::string std::string header = "Show background text image"; text_y += DrawTextLine(text_x, text_y, header, true); std::string locale_selection = android::base::StringPrintf( - "Current locale: %s, %zu/%zu", locales_entries[sel].c_str(), sel, locales_entries.size()); + "Current locale: %s, %zu/%zu", locales_entries[sel].c_str(), sel + 1, locales_entries.size()); // clang-format off std::vector<std::string> instruction = { locale_selection, @@ -395,13 +395,14 @@ void ScreenRecoveryUI::SelectAndShowBackgroundText(const std::vector<std::string pthread_mutex_unlock(&updateMutex); } -void ScreenRecoveryUI::CheckBackgroundTextImages(const std::string& saved_locale) { +void ScreenRecoveryUI::CheckBackgroundTextImages() { // Load a list of locales embedded in one of the resource files. std::vector<std::string> locales_entries = get_locales_in_png("installing_text"); if (locales_entries.empty()) { Print("Failed to load locales from the resource files\n"); return; } + std::string saved_locale = locale_; size_t selected = 0; SelectAndShowBackgroundText(locales_entries, selected); @@ -748,6 +749,10 @@ bool ScreenRecoveryUI::Init(const std::string& locale) { return true; } +std::string ScreenRecoveryUI::GetLocale() { + return locale_; +} + void ScreenRecoveryUI::LoadAnimation() { std::unique_ptr<DIR, decltype(&closedir)> dir(opendir("/res/images"), closedir); dirent* de; diff --git a/screen_ui.h b/screen_ui.h index fb811ce70..d4923f566 100644 --- a/screen_ui.h +++ b/screen_ui.h @@ -114,6 +114,7 @@ class ScreenRecoveryUI : public RecoveryUI { explicit ScreenRecoveryUI(bool scrollable_menu); bool Init(const std::string& locale) override; + std::string GetLocale() override; // overall recovery state ("background image") void SetBackground(Icon icon) override; @@ -147,9 +148,9 @@ class ScreenRecoveryUI : public RecoveryUI { void SetColor(UIElement e) const; - // Check the background text image. Use volume up/down button to cycle through the locales - // embedded in the png file, and power button to go back to recovery main menu. - void CheckBackgroundTextImages(const std::string& saved_locale); + // Checks the background text image, for debugging purpose. It iterates the locales embedded in + // the on-device resource files and shows the localized text, for manual inspection. + void CheckBackgroundTextImages(); protected: // The margin that we don't want to use for showing texts (e.g. round screen, or screen with @@ -28,6 +28,9 @@ class StubRecoveryUI : public RecoveryUI { public: StubRecoveryUI() = default; + std::string GetLocale() override { + return ""; + } void SetBackground(Icon /* icon */) override {} void SetSystemUpdateText(bool /* security_update */) override {} @@ -57,6 +57,8 @@ class RecoveryUI { // the given locale. Returns true on success. virtual bool Init(const std::string& locale); + virtual std::string GetLocale() = 0; + // Shows a stage indicator. Called immediately after Init(). virtual void SetStage(int current, int max) = 0; |