aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--adtproductbuild/Android.mk2
-rw-r--r--adtproductbuild/build.xml11
-rw-r--r--build/tools.atree1
-rw-r--r--eclipse/plugins/com.android.ide.eclipse.adt/plugin.xml4
-rw-r--r--eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/AdtConstants.java3
-rw-r--r--eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/build/BuildHelper.java4
-rw-r--r--eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/project/LibraryClasspathContainerInitializer.java249
-rw-r--r--eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/project/ProjectHelper.java17
-rw-r--r--eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/sdk/Sdk.java7
-rw-r--r--eclipse/plugins/com.android.ide.eclipse.ddms/src/com/android/ide/eclipse/ddms/systrace/SystraceOptionsDialogV1.java4
-rwxr-xr-xeclipse/scripts/build_server.sh15
-rw-r--r--templates/activities/BlankActivity/globals.xml.ftl3
-rw-r--r--templates/activities/BlankActivity/recipe.xml.ftl29
-rw-r--r--templates/activities/FullscreenActivity/globals.xml.ftl3
-rw-r--r--templates/activities/FullscreenActivity/recipe.xml.ftl21
-rw-r--r--templates/activities/FullscreenActivity/root/res/values/attrs.xml2
-rw-r--r--templates/activities/LoginActivity/globals.xml.ftl3
-rw-r--r--templates/activities/LoginActivity/recipe.xml.ftl17
-rw-r--r--templates/activities/MasterDetailFlow/globals.xml.ftl3
-rw-r--r--templates/activities/MasterDetailFlow/recipe.xml.ftl20
-rw-r--r--templates/activities/SettingsActivity/globals.xml.ftl3
-rw-r--r--templates/activities/SettingsActivity/recipe.xml.ftl17
-rw-r--r--templates/gradle/wrapper/gradle/wrapper/gradle-wrapper.jarbin0 -> 49896 bytes
-rw-r--r--templates/gradle/wrapper/gradle/wrapper/gradle-wrapper.properties6
-rwxr-xr-xtemplates/gradle/wrapper/gradlew164
-rw-r--r--templates/gradle/wrapper/gradlew.bat90
-rw-r--r--templates/projects/NewAndroidApplication/globals.xml.ftl6
-rw-r--r--templates/projects/NewAndroidApplication/recipe.xml.ftl28
-rw-r--r--templates/projects/NewAndroidApplication/root/build.gradle.ftl24
-rw-r--r--templates/projects/NewAndroidApplication/root/settings.gradle.ftl1
-rw-r--r--templates/projects/NewAndroidLibrary/globals.xml.ftl10
-rw-r--r--templates/projects/NewAndroidLibrary/recipe.xml.ftl33
-rw-r--r--templates/projects/NewAndroidLibrary/root/AndroidManifest.xml.ftl15
-rw-r--r--templates/projects/NewAndroidLibrary/root/build.gradle.ftl24
-rwxr-xr-xtemplates/projects/NewAndroidLibrary/root/res/drawable-hdpi/ic_launcher.pngbin0 -> 9397 bytes
-rwxr-xr-xtemplates/projects/NewAndroidLibrary/root/res/drawable-mdpi/ic_launcher.pngbin0 -> 5237 bytes
-rwxr-xr-xtemplates/projects/NewAndroidLibrary/root/res/drawable-xhdpi/ic_launcher.pngbin0 -> 14383 bytes
-rw-r--r--templates/projects/NewAndroidLibrary/root/res/values-v11/styles_hc.xml.ftl11
-rw-r--r--templates/projects/NewAndroidLibrary/root/res/values-v14/styles_ics.xml12
-rw-r--r--templates/projects/NewAndroidLibrary/root/res/values/strings.xml.ftl3
-rw-r--r--templates/projects/NewAndroidLibrary/root/res/values/styles.xml.ftl20
-rw-r--r--templates/projects/NewAndroidLibrary/root/settings.gradle.ftl1
-rw-r--r--templates/projects/NewAndroidLibrary/template.xml82
-rw-r--r--templates/projects/NewAndroidLibrary/template_new_project.pngbin0 -> 12408 bytes
-rw-r--r--templates/projects/NewJavaLibrary/globals.xml.ftl7
-rw-r--r--templates/projects/NewJavaLibrary/recipe.xml.ftl11
-rw-r--r--templates/projects/NewJavaLibrary/root/build.gradle.ftl1
-rw-r--r--templates/projects/NewJavaLibrary/root/settings.gradle.ftl1
-rw-r--r--templates/projects/NewJavaLibrary/root/src/library_package/Placeholder.java4
-rw-r--r--templates/projects/NewJavaLibrary/template.xml24
-rw-r--r--templates/projects/NewJavaLibrary/template_new_project.pngbin0 -> 12408 bytes
51 files changed, 852 insertions, 164 deletions
diff --git a/adtproductbuild/Android.mk b/adtproductbuild/Android.mk
index 80f23a2..a5d0c8b 100644
--- a/adtproductbuild/Android.mk
+++ b/adtproductbuild/Android.mk
@@ -6,6 +6,7 @@
#
# Expected env vars:
# ADT_IDE_DEST_DIR: existing directory where to copy the IDE zip files.
+# ADT_IDE_QUALIFIER: a root qualifier to incorporate before the build timestamp in plugins.
# ADT_IDE_ZIP_QUALIFIER: either a date or build number to incorporate in the zip names.
# Expose the ADT Eclipse IDE build only for the SDK when building adt_eclipse_ide
@@ -56,6 +57,7 @@ $(ADT_IDE_JAVA_TARGET) : $(TOPDIR)sdk/adtproductbuild/adt_eclipse_ide \
-application org.eclipse.ant.core.antRunner \
-configuration ../../out/host/eclipse/adtproduct/ant-configuration \
-data ../../out/host/eclipse/adtproduct/ant-workspace \
+ -DADT_IDE_QUALIFIER=$(ADT_IDE_QUALIFIER) \
2>&1 && \
mv -f ../../$(ADT_IDE_BUILD_LOG) ../../$(ADT_IDE_BUILD_LOG).1 ) \
| tee ../../$(ADT_IDE_BUILD_LOG) \
diff --git a/adtproductbuild/build.xml b/adtproductbuild/build.xml
index e8dcf1e..95e682a 100644
--- a/adtproductbuild/build.xml
+++ b/adtproductbuild/build.xml
@@ -1,8 +1,16 @@
<project name="com.android.eclipse.rcp.build" default="build">
+
+ <!-- Set QUALIFIER to ADT_IDE_QUALIFIER if defined, otherwise use a date timestamp. -->
<tstamp>
- <format property="QUALIFIER" pattern="yyyyMMddHHmm"/>
+ <format property="defaultQualifier" pattern="yyyyMMddHHmm"/>
</tstamp>
+ <condition property="QUALIFIER" value="v${defaultQualifier}" else="${ADT_IDE_QUALIFIER}">
+ <equals arg1="${ADT_IDE_QUALIFIER}" arg2="" />
+ </condition>
+
+ <echo message="## ADT IDE Build Qualifier: ${QUALIFIER}"/>
+
<!-- Root of Android Source Tree -->
<property name="ANDROID_SRC" location="../../" />
@@ -138,6 +146,7 @@
<arg value="-DrepoBaseLocation=${targetDir}/repos/" />
<arg value="-DtransformedRepoLocation=${targetDir}/transformedRepos/" />
<arg value="-Dconfigs=${buildconfigs}" />
+ <arg value="-DforceContextQualifier=${QUALIFIER}" />
<classpath>
<pathelement location="${equinox.launcher}" />
</classpath>
diff --git a/build/tools.atree b/build/tools.atree
index 0c79d42..8ca90be 100644
--- a/build/tools.atree
+++ b/build/tools.atree
@@ -119,6 +119,7 @@ prebuilts/tools/common/proguard/proguard4.7/src/proguard/ant/task.properties to
# Templates
sdk/templates/projects tools/templates/projects
sdk/templates/activities tools/templates/activities
+sdk/templates/gradle tools/templates/gradle
sdk/templates/other tools/templates/other
# SDK Controller
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/plugin.xml b/eclipse/plugins/com.android.ide.eclipse.adt/plugin.xml
index 77108c8..8870c7f 100644
--- a/eclipse/plugins/com.android.ide.eclipse.adt/plugin.xml
+++ b/eclipse/plugins/com.android.ide.eclipse.adt/plugin.xml
@@ -581,6 +581,10 @@
class="com.android.ide.eclipse.adt.internal.project.LibraryClasspathContainerInitializer"
id="com.android.ide.eclipse.adt.LIBRARIES">
</classpathContainerInitializer>
+ <classpathContainerInitializer
+ class="com.android.ide.eclipse.adt.internal.project.LibraryClasspathContainerInitializer"
+ id="com.android.ide.eclipse.adt.DEPENDENCIES">
+ </classpathContainerInitializer>
</extension>
<extension point="org.eclipse.jdt.ui.classpathContainerPage">
<classpathContainerPage
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/AdtConstants.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/AdtConstants.java
index 76808e4..5330e08 100644
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/AdtConstants.java
+++ b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/AdtConstants.java
@@ -65,7 +65,8 @@ public class AdtConstants {
"com.android.ide.eclipse.adt.ANDROID_FRAMEWORK"; //$NON-NLS-1$
/** The container id for the libraries */
- public final static String CONTAINER_LIBRARIES = "com.android.ide.eclipse.adt.LIBRARIES"; //$NON-NLS-1$
+ public final static String CONTAINER_PRIVATE_LIBRARIES = "com.android.ide.eclipse.adt.LIBRARIES"; //$NON-NLS-1$
+ public final static String CONTAINER_DEPENDENCIES = "com.android.ide.eclipse.adt.DEPENDENCIES";
/** Separator for workspace path, i.e. "/". */
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/build/BuildHelper.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/build/BuildHelper.java
index da8c2ea..cda1da0 100644
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/build/BuildHelper.java
+++ b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/build/BuildHelper.java
@@ -983,12 +983,12 @@ public class BuildHelper {
IClasspathEntry[] classpaths = javaProject.readRawClasspath();
if (classpaths != null) {
for (IClasspathEntry e : classpaths) {
- // ignore non exported entries, unless it's the LIBRARIES container,
+ // ignore non exported entries, unless they're in the DEPEDENCIES container,
// in which case we always want it (there may be some older projects that
// have it as non exported).
if (e.isExported() ||
(e.getEntryKind() == IClasspathEntry.CPE_CONTAINER &&
- e.getPath().toString().equals(AdtConstants.CONTAINER_LIBRARIES))) {
+ e.getPath().toString().equals(AdtConstants.CONTAINER_DEPENDENCIES))) {
handleCPE(e, javaProject, wsRoot, resMarker);
}
}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/project/LibraryClasspathContainerInitializer.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/project/LibraryClasspathContainerInitializer.java
index 5b0d185..3beb181 100644
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/project/LibraryClasspathContainerInitializer.java
+++ b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/project/LibraryClasspathContainerInitializer.java
@@ -16,6 +16,8 @@
package com.android.ide.eclipse.adt.internal.project;
+import static com.android.ide.eclipse.adt.AdtConstants.CONTAINER_DEPENDENCIES;
+
import com.android.SdkConstants;
import com.android.ide.eclipse.adt.AdtConstants;
import com.android.ide.eclipse.adt.AdtPlugin;
@@ -76,16 +78,21 @@ public class LibraryClasspathContainerInitializer extends BaseClasspathContainer
// container id for each projects.
int projectCount = androidProjects.length;
- IClasspathContainer[] containers = new IClasspathContainer[projectCount];
+ IClasspathContainer[] libraryContainers = new IClasspathContainer[projectCount];
+ IClasspathContainer[] dependencyContainers = new IClasspathContainer[projectCount];
for (int i = 0 ; i < projectCount; i++) {
- containers[i] = allocateLibraryContainer(androidProjects[i]);
+ libraryContainers[i] = allocateLibraryContainer(androidProjects[i]);
+ dependencyContainers[i] = allocateDependencyContainer(androidProjects[i]);
}
// give each project their new container in one call.
JavaCore.setClasspathContainer(
- new Path(AdtConstants.CONTAINER_LIBRARIES),
- androidProjects, containers, new NullProgressMonitor());
+ new Path(AdtConstants.CONTAINER_PRIVATE_LIBRARIES),
+ androidProjects, libraryContainers, new NullProgressMonitor());
+ JavaCore.setClasspathContainer(
+ new Path(AdtConstants.CONTAINER_DEPENDENCIES),
+ androidProjects, dependencyContainers, new NullProgressMonitor());
return true;
} catch (JavaModelException e) {
return false;
@@ -114,12 +121,21 @@ public class LibraryClasspathContainerInitializer extends BaseClasspathContainer
@Override
public void initialize(IPath containerPath, IJavaProject project) throws CoreException {
- if (AdtConstants.CONTAINER_LIBRARIES.equals(containerPath.toString())) {
- IClasspathContainer container = allocateLibraryContainer(project);
- if (container != null) {
- JavaCore.setClasspathContainer(new Path(AdtConstants.CONTAINER_LIBRARIES),
+ if (AdtConstants.CONTAINER_PRIVATE_LIBRARIES.equals(containerPath.toString())) {
+ IClasspathContainer libraries = allocateLibraryContainer(project);
+ if (libraries != null) {
+ JavaCore.setClasspathContainer(new Path(AdtConstants.CONTAINER_PRIVATE_LIBRARIES),
+ new IJavaProject[] { project },
+ new IClasspathContainer[] { libraries },
+ new NullProgressMonitor());
+ }
+
+ } else if(AdtConstants.CONTAINER_DEPENDENCIES.equals(containerPath.toString())) {
+ IClasspathContainer dependencies = allocateDependencyContainer(project);
+ if (dependencies != null) {
+ JavaCore.setClasspathContainer(new Path(AdtConstants.CONTAINER_DEPENDENCIES),
new IJavaProject[] { project },
- new IClasspathContainer[] { container },
+ new IClasspathContainer[] { dependencies },
new NullProgressMonitor());
}
}
@@ -128,48 +144,6 @@ public class LibraryClasspathContainerInitializer extends BaseClasspathContainer
private static IClasspathContainer allocateLibraryContainer(IJavaProject javaProject) {
final IProject iProject = javaProject.getProject();
- AdtPlugin plugin = AdtPlugin.getDefault();
- if (plugin == null) { // This is totally weird, but I've seen it happen!
- return null;
- }
-
- // First check that the project has a library-type container.
- try {
- IClasspathEntry[] rawClasspath = javaProject.getRawClasspath();
- IClasspathEntry[] oldRawClasspath = rawClasspath;
-
- boolean foundLibrariesContainer = false;
- for (IClasspathEntry entry : rawClasspath) {
- // get the entry and kind
- int kind = entry.getEntryKind();
-
- if (kind == IClasspathEntry.CPE_CONTAINER) {
- String path = entry.getPath().toString();
- if (AdtConstants.CONTAINER_LIBRARIES.equals(path)) {
- foundLibrariesContainer = true;
- break;
- }
- }
- }
-
- // if there isn't any, add it.
- if (foundLibrariesContainer == false) {
- // add the android container to the array
- rawClasspath = ProjectHelper.addEntryToClasspath(rawClasspath,
- JavaCore.newContainerEntry(new Path(AdtConstants.CONTAINER_LIBRARIES),
- true /*isExported*/));
- }
-
- // set the new list of entries to the project
- if (rawClasspath != oldRawClasspath) {
- javaProject.setRawClasspath(rawClasspath, new NullProgressMonitor());
- }
- } catch (JavaModelException e) {
- // This really shouldn't happen, but if it does, simply return null (the calling
- // method will fails as well)
- return null;
- }
-
// check if the project has a valid target.
ProjectState state = Sdk.getProjectState(iProject);
if (state == null) {
@@ -188,11 +162,8 @@ public class LibraryClasspathContainerInitializer extends BaseClasspathContainer
* + inside the library projects' libs/
* + inside the referenced Java projects' classpath
*/
-
List<IClasspathEntry> entries = new ArrayList<IClasspathEntry>();
- IWorkspaceRoot workspaceRoot = ResourcesPlugin.getWorkspace().getRoot();
-
// list of java project dependencies and jar files that will be built while
// going through the library projects.
Set<File> jarFiles = new HashSet<File>();
@@ -202,61 +173,32 @@ public class LibraryClasspathContainerInitializer extends BaseClasspathContainer
List<IProject> libProjects = state.getFullLibraryProjects();
for (IProject libProject : libProjects) {
- // get the project output
- IFolder outputFolder = BaseProjectHelper.getAndroidOutputFolder(libProject);
-
- if (outputFolder != null) { // can happen when closing/deleting a library)
- IFile jarIFile = outputFolder.getFile(libProject.getName().toLowerCase() +
- SdkConstants.DOT_JAR);
-
- // get the source folder for the library project
- List<IPath> srcs = BaseProjectHelper.getSourceClasspaths(libProject);
- // find the first non-derived source folder.
- IPath sourceFolder = null;
- for (IPath src : srcs) {
- IFolder srcFolder = workspaceRoot.getFolder(src);
- if (srcFolder.isDerived() == false) {
- sourceFolder = src;
- break;
- }
- }
-
- // we can directly add a CPE for this jar as there's no risk of a duplicate.
- IClasspathEntry entry = JavaCore.newLibraryEntry(
- jarIFile.getLocation(),
- sourceFolder, // source attachment path
- null, // default source attachment root path.
- true /*isExported*/);
-
- entries.add(entry);
-
- // process all of the library project's dependencies
- getDependencyListFromClasspath(libProject, refProjects, jarFiles, true);
- // and the content of its libs folder.
- getJarListFromLibsFolder(libProject, jarFiles);
- }
+ // process all of the library project's dependencies
+ getDependencyListFromClasspath(libProject, refProjects, jarFiles, true);
}
// now process this projects' referenced projects only.
processReferencedProjects(iProject, refProjects, jarFiles);
+
// and the content of its libs folder
getJarListFromLibsFolder(iProject, jarFiles);
- // annotations support for older version of android
- if (state.getTarget() != null && state.getTarget().getVersion().getApiLevel() <= 15) {
- File annotationsJar = new File(Sdk.getCurrent().getSdkLocation(),
- SdkConstants.FD_TOOLS + File.separator + SdkConstants.FD_SUPPORT +
- File.separator + SdkConstants.FN_ANNOTATIONS_JAR);
-
- jarFiles.add(annotationsJar);
- }
-
// now add a classpath entry for each Java project (this is a set so dups are already
// removed)
for (IProject p : refProjects) {
entries.add(JavaCore.newProjectEntry(p.getFullPath(), true /*isExported*/));
}
+ entries.addAll(convertJarsToClasspathEntries(iProject, jarFiles));
+
+ return allocateContainer(javaProject, entries, new Path(AdtConstants.CONTAINER_PRIVATE_LIBRARIES),
+ "Android Private Libraries");
+ }
+
+ private static List<IClasspathEntry> convertJarsToClasspathEntries(final IProject iProject,
+ Set<File> jarFiles) {
+ List<IClasspathEntry> entries = new ArrayList<IClasspathEntry>(jarFiles.size());
+
// and process the jar files list, but first sanitize it to remove dups.
JarListSanitizer sanitizer = new JarListSanitizer(
iProject.getFolder(SdkConstants.FD_OUTPUT).getLocation().toFile(),
@@ -355,10 +297,119 @@ public class LibraryClasspathContainerInitializer extends BaseClasspathContainer
processError(iProject, errorMessage, AdtConstants.MARKER_DEPENDENCY,
true /*outputToConsole*/);
+ return entries;
+ }
+
+ private static IClasspathContainer allocateDependencyContainer(IJavaProject javaProject) {
+ final IProject iProject = javaProject.getProject();
+ final List<IClasspathEntry> entries = new ArrayList<IClasspathEntry>();
+ final Set<File> jarFiles = new HashSet<File>();
+ final IWorkspaceRoot workspaceRoot = ResourcesPlugin.getWorkspace().getRoot();
+
+ // check if the project has a valid target.
+ final ProjectState state = Sdk.getProjectState(iProject);
+ if (state == null) {
+ // getProjectState should already have logged an error. Just bail out.
+ return null;
+ }
+
+ // annotations support for older version of android
+ if (state.getTarget() != null && state.getTarget().getVersion().getApiLevel() <= 15) {
+ File annotationsJar = new File(Sdk.getCurrent().getSdkLocation(),
+ SdkConstants.FD_TOOLS + File.separator + SdkConstants.FD_SUPPORT +
+ File.separator + SdkConstants.FN_ANNOTATIONS_JAR);
+
+ jarFiles.add(annotationsJar);
+ }
+
+ // process all the libraries
+
+ List<IProject> libProjects = state.getFullLibraryProjects();
+ for (IProject libProject : libProjects) {
+ // get the project output
+ IFolder outputFolder = BaseProjectHelper.getAndroidOutputFolder(libProject);
+
+ if (outputFolder != null) { // can happen when closing/deleting a library)
+ IFile jarIFile = outputFolder.getFile(libProject.getName().toLowerCase() +
+ SdkConstants.DOT_JAR);
+
+ // get the source folder for the library project
+ List<IPath> srcs = BaseProjectHelper.getSourceClasspaths(libProject);
+ // find the first non-derived source folder.
+ IPath sourceFolder = null;
+ for (IPath src : srcs) {
+ IFolder srcFolder = workspaceRoot.getFolder(src);
+ if (srcFolder.isDerived() == false) {
+ sourceFolder = src;
+ break;
+ }
+ }
+
+ // we can directly add a CPE for this jar as there's no risk of a duplicate.
+ IClasspathEntry entry = JavaCore.newLibraryEntry(
+ jarIFile.getLocation(),
+ sourceFolder, // source attachment path
+ null, // default source attachment root path.
+ true /*isExported*/);
+
+ entries.add(entry);
+ }
+ }
+
+ entries.addAll(convertJarsToClasspathEntries(iProject, jarFiles));
+
+ return allocateContainer(javaProject, entries, new Path(CONTAINER_DEPENDENCIES),
+ "Android Dependencies");
+ }
+
+ private static IClasspathContainer allocateContainer(IJavaProject javaProject,
+ List<IClasspathEntry> entries, IPath id, String description) {
+
+ if (AdtPlugin.getDefault() == null) { // This is totally weird, but I've seen it happen!
+ return null;
+ }
+
+ // First check that the project has a library-type container.
+ try {
+ IClasspathEntry[] rawClasspath = javaProject.getRawClasspath();
+ final IClasspathEntry[] oldRawClasspath = rawClasspath;
+
+ boolean foundContainer = false;
+ for (IClasspathEntry entry : rawClasspath) {
+ // get the entry and kind
+ final int kind = entry.getEntryKind();
+
+ if (kind == IClasspathEntry.CPE_CONTAINER) {
+ String path = entry.getPath().toString();
+ String idString = id.toString();
+ if (idString.equals(path)) {
+ foundContainer = true;
+ break;
+ }
+ }
+ }
+
+ // if there isn't any, add it.
+ if (foundContainer == false) {
+ // add the android container to the array
+ rawClasspath = ProjectHelper.addEntryToClasspath(rawClasspath,
+ JavaCore.newContainerEntry(id, true /*isExported*/));
+ }
+
+ // set the new list of entries to the project
+ if (rawClasspath != oldRawClasspath) {
+ javaProject.setRawClasspath(rawClasspath, new NullProgressMonitor());
+ }
+ } catch (JavaModelException e) {
+ // This really shouldn't happen, but if it does, simply return null (the calling
+ // method will fails as well)
+ return null;
+ }
+
return new AndroidClasspathContainer(
entries.toArray(new IClasspathEntry[entries.size()]),
- new Path(AdtConstants.CONTAINER_LIBRARIES),
- "Android Dependencies",
+ id,
+ description,
IClasspathContainer.K_APPLICATION);
}
@@ -445,7 +496,7 @@ public class LibraryClasspathContainerInitializer extends BaseClasspathContainer
if (classpaths != null) {
for (IClasspathEntry e : classpaths) {
// ignore entries that are not exported
- if (e.isExported()) {
+ if (!e.getPath().toString().equals(CONTAINER_DEPENDENCIES) && e.isExported()) {
processCPE(e, javaProject, wsRoot, projects, jarFiles, includeJarFiles);
}
}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/project/ProjectHelper.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/project/ProjectHelper.java
index cb58b02..5a83427 100644
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/project/ProjectHelper.java
+++ b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/project/ProjectHelper.java
@@ -299,6 +299,7 @@ public final class ProjectHelper {
boolean foundFrameworkContainer = false;
boolean foundLibrariesContainer = false;
+ boolean foundDependenciesContainer = false;
for (int i = 0 ; i < entries.length ;) {
// get the entry and kind
@@ -319,9 +320,12 @@ public final class ProjectHelper {
if (AdtConstants.CONTAINER_FRAMEWORK.equals(path)) {
foundFrameworkContainer = true;
}
- if (AdtConstants.CONTAINER_LIBRARIES.equals(path)) {
+ if (AdtConstants.CONTAINER_PRIVATE_LIBRARIES.equals(path)) {
foundLibrariesContainer = true;
}
+ if (AdtConstants.CONTAINER_DEPENDENCIES.equals(path)) {
+ foundDependenciesContainer = true;
+ }
}
i++;
@@ -336,9 +340,16 @@ public final class ProjectHelper {
// same thing for the library container
if (foundLibrariesContainer == false) {
- // add the android container to the array
+ // add the exported libraries android container to the array
+ entries = ProjectHelper.addEntryToClasspath(entries,
+ JavaCore.newContainerEntry(new Path(AdtConstants.CONTAINER_PRIVATE_LIBRARIES), true));
+ }
+
+ // same thing for the dependencies container
+ if (foundDependenciesContainer == false) {
+ // add the android dependencies container to the array
entries = ProjectHelper.addEntryToClasspath(entries,
- JavaCore.newContainerEntry(new Path(AdtConstants.CONTAINER_LIBRARIES)));
+ JavaCore.newContainerEntry(new Path(AdtConstants.CONTAINER_DEPENDENCIES)));
}
// set the new list of entries to the project
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/sdk/Sdk.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/sdk/Sdk.java
index ad2648f..ed97af9 100644
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/sdk/Sdk.java
+++ b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/sdk/Sdk.java
@@ -72,6 +72,7 @@ import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.JavaCore;
+import org.eclipse.jdt.core.JavaModelException;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.ui.IEditorDescriptor;
import org.eclipse.ui.IEditorInput;
@@ -1107,6 +1108,12 @@ public final class Sdk {
// Correct file editor associations.
fixEditorAssociations(openedProject);
+ try {
+ ProjectHelper.fixProjectClasspathEntries(JavaCore.create(openedProject));
+ } catch (JavaModelException e) {
+ AdtPlugin.log(e, "error fixing classpath entries");
+ }
+
if (DEBUG) {
System.out.println("<<<");
}
diff --git a/eclipse/plugins/com.android.ide.eclipse.ddms/src/com/android/ide/eclipse/ddms/systrace/SystraceOptionsDialogV1.java b/eclipse/plugins/com.android.ide.eclipse.ddms/src/com/android/ide/eclipse/ddms/systrace/SystraceOptionsDialogV1.java
index cacedd7..d4b5e5b 100644
--- a/eclipse/plugins/com.android.ide.eclipse.ddms/src/com/android/ide/eclipse/ddms/systrace/SystraceOptionsDialogV1.java
+++ b/eclipse/plugins/com.android.ide.eclipse.ddms/src/com/android/ide/eclipse/ddms/systrace/SystraceOptionsDialogV1.java
@@ -347,7 +347,7 @@ public class SystraceOptionsDialogV1 extends TitleAreaDialog implements ISystrac
if (mAmTagBtn.getSelection()) mOptions.enableTag(SystraceOptions.TAG_AM);
if (mSyncTagBtn.getSelection()) mOptions.enableTag(SystraceOptions.TAG_SYNC);
if (mAudioTagBtn.getSelection()) mOptions.enableTag(SystraceOptions.TAG_AUDIO);
- if (mViewTagBtn.getSelection()) mOptions.enableTag(SystraceOptions.TAG_VIDEO);
+ if (mVideoTagBtn.getSelection()) mOptions.enableTag(SystraceOptions.TAG_VIDEO);
if (mCameraTagBtn.getSelection()) mOptions.enableTag(SystraceOptions.TAG_CAMERA);
// save current selections to be restored if the dialog is invoked again
@@ -366,7 +366,7 @@ public class SystraceOptionsDialogV1 extends TitleAreaDialog implements ISystrac
sAmTag = mAmTagBtn.getSelection();
sSyncTag = mSyncTagBtn.getSelection();
sAudioTag = mAudioTagBtn.getSelection();
- sViewTag = mViewTagBtn.getSelection();
+ sVideoTag = mVideoTagBtn.getSelection();
sCameraTag = mCameraTagBtn.getSelection();
super.okPressed();
diff --git a/eclipse/scripts/build_server.sh b/eclipse/scripts/build_server.sh
index 4efd609..e96abe1 100755
--- a/eclipse/scripts/build_server.sh
+++ b/eclipse/scripts/build_server.sh
@@ -24,6 +24,7 @@ DEST_DIR=""
BUILD_NUMBER=""
CREATE_ZIP="1"
INTERNAL_BUILD=""
+ADT_PREVIEW="preview" # "preview" for preview builds, "" for final release builds.
function get_params() {
# parse input parameters
@@ -60,10 +61,10 @@ function check_params() {
[ -n "$DEST_DIR" ] || die "Usage: $0 <destination-directory> [build-number]"
[ -d "$DEST_DIR" ] || die "Destination directory $DEST_DIR must exist."
- # Qualifier is "v" followed by date/time in YYYYMMDDHHSS format and the optional
- # build number.
+ # Qualifier is "v" followed by date/time in YYYYMMDDHHSS format, an optional "preview"
+ # tag and the optional build number.
DATE=`date +v%Y%m%d%H%M`
- QUALIFIER="$DATE"
+ QUALIFIER="${DATE}-$ADT_PREVIEW"
[ -n "$BUILD_NUMBER" ] && QUALIFIER="${QUALIFIER}-${BUILD_NUMBER}"
return 0
@@ -76,14 +77,15 @@ function build_plugin() {
# runs if any.
BUILD_PREFIX="android-eclipse"
if [ "$INTERNAL_BUILD" ]; then
- # append 'eng' signifier to end of archive name to denote internal build
+ # append 'eng' qualifier to end of archive name to denote internal build
BUILD_PREFIX="${BUILD_PREFIX}-eng"
fi
# exclude date from build-zip name so it can be auto-calculated by continuous
# test process unless there's no build number, in which case the date is
# still used (useful for testing)
- ZIP_NAME="${BUILD_PREFIX}-${BUILD_NUMBER:-$DATE}.zip"
+ local preview="${ADT_PREVIEW:+-}${ADT_PREVIEW}"
+ ZIP_NAME="${BUILD_PREFIX}${preview}-${BUILD_NUMBER:-$DATE}.zip"
[ -d "$DEST_DIR/$BUILD_PREFIX" ] || rm -rfv "$DEST_DIR/$BUILD_PREFIX"
# Perform the Eclipse build and move the result in $DEST_DIR/android-build
@@ -111,6 +113,7 @@ function build_plugin() {
}
function build_adt_ide() {
+ local preview="${ADT_PREVIEW}${ADT_PREVIEW:+-}"
if [[ -z $INTERNAL_BUILD ]]; then
# This needs to run from the top android directory
D="$PROG_DIR"
@@ -118,7 +121,7 @@ function build_adt_ide() {
for sc in */*/*/build_ide*.sh; do
if [[ -x $sc ]]; then
echo "RUNNING $sc from $PWD"
- $sc "$DEST_DIR" "$QUALIFIER" "${BUILD_NUMBER:-$QUALIFIER}"
+ $sc "$DEST_DIR" "$QUALIFIER" "${preview}${BUILD_NUMBER:-$QUALIFIER}"
else
echo "WARNING: skipping non-exec $sc script"
fi
diff --git a/templates/activities/BlankActivity/globals.xml.ftl b/templates/activities/BlankActivity/globals.xml.ftl
index 6220005..11aabd7 100644
--- a/templates/activities/BlankActivity/globals.xml.ftl
+++ b/templates/activities/BlankActivity/globals.xml.ftl
@@ -1,5 +1,8 @@
<?xml version="1.0"?>
<globals>
+ <global id="projectOut" value="." />
+ <global id="manifestOut" value="." />
<global id="srcOut" value="src/${slashedPackageName(packageName)}" />
+ <global id="resOut" value="res" />
<global id="menuName" value="${classToResource(activityClass)}" />
</globals>
diff --git a/templates/activities/BlankActivity/recipe.xml.ftl b/templates/activities/BlankActivity/recipe.xml.ftl
index 78bd8b2..148b09d 100644
--- a/templates/activities/BlankActivity/recipe.xml.ftl
+++ b/templates/activities/BlankActivity/recipe.xml.ftl
@@ -1,32 +1,37 @@
<?xml version="1.0"?>
<recipe>
- <merge from="AndroidManifest.xml.ftl" />
+ <merge from="AndroidManifest.xml.ftl"
+ to="${manifestOut}/AndroidManifest.xml" />
<instantiate from="res/menu/main.xml.ftl"
- to="res/menu/${menuName}.xml" />
+ to="${resOut}/menu/${menuName}.xml" />
- <merge from="res/values/strings.xml.ftl" />
+ <merge from="res/values/strings.xml.ftl"
+ to="${resOut}/values/strings.xml" />
- <merge from="res/values/dimens.xml" />
- <merge from="res/values-sw600dp/dimens.xml" />
- <merge from="res/values-sw720dp-land/dimens.xml" />
+ <merge from="res/values/dimens.xml"
+ to="${resOut}/values/dimens.xml" />
+ <merge from="res/values-sw600dp/dimens.xml"
+ to="${resOut}/values-sw600dp/dimens.xml" />
+ <merge from="res/values-sw720dp-land/dimens.xml"
+ to="${resOut}/values-sw720dp-land/dimens.xml" />
<!-- Decide what kind of layout to add (viewpager or not) -->
<#if navType?contains("pager")>
<instantiate from="res/layout/activity_pager.xml.ftl"
- to="res/layout/${layoutName}.xml" />
+ to="${resOut}/layout/${layoutName}.xml" />
<instantiate from="res/layout/fragment_dummy.xml.ftl"
- to="res/layout/fragment_${classToResource(activityClass)}_dummy.xml" />
+ to="${resOut}/layout/fragment_${classToResource(activityClass)}_dummy.xml" />
<#elseif navType == "tabs" || navType == "dropdown">
<instantiate from="res/layout/activity_fragment_container.xml"
- to="res/layout/${layoutName}.xml" />
+ to="${resOut}/layout/${layoutName}.xml" />
<instantiate from="res/layout/fragment_dummy.xml.ftl"
- to="res/layout/fragment_${classToResource(activityClass)}_dummy.xml" />
+ to="${resOut}/layout/fragment_${classToResource(activityClass)}_dummy.xml" />
<#else>
<instantiate from="res/layout/activity_simple.xml.ftl"
- to="res/layout/${layoutName}.xml" />
+ to="${resOut}/layout/${layoutName}.xml" />
</#if>
<!-- Decide which activity code to add -->
@@ -48,5 +53,5 @@
</#if>
- <open file="res/layout/${layoutName}.xml" />
+ <open file="${resOut}/layout/${layoutName}.xml" />
</recipe>
diff --git a/templates/activities/FullscreenActivity/globals.xml.ftl b/templates/activities/FullscreenActivity/globals.xml.ftl
index a416d3a..6d73e17 100644
--- a/templates/activities/FullscreenActivity/globals.xml.ftl
+++ b/templates/activities/FullscreenActivity/globals.xml.ftl
@@ -1,5 +1,8 @@
<?xml version="1.0"?>
<globals>
+ <global id="projectOut" value="." />
+ <global id="manifestOut" value="." />
<global id="srcOut" value="src/${slashedPackageName(packageName)}" />
+ <global id="resOut" value="res" />
<global id="simpleName" value="${activityToLayout(activityClass)}" />
</globals>
diff --git a/templates/activities/FullscreenActivity/recipe.xml.ftl b/templates/activities/FullscreenActivity/recipe.xml.ftl
index 1e41e5f..b3e1f20 100644
--- a/templates/activities/FullscreenActivity/recipe.xml.ftl
+++ b/templates/activities/FullscreenActivity/recipe.xml.ftl
@@ -1,16 +1,21 @@
<?xml version="1.0"?>
<recipe>
- <merge from="AndroidManifest.xml.ftl" />
+ <merge from="AndroidManifest.xml.ftl"
+ to="${manifestOut}/AndroidManifest.xml" />
- <merge from="res/values/attrs.xml" />
- <merge from="res/values/colors.xml" />
- <merge from="res/values/styles.xml" />
- <merge from="res/values-v11/styles.xml" />
+ <merge from="res/values/attrs.xml"
+ to="${resOut}/values/attrs.xml" />
+ <merge from="res/values/colors.xml"
+ to="${resOut}/values/colors.xml" />
+ <merge from="res/values/styles.xml"
+ to="${resOut}/values/styles.xml" />
+ <merge from="res/values-v11/styles.xml"
+ to="${resOut}/values-v11/styles.xml" />
<instantiate from="res/layout/activity_fullscreen.xml.ftl"
- to="res/layout/${layoutName}.xml" />
+ to="${resOut}/layout/${layoutName}.xml" />
<merge from="res/values/strings.xml.ftl"
- to="res/values/strings.xml" />
+ to="${resOut}/values/strings.xml" />
<instantiate from="src/app_package/FullscreenActivity.java.ftl"
to="${srcOut}/${activityClass}.java" />
@@ -21,5 +26,5 @@
<instantiate from="src/app_package/util/SystemUiHiderHoneycomb.java.ftl"
to="${srcOut}/util/SystemUiHiderHoneycomb.java" />
- <open file="res/layout/${layoutName}.xml" />
+ <open file="${resOut}/layout/${layoutName}.xml" />
</recipe>
diff --git a/templates/activities/FullscreenActivity/root/res/values/attrs.xml b/templates/activities/FullscreenActivity/root/res/values/attrs.xml
index 0201588..2cf1a1a 100644
--- a/templates/activities/FullscreenActivity/root/res/values/attrs.xml
+++ b/templates/activities/FullscreenActivity/root/res/values/attrs.xml
@@ -9,4 +9,4 @@
<attr name="buttonBarButtonStyle" format="reference" />
</declare-styleable>
-</resources> \ No newline at end of file
+</resources>
diff --git a/templates/activities/LoginActivity/globals.xml.ftl b/templates/activities/LoginActivity/globals.xml.ftl
index 62dfd8d..fbe8985 100644
--- a/templates/activities/LoginActivity/globals.xml.ftl
+++ b/templates/activities/LoginActivity/globals.xml.ftl
@@ -1,6 +1,9 @@
<?xml version="1.0"?>
<globals>
+ <global id="projectOut" value="." />
+ <global id="manifestOut" value="." />
<global id="srcOut" value="src/${slashedPackageName(packageName)}" />
+ <global id="resOut" value="res" />
<global id="menuName" value="${classToResource(activityClass)}" />
<global id="simpleName" value="${activityToLayout(activityClass)}" />
</globals>
diff --git a/templates/activities/LoginActivity/recipe.xml.ftl b/templates/activities/LoginActivity/recipe.xml.ftl
index ece4285..58d823f 100644
--- a/templates/activities/LoginActivity/recipe.xml.ftl
+++ b/templates/activities/LoginActivity/recipe.xml.ftl
@@ -1,19 +1,22 @@
<?xml version="1.0"?>
<recipe>
- <merge from="AndroidManifest.xml.ftl" />
+ <merge from="AndroidManifest.xml.ftl"
+ to="${manifestOut}/AndroidManifest.xml" />
- <merge from="res/values/styles.xml" />
- <merge from="res/values-large/styles.xml" />
+ <merge from="res/values/styles.xml"
+ to="${resOut}/values/styles.xml" />
+ <merge from="res/values-large/styles.xml"
+ to="${resOut}/values-large/styles.xml" />
<copy from="res/menu/activity_login.xml"
- to="res/menu/${menuName}.xml" />
+ to="${resOut}/menu/${menuName}.xml" />
<instantiate from="res/layout/activity_login.xml.ftl"
- to="res/layout/${layoutName}.xml" />
+ to="${resOut}/layout/${layoutName}.xml" />
<instantiate from="res/values/strings.xml.ftl"
- to="res/values/strings_${simpleName}.xml" />
+ to="${resOut}/values/strings_${simpleName}.xml" />
<instantiate from="src/app_package/LoginActivity.java.ftl"
to="${srcOut}/${activityClass}.java" />
- <open file="res/layout/${layoutName}.xml" />
+ <open file="${resOut}/layout/${layoutName}.xml" />
</recipe>
diff --git a/templates/activities/MasterDetailFlow/globals.xml.ftl b/templates/activities/MasterDetailFlow/globals.xml.ftl
index 952e278..415d60e 100644
--- a/templates/activities/MasterDetailFlow/globals.xml.ftl
+++ b/templates/activities/MasterDetailFlow/globals.xml.ftl
@@ -1,6 +1,9 @@
<?xml version="1.0"?>
<globals>
+ <global id="projectOut" value="." />
+ <global id="manifestOut" value="." />
<global id="srcOut" value="src/${slashedPackageName(packageName)}" />
+ <global id="resOut" value="res" />
<global id="CollectionName" value="${extractLetters(objectKind)}List" />
<global id="collection_name" value="${extractLetters(objectKind?lower_case)}_list" />
<global id="DetailName" value="${extractLetters(objectKind)}Detail" />
diff --git a/templates/activities/MasterDetailFlow/recipe.xml.ftl b/templates/activities/MasterDetailFlow/recipe.xml.ftl
index 8b09c84..c06e517 100644
--- a/templates/activities/MasterDetailFlow/recipe.xml.ftl
+++ b/templates/activities/MasterDetailFlow/recipe.xml.ftl
@@ -1,19 +1,23 @@
<?xml version="1.0"?>
<recipe>
- <merge from="AndroidManifest.xml.ftl" />
+ <merge from="AndroidManifest.xml.ftl"
+ to="${manifestOut}/AndroidManifest.xml" />
- <merge from="res/values-large/refs.xml.ftl" />
- <merge from="res/values-sw600dp/refs.xml.ftl" />
- <merge from="res/values/strings.xml.ftl" />
+ <merge from="res/values-large/refs.xml.ftl"
+ to="${resOut}/values-large/refs.xml" />
+ <merge from="res/values-sw600dp/refs.xml.ftl"
+ to="${resOut}/values-sw600dp/refs.xml" />
+ <merge from="res/values/strings.xml.ftl"
+ to="${resOut}/values/strings.xml" />
<instantiate from="res/layout/activity_content_detail.xml.ftl"
- to="res/layout/activity_${detail_name}.xml" />
+ to="${resOut}/layout/activity_${detail_name}.xml" />
<instantiate from="res/layout/activity_content_list.xml.ftl"
- to="res/layout/activity_${collection_name}.xml" />
+ to="${resOut}/layout/activity_${collection_name}.xml" />
<instantiate from="res/layout/activity_content_twopane.xml.ftl"
- to="res/layout/activity_${extractLetters(objectKind?lower_case)}_twopane.xml" />
+ to="${resOut}/layout/activity_${extractLetters(objectKind?lower_case)}_twopane.xml" />
<instantiate from="res/layout/fragment_content_detail.xml.ftl"
- to="res/layout/fragment_${detail_name}.xml" />
+ to="${resOut}/layout/fragment_${detail_name}.xml" />
<instantiate from="src/app_package/ContentDetailActivity.java.ftl"
to="${srcOut}/${DetailName}Activity.java" />
diff --git a/templates/activities/SettingsActivity/globals.xml.ftl b/templates/activities/SettingsActivity/globals.xml.ftl
index a416d3a..6d73e17 100644
--- a/templates/activities/SettingsActivity/globals.xml.ftl
+++ b/templates/activities/SettingsActivity/globals.xml.ftl
@@ -1,5 +1,8 @@
<?xml version="1.0"?>
<globals>
+ <global id="projectOut" value="." />
+ <global id="manifestOut" value="." />
<global id="srcOut" value="src/${slashedPackageName(packageName)}" />
+ <global id="resOut" value="res" />
<global id="simpleName" value="${activityToLayout(activityClass)}" />
</globals>
diff --git a/templates/activities/SettingsActivity/recipe.xml.ftl b/templates/activities/SettingsActivity/recipe.xml.ftl
index e315963..6f68147 100644
--- a/templates/activities/SettingsActivity/recipe.xml.ftl
+++ b/templates/activities/SettingsActivity/recipe.xml.ftl
@@ -1,14 +1,19 @@
<?xml version="1.0"?>
<recipe>
- <merge from="AndroidManifest.xml.ftl" />
+ <merge from="AndroidManifest.xml.ftl"
+ to="${manifestOut}/AndroidManifest.xml" />
- <copy from="res/xml/pref_data_sync.xml" />
- <copy from="res/xml/pref_general.xml" />
- <merge from="res/xml/pref_headers.xml.ftl" />
- <copy from="res/xml/pref_notification.xml" />
+ <copy from="res/xml/pref_data_sync.xml"
+ to="${resOut}/xml/pref_data_sync.xml" />
+ <copy from="res/xml/pref_general.xml"
+ to="${resOut}/xml/pref_general.xml" />
+ <merge from="res/xml/pref_headers.xml.ftl"
+ to="${resOut}/xml/pref_headers.xml" />
+ <copy from="res/xml/pref_notification.xml"
+ to="${resOut}/xml/pref_notification.xml" />
<instantiate from="res/values/strings.xml.ftl"
- to="res/values/strings_${simpleName}.xml" />
+ to="${resOut}/values/strings_${simpleName}.xml" />
<instantiate from="src/app_package/SettingsActivity.java.ftl"
to="${srcOut}/${activityClass}.java" />
diff --git a/templates/gradle/wrapper/gradle/wrapper/gradle-wrapper.jar b/templates/gradle/wrapper/gradle/wrapper/gradle-wrapper.jar
new file mode 100644
index 0000000..8c0fb64
--- /dev/null
+++ b/templates/gradle/wrapper/gradle/wrapper/gradle-wrapper.jar
Binary files differ
diff --git a/templates/gradle/wrapper/gradle/wrapper/gradle-wrapper.properties b/templates/gradle/wrapper/gradle/wrapper/gradle-wrapper.properties
new file mode 100644
index 0000000..d67ba29
--- /dev/null
+++ b/templates/gradle/wrapper/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-snapshots/gradle-1.6-20130404052254+0000-bin.zip
diff --git a/templates/gradle/wrapper/gradlew b/templates/gradle/wrapper/gradlew
new file mode 100755
index 0000000..91a7e26
--- /dev/null
+++ b/templates/gradle/wrapper/gradlew
@@ -0,0 +1,164 @@
+#!/usr/bin/env bash
+
+##############################################################################
+##
+## Gradle start up script for UN*X
+##
+##############################################################################
+
+# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+DEFAULT_JVM_OPTS=""
+
+APP_NAME="Gradle"
+APP_BASE_NAME=`basename "$0"`
+
+# Use the maximum available, or set MAX_FD != -1 to use that value.
+MAX_FD="maximum"
+
+warn ( ) {
+ echo "$*"
+}
+
+die ( ) {
+ echo
+ echo "$*"
+ echo
+ exit 1
+}
+
+# OS specific support (must be 'true' or 'false').
+cygwin=false
+msys=false
+darwin=false
+case "`uname`" in
+ CYGWIN* )
+ cygwin=true
+ ;;
+ Darwin* )
+ darwin=true
+ ;;
+ MINGW* )
+ msys=true
+ ;;
+esac
+
+# For Cygwin, ensure paths are in UNIX format before anything is touched.
+if $cygwin ; then
+ [ -n "$JAVA_HOME" ] && JAVA_HOME=`cygpath --unix "$JAVA_HOME"`
+fi
+
+# Attempt to set APP_HOME
+# Resolve links: $0 may be a link
+PRG="$0"
+# Need this for relative symlinks.
+while [ -h "$PRG" ] ; do
+ ls=`ls -ld "$PRG"`
+ link=`expr "$ls" : '.*-> \(.*\)$'`
+ if expr "$link" : '/.*' > /dev/null; then
+ PRG="$link"
+ else
+ PRG=`dirname "$PRG"`"/$link"
+ fi
+done
+SAVED="`pwd`"
+cd "`dirname \"$PRG\"`/" >&-
+APP_HOME="`pwd -P`"
+cd "$SAVED" >&-
+
+CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
+
+# Determine the Java command to use to start the JVM.
+if [ -n "$JAVA_HOME" ] ; then
+ if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
+ # IBM's JDK on AIX uses strange locations for the executables
+ JAVACMD="$JAVA_HOME/jre/sh/java"
+ else
+ JAVACMD="$JAVA_HOME/bin/java"
+ fi
+ if [ ! -x "$JAVACMD" ] ; then
+ die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+ fi
+else
+ JAVACMD="java"
+ which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+fi
+
+# Increase the maximum file descriptors if we can.
+if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then
+ MAX_FD_LIMIT=`ulimit -H -n`
+ if [ $? -eq 0 ] ; then
+ if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
+ MAX_FD="$MAX_FD_LIMIT"
+ fi
+ ulimit -n $MAX_FD
+ if [ $? -ne 0 ] ; then
+ warn "Could not set maximum file descriptor limit: $MAX_FD"
+ fi
+ else
+ warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
+ fi
+fi
+
+# For Darwin, add options to specify how the application appears in the dock
+if $darwin; then
+ GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
+fi
+
+# For Cygwin, switch paths to Windows format before running java
+if $cygwin ; then
+ APP_HOME=`cygpath --path --mixed "$APP_HOME"`
+ CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
+
+ # We build the pattern for arguments to be converted via cygpath
+ ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
+ SEP=""
+ for dir in $ROOTDIRSRAW ; do
+ ROOTDIRS="$ROOTDIRS$SEP$dir"
+ SEP="|"
+ done
+ OURCYGPATTERN="(^($ROOTDIRS))"
+ # Add a user-defined pattern to the cygpath arguments
+ if [ "$GRADLE_CYGPATTERN" != "" ] ; then
+ OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
+ fi
+ # Now convert the arguments - kludge to limit ourselves to /bin/sh
+ i=0
+ for arg in "$@" ; do
+ CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
+ CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
+
+ if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
+ eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
+ else
+ eval `echo args$i`="\"$arg\""
+ fi
+ i=$((i+1))
+ done
+ case $i in
+ (0) set -- ;;
+ (1) set -- "$args0" ;;
+ (2) set -- "$args0" "$args1" ;;
+ (3) set -- "$args0" "$args1" "$args2" ;;
+ (4) set -- "$args0" "$args1" "$args2" "$args3" ;;
+ (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
+ (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
+ (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
+ (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
+ (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
+ esac
+fi
+
+# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules
+function splitJvmOpts() {
+ JVM_OPTS=("$@")
+}
+eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS
+JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME"
+
+exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@"
diff --git a/templates/gradle/wrapper/gradlew.bat b/templates/gradle/wrapper/gradlew.bat
new file mode 100644
index 0000000..aec9973
--- /dev/null
+++ b/templates/gradle/wrapper/gradlew.bat
@@ -0,0 +1,90 @@
+@if "%DEBUG%" == "" @echo off
+@rem ##########################################################################
+@rem
+@rem Gradle startup script for Windows
+@rem
+@rem ##########################################################################
+
+@rem Set local scope for the variables with windows NT shell
+if "%OS%"=="Windows_NT" setlocal
+
+@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+set DEFAULT_JVM_OPTS=
+
+set DIRNAME=%~dp0
+if "%DIRNAME%" == "" set DIRNAME=.
+set APP_BASE_NAME=%~n0
+set APP_HOME=%DIRNAME%
+
+@rem Find java.exe
+if defined JAVA_HOME goto findJavaFromJavaHome
+
+set JAVA_EXE=java.exe
+%JAVA_EXE% -version >NUL 2>&1
+if "%ERRORLEVEL%" == "0" goto init
+
+echo.
+echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:findJavaFromJavaHome
+set JAVA_HOME=%JAVA_HOME:"=%
+set JAVA_EXE=%JAVA_HOME%/bin/java.exe
+
+if exist "%JAVA_EXE%" goto init
+
+echo.
+echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:init
+@rem Get command-line arguments, handling Windowz variants
+
+if not "%OS%" == "Windows_NT" goto win9xME_args
+if "%@eval[2+2]" == "4" goto 4NT_args
+
+:win9xME_args
+@rem Slurp the command line arguments.
+set CMD_LINE_ARGS=
+set _SKIP=2
+
+:win9xME_args_slurp
+if "x%~1" == "x" goto execute
+
+set CMD_LINE_ARGS=%*
+goto execute
+
+:4NT_args
+@rem Get arguments from the 4NT Shell from JP Software
+set CMD_LINE_ARGS=%$
+
+:execute
+@rem Setup the command line
+
+set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
+
+@rem Execute Gradle
+"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
+
+:end
+@rem End local scope for the variables with windows NT shell
+if "%ERRORLEVEL%"=="0" goto mainEnd
+
+:fail
+rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
+rem the _cmd.exe /c_ return code!
+if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
+exit /b 1
+
+:mainEnd
+if "%OS%"=="Windows_NT" endlocal
+
+:omega
diff --git a/templates/projects/NewAndroidApplication/globals.xml.ftl b/templates/projects/NewAndroidApplication/globals.xml.ftl
index bfc27eb..2565dcd 100644
--- a/templates/projects/NewAndroidApplication/globals.xml.ftl
+++ b/templates/projects/NewAndroidApplication/globals.xml.ftl
@@ -1,4 +1,10 @@
<?xml version="1.0"?>
<globals>
+ <global id="isGradle" value="false" />
+ <global id="topOut" value="." />
+ <global id="projectOut" value="." />
+ <global id="manifestOut" value="." />
<global id="srcOut" value="src/${slashedPackageName(packageName)}" />
+ <global id="resOut" value="res" />
+ <global id="mavenUrl" value="" />
</globals>
diff --git a/templates/projects/NewAndroidApplication/recipe.xml.ftl b/templates/projects/NewAndroidApplication/recipe.xml.ftl
index bc8f02e..79210a9 100644
--- a/templates/projects/NewAndroidApplication/recipe.xml.ftl
+++ b/templates/projects/NewAndroidApplication/recipe.xml.ftl
@@ -1,21 +1,33 @@
<?xml version="1.0"?>
<recipe>
- <instantiate from="AndroidManifest.xml.ftl" />
+<#if isGradle == "true">
+ <merge from="settings.gradle.ftl"
+ to="${topOut}/settings.gradle" />
+ <instantiate from="build.gradle.ftl"
+ to="${projectOut}/build.gradle" />
+</#if>
+ <instantiate from="AndroidManifest.xml.ftl"
+ to="${manifestOut}/AndroidManifest.xml" />
<#if copyIcons>
- <copy from="res/drawable-hdpi" />
- <copy from="res/drawable-mdpi" />
- <copy from="res/drawable-xhdpi" />
+ <copy from="res/drawable-hdpi"
+ to="${resOut}/drawable-hdpi" />
+ <copy from="res/drawable-mdpi"
+ to="${resOut}/drawable-mdpi" />
+ <copy from="res/drawable-xhdpi"
+ to="${resOut}/drawable-xhdpi" />
</#if>
- <instantiate from="res/values/styles.xml.ftl" />
+ <instantiate from="res/values/styles.xml.ftl"
+ to="${resOut}/values/styles.xml" />
<#if buildApi gte 11 && baseTheme != "none">
<instantiate from="res/values-v11/styles_hc.xml.ftl"
- to="res/values-v11/styles.xml" />
+ to="${resOut}/values-v11/styles.xml" />
</#if>
<#if buildApi gte 14 && baseTheme?contains("darkactionbar")>
<copy from="res/values-v14/styles_ics.xml"
- to="res/values-v14/styles.xml" />
+ to="${resOut}/values-v14/styles.xml" />
</#if>
- <instantiate from="res/values/strings.xml.ftl" />
+ <instantiate from="res/values/strings.xml.ftl"
+ to="${resOut}/values/strings.xml" />
</recipe>
diff --git a/templates/projects/NewAndroidApplication/root/build.gradle.ftl b/templates/projects/NewAndroidApplication/root/build.gradle.ftl
new file mode 100644
index 0000000..0232c7e
--- /dev/null
+++ b/templates/projects/NewAndroidApplication/root/build.gradle.ftl
@@ -0,0 +1,24 @@
+buildscript {
+ repositories {
+ maven { url '${mavenUrl}/prebuilts-repo' }
+ maven { url '${mavenUrl}/tools-repo' }
+ }
+ dependencies {
+ classpath 'com.android.tools.build:gradle:0.4-SNAPSHOT'
+ }
+}
+apply plugin: 'android'
+
+dependencies {
+ compile files('libs/android-support-v4.jar')
+}
+
+android {
+ compileSdkVersion ${buildApi}
+ buildToolsVersion "${buildApi}"
+
+ defaultConfig {
+ minSdkVersion ${minApi}
+ targetSdkVersion ${targetApi}
+ }
+}
diff --git a/templates/projects/NewAndroidApplication/root/settings.gradle.ftl b/templates/projects/NewAndroidApplication/root/settings.gradle.ftl
new file mode 100644
index 0000000..b12004b
--- /dev/null
+++ b/templates/projects/NewAndroidApplication/root/settings.gradle.ftl
@@ -0,0 +1 @@
+include ':${projectName}'
diff --git a/templates/projects/NewAndroidLibrary/globals.xml.ftl b/templates/projects/NewAndroidLibrary/globals.xml.ftl
new file mode 100644
index 0000000..2565dcd
--- /dev/null
+++ b/templates/projects/NewAndroidLibrary/globals.xml.ftl
@@ -0,0 +1,10 @@
+<?xml version="1.0"?>
+<globals>
+ <global id="isGradle" value="false" />
+ <global id="topOut" value="." />
+ <global id="projectOut" value="." />
+ <global id="manifestOut" value="." />
+ <global id="srcOut" value="src/${slashedPackageName(packageName)}" />
+ <global id="resOut" value="res" />
+ <global id="mavenUrl" value="" />
+</globals>
diff --git a/templates/projects/NewAndroidLibrary/recipe.xml.ftl b/templates/projects/NewAndroidLibrary/recipe.xml.ftl
new file mode 100644
index 0000000..9999701
--- /dev/null
+++ b/templates/projects/NewAndroidLibrary/recipe.xml.ftl
@@ -0,0 +1,33 @@
+<?xml version="1.0"?>
+<recipe>
+<#if isGradle == "true">
+ <merge from="settings.gradle.ftl"
+ to="${topOut}/settings.gradle" />
+ <instantiate from="build.gradle.ftl"
+ to="${projectOut}/build.gradle" />
+</#if>
+ <instantiate from="MODULE_NAME/src/main/AndroidManifest.xml.ftl"
+ to="${manifestOut}/AndroidManifest.xml" />
+
+<#if copyIcons>
+ <copy from="res/drawable-hdpi"
+ to="${resOut}/drawable-hdpi" />
+ <copy from="res/drawable-mdpi"
+ to="${resOut}/drawable-mdpi" />
+ <copy from="res/drawable-xhdpi"
+ to="${resOut}/drawable-xhdpi" />
+</#if>
+ <instantiate from="res/values/styles.xml.ftl"
+ to="${resOut}/values/styles.xml" />
+<#if buildApi gte 11 && baseTheme != "none">
+ <instantiate from="res/values-v11/styles_hc.xml.ftl"
+ to="${resOut}/values-v11/styles.xml" />
+</#if>
+<#if buildApi gte 14 && baseTheme?contains("darkactionbar")>
+ <copy from="res/values-v14/styles_ics.xml"
+ to="${resOut}/values-v14/styles.xml" />
+</#if>
+
+ <instantiate from="res/values/strings.xml.ftl"
+ to="${resOut}/values/strings.xml" />
+</recipe>
diff --git a/templates/projects/NewAndroidLibrary/root/AndroidManifest.xml.ftl b/templates/projects/NewAndroidLibrary/root/AndroidManifest.xml.ftl
new file mode 100644
index 0000000..390a9da
--- /dev/null
+++ b/templates/projects/NewAndroidLibrary/root/AndroidManifest.xml.ftl
@@ -0,0 +1,15 @@
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+ package="${packageName}"
+ android:versionCode="1"
+ android:versionName="1.0">
+
+ <uses-sdk android:minSdkVersion="${minApi}" <#if buildApi gte 4>android:targetSdkVersion="${targetApi}" </#if>/>
+
+ <application <#if minApiLevel gte 4 && buildApi gte 4>android:allowBackup="true"</#if>
+ android:label="@string/app_name"
+ android:icon="@drawable/ic_launcher"<#if baseTheme != "none">
+ android:theme="@style/AppTheme"</#if>>
+
+ </application>
+
+</manifest>
diff --git a/templates/projects/NewAndroidLibrary/root/build.gradle.ftl b/templates/projects/NewAndroidLibrary/root/build.gradle.ftl
new file mode 100644
index 0000000..12733c7
--- /dev/null
+++ b/templates/projects/NewAndroidLibrary/root/build.gradle.ftl
@@ -0,0 +1,24 @@
+buildscript {
+ repositories {
+ maven { url '${mavenUrl}/prebuilts-repo' }
+ maven { url '${mavenUrl}/tools-repo' }
+ }
+ dependencies {
+ classpath 'com.android.tools.build:gradle:0.4-SNAPSHOT'
+ }
+}
+apply plugin: 'android-library'
+
+dependencies {
+ compile files('libs/android-support-v4.jar')
+}
+
+android {
+ compileSdkVersion ${buildApi}
+ buildToolsVersion "${buildApi}"
+
+ defaultConfig {
+ minSdkVersion ${minApi}
+ targetSdkVersion ${targetApi}
+ }
+}
diff --git a/templates/projects/NewAndroidLibrary/root/res/drawable-hdpi/ic_launcher.png b/templates/projects/NewAndroidLibrary/root/res/drawable-hdpi/ic_launcher.png
new file mode 100755
index 0000000..96a442e
--- /dev/null
+++ b/templates/projects/NewAndroidLibrary/root/res/drawable-hdpi/ic_launcher.png
Binary files differ
diff --git a/templates/projects/NewAndroidLibrary/root/res/drawable-mdpi/ic_launcher.png b/templates/projects/NewAndroidLibrary/root/res/drawable-mdpi/ic_launcher.png
new file mode 100755
index 0000000..359047d
--- /dev/null
+++ b/templates/projects/NewAndroidLibrary/root/res/drawable-mdpi/ic_launcher.png
Binary files differ
diff --git a/templates/projects/NewAndroidLibrary/root/res/drawable-xhdpi/ic_launcher.png b/templates/projects/NewAndroidLibrary/root/res/drawable-xhdpi/ic_launcher.png
new file mode 100755
index 0000000..71c6d76
--- /dev/null
+++ b/templates/projects/NewAndroidLibrary/root/res/drawable-xhdpi/ic_launcher.png
Binary files differ
diff --git a/templates/projects/NewAndroidLibrary/root/res/values-v11/styles_hc.xml.ftl b/templates/projects/NewAndroidLibrary/root/res/values-v11/styles_hc.xml.ftl
new file mode 100644
index 0000000..f8993c3
--- /dev/null
+++ b/templates/projects/NewAndroidLibrary/root/res/values-v11/styles_hc.xml.ftl
@@ -0,0 +1,11 @@
+<resources>
+
+ <!--
+ Base application theme for API 11+. This theme completely replaces
+ AppBaseTheme from res/values/styles.xml on API 11+ devices.
+ -->
+ <style name="AppBaseTheme" parent="android:Theme.Holo<#if baseTheme?contains("light")>.Light</#if>">
+ <!-- API 11 theme customizations can go here. -->
+ </style>
+
+</resources>
diff --git a/templates/projects/NewAndroidLibrary/root/res/values-v14/styles_ics.xml b/templates/projects/NewAndroidLibrary/root/res/values-v14/styles_ics.xml
new file mode 100644
index 0000000..a91fd03
--- /dev/null
+++ b/templates/projects/NewAndroidLibrary/root/res/values-v14/styles_ics.xml
@@ -0,0 +1,12 @@
+<resources>
+
+ <!--
+ Base application theme for API 14+. This theme completely replaces
+ AppBaseTheme from BOTH res/values/styles.xml and
+ res/values-v11/styles.xml on API 14+ devices.
+ -->
+ <style name="AppBaseTheme" parent="android:Theme.Holo.Light.DarkActionBar">
+ <!-- API 14 theme customizations can go here. -->
+ </style>
+
+</resources>
diff --git a/templates/projects/NewAndroidLibrary/root/res/values/strings.xml.ftl b/templates/projects/NewAndroidLibrary/root/res/values/strings.xml.ftl
new file mode 100644
index 0000000..ee03444
--- /dev/null
+++ b/templates/projects/NewAndroidLibrary/root/res/values/strings.xml.ftl
@@ -0,0 +1,3 @@
+<resources>
+ <string name="app_name">${escapeXmlString(appTitle)}</string>
+</resources>
diff --git a/templates/projects/NewAndroidLibrary/root/res/values/styles.xml.ftl b/templates/projects/NewAndroidLibrary/root/res/values/styles.xml.ftl
new file mode 100644
index 0000000..30fe5b5
--- /dev/null
+++ b/templates/projects/NewAndroidLibrary/root/res/values/styles.xml.ftl
@@ -0,0 +1,20 @@
+<resources>
+
+ <!--
+ Base application theme, dependent on API level. This theme is replaced
+ by AppBaseTheme from res/values-vXX/styles.xml on newer devices.
+ -->
+ <style name="AppBaseTheme" parent="android:Theme<#if baseTheme?contains("light")>.Light</#if>">
+ <!--
+ Theme customizations available in newer API levels can go in
+ res/values-vXX/styles.xml, while customizations related to
+ backward-compatibility can go here.
+ -->
+ </style>
+
+ <!-- Application theme. -->
+ <style name="AppTheme" parent="AppBaseTheme">
+ <!-- All customizations that are NOT specific to a particular API-level can go here. -->
+ </style>
+
+</resources>
diff --git a/templates/projects/NewAndroidLibrary/root/settings.gradle.ftl b/templates/projects/NewAndroidLibrary/root/settings.gradle.ftl
new file mode 100644
index 0000000..b12004b
--- /dev/null
+++ b/templates/projects/NewAndroidLibrary/root/settings.gradle.ftl
@@ -0,0 +1 @@
+include ':${projectName}'
diff --git a/templates/projects/NewAndroidLibrary/template.xml b/templates/projects/NewAndroidLibrary/template.xml
new file mode 100644
index 0000000..463643d
--- /dev/null
+++ b/templates/projects/NewAndroidLibrary/template.xml
@@ -0,0 +1,82 @@
+<?xml version="1.0"?>
+<template
+ format="1"
+ revision="1"
+ name="Android Library"
+ description="Creates a new Android library.">
+ <dependency name="android-support-v4" revision="8" />
+
+ <thumbs>
+ <thumb>template_new_project.png</thumb>
+ </thumbs>
+
+ <category value="Applications" />
+
+ <parameter
+ id="packageName"
+ name="Package name"
+ type="string"
+ constraints="package"
+ default="com.mycompany.myapp" />
+
+ <parameter
+ id="appTitle"
+ name="Library title"
+ type="string"
+ constraints="nonempty"
+ default="My Library"/>
+
+ <parameter
+ id="baseTheme"
+ name="Base Theme"
+ type="enum"
+ default="holo_light_darkactionbar"
+ help="The base user interface theme for the library">
+ <option id="none">None</option>
+ <option id="holo_dark" minBuildApi="11">Holo Dark</option>
+ <option id="holo_light" minBuildApi="11">Holo Light</option>
+ <option id="holo_light_darkactionbar" minBuildApi="14" default="true">Holo Light with Dark Action Bar</option>
+ </parameter>
+
+ <parameter
+ id="minApi"
+ name="Minimum API level"
+ type="string"
+ constraints="apilevel"
+ default="7" />
+
+ <!--
+ Usually the same as minApi, but when minApi is a code name this will be the corresponding
+ API level
+ -->
+ <parameter
+ id="minApiLevel"
+ name="Minimum API level"
+ type="string"
+ constraints="apilevel"
+ default="7" />
+
+ <parameter
+ id="targetApi"
+ name="Target API level"
+ type="string"
+ constraints="apilevel"
+ default="16" />
+
+ <parameter
+ id="buildApi"
+ name="Build API level"
+ type="string"
+ constraints="apilevel"
+ default="16" />
+
+ <parameter
+ id="copyIcons"
+ name="Include launcher icons"
+ type="boolean"
+ default="true" />
+
+ <globals file="globals.xml.ftl" />
+ <execute file="recipe.xml.ftl" />
+
+</template>
diff --git a/templates/projects/NewAndroidLibrary/template_new_project.png b/templates/projects/NewAndroidLibrary/template_new_project.png
new file mode 100644
index 0000000..92e8556
--- /dev/null
+++ b/templates/projects/NewAndroidLibrary/template_new_project.png
Binary files differ
diff --git a/templates/projects/NewJavaLibrary/globals.xml.ftl b/templates/projects/NewJavaLibrary/globals.xml.ftl
new file mode 100644
index 0000000..5b9b620
--- /dev/null
+++ b/templates/projects/NewJavaLibrary/globals.xml.ftl
@@ -0,0 +1,7 @@
+<?xml version="1.0"?>
+<globals>
+ <global id="isGradle" value="false" />
+ <global id="topOut" value="." />
+ <global id="projectOut" value="." />
+ <global id="srcOut" value="src/${slashedPackageName(packageName)}" />
+</globals>
diff --git a/templates/projects/NewJavaLibrary/recipe.xml.ftl b/templates/projects/NewJavaLibrary/recipe.xml.ftl
new file mode 100644
index 0000000..e2d943a
--- /dev/null
+++ b/templates/projects/NewJavaLibrary/recipe.xml.ftl
@@ -0,0 +1,11 @@
+<?xml version="1.0"?>
+<recipe>
+<#if isGradle == "true">
+ <merge from="settings.gradle.ftl"
+ to="${topOut}/settings.gradle" />
+ <instantiate from="build.gradle.ftl"
+ to="${projectOut}/build.gradle" />
+</#if>
+ <instantiate from="/src/library_package/Placeholder.java"
+ to="${srcOut}/Placeholder.java" />
+</recipe>
diff --git a/templates/projects/NewJavaLibrary/root/build.gradle.ftl b/templates/projects/NewJavaLibrary/root/build.gradle.ftl
new file mode 100644
index 0000000..bbfeb03
--- /dev/null
+++ b/templates/projects/NewJavaLibrary/root/build.gradle.ftl
@@ -0,0 +1 @@
+apply plugin: 'java'
diff --git a/templates/projects/NewJavaLibrary/root/settings.gradle.ftl b/templates/projects/NewJavaLibrary/root/settings.gradle.ftl
new file mode 100644
index 0000000..b12004b
--- /dev/null
+++ b/templates/projects/NewJavaLibrary/root/settings.gradle.ftl
@@ -0,0 +1 @@
+include ':${projectName}'
diff --git a/templates/projects/NewJavaLibrary/root/src/library_package/Placeholder.java b/templates/projects/NewJavaLibrary/root/src/library_package/Placeholder.java
new file mode 100644
index 0000000..016aacb
--- /dev/null
+++ b/templates/projects/NewJavaLibrary/root/src/library_package/Placeholder.java
@@ -0,0 +1,4 @@
+package com.example;
+
+public class Placeholder {
+}
diff --git a/templates/projects/NewJavaLibrary/template.xml b/templates/projects/NewJavaLibrary/template.xml
new file mode 100644
index 0000000..4a3ed90
--- /dev/null
+++ b/templates/projects/NewJavaLibrary/template.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0"?>
+<template
+ format="1"
+ revision="1"
+ name="Java Library"
+ description="Creates a new Java library.">
+
+ <thumbs>
+ <thumb>template_new_project.png</thumb>
+ </thumbs>
+
+ <category value="Applications" />
+
+ <parameter
+ id="projectName"
+ name="Library name"
+ type="string"
+ constraints="nonempty"
+ default="MyLibrary"/>
+
+ <globals file="globals.xml.ftl" />
+ <execute file="recipe.xml.ftl" />
+
+</template>
diff --git a/templates/projects/NewJavaLibrary/template_new_project.png b/templates/projects/NewJavaLibrary/template_new_project.png
new file mode 100644
index 0000000..92e8556
--- /dev/null
+++ b/templates/projects/NewJavaLibrary/template_new_project.png
Binary files differ