Merge "Add droiddoc_template"
diff --git a/java/droiddoc.go b/java/droiddoc.go
index 82beb96..9d6f58e 100644
--- a/java/droiddoc.go
+++ b/java/droiddoc.go
@@ -18,7 +18,6 @@
 	"android/soong/android"
 	"android/soong/java/config"
 	"fmt"
-	"path/filepath"
 	"strings"
 
 	"github.com/google/blueprint"
@@ -52,6 +51,7 @@
 func init() {
 	android.RegisterModuleType("droiddoc", DroiddocFactory)
 	android.RegisterModuleType("droiddoc_host", DroiddocHostFactory)
+	android.RegisterModuleType("droiddoc_template", DroiddocTemplateFactory)
 	android.RegisterModuleType("javadoc", JavadocFactory)
 	android.RegisterModuleType("javadoc_host", JavadocHostFactory)
 }
@@ -82,7 +82,7 @@
 
 type DroiddocProperties struct {
 	// directory relative to top of the source tree that contains doc templates files.
-	Custom_template_dir *string `android:"arch_variant"`
+	Custom_template *string `android:"arch_variant"`
 
 	// directories relative to top of the source tree which contains html/jd files.
 	Html_dirs []string `android:"arch_variant"`
@@ -233,7 +233,7 @@
 			}
 		default:
 			switch tag {
-			case android.DefaultsDepTag, android.SourceDepTag:
+			case android.DefaultsDepTag, android.SourceDepTag, droiddocTemplateTag:
 				// Nothing to do
 			default:
 				ctx.ModuleErrorf("depends on non-java module %q", otherName)
@@ -319,6 +319,13 @@
 func (d *Droiddoc) DepsMutator(ctx android.BottomUpMutatorContext) {
 	d.Javadoc.addDeps(ctx)
 
+	if String(d.properties.Custom_template) == "" {
+		// TODO: This is almost always droiddoc-templates-sdk
+		ctx.PropertyErrorf("custom_template", "must specify a template")
+	} else {
+		ctx.AddDependency(ctx.Module(), droiddocTemplateTag, String(d.properties.Custom_template))
+	}
+
 	// extra_arg_files may contains filegroup or genrule.
 	android.ExtractSourcesDeps(ctx, d.properties.Arg_files)
 
@@ -373,24 +380,32 @@
 		classpathArgs = "-classpath " + strings.Join(deps.classpath.Strings(), ":")
 	}
 
-	// templateDir (maybe missing) is relative to top of the source tree instead of current module.
-	templateDir := android.PathForSource(ctx, String(d.properties.Custom_template_dir)).String()
-	implicits = append(implicits, ctx.GlobFiles(filepath.Join(templateDir, "**/*"), nil)...)
+	var templateDir string
+	ctx.VisitDirectDepsWithTag(droiddocTemplateTag, func(m android.Module) {
+		if t, ok := m.(*DroiddocTemplate); ok {
+			implicits = append(implicits, t.deps...)
+			templateDir = t.dir.String()
+		} else {
+			ctx.PropertyErrorf("custom_template", "module %q is not a droiddoc_template", ctx.OtherModuleName(m))
+		}
+	})
 
 	var htmlDirArgs string
 	if len(d.properties.Html_dirs) > 0 {
-		// htmlDir is relative to top of the source tree instead of current module.
-		htmlDir := android.PathForSource(ctx, d.properties.Html_dirs[0]).String()
-		implicits = append(implicits, ctx.GlobFiles(filepath.Join(htmlDir, "**/*"), nil)...)
-		htmlDirArgs = "-htmldir " + htmlDir
+		htmlDir := android.PathForModuleSrc(ctx, d.properties.Html_dirs[0])
+		implicits = append(implicits, ctx.Glob(htmlDir.Join(ctx, "**/*").String(), nil)...)
+		htmlDirArgs = "-htmldir " + htmlDir.String()
 	}
 
 	var htmlDir2Args string
 	if len(d.properties.Html_dirs) > 1 {
-		// htmlDir2 is relative to top of the source tree instead of current module.
-		htmlDir2 := android.PathForSource(ctx, d.properties.Html_dirs[1]).String()
-		implicits = append(implicits, ctx.GlobFiles(filepath.Join(htmlDir2, "**/*"), nil)...)
-		htmlDirArgs = "-htmldir2 " + htmlDir2
+		htmlDir2 := android.PathForModuleSrc(ctx, d.properties.Html_dirs[1])
+		implicits = append(implicits, ctx.Glob(htmlDir2.Join(ctx, "**/*").String(), nil)...)
+		htmlDir2Args = "-htmldir2 " + htmlDir2.String()
+	}
+
+	if len(d.properties.Html_dirs) > 2 {
+		ctx.PropertyErrorf("html_dirs", "Droiddoc only supports up to 2 html dirs")
 	}
 
 	knownTags := ctx.ExpandSources(d.properties.Knowntags, nil)
@@ -451,3 +466,34 @@
 		},
 	})
 }
+
+var droiddocTemplateTag = dependencyTag{name: "droiddoc-template"}
+
+type DroiddocTemplateProperties struct {
+	// path to the directory containing the droiddoc templates.
+	Path *string
+}
+
+type DroiddocTemplate struct {
+	android.ModuleBase
+
+	properties DroiddocTemplateProperties
+
+	deps android.Paths
+	dir  android.Path
+}
+
+func DroiddocTemplateFactory() android.Module {
+	module := &DroiddocTemplate{}
+	module.AddProperties(&module.properties)
+	android.InitAndroidModule(module)
+	return module
+}
+
+func (d *DroiddocTemplate) DepsMutator(android.BottomUpMutatorContext) {}
+
+func (d *DroiddocTemplate) GenerateAndroidBuildActions(ctx android.ModuleContext) {
+	path := android.PathForModuleSrc(ctx, String(d.properties.Path))
+	d.dir = path
+	d.deps = ctx.Glob(path.Join(ctx, "**/*").String(), nil)
+}
diff --git a/java/java_test.go b/java/java_test.go
index 8bae019..5d6a6e0 100644
--- a/java/java_test.go
+++ b/java/java_test.go
@@ -81,6 +81,7 @@
 	ctx.RegisterModuleType("genrule", android.ModuleFactoryAdaptor(genrule.GenRuleFactory))
 	ctx.RegisterModuleType("droiddoc", android.ModuleFactoryAdaptor(DroiddocFactory))
 	ctx.RegisterModuleType("droiddoc_host", android.ModuleFactoryAdaptor(DroiddocHostFactory))
+	ctx.RegisterModuleType("droiddoc_template", android.ModuleFactoryAdaptor(DroiddocTemplateFactory))
 	ctx.PreArchMutators(android.RegisterPrebuiltsPreArchMutators)
 	ctx.PreArchMutators(android.RegisterPrebuiltsPostDepsMutators)
 	ctx.PreArchMutators(android.RegisterDefaultsPreArchMutators)
@@ -865,6 +866,10 @@
 
 func TestDroiddoc(t *testing.T) {
 	ctx := testJava(t, `
+		droiddoc_template {
+		    name: "droiddoc-templates-sdk",
+		    path: ".",
+		}
 		droiddoc {
 		    name: "bar-doc",
 		    srcs: [
@@ -873,7 +878,7 @@
 		    exclude_srcs: [
 		        "bar-doc/b.java"
 		    ],
-		    custom_template_dir: "external/doclava/templates-sdk",
+		    custom_template: "droiddoc-templates-sdk",
 		    hdf: [
 		        "android.whichdoc offline",
 		    ],