Sample template generator--work in progress.

Placed template outputs in src/template instead of src/main
Placed common files into src/common
Added src/common and src/template to .gitignore
Updated to Android tools .0.5.+

Fixed <common> tag handling
In this patch set: the promised refactoring. All templating logic is now in
separate plugin classes and all of the spaghetti and duplicate naming has been
eliminated. No additional functionality or templates, sorry. However, it should
be quite trivial to add extra templates.

Instructions:
1. Run developers/samples/android/common/build/sample-create <path to new sample>
2. Load new sample in Android Studio, let gradle do its thing
3. Edit SampleManifest.xml -- you at least need to add another <template> tag for the specific template you want.
4. Rebuild and add classes as necessary to fix compile errors.

To add your own template(s): Put code and/or Freemarker script into
a subdirectory of developers/samples/android/common/build/templates.

Change-Id: I43abbd337957b2eae5ffb844e411a5d3c91d6f44
diff --git a/.gitignore b/.gitignore
index 3d03f71..552351b 100644
--- a/.gitignore
+++ b/.gitignore
@@ -19,10 +19,8 @@
 
 
 # Build stuff (auto-generated by android update project ...)
-build.xml
 ant.properties
 local.properties
-project.properties
 
 # Eclipse project files
 .classpath
@@ -35,13 +33,7 @@
 *.ipr
 *.iws
 
-#gitignore file
-.gitignore
-
 ##Gradle-based build
 .gradle
 build/
