AAPT2: Add Proguard rules for nav fragments

Adds generation of proguard rules for fragments in res/navigation. All
android:name attributes have keep rules generated for the classes they
reference.

Bug: 69929974
Test: aapt2_tests
Change-Id: I05a87484ab357ea5629b73caad8488182f474e1f
diff --git a/tools/aapt2/java/ProguardRules.cpp b/tools/aapt2/java/ProguardRules.cpp
index ffcef89..2857d5a 100644
--- a/tools/aapt2/java/ProguardRules.cpp
+++ b/tools/aapt2/java/ProguardRules.cpp
@@ -189,6 +189,29 @@
   DISALLOW_COPY_AND_ASSIGN(XmlResourceVisitor);
 };
 
+class NavigationVisitor : public BaseVisitor {
+ public:
+  NavigationVisitor(const ResourceFile& file, KeepSet* keep_set, const std::string& package)
+      : BaseVisitor(file, keep_set), package_(package) {
+  }
+
+  void Visit(xml::Element* node) override {
+    const auto& attr = node->FindAttribute(xml::kSchemaAndroid, "name");
+    if (attr != nullptr && !attr->value.empty()) {
+      std::string name = (attr->value[0] == '.') ? package_ + attr->value : attr->value;
+      if (util::IsJavaClassName(name)) {
+        AddClass(node->line_number, name);
+      }
+    }
+
+    BaseVisitor::Visit(node);
+  }
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(NavigationVisitor);
+  const std::string package_;
+};
+
 class TransitionVisitor : public BaseVisitor {
  public:
   TransitionVisitor(const ResourceFile& file, KeepSet* keep_set) : BaseVisitor(file, keep_set) {
@@ -291,7 +314,7 @@
   return false;
 }
 
-bool CollectProguardRules(xml::XmlResource* res, KeepSet* keep_set) {
+bool CollectProguardRules(IAaptContext* context_, xml::XmlResource* res, KeepSet* keep_set) {
   if (!res->root) {
     return false;
   }
@@ -309,6 +332,12 @@
       break;
     }
 
+    case ResourceType::kNavigation: {
+      NavigationVisitor visitor(res->file, keep_set, context_->GetCompilationPackage());
+      res->root->Accept(&visitor);
+      break;
+    }
+
     case ResourceType::kTransition: {
       TransitionVisitor visitor(res->file, keep_set);
       res->root->Accept(&visitor);