summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTrevor Johns <trevorjohns@google.com>2013-11-06 14:38:47 -0800
committerTrevor Johns <trevorjohns@google.com>2013-11-06 14:38:47 -0800
commit737ccb75a8522baa4ae36f3b855dd8911d2ea954 (patch)
tree4cdd61893d24b9f6244ff0d94c8e883f93ec20d2
parent2b1169e2095f5e30f118abd146a62007697cecc3 (diff)
parentf49bfc3d06d0cc0eac0ce1a5620ef5bc8e38f064 (diff)
downloadbuild-737ccb75a8522baa4ae36f3b855dd8911d2ea954.tar.gz
Merge branch 'klp-dev' into 'klp-docs'idea133-weekly-releaseidea133
-rw-r--r--.gitignore1
-rw-r--r--build.gradle230
-rw-r--r--build.iml13
-rw-r--r--buildSrc/build.gradle11
-rw-r--r--buildSrc/src/main/groovy/com/example/android/samples/build/ApplyTemplates.groovy177
-rw-r--r--buildSrc/src/main/groovy/com/example/android/samples/build/SampleGenPlugin.groovy99
-rw-r--r--buildSrc/src/main/groovy/com/example/android/samples/build/SampleGenProperties.groovy321
-rw-r--r--buildSrc/src/main/main.iml12
-rw-r--r--gradle/wrapper/gradle-wrapper.jarbin0 -> 49875 bytes
-rw-r--r--gradle/wrapper/gradle-wrapper.properties18
-rwxr-xr-xgradlew164
-rw-r--r--gradlew.bat90
-rw-r--r--lib/assetstudio.jarbin0 -> 737682 bytes
-rw-r--r--lib/buildSrc.jarbin0 -> 41873 bytes
-rwxr-xr-xsample-create43
-rw-r--r--settings.gradle15
-rw-r--r--templates/ActivityCards/ActivityCardsCommon.ftli17
-rwxr-xr-xtemplates/ActivityCards/_MODULE_/src/template/java/_PACKAGE_/MainActivity.java.ftl123
-rw-r--r--templates/ActivityCards/_MODULE_/src/template/res/drawable-xhdpi/sample_dashboard_item_background.9.pngbin0 -> 196 bytes
-rwxr-xr-xtemplates/ActivityCards/_MODULE_/src/template/res/layout/activity_main.xml41
-rw-r--r--templates/ActivityCards/_MODULE_/src/template/res/layout/sample_dashboard_item.xml32
-rw-r--r--templates/ActivityCards/_MODULE_/src/template/res/values-sw600dp/template-dimens.xml24
-rw-r--r--templates/ActivityCards/_MODULE_/src/template/res/values/activitycards-strings.xml.ftl25
-rw-r--r--templates/ActivityCards/_MODULE_/src/template/res/values/template-styles.xml71
-rw-r--r--templates/SimpleView/_MODULE_/README-simpleview.txt29
-rw-r--r--templates/SimpleView/_MODULE_/src/template/java/_PACKAGE_/MainActivity.java.ftl76
-rw-r--r--templates/SimpleView/_MODULE_/src/template/res/layout/activity_main.xml38
-rw-r--r--templates/SimpleView/_MODULE_/src/template/res/values-sw600dp/template-dimens.xml24
-rw-r--r--templates/SimpleView/_MODULE_/src/template/res/values-sw600dp/template-styles.xml25
-rw-r--r--templates/SimpleView/_MODULE_/src/template/res/values/template-styles.xml51
-rw-r--r--templates/SingleView/_MODULE_/README-singleview.txt47
-rwxr-xr-xtemplates/SingleView/_MODULE_/src/template/java/_PACKAGE_/MainActivity.java.ftl78
-rwxr-xr-xtemplates/SingleView/_MODULE_/src/template/res/layout/activity_main.xml38
-rw-r--r--templates/SingleView/_MODULE_/src/template/res/menu/main.xml21
-rw-r--r--templates/SingleView/_MODULE_/src/template/res/values-sw600dp/template-dimens.xml24
-rw-r--r--templates/SingleView/_MODULE_/src/template/res/values-sw600dp/template-styles.xml25
-rwxr-xr-xtemplates/SingleView/_MODULE_/src/template/res/values/strings.xml.ftl23
-rw-r--r--templates/SingleView/_MODULE_/src/template/res/values/template-styles.xml51
-rw-r--r--templates/base/README.txt18
-rw-r--r--templates/base/_MODULE_/build.gradle.ftl86
-rw-r--r--templates/base/_MODULE_/src/template/project.properties.ftl18
-rw-r--r--templates/base/_MODULE_/src/template/res/drawable-hdpi/tile.9.pngbin0 -> 196 bytes
-rwxr-xr-xtemplates/base/_MODULE_/src/template/res/layout/activity_main.xml36
-rw-r--r--templates/base/_MODULE_/src/template/res/values-sw600dp/template-dimens.xml24
-rw-r--r--templates/base/_MODULE_/src/template/res/values-sw600dp/template-styles.xml25
-rwxr-xr-xtemplates/base/_MODULE_/src/template/res/values/base-strings.xml.ftl24
-rw-r--r--templates/base/_MODULE_/src/template/res/values/template-dimens.xml32
-rw-r--r--templates/base/_MODULE_/src/template/res/values/template-styles.xml42
-rw-r--r--templates/base/_index.jd.ftl6
-rw-r--r--templates/create/_MODULE_/build.gradle.ftl57
-rw-r--r--templates/create/_MODULE_/gitignore16
-rw-r--r--templates/create/_MODULE_/proguard-project.txt20
-rw-r--r--templates/create/_MODULE_/src/main/AndroidManifest.xml.ftl39
-rw-r--r--templates/create/_MODULE_/src/main/res/drawable-hdpi/ic_launcher.pngbin0 -> 4199 bytes
-rw-r--r--templates/create/_MODULE_/src/main/res/drawable-mdpi/ic_launcher.pngbin0 -> 2535 bytes
-rw-r--r--templates/create/_MODULE_/src/main/res/drawable-xhdpi/ic_launcher.pngbin0 -> 6022 bytes
-rw-r--r--templates/create/_MODULE_/src/main/res/drawable-xxhdpi/ic_launcher.pngbin0 -> 11040 bytes
-rw-r--r--templates/create/_MODULE_/tests/AndroidManifest.xml.ftl42
-rw-r--r--templates/create/_MODULE_/tests/src/_PACKAGE_/tests/SampleTests.java.ftl61
-rw-r--r--templates/create/build.gradle.ftl27
-rw-r--r--templates/create/buildSrc/build.gradle.ftl31
-rw-r--r--templates/create/gradle/wrapper/gradle-wrapper.jarbin0 -> 49896 bytes
-rw-r--r--templates/create/gradle/wrapper/gradle-wrapper.properties6
-rwxr-xr-xtemplates/create/gradlew164
-rw-r--r--templates/create/gradlew.bat90
-rw-r--r--templates/create/settings.gradle.ftl17
-rw-r--r--templates/create/template-params.xml.ftl40
-rw-r--r--templates/include/c-style-copyright.ftl15
-rw-r--r--templates/include/common.ftl47
-rw-r--r--templates/include/ftl-style-copyright.ftl15
-rw-r--r--templates/include/ignoredir.fmpp0
-rw-r--r--templates/include/xml-style-copyright.ftl16
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
new file mode 100644
index 00000000..a7634b07
--- /dev/null
+++ b/gradle/wrapper/gradle-wrapper.jar
Binary files differ
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
new file mode 100644
index 00000000..0893a22c
--- /dev/null
+++ b/lib/assetstudio.jar
Binary files differ
diff --git a/lib/buildSrc.jar b/lib/buildSrc.jar
new file mode 100644
index 00000000..9c56bc15
--- /dev/null
+++ b/lib/buildSrc.jar
Binary files differ
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
new file mode 100644
index 00000000..13586288
--- /dev/null
+++ b/templates/ActivityCards/_MODULE_/src/template/res/drawable-xhdpi/sample_dashboard_item_background.9.png
Binary files differ
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
new file mode 100644
index 00000000..13586288
--- /dev/null
+++ b/templates/base/_MODULE_/src/template/res/drawable-hdpi/tile.9.png
Binary files differ
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
new file mode 100644
index 00000000..b1efaf4b
--- /dev/null
+++ b/templates/create/_MODULE_/src/main/res/drawable-hdpi/ic_launcher.png
Binary files differ
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
new file mode 100644
index 00000000..f5f9244f
--- /dev/null
+++ b/templates/create/_MODULE_/src/main/res/drawable-mdpi/ic_launcher.png
Binary files differ
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
new file mode 100644
index 00000000..5d07b3f0
--- /dev/null
+++ b/templates/create/_MODULE_/src/main/res/drawable-xhdpi/ic_launcher.png
Binary files differ
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
new file mode 100644
index 00000000..6ef21e1f
--- /dev/null
+++ b/templates/create/_MODULE_/src/main/res/drawable-xxhdpi/ic_launcher.png
Binary files differ
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
new file mode 100644
index 00000000..8c0fb64a
--- /dev/null
+++ b/templates/create/gradle/wrapper/gradle-wrapper.jar
Binary files differ
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.
+-->