Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit cf9dd943 authored by Ryan Mitchell's avatar Ryan Mitchell Committed by Android (Google) Code Review
Browse files

Merge "Add encoding of name and actor overlayable fields"

parents edb5e1a1 ef5673a4
Loading
Loading
Loading
Loading
+11 −4
Original line number Diff line number Diff line
@@ -593,7 +593,12 @@ std::unique_ptr<const LoadedPackage> LoadedPackage::Load(const Chunk& chunk,
          return {};
        }

        // Iterate over the overlayable policy chunks
        std::string name;
        util::ReadUtf16StringFromDevice(header->name, arraysize(header->name), &name);
        std::string actor;
        util::ReadUtf16StringFromDevice(header->actor, arraysize(header->actor), &actor);

        // Iterate over the overlayable policy chunks contained within the overlayable chunk data
        ChunkIterator overlayable_iter(child_chunk.data_ptr(), child_chunk.data_size());
        while (overlayable_iter.HasNext()) {
          const Chunk overlayable_child_chunk = overlayable_iter.Next();
@@ -613,7 +618,7 @@ std::unique_ptr<const LoadedPackage> LoadedPackage::Load(const Chunk& chunk,
                return {};
              }

              // Retrieve all the ids belonging to this policy
              // Retrieve all the resource ids belonging to this policy chunk
              std::unordered_set<uint32_t> ids;
              const auto ids_begin =
                  reinterpret_cast<const ResTable_ref*>(overlayable_child_chunk.data_ptr());
@@ -622,8 +627,10 @@ std::unique_ptr<const LoadedPackage> LoadedPackage::Load(const Chunk& chunk,
                ids.insert(dtohl(id_iter->ident));
              }

              // Add the pairing of overlayable properties to resource ids to the package
              // Add the pairing of overlayable properties and resource ids to the package
              OverlayableInfo overlayable_info{};
              overlayable_info.name = name;
              overlayable_info.actor = actor;
              overlayable_info.policy_flags = policy_header->policy_flags;
              loaded_package->overlayable_infos_.push_back(std::make_pair(overlayable_info, ids));
              break;
@@ -636,7 +643,7 @@ std::unique_ptr<const LoadedPackage> LoadedPackage::Load(const Chunk& chunk,
        }

        if (overlayable_iter.HadError()) {
          LOG(ERROR) << StringPrintf("Error parsing RES_TABLE_OVERLAYABLE_POLICY_TYPE: %s",
          LOG(ERROR) << StringPrintf("Error parsing RES_TABLE_OVERLAYABLE_TYPE: %s",
                                     overlayable_iter.GetLastError().c_str());
          if (overlayable_iter.HadFatalError()) {
            return {};
+2 −0
Original line number Diff line number Diff line
@@ -78,6 +78,8 @@ struct TypeSpec {
using TypeSpecPtr = util::unique_cptr<TypeSpec>;

struct OverlayableInfo {
  std::string name;
  std::string actor;
  uint32_t policy_flags;
};

+6 −0
Original line number Diff line number Diff line
@@ -1611,6 +1611,12 @@ struct ResTable_lib_entry
struct ResTable_overlayable_header
{
  struct ResChunk_header header;

  // The name of the overlayable set of resources that overlays target.
  uint16_t name[256];

 // The component responsible for enabling and disabling overlays targeting this chunk.
  uint16_t actor[256];
};

/**
+8 −0
Original line number Diff line number Diff line
@@ -294,22 +294,30 @@ TEST(LoadedArscTest, LoadOverlayable) {

  info = package->GetOverlayableInfo(overlayable::R::string::overlayable1);
  ASSERT_THAT(info, NotNull());
  EXPECT_THAT(info->name, Eq("OverlayableResources1"));
  EXPECT_THAT(info->actor, Eq("overlay://theme"));
  EXPECT_THAT(info->policy_flags, Eq(ResTable_overlayable_policy_header::POLICY_PUBLIC));

  info = package->GetOverlayableInfo(overlayable::R::string::overlayable2);
  ASSERT_THAT(info, NotNull());
  EXPECT_THAT(info->name, Eq("OverlayableResources1"));
  EXPECT_THAT(info->actor, Eq("overlay://theme"));
  EXPECT_THAT(info->policy_flags,
              Eq(ResTable_overlayable_policy_header::POLICY_SYSTEM_PARTITION
                 | ResTable_overlayable_policy_header::POLICY_PRODUCT_PARTITION));

  info = package->GetOverlayableInfo(overlayable::R::string::overlayable3);
  ASSERT_THAT(info, NotNull());
  EXPECT_THAT(info->name, Eq("OverlayableResources2"));
  EXPECT_THAT(info->actor, Eq("overlay://com.android.overlayable"));
  EXPECT_THAT(info->policy_flags,
              Eq(ResTable_overlayable_policy_header::POLICY_VENDOR_PARTITION
                 | ResTable_overlayable_policy_header::POLICY_PRODUCT_SERVICES_PARTITION
                 | ResTable_overlayable_policy_header::POLICY_PRODUCT_PARTITION));

  info = package->GetOverlayableInfo(overlayable::R::string::overlayable4);
  EXPECT_THAT(info->name, Eq("OverlayableResources1"));
  EXPECT_THAT(info->actor, Eq("overlay://theme"));
  ASSERT_THAT(info, NotNull());
  EXPECT_THAT(info->policy_flags, Eq(ResTable_overlayable_policy_header::POLICY_PUBLIC));
}
Loading