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

Commit 636f9ae0 authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Android (Google) Code Review
Browse files

Merge "Allow merging of resources with the same overlayable" into qt-dev

parents beeb4563 ced9a5c1
Loading
Loading
Loading
Loading
+22 −10
Original line number Diff line number Diff line
@@ -138,19 +138,31 @@ static bool MergeEntry(IAaptContext* context, const Source& src,

  if (src_entry->overlayable_item) {
    if (dst_entry->overlayable_item) {
      CHECK(src_entry->overlayable_item.value().overlayable != nullptr);
      Overlayable* src_overlayable = src_entry->overlayable_item.value().overlayable.get();

      CHECK(dst_entry->overlayable_item.value().overlayable != nullptr);
      Overlayable* dst_overlayable = dst_entry->overlayable_item.value().overlayable.get();

      if (src_overlayable->name != dst_overlayable->name
          || src_overlayable->actor != dst_overlayable->actor
          || src_entry->overlayable_item.value().policies !=
             dst_entry->overlayable_item.value().policies) {

        // Do not allow a resource with an overlayable declaration to have that overlayable
      // declaration redefined
        // declaration redefined.
        context->GetDiagnostics()->Error(DiagMessage(src_entry->overlayable_item.value().source)
                                             << "duplicate overlayable declaration for resource '"
                                             << src_entry->name << "'");
        context->GetDiagnostics()->Error(DiagMessage(dst_entry->overlayable_item.value().source)
                                             << "previous declaration here");
        return false;
    } else {
      dst_entry->overlayable_item = std::move(src_entry->overlayable_item);
      }
    }

    dst_entry->overlayable_item = std::move(src_entry->overlayable_item);
  }

  return true;
}

+61 −3
Original line number Diff line number Diff line
@@ -521,6 +521,35 @@ TEST_F(TableMergerTest, SameResourceDifferentNameFail) {
          .Build();

  auto overlayable_second = std::make_shared<Overlayable>("ThemeResources",
                                                          "overlay://customization");
  OverlayableItem overlayable_item_second(overlayable_second);
  overlayable_item_second.policies |= OverlayableItem::Policy::kProduct;
  std::unique_ptr<ResourceTable> table_b =
      test::ResourceTableBuilder()
          .SetPackageId("com.app.a", 0x7f)
          .SetOverlayable("bool/foo", overlayable_item_second)
          .Build();

  ResourceTable final_table;
  TableMergerOptions options;
  options.auto_add_overlay = true;
  TableMerger merger(context_.get(), &final_table, options);
  ASSERT_TRUE(merger.Merge({}, table_a.get(), false /*overlay*/));
  ASSERT_FALSE(merger.Merge({}, table_b.get(), false /*overlay*/));
}

TEST_F(TableMergerTest, SameResourceDifferentActorFail) {
  auto overlayable_first = std::make_shared<Overlayable>("CustomizableResources",
                                                         "overlay://customization");
  OverlayableItem overlayable_item_first(overlayable_first);
  overlayable_item_first.policies |= OverlayableItem::Policy::kProduct;
  std::unique_ptr<ResourceTable> table_a =
      test::ResourceTableBuilder()
          .SetPackageId("com.app.a", 0x7f)
          .SetOverlayable("bool/foo", overlayable_item_first)
          .Build();

  auto overlayable_second = std::make_shared<Overlayable>("CustomizableResources",
                                                          "overlay://theme");
  OverlayableItem overlayable_item_second(overlayable_second);
  overlayable_item_second.policies |= OverlayableItem::Policy::kProduct;
@@ -538,7 +567,36 @@ TEST_F(TableMergerTest, SameResourceDifferentNameFail) {
  ASSERT_FALSE(merger.Merge({}, table_b.get(), false /*overlay*/));
}

TEST_F(TableMergerTest, SameResourceSameNameFail) {
TEST_F(TableMergerTest, SameResourceDifferentPoliciesFail) {
  auto overlayable_first = std::make_shared<Overlayable>("CustomizableResources",
                                                         "overlay://customization");
  OverlayableItem overlayable_item_first(overlayable_first);
  overlayable_item_first.policies |= OverlayableItem::Policy::kProduct;
  std::unique_ptr<ResourceTable> table_a =
      test::ResourceTableBuilder()
          .SetPackageId("com.app.a", 0x7f)
          .SetOverlayable("bool/foo", overlayable_item_first)
          .Build();

  auto overlayable_second = std::make_shared<Overlayable>("CustomizableResources",
                                                          "overlay://customization");
  OverlayableItem overlayable_item_second(overlayable_second);
  overlayable_item_second.policies |= OverlayableItem::Policy::kSignature;
  std::unique_ptr<ResourceTable> table_b =
      test::ResourceTableBuilder()
          .SetPackageId("com.app.a", 0x7f)
          .SetOverlayable("bool/foo", overlayable_item_second)
          .Build();

  ResourceTable final_table;
  TableMergerOptions options;
  options.auto_add_overlay = true;
  TableMerger merger(context_.get(), &final_table, options);
  ASSERT_TRUE(merger.Merge({}, table_a.get(), false /*overlay*/));
  ASSERT_FALSE(merger.Merge({}, table_b.get(), false /*overlay*/));
}

TEST_F(TableMergerTest, SameResourceSameOverlayable) {
  auto overlayable = std::make_shared<Overlayable>("CustomizableResources",
                                                  "overlay://customization");

@@ -551,7 +609,7 @@ TEST_F(TableMergerTest, SameResourceSameNameFail) {
          .Build();

  OverlayableItem overlayable_item_second(overlayable);
  overlayable_item_second.policies |= OverlayableItem::Policy::kSystem;
  overlayable_item_second.policies |= OverlayableItem::Policy::kProduct;
  std::unique_ptr<ResourceTable> table_b =
      test::ResourceTableBuilder()
          .SetPackageId("com.app.a", 0x7f)
@@ -563,7 +621,7 @@ TEST_F(TableMergerTest, SameResourceSameNameFail) {
  options.auto_add_overlay = true;
  TableMerger merger(context_.get(), &final_table, options);
  ASSERT_TRUE(merger.Merge({}, table_a.get(), false /*overlay*/));
  ASSERT_FALSE(merger.Merge({}, table_b.get(), false /*overlay*/));
  ASSERT_TRUE(merger.Merge({}, table_b.get(), false /*overlay*/));
}

}  // namespace aapt