Merge branch 'klp-dev' into 'klp-docs'
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..3bb19ff
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1 @@
+.gradle/
diff --git a/build.gradle b/build.gradle
new file mode 100644
index 0000000..e1dc109
--- /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 0000000..2edbb2b
--- /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 0000000..7ac6c8f
--- /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 0000000..9a42d61
--- /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 0000000..faa2973
--- /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 0000000..f1420cd
--- /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 0000000..4faa95b
--- /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 0000000..a7634b0
--- /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 0000000..ba5f04a
--- /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 0000000..91a7e26
--- /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 0000000..aec9973
--- /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 0000000..0893a22
--- /dev/null
+++ b/lib/assetstudio.jar
Binary files differ
diff --git a/lib/buildSrc.jar b/lib/buildSrc.jar
new file mode 100644
index 0000000..9c56bc1
--- /dev/null
+++ b/lib/buildSrc.jar
Binary files differ
diff --git a/sample-create b/sample-create
new file mode 100755
index 0000000..500e468
--- /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 0000000..af10946
--- /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 0000000..08745cd
--- /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 0000000..a3c8341
--- /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 0000000..1358628
--- /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 0000000..88cdb80
--- /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 0000000..38987ee
--- /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 0000000..22074a2
--- /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 0000000..1a21a8a
--- /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 0000000..cafe531
--- /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 0000000..4ac7cdb
--- /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 0000000..0d6e684
--- /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 0000000..bc5a575
--- /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 0000000..22074a2
--- /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 0000000..03d1974
--- /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 0000000..d3f82ff
--- /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 0000000..0cacd46
--- /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 0000000..c4fe05a
--- /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 0000000..bc5a575
--- /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 0000000..2c3515d
--- /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 0000000..22074a2
--- /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 0000000..03d1974
--- /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 0000000..b7af257
--- /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 0000000..d3f82ff
--- /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 0000000..9616c58
--- /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 0000000..86365e3
--- /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 0000000..8106677
--- /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 0000000..1358628
--- /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 0000000..be1aa49
--- /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 0000000..22074a2
--- /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 0000000..03d1974
--- /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 0000000..002e329
--- /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 0000000..39e710b
--- /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 0000000..404623e
--- /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 0000000..c25f998
--- /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 0000000..e81142b
--- /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 0000000..6eb878d
--- /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 0000000..0d8f171
--- /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 0000000..9ef0fa2
--- /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 0000000..b1efaf4
--- /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 0000000..f5f9244
--- /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 0000000..5d07b3f
--- /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 0000000..6ef21e1
--- /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 0000000..87b785f
--- /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 0000000..87ee880
--- /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 0000000..b6bce18
--- /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 0000000..34c59af
--- /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 0000000..8c0fb64
--- /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 0000000..861eddc
--- /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 0000000..91a7e26
--- /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 0000000..aec9973
--- /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 0000000..0305fd1
--- /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 0000000..dd729a7
--- /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 0000000..af10946
--- /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 0000000..59f6410
--- /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 0000000..9b8acec
--- /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 0000000..e69de29
--- /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 0000000..f961eb7
--- /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.
+-->