// BEGIN_EXCLUDE import com.example.android.samples.build.SampleGenPlugin apply plugin: SampleGenPlugin samplegen { pathToBuild "../../../../build" pathToSamplesCommon "../../common" } task emitBrowseableAll { println "Executing all tasks" } task emitGradleAll { println "Executing all tasks" } task emitGradleZipAll { println "Executing all tasks" } def tasksBrowseable = [] def tasksGradle = [] def tasksGradleZip = [] def samplesXml = (new XmlParser()).parse('samples.xml') samplesXml.sample.each { sample -> println "Creating task : " + sample.@name // //Browseable task // task "task${sample.@name}Browseable" (type:Copy) { def outputPath =outPath("browseable", sample.@name); //Get absolute path of input path FileTree inputFileTree = project.fileTree(sample.@path) def inputPath = inputFileTree.getFiles().iterator().next().parentFile.absolutePath //sample.@path println "Input path : " + inputPath mkdir outputPath into outputPath from("${inputPath}/AndroidManifest.xml") from("${inputPath}/lint.xml") from("${inputPath}/project.properties") into("res") { from("${inputPath}/res") } into("assets") { from("${inputPath}/assets") } //Collect C++ files into("jni") { from("${inputPath}/jni") } //Collect java files def javaDirs = ["${inputPath}/src"] FileTree javaTree = null; javaDirs.each { dir -> FileTree tree = project.fileTree("${dir}") javaTree = (javaTree == null) ? tree : javaTree.plus(tree) } println javaTree; println javaDirs Map collapsedPaths = collapsePaths(javaTree, javaDirs) println collapsedPaths javaDirs.each { srcPath -> println srcPath into("src") { def javaPath = "${srcPath}" from(javaPath) setIncludeEmptyDirs(false) include(["**/*.java", "**/*.xml"]) eachFile { FileCopyDetails fcd -> if (fcd.file.isFile()) { def filename = fcd.name; String collapsed = collapsedPaths.get(fcd.file.path); fcd.path = "src/${collapsed}"; } else {fcd.exclude()} } println "***************** done" } } } // //Zipfile task // task "task${sample.@name}Gradle"(type:Copy) { //dependsOn(preflight) def outputPath =outPath("gradle", sample.@name); def inputPath = sample.@path // Copy entire sample into output -- since it's already in Gradle format, we'll explicitly exclude content that // doesn't belong here. mkdir outputPath into outputPath from("${inputPath}") { // Paths to exclude from output exclude ".classpath" exclude ".cproject" exclude ".project" exclude ".settings" exclude "bin" exclude "gen" exclude "obj" exclude "libs" exclude "**/proguard-project.txt" exclude "${samplegen.targetSampleModule()}/**/README*.txt" } // Remove BEGIN_EXCLUDE/END_EXCLUDE blocks from source files eachFile { file -> if (file.name.endsWith(".gradle") || file.name.endsWith(".java")) { // TODO(trevorjohns): Outputs a blank newline for each filtered line. Replace with java.io.FilterReader impl. boolean outputLines = true; def removeExcludeBlocksFilter = { line -> if (line ==~ /\/\/ BEGIN_EXCLUDE/) { outputLines = false; } else if (line ==~ /\/\/ END_EXCLUDE/) { outputLines = true; } else if (outputLines) { return line; } return "" } filter(removeExcludeBlocksFilter) } } } task "task${sample.@name}GradleZip"(type:Zip) { def outputPath =outPath("browseable", ""); def folderName = "${sample.@name}" archiveName = "${sample.@name}.zip" def inputPath = outPath("gradle", sample.@name) from inputPath into folderName include "**" def outDir = project.file(outputPath) destinationDir = outDir } //Add tasks to list tasksBrowseable.add("task${sample.@name}Browseable") tasksGradle.add("task${sample.@name}Gradle") tasksGradleZip.add("task${sample.@name}GradleZip") } //Add generated tasks to dependency list emitBrowseableAll.dependsOn(tasksBrowseable) emitGradleAll.dependsOn(tasksGradle) emitGradleZipAll.dependsOn([tasksGradle, tasksGradleZip]) String outPath(String buildType, String sampleName) { /* def repoInfo = "repo info platform/developers/build".execute().text def buildPath = (repoInfo =~ /Mount path: (.*)/)[0][1] */ return "${samplegen.pathToBuild}/out/${buildType}/${sampleName}"; } /** * Collapse a path "IntelliJ-style" by putting dots rather than slashes between * path components that have only one child. So the two paths * * com/example/android/foo/bar.java * com/example/android/bar/foo.java * * Become * com.example.android/foo/bar.java * com.example.android/bar/foo.java * * @param path * @param roots * @return */ Map collapsePaths(FileTree path, List roots) { Map result = new HashMap(); println ("******************** Collapse *************************") path.visit { FileVisitDetails f -> if (f.isDirectory()) return; StringBuilder collapsedPath = new StringBuilder("${f.name}"); File current = f.file; // // Starting at this file, walk back to the root of the path and // substitute dots for any directory that has only one child. // // Don't substitute a dot for the separator between the end of the // path and the filename, even if there's only one file in the directory. if (!f.isDirectory()) { current = current.parentFile; collapsedPath.insert(0, "${current.name}/") } // For everything else, use a dot if there's only one child and // a slash otherwise. Filter out the root paths, too--we only want // the relative path. But wait, Groovy/Gradle is capricious and // won't return the proper value from a call to roots.contains(String)! // I'm using roots.sum here instead of tracking down why a list of // strings can't return true from contains() when given a string that // it quite obviously does contain. current = current.parentFile; while((current != null) && (roots.sum {String r-> return r.equals(current.absolutePath) ? 1 : 0 } == 0)) { //Exclude files starting with "." def files = 0 current.list().each { file -> if (!file.startsWith(".")) files++ } char separator = files > 1 ? '/' : '.'; collapsedPath.insert(0, "${current.name}${separator}"); current = current.parentFile; } result.put(f.file.path, collapsedPath.toString()); } println ("******************** Results *************************") result.each {entry -> println("${entry}\n\n");} return result } //apply from: "ndkbuild.gradle" // END_EXCLUDE