Add api_dirs property and use module name as prefix

The soong connect the prebuilt library according to LOCAL_SDK_VERSION.
But some sdk libraries has diffrent version policy with
LOCAL_SDK_VERSION. For this, we need to support direct link to the
prebuilt library instead of creating a new LOCAL_XXX_SDK_VERSION. So,
The base module name is used as the prefix for the prebuilt module name.

Remove the empty file check to support the absence of a prebuilt
library and add api_dirs property

Bug:77577799
Test: make -j
Change-Id: I1086977d26e4ddfd62e290637126d44e1b248bac
diff --git a/java/java_test.go b/java/java_test.go
index 96bf224..572db2f 100644
--- a/java/java_test.go
+++ b/java/java_test.go
@@ -188,7 +188,7 @@
 		"prebuilts/sdk/28/system/api/bar-removed.txt": nil,
 		"prebuilts/sdk/28/test/api/bar-removed.txt":   nil,
 		"prebuilts/sdk/tools/core-lambda-stubs.jar":   nil,
-		"prebuilts/sdk/Android.bp":                    []byte(`prebuilt_apis { name: "prebuilt_apis",}`),
+		"prebuilts/sdk/Android.bp":                    []byte(`prebuilt_apis { name: "sdk", api_dirs: ["14", "28", "current"],}`),
 
 		// For framework-res, which is an implicit dependency for framework
 		"AndroidManifest.xml":                   nil,
diff --git a/java/prebuilt_apis.go b/java/prebuilt_apis.go
index 3f4b076..59b2092 100644
--- a/java/prebuilt_apis.go
+++ b/java/prebuilt_apis.go
@@ -38,8 +38,14 @@
 	})
 }
 
+type prebuiltApisProperties struct {
+	// list of api version directories
+	Api_dirs []string
+}
+
 type prebuiltApis struct {
 	android.ModuleBase
+	properties prebuiltApisProperties
 }
 
 func (module *prebuiltApis) DepsMutator(ctx android.BottomUpMutatorContext) {
@@ -55,10 +61,6 @@
 
 	apiver = elements[0]
 	scope = elements[1]
-	if scope != "public" && scope != "system" && scope != "test" && scope != "core" {
-		// scope must be public, system or test
-		return
-	}
 
 	module = strings.TrimSuffix(elements[2], ".jar")
 	return
@@ -91,7 +93,7 @@
 		Sdk_version *string
 		Installable *bool
 	}{}
-	props.Name = proptools.StringPtr("sdk_" + scope + "_" + apiver + "_" + module)
+	props.Name = proptools.StringPtr(mctx.ModuleName() + "_" + scope + "_" + apiver + "_" + module)
 	props.Jars = append(props.Jars, path)
 	// TODO(hansson): change to scope after migration is done.
 	props.Sdk_version = proptools.StringPtr("current")
@@ -114,22 +116,22 @@
 func prebuiltSdkStubs(mctx android.TopDownMutatorContext) {
 	mydir := mctx.ModuleDir() + "/"
 	// <apiver>/<scope>/<module>.jar
-	files, err := mctx.GlobWithDeps(mydir+"*/*/*.jar", nil)
-	if err != nil {
-		mctx.ModuleErrorf("failed to glob jar files under %q: %s", mydir, err)
-	}
-	if len(files) == 0 {
-		mctx.ModuleErrorf("no jar file found under %q", mydir)
+	var files []string
+	for _, apiver := range mctx.Module().(*prebuiltApis).properties.Api_dirs {
+		for _, scope := range []string{"public", "system", "test", "core"} {
+			vfiles, err := mctx.GlobWithDeps(mydir+apiver+"/"+scope+"*/*.jar", nil)
+			if err != nil {
+				mctx.ModuleErrorf("failed to glob jar files under %q: %s", mydir+apiver+"/"+scope, err)
+			}
+			files = append(files, vfiles...)
+		}
 	}
 
 	for _, f := range files {
 		// create a Import module for each jar file
 		localPath := strings.TrimPrefix(f, mydir)
 		module, apiver, scope := parseJarPath(mctx, localPath)
-
-		if len(module) != 0 {
-			createImport(mctx, module, scope, apiver, localPath)
-		}
+		createImport(mctx, module, scope, apiver, localPath)
 	}
 }
 
@@ -192,6 +194,7 @@
 
 func prebuiltApisFactory() android.Module {
 	module := &prebuiltApis{}
+	module.AddProperties(&module.properties)
 	android.InitAndroidModule(module)
 	return module
 }