diff options
18 files changed, 389 insertions, 960 deletions
diff --git a/anttasks/src/com/android/ant/AndroidXPathFactory.java b/anttasks/src/com/android/ant/AndroidXPathFactory.java deleted file mode 100644 index 45ccf42..0000000 --- a/anttasks/src/com/android/ant/AndroidXPathFactory.java +++ /dev/null @@ -1,89 +0,0 @@ -/* - * Copyright (C) 2009 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.ant; - -import com.android.sdklib.SdkConstants; - -import java.util.Iterator; - -import javax.xml.XMLConstants; -import javax.xml.namespace.NamespaceContext; -import javax.xml.xpath.XPath; -import javax.xml.xpath.XPathFactory; - -/** - * XPath factory with automatic support for the android namespace. - */ -class AndroidXPathFactory { - public final static String DEFAULT_NS_PREFIX = "android"; //$NON-NLS-1$ - - private final static XPathFactory sFactory = XPathFactory.newInstance(); - - /** Namespace context for Android resource XML files. */ - private static class AndroidNamespaceContext implements NamespaceContext { - private String mAndroidPrefix; - - /** - * Construct the context with the prefix associated with the android namespace. - * @param androidPrefix the Prefix - */ - public AndroidNamespaceContext(String androidPrefix) { - mAndroidPrefix = androidPrefix; - } - - public String getNamespaceURI(String prefix) { - if (prefix != null) { - if (prefix.equals(mAndroidPrefix)) { - return SdkConstants.NS_RESOURCES; - } - } - - return XMLConstants.NULL_NS_URI; - } - - public String getPrefix(String namespaceURI) { - // This isn't necessary for our use. - assert false; - return null; - } - - public Iterator<?> getPrefixes(String namespaceURI) { - // This isn't necessary for our use. - assert false; - return null; - } - } - - /** - * Creates a new XPath object, specifying which prefix in the query is used for the - * android namespace. - * @param androidPrefix The namespace prefix. - */ - public static XPath newXPath(String androidPrefix) { - XPath xpath = sFactory.newXPath(); - xpath.setNamespaceContext(new AndroidNamespaceContext(androidPrefix)); - return xpath; - } - - /** - * Creates a new XPath object using the default prefix for the android namespace. - * @see #DEFAULT_NS_PREFIX - */ - public static XPath newXPath() { - return newXPath(DEFAULT_NS_PREFIX); - } -} diff --git a/anttasks/src/com/android/ant/SetupTask.java b/anttasks/src/com/android/ant/SetupTask.java index 1201108..f13cccd 100644 --- a/anttasks/src/com/android/ant/SetupTask.java +++ b/anttasks/src/com/android/ant/SetupTask.java @@ -23,7 +23,7 @@ import com.android.sdklib.SdkManager; import com.android.sdklib.IAndroidTarget.IOptionalLibrary; import com.android.sdklib.internal.project.ProjectProperties; import com.android.sdklib.xml.AndroidXPathFactory; -import com.android.sdklib.xml.ManifestConstants; +import com.android.sdklib.xml.AndroidManifest; import org.apache.tools.ant.BuildException; import org.apache.tools.ant.Project; @@ -264,10 +264,11 @@ public final class SetupTask extends ImportTask { XPath xPath = AndroidXPathFactory.newXPath(); - String value = xPath.evaluate("/" + ManifestConstants.NODE_MANIFEST +"/" + - ManifestConstants.NODE_USES_SDK + "/@" + - AndroidXPathFactory.DEFAULT_NS_PREFIX + ":" + - ManifestConstants.ATTRIBUTE_MIN_SDK_VERSION, + String value = xPath.evaluate( + "/" + AndroidManifest.NODE_MANIFEST + + "/" + AndroidManifest.NODE_USES_SDK + + "/@" + AndroidXPathFactory.DEFAULT_NS_PREFIX + ":" + + AndroidManifest.ATTRIBUTE_MIN_SDK_VERSION, new InputSource(new FileInputStream(manifest))); if (androidVersion.isPreview()) { @@ -290,19 +291,19 @@ public final class SetupTask extends ImportTask { // looks like it's not a number: error! throw new BuildException(String.format( "Attribute %1$s in AndroidManifest.xml must be an Integer!", - ManifestConstants.ATTRIBUTE_MIN_SDK_VERSION)); + AndroidManifest.ATTRIBUTE_MIN_SDK_VERSION)); } int projectApiLevel = androidVersion.getApiLevel(); if (minSdkValue < projectApiLevel) { System.out.println(String.format( "WARNING: Attribute %1$s in AndroidManifest.xml (%2$d) is lower than the project target API level (%3$d)", - ManifestConstants.ATTRIBUTE_MIN_SDK_VERSION, + AndroidManifest.ATTRIBUTE_MIN_SDK_VERSION, minSdkValue, projectApiLevel)); } else if (minSdkValue > androidVersion.getApiLevel()) { System.out.println(String.format( "WARNING: Attribute %1$s in AndroidManifest.xml (%2$d) is higher than the project target API level (%3$d)", - ManifestConstants.ATTRIBUTE_MIN_SDK_VERSION, + AndroidManifest.ATTRIBUTE_MIN_SDK_VERSION, minSdkValue, projectApiLevel)); } } else { diff --git a/anttasks/src/com/android/ant/XPathTask.java b/anttasks/src/com/android/ant/XPathTask.java index 73cf86a..b9cfb71 100644 --- a/anttasks/src/com/android/ant/XPathTask.java +++ b/anttasks/src/com/android/ant/XPathTask.java @@ -16,6 +16,8 @@ package com.android.ant; +import com.android.sdklib.xml.AndroidXPathFactory; + import org.apache.tools.ant.BuildException; import org.apache.tools.ant.Task; import org.apache.tools.ant.types.Path; diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/project/AndroidManifestParser.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/project/AndroidManifestParser.java index 10e727c..f03749c 100644 --- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/project/AndroidManifestParser.java +++ b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/project/AndroidManifestParser.java @@ -20,7 +20,7 @@ import com.android.ide.eclipse.adt.AdtPlugin; import com.android.ide.eclipse.adt.AndroidConstants; import com.android.ide.eclipse.adt.internal.project.XmlErrorHandler.XmlErrorListener; import com.android.sdklib.SdkConstants; -import com.android.sdklib.xml.ManifestConstants; +import com.android.sdklib.xml.AndroidManifest; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IMarker; @@ -285,55 +285,55 @@ public class AndroidManifestParser { String value; switch (mValidLevel) { case LEVEL_MANIFEST: - if (ManifestConstants.NODE_MANIFEST.equals(localName)) { + if (AndroidManifest.NODE_MANIFEST.equals(localName)) { // lets get the package name. mPackage = getAttributeValue(attributes, - ManifestConstants.ATTRIBUTE_PACKAGE, + AndroidManifest.ATTRIBUTE_PACKAGE, false /* hasNamespace */); mValidLevel++; } break; case LEVEL_APPLICATION: - if (ManifestConstants.NODE_APPLICATION.equals(localName)) { + if (AndroidManifest.NODE_APPLICATION.equals(localName)) { value = getAttributeValue(attributes, - ManifestConstants.ATTRIBUTE_PROCESS, + AndroidManifest.ATTRIBUTE_PROCESS, true /* hasNamespace */); if (value != null) { addProcessName(value); } value = getAttributeValue(attributes, - ManifestConstants.ATTRIBUTE_DEBUGGABLE, + AndroidManifest.ATTRIBUTE_DEBUGGABLE, true /* hasNamespace*/); if (value != null) { mDebuggable = Boolean.parseBoolean(value); } mValidLevel++; - } else if (ManifestConstants.NODE_USES_SDK.equals(localName)) { + } else if (AndroidManifest.NODE_USES_SDK.equals(localName)) { mApiLevelRequirement = getAttributeValue(attributes, - ManifestConstants.ATTRIBUTE_MIN_SDK_VERSION, + AndroidManifest.ATTRIBUTE_MIN_SDK_VERSION, true /* hasNamespace */); - } else if (ManifestConstants.NODE_INSTRUMENTATION.equals(localName)) { + } else if (AndroidManifest.NODE_INSTRUMENTATION.equals(localName)) { processInstrumentationNode(attributes); } break; case LEVEL_ACTIVITY: - if (ManifestConstants.NODE_ACTIVITY.equals(localName)) { + if (AndroidManifest.NODE_ACTIVITY.equals(localName)) { processActivityNode(attributes); mValidLevel++; - } else if (ManifestConstants.NODE_SERVICE.equals(localName)) { + } else if (AndroidManifest.NODE_SERVICE.equals(localName)) { processNode(attributes, AndroidConstants.CLASS_SERVICE); mValidLevel++; - } else if (ManifestConstants.NODE_RECEIVER.equals(localName)) { + } else if (AndroidManifest.NODE_RECEIVER.equals(localName)) { processNode(attributes, AndroidConstants.CLASS_BROADCASTRECEIVER); mValidLevel++; - } else if (ManifestConstants.NODE_PROVIDER.equals(localName)) { + } else if (AndroidManifest.NODE_PROVIDER.equals(localName)) { processNode(attributes, AndroidConstants.CLASS_CONTENTPROVIDER); mValidLevel++; - } else if (ManifestConstants.NODE_USES_LIBRARY.equals(localName)) { + } else if (AndroidManifest.NODE_USES_LIBRARY.equals(localName)) { value = getAttributeValue(attributes, - ManifestConstants.ATTRIBUTE_NAME, + AndroidManifest.ATTRIBUTE_NAME, true /* hasNamespace */); if (value != null) { mLibraries.add(value); @@ -343,26 +343,26 @@ public class AndroidManifestParser { case LEVEL_INTENT_FILTER: // only process this level if we are in an activity if (mCurrentActivity != null && - ManifestConstants.NODE_INTENT.equals(localName)) { + AndroidManifest.NODE_INTENT.equals(localName)) { mCurrentActivity.resetIntentFilter(); mValidLevel++; } break; case LEVEL_CATEGORY: if (mCurrentActivity != null) { - if (ManifestConstants.NODE_ACTION.equals(localName)) { + if (AndroidManifest.NODE_ACTION.equals(localName)) { // get the name attribute String action = getAttributeValue(attributes, - ManifestConstants.ATTRIBUTE_NAME, + AndroidManifest.ATTRIBUTE_NAME, true /* hasNamespace */); if (action != null) { mCurrentActivity.setHasAction(true); mCurrentActivity.setHasMainAction( ACTION_MAIN.equals(action)); } - } else if (ManifestConstants.NODE_CATEGORY.equals(localName)) { + } else if (AndroidManifest.NODE_CATEGORY.equals(localName)) { String category = getAttributeValue(attributes, - ManifestConstants.ATTRIBUTE_NAME, + AndroidManifest.ATTRIBUTE_NAME, true /* hasNamespace */); if (CATEGORY_LAUNCHER.equals(category)) { mCurrentActivity.setHasLauncherCategory(true); @@ -462,14 +462,14 @@ public class AndroidManifestParser { */ private void processActivityNode(Attributes attributes) { // lets get the activity name, and add it to the list - String activityName = getAttributeValue(attributes, ManifestConstants.ATTRIBUTE_NAME, + String activityName = getAttributeValue(attributes, AndroidManifest.ATTRIBUTE_NAME, true /* hasNamespace */); if (activityName != null) { - activityName = combinePackageAndClassName(mPackage, activityName); + activityName = AndroidManifest.combinePackageAndClassName(mPackage, activityName); // get the exported flag. String exportedStr = getAttributeValue(attributes, - ManifestConstants.ATTRIBUTE_EXPORTED, true); + AndroidManifest.ATTRIBUTE_EXPORTED, true); boolean exported = exportedStr == null || exportedStr.toLowerCase().equals("true"); // $NON-NLS-1$ mCurrentActivity = new Activity(activityName, exported); @@ -485,7 +485,7 @@ public class AndroidManifestParser { mCurrentActivity = null; } - String processName = getAttributeValue(attributes, ManifestConstants.ATTRIBUTE_PROCESS, + String processName = getAttributeValue(attributes, AndroidManifest.ATTRIBUTE_PROCESS, true /* hasNamespace */); if (processName != null) { addProcessName(processName); @@ -500,17 +500,17 @@ public class AndroidManifestParser { */ private void processNode(Attributes attributes, String superClassName) { // lets get the class name, and check it if required. - String serviceName = getAttributeValue(attributes, ManifestConstants.ATTRIBUTE_NAME, + String serviceName = getAttributeValue(attributes, AndroidManifest.ATTRIBUTE_NAME, true /* hasNamespace */); if (serviceName != null) { - serviceName = combinePackageAndClassName(mPackage, serviceName); + serviceName = AndroidManifest.combinePackageAndClassName(mPackage, serviceName); if (mMarkErrors) { checkClass(serviceName, superClassName, false /* testVisibility */); } } - String processName = getAttributeValue(attributes, ManifestConstants.ATTRIBUTE_PROCESS, + String processName = getAttributeValue(attributes, AndroidManifest.ATTRIBUTE_PROCESS, true /* hasNamespace */); if (processName != null) { addProcessName(processName); @@ -525,12 +525,13 @@ public class AndroidManifestParser { private void processInstrumentationNode(Attributes attributes) { // lets get the class name, and check it if required. String instrumentationName = getAttributeValue(attributes, - ManifestConstants.ATTRIBUTE_NAME, + AndroidManifest.ATTRIBUTE_NAME, true /* hasNamespace */); if (instrumentationName != null) { - String instrClassName = combinePackageAndClassName(mPackage, instrumentationName); + String instrClassName = AndroidManifest.combinePackageAndClassName(mPackage, + instrumentationName); String targetPackage = getAttributeValue(attributes, - ManifestConstants.ATTRIBUTE_TARGET_PACKAGE, + AndroidManifest.ATTRIBUTE_TARGET_PACKAGE, true /* hasNamespace */); mInstrumentations.add(new Instrumentation(instrClassName, targetPackage)); if (mMarkErrors) { @@ -954,39 +955,6 @@ public class AndroidManifestParser { } /** - * Combines a java package, with a class value from the manifest to make a fully qualified - * class name - * @param javaPackage the java package from the manifest. - * @param className the class name from the manifest. - * @return the fully qualified class name. - */ - public static String combinePackageAndClassName(String javaPackage, String className) { - if (className == null || className.length() == 0) { - return javaPackage; - } - if (javaPackage == null || javaPackage.length() == 0) { - return className; - } - - // the class name can be a subpackage (starts with a '.' - // char), a simple class name (no dot), or a full java package - boolean startWithDot = (className.charAt(0) == '.'); - boolean hasDot = (className.indexOf('.') != -1); - if (startWithDot || hasDot == false) { - - // add the concatenation of the package and class name - if (startWithDot) { - return javaPackage + className; - } else { - return javaPackage + '.' + className; - } - } else { - // just add the class as it should be a fully qualified java name. - return className; - } - } - - /** * Given a fully qualified activity name (e.g. com.foo.test.MyClass) and given a project * package base name (e.g. com.foo), returns the relative activity name that would be used * the "name" attribute of an "activity" element. diff --git a/scripts/AndroidManifest.template b/scripts/AndroidManifest.template index 2b06e76..9b07072 100644 --- a/scripts/AndroidManifest.template +++ b/scripts/AndroidManifest.template @@ -4,7 +4,7 @@ android:versionCode="1" android:versionName="1.0"> <application android:label="@string/app_name"> - <activity android:name=".ACTIVITY_NAME" + <activity android:name="ACTIVITY_ENTRY_NAME" android:label="@string/app_name"> <intent-filter> <action android:name="android.intent.action.MAIN" /> diff --git a/scripts/AndroidManifest.tests.template b/scripts/AndroidManifest.tests.template index 1f7d827..c74ff6d 100644 --- a/scripts/AndroidManifest.tests.template +++ b/scripts/AndroidManifest.tests.template @@ -17,5 +17,5 @@ --> <instrumentation android:name="android.test.InstrumentationTestRunner" android:targetPackage="PACKAGE" - android:label="Tests for ACTIVITY_NAME"/> + android:label="Tests for PACKAGE"/> </manifest> diff --git a/scripts/iml.template b/scripts/iml.template deleted file mode 100644 index c4fe3a3..0000000 --- a/scripts/iml.template +++ /dev/null @@ -1,14 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<module version="4" relativePaths="true" type="JAVA_MODULE"> - <component name="ModuleRootManager" /> - <component name="NewModuleRootManager" inherit-compiler-output="true"> - <exclude-output /> - <content url="file://$MODULE_DIR$"> - <sourceFolder url="file://$MODULE_DIR$/src" isTestSource="false" /> - </content> - <orderEntry type="sourceFolder" forTests="false" /> - <orderEntry type="library" name="android" level="project" /> - <orderEntry type="inheritedJdk" /> - <orderEntryProperties /> - </component> -</module> diff --git a/scripts/ipr.template b/scripts/ipr.template deleted file mode 100644 index cb3d65e..0000000 --- a/scripts/ipr.template +++ /dev/null @@ -1,232 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<project version="4" relativePaths="false"> - <component name="AntConfiguration"> - <defaultAnt bundledAnt="true" /> - <buildFile url="file://$PROJECT_DIR$/build.xml"> - <additionalClassPath /> - <antReference projectDefault="true" /> - <customJdkName value="" /> - <maximumHeapSize value="128" /> - <properties /> - </buildFile> - </component> - <component name="BuildJarProjectSettings"> - <option name="BUILD_JARS_ON_MAKE" value="false" /> - </component> - <component name="CodeStyleProjectProfileManger"> - <option name="PROJECT_PROFILE" /> - <option name="USE_PROJECT_LEVEL_SETTINGS" value="false" /> - </component> - <component name="CodeStyleSettingsManager"> - <option name="PER_PROJECT_SETTINGS" /> - <option name="USE_PER_PROJECT_SETTINGS" value="false" /> - </component> - <component name="CompilerConfiguration"> - <option name="DEFAULT_COMPILER" value="Javac" /> - <option name="DEPLOY_AFTER_MAKE" value="0" /> - <resourceExtensions> - <entry name=".+\.(properties|xml|html|dtd|tld)" /> - <entry name=".+\.(gif|png|jpeg|jpg)" /> - </resourceExtensions> - <wildcardResourcePatterns> - <entry name="?*.properties" /> - <entry name="?*.xml" /> - <entry name="?*.gif" /> - <entry name="?*.png" /> - <entry name="?*.jpeg" /> - <entry name="?*.jpg" /> - <entry name="?*.html" /> - <entry name="?*.dtd" /> - <entry name="?*.tld" /> - </wildcardResourcePatterns> - </component> - <component name="DataSourceManagerImpl" /> - <component name="DependenciesAnalyzeManager"> - <option name="myForwardDirection" value="false" /> - </component> - <component name="DependencyValidationManager" /> - <component name="EclipseCompilerSettings"> - <option name="DEBUGGING_INFO" value="true" /> - <option name="GENERATE_NO_WARNINGS" value="true" /> - <option name="DEPRECATION" value="false" /> - <option name="ADDITIONAL_OPTIONS_STRING" value="" /> - <option name="MAXIMUM_HEAP_SIZE" value="128" /> - </component> - <component name="EclipseEmbeddedCompilerSettings"> - <option name="DEBUGGING_INFO" value="true" /> - <option name="GENERATE_NO_WARNINGS" value="true" /> - <option name="DEPRECATION" value="false" /> - <option name="ADDITIONAL_OPTIONS_STRING" value="" /> - <option name="MAXIMUM_HEAP_SIZE" value="128" /> - </component> - <component name="EntryPointsManager"> - <entry_points /> - </component> - <component name="ExportToHTMLSettings"> - <option name="PRINT_LINE_NUMBERS" value="false" /> - <option name="OPEN_IN_BROWSER" value="false" /> - <option name="OUTPUT_DIRECTORY" /> - </component> - <component name="GUI Designer component loader factory" /> - <component name="IdProvider" IDEtalkID="F6EC4D80E2C03FEF19EDD201903A6DFE" /> - <component name="InspectionProjectProfileManager"> - <option name="PROJECT_PROFILE" value="Project Default" /> - <option name="USE_PROJECT_LEVEL_SETTINGS" value="false" /> - <scopes /> - <profiles> - <profile version="1.0" is_locked="false"> - <option name="myName" value="Project Default" /> - <option name="myLocal" value="false" /> - <used_levels> - <error> - <option name="myName" value="ERROR" /> - <option name="myVal" value="400" /> - </error> - <warning> - <option name="myName" value="WARNING" /> - <option name="myVal" value="300" /> - </warning> - <information> - <option name="myName" value="INFO" /> - <option name="myVal" value="200" /> - </information> - <server> - <option name="myName" value="SERVER PROBLEM" /> - <option name="myVal" value="100" /> - </server> - </used_levels> - <inspection_tool class="ClassReferencesSubclass" level="WARNING" enabled="true" /> - <inspection_tool class="MissingOverrideAnnotation" level="WARNING" enabled="true" /> - <inspection_tool class="Finalize" level="WARNING" enabled="true" /> - <inspection_tool class="UnusedImport" level="WARNING" enabled="true" /> - <inspection_tool class="StaticInheritance" level="WARNING" enabled="true" /> - <inspection_tool class="RedundantMethodOverride" level="WARNING" enabled="true" /> - <inspection_tool class="AbstractMethodCallInConstructor" level="WARNING" enabled="true" /> - <inspection_tool class="RawUseOfParameterizedType" level="WARNING" enabled="true"> - <option name="ignoreObjectConstruction" value="true" /> - <option name="ignoreTypeCasts" value="false" /> - </inspection_tool> - <inspection_tool class="SystemGC" level="WARNING" enabled="true" /> - <inspection_tool class="ConstantNamingConvention" level="WARNING" enabled="true"> - <option name="m_regex" value="[A-Z_\d]*" /> - <option name="m_minLength" value="5" /> - <option name="m_maxLength" value="32" /> - </inspection_tool> - <inspection_tool class="EnumeratedConstantNamingConvention" level="WARNING" enabled="true"> - <option name="m_regex" value="[A-Z][A-Za-z\d]*" /> - <option name="m_minLength" value="5" /> - <option name="m_maxLength" value="32" /> - </inspection_tool> - <inspection_tool class="DivideByZero" level="WARNING" enabled="true" /> - <inspection_tool class="CloneCallsConstructors" level="WARNING" enabled="true" /> - <inspection_tool class="CloneDeclaresCloneNotSupported" level="WARNING" enabled="false" /> - <inspection_tool class="CloneInNonCloneableClass" level="WARNING" enabled="true" /> - <inspection_tool class="UtilityClassWithoutPrivateConstructor" level="WARNING" enabled="true"> - <option name="ignoreClassesWithOnlyMain" value="false" /> - </inspection_tool> - <inspection_tool class="UtilityClassWithPublicConstructor" level="WARNING" enabled="true" /> - <inspection_tool class="ConditionalExpressionWithIdenticalBranches" level="WARNING" enabled="true" /> - <inspection_tool class="CanBeFinal" level="WARNING" enabled="false"> - <option name="REPORT_CLASSES" value="false" /> - <option name="REPORT_METHODS" value="false" /> - <option name="REPORT_FIELDS" value="true" /> - </inspection_tool> - <inspection_tool class="ThisEscapedInConstructor" level="WARNING" enabled="true" /> - <inspection_tool class="NonThreadSafeLazyInitialization" level="WARNING" enabled="true" /> - <inspection_tool class="FieldMayBeStatic" level="WARNING" enabled="true" /> - <inspection_tool class="InnerClassMayBeStatic" level="WARNING" enabled="true" /> - <inspection_tool class="MethodMayBeStatic" level="WARNING" enabled="true"> - <option name="m_onlyPrivateOrFinal" value="false" /> - <option name="m_ignoreEmptyMethods" value="true" /> - </inspection_tool> - <inspection_tool class="ComponentRegistrationProblems" level="ERROR" enabled="false"> - <option name="CHECK_PLUGIN_XML" value="true" /> - <option name="CHECK_JAVA_CODE" value="true" /> - <option name="CHECK_ACTIONS" value="true" /> - </inspection_tool> - <inspection_tool class="ComponentNotRegistered" level="WARNING" enabled="false"> - <option name="CHECK_ACTIONS" value="true" /> - <option name="IGNORE_NON_PUBLIC" value="true" /> - </inspection_tool> - <inspection_tool class="BusyWait" level="WARNING" enabled="true" /> - <inspection_tool class="UnconditionalWait" level="WARNING" enabled="true" /> - <inspection_tool class="WaitNotInLoop" level="WARNING" enabled="true" /> - </profile> - </profiles> - </component> - <component name="JavacSettings"> - <option name="DEBUGGING_INFO" value="true" /> - <option name="GENERATE_NO_WARNINGS" value="false" /> - <option name="DEPRECATION" value="true" /> - <option name="ADDITIONAL_OPTIONS_STRING" value="" /> - <option name="MAXIMUM_HEAP_SIZE" value="128" /> - </component> - <component name="JavadocGenerationManager"> - <option name="OUTPUT_DIRECTORY" /> - <option name="OPTION_SCOPE" value="protected" /> - <option name="OPTION_HIERARCHY" value="true" /> - <option name="OPTION_NAVIGATOR" value="true" /> - <option name="OPTION_INDEX" value="true" /> - <option name="OPTION_SEPARATE_INDEX" value="true" /> - <option name="OPTION_DOCUMENT_TAG_USE" value="false" /> - <option name="OPTION_DOCUMENT_TAG_AUTHOR" value="false" /> - <option name="OPTION_DOCUMENT_TAG_VERSION" value="false" /> - <option name="OPTION_DOCUMENT_TAG_DEPRECATED" value="true" /> - <option name="OPTION_DEPRECATED_LIST" value="true" /> - <option name="OTHER_OPTIONS" value="" /> - <option name="HEAP_SIZE" /> - <option name="LOCALE" /> - <option name="OPEN_IN_BROWSER" value="true" /> - </component> - <component name="JikesSettings"> - <option name="JIKES_PATH" value="" /> - <option name="DEBUGGING_INFO" value="true" /> - <option name="DEPRECATION" value="true" /> - <option name="GENERATE_NO_WARNINGS" value="false" /> - <option name="IS_EMACS_ERRORS_MODE" value="true" /> - <option name="ADDITIONAL_OPTIONS_STRING" value="" /> - </component> - <component name="LogConsolePreferences"> - <option name="FILTER_ERRORS" value="false" /> - <option name="FILTER_WARNINGS" value="false" /> - <option name="FILTER_INFO" value="true" /> - <option name="CUSTOM_FILTER" /> - </component> - <component name="ProjectModuleManager"> - <modules> - <module fileurl="file://$PROJECT_DIR$/ACTIVITY_NAME.iml" filepath="$PROJECT_DIR$/ACTIVITY_NAME.iml" /> - </modules> - </component> - <component name="ProjectRootManager" version="2" assert-keyword="true" jdk-15="true" project-jdk-name="1.5" project-jdk-type="JavaSDK"> - <output url="file://$PROJECT_DIR$/bin" /> - </component> - <component name="ProjectRunConfigurationManager" /> - <component name="RmicSettings"> - <option name="IS_EANABLED" value="false" /> - <option name="DEBUGGING_INFO" value="true" /> - <option name="GENERATE_NO_WARNINGS" value="false" /> - <option name="GENERATE_IIOP_STUBS" value="false" /> - <option name="ADDITIONAL_OPTIONS_STRING" value="" /> - </component> - <component name="StarteamVcsAdapter" /> - <component name="XSLT-Support.FileAssociationsManager" /> - <component name="com.intellij.jsf.UserDefinedFacesConfigs"> - <option name="USER_DEFINED_CONFIGS"> - <value> - <list size="0" /> - </value> - </option> - </component> - <component name="libraryTable"> - <library name="android"> - <CLASSES> - <root url="jar://ANDROID_SDK_FOLDER/android.jar!/" /> - </CLASSES> - <JAVADOC> - <root url="file://ANDROID_SDK_FOLDER/docs/reference" /> - </JAVADOC> - <SOURCES /> - </library> - </component> - <UsedPathMacros /> -</project> diff --git a/scripts/iws.template b/scripts/iws.template deleted file mode 100644 index 67d2053..0000000 --- a/scripts/iws.template +++ /dev/null @@ -1,470 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<project version="4" relativePaths="false"> - <component name="AntConfiguration"> - <defaultAnt bundledAnt="true" /> - <buildFile url="file://$PROJECT_DIR$/build.xml"> - <additionalClassPath /> - <antReference projectDefault="true" /> - <customJdkName value="" /> - <maximumHeapSize value="128" /> - <properties /> - </buildFile> - </component> - <component name="BookmarkManager" /> - <component name="ChangeBrowserSettings"> - <option name="MAIN_SPLITTER_PROPORTION" value="0.3" /> - <option name="MESSAGES_SPLITTER_PROPORTION" value="0.8" /> - <option name="USE_DATE_BEFORE_FILTER" value="false" /> - <option name="USE_DATE_AFTER_FILTER" value="false" /> - <option name="USE_CHANGE_BEFORE_FILTER" value="false" /> - <option name="USE_CHANGE_AFTER_FILTER" value="false" /> - <option name="DATE_BEFORE" value="" /> - <option name="DATE_AFTER" value="" /> - <option name="CHANGE_BEFORE" value="" /> - <option name="CHANGE_AFTER" value="" /> - <option name="USE_USER_FILTER" value="false" /> - <option name="USER" value="" /> - </component> - <component name="ChangeListManager"> - <list default="true" name="Default" comment="" /> - </component> - <component name="ChangeListSynchronizer" /> - <component name="ChangesViewManager" flattened_view="true" /> - <component name="CheckinPanelState" /> - <component name="Commander"> - <leftPanel /> - <rightPanel /> - <splitter proportion="0.5" /> - </component> - <component name="CompilerWorkspaceConfiguration"> - <option name="COMPILE_IN_BACKGROUND" value="false" /> - <option name="AUTO_SHOW_ERRORS_IN_EDITOR" value="true" /> - <option name="CLOSE_MESSAGE_VIEW_IF_SUCCESS" value="true" /> - <option name="COMPILE_DEPENDENT_FILES" value="false" /> - <option name="CLEAR_OUTPUT_DIRECTORY" value="false" /> - <option name="ASSERT_NOT_NULL" value="true" /> - </component> - <component name="CoverageDataManager" /> - <component name="Cvs2Configuration"> - <option name="PRUNE_EMPTY_DIRECTORIES" value="true" /> - <option name="MERGING_MODE" value="0" /> - <option name="MERGE_WITH_BRANCH1_NAME" value="HEAD" /> - <option name="MERGE_WITH_BRANCH2_NAME" value="HEAD" /> - <option name="RESET_STICKY" value="false" /> - <option name="CREATE_NEW_DIRECTORIES" value="true" /> - <option name="DEFAULT_TEXT_FILE_SUBSTITUTION" value="kv" /> - <option name="PROCESS_UNKNOWN_FILES" value="false" /> - <option name="PROCESS_DELETED_FILES" value="false" /> - <option name="PROCESS_IGNORED_FILES" value="false" /> - <option name="RESERVED_EDIT" value="false" /> - <option name="CHECKOUT_DATE_OR_REVISION_SETTINGS"> - <value> - <option name="BRANCH" value="" /> - <option name="DATE" value="" /> - <option name="USE_BRANCH" value="false" /> - <option name="USE_DATE" value="false" /> - </value> - </option> - <option name="UPDATE_DATE_OR_REVISION_SETTINGS"> - <value> - <option name="BRANCH" value="" /> - <option name="DATE" value="" /> - <option name="USE_BRANCH" value="false" /> - <option name="USE_DATE" value="false" /> - </value> - </option> - <option name="SHOW_CHANGES_REVISION_SETTINGS"> - <value> - <option name="BRANCH" value="" /> - <option name="DATE" value="" /> - <option name="USE_BRANCH" value="false" /> - <option name="USE_DATE" value="false" /> - </value> - </option> - <option name="SHOW_OUTPUT" value="false" /> - <option name="ADD_WATCH_INDEX" value="0" /> - <option name="REMOVE_WATCH_INDEX" value="0" /> - <option name="UPDATE_KEYWORD_SUBSTITUTION" /> - <option name="MAKE_NEW_FILES_READONLY" value="false" /> - <option name="SHOW_CORRUPTED_PROJECT_FILES" value="0" /> - <option name="TAG_AFTER_PROJECT_COMMIT" value="false" /> - <option name="OVERRIDE_EXISTING_TAG_FOR_PROJECT" value="true" /> - <option name="TAG_AFTER_PROJECT_COMMIT_NAME" value="" /> - <option name="CLEAN_COPY" value="false" /> - </component> - <component name="DaemonCodeAnalyzer"> - <disable_hints /> - </component> - <component name="DebuggerManager"> - <breakpoint_any> - <breakpoint> - <option name="NOTIFY_CAUGHT" value="true" /> - <option name="NOTIFY_UNCAUGHT" value="true" /> - <option name="ENABLED" value="false" /> - <option name="SUSPEND_POLICY" value="SuspendAll" /> - <option name="LOG_ENABLED" value="false" /> - <option name="LOG_EXPRESSION_ENABLED" value="false" /> - <option name="COUNT_FILTER_ENABLED" value="false" /> - <option name="COUNT_FILTER" value="0" /> - <option name="CONDITION_ENABLED" value="false" /> - <option name="CLASS_FILTERS_ENABLED" value="false" /> - <option name="INSTANCE_FILTERS_ENABLED" value="false" /> - <option name="CONDITION" value="" /> - <option name="LOG_MESSAGE" value="" /> - </breakpoint> - <breakpoint> - <option name="NOTIFY_CAUGHT" value="true" /> - <option name="NOTIFY_UNCAUGHT" value="true" /> - <option name="ENABLED" value="false" /> - <option name="SUSPEND_POLICY" value="SuspendAll" /> - <option name="LOG_ENABLED" value="false" /> - <option name="LOG_EXPRESSION_ENABLED" value="false" /> - <option name="COUNT_FILTER_ENABLED" value="false" /> - <option name="COUNT_FILTER" value="0" /> - <option name="CONDITION_ENABLED" value="false" /> - <option name="CLASS_FILTERS_ENABLED" value="false" /> - <option name="INSTANCE_FILTERS_ENABLED" value="false" /> - <option name="CONDITION" value="" /> - <option name="LOG_MESSAGE" value="" /> - </breakpoint> - </breakpoint_any> - <breakpoint_rules /> - <ui_properties /> - </component> - <component name="ErrorTreeViewConfiguration"> - <option name="IS_AUTOSCROLL_TO_SOURCE" value="false" /> - <option name="HIDE_WARNINGS" value="false" /> - </component> - <component name="FavoritesManager"> - <favorites_list name="LunarLander" /> - </component> - <component name="FavoritesProjectViewPane" /> - <component name="FileEditorManager"> - <leaf> - <file leaf-file-name="ACTIVITY_NAME.java" pinned="false" current="true" current-in-tab="true"> - <entry file="file://$PROJECT_DIR$/src/PACKAGE_PATH/ACTIVITY_NAME.java"> - <provider selected="true" editor-type-id="text-editor"> - <state line="0" column="0" selection-start="0" selection-end="0" vertical-scroll-proportion="0.08211144"> - <folding /> - </state> - </provider> - </entry> - </file> - </leaf> - </component> - <component name="FindManager"> - <FindUsagesManager> - <setting name="OPEN_NEW_TAB" value="false" /> - </FindUsagesManager> - </component> - <component name="HierarchyBrowserManager"> - <option name="IS_AUTOSCROLL_TO_SOURCE" value="false" /> - <option name="SORT_ALPHABETICALLY" value="false" /> - <option name="HIDE_CLASSES_WHERE_METHOD_NOT_IMPLEMENTED" value="false" /> - </component> - <component name="InspectionManager"> - <option name="AUTOSCROLL_TO_SOURCE" value="false" /> - <option name="SPLITTER_PROPORTION" value="0.5" /> - <option name="GROUP_BY_SEVERITY" value="false" /> - <option name="FILTER_RESOLVED_ITEMS" value="true" /> - <option name="ANALYZE_TEST_SOURCES" value="true" /> - <option name="SHOW_DIFF_WITH_PREVIOUS_RUN" value="false" /> - <option name="SCOPE_TYPE" value="1" /> - <option name="CUSTOM_SCOPE_NAME" value="" /> - <option name="SHOW_ONLY_DIFF" value="false" /> - <option name="myCurrentProfileName" value="Default" /> - </component> - <component name="J2EEProjectPane" /> - <component name="JspContextManager" /> - <component name="ModuleEditorState"> - <option name="LAST_EDITED_MODULE_NAME" /> - <option name="LAST_EDITED_TAB_NAME" /> - </component> - <component name="NamedScopeManager" /> - <component name="PackagesPane"> - <subPane> - <PATH> - <PATH_ELEMENT> - <option name="myItemId" value="ACTIVITY_NAME.ipr" /> - <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PackageViewProjectNode" /> - </PATH_ELEMENT> - <PATH_ELEMENT> - <option name="myItemId" value="ACTIVITY_NAME" /> - <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PackageViewModuleNode" /> - </PATH_ELEMENT> - </PATH> - </subPane> - </component> - <component name="PerforceChangeBrowserSettings"> - <option name="USE_CLIENT_FILTER" value="true" /> - <option name="CLIENT" value="" /> - </component> - <component name="PerforceDirect.Settings"> - <option name="useP4CONFIG" value="true" /> - <option name="port" value="<perforce_server>:1666" /> - <option name="client" value="" /> - <option name="user" value="" /> - <option name="passwd" value="" /> - <option name="showCmds" value="false" /> - <option name="useNativeApi" value="false" /> - <option name="pathToExec" value="p4" /> - <option name="useCustomPathToExec" value="false" /> - <option name="SYNC_FORCE" value="false" /> - <option name="SYNC_RUN_RESOLVE" value="true" /> - <option name="REVERT_UNCHANGED_FILES" value="true" /> - <option name="CHARSET" value="none" /> - <option name="SHOW_BRANCHES_HISTORY" value="true" /> - <option name="ENABLED" value="true" /> - <option name="USE_LOGIN" value="false" /> - <option name="LOGIN_SILENTLY" value="false" /> - <option name="INTEGRATE_RUN_RESOLVE" value="true" /> - <option name="INTEGRATE_REVERT_UNCHANGED" value="true" /> - <option name="SERVER_TIMEOUT" value="20000" /> - </component> - <component name="ProjectLevelVcsManager"> - <OptionsSetting value="true" id="Add" /> - <OptionsSetting value="true" id="Remove" /> - <OptionsSetting value="true" id="Checkin" /> - <OptionsSetting value="true" id="Checkout" /> - <OptionsSetting value="true" id="Update" /> - <OptionsSetting value="true" id="Status" /> - <OptionsSetting value="true" id="Edit" /> - <ConfirmationsSetting value="0" id="Add" /> - <ConfirmationsSetting value="0" id="Remove" /> - </component> - <component name="ProjectPane"> - <subPane> - <PATH> - <PATH_ELEMENT> - <option name="myItemId" value="ACTIVITY_NAME.ipr" /> - <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.ProjectViewProjectNode" /> - </PATH_ELEMENT> - <PATH_ELEMENT> - <option name="myItemId" value="ACTIVITY_NAME" /> - <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.ProjectViewModuleNode" /> - </PATH_ELEMENT> - </PATH> - </subPane> - </component> - <component name="ProjectReloadState"> - <option name="STATE" value="0" /> - </component> - <component name="ProjectView"> - <navigator currentView="ProjectPane" proportions="0.1" version="1" splitterProportion="0.5"> - <flattenPackages /> - <showMembers /> - <showModules /> - <showLibraryContents /> - <hideEmptyPackages /> - <abbreviatePackageNames /> - <showStructure PackagesPane="false" ProjectPane="false" /> - <autoscrollToSource /> - <autoscrollFromSource /> - <sortByType /> - </navigator> - </component> - <component name="PropertiesComponent"> - <property name="MemberChooser.copyJavadoc" value="false" /> - <property name="GoToClass.includeLibraries" value="false" /> - <property name="MemberChooser.showClasses" value="true" /> - <property name="MemberChooser.sorted" value="false" /> - <property name="GoToFile.includeJavaFiles" value="false" /> - <property name="GoToClass.toSaveIncludeLibraries" value="false" /> - </component> - <component name="ReadonlyStatusHandler"> - <option name="SHOW_DIALOG" value="true" /> - </component> - <component name="RecentsManager" /> - <component name="RestoreUpdateTree" /> - <component name="RunManager"> - <configuration default="true" type="Application" factoryName="Application" enabled="false" merge="false"> - <option name="MAIN_CLASS_NAME" /> - <option name="VM_PARAMETERS" /> - <option name="PROGRAM_PARAMETERS" /> - <option name="WORKING_DIRECTORY" value="$PROJECT_DIR$" /> - <option name="ALTERNATIVE_JRE_PATH_ENABLED" value="false" /> - <option name="ALTERNATIVE_JRE_PATH" /> - <option name="ENABLE_SWING_INSPECTOR" value="false" /> - <module name="" /> - </configuration> - <configuration default="true" type="Applet" factoryName="Applet"> - <module name="" /> - <option name="MAIN_CLASS_NAME" /> - <option name="HTML_FILE_NAME" /> - <option name="HTML_USED" value="false" /> - <option name="WIDTH" value="400" /> - <option name="HEIGHT" value="300" /> - <option name="POLICY_FILE" value="/Developer/Applications/IntelliJ IDEA 6.0.4.app/bin/appletviewer.policy" /> - <option name="VM_PARAMETERS" /> - <option name="ALTERNATIVE_JRE_PATH_ENABLED" value="false" /> - <option name="ALTERNATIVE_JRE_PATH" /> - </configuration> - <configuration default="true" type="JUnit" factoryName="JUnit" enabled="false" merge="false"> - <module name="" /> - <option name="ALTERNATIVE_JRE_PATH_ENABLED" value="false" /> - <option name="ALTERNATIVE_JRE_PATH" /> - <option name="PACKAGE_NAME" /> - <option name="MAIN_CLASS_NAME" /> - <option name="METHOD_NAME" /> - <option name="TEST_OBJECT" value="class" /> - <option name="VM_PARAMETERS" /> - <option name="PARAMETERS" /> - <option name="WORKING_DIRECTORY" value="$PROJECT_DIR$" /> - <option name="ADDITIONAL_CLASS_PATH" /> - <option name="TEST_SEARCH_SCOPE"> - <value defaultName="wholeProject" /> - </option> - </configuration> - <configuration default="true" type="Remote" factoryName="Remote"> - <option name="USE_SOCKET_TRANSPORT" value="true" /> - <option name="SERVER_MODE" value="false" /> - <option name="SHMEM_ADDRESS" value="javadebug" /> - <option name="HOST" value="localhost" /> - <option name="PORT" value="5005" /> - </configuration> - </component> - <component name="ScopeViewComponent" /> - <component name="SelectInManager" /> - <component name="StarteamConfiguration"> - <option name="SERVER" value="" /> - <option name="PORT" value="49201" /> - <option name="USER" value="" /> - <option name="PASSWORD" value="" /> - <option name="PROJECT" value="" /> - <option name="VIEW" value="" /> - <option name="ALTERNATIVE_WORKING_PATH" value="" /> - <option name="LOCK_ON_CHECKOUT" value="false" /> - <option name="UNLOCK_ON_CHECKIN" value="false" /> - </component> - <component name="StructuralSearchPlugin" /> - <component name="StructureViewFactory"> - <option name="AUTOSCROLL_MODE" value="true" /> - <option name="AUTOSCROLL_FROM_SOURCE" value="false" /> - <option name="ACTIVE_ACTIONS" value="" /> - </component> - <component name="Struts Assistant"> - <option name="showInputs" value="true" /> - <option name="resources"> - <value> - <option name="strutsPath" /> - <option name="strutsHelp" /> - </value> - </option> - <option name="selectedTaglibs" /> - <option name="selectedTaglibs" /> - <option name="myStrutsValidationEnabled" value="true" /> - <option name="myTilesValidationEnabled" value="true" /> - <option name="myValidatorValidationEnabled" value="true" /> - <option name="myReportErrorsAsWarnings" value="true" /> - </component> - <component name="SvnChangesBrowserSettings"> - <option name="USE_AUTHOR_FIELD" value="true" /> - <option name="AUTHOR" value="" /> - <option name="LOCATION" value="" /> - <option name="USE_PROJECT_SETTINGS" value="true" /> - <option name="USE_ALTERNATE_LOCATION" value="false" /> - </component> - <component name="SvnConfiguration"> - <option name="USER" value="" /> - <option name="PASSWORD" value="" /> - <option name="PROCESS_UNRESOLVED" value="false" /> - <option name="LAST_MERGED_REVISION" /> - <option name="UPDATE_RUN_STATUS" value="false" /> - <option name="UPDATE_RECURSIVELY" value="true" /> - <option name="MERGE_DRY_RUN" value="false" /> - <upgradeMode>auto</upgradeMode> - </component> - <component name="TodoView" selected-index="0"> - <todo-panel id="selected-file"> - <are-packages-shown value="false" /> - <are-modules-shown value="false" /> - <flatten-packages value="false" /> - <is-autoscroll-to-source value="true" /> - </todo-panel> - <todo-panel id="all"> - <are-packages-shown value="true" /> - <are-modules-shown value="false" /> - <flatten-packages value="false" /> - <is-autoscroll-to-source value="true" /> - </todo-panel> - </component> - <component name="ToolWindowManager"> - <frame x="0" y="22" width="1440" height="834" extended-state="0" /> - <editor active="false" /> - <layout> - <window_info id="UI Designer" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" order="-1" /> - <window_info id="CVS" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" order="-1" /> - <window_info id="IDEtalk" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" order="-1" /> - <window_info id="TODO" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" order="7" /> - <window_info id="Project" active="true" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="true" weight="0.24946082" order="0" /> - <window_info id="Find" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" order="1" /> - <window_info id="Structure" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.25" order="1" /> - <window_info id="Messages" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" order="-1" /> - <window_info id="Inspection" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.4" order="6" /> - <window_info id="Module Dependencies" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" order="-1" /> - <window_info id="Dependency Viewer" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" order="-1" /> - <window_info id="Palette" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" order="-1" /> - <window_info id="Ant Build" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.25" order="1" /> - <window_info id="Changes" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" order="-1" /> - <window_info id="Run" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" order="2" /> - <window_info id="Hierarchy" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.25" order="2" /> - <window_info id="File View" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" order="-1" /> - <window_info id="Debug" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.4" order="4" /> - <window_info id="Commander" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.4" order="0" /> - <window_info id="IDEtalk Messages" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" order="-1" /> - <window_info id="Version Control" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" order="-1" /> - <window_info id="Web" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.25" order="2" /> - <window_info id="Message" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" order="0" /> - <window_info id="EJB" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.25" order="3" /> - <window_info id="Cvs" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.25" order="5" /> - </layout> - </component> - <component name="VCS.FileViewConfiguration"> - <option name="SELECTED_STATUSES" value="DEFAULT" /> - <option name="SELECTED_COLUMNS" value="DEFAULT" /> - <option name="SHOW_FILTERS" value="true" /> - <option name="CUSTOMIZE_VIEW" value="true" /> - <option name="SHOW_FILE_HISTORY_AS_TREE" value="true" /> - </component> - <component name="VcsManagerConfiguration"> - <option name="OFFER_MOVE_TO_ANOTHER_CHANGELIST_ON_PARTIAL_COMMIT" value="true" /> - <option name="CHECK_CODE_SMELLS_BEFORE_PROJECT_COMMIT" value="true" /> - <option name="PERFORM_UPDATE_IN_BACKGROUND" value="false" /> - <option name="PERFORM_COMMIT_IN_BACKGROUND" value="false" /> - <option name="PUT_FOCUS_INTO_COMMENT" value="false" /> - <option name="FORCE_NON_EMPTY_COMMENT" value="false" /> - <option name="LAST_COMMIT_MESSAGE" /> - <option name="SAVE_LAST_COMMIT_MESSAGE" value="true" /> - <option name="CHECKIN_DIALOG_SPLITTER_PROPORTION" value="0.8" /> - <option name="OPTIMIZE_IMPORTS_BEFORE_PROJECT_COMMIT" value="false" /> - <option name="REFORMAT_BEFORE_PROJECT_COMMIT" value="false" /> - <option name="REFORMAT_BEFORE_FILE_COMMIT" value="false" /> - <option name="FILE_HISTORY_DIALOG_COMMENTS_SPLITTER_PROPORTION" value="0.8" /> - <option name="FILE_HISTORY_DIALOG_SPLITTER_PROPORTION" value="0.5" /> - <option name="ERROR_OCCURED" value="false" /> - <option name="ACTIVE_VCS_NAME" value="CVS" /> - <option name="UPDATE_GROUP_BY_PACKAGES" value="false" /> - <option name="SHOW_FILE_HISTORY_AS_TREE" value="false" /> - <option name="FILE_HISTORY_SPLITTER_PROPORTION" value="0.6" /> - </component> - <component name="XPathView.XPathProjectComponent"> - <history /> - <find-history /> - </component> - <component name="XSLT-Support.FileAssociationsSettings" /> - <component name="antWorkspaceConfiguration"> - <option name="IS_AUTOSCROLL_TO_SOURCE" value="false" /> - <option name="FILTER_TARGETS" value="false" /> - </component> - <component name="com.intellij.ide.util.scopeChooser.ScopeChooserConfigurable" proportions="" version="1"> - <option name="myLastEditedConfigurable" /> - </component> - <component name="com.intellij.openapi.roots.ui.configuration.projectRoot.ProjectRootMasterDetailsConfigurable" proportions="0.1" version="1"> - <option name="myPlainMode" value="false" /> - <option name="myLastEditedConfigurable" value="android" /> - </component> - <component name="com.intellij.profile.ui.ErrorOptionsConfigurable" proportions="" version="1"> - <option name="myLastEditedConfigurable" /> - </component> - <component name="editorHistoryManager" /> -</project>
\ No newline at end of file diff --git a/scripts/java_file.template b/scripts/java_file.template index aeb541f..19714a8 100644 --- a/scripts/java_file.template +++ b/scripts/java_file.template @@ -3,7 +3,7 @@ package PACKAGE; import android.app.Activity; import android.os.Bundle; -public class ACTIVITY_NAME extends Activity +public class ACTIVITY_CLASS_NAME extends Activity { /** Called when the activity is first created. */ @Override diff --git a/scripts/java_tests_file.template b/scripts/java_tests_file.template index c6fa873..08d6f9b 100644 --- a/scripts/java_tests_file.template +++ b/scripts/java_tests_file.template @@ -9,13 +9,13 @@ import android.test.ActivityInstrumentationTestCase2; * <p/> * To run this test, you can type: * adb shell am instrument -w \ - * -e class PACKAGE.ACTIVITY_NAMETest \ + * -e class ACTIVITY_FQ_NAME \ * PACKAGE.tests/android.test.InstrumentationTestRunner */ -public class ACTIVITY_NAMETest extends ActivityInstrumentationTestCase2<ACTIVITY_NAME> { +public class ACTIVITY_CLASS_NAME extends ActivityInstrumentationTestCase2<ACTIVITY_TESTED_CLASS_NAME> { - public ACTIVITY_NAMETest() { - super("PACKAGE", ACTIVITY_NAME.class); + public ACTIVITY_CLASS_NAME() { + super("PACKAGE", ACTIVITY_TESTED_CLASS_NAME.class); } }
\ No newline at end of file diff --git a/sdkmanager/app/src/com/android/sdkmanager/CommandLineProcessor.java b/sdkmanager/app/src/com/android/sdkmanager/CommandLineProcessor.java index 5da5645..2e21f7b 100644 --- a/sdkmanager/app/src/com/android/sdkmanager/CommandLineProcessor.java +++ b/sdkmanager/app/src/com/android/sdkmanager/CommandLineProcessor.java @@ -460,7 +460,7 @@ class CommandLineProcessor { stdout("\nValid actions are composed of a verb and an optional direct object:"); for (String[] action : mActions) { - stdout("- %1$6s %2$-7s: %3$s", + stdout("- %1$6s %2$-12s: %3$s", action[ACTION_VERB_INDEX], action[ACTION_OBJECT_INDEX], action[ACTION_DESC_INDEX]); diff --git a/sdkmanager/app/src/com/android/sdkmanager/Main.java b/sdkmanager/app/src/com/android/sdkmanager/Main.java index fa2870d..c691af7 100644 --- a/sdkmanager/app/src/com/android/sdkmanager/Main.java +++ b/sdkmanager/app/src/com/android/sdkmanager/Main.java @@ -28,17 +28,27 @@ import com.android.sdklib.internal.avd.HardwareProperties; import com.android.sdklib.internal.avd.AvdManager.AvdInfo; import com.android.sdklib.internal.avd.HardwareProperties.HardwareProperty; import com.android.sdklib.internal.project.ProjectCreator; +import com.android.sdklib.internal.project.ProjectProperties; import com.android.sdklib.internal.project.ProjectCreator.OutputLevel; +import com.android.sdklib.internal.project.ProjectProperties.PropertyType; +import com.android.sdklib.xml.AndroidXPathFactory; import com.android.sdkmanager.internal.repository.AboutPage; import com.android.sdkmanager.internal.repository.SettingsPage; import com.android.sdkuilib.repository.UpdaterWindow; +import org.xml.sax.InputSource; + import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; import java.io.IOException; import java.util.HashMap; import java.util.List; import java.util.Map; +import javax.xml.xpath.XPath; +import javax.xml.xpath.XPathExpressionException; + /** * Main class for the 'android' application. */ @@ -221,6 +231,10 @@ public class Main { SdkCommandLine.OBJECT_PROJECT.equals(directObject)) { createProject(); + } else if (SdkCommandLine.VERB_CREATE.equals(verb) && + SdkCommandLine.OBJECT_TEST_PROJECT.equals(directObject)) { + createTestProject(); + } else if (SdkCommandLine.VERB_UPDATE.equals(verb) && SdkCommandLine.OBJECT_PROJECT.equals(directObject)) { updateProject(); @@ -314,9 +328,112 @@ public class Main { packageName, activityName, target, - false /* isTestProject*/); + null /*pathToMain*/); + } + + /** + * Creates a new Android test project based on command-line parameters + */ + private void createTestProject() { + + String projectDir = getProjectLocation(mSdkCommandLine.getParamLocationPath()); + + // first check the path of the parent project, and make sure it's valid. + String pathToMainProject = mSdkCommandLine.getParamTestProjectMain(); + + File parentProject = new File(pathToMainProject); + if (parentProject.isAbsolute() == false) { + // if the path is not absolute, we need to resolve it based on the + // destination path of the project + parentProject = new File(projectDir, pathToMainProject); + } + + if (parentProject.isDirectory() == false) { + errorAndExit("Main project's directory does not exist: %1$s", + pathToMainProject); + } + + // now look for a manifest in there + File manifest = new File(parentProject, SdkConstants.FN_ANDROID_MANIFEST_XML); + if (manifest.isFile() == false) { + errorAndExit("No AndroidManifest.xml file found in the main project directory: %1$s", + parentProject.getAbsolutePath()); + } + + // now query the manifest for the package file. + XPath xpath = AndroidXPathFactory.newXPath(); + String packageName, activityName; + + try { + packageName = xpath.evaluate("/manifest/@package", + new InputSource(new FileInputStream(manifest))); + + mSdkLog.printf("Found main project package: %1$s\n", packageName); + + // now get the name of the first activity we find + activityName = xpath.evaluate("/manifest/application/activity[1]/@android:name", + new InputSource(new FileInputStream(manifest))); + // xpath will return empty string when there's no match + if (activityName == null || activityName.length() == 0) { + activityName = null; + } else { + mSdkLog.printf("Found main project activity: %1$s\n", activityName); + } + } catch (FileNotFoundException e) { + // this shouldn't happen as we test it above. + errorAndExit("No AndroidManifest.xml file found in main project."); + return; // this is not strictly needed because errorAndExit will stop the execution, + // but this makes the java compiler happy, wrt to uninitialized variables. + } catch (XPathExpressionException e) { + // looks like the main manifest is not valid. + errorAndExit("Unable to parse main project manifest to get information."); + return; // this is not strictly needed because errorAndExit will stop the execution, + // but this makes the java compiler happy, wrt to uninitialized variables. + } + + // now get the target hash + ProjectProperties p = ProjectProperties.load(parentProject.getAbsolutePath(), + PropertyType.DEFAULT); + String targetHash = p.getProperty(ProjectProperties.PROPERTY_TARGET); + if (targetHash == null) { + errorAndExit("Couldn't find the main project target"); + } + + // and resolve it. + IAndroidTarget target = mSdkManager.getTargetFromHashString(targetHash); + if (target == null) { + errorAndExit( + "Unable to resolve main project target '%1$s'. You may want to install the platform in your SDK.", + targetHash); + } + + mSdkLog.printf("Found main project target: %1$s\n", target.getFullName()); + + ProjectCreator creator = new ProjectCreator(mOsSdkFolder, + mSdkCommandLine.isVerbose() ? OutputLevel.VERBOSE : + mSdkCommandLine.isSilent() ? OutputLevel.SILENT : + OutputLevel.NORMAL, + mSdkLog); + + String projectName = mSdkCommandLine.getParamName(); + + if (projectName != null && + !ProjectCreator.RE_PROJECT_NAME.matcher(projectName).matches()) { + errorAndExit( + "Project name '%1$s' contains invalid characters.\nAllowed characters are: %2$s", + projectName, ProjectCreator.CHARS_PROJECT_NAME); + return; + } + + creator.createProject(projectDir, + projectName, + packageName, + activityName, + target, + pathToMainProject); } + /** * Updates an existing Android project based on command-line parameters */ diff --git a/sdkmanager/app/src/com/android/sdkmanager/SdkCommandLine.java b/sdkmanager/app/src/com/android/sdkmanager/SdkCommandLine.java index a23a65c..35bbd0d 100644 --- a/sdkmanager/app/src/com/android/sdkmanager/SdkCommandLine.java +++ b/sdkmanager/app/src/com/android/sdkmanager/SdkCommandLine.java @@ -31,28 +31,30 @@ class SdkCommandLine extends CommandLineProcessor { public final static String VERB_DELETE = "delete"; public final static String VERB_UPDATE = "update"; - public static final String OBJECT_AVD = "avd"; - public static final String OBJECT_AVDS = "avds"; - public static final String OBJECT_TARGET = "target"; - public static final String OBJECT_TARGETS = "targets"; - public static final String OBJECT_PROJECT = "project"; - public static final String OBJECT_ADB = "adb"; - - public static final String ARG_ALIAS = "alias"; - public static final String ARG_ACTIVITY = "activity"; - - public static final String KEY_ACTIVITY = ARG_ACTIVITY; - public static final String KEY_PACKAGE = "package"; - public static final String KEY_MODE = "mode"; - public static final String KEY_TARGET_ID = OBJECT_TARGET; - public static final String KEY_NAME = "name"; - public static final String KEY_PATH = "path"; - public static final String KEY_FILTER = "filter"; - public static final String KEY_SKIN = "skin"; - public static final String KEY_SDCARD = "sdcard"; - public static final String KEY_FORCE = "force"; - public static final String KEY_RENAME = "rename"; - public static final String KEY_SUBPROJECTS = "subprojects"; + public static final String OBJECT_AVD = "avd"; + public static final String OBJECT_AVDS = "avds"; + public static final String OBJECT_TARGET = "target"; + public static final String OBJECT_TARGETS = "targets"; + public static final String OBJECT_PROJECT = "project"; + public static final String OBJECT_TEST_PROJECT = "test-project"; + public static final String OBJECT_ADB = "adb"; + + public static final String ARG_ALIAS = "alias"; + public static final String ARG_ACTIVITY = "activity"; + + public static final String KEY_ACTIVITY = ARG_ACTIVITY; + public static final String KEY_PACKAGE = "package"; + public static final String KEY_MODE = "mode"; + public static final String KEY_TARGET_ID = OBJECT_TARGET; + public static final String KEY_NAME = "name"; + public static final String KEY_PATH = "path"; + public static final String KEY_FILTER = "filter"; + public static final String KEY_SKIN = "skin"; + public static final String KEY_SDCARD = "sdcard"; + public static final String KEY_FORCE = "force"; + public static final String KEY_RENAME = "rename"; + public static final String KEY_SUBPROJECTS = "subprojects"; + public static final String KEY_MAIN_PROJECT = "main"; /** * Action definitions for SdkManager command line. @@ -89,6 +91,11 @@ class SdkCommandLine extends CommandLineProcessor { { VERB_UPDATE, OBJECT_PROJECT, "Updates an Android Project (must have an AndroidManifest.xml)." }, + { VERB_CREATE, OBJECT_TEST_PROJECT, + "Creates a new Android Test Project." }, + { VERB_UPDATE, OBJECT_TEST_PROJECT, + "Updates an Android Test Project (must have an AndroidManifest.xml)." }, + { VERB_UPDATE, OBJECT_ADB, "Updates adb to support the USB devices declared in the SDK add-ons." }, }; @@ -167,6 +174,18 @@ class SdkCommandLine extends CommandLineProcessor { VERB_CREATE, OBJECT_PROJECT, "n", KEY_NAME, "Project name", null); + // --- create test-project --- + define(Mode.STRING, true, + VERB_CREATE, OBJECT_TEST_PROJECT, + "p", KEY_PATH, + "Location path of new project", null); + define(Mode.STRING, false, + VERB_CREATE, OBJECT_TEST_PROJECT, "n", KEY_NAME, + "Project name", null); + define(Mode.STRING, true, + VERB_CREATE, OBJECT_TEST_PROJECT, "m", KEY_MAIN_PROJECT, + "Location path of the project to test, relative to the new project", null); + // --- update project --- define(Mode.STRING, true, @@ -185,6 +204,17 @@ class SdkCommandLine extends CommandLineProcessor { VERB_UPDATE, OBJECT_PROJECT, "s", KEY_SUBPROJECTS, "Also update any projects in sub-folders, such as test projects.", false); + + // --- update test project --- + + define(Mode.STRING, true, + VERB_UPDATE, OBJECT_TEST_PROJECT, + "p", KEY_PATH, + "Location path of the project", null); + define(Mode.STRING, true, + VERB_UPDATE, OBJECT_TEST_PROJECT, + "m", KEY_MAIN_PROJECT, + "Location path of the project to test", null); } @Override @@ -255,4 +285,11 @@ class SdkCommandLine extends CommandLineProcessor { public boolean getParamSubProject() { return ((Boolean) getValue(null, OBJECT_PROJECT, KEY_SUBPROJECTS)).booleanValue(); } + + // -- some helpers for test-project action flags + + /** Helper to retrieve the --main value. */ + public String getParamTestProjectMain() { + return ((String) getValue(null, OBJECT_TEST_PROJECT, KEY_MAIN_PROJECT)); + } } diff --git a/sdkmanager/libs/sdklib/src/com/android/sdklib/internal/project/ProjectCreator.java b/sdkmanager/libs/sdklib/src/com/android/sdklib/internal/project/ProjectCreator.java index 3e15e15..c4ab013 100644 --- a/sdkmanager/libs/sdklib/src/com/android/sdklib/internal/project/ProjectCreator.java +++ b/sdkmanager/libs/sdklib/src/com/android/sdklib/internal/project/ProjectCreator.java @@ -20,6 +20,7 @@ import com.android.sdklib.IAndroidTarget; import com.android.sdklib.ISdkLog; import com.android.sdklib.SdkConstants; import com.android.sdklib.internal.project.ProjectProperties.PropertyType; +import com.android.sdklib.xml.AndroidManifest; import org.w3c.dom.NodeList; import org.xml.sax.InputSource; @@ -44,8 +45,7 @@ import javax.xml.xpath.XPathExpressionException; import javax.xml.xpath.XPathFactory; /** - * Creates the basic files needed to get an Android project up and running. Also - * allows creation of IntelliJ project files. + * Creates the basic files needed to get an Android project up and running. * * @hide */ @@ -55,13 +55,22 @@ public class ProjectCreator { private final static String PH_JAVA_FOLDER = "PACKAGE_PATH"; /** Package name substitution string used in template files, i.e. "PACKAGE" */ private final static String PH_PACKAGE = "PACKAGE"; - /** Activity name substitution string used in template files, i.e. "ACTIVITY_NAME". */ + /** Activity name substitution string used in template files, i.e. "ACTIVITY_NAME". + * @deprecated This is only used for older templates. For new ones see + * {@link #PH_ACTIVITY_ENTRY_NAME}, and {@link #PH_ACTIVITY_CLASS_NAME}. */ private final static String PH_ACTIVITY_NAME = "ACTIVITY_NAME"; + /** Activity name substitution string used in manifest templates, i.e. "ACTIVITY_ENTRY_NAME".*/ + private final static String PH_ACTIVITY_ENTRY_NAME = "ACTIVITY_ENTRY_NAME"; + /** Activity name substitution string used in class templates, i.e. "ACTIVITY_CLASS_NAME".*/ + private final static String PH_ACTIVITY_CLASS_NAME = "ACTIVITY_CLASS_NAME"; + /** Activity FQ-name substitution string used in class templates, i.e. "ACTIVITY_FQ_NAME".*/ + private final static String PH_ACTIVITY_FQ_NAME = "ACTIVITY_FQ_NAME"; + /** Original Activity class name substitution string used in class templates, i.e. + * "ACTIVITY_TESTED_CLASS_NAME".*/ + private final static String PH_ACTIVITY_TESTED_CLASS_NAME = "ACTIVITY_TESTED_CLASS_NAME"; /** Project name substitution string used in template files, i.e. "PROJECT_NAME". */ private final static String PH_PROJECT_NAME = "PROJECT_NAME"; - private final static String FOLDER_TESTS = "tests"; - /** Pattern for characters accepted in a project name. Since this will be used as a * directory name, we're being a bit conservative on purpose: dot and space cannot be used. */ public static final Pattern RE_PROJECT_NAME = Pattern.compile("[a-zA-Z0-9_]+"); @@ -135,17 +144,16 @@ public class ProjectCreator { * {@link #RE_PROJECT_NAME} regex. * @param packageName the package of the project. The name must match the * {@link #RE_PACKAGE_NAME} regex. - * @param activityName the activity of the project as it will appear in the manifest. Can be + * @param activityEntry the activity of the project as it will appear in the manifest. Can be * null if no activity should be created. The name must match the * {@link #RE_ACTIVITY_NAME} regex. * @param target the project target. - * @param isTestProject whether the project to create is a test project. Caller should - * initially call this will false. The method will call itself back to create - * a test project as needed. + * @param pathToMainProject if non-null the project will be setup to test a main project + * located at the given path. */ public void createProject(String folderPath, String projectName, - String packageName, String activityName, IAndroidTarget target, - boolean isTestProject) { + String packageName, String activityEntry, IAndroidTarget target, + String pathToMainProject) { // create project folder if it does not exist File projectFolder = new File(folderPath); @@ -185,6 +193,8 @@ public class ProjectCreator { } try { + boolean isTestProject = pathToMainProject != null; + // first create the project properties. // location of the SDK goes in localProperty @@ -202,9 +212,16 @@ public class ProjectCreator { // create a build.properties file with just the application package ProjectProperties buildProperties = ProjectProperties.create(folderPath, PropertyType.BUILD); - buildProperties.setProperty(ProjectProperties.PROPERTY_APP_PACKAGE, packageName); - if (isTestProject == true) { - buildProperties.setProperty(ProjectProperties.PROPERTY_TESTED_PROJECT, ".."); + + // only put application.package for older target where the rules file didn't. + // grab it through xpath + if (target.getVersion().getApiLevel() < 4) { + buildProperties.setProperty(ProjectProperties.PROPERTY_APP_PACKAGE, packageName); + } + + if (isTestProject) { + buildProperties.setProperty(ProjectProperties.PROPERTY_TESTED_PROJECT, + pathToMainProject); } buildProperties.save(); @@ -221,19 +238,76 @@ public class ProjectCreator { // put this path in the place-holder map for project files that needs to list // files manually. keywords.put(PH_JAVA_FOLDER, packagePath); - keywords.put(PH_PACKAGE, packageName); - if (activityName != null) { - keywords.put(PH_ACTIVITY_NAME, activityName); + + + // compute some activity related information + String fqActivityName = null, activityPath = null, activityClassName = null; + String originalActivityEntry = activityEntry; + String originalActivityClassName = null; + if (activityEntry != null) { + if (isTestProject) { + // append Test so that it doesn't collide with the main project activity. + activityEntry += "Test"; + + // get the classname from the original activity entry. + int pos = originalActivityEntry.lastIndexOf('.'); + if (pos != -1) { + originalActivityClassName = originalActivityEntry.substring(pos + 1); + } else { + originalActivityClassName = originalActivityEntry; + } + } + + // get the fully qualified name of the activity + fqActivityName = AndroidManifest.combinePackageAndClassName(packageName, + activityEntry); + + // get the activity path (replace the . to /) + activityPath = stripString(fqActivityName.replace(".", File.separator), + File.separatorChar); + + // remove the last segment, so that we only have the path to the activity, but + // not the activity filename itself. + activityPath = activityPath.substring(0, + activityPath.lastIndexOf(File.separatorChar)); + + // finally, get the class name for the activity + activityClassName = fqActivityName.substring(fqActivityName.lastIndexOf('.') + 1); + } + + // at this point we have the following for the activity: + // activityEntry: this is the manifest entry. For instance .MyActivity + // fqActivityName: full-qualified class name: com.foo.MyActivity + // activityClassName: only the classname: MyActivity + // originalActivityClassName: the classname of the activity being tested (if applicable) + + // Add whatever activity info is needed in the place-holder map. + // Older templates only expect ACTIVITY_NAME to be the same (and unmodified for tests). + if (target.getVersion().getApiLevel() < 4) { // legacy + if (originalActivityEntry != null) { + keywords.put(PH_ACTIVITY_NAME, originalActivityEntry); + } + } else { + // newer templates make a difference between the manifest entries, classnames, + // as well as the main and test classes. + if (activityEntry != null) { + keywords.put(PH_ACTIVITY_ENTRY_NAME, activityEntry); + keywords.put(PH_ACTIVITY_CLASS_NAME, activityClassName); + keywords.put(PH_ACTIVITY_FQ_NAME, fqActivityName); + if (originalActivityClassName != null) { + keywords.put(PH_ACTIVITY_TESTED_CLASS_NAME, originalActivityClassName); + } + } } // Take the project name from the command line if there's one if (projectName != null) { keywords.put(PH_PROJECT_NAME, projectName); } else { - if (activityName != null) { - // Use the activity as project name - keywords.put(PH_PROJECT_NAME, activityName); + if (activityClassName != null) { + // Use the activity class name as project name + keywords.put(PH_PROJECT_NAME, activityClassName); } else { // We need a project name. Just pick up the basename of the project // directory. @@ -242,21 +316,21 @@ public class ProjectCreator { } } - // create the source folder and the java package folders. - String srcFolderPath = SdkConstants.FD_SOURCES + File.separator + packagePath; - File sourceFolder = createDirs(projectFolder, srcFolderPath); - String javaTemplate = "java_file.template"; - String activityFileName = activityName + ".java"; - if (isTestProject) { - javaTemplate = "java_tests_file.template"; - activityFileName = activityName + "Test.java"; - } - installTemplate(javaTemplate, new File(sourceFolder, activityFileName), - keywords, target); + // create the source folder for the activity + if (activityClassName != null) { + String srcActivityFolderPath = SdkConstants.FD_SOURCES + File.separator + activityPath; + File sourceFolder = createDirs(projectFolder, srcActivityFolderPath); - // create the generate source folder - srcFolderPath = SdkConstants.FD_GEN_SOURCES + File.separator + packagePath; - sourceFolder = createDirs(projectFolder, srcFolderPath); + String javaTemplate = isTestProject ? "java_tests_file.template" + : "java_file.template"; + String activityFileName = activityClassName + ".java"; + + installTemplate(javaTemplate, new File(sourceFolder, activityFileName), + keywords, target); + } else { + // we should at least create 'src' + createDirs(projectFolder, SdkConstants.FD_SOURCES); + } // create other useful folders File resourceFodler = createDirs(projectFolder, SdkConstants.FD_RESOURCES); @@ -287,16 +361,6 @@ public class ProjectCreator { installTemplate("build.template", new File(projectFolder, SdkConstants.FN_BUILD_XML), keywords); - - // if this is not a test project, then we create one. - if (isTestProject == false) { - // create the test project folder. - createDirs(projectFolder, FOLDER_TESTS); - File testProjectFolder = new File(folderPath, FOLDER_TESTS); - - createProject(testProjectFolder.getAbsolutePath(), projectName, packageName, - activityName, target, true /*isTestProject*/); - } } catch (ProjectCreateException e) { mLog.error(e, null); } catch (IOException e) { diff --git a/sdkmanager/libs/sdklib/src/com/android/sdklib/internal/project/ProjectProperties.java b/sdkmanager/libs/sdklib/src/com/android/sdklib/internal/project/ProjectProperties.java index 694e285..6e29e5a 100644 --- a/sdkmanager/libs/sdklib/src/com/android/sdklib/internal/project/ProjectProperties.java +++ b/sdkmanager/libs/sdklib/src/com/android/sdklib/internal/project/ProjectProperties.java @@ -251,8 +251,10 @@ public final class ProjectProperties { writer.write(comment); } String value = entry.getValue(); - value = value.replaceAll("\\\\", "\\\\\\\\"); - writer.write(String.format("%s=%s\n", entry.getKey(), value)); + if (value != null) { + value = value.replaceAll("\\\\", "\\\\\\\\"); + writer.write(String.format("%s=%s\n", entry.getKey(), value)); + } } // close the file to flush diff --git a/sdkmanager/libs/sdklib/src/com/android/sdklib/xml/ManifestConstants.java b/sdkmanager/libs/sdklib/src/com/android/sdklib/xml/AndroidManifest.java index 2e20f02..c4fa8bc 100644 --- a/sdkmanager/libs/sdklib/src/com/android/sdklib/xml/ManifestConstants.java +++ b/sdkmanager/libs/sdklib/src/com/android/sdklib/xml/AndroidManifest.java @@ -17,10 +17,10 @@ package com.android.sdklib.xml; /** - * Constants for nodes and attributes of the AndroidManifest.xml file. + * Helper and Constants for the AndroidManifest.xml file. * */ -public final class ManifestConstants { +public final class AndroidManifest { public final static String NODE_MANIFEST = "manifest"; //$NON-NLS-1$ public final static String NODE_APPLICATION = "application"; //$NON-NLS-1$ @@ -42,4 +42,39 @@ public final class ManifestConstants { public final static String ATTRIBUTE_MIN_SDK_VERSION = "minSdkVersion"; //$NON-NLS-$ public final static String ATTRIBUTE_TARGET_PACKAGE = "targetPackage"; //$NON-NLS-1$ public final static String ATTRIBUTE_EXPORTED = "exported"; //$NON-NLS-1$ + + + /** + * Combines a java package, with a class value from the manifest to make a fully qualified + * class name + * @param javaPackage the java package from the manifest. + * @param className the class name from the manifest. + * @return the fully qualified class name. + */ + public static String combinePackageAndClassName(String javaPackage, String className) { + if (className == null || className.length() == 0) { + return javaPackage; + } + if (javaPackage == null || javaPackage.length() == 0) { + return className; + } + + // the class name can be a subpackage (starts with a '.' + // char), a simple class name (no dot), or a full java package + boolean startWithDot = (className.charAt(0) == '.'); + boolean hasDot = (className.indexOf('.') != -1); + if (startWithDot || hasDot == false) { + + // add the concatenation of the package and class name + if (startWithDot) { + return javaPackage + className; + } else { + return javaPackage + '.' + className; + } + } else { + // just add the class as it should be a fully qualified java name. + return className; + } + } + } diff --git a/sdkmanager/libs/sdklib/src/com/android/sdklib/xml/AndroidXPathFactory.java b/sdkmanager/libs/sdklib/src/com/android/sdklib/xml/AndroidXPathFactory.java index fc34aeb..641cd81 100644 --- a/sdkmanager/libs/sdklib/src/com/android/sdklib/xml/AndroidXPathFactory.java +++ b/sdkmanager/libs/sdklib/src/com/android/sdklib/xml/AndroidXPathFactory.java @@ -18,7 +18,9 @@ package com.android.sdklib.xml; import com.android.sdklib.SdkConstants; +import java.util.ArrayList; import java.util.Iterator; +import java.util.List; import javax.xml.XMLConstants; import javax.xml.namespace.NamespaceContext; @@ -39,7 +41,8 @@ public class AndroidXPathFactory { private final static AndroidNamespaceContext sThis = new AndroidNamespaceContext( DEFAULT_NS_PREFIX); - private String mAndroidPrefix; + private final String mAndroidPrefix; + private final List<String> mAndroidPrefixes = new ArrayList<String>(); /** * Returns the default {@link AndroidNamespaceContext}. @@ -54,6 +57,7 @@ public class AndroidXPathFactory { */ public AndroidNamespaceContext(String androidPrefix) { mAndroidPrefix = androidPrefix; + mAndroidPrefixes.add(mAndroidPrefix); } public String getNamespaceURI(String prefix) { @@ -67,14 +71,18 @@ public class AndroidXPathFactory { } public String getPrefix(String namespaceURI) { - // This isn't necessary for our use. - assert false; + if (SdkConstants.NS_RESOURCES.equals(namespaceURI)) { + return mAndroidPrefix; + } + return null; } public Iterator<?> getPrefixes(String namespaceURI) { - // This isn't necessary for our use. - assert false; + if (SdkConstants.NS_RESOURCES.equals(namespaceURI)) { + return mAndroidPrefixes.iterator(); + } + return null; } } |
