Make update_engine reserve space for decompression via apexd

Bug: 172911822
Test: atest ApexHandlerAndroidTest (checked that file was created)
Change-Id: I8024695ebba1a9c1796c05b27a0eec3da3b3d1bc
diff --git a/aosp/apex_handler_android.cc b/aosp/apex_handler_android.cc
index cdbc983..38ec410 100644
--- a/aosp/apex_handler_android.cc
+++ b/aosp/apex_handler_android.cc
@@ -23,32 +23,15 @@
 
 namespace chromeos_update_engine {
 
-// Don't change this path... apexd relies on it.
-constexpr const char* kApexReserveSpaceDir = "/data/apex/ota_reserved";
+namespace {
 
-uint64_t ApexHandlerAndroid::CalculateSize(
-    const std::vector<ApexInfo>& apex_infos) const {
-  return CalculateSize(apex_infos, GetApexService());
-}
-
-uint64_t ApexHandlerAndroid::CalculateSize(
-    const std::vector<ApexInfo>& apex_infos,
-    android::sp<android::apex::IApexService> apex_service) const {
-  // The safest option is to allocate space for every compressed APEX
-  uint64_t size_required_default = 0;
-
-  // We might not need to decompress every APEX. Communicate with apexd to get
-  // accurate requirement.
-  int64_t size_from_apexd;
+android::apex::CompressedApexInfoList CreateCompressedApexInfoList(
+    const std::vector<ApexInfo>& apex_infos) {
   android::apex::CompressedApexInfoList compressed_apex_info_list;
-
   for (const auto& apex_info : apex_infos) {
     if (!apex_info.is_compressed()) {
       continue;
     }
-
-    size_required_default += apex_info.decompressed_size();
-
     android::apex::CompressedApexInfo compressed_apex_info;
     compressed_apex_info.moduleName = apex_info.package_name();
     compressed_apex_info.versionCode = apex_info.version();
@@ -56,33 +39,41 @@
     compressed_apex_info_list.apexInfos.emplace_back(
         std::move(compressed_apex_info));
   }
-  if (size_required_default == 0 || apex_service == nullptr) {
-    return size_required_default;
+  return compressed_apex_info_list;
+}
+
+}  // namespace
+
+android::base::Result<uint64_t> ApexHandlerAndroid::CalculateSize(
+    const std::vector<ApexInfo>& apex_infos) const {
+  // We might not need to decompress every APEX. Communicate with apexd to get
+  // accurate requirement.
+  auto apex_service = GetApexService();
+  if (apex_service == nullptr) {
+    return android::base::Error() << "Failed to get hold of apexservice";
   }
 
+  auto compressed_apex_info_list = CreateCompressedApexInfoList(apex_infos);
+  int64_t size_from_apexd;
   auto result = apex_service->calculateSizeForCompressedApex(
       compressed_apex_info_list, &size_from_apexd);
   if (!result.isOk()) {
-    return size_required_default;
+    return android::base::Error()
+           << "Failed to get size required from apexservice";
   }
   return size_from_apexd;
 }
 
-bool ApexHandlerAndroid::AllocateSpace(const uint64_t size_required) const {
-  return AllocateSpace(size_required, kApexReserveSpaceDir);
-}
-
-bool ApexHandlerAndroid::AllocateSpace(const uint64_t size_required,
-                                       const std::string& dir_path) const {
-  if (size_required == 0) {
-    return true;
+bool ApexHandlerAndroid::AllocateSpace(
+    const std::vector<ApexInfo>& apex_infos) const {
+  auto apex_service = GetApexService();
+  if (apex_service == nullptr) {
+    return false;
   }
-  base::FilePath path{dir_path};
-  // The filename is not important, it just needs to be under
-  // kApexReserveSpaceDir. We call it "full.tmp" because the current space
-  // estimation is simply adding up all decompressed sizes.
-  path = path.Append("full.tmp");
-  return utils::ReserveStorageSpace(path.value().c_str(), size_required);
+  auto compressed_apex_info_list = CreateCompressedApexInfoList(apex_infos);
+  auto result =
+      apex_service->reserveSpaceForCompressedApex(compressed_apex_info_list);
+  return result.isOk();
 }
 
 android::sp<android::apex::IApexService> ApexHandlerAndroid::GetApexService()