Allow java_sdk_library to override the droidstubs api_surface per scope

Previously, every `java_sdk_library` would create a `droidstubs` module
passing in the name of the `apiScope` as the `api_surface` property.
e.g. the `public` scope was always called `public`, etc. While that
works for the vast majority of `java_sdk_library` modules there are a
few in `libcore`, `external/conscrypt` and `external/icu` which create
`public` scope APIs but which are not actually `public`. e.g. libcore
creates `intra-core` APIs, conscrypt and icu also create
`core-platform` APIs. They are different from `public` in the
annotations that they pass to Metalava.

A future change will pass the `api_surface` property down to Metalava
and that will be used to retrieve a corresponding configuration from
`build/soong/java/metalava/main-config.xml`. That configuration will
include the annotations. Therefore, each set of annotations that are
passed will need a unique name.

This change allows the `api_surface` for the default `public` scope
to be overridden to select the correct `api_surface` in the
configuration.

Bug: 391554590
Test: m checkapi
Change-Id: Iaa2c8325f0ffae2daf77201abe4e77c919528ad3
diff --git a/java/java.go b/java/java.go
index fafe9f9..d59c6ca 100644
--- a/java/java.go
+++ b/java/java.go
@@ -2310,6 +2310,16 @@
 var scopeOrderMap = AllApiScopes.MapToIndex(
 	func(s *apiScope) string { return s.name })
 
+// Add some extra entries into scopeOrderMap for some special api surface names needed by libcore,
+// external/conscrypt and external/icu and java/core-libraries.
+func init() {
+	count := len(scopeOrderMap)
+	scopeOrderMap["core"] = count + 1
+	scopeOrderMap["core-platform"] = count + 2
+	scopeOrderMap["intra-core"] = count + 3
+	scopeOrderMap["core-platform-plus-public"] = count + 4
+}
+
 func (al *ApiLibrary) sortApiFilesByApiScope(ctx android.ModuleContext, srcFilesInfo []JavaApiImportInfo) []JavaApiImportInfo {
 	for _, srcFileInfo := range srcFilesInfo {
 		if srcFileInfo.ApiSurface == "" {
diff --git a/java/sdk_library.go b/java/sdk_library.go
index 155bea4..fda87f8 100644
--- a/java/sdk_library.go
+++ b/java/sdk_library.go
@@ -480,6 +480,9 @@
 
 	// Extra libs used when compiling stubs for this scope.
 	Libs []string
+
+	// Name to override the api_surface that is passed down to droidstubs.
+	Api_surface *string
 }
 
 type sdkLibraryProperties struct {
diff --git a/java/sdk_library_internal.go b/java/sdk_library_internal.go
index ec9c160..db9cd24 100644
--- a/java/sdk_library_internal.go
+++ b/java/sdk_library_internal.go
@@ -174,6 +174,20 @@
 	mctx.CreateModule(LibraryFactory, properties...)
 }
 
+// getApiSurfaceForScope returns the api surface name to use for the apiScope. If one is specified
+// in the corresponding ApiScopeProperties.Api_surface property that is used, otherwise the name of
+// the apiScope is used.
+func (module *SdkLibrary) getApiSurfaceForScope(apiScope *apiScope) *string {
+	scopeProperties := module.scopeToProperties[apiScope]
+
+	apiSurface := scopeProperties.Api_surface
+	if apiSurface == nil {
+		apiSurface = &apiScope.name
+	}
+
+	return apiSurface
+}
+
 // Creates the [Droidstubs] module with ".stubs.source.<[apiScope.name]>" that creates stubs
 // source files from the given full source files and also updates and checks the API
 // specification files (i.e. "*-current.txt", "*-removed.txt" files).
@@ -227,7 +241,7 @@
 	props.Srcs = append(props.Srcs, module.properties.Srcs...)
 	props.Srcs = append(props.Srcs, module.sdkLibraryProperties.Api_srcs...)
 	props.Sdk_version = module.deviceProperties.Sdk_version
-	props.Api_surface = &apiScope.name
+	props.Api_surface = module.getApiSurfaceForScope(apiScope)
 	props.System_modules = module.deviceProperties.System_modules
 	props.Installable = proptools.BoolPtr(false)
 	// A droiddoc module has only one Libs property and doesn't distinguish between