DynamicPartitionsControl: Add Virtual A/B feature flag.

Test: unittest
Bug: 138816109
Change-Id: I7ae65ba0bf36a6ca5085bc4ec2c46245288b4703
diff --git a/boot_control_android_unittest.cc b/boot_control_android_unittest.cc
index 6f02a07..3b92191 100644
--- a/boot_control_android_unittest.cc
+++ b/boot_control_android_unittest.cc
@@ -62,6 +62,8 @@
 
     ON_CALL(dynamicControl(), GetDynamicPartitionsFeatureFlag())
         .WillByDefault(Return(FeatureFlag(FeatureFlag::Value::LAUNCH)));
+    ON_CALL(dynamicControl(), GetVirtualAbFeatureFlag())
+        .WillByDefault(Return(FeatureFlag(FeatureFlag::Value::NONE)));
     ON_CALL(dynamicControl(), DeviceExists(_)).WillByDefault(Return(true));
     ON_CALL(dynamicControl(), GetDeviceDir(_))
         .WillByDefault(Invoke([](auto path) {
diff --git a/dynamic_partition_control_android.cc b/dynamic_partition_control_android.cc
index 5a2ccb1..b973232 100644
--- a/dynamic_partition_control_android.cc
+++ b/dynamic_partition_control_android.cc
@@ -53,6 +53,8 @@
 constexpr char kUseDynamicPartitions[] = "ro.boot.dynamic_partitions";
 constexpr char kRetrfoitDynamicPartitions[] =
     "ro.boot.dynamic_partitions_retrofit";
+constexpr char kVirtualAbEnabled[] = "ro.virtual_ab.enabled";
+constexpr char kVirtualAbRetrofit[] = "ro.virtual_ab.retrofit";
 constexpr uint64_t kMapTimeoutMillis = 1000;
 
 DynamicPartitionControlAndroid::~DynamicPartitionControlAndroid() {
@@ -81,6 +83,10 @@
   return GetFeatureFlag(kUseDynamicPartitions, kRetrfoitDynamicPartitions);
 }
 
+FeatureFlag DynamicPartitionControlAndroid::GetVirtualAbFeatureFlag() {
+  return GetFeatureFlag(kVirtualAbEnabled, kVirtualAbRetrofit);
+}
+
 bool DynamicPartitionControlAndroid::MapPartitionInternal(
     const std::string& super_device,
     const std::string& target_partition_name,
diff --git a/dynamic_partition_control_android.h b/dynamic_partition_control_android.h
index 062a2d1..d743e6e 100644
--- a/dynamic_partition_control_android.h
+++ b/dynamic_partition_control_android.h
@@ -30,6 +30,7 @@
   DynamicPartitionControlAndroid() = default;
   ~DynamicPartitionControlAndroid();
   FeatureFlag GetDynamicPartitionsFeatureFlag() override;
+  FeatureFlag GetVirtualAbFeatureFlag() override;
   bool MapPartitionOnDeviceMapper(const std::string& super_device,
                                   const std::string& target_partition_name,
                                   uint32_t slot,
diff --git a/dynamic_partition_control_android_unittest.cc b/dynamic_partition_control_android_unittest.cc
index 5b3dfe3..1a3f664 100644
--- a/dynamic_partition_control_android_unittest.cc
+++ b/dynamic_partition_control_android_unittest.cc
@@ -44,6 +44,8 @@
 
     ON_CALL(dynamicControl(), GetDynamicPartitionsFeatureFlag())
         .WillByDefault(Return(FeatureFlag(FeatureFlag::Value::LAUNCH)));
+    ON_CALL(dynamicControl(), GetVirtualAbFeatureFlag())
+        .WillByDefault(Return(FeatureFlag(FeatureFlag::Value::NONE)));
 
     ON_CALL(dynamicControl(), GetDeviceDir(_))
         .WillByDefault(Invoke([](auto path) {
diff --git a/dynamic_partition_control_interface.h b/dynamic_partition_control_interface.h
index b3ce4ea..9c7b8d0 100644
--- a/dynamic_partition_control_interface.h
+++ b/dynamic_partition_control_interface.h
@@ -50,6 +50,9 @@
   //        NONE iff dynamic partitions is disabled on this device.
   virtual FeatureFlag GetDynamicPartitionsFeatureFlag() = 0;
 
+  // Return the feature flags of Virtual A/B on this device.
+  virtual FeatureFlag GetVirtualAbFeatureFlag() = 0;
+
   // Map logical partition on device-mapper.
   // |super_device| is the device path of the physical partition ("super").
   // |target_partition_name| is the identifier used in metadata; for example,
diff --git a/mock_dynamic_partition_control.h b/mock_dynamic_partition_control.h
index 26fc246..aab3c4d 100644
--- a/mock_dynamic_partition_control.h
+++ b/mock_dynamic_partition_control.h
@@ -49,6 +49,7 @@
                     uint32_t,
                     const BootControlInterface::PartitionMetadata&));
   MOCK_METHOD1(GetSuperPartitionName, std::string(uint32_t));
+  MOCK_METHOD0(GetVirtualAbFeatureFlag, FeatureFlag());
 };
 
 class MockDynamicPartitionControlAndroid
@@ -75,6 +76,7 @@
   MOCK_METHOD1(GetDeviceDir, bool(std::string*));
   MOCK_METHOD0(GetDynamicPartitionsFeatureFlag, FeatureFlag());
   MOCK_METHOD1(GetSuperPartitionName, std::string(uint32_t));
+  MOCK_METHOD0(GetVirtualAbFeatureFlag, FeatureFlag());
 };
 
 }  // namespace chromeos_update_engine