Remove android_prebuilt_sdk modules

Forcing sdk modules to be declared explicitly is unnecessary, just
add the required dependencies on the jar and aidl files.

Test: java_test.go
Change-Id: Ib28bdc1051c5825e7c0efb6adff1f9282675560e
diff --git a/java/java.go b/java/java.go
index 2ded80b..326d278 100644
--- a/java/java.go
+++ b/java/java.go
@@ -20,6 +20,7 @@
 
 import (
 	"fmt"
+	"path/filepath"
 	"strconv"
 	"strings"
 
@@ -41,7 +42,6 @@
 	android.RegisterModuleType("java_binary_host", BinaryHostFactory)
 	android.RegisterModuleType("java_import", ImportFactory)
 	android.RegisterModuleType("java_import_host", ImportFactoryHost)
-	android.RegisterModuleType("android_prebuilt_sdk", SdkPrebuiltFactory)
 	android.RegisterModuleType("android_app", AndroidAppFactory)
 
 	android.RegisterSingletonType("logtags", LogtagsSingleton)
@@ -179,26 +179,90 @@
 	libTag           = dependencyTag{name: "javalib"}
 	bootClasspathTag = dependencyTag{name: "bootclasspath"}
 	frameworkResTag  = dependencyTag{name: "framework-res"}
-	sdkDependencyTag = dependencyTag{name: "sdk"}
 )
 
