Add more data to SnapshotMergeReported.

This adds io_uring, userspace snapshots, and xor compression information
to SnapshotMergeReported.

Bug: 222117189
Test: stats_testdrive after OTA
Change-Id: I94f046cd7bd621a3b166c470f2a1e113363c8e8c
diff --git a/aosp/cleanup_previous_update_action.cc b/aosp/cleanup_previous_update_action.cc
index 55dba1e..bc92221 100644
--- a/aosp/cleanup_previous_update_action.cc
+++ b/aosp/cleanup_previous_update_action.cc
@@ -277,7 +277,7 @@
   AcknowledgeTaskExecuted();
   TEST_AND_RETURN(running_);
 
-  auto update_uses_compression = snapshot_->UpdateUsesCompression();
+  snapshot_->SetMergeStatsFeatures(merge_stats_);
 
   // Propagate the merge failure code to the merge stats. If we wait until
   // after ProcessUpdateState, then a successful merge could overwrite the
@@ -290,7 +290,7 @@
   auto state = snapshot_->ProcessUpdateState(
       std::bind(&CleanupPreviousUpdateAction::OnMergePercentageUpdate, this),
       std::bind(&CleanupPreviousUpdateAction::BeforeCancel, this));
-  merge_stats_->set_state(state, update_uses_compression);
+  merge_stats_->set_state(state);
 
   switch (state) {
     case UpdateState::None: {
@@ -434,7 +434,7 @@
 
   LOG(WARNING) << "InitiateMerge failed.";
   auto state = snapshot_->GetUpdateState();
-  merge_stats_->set_state(state, snapshot_->UpdateUsesCompression());
+  merge_stats_->set_state(state);
   if (state == UpdateState::Unverified) {
     // We are stuck at unverified state. This can happen if the update has
     // been applied, but it has not even been attempted yet (in libsnapshot,
@@ -494,6 +494,16 @@
   // DynamicPartitionControlInterface::UpdateUsesSnapshotCompression.
   // However, we have saved the flag in the snapshot report.
   bool vab_compression_used = report.compression_enabled();
+  bool userspace_snapshots_enabled =
+      boot_control_->GetDynamicPartitionControl()
+          ->GetVirtualAbUserspaceSnapshotsFeatureFlag()
+          .IsEnabled();
+  bool userspace_snapshots_used = report.userspace_snapshots_used();
+  bool xor_compression_enabled = boot_control_->GetDynamicPartitionControl()
+                                     ->GetVirtualAbCompressionXorFeatureFlag()
+                                     .IsEnabled();
+  bool xor_compression_used = report.xor_compression_used();
+  bool iouring_used = report.iouring_used();
 
   auto target_build_fingerprint =
       android::base::GetProperty("ro.build.fingerprint", "");
@@ -517,7 +527,12 @@
                              report.boot_complete_to_merge_start_time_ms(),
                              static_cast<int32_t>(report.merge_failure_code()),
                              report.source_build_fingerprint().c_str(),
-                             target_build_fingerprint.c_str());
+                             target_build_fingerprint.c_str(),
+                             userspace_snapshots_enabled,
+                             userspace_snapshots_used,
+                             xor_compression_enabled,
+                             xor_compression_used,
+                             iouring_used);
 #endif
 }
 
diff --git a/aosp/dynamic_partition_control_android.cc b/aosp/dynamic_partition_control_android.cc
index 27d1d54..b295442 100644
--- a/aosp/dynamic_partition_control_android.cc
+++ b/aosp/dynamic_partition_control_android.cc
@@ -84,6 +84,8 @@
     "ro.virtual_ab.compression.enabled";
 constexpr auto&& kVirtualAbCompressionXorEnabled =
     "ro.virtual_ab.compression.xor.enabled";
+constexpr char kVirtualAbUserspaceSnapshotsEnabled[] =
+    "ro.virtual_ab.userspace.snapshots.enabled";
 
 // Currently, android doesn't have a retrofit prop for VAB Compression. However,
 // struct FeatureFlag forces us to determine if a feature is 'retrofit'. So this
@@ -130,6 +132,8 @@
                                              kVirtualAbCompressionRetrofit)),
       virtual_ab_compression_xor_(
           GetFeatureFlag(kVirtualAbCompressionXorEnabled, "")),
+      virtual_ab_userspace_snapshots_(
+          GetFeatureFlag(kVirtualAbUserspaceSnapshotsEnabled, nullptr)),
       source_slot_(source_slot) {
   if (GetVirtualAbFeatureFlag().IsEnabled()) {
     snapshot_ = SnapshotManager::New();
@@ -1496,4 +1500,9 @@
          snapshot_->UpdateUsesCompression();
 }
 
+FeatureFlag
+DynamicPartitionControlAndroid::GetVirtualAbUserspaceSnapshotsFeatureFlag() {
+  return virtual_ab_userspace_snapshots_;
+}
+
 }  // namespace chromeos_update_engine
diff --git a/aosp/dynamic_partition_control_android.h b/aosp/dynamic_partition_control_android.h
index 92761d2..9851a99 100644
--- a/aosp/dynamic_partition_control_android.h
+++ b/aosp/dynamic_partition_control_android.h
@@ -45,6 +45,7 @@
   FeatureFlag GetVirtualAbFeatureFlag() override;
   FeatureFlag GetVirtualAbCompressionFeatureFlag() override;
   FeatureFlag GetVirtualAbCompressionXorFeatureFlag() override;
+  FeatureFlag GetVirtualAbUserspaceSnapshotsFeatureFlag() override;
   bool OptimizeOperation(const std::string& partition_name,
                          const InstallOperation& operation,
                          InstallOperation* optimized) override;
@@ -341,6 +342,7 @@
   const FeatureFlag virtual_ab_;
   const FeatureFlag virtual_ab_compression_;
   const FeatureFlag virtual_ab_compression_xor_;
+  const FeatureFlag virtual_ab_userspace_snapshots_;
   std::unique_ptr<android::snapshot::ISnapshotManager> snapshot_;
   std::unique_ptr<android::snapshot::AutoDevice> metadata_device_;
   bool target_supports_snapshot_ = false;
diff --git a/aosp/mock_dynamic_partition_control_android.h b/aosp/mock_dynamic_partition_control_android.h
index f55cdf7..e940e50 100644
--- a/aosp/mock_dynamic_partition_control_android.h
+++ b/aosp/mock_dynamic_partition_control_android.h
@@ -77,6 +77,10 @@
               GetVirtualAbCompressionXorFeatureFlag,
               (),
               (override));
+  MOCK_METHOD(FeatureFlag,
+              GetVirtualAbUserspaceSnapshotsFeatureFlag,
+              (),
+              (override));
   MOCK_METHOD(bool, FinishUpdate, (bool), (override));
   MOCK_METHOD(bool,
               GetSystemOtherPath,