API txt files are dist artifacts

API txt files from a java_sdk_library are automatically registered as
dist artifacts for sdk and win_sdk targets.

They are installed under $(DIST_DIR)/apistubs/<apiscope>/api/<name>.txt
where <apiscope> can be public, system and test.

Bug: 77577799
Test: m -j
Change-Id: I38cd8ee000445ce843ac01ead38001e509228738
diff --git a/java/sdk_library.go b/java/sdk_library.go
index 3bac8f6..57a0c3a 100644
--- a/java/sdk_library.go
+++ b/java/sdk_library.go
@@ -47,6 +47,9 @@
 	systemApiStubsTag = dependencyTag{name: "system"}
 	testApiStubsTag   = dependencyTag{name: "test"}
 	implLibTag        = dependencyTag{name: "platform"}
+	publicApiFileTag  = dependencyTag{name: "publicApi"}
+	systemApiFileTag  = dependencyTag{name: "systemApi"}
+	testApiFileTag    = dependencyTag{name: "testApi"}
 )
 
 type apiScope int
@@ -134,6 +137,10 @@
 	systemApiStubsImplPath android.Paths
 	testApiStubsImplPath   android.Paths
 	implLibImplPath        android.Paths
+
+	publicApiFilePath android.Path
+	systemApiFilePath android.Path
+	testApiFilePath   android.Path
 }
 
 func (module *sdkLibrary) DepsMutator(ctx android.BottomUpMutatorContext) {
@@ -142,6 +149,10 @@
 	ctx.AddDependency(ctx.Module(), systemApiStubsTag, module.stubsName(apiScopeSystem))
 	ctx.AddDependency(ctx.Module(), testApiStubsTag, module.stubsName(apiScopeTest))
 	ctx.AddDependency(ctx.Module(), implLibTag, module.implName())
+
+	ctx.AddDependency(ctx.Module(), publicApiFileTag, module.docsName(apiScopePublic))
+	ctx.AddDependency(ctx.Module(), systemApiFileTag, module.docsName(apiScopeSystem))
+	ctx.AddDependency(ctx.Module(), testApiFileTag, module.docsName(apiScopeTest))
 }
 
 func (module *sdkLibrary) GenerateAndroidBuildActions(ctx android.ModuleContext) {
@@ -170,6 +181,18 @@
 				ctx.ModuleErrorf("depends on module %q of unknown tag %q", otherName, tag)
 			}
 		}
+		if doc, ok := to.(ApiFilePath); ok {
+			switch tag {
+			case publicApiFileTag:
+				module.publicApiFilePath = doc.ApiFilePath()
+			case systemApiFileTag:
+				module.systemApiFilePath = doc.ApiFilePath()
+			case testApiFileTag:
+				module.testApiFilePath = doc.ApiFilePath()
+			default:
+				ctx.ModuleErrorf("depends on module %q of unknown tag %q", otherName, tag)
+			}
+		}
 	})
 }
 
@@ -199,6 +222,24 @@
 					module.testApiStubsPath.Strings()[0]+
 					":"+path.Join("apistubs", "test", module.BaseModuleName()+".jar")+")")
 			}
+			if module.publicApiFilePath != nil {
+				fmt.Fprintln(w, "$(call dist-for-goals,sdk win_sdk,"+
+					module.publicApiFilePath.String()+
+					":"+path.Join("apistubs", "public", "api",
+					module.BaseModuleName()+".txt")+")")
+			}
+			if module.systemApiFilePath != nil {
+				fmt.Fprintln(w, "$(call dist-for-goals,sdk win_sdk,"+
+					module.systemApiFilePath.String()+
+					":"+path.Join("apistubs", "system", "api",
+					module.BaseModuleName()+".txt")+")")
+			}
+			if module.testApiFilePath != nil {
+				fmt.Fprintln(w, "$(call dist-for-goals,sdk win_sdk,"+
+					module.testApiFilePath.String()+
+					":"+path.Join("apistubs", "test", "api",
+					module.BaseModuleName()+".txt")+")")
+			}
 		},
 	}
 }