diff options
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 Binary files differnew file mode 100644 index 0000000..8c0fb64 --- /dev/null +++ b/templates/gradle/wrapper/gradle/wrapper/gradle-wrapper.jar 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 Binary files differnew file mode 100755 index 0000000..96a442e --- /dev/null +++ b/templates/projects/NewAndroidLibrary/root/res/drawable-hdpi/ic_launcher.png diff --git a/templates/projects/NewAndroidLibrary/root/res/drawable-mdpi/ic_launcher.png b/templates/projects/NewAndroidLibrary/root/res/drawable-mdpi/ic_launcher.png Binary files differnew file mode 100755 index 0000000..359047d --- /dev/null +++ b/templates/projects/NewAndroidLibrary/root/res/drawable-mdpi/ic_launcher.png diff --git a/templates/projects/NewAndroidLibrary/root/res/drawable-xhdpi/ic_launcher.png b/templates/projects/NewAndroidLibrary/root/res/drawable-xhdpi/ic_launcher.png Binary files differnew file mode 100755 index 0000000..71c6d76 --- /dev/null +++ b/templates/projects/NewAndroidLibrary/root/res/drawable-xhdpi/ic_launcher.png 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 Binary files differnew file mode 100644 index 0000000..92e8556 --- /dev/null +++ b/templates/projects/NewAndroidLibrary/template_new_project.png 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 Binary files differnew file mode 100644 index 0000000..92e8556 --- /dev/null +++ b/templates/projects/NewJavaLibrary/template_new_project.png |