diff options
author | Trevor Johns <trevorjohns@google.com> | 2013-11-06 14:38:47 -0800 |
---|---|---|
committer | Trevor Johns <trevorjohns@google.com> | 2013-11-06 14:38:47 -0800 |
commit | 737ccb75a8522baa4ae36f3b855dd8911d2ea954 (patch) | |
tree | 4cdd61893d24b9f6244ff0d94c8e883f93ec20d2 | |
parent | 2b1169e2095f5e30f118abd146a62007697cecc3 (diff) | |
parent | f49bfc3d06d0cc0eac0ce1a5620ef5bc8e38f064 (diff) | |
download | build-737ccb75a8522baa4ae36f3b855dd8911d2ea954.tar.gz |
Merge branch 'klp-dev' into 'klp-docs'idea133-weekly-releaseidea133
72 files changed, 3091 insertions, 0 deletions
diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..3bb19ffd --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +.gradle/ diff --git a/build.gradle b/build.gradle new file mode 100644 index 00000000..e1dc109e --- /dev/null +++ b/build.gradle @@ -0,0 +1,230 @@ +/* +* Copyright 2013 The Android Open Source Project +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ + +// The SampleGenPlugin source is in the buildSrc directory. +import com.example.android.samples.build.SampleGenPlugin +apply plugin: SampleGenPlugin + +// Add a preflight task that depends on the "refresh" task that gets +// added by the SampleGenPlugin. +task preflight { + project.afterEvaluate({preflight.dependsOn(project.refresh)}) +} + +task wrapper(type: Wrapper) { + gradleVersion = '1.8' +} + + +String outPath(String buildType) { +/* + def repoInfo = "repo info platform/developers/build".execute().text + def buildPath = (repoInfo =~ /Mount path: (.*)/)[0][1] +*/ + return "${samplegen.pathToBuild}/out/${buildType}/${samplegen.targetSampleName()}"; +} + +/** + * 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<String,String> collapsePaths(FileTree path, List<String> roots) { + Map result = new HashMap<String,String>(); + + 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)) { + + char separator = current.list().length > 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 +} + + +task emitAnt(type:Copy) { + def outputPath = outPath("ant"); + def inputPath = "${project.projectDir}/${samplegen.targetSampleModule()}" + mkdir outputPath + into outputPath + includeEmptyDirs + ["main", "common", "template"].each { input -> + [[ "java", "src"], ["res", "res"]].each { filetype -> + def srcPath = "${inputPath}/src/${input}/${filetype[0]}" + into("${filetype[1]}") { + from(srcPath) + } + } + } + from("${inputPath}/src/main") { include "AndroidManifest.xml" } + from("${inputPath}/src/template") { include "project.properties" } +} + +task emitGradle(type:Copy) { + dependsOn(preflight) + def outputPath = outPath("gradle") + def inputPath = "${project.projectDir}" + // 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 ".gradle" + exclude "_index.jd" + exclude "bin" + exclude "buildSrc" + exclude "local.properties" + exclude "template-params.xml" + exclude "*.iml" + exclude "**/.idea" + exclude "**/build" + exclude "**/proguard-project.txt" + exclude "${samplegen.targetSampleModule()}/**/README*.txt" + + // src directory needs to be consolidated, will be done in next section + exclude "${samplegen.targetSampleModule()}/src/" + } + + // Consolidate source directories + ["main", "common", "template"].each { input -> + ["java", "res", "assets"].each { filetype -> + def srcPath = "${inputPath}/${samplegen.targetSampleModule()}/src/${input}/${filetype}" + into("${samplegen.targetSampleModule()}/src/main/${filetype}") { + from(srcPath) + } + } + } + + // Copy AndroidManifest.xml + into ("${samplegen.targetSampleModule()}/src/main") { + from("${inputPath}/${samplegen.targetSampleModule()}/src/main/AndroidManifest.xml") + } + + // 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 emitBrowseable(type:Copy) { + def outputPath =outPath("browseable"); + def inputPath = "${project.projectDir}/${samplegen.targetSampleModule()}" + mkdir outputPath + into outputPath + + from("${project.projectDir}/_index.jd") + def srcDirs = ["main", "common", "template"].collect {input -> "${inputPath}/src/${input}" }; + def javaDirs = srcDirs.collect { input -> "${input}/java"} + FileTree javaTree = null; + javaDirs.each { dir -> + FileTree tree = project.fileTree("${dir}") + javaTree = (javaTree == null) ? tree : javaTree.plus(tree)} + println javaTree; + println srcDirs + Map collapsedPaths = collapsePaths(javaTree, javaDirs) + + srcDirs.each { srcPath -> + println srcPath; + into("src") { + def javaPath = "${srcPath}/java"; + from(javaPath) + 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" + } + into("res") { + from("${srcPath}/res") + } + into(".") {from("${srcPath}/AndroidManifest.xml")} + } +} + +task emitGradleZip(dependsOn: [emitBrowseable, emitGradle], type:Zip) { + def outputPath = "${samplegen.pathToBuild}/out/browseable" + def folderName = "${samplegen.targetSampleName()}" + archiveName = "${samplegen.targetSampleName()}.zip" + def inputPath = outPath("gradle") + from inputPath + into folderName + include "**" + def outDir = project.file(outputPath) + destinationDir = outDir +} diff --git a/build.iml b/build.iml new file mode 100644 index 00000000..2edbb2bb --- /dev/null +++ b/build.iml @@ -0,0 +1,13 @@ +<?xml version="1.0" encoding="UTF-8"?> +<module external.linked.project.path="$USER_HOME$/src/android/developers-dev/developers/samples/android/common/build" external.system.id="GRADLE" type="JAVA_MODULE" version="4"> + <component name="NewModuleRootManager" inherit-compiler-output="true"> + <exclude-output /> + <content url="file://$MODULE_DIR$"> + <excludeFolder url="file://$MODULE_DIR$/.gradle" /> + <excludeFolder url="file://$MODULE_DIR$/build" /> + </content> + <orderEntry type="inheritedJdk" /> + <orderEntry type="sourceFolder" forTests="false" /> + </component> +</module> + diff --git a/buildSrc/build.gradle b/buildSrc/build.gradle new file mode 100644 index 00000000..7ac6c8f2 --- /dev/null +++ b/buildSrc/build.gradle @@ -0,0 +1,11 @@ +apply plugin: 'groovy' + +repositories { + mavenCentral() +} + +dependencies { + compile 'org.freemarker:freemarker:2.3.20' + compile gradleApi() + compile localGroovy() +} diff --git a/buildSrc/src/main/groovy/com/example/android/samples/build/ApplyTemplates.groovy b/buildSrc/src/main/groovy/com/example/android/samples/build/ApplyTemplates.groovy new file mode 100644 index 00000000..9a42d615 --- /dev/null +++ b/buildSrc/src/main/groovy/com/example/android/samples/build/ApplyTemplates.groovy @@ -0,0 +1,177 @@ +/* +* Copyright 2013 The Android Open Source Project +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ +package com.example.android.samples.build + +import freemarker.cache.FileTemplateLoader +import freemarker.cache.MultiTemplateLoader +import freemarker.cache.TemplateLoader +import freemarker.template.Configuration +import freemarker.template.DefaultObjectWrapper +import freemarker.template.Template +import org.gradle.api.GradleException +import org.gradle.api.file.FileVisitDetails +import org.gradle.api.tasks.InputDirectory +import org.gradle.api.tasks.OutputDirectory +import org.gradle.api.tasks.SourceTask +import org.gradle.api.tasks.TaskAction + + +class ApplyTemplates extends SourceTask { + /** + * Freemarker context object + */ + def Configuration cfg = new freemarker.template.Configuration() + + /** + * The root directory for output files. All output file paths + * are assumed to be relative to this root. + */ + @OutputDirectory + public outputDir = project.projectDir + + /** + * Include directory. The templates in this directory will not be + * processed directly, but will be accessible to other templates + * via the <#include> directive. + */ + def include = project.file("$project.projectDir/templates/include") + + /** + * List of file extensions that indicate a file to be processed, rather + * than simply copied. + */ + def extensionsToProcess = ['ftl'] + + /** + * List of file extensions that should be completely ignored by this + * task. File extensions that appear in neither this list nor the list + * specified by {@link #extensionsToProcess} are copied into the destination + * without processing. + */ + def extensionsToIgnore = ['ftli'] + + /** + * A String -> String closure that transforms a (relative) input path into a + * (relative) output path. This closure is responsible for any alterations to + * the output path, including pathname substitution and extension removal. + */ + Closure<String> filenameTransform + + /** + * The hash which will be passed to the freemarker template engine. This hash + * is used by the freemarker script as input data. + * The hash should contain a key named "meta". The template processor will add + * processing data to this key. + */ + def parameters + + /** + * The main action for this task. Visits each file in the source directories and + * either processes, copies, or ignores it. The action taken for each file depends + * on the contents of {@link #extensionsToProcess} and {@link #extensionsToIgnore}. + */ + @TaskAction + def applyTemplate() { + // Create a list of Freemarker template loaders based on the + // source tree(s) of this task. The loader list establishes a virtual + // file system for freemarker templates; the template language can + // load files, and each load request will have its path resolved + // against this set of loaders. + println "Gathering template load locations:" + def List loaders = [] + source.asFileTrees.each { + src -> + println " ${src.dir}" + loaders.add(0, new FileTemplateLoader(project.file(src.dir))) + } + + // Add the include path(s) to the list of loaders. + println "Gathering template include locations:" + include = project.fileTree(include) + include.asFileTrees.each { + inc -> + println " ${inc.dir}" + loaders.add(0, new FileTemplateLoader(project.file(inc.dir))) + } + // Add the loaders to the freemarker config + cfg.setTemplateLoader(new MultiTemplateLoader(loaders.toArray(new TemplateLoader[1]))) + + // Set the wrapper that will be used to convert the template parameters hash into + // the internal freemarker data model. The default wrapper is capable of handling a + // mix of POJOs/POGOs and XML nodes, so we'll use that. + cfg.setObjectWrapper(new DefaultObjectWrapper()) + + // This is very much like setting the target SDK level in Android. + cfg.setIncompatibleEnhancements("2.3.20") + + // Add an implicit <#include 'common.ftl' to the top of every file. + // TODO: should probably be a parameter instead of hardcoded like this. + cfg.addAutoInclude('common.ftl') + + // Visit every file in the source tree(s) + def processTree = source.getAsFileTree() + processTree.visit { + FileVisitDetails input -> + def inputFile = input.getRelativePath().toString() + def outputFile = input.getRelativePath().getFile(project.file(outputDir)) + // Get the input and output files, and make sure the output path exists + def renamedOutput = filenameTransform(outputFile.toString()) + outputFile = project.file(renamedOutput) + + if (input.directory){ + // create the output directory. This probably will have already been + // created as part of processing the files *in* the directory, but + // do it here anyway to support empty directories. + outputFile.mkdirs() + } else { + // We may or may not see the directory before we see the files + // in that directory, so create it here + outputFile.parentFile.mkdirs() + + // Check the input file extension against the process/ignore list + def extension = "NONE" + def extensionPattern = ~/.*\.(\w*)$/ + def extensionMatch = extensionPattern.matcher(inputFile) + if (extensionMatch.matches()) { + extension = extensionMatch[0][1] + } + // If the extension is in the process list, put the input through freemarker + if (extensionsToProcess.contains(extension)){ + print '[freemarker] PROCESS: ' + println "$inputFile -> $outputFile" + + try { + def Template tpl = this.cfg.getTemplate(inputFile) + def FileWriter out = new FileWriter(outputFile) + + // Add the output file path to parameters.meta so that the freemarker + // script can access it. + parameters.meta.put("outputFile", "${outputFile}") + tpl.process(parameters, out) + } catch (e) { + println e.message + throw new GradleException("Error processing ${inputFile}: ${e.message}") + } + } else if (!extensionsToIgnore.contains(extension)) { + // if it's not processed and not ignored, then it must be copied. + print '[freemarker] COPY: ' + println "$inputFile -> $outputFile" + input.copyTo(outputFile); + } + } + } + } +} diff --git a/buildSrc/src/main/groovy/com/example/android/samples/build/SampleGenPlugin.groovy b/buildSrc/src/main/groovy/com/example/android/samples/build/SampleGenPlugin.groovy new file mode 100644 index 00000000..faa29737 --- /dev/null +++ b/buildSrc/src/main/groovy/com/example/android/samples/build/SampleGenPlugin.groovy @@ -0,0 +1,99 @@ +/* +* Copyright 2013 The Android Open Source Project +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ +package com.example.android.samples.build + +import org.gradle.api.Plugin +import org.gradle.api.Project +import org.gradle.api.tasks.GradleBuild +/** + * Plugin to expose build rules for sample generation and packaging. + */ +class SampleGenPlugin implements Plugin { + + /** + * Creates a new sample generator task based on the supplied sources. + * + * @param name Name of the new task + * @param sources Source tree that this task should process + */ + void createTask( + Project project, + String name, + SampleGenProperties props, + def sources, + def destination) { + project.task ([type:ApplyTemplates], name, { + sources.each { tree -> + source += tree + } + outputDir = destination + include = props.templatesInclude() + filenameTransform = {s -> props.getOutputForInput(s)} + parameters = props.templateParams() + }) + } + + + @Override + void apply(project) { + project.extensions.create("samplegen", SampleGenProperties) + project.samplegen.project = project + SampleGenProperties samplegen = project.samplegen + project.task('create') { + if (project.gradle.startParameter.taskNames.contains('create')) { + samplegen.getCreationProperties() + } + + } + + project.task('refresh') { + samplegen.getRefreshProperties() + } + + project.afterEvaluate({ + createTask(project, + 'processTemplates', + samplegen, + samplegen.templates(), + samplegen.targetProjectPath) + createTask(project, + 'processCommon', + samplegen, + samplegen.common(), + samplegen.targetCommonPath()) + + + project.task([type: GradleBuild], 'bootstrap', { + buildFile = "${samplegen.targetProjectPath}/build.gradle" + dir = samplegen.targetProjectPath + tasks = ["refresh"] + }) + project.bootstrap.dependsOn(project.processTemplates) + project.bootstrap.dependsOn(project.processCommon) + project.create.dependsOn(project.bootstrap) + + project.refresh.dependsOn(project.processTemplates) + project.refresh.dependsOn(project.processCommon) + + // People get nervous when they see a task with no actions, so... + project.create << {println "Project creation finished."} + project.refresh << {println "Project refresh finished."} + + }) + } + + +} diff --git a/buildSrc/src/main/groovy/com/example/android/samples/build/SampleGenProperties.groovy b/buildSrc/src/main/groovy/com/example/android/samples/build/SampleGenProperties.groovy new file mode 100644 index 00000000..f1420cdf --- /dev/null +++ b/buildSrc/src/main/groovy/com/example/android/samples/build/SampleGenProperties.groovy @@ -0,0 +1,321 @@ +/* +* Copyright 2013 The Android Open Source Project +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ +package com.example.android.samples.build + +import freemarker.ext.dom.NodeModel +import groovy.transform.Canonical +import org.gradle.api.GradleException +import org.gradle.api.Project +import org.gradle.api.file.FileTree + +/** + * Gradle extension that holds properties for sample generation. + * + * The sample generator needs a number of properties whose values can be + * inferred by convention from a smaller number of initial properties. + * This class defines fields for the initial properties, and getter + * methods for the inferred properties. It also defines a small number + * of convenience methods for setting up template-generation tasks. + */ +@Canonical +class SampleGenProperties { + /** + * The Gradle project that this extension is being applied to. + */ + Project project + + /** + * Directory where the top-level sample project lives + */ + def targetProjectPath + + /** + * Relative path to samples/common directory + */ + def pathToSamplesCommon + + // Relative path to build directory (platform/developers/build) + def pathToBuild + + /** + * Java package name for the root package of this sample. + */ + String targetSamplePackage + + /** + * + * @return The path to the sample project (as opposed to the top-level project, which + * what is that even for anyway?) + */ + String targetSamplePath() { + return "${targetProjectPath}/${targetSampleModule()}" + } + + + + /** + * + * @return The path that contains common files -- can be cleaned without harming + * the sample + */ + String targetCommonPath() { + return "${targetSamplePath()}/src/common/java/com/example/android/common" + } + + /** + * + * @return The path that contains template files -- can be cleaned without harming + * the sample + */ + String targetTemplatePath() { + return "${targetSamplePath()}/src/template" + } + + /** + * The name of this sample (and also of the corresponding .iml file) + */ + String targetSampleName() { + return project.file(targetProjectPath).getName() + } + + /** + * The name of the main module in the sample project + */ + String targetSampleModule() { + return "${targetSampleName()}Sample" + } + + /** + * The path to the template parameters file + */ + String templateXml() { + return "${targetProjectPath}/template-params.xml" + } + + /** + * Transforms a package name into a java-style OS dependent path + * @param pkg cccc + * @return The java-style path to the package's code + */ + String packageAsPath(String pkg) { + return pkg.replaceAll(/\./, File.separator) + } + + /** + * Transforms a path into a java-style package name + * @param path The java-style path to the package's code + * @return Name of the package to transform + */ + String pathAsPackage(String path) { + return path.replaceAll(File.separator, /\./) + } + + /** + * Returns the path to the common/build/templates directory + */ + String templatesRoot() { + return "${targetProjectPath}/${pathToBuild}/templates" + } + + + /** + * Returns the path to common/src/java + */ + String commonSourceRoot() { + return "${targetProjectPath}/${pathToSamplesCommon}/src/java/com/example/android/common" + } + + /** + * Returns the path to the template include directory + */ + String templatesInclude() { + return "${templatesRoot()}/include" + } + + /** + * Returns the output file that will be generated for a particular + * input, by replacing generic pathnames with project-specific pathnames + * and dropping the .ftl extension from freemarker files. + * + * @param relativeInputPath Input file as a relative path from the template directory + * @return Relative output file path + */ + String getOutputForInput(String relativeInputPath) { + String outputPath = relativeInputPath + outputPath = outputPath.replaceAll('_PROJECT_', targetSampleName()) + outputPath = outputPath.replaceAll('_MODULE_', targetSampleModule()) + outputPath = outputPath.replaceAll('_PACKAGE_', packageAsPath(targetSamplePackage)) + + // This is kind of a hack; IntelliJ picks up any and all subdirectories named .idea, so + // named them ._IDE_ instead. TODO: remove when generating .idea projects is no longer necessary. + outputPath = outputPath.replaceAll('_IDE_', "idea") + outputPath = outputPath.replaceAll(/\.ftl$/, '') + + // Any file beginning with a dot won't get picked up, so rename them as necessary here. + outputPath = outputPath.replaceAll('gitignore', '.gitignore') + return outputPath + } + + /** + * Returns the tree(s) where the templates to be processed live. The template + * input paths that are passed to + * {@link SampleGenProperties#getOutputForInput(java.lang.String) getOutputForInput} + * are relative to the dir element in each tree. + */ + FileTree[] templates() { + def result = [] + def xmlFile = project.file(templateXml()) + if (xmlFile.exists()) { + def xml = new XmlSlurper().parse(xmlFile) + xml.template.each { template -> + result.add(project.fileTree(dir: "${templatesRoot()}/${template.@src}")) + } + } else { + result.add(project.fileTree(dir: "${templatesRoot()}/create")) + } + return result; + } + + /** + * Path(s) of the common directories to copy over to the sample project. + */ + FileTree[] common() { + def result = [] + def xmlFile = project.file(templateXml()) + if (xmlFile.exists()) { + def xml = new XmlSlurper().parse(xmlFile) + xml.common.each { common -> + println "Adding common/${common.@src} from ${commonSourceRoot()}" + result.add(project.fileTree ( + dir: "${commonSourceRoot()}", + include: "${common.@src}/**/*" + )) + } + } + return result + } + + /** + * Returns the hash to supply to the freemarker template processor. + * This is loaded from the file specified by {@link SampleGenProperties#templateXml()} + * if such a file exists, or synthesized with some default parameters if it does not. + * In addition, some data about the current project is added to the "meta" key of the + * hash. + * + * @return The hash to supply to freemarker + */ + Map templateParams() { + Map result = new HashMap(); + + def xmlFile = project.file(templateXml()) + if (xmlFile.exists()) { + // Parse the xml into Freemarker's DOM structure + def params = freemarker.ext.dom.NodeModel.parse(xmlFile) + + // Move to the <sample> node and stuff that in our map + def sampleNode = (NodeModel)params.exec(['/sample']) + result.put("sample", sampleNode) + } else { + // Fake data for use on creation + result.put("sample", [ + name:targetSampleName(), + package:targetSamplePackage, + minSdk:4 + ]) + } + + // Extra data that some templates find useful + result.put("meta", [ + root: targetProjectPath, + module: targetSampleModule(), + common: pathToSamplesCommon, + build: pathToBuild, + ]) + return result + } + + + + /** + * Generate default values for properties that can be inferred from an existing + * generated project, unless those properties have already been + * explicitly specified. + */ + void getRefreshProperties() { + if (!this.targetProjectPath) { + this.targetProjectPath = project.projectDir + } + def xmlFile = project.file(templateXml()) + if (xmlFile.exists()) { + println "Template XML: $xmlFile" + def xml = new XmlSlurper().parse(xmlFile) + this.targetSamplePackage = xml.package.toString() + println "Target Package: $targetSamplePackage" + } + } + + /** + * Generate default values for creation properties, unless those properties + * have already been explicitly specified. This method will attempt to get + * these properties interactively from the user if necessary. + */ + void getCreationProperties() { + def calledFrom = project.hasProperty('calledFrom') ? new File(project.calledFrom) + : project.projectDir + calledFrom = calledFrom.getCanonicalPath() + println('\n\n\nReady to create project...') + + if (!this.pathToSamplesCommonSet) { + if (project.hasProperty('pathToSamplesCommon')) { + this.pathToSamplesCommon = project.pathToSamplesCommon + } else { + throw new GradleException ( + 'create task requires project property pathToSamplesCommon') + } + } + + if (!this.pathToBuildSet) { + if (project.hasProperty('pathToBuild')) { + this.pathToBuild = project.pathToBuild + } else { + throw new GradleException ('create task requires project property pathToBuild') + } + } + + if (!this.targetProjectPath) { + if (project.hasProperty('out')) { + this.targetProjectPath = project.out + } else { + this.targetProjectPath = System.console().readLine( + "\noutput directory [$calledFrom]:") + if (this.targetProjectPath.length() <= 0) { + this.targetProjectPath = calledFrom + } + } + } + + if (!this.targetSamplePackage) { + def defaultPackage = "com.example.android." + + this.targetSampleName().toLowerCase() + this.targetSamplePackage = System.console().readLine( + "\nsample package name[$defaultPackage]:") + if (this.targetSamplePackage.length() <= 0) { + this.targetSamplePackage = defaultPackage + } + } + } + +} diff --git a/buildSrc/src/main/main.iml b/buildSrc/src/main/main.iml new file mode 100644 index 00000000..4faa95b5 --- /dev/null +++ b/buildSrc/src/main/main.iml @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="UTF-8"?> +<module type="JAVA_MODULE" version="4"> + <component name="NewModuleRootManager" inherit-compiler-output="true"> + <exclude-output /> + <content url="file://$MODULE_DIR$"> + <sourceFolder url="file://$MODULE_DIR$/groovy" isTestSource="false" /> + </content> + <orderEntry type="inheritedJdk" /> + <orderEntry type="sourceFolder" forTests="false" /> + </component> +</module> + diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar Binary files differnew file mode 100644 index 00000000..a7634b07 --- /dev/null +++ b/gradle/wrapper/gradle-wrapper.jar diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 00000000..ba5f04af --- /dev/null +++ b/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,18 @@ +# Copyright 2013 The Android Open Source Project +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists +distributionUrl=http\://services.gradle.org/distributions/gradle-1.8-bin.zip diff --git a/gradlew b/gradlew new file mode 100755 index 00000000..91a7e269 --- /dev/null +++ b/gradlew @@ -0,0 +1,164 @@ +#!/usr/bin/env bash + +############################################################################## +## +## Gradle start up script for UN*X +## +############################################################################## + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS="" + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD="maximum" + +warn ( ) { + echo "$*" +} + +die ( ) { + echo + echo "$*" + echo + exit 1 +} + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MINGW* ) + msys=true + ;; +esac + +# For Cygwin, ensure paths are in UNIX format before anything is touched. +if $cygwin ; then + [ -n "$JAVA_HOME" ] && JAVA_HOME=`cygpath --unix "$JAVA_HOME"` +fi + +# Attempt to set APP_HOME +# Resolve links: $0 may be a link +PRG="$0" +# Need this for relative symlinks. +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >&- +APP_HOME="`pwd -P`" +cd "$SAVED" >&- + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin, switch paths to Windows format before running java +if $cygwin ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=$((i+1)) + done + case $i in + (0) set -- ;; + (1) set -- "$args0" ;; + (2) set -- "$args0" "$args1" ;; + (3) set -- "$args0" "$args1" "$args2" ;; + (4) set -- "$args0" "$args1" "$args2" "$args3" ;; + (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules +function splitJvmOpts() { + JVM_OPTS=("$@") +} +eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS +JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME" + +exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@" diff --git a/gradlew.bat b/gradlew.bat new file mode 100644 index 00000000..aec99730 --- /dev/null +++ b/gradlew.bat @@ -0,0 +1,90 @@ +@if "%DEBUG%" == "" @echo off
+@rem ##########################################################################
+@rem
+@rem Gradle startup script for Windows
+@rem
+@rem ##########################################################################
+
+@rem Set local scope for the variables with windows NT shell
+if "%OS%"=="Windows_NT" setlocal
+
+@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+set DEFAULT_JVM_OPTS=
+
+set DIRNAME=%~dp0
+if "%DIRNAME%" == "" set DIRNAME=.
+set APP_BASE_NAME=%~n0
+set APP_HOME=%DIRNAME%
+
+@rem Find java.exe
+if defined JAVA_HOME goto findJavaFromJavaHome
+
+set JAVA_EXE=java.exe
+%JAVA_EXE% -version >NUL 2>&1
+if "%ERRORLEVEL%" == "0" goto init
+
+echo.
+echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:findJavaFromJavaHome
+set JAVA_HOME=%JAVA_HOME:"=%
+set JAVA_EXE=%JAVA_HOME%/bin/java.exe
+
+if exist "%JAVA_EXE%" goto init
+
+echo.
+echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:init
+@rem Get command-line arguments, handling Windowz variants
+
+if not "%OS%" == "Windows_NT" goto win9xME_args
+if "%@eval[2+2]" == "4" goto 4NT_args
+
+:win9xME_args
+@rem Slurp the command line arguments.
+set CMD_LINE_ARGS=
+set _SKIP=2
+
+:win9xME_args_slurp
+if "x%~1" == "x" goto execute
+
+set CMD_LINE_ARGS=%*
+goto execute
+
+:4NT_args
+@rem Get arguments from the 4NT Shell from JP Software
+set CMD_LINE_ARGS=%$
+
+:execute
+@rem Setup the command line
+
+set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
+
+@rem Execute Gradle
+"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
+
+:end
+@rem End local scope for the variables with windows NT shell
+if "%ERRORLEVEL%"=="0" goto mainEnd
+
+:fail
+rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
+rem the _cmd.exe /c_ return code!
+if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
+exit /b 1
+
+:mainEnd
+if "%OS%"=="Windows_NT" endlocal
+
+:omega
diff --git a/lib/assetstudio.jar b/lib/assetstudio.jar Binary files differnew file mode 100644 index 00000000..0893a22c --- /dev/null +++ b/lib/assetstudio.jar diff --git a/lib/buildSrc.jar b/lib/buildSrc.jar Binary files differnew file mode 100644 index 00000000..9c56bc15 --- /dev/null +++ b/lib/buildSrc.jar diff --git a/sample-create b/sample-create new file mode 100755 index 00000000..500e4688 --- /dev/null +++ b/sample-create @@ -0,0 +1,43 @@ +#!/usr/bin/env bash +# Copyright 2013 The Android Open Source Project +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Record the current working directory. This allows us to correctly interpret +# relative paths +CALLED_FROM=$( pwd -P ) + +# Record the location of this script. The assumption is that the script is located in the +# top-level build directory, so finding the script means finding the build directory. +SCRIPTNAME=$(basename "$0") +SCRIPTPATH=$( cd "$(dirname "$0")" ; pwd -P ) +GRADLE=$SCRIPTPATH/gradlew + +# Parameter 1 is the path from the cwd to the sample. +SAMPLE_PATH="" +if [ -n "$1" ]; then + SAMPLE_PATH=$CALLED_FROM/$1 +fi + +# Calculate the relative path from the sample location to the main build directory. This +# allows us to define build dependencies as relative paths, rather than requiring the developer +# to add them to the environment. +BUILDPATH=$(perl -e "use File::Spec; print File::Spec->abs2rel(@ARGV)" $SCRIPTPATH $SAMPLE_PATH) + +# Same thing for the samples common code: calculate the relative path. +SAMPLES_COMMON=$( cd $SCRIPTPATH/../samples/android/common ; pwd -P) +COMMONPATH=$(perl -e "use File::Spec; print File::Spec->abs2rel(@ARGV)" $SAMPLES_COMMON $SAMPLE_PATH) + +# Launch a Gradle build with the SampleGen creation parameters on the command line +$GRADLE -b $SCRIPTPATH/build.gradle --info create -Pout=$SAMPLE_PATH \ + -PcalledFrom=$CALLED_FROM -PpathToSamplesCommon=$COMMONPATH -PpathToBuild=$BUILDPATH diff --git a/settings.gradle b/settings.gradle new file mode 100644 index 00000000..af109465 --- /dev/null +++ b/settings.gradle @@ -0,0 +1,15 @@ +/* +* Copyright 2013 The Android Open Source Project +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ diff --git a/templates/ActivityCards/ActivityCardsCommon.ftli b/templates/ActivityCards/ActivityCardsCommon.ftli new file mode 100644 index 00000000..08745cd7 --- /dev/null +++ b/templates/ActivityCards/ActivityCardsCommon.ftli @@ -0,0 +1,17 @@ +<#ftl> +<#-- + Copyright 2013 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<#macro make_activity_res activity type>${(activity.class!"activity_class")?lower_case}_${type}</#macro> diff --git a/templates/ActivityCards/_MODULE_/src/template/java/_PACKAGE_/MainActivity.java.ftl b/templates/ActivityCards/_MODULE_/src/template/java/_PACKAGE_/MainActivity.java.ftl new file mode 100755 index 00000000..a3c8341a --- /dev/null +++ b/templates/ActivityCards/_MODULE_/src/template/java/_PACKAGE_/MainActivity.java.ftl @@ -0,0 +1,123 @@ +<#ftl> +<#include "/ActivityCardsCommon.ftli"> +<#-- + Copyright 2013 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> + +package ${sample.package}; + +import android.app.Activity; +import android.content.Intent; +import android.content.res.Resources; +import android.os.Bundle; +import android.view.View; +import android.view.ViewGroup; +import android.view.ViewTreeObserver; +import android.widget.AdapterView; +import android.widget.BaseAdapter; +import android.widget.GridView; +import android.widget.TextView; + +/** + * A simple launcher activity offering access to the individual samples in this project. + */ +public class MainActivity extends Activity implements AdapterView.OnItemClickListener { + private Sample[] mSamples; + private GridView mGridView; + + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_main); + + // Prepare list of samples in this dashboard. + <#if (sample.activity?size > 0)> + mSamples = new Sample[]{ + <#list sample.activity as activity> + new Sample(R.string.<@make_activity_res activity "title"/>, R.string.<@make_activity_res activity "description"/>, + ${activity.class}.class), + </#list> + }; + <#else> + /* TODO: Define at least one <activity> tag in template-params.xml like so: + <activity> + <class>[Java class that implements the activity]</class> + <title>[Title bar text]</title> + <description>[One or two sentence description of what this activity does]</description> + </activity> + Once activity tags are defined, this text will disappear and be replaced by code + that adds your activities to the grid of cards. + */ + </#if> + + // Prepare the GridView + mGridView = (GridView) findViewById(android.R.id.list); + mGridView.setAdapter(new SampleAdapter()); + mGridView.setOnItemClickListener(this); + } + + @Override + public void onItemClick(AdapterView<?> container, View view, int position, long id) { + startActivity(mSamples[position].intent); + } + + private class SampleAdapter extends BaseAdapter { + @Override + public int getCount() { + return mSamples.length; + } + + @Override + public Object getItem(int position) { + return mSamples[position]; + } + + @Override + public long getItemId(int position) { + return mSamples[position].hashCode(); + } + + @Override + public View getView(int position, View convertView, ViewGroup container) { + if (convertView == null) { + convertView = getLayoutInflater().inflate(R.layout.sample_dashboard_item, + container, false); + } + + ((TextView) convertView.findViewById(android.R.id.text1)).setText( + mSamples[position].titleResId); + ((TextView) convertView.findViewById(android.R.id.text2)).setText( + mSamples[position].descriptionResId); + return convertView; + } + } + + private class Sample { + int titleResId; + int descriptionResId; + Intent intent; + + private Sample(int titleResId, int descriptionResId, Intent intent) { + this.intent = intent; + this.titleResId = titleResId; + this.descriptionResId = descriptionResId; + } + + private Sample(int titleResId, int descriptionResId, + Class<? extends Activity> activityClass) { + this(titleResId, descriptionResId, + new Intent(MainActivity.this, activityClass)); + } + } +} diff --git a/templates/ActivityCards/_MODULE_/src/template/res/drawable-xhdpi/sample_dashboard_item_background.9.png b/templates/ActivityCards/_MODULE_/src/template/res/drawable-xhdpi/sample_dashboard_item_background.9.png Binary files differnew file mode 100644 index 00000000..13586288 --- /dev/null +++ b/templates/ActivityCards/_MODULE_/src/template/res/drawable-xhdpi/sample_dashboard_item_background.9.png diff --git a/templates/ActivityCards/_MODULE_/src/template/res/layout/activity_main.xml b/templates/ActivityCards/_MODULE_/src/template/res/layout/activity_main.xml new file mode 100755 index 00000000..88cdb805 --- /dev/null +++ b/templates/ActivityCards/_MODULE_/src/template/res/layout/activity_main.xml @@ -0,0 +1,41 @@ +<!-- + Copyright 2013 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + --> + +<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:orientation="vertical"> + + <TextView style="@style/Widget.SampleMessage" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_marginLeft="@dimen/horizontal_page_margin" + android:layout_marginRight="@dimen/horizontal_page_margin" + android:layout_marginTop="@dimen/vertical_page_margin" + android:layout_marginBottom="@dimen/vertical_page_margin" + android:text="@string/intro_message" /> + + <GridView android:id="@android:id/list" + style="@style/Widget.SampleDashboard.Grid" + android:layout_width="match_parent" + android:layout_height="0dp" + android:layout_weight="1" + android:paddingLeft="@dimen/horizontal_page_margin" + android:paddingRight="@dimen/horizontal_page_margin" + android:paddingBottom="@dimen/vertical_page_margin" + android:scrollbarStyle="outsideOverlay" /> + +</LinearLayout> diff --git a/templates/ActivityCards/_MODULE_/src/template/res/layout/sample_dashboard_item.xml b/templates/ActivityCards/_MODULE_/src/template/res/layout/sample_dashboard_item.xml new file mode 100644 index 00000000..38987ee2 --- /dev/null +++ b/templates/ActivityCards/_MODULE_/src/template/res/layout/sample_dashboard_item.xml @@ -0,0 +1,32 @@ +<!-- + Copyright 2013 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + --> + +<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" + style="@style/Widget.SampleDashboard.Item" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:orientation="vertical"> + + <TextView android:id="@android:id/text1" + style="@style/Widget.SampleDashboard.Item.Title" + android:layout_width="match_parent" + android:layout_height="wrap_content" /> + + <TextView android:id="@android:id/text2" + style="@style/Widget.SampleDashboard.Item.Description" + android:layout_width="match_parent" + android:layout_height="wrap_content" /> +</LinearLayout> diff --git a/templates/ActivityCards/_MODULE_/src/template/res/values-sw600dp/template-dimens.xml b/templates/ActivityCards/_MODULE_/src/template/res/values-sw600dp/template-dimens.xml new file mode 100644 index 00000000..22074a2b --- /dev/null +++ b/templates/ActivityCards/_MODULE_/src/template/res/values-sw600dp/template-dimens.xml @@ -0,0 +1,24 @@ +<!-- + Copyright 2013 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + --> + +<resources> + + <!-- Semantic definitions --> + + <dimen name="horizontal_page_margin">@dimen/margin_huge</dimen> + <dimen name="vertical_page_margin">@dimen/margin_medium</dimen> + +</resources> diff --git a/templates/ActivityCards/_MODULE_/src/template/res/values/activitycards-strings.xml.ftl b/templates/ActivityCards/_MODULE_/src/template/res/values/activitycards-strings.xml.ftl new file mode 100644 index 00000000..1a21a8ac --- /dev/null +++ b/templates/ActivityCards/_MODULE_/src/template/res/values/activitycards-strings.xml.ftl @@ -0,0 +1,25 @@ +<#ftl> +<#include "/ActivityCardsCommon.ftli"> +<#-- + Copyright 2013 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<#include "/ActivityCardsCommon.ftli"> + +<resources> +<#list sample.activity as activity> + <string name="<@make_activity_res activity "title"/>">${activity.title!"activity.title"}</string> + <string name="<@make_activity_res activity "description"/>">${activity.description!"activity.description"}</string> +</#list> +</resources> diff --git a/templates/ActivityCards/_MODULE_/src/template/res/values/template-styles.xml b/templates/ActivityCards/_MODULE_/src/template/res/values/template-styles.xml new file mode 100644 index 00000000..cafe531a --- /dev/null +++ b/templates/ActivityCards/_MODULE_/src/template/res/values/template-styles.xml @@ -0,0 +1,71 @@ +<!-- + Copyright 2013 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + --> + +<resources> + + <!-- Activity themes --> + + <style name="Theme.Base" parent="android:Theme.Holo.Light" /> + + <style name="Theme.Sample" parent="Theme.Base" /> + + <style name="AppTheme" parent="Theme.Sample" /> + <!-- Widget styling --> + + <style name="Widget" /> + + <style name="Widget.SampleContentContainer"> + <item name="android:paddingTop">@dimen/vertical_page_margin</item> + <item name="android:paddingBottom">@dimen/vertical_page_margin</item> + <item name="android:paddingLeft">@dimen/horizontal_page_margin</item> + <item name="android:paddingRight">@dimen/horizontal_page_margin</item> + </style> + + <style name="Widget.SampleMessage"> + <item name="android:textAppearance">?android:textAppearanceMedium</item> + <item name="android:lineSpacingMultiplier">1.1</item> + </style> + + <style name="Widget.SampleDashboard.Grid" parent="Widget"> + <item name="android:stretchMode">columnWidth</item> + <item name="android:columnWidth">200dp</item> + <item name="android:numColumns">auto_fit</item> + <item name="android:drawSelectorOnTop">true</item> + <item name="android:horizontalSpacing">@dimen/margin_medium</item> + <item name="android:verticalSpacing">@dimen/margin_medium</item> + </style> + + <style name="Widget.SampleDashboard.Item" parent="Widget"> + <item name="android:background">@drawable/sample_dashboard_item_background</item> + <item name="android:paddingTop">@dimen/margin_small</item> + <item name="android:paddingLeft">@dimen/margin_medium</item> + <item name="android:paddingRight">@dimen/margin_medium</item> + <item name="android:paddingBottom">@dimen/margin_medium</item> + </style> + + <style name="Widget.SampleDashboard.Item.Title" parent="Widget"> + <item name="android:layout_marginBottom">@dimen/margin_tiny</item> + <item name="android:textAppearance">?android:textAppearanceLarge</item> + <item name="android:textColor">#09c</item> + <item name="android:textStyle">bold</item> + <item name="android:textSize">24sp</item> + </style> + + <style name="Widget.SampleDashboard.Item.Description" parent="Widget"> + <item name="android:textAppearance">?android:textAppearanceSmall</item> + <item name="android:fontFamily">sans-serif-light</item> + </style> +</resources> diff --git a/templates/SimpleView/_MODULE_/README-simpleview.txt b/templates/SimpleView/_MODULE_/README-simpleview.txt new file mode 100644 index 00000000..4ac7cdb8 --- /dev/null +++ b/templates/SimpleView/_MODULE_/README-simpleview.txt @@ -0,0 +1,29 @@ +<#-- + Copyright 2013 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> + +Steps to implement SimpleView template: +-in template-params.xml.ftl: + -add the following line to common imports + <common src="activities"/> + +-Add a Fragment to handle behavior. In your MainActivity.java class, it will reference a Fragment + called (yourProjectName)Fragment.java. Create that file in your project, using the "main" source + folder instead of "common" or "templates". + For instance, if your package name is com.example.foo, create the file + src/main/java/com/example/foo/FooFragment.java + +-refer to sampleSamples/simpleViewSample for a reference implementation of a +project built on this template. diff --git a/templates/SimpleView/_MODULE_/src/template/java/_PACKAGE_/MainActivity.java.ftl b/templates/SimpleView/_MODULE_/src/template/java/_PACKAGE_/MainActivity.java.ftl new file mode 100644 index 00000000..0d6e6840 --- /dev/null +++ b/templates/SimpleView/_MODULE_/src/template/java/_PACKAGE_/MainActivity.java.ftl @@ -0,0 +1,76 @@ +<#ftl> +<#-- + Copyright 2013 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> + +package ${sample.package}; + +import android.os.Bundle; +import android.support.v4.app.FragmentTransaction; +import android.view.Menu; + +import com.example.android.common.activities.SampleActivityBase; +import com.example.android.common.logger.Log; +import com.example.android.common.logger.LogFragment; +import com.example.android.common.logger.LogWrapper; +import com.example.android.common.logger.MessageOnlyLogFilter; + +/** + * A simple launcher activity containing a summary sample description + * and a few action bar buttons. + */ +public class MainActivity extends SampleActivityBase { + + public static final String TAG = "MainActivity"; + + public static final String FRAGTAG = "${sample.name?cap_first}Fragment"; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_main); + + FragmentTransaction transaction = getSupportFragmentManager().beginTransaction(); + ${sample.name?cap_first}Fragment fragment = new ${sample.name?cap_first}Fragment(); + transaction.add(fragment, FRAGTAG); + transaction.commit(); + } + + @Override + public boolean onCreateOptionsMenu(Menu menu) { + getMenuInflater().inflate(R.menu.main, menu); + return true; + } + + /** Create a chain of targets that will receive log data */ + @Override + public void initializeLogging() { + // Wraps Android's native log framework. + LogWrapper logWrapper = new LogWrapper(); + // Using Log, front-end to the logging chain, emulates android.util.log method signatures. + Log.setLogNode(logWrapper); + + // Filter strips out everything except the message text. + MessageOnlyLogFilter msgFilter = new MessageOnlyLogFilter(); + logWrapper.setNext(msgFilter); + + // On screen logging via a fragment with a TextView. + LogFragment logFragment = (LogFragment) getSupportFragmentManager() + .findFragmentById(R.id.log_fragment); + msgFilter.setNext(logFragment.getLogView()); + + Log.i(TAG, "Ready"); + } +}
\ No newline at end of file diff --git a/templates/SimpleView/_MODULE_/src/template/res/layout/activity_main.xml b/templates/SimpleView/_MODULE_/src/template/res/layout/activity_main.xml new file mode 100644 index 00000000..bc5a5759 --- /dev/null +++ b/templates/SimpleView/_MODULE_/src/template/res/layout/activity_main.xml @@ -0,0 +1,38 @@ +<!-- + Copyright 2013 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + --> +<LinearLayout + xmlns:android="http://schemas.android.com/apk/res/android" + android:orientation="vertical" + android:layout_width="fill_parent" + android:layout_height="fill_parent" + android:id="@+id/sample_main_layout"> + <TextView android:id="@+id/sample_output" + style="@style/Widget.SampleMessage" + android:layout_weight="1" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:text="@string/intro_message" /> + <View + android:layout_width="fill_parent" + android:layout_height="1dp" + android:background="@android:color/darker_gray"/> + <fragment + android:name="com.example.android.common.logger.LogFragment" + android:id="@+id/log_fragment" + android:layout_weight="1" + android:layout_width="match_parent" + android:layout_height="match_parent" /> +</LinearLayout> diff --git a/templates/SimpleView/_MODULE_/src/template/res/values-sw600dp/template-dimens.xml b/templates/SimpleView/_MODULE_/src/template/res/values-sw600dp/template-dimens.xml new file mode 100644 index 00000000..22074a2b --- /dev/null +++ b/templates/SimpleView/_MODULE_/src/template/res/values-sw600dp/template-dimens.xml @@ -0,0 +1,24 @@ +<!-- + Copyright 2013 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + --> + +<resources> + + <!-- Semantic definitions --> + + <dimen name="horizontal_page_margin">@dimen/margin_huge</dimen> + <dimen name="vertical_page_margin">@dimen/margin_medium</dimen> + +</resources> diff --git a/templates/SimpleView/_MODULE_/src/template/res/values-sw600dp/template-styles.xml b/templates/SimpleView/_MODULE_/src/template/res/values-sw600dp/template-styles.xml new file mode 100644 index 00000000..03d19741 --- /dev/null +++ b/templates/SimpleView/_MODULE_/src/template/res/values-sw600dp/template-styles.xml @@ -0,0 +1,25 @@ +<!-- + Copyright 2013 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + --> + +<resources> + + <style name="Widget.SampleMessage"> + <item name="android:textAppearance">?android:textAppearanceLarge</item> + <item name="android:lineSpacingMultiplier">1.2</item> + <item name="android:shadowDy">-6.5</item> + </style> + +</resources> diff --git a/templates/SimpleView/_MODULE_/src/template/res/values/template-styles.xml b/templates/SimpleView/_MODULE_/src/template/res/values/template-styles.xml new file mode 100644 index 00000000..d3f82ff6 --- /dev/null +++ b/templates/SimpleView/_MODULE_/src/template/res/values/template-styles.xml @@ -0,0 +1,51 @@ +<!-- + Copyright 2013 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + --> + +<resources> + + <!-- Activity themes --> + + <style name="Theme.Base" parent="android:Theme.Holo.Light" /> + + <style name="AppTheme" parent="Theme.Base" /> + <!-- Widget styling --> + + <style name="Widget" /> + + <style name="Widget.SampleMessage"> + <item name="android:textAppearance">?android:textAppearanceMedium</item> + <item name="android:lineSpacingMultiplier">1.1</item> + </style> + + <style name="Widget.SampleMessageTile"> + <item name="android:background">@drawable/tile</item> + <item name="android:shadowColor">#7F000000</item> + <item name="android:shadowDy">-3.5</item> + <item name="android:shadowRadius">2</item> + </style> + + + <style name="Widget.SampleOutput"> + <item name="android:padding">@dimen/margin_medium</item> + <item name="android:textAppearance">?android:textAppearanceMedium</item> + <item name="android:lineSpacingMultiplier">1.1</item> + </style> + + <style name="Log" parent="Widget.SampleOutput"> + <item name="android:typeface">monospace</item> + </style> + +</resources> diff --git a/templates/SingleView/_MODULE_/README-singleview.txt b/templates/SingleView/_MODULE_/README-singleview.txt new file mode 100644 index 00000000..0cacd467 --- /dev/null +++ b/templates/SingleView/_MODULE_/README-singleview.txt @@ -0,0 +1,47 @@ +<#-- + Copyright 2013 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> + +Steps to implement SingleView template: +-in template-params.xml.ftl: + -add the following line to common imports + <common src="activities"/> + + -add a string for the action button's text using the element name "sample_action". + This element should be a child of <strings>: + <strings> + ... + <sample_action>ButtonText</sample_action> + ... + </strings> + + + +-Add a Fragment to handle behavior. In your MainActivity.java class, it will reference a Fragment + called (yourProjectName)Fragment.java. Create that file in your project, using the "main" source + folder instead of "common" or "templates". + For instance, if your package name is com.example.foo, create the file + src/main/java/com/example/foo/FooFragment.java + + +-Within this fragment, make sure that the onCreate method has the line + "setHasOptionsMenu(true);", to enable the fragment to handle menu events. + +-In order to override menu events, override onOptionsItemSelected. + +-refer to sampleSamples/singleViewSample for a reference implementation of a +project built on this template. + + diff --git a/templates/SingleView/_MODULE_/src/template/java/_PACKAGE_/MainActivity.java.ftl b/templates/SingleView/_MODULE_/src/template/java/_PACKAGE_/MainActivity.java.ftl new file mode 100755 index 00000000..c4fe05a2 --- /dev/null +++ b/templates/SingleView/_MODULE_/src/template/java/_PACKAGE_/MainActivity.java.ftl @@ -0,0 +1,78 @@ +<#ftl> +<#-- + Copyright 2013 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> + +package ${sample.package}; + +import android.os.Bundle; +import android.support.v4.app.FragmentTransaction; +import android.view.Menu; + +import com.example.android.common.activities.SampleActivityBase; +import com.example.android.common.logger.Log; +import com.example.android.common.logger.LogFragment; +import com.example.android.common.logger.LogWrapper; +import com.example.android.common.logger.MessageOnlyLogFilter; + +/** + * A simple launcher activity containing a summary sample description + * and a few action bar buttons. + */ +public class MainActivity extends SampleActivityBase { + + public static final String TAG = "MainActivity"; + + public static final String FRAGTAG = "${sample.name?cap_first}Fragment"; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_main); + + if (getSupportFragmentManager().findFragmentByTag(FRAGTAG) == null ) { + FragmentTransaction transaction = getSupportFragmentManager().beginTransaction(); + ${sample.name?cap_first}Fragment fragment = new ${sample.name?cap_first}Fragment(); + transaction.add(fragment, FRAGTAG); + transaction.commit(); + } + } + + @Override + public boolean onCreateOptionsMenu(Menu menu) { + getMenuInflater().inflate(R.menu.main, menu); + return true; + } + + /** Create a chain of targets that will receive log data */ + @Override + public void initializeLogging() { + // Wraps Android's native log framework. + LogWrapper logWrapper = new LogWrapper(); + // Using Log, front-end to the logging chain, emulates android.util.log method signatures. + Log.setLogNode(logWrapper); + + // Filter strips out everything except the message text. + MessageOnlyLogFilter msgFilter = new MessageOnlyLogFilter(); + logWrapper.setNext(msgFilter); + + // On screen logging via a fragment with a TextView. + LogFragment logFragment = (LogFragment) getSupportFragmentManager() + .findFragmentById(R.id.log_fragment); + msgFilter.setNext(logFragment.getLogView()); + + Log.i(TAG, "Ready"); + } +} diff --git a/templates/SingleView/_MODULE_/src/template/res/layout/activity_main.xml b/templates/SingleView/_MODULE_/src/template/res/layout/activity_main.xml new file mode 100755 index 00000000..bc5a5759 --- /dev/null +++ b/templates/SingleView/_MODULE_/src/template/res/layout/activity_main.xml @@ -0,0 +1,38 @@ +<!-- + Copyright 2013 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + --> +<LinearLayout + xmlns:android="http://schemas.android.com/apk/res/android" + android:orientation="vertical" + android:layout_width="fill_parent" + android:layout_height="fill_parent" + android:id="@+id/sample_main_layout"> + <TextView android:id="@+id/sample_output" + style="@style/Widget.SampleMessage" + android:layout_weight="1" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:text="@string/intro_message" /> + <View + android:layout_width="fill_parent" + android:layout_height="1dp" + android:background="@android:color/darker_gray"/> + <fragment + android:name="com.example.android.common.logger.LogFragment" + android:id="@+id/log_fragment" + android:layout_weight="1" + android:layout_width="match_parent" + android:layout_height="match_parent" /> +</LinearLayout> diff --git a/templates/SingleView/_MODULE_/src/template/res/menu/main.xml b/templates/SingleView/_MODULE_/src/template/res/menu/main.xml new file mode 100644 index 00000000..2c3515dd --- /dev/null +++ b/templates/SingleView/_MODULE_/src/template/res/menu/main.xml @@ -0,0 +1,21 @@ +<!-- + Copyright 2013 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + --> + +<menu xmlns:android="http://schemas.android.com/apk/res/android"> + <item android:id="@+id/sample_action" + android:showAsAction="ifRoom|withText" + android:title="@string/sample_action" /> +</menu> diff --git a/templates/SingleView/_MODULE_/src/template/res/values-sw600dp/template-dimens.xml b/templates/SingleView/_MODULE_/src/template/res/values-sw600dp/template-dimens.xml new file mode 100644 index 00000000..22074a2b --- /dev/null +++ b/templates/SingleView/_MODULE_/src/template/res/values-sw600dp/template-dimens.xml @@ -0,0 +1,24 @@ +<!-- + Copyright 2013 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + --> + +<resources> + + <!-- Semantic definitions --> + + <dimen name="horizontal_page_margin">@dimen/margin_huge</dimen> + <dimen name="vertical_page_margin">@dimen/margin_medium</dimen> + +</resources> diff --git a/templates/SingleView/_MODULE_/src/template/res/values-sw600dp/template-styles.xml b/templates/SingleView/_MODULE_/src/template/res/values-sw600dp/template-styles.xml new file mode 100644 index 00000000..03d19741 --- /dev/null +++ b/templates/SingleView/_MODULE_/src/template/res/values-sw600dp/template-styles.xml @@ -0,0 +1,25 @@ +<!-- + Copyright 2013 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + --> + +<resources> + + <style name="Widget.SampleMessage"> + <item name="android:textAppearance">?android:textAppearanceLarge</item> + <item name="android:lineSpacingMultiplier">1.2</item> + <item name="android:shadowDy">-6.5</item> + </style> + +</resources> diff --git a/templates/SingleView/_MODULE_/src/template/res/values/strings.xml.ftl b/templates/SingleView/_MODULE_/src/template/res/values/strings.xml.ftl new file mode 100755 index 00000000..b7af2570 --- /dev/null +++ b/templates/SingleView/_MODULE_/src/template/res/values/strings.xml.ftl @@ -0,0 +1,23 @@ +<#ftl> +<#-- + Copyright 2013 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<resources> + <#if (sample.strings.sample_action)?is_string> + <string name="sample_action">${sample.strings.sample_action}</string> + <#else> + <string name="sample_action">TODO: Add strings/!sample_action!</string> + </#if> +</resources> diff --git a/templates/SingleView/_MODULE_/src/template/res/values/template-styles.xml b/templates/SingleView/_MODULE_/src/template/res/values/template-styles.xml new file mode 100644 index 00000000..d3f82ff6 --- /dev/null +++ b/templates/SingleView/_MODULE_/src/template/res/values/template-styles.xml @@ -0,0 +1,51 @@ +<!-- + Copyright 2013 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + --> + +<resources> + + <!-- Activity themes --> + + <style name="Theme.Base" parent="android:Theme.Holo.Light" /> + + <style name="AppTheme" parent="Theme.Base" /> + <!-- Widget styling --> + + <style name="Widget" /> + + <style name="Widget.SampleMessage"> + <item name="android:textAppearance">?android:textAppearanceMedium</item> + <item name="android:lineSpacingMultiplier">1.1</item> + </style> + + <style name="Widget.SampleMessageTile"> + <item name="android:background">@drawable/tile</item> + <item name="android:shadowColor">#7F000000</item> + <item name="android:shadowDy">-3.5</item> + <item name="android:shadowRadius">2</item> + </style> + + + <style name="Widget.SampleOutput"> + <item name="android:padding">@dimen/margin_medium</item> + <item name="android:textAppearance">?android:textAppearanceMedium</item> + <item name="android:lineSpacingMultiplier">1.1</item> + </style> + + <style name="Log" parent="Widget.SampleOutput"> + <item name="android:typeface">monospace</item> + </style> + +</resources> diff --git a/templates/base/README.txt b/templates/base/README.txt new file mode 100644 index 00000000..9616c582 --- /dev/null +++ b/templates/base/README.txt @@ -0,0 +1,18 @@ +Build Instructions +------------------- + +This sample uses the Gradle build system. To build this project, use the +"gradlew build" command or use "Import Project" in Android Studio. + +To see a list of all available commands, run "gradlew tasks". + +Dependencies +------------- + +- Android SDK Build-tools v18.1 +- Android Support Repository v2 + +Dependencies are available for download via the Android SDK Manager. + +Android Studio is available for download at: + http://developer.android.com/sdk/installing/studio.html diff --git a/templates/base/_MODULE_/build.gradle.ftl b/templates/base/_MODULE_/build.gradle.ftl new file mode 100644 index 00000000..86365e3e --- /dev/null +++ b/templates/base/_MODULE_/build.gradle.ftl @@ -0,0 +1,86 @@ +<#-- + Copyright 2013 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +buildscript { + repositories { + mavenCentral() + } + + dependencies { + classpath 'com.android.tools.build:gradle:0.6.+' + } +} + +apply plugin: 'android' + +dependencies { + // Add the support lib that is appropriate for SDK ${sample.minSdk} +<#if sample.minSdk?number < 7> + compile "com.android.support:support-v4:18.0.+" +<#elseif sample.minSdk?number < 13> + compile "com.android.support:support-v4:18.0.+" + compile "com.android.support:gridlayout-v7:18.0.+" +<#else> + compile "com.android.support:support-v13:18.0.+" +</#if> +<#list sample.dependency as dep> + compile "${dep}" +</#list> +} + +// The sample build uses multiple directories to +// keep boilerplate and common code separate from +// the main sample code. +List<String> dirs = [ + 'main', // main sample code; look here for the interesting stuff. + 'common', // components that are reused by multiple samples + 'template'] // boilerplate code that is generated by the sample template process + +android { + <#-- Note that target SDK is hardcoded in this template. We expect all samples + to always use the most current SDK as their target. --> + compileSdkVersion ${compile_sdk} + buildToolsVersion "19" + + sourceSets { + main { + dirs.each { dir -> +<#noparse> + java.srcDirs "src/${dir}/java" + res.srcDirs "src/${dir}/res" +</#noparse> + } + } + instrumentTest.setRoot('tests') + instrumentTest.java.srcDirs = ['tests/src'] + } +} +// BEGIN_EXCLUDE +// Tasks below this line will be hidden from release output + +task preflight (dependsOn: parent.preflight) { + project.afterEvaluate { + // Inject a preflight task into each variant so we have a place to hook tasks + // that need to run before any of the android build tasks. + // + android.applicationVariants.each { variant -> + <#noparse> + tasks.getByPath("prepare${variant.name.capitalize()}Dependencies").dependsOn preflight + </#noparse> + } + } +} + +// END_EXCLUDE diff --git a/templates/base/_MODULE_/src/template/project.properties.ftl b/templates/base/_MODULE_/src/template/project.properties.ftl new file mode 100644 index 00000000..81066779 --- /dev/null +++ b/templates/base/_MODULE_/src/template/project.properties.ftl @@ -0,0 +1,18 @@ +<#ftl> +# This file is automatically generated by Android Tools. +# Do not modify this file -- YOUR CHANGES WILL BE ERASED! +# +# This file must be checked in Version Control Systems. +# +# To customize properties used by the Ant build system edit +# "ant.properties", and override values to adapt the script to your +# project structure. +# +# To enable ProGuard to shrink and obfuscate your code, uncomment this (available properties: sdk.dir, +user.home): +<#noparse> +#proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt +</#noparse> + +# Project target. +target=android-${compile_sdk} diff --git a/templates/base/_MODULE_/src/template/res/drawable-hdpi/tile.9.png b/templates/base/_MODULE_/src/template/res/drawable-hdpi/tile.9.png Binary files differnew file mode 100644 index 00000000..13586288 --- /dev/null +++ b/templates/base/_MODULE_/src/template/res/drawable-hdpi/tile.9.png diff --git a/templates/base/_MODULE_/src/template/res/layout/activity_main.xml b/templates/base/_MODULE_/src/template/res/layout/activity_main.xml new file mode 100755 index 00000000..be1aa49d --- /dev/null +++ b/templates/base/_MODULE_/src/template/res/layout/activity_main.xml @@ -0,0 +1,36 @@ +<!-- + Copyright 2013 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + --> + +<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:orientation="vertical"> + + <LinearLayout style="@style/Widget.SampleMessageTile" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:orientation="vertical"> + + <TextView style="@style/Widget.SampleMessage" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_marginLeft="@dimen/horizontal_page_margin" + android:layout_marginRight="@dimen/horizontal_page_margin" + android:layout_marginTop="@dimen/vertical_page_margin" + android:layout_marginBottom="@dimen/vertical_page_margin" + android:text="@string/intro_message" /> + </LinearLayout> +</LinearLayout> diff --git a/templates/base/_MODULE_/src/template/res/values-sw600dp/template-dimens.xml b/templates/base/_MODULE_/src/template/res/values-sw600dp/template-dimens.xml new file mode 100644 index 00000000..22074a2b --- /dev/null +++ b/templates/base/_MODULE_/src/template/res/values-sw600dp/template-dimens.xml @@ -0,0 +1,24 @@ +<!-- + Copyright 2013 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + --> + +<resources> + + <!-- Semantic definitions --> + + <dimen name="horizontal_page_margin">@dimen/margin_huge</dimen> + <dimen name="vertical_page_margin">@dimen/margin_medium</dimen> + +</resources> diff --git a/templates/base/_MODULE_/src/template/res/values-sw600dp/template-styles.xml b/templates/base/_MODULE_/src/template/res/values-sw600dp/template-styles.xml new file mode 100644 index 00000000..03d19741 --- /dev/null +++ b/templates/base/_MODULE_/src/template/res/values-sw600dp/template-styles.xml @@ -0,0 +1,25 @@ +<!-- + Copyright 2013 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + --> + +<resources> + + <style name="Widget.SampleMessage"> + <item name="android:textAppearance">?android:textAppearanceLarge</item> + <item name="android:lineSpacingMultiplier">1.2</item> + <item name="android:shadowDy">-6.5</item> + </style> + +</resources> diff --git a/templates/base/_MODULE_/src/template/res/values/base-strings.xml.ftl b/templates/base/_MODULE_/src/template/res/values/base-strings.xml.ftl new file mode 100755 index 00000000..002e3297 --- /dev/null +++ b/templates/base/_MODULE_/src/template/res/values/base-strings.xml.ftl @@ -0,0 +1,24 @@ +<#ftl> +<#-- + Copyright 2013 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<resources> + <string name="app_name">${sample.name}</string> + <string name="intro_message"> + <![CDATA[ + ${sample.strings.intro} + ]]> + </string> +</resources> diff --git a/templates/base/_MODULE_/src/template/res/values/template-dimens.xml b/templates/base/_MODULE_/src/template/res/values/template-dimens.xml new file mode 100644 index 00000000..39e710b5 --- /dev/null +++ b/templates/base/_MODULE_/src/template/res/values/template-dimens.xml @@ -0,0 +1,32 @@ +<!-- + Copyright 2013 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + --> + +<resources> + + <!-- Define standard dimensions to comply with Holo-style grids and rhythm. --> + + <dimen name="margin_tiny">4dp</dimen> + <dimen name="margin_small">8dp</dimen> + <dimen name="margin_medium">16dp</dimen> + <dimen name="margin_large">32dp</dimen> + <dimen name="margin_huge">64dp</dimen> + + <!-- Semantic definitions --> + + <dimen name="horizontal_page_margin">@dimen/margin_medium</dimen> + <dimen name="vertical_page_margin">@dimen/margin_medium</dimen> + +</resources> diff --git a/templates/base/_MODULE_/src/template/res/values/template-styles.xml b/templates/base/_MODULE_/src/template/res/values/template-styles.xml new file mode 100644 index 00000000..404623e3 --- /dev/null +++ b/templates/base/_MODULE_/src/template/res/values/template-styles.xml @@ -0,0 +1,42 @@ +<!-- + Copyright 2013 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + --> + +<resources> + + <!-- Activity themes --> + + <style name="Theme.Base" parent="android:Theme.Holo.Light" /> + + <style name="Theme.Sample" parent="Theme.Base" /> + + <style name="AppTheme" parent="Theme.Sample" /> + <!-- Widget styling --> + + <style name="Widget" /> + + <style name="Widget.SampleMessage"> + <item name="android:textAppearance">?android:textAppearanceMedium</item> + <item name="android:lineSpacingMultiplier">1.1</item> + </style> + + <style name="Widget.SampleMessageTile"> + <item name="android:background">@drawable/tile</item> + <item name="android:shadowColor">#7F000000</item> + <item name="android:shadowDy">-3.5</item> + <item name="android:shadowRadius">2</item> + </style> + +</resources> diff --git a/templates/base/_index.jd.ftl b/templates/base/_index.jd.ftl new file mode 100644 index 00000000..c25f998e --- /dev/null +++ b/templates/base/_index.jd.ftl @@ -0,0 +1,6 @@ +<#ftl> +page.tags=<#list sample.tag as tag>"${tag}",</#list>"${sample.name}" +sample.group=${sample.group} +@jd:body + +<p>${sample.strings.intro}</p> diff --git a/templates/create/_MODULE_/build.gradle.ftl b/templates/create/_MODULE_/build.gradle.ftl new file mode 100644 index 00000000..e81142b6 --- /dev/null +++ b/templates/create/_MODULE_/build.gradle.ftl @@ -0,0 +1,57 @@ +<#ftl> +<#-- + Copyright 2013 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> + +<#-- This build script is a bootstrapper for the "real" android build script that +is contained in templates/base. It includes only what's necessary for Android Studio +to recognize this as an Android project and start the template engine. --> + +buildscript { + repositories { + mavenCentral() + } + + dependencies { + classpath 'com.android.tools.build:gradle:0.6.+' + } +} + +apply plugin: 'android' + + +android { + <#-- Note that target SDK is hardcoded in this template. We expect all samples + to always use the most current SDK as their target. --> + compileSdkVersion ${compile_sdk} + buildToolsVersion ${build_tools_version} +} + +task preflight (dependsOn: parent.preflight) { + project.afterEvaluate { + <#noparse> + // Inject a preflight task into each variant so we have a place to hook tasks + // that need to run before any of the android build tasks. + // + android.applicationVariants.each { variant -> + println variant.name + tasks.getByPath("prepare${variant.name.capitalize()}Dependencies").dependsOn preflight + } + </#noparse> + } +} + + + diff --git a/templates/create/_MODULE_/gitignore b/templates/create/_MODULE_/gitignore new file mode 100644 index 00000000..6eb878d4 --- /dev/null +++ b/templates/create/_MODULE_/gitignore @@ -0,0 +1,16 @@ +# Copyright 2013 The Android Open Source Project +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +src/template/ +src/common/ +build.gradle diff --git a/templates/create/_MODULE_/proguard-project.txt b/templates/create/_MODULE_/proguard-project.txt new file mode 100644 index 00000000..0d8f171d --- /dev/null +++ b/templates/create/_MODULE_/proguard-project.txt @@ -0,0 +1,20 @@ + To enable ProGuard in your project, edit project.properties +# to define the proguard.config property as described in that file. +# +# Add project specific ProGuard rules here. +# By default, the flags in this file are appended to flags specified +# in ${sdk.dir}/tools/proguard/proguard-android.txt +# You can edit the include path and order by changing the ProGuard +# include property in project.properties. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# Add any project specific keep options here: + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} diff --git a/templates/create/_MODULE_/src/main/AndroidManifest.xml.ftl b/templates/create/_MODULE_/src/main/AndroidManifest.xml.ftl new file mode 100644 index 00000000..9ef0fa2d --- /dev/null +++ b/templates/create/_MODULE_/src/main/AndroidManifest.xml.ftl @@ -0,0 +1,39 @@ +<#ftl> +<#-- + Copyright 2013 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<manifest xmlns:android="http://schemas.android.com/apk/res/android" + package="${sample.package}" + android:versionCode="1" + android:versionName="1.0"> + + <uses-sdk android:minSdkVersion="${sample.minSdk}" android:targetSdkVersion="17" /> + + <application android:allowBackup="true" + android:label="@string/app_name" + android:icon="@drawable/ic_launcher" + android:theme="@style/AppTheme"> + + <activity android:name=".MainActivity" + android:label="@string/app_name"> + <intent-filter> + <action android:name="android.intent.action.MAIN" /> + <category android:name="android.intent.category.LAUNCHER" /> + </intent-filter> + </activity> + </application> + + +</manifest> diff --git a/templates/create/_MODULE_/src/main/res/drawable-hdpi/ic_launcher.png b/templates/create/_MODULE_/src/main/res/drawable-hdpi/ic_launcher.png Binary files differnew file mode 100644 index 00000000..b1efaf4b --- /dev/null +++ b/templates/create/_MODULE_/src/main/res/drawable-hdpi/ic_launcher.png diff --git a/templates/create/_MODULE_/src/main/res/drawable-mdpi/ic_launcher.png b/templates/create/_MODULE_/src/main/res/drawable-mdpi/ic_launcher.png Binary files differnew file mode 100644 index 00000000..f5f9244f --- /dev/null +++ b/templates/create/_MODULE_/src/main/res/drawable-mdpi/ic_launcher.png diff --git a/templates/create/_MODULE_/src/main/res/drawable-xhdpi/ic_launcher.png b/templates/create/_MODULE_/src/main/res/drawable-xhdpi/ic_launcher.png Binary files differnew file mode 100644 index 00000000..5d07b3f0 --- /dev/null +++ b/templates/create/_MODULE_/src/main/res/drawable-xhdpi/ic_launcher.png diff --git a/templates/create/_MODULE_/src/main/res/drawable-xxhdpi/ic_launcher.png b/templates/create/_MODULE_/src/main/res/drawable-xxhdpi/ic_launcher.png Binary files differnew file mode 100644 index 00000000..6ef21e1f --- /dev/null +++ b/templates/create/_MODULE_/src/main/res/drawable-xxhdpi/ic_launcher.png diff --git a/templates/create/_MODULE_/tests/AndroidManifest.xml.ftl b/templates/create/_MODULE_/tests/AndroidManifest.xml.ftl new file mode 100644 index 00000000..87b785fb --- /dev/null +++ b/templates/create/_MODULE_/tests/AndroidManifest.xml.ftl @@ -0,0 +1,42 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Copyright (C) 2013 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + --> +<!-- package name must be unique so suffix with "tests" so package loader doesn't ignore us --> +<manifest xmlns:android="http://schemas.android.com/apk/res/android" + package="${sample.package}.tests" + android:versionCode="1" + android:versionName="1.0"> + + <uses-sdk + android:minSdkVersion="18" + android:targetSdkVersion="19" /> + + <!-- We add an application tag here just so that we can indicate that + this package needs to link against the android.test library, + which is needed when building test cases. --> + <application> + <uses-library android:name="android.test.runner" /> + </application> + + <!-- + Specifies the instrumentation test runner used to run the tests. + --> + <instrumentation + android:name="android.test.InstrumentationTestRunner" + android:targetPackage="${sample.package}" + android:label="Tests for ${sample.package}" /> + +</manifest>
\ No newline at end of file diff --git a/templates/create/_MODULE_/tests/src/_PACKAGE_/tests/SampleTests.java.ftl b/templates/create/_MODULE_/tests/src/_PACKAGE_/tests/SampleTests.java.ftl new file mode 100644 index 00000000..87ee8809 --- /dev/null +++ b/templates/create/_MODULE_/tests/src/_PACKAGE_/tests/SampleTests.java.ftl @@ -0,0 +1,61 @@ +/* +* Copyright (C) 2013 The Android Open Source Project +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ +package ${sample.package}.tests; + +import ${sample.package}.*; + +import android.test.ActivityInstrumentationTestCase2; + +/** +* Tests for ${sample.name} sample. +*/ +public class SampleTests extends ActivityInstrumentationTestCase2<MainActivity> { + + private MainActivity mTestActivity; + private ${sample.name?cap_first}Fragment mTestFragment; + + public SampleTests() { + super(MainActivity.class); + } + + @Override + protected void setUp() throws Exception { + super.setUp(); + + // Starts the activity under test using the default Intent with: + // action = {@link Intent#ACTION_MAIN} + // flags = {@link Intent#FLAG_ACTIVITY_NEW_TASK} + // All other fields are null or empty. + mTestActivity = getActivity(); + mTestFragment = (${sample.name?cap_first}Fragment) + mTestActivity.getSupportFragmentManager().getFragments().get(1); + } + + /** + * Test if the test fixture has been set up correctly. + */ + public void testPreconditions() { + //Try to add a message to add context to your assertions. These messages will be shown if + //a tests fails and make it easy to understand why a test failed + assertNotNull("mTestActivity is null", mTestActivity); + assertNotNull("mTestFragment is null", mTestFragment); + } + + /** + * Add more tests below. + */ + +}
\ No newline at end of file diff --git a/templates/create/build.gradle.ftl b/templates/create/build.gradle.ftl new file mode 100644 index 00000000..b6bce18f --- /dev/null +++ b/templates/create/build.gradle.ftl @@ -0,0 +1,27 @@ +<#ftl> +<#-- + Copyright 2013 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> + +// BEGIN_EXCLUDE +import com.example.android.samples.build.SampleGenPlugin +apply plugin: SampleGenPlugin + +samplegen { + pathToBuild "${meta.build}" + pathToSamplesCommon "${meta.common}" +} +apply from: "${meta.build}/build.gradle" +// END_EXCLUDE diff --git a/templates/create/buildSrc/build.gradle.ftl b/templates/create/buildSrc/build.gradle.ftl new file mode 100644 index 00000000..34c59afd --- /dev/null +++ b/templates/create/buildSrc/build.gradle.ftl @@ -0,0 +1,31 @@ +<#ftl> +<#-- + Copyright 2013 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +repositories { + mavenCentral() +} +dependencies { + compile 'org.freemarker:freemarker:2.3.20' +} + +sourceSets { + main { + groovy { + srcDir new File(rootDir, "../${meta.build}/buildSrc/src/main/groovy") + } + } +} + diff --git a/templates/create/gradle/wrapper/gradle-wrapper.jar b/templates/create/gradle/wrapper/gradle-wrapper.jar Binary files differnew file mode 100644 index 00000000..8c0fb64a --- /dev/null +++ b/templates/create/gradle/wrapper/gradle-wrapper.jar diff --git a/templates/create/gradle/wrapper/gradle-wrapper.properties b/templates/create/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 00000000..861eddc3 --- /dev/null +++ b/templates/create/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,6 @@ +#Wed Apr 10 15:27:10 PDT 2013 +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists +distributionUrl=http\://services.gradle.org/distributions/gradle-1.8-bin.zip diff --git a/templates/create/gradlew b/templates/create/gradlew new file mode 100755 index 00000000..91a7e269 --- /dev/null +++ b/templates/create/gradlew @@ -0,0 +1,164 @@ +#!/usr/bin/env bash + +############################################################################## +## +## Gradle start up script for UN*X +## +############################################################################## + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS="" + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD="maximum" + +warn ( ) { + echo "$*" +} + +die ( ) { + echo + echo "$*" + echo + exit 1 +} + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MINGW* ) + msys=true + ;; +esac + +# For Cygwin, ensure paths are in UNIX format before anything is touched. +if $cygwin ; then + [ -n "$JAVA_HOME" ] && JAVA_HOME=`cygpath --unix "$JAVA_HOME"` +fi + +# Attempt to set APP_HOME +# Resolve links: $0 may be a link +PRG="$0" +# Need this for relative symlinks. +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >&- +APP_HOME="`pwd -P`" +cd "$SAVED" >&- + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin, switch paths to Windows format before running java +if $cygwin ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=$((i+1)) + done + case $i in + (0) set -- ;; + (1) set -- "$args0" ;; + (2) set -- "$args0" "$args1" ;; + (3) set -- "$args0" "$args1" "$args2" ;; + (4) set -- "$args0" "$args1" "$args2" "$args3" ;; + (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules +function splitJvmOpts() { + JVM_OPTS=("$@") +} +eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS +JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME" + +exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@" diff --git a/templates/create/gradlew.bat b/templates/create/gradlew.bat new file mode 100644 index 00000000..aec99730 --- /dev/null +++ b/templates/create/gradlew.bat @@ -0,0 +1,90 @@ +@if "%DEBUG%" == "" @echo off
+@rem ##########################################################################
+@rem
+@rem Gradle startup script for Windows
+@rem
+@rem ##########################################################################
+
+@rem Set local scope for the variables with windows NT shell
+if "%OS%"=="Windows_NT" setlocal
+
+@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+set DEFAULT_JVM_OPTS=
+
+set DIRNAME=%~dp0
+if "%DIRNAME%" == "" set DIRNAME=.
+set APP_BASE_NAME=%~n0
+set APP_HOME=%DIRNAME%
+
+@rem Find java.exe
+if defined JAVA_HOME goto findJavaFromJavaHome
+
+set JAVA_EXE=java.exe
+%JAVA_EXE% -version >NUL 2>&1
+if "%ERRORLEVEL%" == "0" goto init
+
+echo.
+echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:findJavaFromJavaHome
+set JAVA_HOME=%JAVA_HOME:"=%
+set JAVA_EXE=%JAVA_HOME%/bin/java.exe
+
+if exist "%JAVA_EXE%" goto init
+
+echo.
+echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:init
+@rem Get command-line arguments, handling Windowz variants
+
+if not "%OS%" == "Windows_NT" goto win9xME_args
+if "%@eval[2+2]" == "4" goto 4NT_args
+
+:win9xME_args
+@rem Slurp the command line arguments.
+set CMD_LINE_ARGS=
+set _SKIP=2
+
+:win9xME_args_slurp
+if "x%~1" == "x" goto execute
+
+set CMD_LINE_ARGS=%*
+goto execute
+
+:4NT_args
+@rem Get arguments from the 4NT Shell from JP Software
+set CMD_LINE_ARGS=%$
+
+:execute
+@rem Setup the command line
+
+set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
+
+@rem Execute Gradle
+"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
+
+:end
+@rem End local scope for the variables with windows NT shell
+if "%ERRORLEVEL%"=="0" goto mainEnd
+
+:fail
+rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
+rem the _cmd.exe /c_ return code!
+if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
+exit /b 1
+
+:mainEnd
+if "%OS%"=="Windows_NT" endlocal
+
+:omega
diff --git a/templates/create/settings.gradle.ftl b/templates/create/settings.gradle.ftl new file mode 100644 index 00000000..0305fd19 --- /dev/null +++ b/templates/create/settings.gradle.ftl @@ -0,0 +1,17 @@ +<#ftl> +<#-- + Copyright 2013 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +include '${meta.module}' diff --git a/templates/create/template-params.xml.ftl b/templates/create/template-params.xml.ftl new file mode 100644 index 00000000..dd729a76 --- /dev/null +++ b/templates/create/template-params.xml.ftl @@ -0,0 +1,40 @@ +<#ftl> +<#-- + Copyright 2013 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<sample> + <name>${sample.name}</name> + <group>NoGroup</group> + <package>${sample.package}</package> + + + + <!-- change minSdk if needed--> + <minSdk>${sample.minSdk}</minSdk> + + + <strings> + <intro> + <![CDATA[ + Introductory text that explains what the sample is intended to demonstrate. Edit + in template-params.xml. + ]]> + </intro> + </strings> + + <template src="base"/> + <common src="logger"/> + +</sample> diff --git a/templates/include/c-style-copyright.ftl b/templates/include/c-style-copyright.ftl new file mode 100644 index 00000000..af109465 --- /dev/null +++ b/templates/include/c-style-copyright.ftl @@ -0,0 +1,15 @@ +/* +* Copyright 2013 The Android Open Source Project +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ diff --git a/templates/include/common.ftl b/templates/include/common.ftl new file mode 100644 index 00000000..59f64107 --- /dev/null +++ b/templates/include/common.ftl @@ -0,0 +1,47 @@ +<#ftl> +<#-- + Copyright 2013 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<#-- Add the appropriate copyright header --> +<#if meta.outputFile?ends_with("java")> + <#include "c-style-copyright.ftl"> +<#elseif meta.outputFile?ends_with("xml")> + <#include "xml-style-copyright.ftl"> +</#if> + +<#-- Set the compile SDK version. This is more complicated than it should be, because + the version can be either a number or a string (e.g. KeyLimePie) so we need to test + both to see if the variable is empty. Note that to freemarker, all values from + template-params.xml are Strings, even those that are human-readable as ints. + + Also, there's no way to check if it's a number or not without spamming output with try/catch + stacktraces, so we can't silently wrap a string in quotes and leave a number alone. +--> +<#if (samples.compileSdkVersion)?? && (sample.compileSdkVersion)?is_string> + <#if (sample.compileSdkVersion?contains("android")) && !(sample.compileSdkVersion?starts_with("\"")) + && !(sample.compileSdkVersion?ends_with("\""))> + <#assign compile_sdk = "\"${sample.compileSdkVersion}\""/> + <#else> + <#assign compile_sdk = sample.compileSdkVersion/> + </#if> +<#elseif (sample.compileSdkVersion)?has_content> + <#assign compile_sdk = sample.compileSdkVersion/> +<#else> + <#assign compile_sdk = 19/> +</#if> + + +<#-- Set the global build tools version --> +<#assign build_tools_version='"18.1"'/> diff --git a/templates/include/ftl-style-copyright.ftl b/templates/include/ftl-style-copyright.ftl new file mode 100644 index 00000000..9b8acece --- /dev/null +++ b/templates/include/ftl-style-copyright.ftl @@ -0,0 +1,15 @@ +<#-- + Copyright 2013 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> diff --git a/templates/include/ignoredir.fmpp b/templates/include/ignoredir.fmpp new file mode 100644 index 00000000..e69de29b --- /dev/null +++ b/templates/include/ignoredir.fmpp diff --git a/templates/include/xml-style-copyright.ftl b/templates/include/xml-style-copyright.ftl new file mode 100644 index 00000000..f961eb74 --- /dev/null +++ b/templates/include/xml-style-copyright.ftl @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Copyright 2013 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> |