/** Creates a new Android project based on command-line parameters */ private void createProject(boolean library) { String directObject = library ? SdkCommandLine.OBJECT_LIB_PROJECT : SdkCommandLine.OBJECT_PROJECT; // get the target and try to resolve it. int targetId = resolveTargetName(mSdkCommandLine.getParamTargetId()); IAndroidTarget[] targets = mSdkManager.getTargets(); if (targetId == INVALID_TARGET_ID || targetId > targets.length) { errorAndExit( "Target id is not valid. Use '%s list targets' to get the target ids.", SdkConstants.androidCmdName()); } IAndroidTarget target = targets[targetId - 1]; // target id is 1-based ProjectCreator creator = getProjectCreator(); String projectDir = getProjectLocation(mSdkCommandLine.getParamLocationPath()); String projectName = mSdkCommandLine.getParamName(); String packageName = mSdkCommandLine.getParamProjectPackage(directObject); String activityName = null; if (library == false) { activityName = mSdkCommandLine.getParamProjectActivity(); } 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; } if (activityName != null && !ProjectCreator.RE_ACTIVITY_NAME.matcher(activityName).matches()) { errorAndExit( "Activity name '%1$s' contains invalid characters.\nAllowed characters are: %2$s", activityName, ProjectCreator.CHARS_ACTIVITY_NAME); return; } if (packageName != null && !ProjectCreator.RE_PACKAGE_NAME.matcher(packageName).matches()) { errorAndExit( "Package name '%1$s' contains invalid characters.\n" + "A package name must be constitued of two Java identifiers.\n" + "Each identifier allowed characters are: %2$s", packageName, ProjectCreator.CHARS_PACKAGE_NAME); return; } creator.createProject( projectDir, projectName, packageName, activityName, target, library, 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 try { parentProject = new File(projectDir, pathToMainProject).getCanonicalFile(); } catch (IOException e) { errorAndExit("Unable to resolve Main project's directory: %1$s", pathToMainProject); return; // help Eclipse static analyzer understand we'll never execute the rest. } } if (parentProject.isDirectory() == false) { errorAndExit("Main project's directory does not exist: %1$s", pathToMainProject); return; } // 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()); return; } // 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); if (p == null) { errorAndExit("Unable to load the main project's %1$s", PropertyType.DEFAULT.getFilename()); return; } String targetHash = p.getProperty(ProjectProperties.PROPERTY_TARGET); if (targetHash == null) { errorAndExit("Couldn't find the main project target"); return; } // 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); return; } mSdkLog.printf("Found main project target: %1$s\n", target.getFullName()); ProjectCreator creator = getProjectCreator(); 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, false /* library*/, pathToMainProject); }