Add actor and name parsing for overlayable
Add parsing of two overlayable attributes:
name : The unnique identifying name of the overlayable set of resources
actor: The component responsible for enabling and disabling overlays
targeting the specified set of resources
Bug: 110869880
Bug: 119390855
Test: m -j aapt2_tests
Change-Id: Id42463e2b92b69034fb39cd29bc8606affb61ba7
diff --git a/tools/aapt2/link/ReferenceLinker.cpp b/tools/aapt2/link/ReferenceLinker.cpp
index 8cbc037..c2340ba 100644
--- a/tools/aapt2/link/ReferenceLinker.cpp
+++ b/tools/aapt2/link/ReferenceLinker.cpp
@@ -374,8 +374,8 @@
}
// Ensure that definitions for values declared as overlayable exist
- if (entry->overlayable && entry->values.empty()) {
- context->GetDiagnostics()->Error(DiagMessage(entry->overlayable.value().source)
+ if (entry->overlayable_item && entry->values.empty()) {
+ context->GetDiagnostics()->Error(DiagMessage(entry->overlayable_item.value().source)
<< "no definition for overlayable symbol '"
<< name << "'");
error = true;
diff --git a/tools/aapt2/link/TableMerger.cpp b/tools/aapt2/link/TableMerger.cpp
index 22e1723..cc9fed5 100644
--- a/tools/aapt2/link/TableMerger.cpp
+++ b/tools/aapt2/link/TableMerger.cpp
@@ -134,18 +134,18 @@
dst_entry->allow_new = std::move(src_entry->allow_new);
}
- if (src_entry->overlayable) {
- if (dst_entry->overlayable) {
+ if (src_entry->overlayable_item) {
+ if (dst_entry->overlayable_item) {
// Do not allow a resource with an overlayable declaration to have that overlayable
// declaration redefined
- context->GetDiagnostics()->Error(DiagMessage(src_entry->overlayable.value().source)
+ 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.value().source)
+ context->GetDiagnostics()->Error(DiagMessage(dst_entry->overlayable_item.value().source)
<< "previous declaration here");
return false;
} else {
- dst_entry->overlayable = std::move(src_entry->overlayable);
+ dst_entry->overlayable_item = std::move(src_entry->overlayable_item);
}
}
diff --git a/tools/aapt2/link/TableMerger_test.cpp b/tools/aapt2/link/TableMerger_test.cpp
index 17b2a83..921d634 100644
--- a/tools/aapt2/link/TableMerger_test.cpp
+++ b/tools/aapt2/link/TableMerger_test.cpp
@@ -437,14 +437,16 @@
}
TEST_F(TableMergerTest, SetOverlayable) {
- Overlayable overlayable{};
- overlayable.policies |= Overlayable::Policy::kProduct;
- overlayable.policies |= Overlayable::Policy::kVendor;
+ auto overlayable = std::make_shared<Overlayable>("CustomizableResources",
+ "overlay://customization");
+ OverlayableItem overlayable_item(overlayable);
+ overlayable_item.policies |= OverlayableItem::Policy::kProduct;
+ overlayable_item.policies |= OverlayableItem::Policy::kVendor;
std::unique_ptr<ResourceTable> table_a =
test::ResourceTableBuilder()
.SetPackageId("com.app.a", 0x7f)
- .SetOverlayable("bool/foo", overlayable)
+ .SetOverlayable("bool/foo", overlayable_item)
.Build();
std::unique_ptr<ResourceTable> table_b =
@@ -463,26 +465,30 @@
const ResourceName name = test::ParseNameOrDie("com.app.a:bool/foo");
Maybe<ResourceTable::SearchResult> search_result = final_table.FindResource(name);
ASSERT_TRUE(search_result);
- ASSERT_TRUE(search_result.value().entry->overlayable);
- Overlayable& result_overlayable = search_result.value().entry->overlayable.value();
- EXPECT_THAT(result_overlayable.policies, Eq(Overlayable::Policy::kProduct
- | Overlayable::Policy::kVendor));
+ ASSERT_TRUE(search_result.value().entry->overlayable_item);
+ OverlayableItem& result_overlayable_item = search_result.value().entry->overlayable_item.value();
+ EXPECT_THAT(result_overlayable_item.overlayable->name, Eq("CustomizableResources"));
+ EXPECT_THAT(result_overlayable_item.overlayable->actor, Eq("overlay://customization"));
+ EXPECT_THAT(result_overlayable_item.policies, Eq(OverlayableItem::Policy::kProduct
+ | OverlayableItem::Policy::kVendor));
}
TEST_F(TableMergerTest, SetOverlayableLater) {
+ auto overlayable = std::make_shared<Overlayable>("CustomizableResources",
+ "overlay://customization");
std::unique_ptr<ResourceTable> table_a =
test::ResourceTableBuilder()
.SetPackageId("com.app.a", 0x7f)
.AddSimple("bool/foo")
.Build();
- Overlayable overlayable{};
- overlayable.policies |= Overlayable::Policy::kPublic;
- overlayable.policies |= Overlayable::Policy::kProductServices;
+ OverlayableItem overlayable_item(overlayable);
+ overlayable_item.policies |= OverlayableItem::Policy::kPublic;
+ overlayable_item.policies |= OverlayableItem::Policy::kProductServices;
std::unique_ptr<ResourceTable> table_b =
test::ResourceTableBuilder()
.SetPackageId("com.app.a", 0x7f)
- .SetOverlayable("bool/foo", overlayable)
+ .SetOverlayable("bool/foo", overlayable_item)
.Build();
ResourceTable final_table;
@@ -495,27 +501,33 @@
const ResourceName name = test::ParseNameOrDie("com.app.a:bool/foo");
Maybe<ResourceTable::SearchResult> search_result = final_table.FindResource(name);
ASSERT_TRUE(search_result);
- ASSERT_TRUE(search_result.value().entry->overlayable);
- Overlayable& result_overlayable = search_result.value().entry->overlayable.value();
- EXPECT_THAT(result_overlayable.policies, Eq(Overlayable::Policy::kPublic
- | Overlayable::Policy::kProductServices));
+ ASSERT_TRUE(search_result.value().entry->overlayable_item);
+ OverlayableItem& result_overlayable_item = search_result.value().entry->overlayable_item.value();
+ EXPECT_THAT(result_overlayable_item.overlayable->name, Eq("CustomizableResources"));
+ EXPECT_THAT(result_overlayable_item.overlayable->actor, Eq("overlay://customization"));
+ EXPECT_THAT(result_overlayable_item.policies, Eq(OverlayableItem::Policy::kPublic
+ | OverlayableItem::Policy::kProductServices));
}
-TEST_F(TableMergerTest, SetOverlayableSamePolicesFail) {
- Overlayable overlayable_first{};
- overlayable_first.policies |= Overlayable::Policy::kProduct;
+TEST_F(TableMergerTest, SameResourceDifferentNameFail) {
+ 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_first)
+ .SetOverlayable("bool/foo", overlayable_item_first)
.Build();
- Overlayable overlayable_second{};
- overlayable_second.policies |= Overlayable::Policy::kProduct;
+ auto overlayable_second = std::make_shared<Overlayable>("ThemeResources",
+ "overlay://theme");
+ 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_second)
+ .SetOverlayable("bool/foo", overlayable_item_second)
.Build();
ResourceTable final_table;
@@ -526,21 +538,24 @@
ASSERT_FALSE(merger.Merge({}, table_b.get(), false /*overlay*/));
}
-TEST_F(TableMergerTest, SetOverlayableDifferentPolicesFail) {
- Overlayable overlayable_first{};
- overlayable_first.policies |= Overlayable::Policy::kVendor;
+TEST_F(TableMergerTest, SameResourceSameNameFail) {
+ auto overlayable = std::make_shared<Overlayable>("CustomizableResources",
+ "overlay://customization");
+
+ OverlayableItem overlayable_item_first(overlayable);
+ overlayable_item_first.policies |= OverlayableItem::Policy::kProduct;
std::unique_ptr<ResourceTable> table_a =
test::ResourceTableBuilder()
.SetPackageId("com.app.a", 0x7f)
- .SetOverlayable("bool/foo",overlayable_first)
+ .SetOverlayable("bool/foo", overlayable_item_first)
.Build();
- Overlayable overlayable_second{};
- overlayable_second.policies |= Overlayable::Policy::kProduct;
+ OverlayableItem overlayable_item_second(overlayable);
+ overlayable_item_second.policies |= OverlayableItem::Policy::kSystem;
std::unique_ptr<ResourceTable> table_b =
test::ResourceTableBuilder()
.SetPackageId("com.app.a", 0x7f)
- .SetOverlayable("bool/foo", overlayable_second)
+ .SetOverlayable("bool/foo", overlayable_item_second)
.Build();
ResourceTable final_table;