recovery: Ask to reboot before installing anything after A/B update
Change-Id: Id3e44ddbe11119fcc66d379216f8f5e683979a9f
diff --git a/install/install.cpp b/install/install.cpp
index 61bab17..ff256a0 100644
--- a/install/install.cpp
+++ b/install/install.cpp
@@ -62,6 +62,7 @@
using namespace std::chrono_literals;
+bool ask_to_ab_reboot(Device* device);
bool ask_to_continue_unverified(Device* device);
bool ask_to_continue_downgrade(Device* device);
@@ -383,6 +384,14 @@
return INSTALL_ERROR;
}
+ static bool ab_package_installed = false;
+ if (ab_package_installed) {
+ if (ask_to_ab_reboot(device)) {
+ Reboot("userrequested,recovery,ui");
+ }
+ return INSTALL_ERROR;
+ }
+
if (package_is_ab) {
CHECK(package->GetType() == PackageType::kFile);
}
@@ -568,7 +577,11 @@
LOG(FATAL) << "Invalid status code " << status;
}
if (package_is_ab) {
+ ab_package_installed = true;
PerformPowerwashIfRequired(zip, device);
+ if (ask_to_ab_reboot(device)) {
+ Reboot("userrequested,recovery,ui");
+ }
}
return INSTALL_SUCCESS;
diff --git a/recovery.cpp b/recovery.cpp
index 75430a2..36cb78b 100644
--- a/recovery.cpp
+++ b/recovery.cpp
@@ -175,6 +175,12 @@
return (chosen_item == 1);
}
+bool ask_to_ab_reboot(Device* device) {
+ device->GetUI()->SetProgressType(RecoveryUI::EMPTY);
+ return yes_no(device, "To install additional packages, you need to reboot recovery first",
+ "Do you want to reboot to recovery now?");
+}
+
bool ask_to_continue_unverified(Device* device) {
if (get_build_type() == "user") {
return false;