-gradle/
-gradlew
-gradlew.bat
-settings.gradle
\ No newline at end of file
+
diff --git a/common/build/build.gradle b/common/build/build.gradle
new file mode 100644
index 0000000..45ff0a1
--- /dev/null
+++ b/common/build/build.gradle
@@ -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.
+*/
+
+// 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.6'
+}
\ No newline at end of file
diff --git a/common/build/build.iml b/common/build/build.iml
new file mode 100644
index 0000000..2edbb2b
--- /dev/null
+++ b/common/build/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/common/build/buildSrc/build.gradle b/common/build/buildSrc/build.gradle
new file mode 100644
index 0000000..7ac6c8f
--- /dev/null
+++ b/common/build/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/common/build/buildSrc/src/main/groovy/com/example/android/samples/build/ApplyTemplates.groovy b/common/build/buildSrc/src/main/groovy/com/example/android/samples/build/ApplyTemplates.groovy
new file mode 100644
index 0000000..8864ce2
--- /dev/null
+++ b/common/build/buildSrc/src/main/groovy/com/example/android/samples/build/ApplyTemplates.groovy
@@ -0,0 +1,162 @@
+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/common/build/buildSrc/src/main/groovy/com/example/android/samples/build/SampleGenPlugin.groovy b/common/build/buildSrc/src/main/groovy/com/example/android/samples/build/SampleGenPlugin.groovy
new file mode 100644
index 0000000..64aea54
--- /dev/null
+++ b/common/build/buildSrc/src/main/groovy/com/example/android/samples/build/SampleGenPlugin.groovy
@@ -0,0 +1,69 @@
+package com.example.android.samples.build
+
+import org.gradle.api.Plugin
+import org.gradle.api.Project
+import org.gradle.api.tasks.GradleBuild
+/**
+ * Created by ilewis on 7/3/13.
+ */
+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
+        project.afterEvaluate({
+            SampleGenProperties samplegen = project.samplegen
+            project.task('create') {
+                if (project.gradle.startParameter.taskNames.contains('create')) {
+                    samplegen.getCreationProperties()
+                }
+
+            }
+
+            project.task('refresh') {
+                samplegen.getRefreshProperties()
+            }
+
+            createTask(project, 'processTemplates', samplegen, samplegen.templates(), samplegen.targetProjectDir)
+            createTask(project, 'processCommon', samplegen, samplegen.common(), samplegen.targetCommonSourceDir())
+
+
+            project.task([type: GradleBuild], 'bootstrap', {
+                buildFile = "${samplegen.targetProjectDir}/build.gradle"
+                dir = samplegen.targetProjectDir
+                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."}
+        })
+    }
+
+
+}
\ No newline at end of file
diff --git a/common/build/buildSrc/src/main/groovy/com/example/android/samples/build/SampleGenProperties.groovy b/common/build/buildSrc/src/main/groovy/com/example/android/samples/build/SampleGenProperties.groovy
new file mode 100644
index 0000000..86660cb
--- /dev/null
+++ b/common/build/buildSrc/src/main/groovy/com/example/android/samples/build/SampleGenProperties.groovy
@@ -0,0 +1,256 @@
+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 targetProjectDir
+
+    /**
+     * Relative path to samples/common directory
+     */
+    def pathToSamplesCommon
+
+    /**
+     * Java package name for the root package of this sample.
+     */
+     String targetSamplePackage
+
+
+    String targetCommonSourceDir() {
+        return "${targetProjectDir}/${targetSampleModule()}/src/common/java/com/example/android/common"
+    }
+
+    /**
+     * The name of this sample (and also of the corresponding .iml file)
+     */
+    String targetSampleName() {
+        return project.file(targetProjectDir).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 "${targetProjectDir}/template-params.xml"
+    }
+
+    /**
+     * Returns the sample's fully qualified Java package as an OS dependent
+     * path fragment
+     */
+    String targetSamplePackageAsPath() {
+        return targetSamplePackage.replaceAll(/\./, File.separator)
+    }
+
+    /**
+     * Returns the path to the common/build/templates directory
+     */
+    String templatesRoot() {
+        return "${pathToSamplesCommon}/build/templates"
+    }
+
+
+    /**
+     * Returns the path to common/src/java
+     */
+    String commonSourceRoot() {
+        return "${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_', targetSamplePackageAsPath())
+
+        // 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: targetProjectDir,
+                module: targetSampleModule(),
+                common: pathToSamplesCommon,
+        ])
+        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.targetProjectDir) {
+            this.targetProjectDir = 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.targetProjectDir) {
+            if (project.hasProperty('out')) {
+                this.targetProjectDir = project.out
+            } else {
+                this.targetProjectDir  = System.console().readLine("\noutput directory [$calledFrom]:")
+                if (this.targetProjectDir.length() <= 0) {
+                    this.targetProjectDir = 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/common/build/buildSrc/src/main/main.iml b/common/build/buildSrc/src/main/main.iml
new file mode 100644
index 0000000..4faa95b
--- /dev/null
+++ b/common/build/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/common/build/gradle/wrapper/gradle-wrapper.jar b/common/build/gradle/wrapper/gradle-wrapper.jar
new file mode 100644
index 0000000..a7634b0
--- /dev/null
+++ b/common/build/gradle/wrapper/gradle-wrapper.jar
Binary files differ
diff --git a/common/build/gradle/wrapper/gradle-wrapper.properties b/common/build/gradle/wrapper/gradle-wrapper.properties
new file mode 100644
index 0000000..adbf9fe
--- /dev/null
+++ b/common/build/gradle/wrapper/gradle-wrapper.properties
@@ -0,0 +1,6 @@
+#Wed Jul 03 16:40:03 PDT 2013
+distributionBase=GRADLE_USER_HOME
+distributionPath=wrapper/dists
+zipStoreBase=GRADLE_USER_HOME
+zipStorePath=wrapper/dists
+distributionUrl=http\://services.gradle.org/distributions/gradle-1.6-bin.zip
diff --git a/common/build/gradlew b/common/build/gradlew
new file mode 100755
index 0000000..91a7e26
--- /dev/null
+++ b/common/build/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/common/build/gradlew.bat b/common/build/gradlew.bat
new file mode 100644
index 0000000..aec9973
--- /dev/null
+++ b/common/build/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/common/build/lib/assetstudio.jar b/common/build/lib/assetstudio.jar
new file mode 100644
index 0000000..0893a22
--- /dev/null
+++ b/common/build/lib/assetstudio.jar
Binary files differ
diff --git a/common/build/lib/buildSrc.jar b/common/build/lib/buildSrc.jar
new file mode 100644
index 0000000..9c56bc1
--- /dev/null
+++ b/common/build/lib/buildSrc.jar
Binary files differ
diff --git a/common/build/sample-create b/common/build/sample-create
new file mode 100755
index 0000000..df642d3
--- /dev/null
+++ b/common/build/sample-create
@@ -0,0 +1,17 @@
+#!/usr/bin/env bash
+CALLED_FROM=$( pwd -P )
+SCRIPTNAME=$(basename "$0")
+SCRIPTPATH=$( cd "$(dirname "$0")" ; pwd -P )
+GRADLE=$SCRIPTPATH/gradlew
+
+SAMPLE_PATH=""
+
+if  [ -n "$1" ]; then
+    SAMPLE_PATH=$CALLED_FROM/$1
+fi
+
+SAMPLES_COMMON=$( cd "$SCRIPTPATH/.." ; pwd -P )
+
+SAMPLES_COMMON=$(perl -e "use File::Spec; print File::Spec->abs2rel(@ARGV)" $SAMPLES_COMMON $SAMPLE_PATH)
+
+$GRADLE -b $SCRIPTPATH/build.gradle --info create -Pout=$SAMPLE_PATH -PcalledFrom=$CALLED_FROM -PpathToSamplesCommon=$SAMPLES_COMMON
diff --git a/common/build/settings.gradle b/common/build/settings.gradle
new file mode 100644
index 0000000..8b13789
--- /dev/null
+++ b/common/build/settings.gradle
@@ -0,0 +1 @@
+
diff --git a/common/build/templates/ActivityCards/ActivityCardsCommon.ftli b/common/build/templates/ActivityCards/ActivityCardsCommon.ftli
new file mode 100644
index 0000000..7ed2d5d
--- /dev/null
+++ b/common/build/templates/ActivityCards/ActivityCardsCommon.ftli
@@ -0,0 +1 @@
+<#macro make_activity_res activity type>${(activity.class!"activity_class")?lower_case}_${type}</#macro>
\ No newline at end of file
diff --git a/common/build/templates/ActivityCards/_MODULE_/src/template/java/_PACKAGE_/MainActivity.java.ftl b/common/build/templates/ActivityCards/_MODULE_/src/template/java/_PACKAGE_/MainActivity.java.ftl
new file mode 100755
index 0000000..25bc836
--- /dev/null
+++ b/common/build/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/common/build/templates/ActivityCards/_MODULE_/src/template/res/drawable-hdpi/ic_launcher.png b/common/build/templates/ActivityCards/_MODULE_/src/template/res/drawable-hdpi/ic_launcher.png
new file mode 100644
index 0000000..b1efaf4
--- /dev/null
+++ b/common/build/templates/ActivityCards/_MODULE_/src/template/res/drawable-hdpi/ic_launcher.png
Binary files differ
diff --git a/common/build/templates/ActivityCards/_MODULE_/src/template/res/drawable-mdpi/ic_launcher.png b/common/build/templates/ActivityCards/_MODULE_/src/template/res/drawable-mdpi/ic_launcher.png
new file mode 100644
index 0000000..f5f9244
--- /dev/null
+++ b/common/build/templates/ActivityCards/_MODULE_/src/template/res/drawable-mdpi/ic_launcher.png
Binary files differ
diff --git a/common/build/templates/ActivityCards/_MODULE_/src/template/res/drawable-xhdpi/ic_launcher.png b/common/build/templates/ActivityCards/_MODULE_/src/template/res/drawable-xhdpi/ic_launcher.png
new file mode 100644
index 0000000..5d07b3f
--- /dev/null
+++ b/common/build/templates/ActivityCards/_MODULE_/src/template/res/drawable-xhdpi/ic_launcher.png
Binary files differ
diff --git a/common/build/templates/ActivityCards/_MODULE_/src/template/res/drawable-xhdpi/sample_dashboard_item_background.9.png b/common/build/templates/ActivityCards/_MODULE_/src/template/res/drawable-xhdpi/sample_dashboard_item_background.9.png
new file mode 100644
index 0000000..1358628
--- /dev/null
+++ b/common/build/templates/ActivityCards/_MODULE_/src/template/res/drawable-xhdpi/sample_dashboard_item_background.9.png
Binary files differ
diff --git a/common/build/templates/ActivityCards/_MODULE_/src/template/res/drawable-xxhdpi/ic_launcher.png b/common/build/templates/ActivityCards/_MODULE_/src/template/res/drawable-xxhdpi/ic_launcher.png
new file mode 100644
index 0000000..6ef21e1
--- /dev/null
+++ b/common/build/templates/ActivityCards/_MODULE_/src/template/res/drawable-xxhdpi/ic_launcher.png
Binary files differ
diff --git a/common/build/templates/ActivityCards/_MODULE_/src/template/res/layout/activity_main.xml b/common/build/templates/ActivityCards/_MODULE_/src/template/res/layout/activity_main.xml
new file mode 100755
index 0000000..88cdb80
--- /dev/null
+++ b/common/build/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/common/build/templates/ActivityCards/_MODULE_/src/template/res/layout/sample_dashboard_item.xml b/common/build/templates/ActivityCards/_MODULE_/src/template/res/layout/sample_dashboard_item.xml
new file mode 100644
index 0000000..38987ee
--- /dev/null
+++ b/common/build/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/common/build/templates/ActivityCards/_MODULE_/src/template/res/values-sw600dp/dimens.xml b/common/build/templates/ActivityCards/_MODULE_/src/template/res/values-sw600dp/dimens.xml
new file mode 100644
index 0000000..22074a2
--- /dev/null
+++ b/common/build/templates/ActivityCards/_MODULE_/src/template/res/values-sw600dp/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/common/build/templates/ActivityCards/_MODULE_/src/template/res/values/activitycards-strings.xml.ftl b/common/build/templates/ActivityCards/_MODULE_/src/template/res/values/activitycards-strings.xml.ftl
new file mode 100644
index 0000000..e772a05
--- /dev/null
+++ b/common/build/templates/ActivityCards/_MODULE_/src/template/res/values/activitycards-strings.xml.ftl
@@ -0,0 +1,8 @@
+<#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>
\ No newline at end of file
diff --git a/common/build/templates/ActivityCards/_MODULE_/src/template/res/values/styles.xml b/common/build/templates/ActivityCards/_MODULE_/src/template/res/values/styles.xml
new file mode 100644
index 0000000..cafe531
--- /dev/null
+++ b/common/build/templates/ActivityCards/_MODULE_/src/template/res/values/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/common/build/templates/base/_MODULE_/build.gradle.ftl b/common/build/templates/base/_MODULE_/build.gradle.ftl
new file mode 100644
index 0000000..5ba7743
--- /dev/null
+++ b/common/build/templates/base/_MODULE_/build.gradle.ftl
@@ -0,0 +1,82 @@
+<#--
+ 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.5.+'
+    }
+}
+
+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:13.0.+"
+<#elseif sample.minSdk?number < 13>
+    compile "com.android.support:support-v4:13.0.+"
+    compile "com.android.support:gridlayout-v7:13.0.+"
+<#else>
+    compile "com.android.support:support-v13:13.0.+"
+</#if>
+}
+
+// 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 17
+    buildToolsVersion "17.0.0"
+
+    defaultConfig {
+        minSdkVersion ${sample.minSdk}
+        targetSdkVersion 17
+    }
+<#noparse>
+    sourceSets {
+        main {
+            dirs.each { dir ->
+                java.srcDirs "src/${dir}/java"
+                res.srcDirs "src/${dir}/res"
+            }
+        }
+    }
+</#noparse>
+}
+
+task preflight (dependsOn: parent.preflight) {}
+
+// 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.
+<#noparse>
+android.applicationVariants.each { variant ->
+    tasks.getByPath("prepare${variant.name.capitalize()}Dependencies").dependsOn preflight
+}
+</#noparse>
+
+
+
diff --git a/common/build/templates/base/_MODULE_/src/template/java/_PACKAGE_/MainActivity.java.ftl b/common/build/templates/base/_MODULE_/src/template/java/_PACKAGE_/MainActivity.java.ftl
new file mode 100755
index 0000000..2ae93d2
--- /dev/null
+++ b/common/build/templates/base/_MODULE_/src/template/java/_PACKAGE_/MainActivity.java.ftl
@@ -0,0 +1,34 @@
+<#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.app.Activity;
+import android.content.Intent;
+import android.os.Bundle;
+import android.view.View;
+
+/**
+ * A simple launcher activity describing the alternative action bar presentations and allowing the
+ * user to navigate to a demo of each.
+ */
+public class MainActivity extends Activity {
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.activity_main);
+    }
+}
diff --git a/common/build/templates/base/_MODULE_/src/template/res/drawable-hdpi/ic_launcher.png b/common/build/templates/base/_MODULE_/src/template/res/drawable-hdpi/ic_launcher.png
new file mode 100644
index 0000000..b1efaf4
--- /dev/null
+++ b/common/build/templates/base/_MODULE_/src/template/res/drawable-hdpi/ic_launcher.png
Binary files differ
diff --git a/common/build/templates/base/_MODULE_/src/template/res/drawable-hdpi/tile.9.png b/common/build/templates/base/_MODULE_/src/template/res/drawable-hdpi/tile.9.png
new file mode 100644
index 0000000..1358628
--- /dev/null
+++ b/common/build/templates/base/_MODULE_/src/template/res/drawable-hdpi/tile.9.png
Binary files differ
diff --git a/common/build/templates/base/_MODULE_/src/template/res/drawable-mdpi/ic_launcher.png b/common/build/templates/base/_MODULE_/src/template/res/drawable-mdpi/ic_launcher.png
new file mode 100644
index 0000000..f5f9244
--- /dev/null
+++ b/common/build/templates/base/_MODULE_/src/template/res/drawable-mdpi/ic_launcher.png
Binary files differ
diff --git a/common/build/templates/base/_MODULE_/src/template/res/drawable-xhdpi/ic_launcher.png b/common/build/templates/base/_MODULE_/src/template/res/drawable-xhdpi/ic_launcher.png
new file mode 100644
index 0000000..5d07b3f
--- /dev/null
+++ b/common/build/templates/base/_MODULE_/src/template/res/drawable-xhdpi/ic_launcher.png
Binary files differ
diff --git a/common/build/templates/base/_MODULE_/src/template/res/drawable-xxhdpi/ic_launcher.png b/common/build/templates/base/_MODULE_/src/template/res/drawable-xxhdpi/ic_launcher.png
new file mode 100644
index 0000000..6ef21e1
--- /dev/null
+++ b/common/build/templates/base/_MODULE_/src/template/res/drawable-xxhdpi/ic_launcher.png
Binary files differ
diff --git a/common/build/templates/base/_MODULE_/src/template/res/layout/activity_main.xml b/common/build/templates/base/_MODULE_/src/template/res/layout/activity_main.xml
new file mode 100755
index 0000000..be1aa49
--- /dev/null
+++ b/common/build/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/common/build/templates/base/_MODULE_/src/template/res/values-sw600dp/dimens.xml b/common/build/templates/base/_MODULE_/src/template/res/values-sw600dp/dimens.xml
new file mode 100644
index 0000000..22074a2
--- /dev/null
+++ b/common/build/templates/base/_MODULE_/src/template/res/values-sw600dp/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/common/build/templates/base/_MODULE_/src/template/res/values-sw600dp/styles.xml b/common/build/templates/base/_MODULE_/src/template/res/values-sw600dp/styles.xml
new file mode 100644
index 0000000..03d1974
--- /dev/null
+++ b/common/build/templates/base/_MODULE_/src/template/res/values-sw600dp/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/common/build/templates/base/_MODULE_/src/template/res/values/base-strings.xml.ftl b/common/build/templates/base/_MODULE_/src/template/res/values/base-strings.xml.ftl
new file mode 100755
index 0000000..9a15a37
--- /dev/null
+++ b/common/build/templates/base/_MODULE_/src/template/res/values/base-strings.xml.ftl
@@ -0,0 +1,9 @@
+<resources>
+    <string name="app_name">${sample.name}</string>
+
+    <string name="intro_message">
+        <![CDATA[
+        ${sample.intro}
+        ]]>
+    </string>
+</resources>
diff --git a/common/build/templates/base/_MODULE_/src/template/res/values/dimens.xml b/common/build/templates/base/_MODULE_/src/template/res/values/dimens.xml
new file mode 100644
index 0000000..39e710b
--- /dev/null
+++ b/common/build/templates/base/_MODULE_/src/template/res/values/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/common/build/templates/base/_MODULE_/src/template/res/values/styles.xml b/common/build/templates/base/_MODULE_/src/template/res/values/styles.xml
new file mode 100644
index 0000000..404623e
--- /dev/null
+++ b/common/build/templates/base/_MODULE_/src/template/res/values/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/common/build/templates/create/._IDE_/.name.ftl b/common/build/templates/create/._IDE_/.name.ftl
new file mode 100644
index 0000000..52f9788
--- /dev/null
+++ b/common/build/templates/create/._IDE_/.name.ftl
@@ -0,0 +1,2 @@
+<#ftl>
+${sample.name}
diff --git a/common/build/templates/create/._IDE_/gradle.xml b/common/build/templates/create/._IDE_/gradle.xml
new file mode 100644
index 0000000..a9986e4
--- /dev/null
+++ b/common/build/templates/create/._IDE_/gradle.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="GradleSettings">
+    <option name="linkedExternalProjectsSettings">
+      <GradleProjectSettings>
+        <option name="externalProjectPath" value="$PROJECT_DIR$/build.gradle" />
+        <option name="useAutoImport" value="true" />
+      </GradleProjectSettings>
+    </option>
+  </component>
+</project>
+
diff --git a/common/build/templates/create/._IDE_/modules.xml.ftl b/common/build/templates/create/._IDE_/modules.xml.ftl
new file mode 100644
index 0000000..4108150
--- /dev/null
+++ b/common/build/templates/create/._IDE_/modules.xml.ftl
@@ -0,0 +1,10 @@
+<#ftl>
+<project version="4">
+  <component name="ProjectModuleManager">
+    <modules>
+        <module fileurl="file://$PROJECT_DIR$/${sample.name}.iml" filepath="$PROJECT_DIR$/${sample.name}.iml" />
+        <module fileurl="file://$PROJECT_DIR$/${meta.module}/${meta.module}.iml" filepath="$PROJECT_DIR$/${meta.module}/${meta.module}.iml" />
+    </modules>
+  </component>
+</project>
+
diff --git a/common/build/templates/create/_MODULE_/_MODULE_.iml.ftl b/common/build/templates/create/_MODULE_/_MODULE_.iml.ftl
new file mode 100644
index 0000000..fd6972c
--- /dev/null
+++ b/common/build/templates/create/_MODULE_/_MODULE_.iml.ftl
@@ -0,0 +1,84 @@
+<#--
+ 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.
+-->
+<?xml version="1.0" encoding="UTF-8"?>
+<module external.system.id="GRADLE" type="JAVA_MODULE" version="4">
+  <component name="FacetManager">
+    <facet type="android" name="Android">
+      <configuration>
+        <option name="ALLOW_USER_CONFIGURATION" value="false" />
+        <option name="MANIFEST_FILE_RELATIVE_PATH" value="/src/main/AndroidManifest.xml" />
+        <option name="RES_FOLDER_RELATIVE_PATH" value="/src/main/res" />
+        <option name="ASSETS_FOLDER_RELATIVE_PATH" value="/src/main/assets" />
+      </configuration>
+    </facet>
+    <facet type="android-gradle" name="Android-Gradle">
+      <configuration>
+        <option name="GRADLE_PROJECT_PATH" value=":${sample.name}" />
+      </configuration>
+    </facet>
+  </component>
+  <component name="NewModuleRootManager" inherit-compiler-output="true">
+    <exclude-output />
+    <content url="file://$MODULE_DIR$">
+      <sourceFolder url="file://$MODULE_DIR$/build/source/r/debug" isTestSource="false" />
+      <sourceFolder url="file://$MODULE_DIR$/build/source/aidl/debug" isTestSource="false" />
+      <sourceFolder url="file://$MODULE_DIR$/build/source/rs/debug" isTestSource="false" />
+      <sourceFolder url="file://$MODULE_DIR$/build/source/buildConfig/debug" isTestSource="false" />
+      <sourceFolder url="file://$MODULE_DIR$/build/res/rs/debug" isTestSource="false" />
+      <sourceFolder url="file://$MODULE_DIR$/build/source/r/test" isTestSource="true" />
+      <sourceFolder url="file://$MODULE_DIR$/build/source/aidl/test" isTestSource="true" />
+      <sourceFolder url="file://$MODULE_DIR$/build/source/rs/test" isTestSource="true" />
+      <sourceFolder url="file://$MODULE_DIR$/build/source/buildConfig/test" isTestSource="true" />
+      <sourceFolder url="file://$MODULE_DIR$/build/res/rs/test" isTestSource="true" />
+      <sourceFolder url="file://$MODULE_DIR$/src/debug/aidl" isTestSource="false" />
+      <sourceFolder url="file://$MODULE_DIR$/src/debug/assets" isTestSource="false" />
+      <sourceFolder url="file://$MODULE_DIR$/src/debug/java" isTestSource="false" />
+      <sourceFolder url="file://$MODULE_DIR$/src/debug/jni" isTestSource="false" />
+      <sourceFolder url="file://$MODULE_DIR$/src/debug/rs" isTestSource="false" />
+      <sourceFolder url="file://$MODULE_DIR$/src/debug/res" isTestSource="false" />
+      <sourceFolder url="file://$MODULE_DIR$/src/debug/resources" isTestSource="false" />
+      <sourceFolder url="file://$MODULE_DIR$/src/main/aidl" isTestSource="false" />
+      <sourceFolder url="file://$MODULE_DIR$/src/main/assets" isTestSource="false" />
+      <sourceFolder url="file://$MODULE_DIR$/src/main/java" isTestSource="false" />
+      <sourceFolder url="file://$MODULE_DIR$/src/main/jni" isTestSource="false" />
+      <sourceFolder url="file://$MODULE_DIR$/src/main/rs" isTestSource="false" />
+      <sourceFolder url="file://$MODULE_DIR$/src/main/res" isTestSource="false" />
+      <sourceFolder url="file://$MODULE_DIR$/src/main/resources" isTestSource="false" />
+      <sourceFolder url="file://$MODULE_DIR$/src/instrumentTest/aidl" isTestSource="true" />
+      <sourceFolder url="file://$MODULE_DIR$/src/instrumentTest/assets" isTestSource="true" />
+      <sourceFolder url="file://$MODULE_DIR$/src/instrumentTest/java" isTestSource="true" />
+      <sourceFolder url="file://$MODULE_DIR$/src/instrumentTest/jni" isTestSource="true" />
+      <sourceFolder url="file://$MODULE_DIR$/src/instrumentTest/rs" isTestSource="true" />
+      <sourceFolder url="file://$MODULE_DIR$/src/instrumentTest/res" isTestSource="true" />
+      <sourceFolder url="file://$MODULE_DIR$/src/instrumentTest/resources" isTestSource="true" />
+      <excludeFolder url="file://$MODULE_DIR$/build/apk" />
+      <excludeFolder url="file://$MODULE_DIR$/build/assets" />
+      <excludeFolder url="file://$MODULE_DIR$/build/bundles" />
+      <excludeFolder url="file://$MODULE_DIR$/build/classes" />
+      <excludeFolder url="file://$MODULE_DIR$/build/dependency-cache" />
+      <excludeFolder url="file://$MODULE_DIR$/build/exploded-bundles" />
+      <excludeFolder url="file://$MODULE_DIR$/build/incremental" />
+      <excludeFolder url="file://$MODULE_DIR$/build/libs" />
+      <excludeFolder url="file://$MODULE_DIR$/build/manifests" />
+      <excludeFolder url="file://$MODULE_DIR$/build/symbols" />
+      <excludeFolder url="file://$MODULE_DIR$/build/tmp" />
+    </content>
+    <orderEntry type="jdk" jdkName="Android 4.2 Platform" jdkType="Android SDK" />
+    <orderEntry type="sourceFolder" forTests="false" />
+    <orderEntry type="library" name="android-support-v4" level="project" />
+  </component>
+</module>
+
diff --git a/common/build/templates/create/_MODULE_/build.gradle.ftl b/common/build/templates/create/_MODULE_/build.gradle.ftl
new file mode 100644
index 0000000..c662fec
--- /dev/null
+++ b/common/build/templates/create/_MODULE_/build.gradle.ftl
@@ -0,0 +1,42 @@
+
+<#-- 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.4.2'
+    }
+}
+
+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 17
+    buildToolsVersion "17.0.0"
+
+    defaultConfig {
+        minSdkVersion ${sample.minSdk}
+        targetSdkVersion 17
+    }
+}
+
+task preflight (dependsOn: parent.preflight) {}
+
+// 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.
+<#noparse>
+android.applicationVariants.each { variant ->
+    tasks.getByPath("prepare${variant.name.capitalize()}Dependencies").dependsOn preflight
+}
+</#noparse>
+
+
+
diff --git a/common/build/templates/create/_MODULE_/gitignore b/common/build/templates/create/_MODULE_/gitignore
new file mode 100644
index 0000000..f1e8ad1
--- /dev/null
+++ b/common/build/templates/create/_MODULE_/gitignore
@@ -0,0 +1,2 @@
+src/template/
+src/common/
\ No newline at end of file
diff --git a/common/build/templates/create/_MODULE_/proguard-project.txt b/common/build/templates/create/_MODULE_/proguard-project.txt
new file mode 100644
index 0000000..0d8f171
--- /dev/null
+++ b/common/build/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/common/build/templates/create/_MODULE_/project.properties b/common/build/templates/create/_MODULE_/project.properties
new file mode 100644
index 0000000..0c9830a
--- /dev/null
+++ b/common/build/templates/create/_MODULE_/project.properties
@@ -0,0 +1,14 @@
+# 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):
+#proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt
+
+# Project target.
+target=Google Inc.:Google APIs:17
diff --git a/common/build/templates/create/_MODULE_/src/main/AndroidManifest.xml.ftl b/common/build/templates/create/_MODULE_/src/main/AndroidManifest.xml.ftl
new file mode 100644
index 0000000..fd49b3e
--- /dev/null
+++ b/common/build/templates/create/_MODULE_/src/main/AndroidManifest.xml.ftl
@@ -0,0 +1,24 @@
+<#ftl>
+<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/common/build/templates/create/_PROJECT_.iml.ftl b/common/build/templates/create/_PROJECT_.iml.ftl
new file mode 100644
index 0000000..81076f2
--- /dev/null
+++ b/common/build/templates/create/_PROJECT_.iml.ftl
@@ -0,0 +1,14 @@
+<module 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$/gradle" />
+    <excludeFolder url="file://$MODULE_DIR$/.idea" />
+    <excludeFolder url="file://$MODULE_DIR$/buildSrc" />
+    <excludeFolder url="file://$MODULE_DIR$/build" />
+</content>
+<orderEntry type="inheritedJdk" />
+<orderEntry type="sourceFolder" forTests="false" />
+</component>
+</module>
diff --git a/common/build/templates/create/build.gradle.ftl b/common/build/templates/create/build.gradle.ftl
new file mode 100644
index 0000000..8a2e4da
--- /dev/null
+++ b/common/build/templates/create/build.gradle.ftl
@@ -0,0 +1,7 @@
+<#ftl>
+// BEGIN_EXCLUDE
+apply from: "../../common/build/build.gradle"
+samplegen {
+pathToSamplesCommon "../../common"
+}
+// END_EXCLUDE
\ No newline at end of file
diff --git a/common/build/templates/create/buildSrc/build.gradle.ftl b/common/build/templates/create/buildSrc/build.gradle.ftl
new file mode 100644
index 0000000..dcdd01a
--- /dev/null
+++ b/common/build/templates/create/buildSrc/build.gradle.ftl
@@ -0,0 +1,16 @@
+<#ftl>
+repositories {
+    mavenCentral()
+}
+dependencies {
+    compile 'org.freemarker:freemarker:2.3.20'
+}
+
+sourceSets {
+    main {
+        groovy {
+            srcDir new File(rootDir, "../${meta.common}/build/buildSrc/src/main/groovy")
+        }
+    }
+}
+
diff --git a/common/build/templates/create/gradle/wrapper/gradle-wrapper.jar b/common/build/templates/create/gradle/wrapper/gradle-wrapper.jar
new file mode 100644
index 0000000..8c0fb64
--- /dev/null
+++ b/common/build/templates/create/gradle/wrapper/gradle-wrapper.jar
Binary files differ
diff --git a/common/build/templates/create/gradle/wrapper/gradle-wrapper.properties b/common/build/templates/create/gradle/wrapper/gradle-wrapper.properties
new file mode 100644
index 0000000..5c22dec
--- /dev/null
+++ b/common/build/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.6-bin.zip
diff --git a/common/build/templates/create/gradlew b/common/build/templates/create/gradlew
new file mode 100755
index 0000000..91a7e26
--- /dev/null
+++ b/common/build/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/common/build/templates/create/gradlew.bat b/common/build/templates/create/gradlew.bat
new file mode 100644
index 0000000..aec9973
--- /dev/null
+++ b/common/build/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/common/build/templates/create/settings.gradle.ftl b/common/build/templates/create/settings.gradle.ftl
new file mode 100644
index 0000000..17556da
--- /dev/null
+++ b/common/build/templates/create/settings.gradle.ftl
@@ -0,0 +1,2 @@
+<#ftl>
+include '${meta.module}'
diff --git a/common/build/templates/create/template-params.xml.ftl b/common/build/templates/create/template-params.xml.ftl
new file mode 100644
index 0000000..2f1c989
--- /dev/null
+++ b/common/build/templates/create/template-params.xml.ftl
@@ -0,0 +1,21 @@
+<#ftl>
+<sample>
+    <name>${sample.name}</name>
+    <package>${sample.package}</package>
+
+
+    <!--TODO: change minSdk if needed-->
+    <minSdk>${sample.minSdk}</minSdk>
+
+
+    <intro>
+        <![CDATA[
+        Introductory text that explains what the sample is intended to demonstrate. Edit
+        in template-params.xml.
+        ]]>
+    </intro>
+
+    <template src="base"/>
+    <common src="logger"/>
+
+</sample>
diff --git a/common/build/templates/include/c-style-copyright.ftl b/common/build/templates/include/c-style-copyright.ftl
new file mode 100644
index 0000000..af10946
--- /dev/null
+++ b/common/build/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/common/build/templates/include/common.ftl b/common/build/templates/include/common.ftl
new file mode 100644
index 0000000..f116b0c
--- /dev/null
+++ b/common/build/templates/include/common.ftl
@@ -0,0 +1,6 @@
+<#-- 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>
diff --git a/common/build/templates/include/ftl-style-copyright.ftl b/common/build/templates/include/ftl-style-copyright.ftl
new file mode 100644
index 0000000..9b8acec
--- /dev/null
+++ b/common/build/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/common/build/templates/include/ignoredir.fmpp b/common/build/templates/include/ignoredir.fmpp
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/common/build/templates/include/ignoredir.fmpp
diff --git a/common/build/templates/include/xml-style-copyright.ftl b/common/build/templates/include/xml-style-copyright.ftl
new file mode 100644
index 0000000..f961eb7
--- /dev/null
+++ b/common/build/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.
+-->
diff --git a/common/logger/Log.java b/common/src/java/com/example/android/common/logger/Log.java
similarity index 100%
rename from common/logger/Log.java
rename to common/src/java/com/example/android/common/logger/Log.java
diff --git a/common/logger/LogNode.java b/common/src/java/com/example/android/common/logger/LogNode.java
similarity index 100%
rename from common/logger/LogNode.java
rename to common/src/java/com/example/android/common/logger/LogNode.java
diff --git a/common/logger/LogView.java b/common/src/java/com/example/android/common/logger/LogView.java
similarity index 100%
rename from common/logger/LogView.java
rename to common/src/java/com/example/android/common/logger/LogView.java
diff --git a/common/logger/LogWrapper.java b/common/src/java/com/example/android/common/logger/LogWrapper.java
similarity index 100%
rename from common/logger/LogWrapper.java
rename to common/src/java/com/example/android/common/logger/LogWrapper.java
diff --git a/common/logger/MessageOnlyLogFilter.java b/common/src/java/com/example/android/common/logger/MessageOnlyLogFilter.java
similarity index 100%
rename from common/logger/MessageOnlyLogFilter.java
rename to common/src/java/com/example/android/common/logger/MessageOnlyLogFilter.java
diff --git a/common/src/com/example/android/common/Pools.java b/common/src/java/com/example/android/common/util/Pools.java
similarity index 99%
rename from common/src/com/example/android/common/Pools.java
rename to common/src/java/com/example/android/common/util/Pools.java
index b31749a..1b7edb0 100644
--- a/common/src/com/example/android/common/Pools.java
+++ b/common/src/java/com/example/android/common/util/Pools.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package com.example.android.common;
+package com.example.android.common.util;
 
 /**
  * Helper class for creating pools of objects. Creating new objects is an
diff --git a/sampleSamples/BaseSample/BaseSampleSample/build.gradle b/sampleSamples/BaseSample/BaseSampleSample/build.gradle
new file mode 100644
index 0000000..7f993fa
--- /dev/null
+++ b/sampleSamples/BaseSample/BaseSampleSample/build.gradle
@@ -0,0 +1,34 @@
+
+buildscript {
+    repositories {
+        mavenCentral()
+    }
+
+    dependencies {
+        classpath 'com.android.tools.build:gradle:0.4.2'
+    }
+}
+
+apply plugin: 'android'
+
+
+android {
+    compileSdkVersion 17
+    buildToolsVersion "17.0.0"
+
+    defaultConfig {
+        minSdkVersion 4
+        targetSdkVersion 17
+    }
+}
+
+task preflight (dependsOn: parent.preflight) {}
+
+// 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 ->
+    tasks.getByPath("prepare${variant.name.capitalize()}Dependencies").dependsOn preflight
+}
+
+
+
diff --git a/sampleSamples/BaseSample/BaseSampleSample/proguard-project.txt b/sampleSamples/BaseSample/BaseSampleSample/proguard-project.txt
new file mode 100644
index 0000000..0d8f171
--- /dev/null
+++ b/sampleSamples/BaseSample/BaseSampleSample/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/sampleSamples/BaseSample/BaseSampleSample/src/main/AndroidManifest.xml b/sampleSamples/BaseSample/BaseSampleSample/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..456eecf
--- /dev/null
+++ b/sampleSamples/BaseSample/BaseSampleSample/src/main/AndroidManifest.xml
@@ -0,0 +1,39 @@
+<?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.
+-->
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+    package="com.example.android.basesample"
+    android:versionCode="1"
+    android:versionName="1.0">
+
+    <uses-sdk android:minSdkVersion="4" 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/sampleSamples/BaseSample/build.gradle b/sampleSamples/BaseSample/build.gradle
new file mode 100644
index 0000000..bf09c05
--- /dev/null
+++ b/sampleSamples/BaseSample/build.gradle
@@ -0,0 +1,6 @@
+// BEGIN_EXCLUDE
+apply from: "../../common/build/build.gradle"
+samplegen {
+pathToSamplesCommon "../../common"
+}
+// END_EXCLUDE
\ No newline at end of file
diff --git a/sampleSamples/BaseSample/buildSrc/build.gradle b/sampleSamples/BaseSample/buildSrc/build.gradle
new file mode 100644
index 0000000..b2978f5
--- /dev/null
+++ b/sampleSamples/BaseSample/buildSrc/build.gradle
@@ -0,0 +1,15 @@
+repositories {
+    mavenCentral()
+}
+dependencies {
+    compile 'org.freemarker:freemarker:2.3.20'
+}
+
+sourceSets {
+    main {
+        groovy {
+            srcDir new File(rootDir, "../../../common/build/buildSrc/src/main/groovy")
+        }
+    }
+}
+
diff --git a/sampleSamples/BaseSample/template-params.xml b/sampleSamples/BaseSample/template-params.xml
new file mode 100644
index 0000000..6cd6ee9
--- /dev/null
+++ b/sampleSamples/BaseSample/template-params.xml
@@ -0,0 +1,38 @@
+<?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.
+-->
+<sample>
+    <name>BaseSample</name>
+    <package>com.example.android.basesample</package>
+
+
+    <!--TODO: change minSdk if needed-->
+    <minSdk>4</minSdk>
+
+
+    <template src="base"/>
+
+    <common src="logger"/>
+
+    <strings>
+        <intro>
+            <![CDATA[
+            Introductory text that explains what the sample is intended to demonstrate. Edit
+            in TemplateData.xml.
+            ]]>
+        </intro>
+    </strings>
+</sample>
diff --git a/ui/actionbar/DoneBar/DoneBar/src/main/java/com/example/android/donebar/DoneButtonActivity.java b/ui/actionbar/DoneBar/DoneBar/src/main/java/com/example/android/donebar/DoneButtonActivity.java
index 303d1ed..3b1e37d 100755
--- a/ui/actionbar/DoneBar/DoneBar/src/main/java/com/example/android/donebar/DoneButtonActivity.java
+++ b/ui/actionbar/DoneBar/DoneBar/src/main/java/com/example/android/donebar/DoneButtonActivity.java
@@ -67,6 +67,7 @@
         return true;
     }
 
+
     @Override
     public boolean onOptionsItemSelected(MenuItem item) {
         switch (item.getItemId()) {
diff --git a/ui/actionbar/DoneBar/proguard-project.txt b/ui/actionbar/DoneBar/proguard-project.txt
new file mode 100644
index 0000000..f2fe155
--- /dev/null
+++ b/ui/actionbar/DoneBar/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 *;
+#}