Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit eb6f13ae authored by Hridya Valsaraju's avatar Hridya Valsaraju
Browse files

Allow switch to fastbootd when userdata wipe is required

Bug: 114065789
Test: Able to use 'adb reboot fastboot' to switch to fastboot
from recovery when a userdata wipe is required to boot.

Change-Id: Ice6950444656f8d8857808531af030078f544b88
parent a062fae9
Loading
Loading
Loading
Loading
+9 −2
Original line number Diff line number Diff line
@@ -23,8 +23,15 @@

#include <ziparchive/zip_archive.h>

enum { INSTALL_SUCCESS, INSTALL_ERROR, INSTALL_CORRUPT, INSTALL_NONE, INSTALL_SKIPPED,
        INSTALL_RETRY };
enum InstallResult {
  INSTALL_SUCCESS,
  INSTALL_ERROR,
  INSTALL_CORRUPT,
  INSTALL_NONE,
  INSTALL_SKIPPED,
  INSTALL_RETRY,
  INSTALL_KEY_INTERRUPTED
};

// Installs the given update package. If INSTALL_SUCCESS is returned and *wipe_cache is true on
// exit, caller should wipe the cache partition.
+11 −7
Original line number Diff line number Diff line
@@ -388,7 +388,7 @@ static bool wipe_data(Device* device) {
    return success;
}

static bool prompt_and_wipe_data(Device* device) {
static InstallResult prompt_and_wipe_data(Device* device) {
  // Use a single string and let ScreenRecoveryUI handles the wrapping.
  std::vector<std::string> headers{
    "Can't load Android system. Your data may be corrupt. "
@@ -409,13 +409,17 @@ static bool prompt_and_wipe_data(Device* device) {

    // If ShowMenu() returned RecoveryUI::KeyError::INTERRUPTED, WaitKey() was interrupted.
    if (chosen_item == static_cast<size_t>(RecoveryUI::KeyError::INTERRUPTED)) {
      return false;
      return INSTALL_KEY_INTERRUPTED;
    }
    if (chosen_item != 1) {
      return true;  // Just reboot, no wipe; not a failure, user asked for it
      return INSTALL_SUCCESS;  // Just reboot, no wipe; not a failure, user asked for it
    }
    if (ask_to_wipe_data(device)) {
      return wipe_data(device);
      if (wipe_data(device)) {
        return INSTALL_SUCCESS;
      } else {
        return INSTALL_ERROR;
      }
    }
  }
}
@@ -1188,10 +1192,10 @@ Device::BuiltinAction start_recovery(Device* device, const std::vector<std::stri
  } else if (should_prompt_and_wipe_data) {
    ui->ShowText(true);
    ui->SetBackground(RecoveryUI::ERROR);
    if (!prompt_and_wipe_data(device)) {
      status = INSTALL_ERROR;
    }
    status = prompt_and_wipe_data(device);
    if (status != INSTALL_KEY_INTERRUPTED) {
      ui->ShowText(false);
    }
  } else if (should_wipe_cache) {
    if (!wipe_cache(false, device)) {
      status = INSTALL_ERROR;