Retrofit devices do not do allocatable space / 2.

Retrofit devices have two supers, so the allocatable
space does not need to be halved.

Test: manual OTA
Bug: 118506262
Change-Id: I31c77b9318e7c0b6bc6d1a8ae6efa70a3383b05f
diff --git a/boot_control_android.cc b/boot_control_android.cc
index f4e0a4b..2d2b77e 100644
--- a/boot_control_android.cc
+++ b/boot_control_android.cc
@@ -323,12 +323,17 @@
     total_size += group.size;
   }
 
-  if (total_size > (builder->AllocatableSpace() / 2)) {
-    LOG(ERROR)
-        << "The maximum size of all groups with suffix " << target_suffix
-        << " (" << total_size
-        << ") has exceeded half of allocatable space for dynamic partitions "
-        << (builder->AllocatableSpace() / 2) << ".";
+  string expr;
+  uint64_t allocatable_space = builder->AllocatableSpace();
+  if (!dynamic_control->IsDynamicPartitionsRetrofit()) {
+    allocatable_space /= 2;
+    expr = "half of ";
+  }
+  if (total_size > allocatable_space) {
+    LOG(ERROR) << "The maximum size of all groups with suffix " << target_suffix
+               << " (" << total_size << ") has exceeded " << expr
+               << "allocatable space for dynamic partitions "
+               << allocatable_space << ".";
     return false;
   }
 
diff --git a/boot_control_android_unittest.cc b/boot_control_android_unittest.cc
index 6460ffe..2375714 100644
--- a/boot_control_android_unittest.cc
+++ b/boot_control_android_unittest.cc
@@ -273,6 +273,8 @@
 
     ON_CALL(dynamicControl(), IsDynamicPartitionsEnabled())
         .WillByDefault(Return(true));
+    ON_CALL(dynamicControl(), IsDynamicPartitionsRetrofit())
+        .WillByDefault(Return(false));
     ON_CALL(dynamicControl(), GetDeviceDir(_))
         .WillByDefault(Invoke([](auto path) {
           *path = kFakeDevicePath;
diff --git a/dynamic_partition_control_android.cc b/dynamic_partition_control_android.cc
index 93a0fae..bd34ea9 100644
--- a/dynamic_partition_control_android.cc
+++ b/dynamic_partition_control_android.cc
@@ -54,7 +54,7 @@
   return GetBoolProperty(kUseDynamicPartitions, false);
 }
 
-static bool IsDynamicPartitionsRetrofit() {
+bool DynamicPartitionControlAndroid::IsDynamicPartitionsRetrofit() {
   return GetBoolProperty(kRetrfoitDynamicPartitions, false);
 }
 
diff --git a/dynamic_partition_control_android.h b/dynamic_partition_control_android.h
index 52d4f5b..0ccab4e 100644
--- a/dynamic_partition_control_android.h
+++ b/dynamic_partition_control_android.h
@@ -30,6 +30,7 @@
   DynamicPartitionControlAndroid() = default;
   ~DynamicPartitionControlAndroid();
   bool IsDynamicPartitionsEnabled() override;
+  bool IsDynamicPartitionsRetrofit() override;
   bool MapPartitionOnDeviceMapper(const std::string& super_device,
                                   const std::string& target_partition_name,
                                   uint32_t slot,
diff --git a/dynamic_partition_control_interface.h b/dynamic_partition_control_interface.h
index b92d88a..86a0730 100644
--- a/dynamic_partition_control_interface.h
+++ b/dynamic_partition_control_interface.h
@@ -35,6 +35,9 @@
   // Return true iff dynamic partitions is enabled on this device.
   virtual bool IsDynamicPartitionsEnabled() = 0;
 
+  // Return true iff dynamic partitions is retrofitted on this device.
+  virtual bool IsDynamicPartitionsRetrofit() = 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 7b37581..24aca06 100644
--- a/mock_dynamic_partition_control.h
+++ b/mock_dynamic_partition_control.h
@@ -47,6 +47,7 @@
                     uint32_t));
   MOCK_METHOD1(GetDeviceDir, bool(std::string*));
   MOCK_METHOD0(IsDynamicPartitionsEnabled, bool());
+  MOCK_METHOD0(IsDynamicPartitionsRetrofit, bool());
 };
 
 }  // namespace chromeos_update_engine