Allow passing in a category override to aapt2

Bug: 240322840
Test: unit test
Change-Id: Ia605ad8ad0267b02d67da15cf65775f69aef59e5
diff --git a/tools/aapt2/link/ManifestFixer.cpp b/tools/aapt2/link/ManifestFixer.cpp
index 035f911..5cee17e 100644
--- a/tools/aapt2/link/ManifestFixer.cpp
+++ b/tools/aapt2/link/ManifestFixer.cpp
@@ -444,13 +444,18 @@
   manifest_action["attribution"]["inherit-from"];
   manifest_action["original-package"];
   manifest_action["overlay"].Action([&](xml::Element* el) -> bool {
-    if (!options_.rename_overlay_target_package) {
-      return true;
+    if (options_.rename_overlay_target_package) {
+      if (xml::Attribute* attr = el->FindAttribute(xml::kSchemaAndroid, "targetPackage")) {
+        attr->value = options_.rename_overlay_target_package.value();
+      }
     }
-
-    if (xml::Attribute* attr =
-            el->FindAttribute(xml::kSchemaAndroid, "targetPackage")) {
-      attr->value = options_.rename_overlay_target_package.value();
+    if (options_.rename_overlay_category) {
+      if (xml::Attribute* attr = el->FindAttribute(xml::kSchemaAndroid, "category")) {
+        attr->value = options_.rename_overlay_category.value();
+      } else {
+        el->attributes.push_back(xml::Attribute{xml::kSchemaAndroid, "category",
+                                                options_.rename_overlay_category.value()});
+      }
     }
     return true;
   });
diff --git a/tools/aapt2/link/ManifestFixer.h b/tools/aapt2/link/ManifestFixer.h
index 5b04cad..90f5177 100644
--- a/tools/aapt2/link/ManifestFixer.h
+++ b/tools/aapt2/link/ManifestFixer.h
@@ -48,6 +48,9 @@
   // <overlay>.
   std::optional<std::string> rename_overlay_target_package;
 
+  // The category to use instead of the one defined in 'android:category' in <overlay>.
+  std::optional<std::string> rename_overlay_category;
+
   // The version name to set if 'android:versionName' is not defined in <manifest> or if
   // replace_version is set.
   std::optional<std::string> version_name_default;
diff --git a/tools/aapt2/link/ManifestFixer_test.cpp b/tools/aapt2/link/ManifestFixer_test.cpp
index 432f10b..098d0be 100644
--- a/tools/aapt2/link/ManifestFixer_test.cpp
+++ b/tools/aapt2/link/ManifestFixer_test.cpp
@@ -351,6 +351,54 @@
   EXPECT_THAT(attr->value, StrEq("com.android"));
 }
 
+TEST_F(ManifestFixerTest, AddOverlayCategory) {
+  ManifestFixerOptions options;
+  options.rename_overlay_category = std::string("category");
+
+  std::unique_ptr<xml::XmlResource> doc = VerifyWithOptions(R"EOF(
+      <manifest xmlns:android="http://schemas.android.com/apk/res/android"
+                package="android">
+        <overlay android:targetName="Customization" android:targetPackage="android" />
+      </manifest>)EOF",
+                                                            options);
+  ASSERT_THAT(doc, NotNull());
+
+  xml::Element* manifest_el = doc->root.get();
+  ASSERT_THAT(manifest_el, NotNull());
+
+  xml::Element* overlay_el = manifest_el->FindChild({}, "overlay");
+  ASSERT_THAT(overlay_el, NotNull());
+
+  xml::Attribute* attr = overlay_el->FindAttribute(xml::kSchemaAndroid, "category");
+  ASSERT_THAT(attr, NotNull());
+  EXPECT_THAT(attr->value, StrEq("category"));
+}
+
+TEST_F(ManifestFixerTest, OverrideOverlayCategory) {
+  ManifestFixerOptions options;
+  options.rename_overlay_category = std::string("category");
+
+  std::unique_ptr<xml::XmlResource> doc = VerifyWithOptions(R"EOF(
+      <manifest xmlns:android="http://schemas.android.com/apk/res/android"
+                package="android">
+        <overlay android:targetName="Customization"
+                 android:targetPackage="android"
+                 android:category="yrogetac"/>
+      </manifest>)EOF",
+                                                            options);
+  ASSERT_THAT(doc, NotNull());
+
+  xml::Element* manifest_el = doc->root.get();
+  ASSERT_THAT(manifest_el, NotNull());
+
+  xml::Element* overlay_el = manifest_el->FindChild({}, "overlay");
+  ASSERT_THAT(overlay_el, NotNull());
+
+  xml::Attribute* attr = overlay_el->FindAttribute(xml::kSchemaAndroid, "category");
+  ASSERT_THAT(attr, NotNull());
+  EXPECT_THAT(attr->value, StrEq("category"));
+}
+
 TEST_F(ManifestFixerTest, UseDefaultVersionNameAndCode) {
   ManifestFixerOptions options;
   options.version_name_default = std::string("Beta");