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

Commit ef5673a4 authored by Ryan Mitchell's avatar Ryan Mitchell
Browse files

Add encoding of name and actor overlayable fields

Encode the actor and name attributes of <overlayable> elements in the
overlayable chunks. Two chunks cannot have the same name.

Bug: 110869880
Bug: 119390855
Test: aapt2_tests and libandroidfw_tests
Change-Id: I0ed95efef640b3927046b6155d1840f0d96030dd
parent 56ac01eb
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