Allow forward merge on powerwash.

If package schedules powerwash, snapshots on a Virtual A/B device
will be deleted. Tell SnapshotManager to handle this case.

Test: apply downgrade package
Test: apply package with wipe
Test: apply package then manually wipe
Bug: 152094219
Change-Id: I8601b661924abcc82956788e2f33cdb70d71f778
diff --git a/common/dynamic_partition_control_interface.h b/common/dynamic_partition_control_interface.h
index d5db9bc..58ebfe4 100644
--- a/common/dynamic_partition_control_interface.h
+++ b/common/dynamic_partition_control_interface.h
@@ -87,7 +87,7 @@
 
   // After writing to new partitions, before rebooting into the new slot, call
   // this function to indicate writes to new partitions are done.
-  virtual bool FinishUpdate() = 0;
+  virtual bool FinishUpdate(bool powerwash_required) = 0;
 
   // Get an action to clean up previous update.
   // Return NoOpAction on non-Virtual A/B devices.
diff --git a/common/dynamic_partition_control_stub.cc b/common/dynamic_partition_control_stub.cc
index 1239eab..903b7ee 100644
--- a/common/dynamic_partition_control_stub.cc
+++ b/common/dynamic_partition_control_stub.cc
@@ -51,7 +51,7 @@
   return true;
 }
 
-bool DynamicPartitionControlStub::FinishUpdate() {
+bool DynamicPartitionControlStub::FinishUpdate(bool powerwash_required) {
   return true;
 }
 
diff --git a/common/dynamic_partition_control_stub.h b/common/dynamic_partition_control_stub.h
index 679d028..d8e254e 100644
--- a/common/dynamic_partition_control_stub.h
+++ b/common/dynamic_partition_control_stub.h
@@ -40,7 +40,7 @@
                                   bool update,
                                   uint64_t* required_size) override;
 
-  bool FinishUpdate() override;
+  bool FinishUpdate(bool powerwash_required) override;
   std::unique_ptr<AbstractAction> GetCleanupPreviousUpdateAction(
       BootControlInterface* boot_control,
       PrefsInterface* prefs,
diff --git a/dynamic_partition_control_android.cc b/dynamic_partition_control_android.cc
index 81d0d77..09f61ad 100644
--- a/dynamic_partition_control_android.cc
+++ b/dynamic_partition_control_android.cc
@@ -624,11 +624,11 @@
   return true;
 }
 
-bool DynamicPartitionControlAndroid::FinishUpdate() {
+bool DynamicPartitionControlAndroid::FinishUpdate(bool powerwash_required) {
   if (GetVirtualAbFeatureFlag().IsEnabled() &&
       snapshot_->GetUpdateState() == UpdateState::Initiated) {
     LOG(INFO) << "Snapshot writes are done.";
-    return snapshot_->FinishedSnapshotWrites();
+    return snapshot_->FinishedSnapshotWrites(powerwash_required);
   }
   return true;
 }
diff --git a/dynamic_partition_control_android.h b/dynamic_partition_control_android.h
index a11889a..6dbe370 100644
--- a/dynamic_partition_control_android.h
+++ b/dynamic_partition_control_android.h
@@ -45,7 +45,7 @@
                                   const DeltaArchiveManifest& manifest,
                                   bool update,
                                   uint64_t* required_size) override;
-  bool FinishUpdate() override;
+  bool FinishUpdate(bool powerwash_required) override;
   std::unique_ptr<AbstractAction> GetCleanupPreviousUpdateAction(
       BootControlInterface* boot_control,
       PrefsInterface* prefs,
diff --git a/mock_dynamic_partition_control.h b/mock_dynamic_partition_control.h
index b3e0c24..169c265 100644
--- a/mock_dynamic_partition_control.h
+++ b/mock_dynamic_partition_control.h
@@ -42,7 +42,7 @@
       PreparePartitionsForUpdate,
       bool(uint32_t, uint32_t, const DeltaArchiveManifest&, bool, uint64_t*));
   MOCK_METHOD0(GetVirtualAbFeatureFlag, FeatureFlag());
-  MOCK_METHOD0(FinishUpdate, bool());
+  MOCK_METHOD1(FinishUpdate, bool(bool));
   MOCK_METHOD0(CleanupSuccessfulUpdate, ErrorCode());
   MOCK_METHOD3(GetCleanupPreviousUpdateAction,
                std::unique_ptr<AbstractAction>(
@@ -76,7 +76,7 @@
   MOCK_METHOD0(GetDynamicPartitionsFeatureFlag, FeatureFlag());
   MOCK_METHOD1(GetSuperPartitionName, std::string(uint32_t));
   MOCK_METHOD0(GetVirtualAbFeatureFlag, FeatureFlag());
-  MOCK_METHOD0(FinishUpdate, bool());
+  MOCK_METHOD1(FinishUpdate, bool(bool));
 
   void set_fake_mapped_devices(const std::set<std::string>& fake) override {
     DynamicPartitionControlAndroid::set_fake_mapped_devices(fake);
diff --git a/payload_consumer/postinstall_runner_action.cc b/payload_consumer/postinstall_runner_action.cc
index 0f48493..c08cfc2 100644
--- a/payload_consumer/postinstall_runner_action.cc
+++ b/payload_consumer/postinstall_runner_action.cc
@@ -341,7 +341,8 @@
   // steps succeeded.
   if (error_code == ErrorCode::kSuccess) {
     if (install_plan_.switch_slot_on_reboot) {
-      if (!boot_control_->GetDynamicPartitionControl()->FinishUpdate() ||
+      if (!boot_control_->GetDynamicPartitionControl()->FinishUpdate(
+              install_plan_.powerwash_required) ||
           !boot_control_->SetActiveBootSlot(install_plan_.target_slot)) {
         error_code = ErrorCode::kPostinstallRunnerError;
       } else {