+type sdkDep struct {
+	useModule, useFiles, useDefaultLibs bool
+	module                              string
+	jar                                 android.Path
+	aidl                                android.Path
+}
+
+func decodeSdkDep(ctx android.BaseContext, v string) sdkDep {
+	switch v {
+	case "", "current", "system_current", "test_current":
+		// OK
+	default:
+		if _, err := strconv.Atoi(v); err != nil {
+			ctx.PropertyErrorf("sdk_version", "invalid sdk version")
+			return sdkDep{}
+		}
+	}
+
+	toFile := func(v string) sdkDep {
+		dir := filepath.Join("prebuilts/sdk", v)
+		jar := filepath.Join(dir, "android.jar")
+		aidl := filepath.Join(dir, "framework.aidl")
+		jarPath := android.ExistentPathForSource(ctx, "sdkdir", jar)
+		aidlPath := android.ExistentPathForSource(ctx, "sdkdir", aidl)
+		if !jarPath.Valid() {
+			ctx.PropertyErrorf("sdk_version", "invalid sdk version %q, %q does not exist", v, jar)
+			return sdkDep{}
+		}
+		if !aidlPath.Valid() {
+			ctx.PropertyErrorf("sdk_version", "invalid sdk version %q, %q does not exist", v, aidl)
+			return sdkDep{}
+		}
+		return sdkDep{
+			useFiles: true,
+			jar:      jarPath.Path(),
+			aidl:     aidlPath.Path(),
+		}
+	}
+
+	toModule := func(m string) sdkDep {
+		return sdkDep{
+			useModule: true,
+			module:    m,
+		}
+	}
+
+	if ctx.AConfig().UnbundledBuild() {
+		if v == "" {
+			if ctx, ok := ctx.(android.ModuleContext); ok {
+				ctx.AddMissingDependencies([]string{"sdk_version_must_be_set_for_modules_used_in_unbundled_builds"})
+			}
+			return sdkDep{}
+		}
+		return toFile(v)
+	}
+
+	switch v {
+	case "":
+		return sdkDep{
+			useDefaultLibs: true,
+		}
+	case "current":
+		return toModule("android_stubs_current")
+	case "system_current":
+		return toModule("android_system_stubs_current")
+	case "test_current":
+		return toModule("android_test_stubs_current")
+	default:
+		return toFile(v)
+	}
+}
+
 func (j *Module) deps(ctx android.BottomUpMutatorContext) {
 	if !proptools.Bool(j.properties.No_standard_libs) {
 		if ctx.Device() {
-			switch j.deviceProperties.Sdk_version {
-			case "":
+			sdkDep := decodeSdkDep(ctx, j.deviceProperties.Sdk_version)
+			if sdkDep.useDefaultLibs {
 				ctx.AddDependency(ctx.Module(), bootClasspathTag, "core-oj", "core-libart")
 				ctx.AddDependency(ctx.Module(), libTag, config.DefaultLibraries...)
-			case "current":
-				// TODO: !TARGET_BUILD_APPS
-				// TODO: export preprocessed framework.aidl from android_stubs_current
-				ctx.AddDependency(ctx.Module(), bootClasspathTag, "android_stubs_current")
-			case "test_current":
-				ctx.AddDependency(ctx.Module(), bootClasspathTag, "android_test_stubs_current")
-			case "system_current":
-				ctx.AddDependency(ctx.Module(), bootClasspathTag, "android_system_stubs_current")
-			default:
-				ctx.AddDependency(ctx.Module(), sdkDependencyTag, "sdk_v"+j.deviceProperties.Sdk_version)
+			}
+			if sdkDep.useModule {
+				ctx.AddDependency(ctx.Module(), bootClasspathTag, sdkDep.module)
 			}
 		} else {
 			if j.deviceProperties.Dex {
@@ -247,6 +311,13 @@
 
 func (j *Module) collectDeps(ctx android.ModuleContext) deps {
 	var deps deps
+
+	sdkDep := decodeSdkDep(ctx, j.deviceProperties.Sdk_version)
+	if sdkDep.useFiles {
+		deps.classpath = append(deps.classpath, sdkDep.jar)
+		deps.aidlIncludeDirs = append(deps.aidlIncludeDirs, sdkDep.aidl)
+	}
+
 	ctx.VisitDirectDeps(func(module blueprint.Module) {
 		otherName := ctx.OtherModuleName(module)
 		tag := ctx.OtherModuleDependencyTag(module)
@@ -277,17 +348,6 @@
 				// generated by framework-res.apk
 				deps.srcFileLists = append(deps.srcFileLists, module.(*AndroidApp).aaptJavaFileList)
 			}
-		case sdkDependencyTag:
-			sdkDep := module.(sdkDependency)
-			deps.bootClasspath = append(deps.bootClasspath, sdkDep.ClasspathFiles()...)
-			if sdkDep.AidlPreprocessed().Valid() {
-				if deps.aidlPreprocess.Valid() {
-					ctx.ModuleErrorf("multiple dependencies with preprocessed aidls:\n %q\n %q",
-						deps.aidlPreprocess, sdkDep.AidlPreprocessed())
-				} else {
-					deps.aidlPreprocess = sdkDep.AidlPreprocessed()
-				}
-			}
 		default:
 			panic(fmt.Errorf("unknown dependency %q for %q", otherName, ctx.ModuleName()))
 		}
@@ -677,51 +737,6 @@
 	return module
 }
 
-//
-// SDK java prebuilts (.jar containing resources plus framework.aidl)
-//
-
-type sdkDependency interface {
-	Dependency
-	AidlPreprocessed() android.OptionalPath
-}
-
-var _ sdkDependency = (*sdkPrebuilt)(nil)
-
-type sdkPrebuiltProperties struct {
-	Aidl_preprocessed *string
-}
-
-type sdkPrebuilt struct {
-	Import
-
-	sdkProperties sdkPrebuiltProperties
-
-	aidlPreprocessed android.OptionalPath
-}
-
-func (j *sdkPrebuilt) GenerateAndroidBuildActions(ctx android.ModuleContext) {
-	j.Import.GenerateAndroidBuildActions(ctx)
-
-	j.aidlPreprocessed = android.OptionalPathForModuleSrc(ctx, j.sdkProperties.Aidl_preprocessed)
-}
-
-func (j *sdkPrebuilt) AidlPreprocessed() android.OptionalPath {
-	return j.aidlPreprocessed
-}
-
-func SdkPrebuiltFactory() android.Module {
-	module := &sdkPrebuilt{}
-
-	module.AddProperties(
-		&module.sdkProperties,
-		&module.Import.properties)
-
-	android.InitPrebuiltModule(module, &module.Import.properties.Jars)
-	android.InitAndroidArchModule(module, android.HostAndDeviceSupported, android.MultilibCommon)
-	return module
-}
-
 func inList(s string, l []string) bool {
 	for _, e := range l {
 		if e == s {