blob: c8325345a9afed422aa5f6c1c1cf11a27083075b [file] [log] [blame]
/*
* Copyright (C) 2011 The Android Open Source Project
*
* Licensed under the Eclipse Public License, Version 1.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.eclipse.org/org/documents/epl-v10.php
*
* 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.ide.eclipse.adt.internal.wizards.newproject;
import com.android.SdkConstants;
import com.android.ide.eclipse.adt.AdtConstants;
import com.android.ide.eclipse.adt.AdtPlugin;
import com.android.ide.eclipse.adt.internal.sdk.Sdk;
import com.android.ide.eclipse.adt.internal.sdk.Sdk.ITargetChangeListener;
import com.android.ide.eclipse.adt.internal.wizards.newproject.NewProjectWizardState.Mode;
import com.android.sdklib.IAndroidTarget;
import org.eclipse.core.filesystem.URIUtil;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IWorkspace;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Path;
import org.eclipse.core.runtime.Status;
import org.eclipse.jdt.core.JavaConventions;
import org.eclipse.jface.dialogs.IMessageProvider;
import org.eclipse.jface.wizard.WizardPage;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Text;
import java.io.File;
import java.io.FileFilter;
import java.net.URI;
/** Page where you choose the application name, activity name, and optional test project info */
public class ApplicationInfoPage extends WizardPage implements SelectionListener, ModifyListener,
ITargetChangeListener {
private static final String JDK_15 = "1.5"; //$NON-NLS-1$
private final static String DUMMY_PACKAGE = "your.package.namespace";
/** Suffix added by default to activity names */
static final String ACTIVITY_NAME_SUFFIX = "Activity"; //$NON-NLS-1$
private final NewProjectWizardState mValues;
private Text mApplicationText;
private Text mPackageText;
private Text mActivityText;
private Button mCreateActivityCheckbox;
private Combo mSdkCombo;
private boolean mIgnore;
private Button mCreateTestCheckbox;
private Text mTestProjectNameText;
private Text mTestApplicationText;
private Text mTestPackageText;
private Label mTestProjectNameLabel;
private Label mTestApplicationLabel;
private Label mTestPackageLabel;
/**
* Create the wizard.
*/
ApplicationInfoPage(NewProjectWizardState values) {
super("appInfo"); //$NON-NLS-1$
mValues = values;
setTitle("Application Info");
setDescription("Configure the new Android Project");
AdtPlugin.getDefault().addTargetListener(this);
}
/**
* Create contents of the wizard.
*/
@Override
@SuppressWarnings("unused") // Eclipse marks SWT constructors with side effects as unused
public void createControl(Composite parent) {
Composite container = new Composite(parent, SWT.NULL);
container.setLayout(new GridLayout(2, false));
Label applicationLabel = new Label(container, SWT.NONE);
applicationLabel.setText("Application Name:");
mApplicationText = new Text(container, SWT.BORDER);
mApplicationText.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
mApplicationText.addModifyListener(this);
Label packageLabel = new Label(container, SWT.NONE);
packageLabel.setText("Package Name:");
mPackageText = new Text(container, SWT.BORDER);
mPackageText.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
mPackageText.addModifyListener(this);
if (mValues.mode != Mode.TEST) {
mCreateActivityCheckbox = new Button(container, SWT.CHECK);
mCreateActivityCheckbox.setText("Create Activity:");
mCreateActivityCheckbox.addSelectionListener(this);
mActivityText = new Text(container, SWT.BORDER);
mActivityText.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
mActivityText.addModifyListener(this);
}
Label minSdkLabel = new Label(container, SWT.NONE);
minSdkLabel.setText("Minimum SDK:");
mSdkCombo = new Combo(container, SWT.NONE);
GridData gdSdkCombo = new GridData(SWT.LEFT, SWT.CENTER, true, false, 1, 1);
gdSdkCombo.widthHint = 200;
mSdkCombo.setLayoutData(gdSdkCombo);
mSdkCombo.addSelectionListener(this);
mSdkCombo.addModifyListener(this);
onSdkLoaded();
setControl(container);
new Label(container, SWT.NONE);
new Label(container, SWT.NONE);
mCreateTestCheckbox = new Button(container, SWT.CHECK);
mCreateTestCheckbox.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false, 2, 1));
mCreateTestCheckbox.setText("Create a Test Project");
mCreateTestCheckbox.addSelectionListener(this);
mTestProjectNameLabel = new Label(container, SWT.NONE);
mTestProjectNameLabel.setText("Test Project Name:");
mTestProjectNameText = new Text(container, SWT.BORDER);
mTestProjectNameText.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
mTestProjectNameText.addModifyListener(this);
mTestApplicationLabel = new Label(container, SWT.NONE);
mTestApplicationLabel.setText("Test Application:");
mTestApplicationText = new Text(container, SWT.BORDER);
mTestApplicationText.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
mTestApplicationText.addModifyListener(this);
mTestPackageLabel = new Label(container, SWT.NONE);
mTestPackageLabel.setText("Test Package:");
mTestPackageText = new Text(container, SWT.BORDER);
mTestPackageText.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
mTestPackageText.addModifyListener(this);
}
/** Controls whether the options for creating a paired test project should be shown */
private void showTestOptions(boolean visible) {
if (mValues.mode == Mode.SAMPLE) {
visible = false;
}
mCreateTestCheckbox.setVisible(visible);
mTestProjectNameLabel.setVisible(visible);
mTestProjectNameText.setVisible(visible);
mTestApplicationLabel.setVisible(visible);
mTestApplicationText.setVisible(visible);
mTestPackageLabel.setVisible(visible);
mTestPackageText.setVisible(visible);
}
/** Controls whether the options for creating a paired test project should be enabled */
private void enableTestOptions(boolean enabled) {
mTestProjectNameLabel.setEnabled(enabled);
mTestProjectNameText.setEnabled(enabled);
mTestApplicationLabel.setEnabled(enabled);
mTestApplicationText.setEnabled(enabled);
mTestPackageLabel.setEnabled(enabled);
mTestPackageText.setEnabled(enabled);
}
@Override
public void setVisible(boolean visible) {
super.setVisible(visible);
if (visible) {
try {
mIgnore = true;
if (mValues.applicationName != null) {
mApplicationText.setText(mValues.applicationName);
}
if (mValues.packageName != null) {
mPackageText.setText(mValues.packageName);
} else {
mPackageText.setText(DUMMY_PACKAGE);
}
if (mValues.mode != Mode.TEST) {
mCreateActivityCheckbox.setSelection(mValues.createActivity);
mActivityText.setEnabled(mValues.createActivity);
if (mValues.activityName != null) {
mActivityText.setText(mValues.activityName);
}
}
if (mValues.minSdk != null && mValues.minSdk.length() > 0) {
mSdkCombo.setText(mValues.minSdk);
}
showTestOptions(mValues.mode == Mode.ANY);
enableTestOptions(mCreateTestCheckbox.getSelection());
if (mValues.testProjectName != null) {
mTestProjectNameText.setText(mValues.testProjectName);
}
if (mValues.testApplicationName != null) {
mTestApplicationText.setText(mValues.testApplicationName);
}
if (mValues.testProjectName != null) {
mTestPackageText.setText(mValues.testProjectName);
}
} finally {
mIgnore = false;
}
}
// Start focus with the package name, since the other fields are typically assigned
// reasonable defaults
mPackageText.setFocus();
mPackageText.selectAll();
validatePage();
}
protected void setSdkTargets(IAndroidTarget[] targets, IAndroidTarget target) {
if (targets == null) {
targets = new IAndroidTarget[0];
}
int selectionIndex = -1;
String[] items = new String[targets.length];
for (int i = 0, n = targets.length; i < n; i++) {
items[i] = targetLabel(targets[i]);
if (targets[i] == target) {
selectionIndex = i;
}
}
try {
mIgnore = true;
mSdkCombo.setItems(items);
mSdkCombo.setData(targets);
if (selectionIndex != -1) {
mSdkCombo.select(selectionIndex);
}
} finally {
mIgnore = false;
}
}
private String targetLabel(IAndroidTarget target) {
// In the minimum SDK chooser, show the targets with api number and description,
// such as "11 (Android 3.0)"
return String.format("%1$s (%2$s)", target.getVersion().getApiString(),
target.getFullName());
}
@Override
public void dispose() {
AdtPlugin.getDefault().removeTargetListener(this);
super.dispose();
}
@Override
public boolean isPageComplete() {
// This page is only needed when creating new projects
if (mValues.useExisting || mValues.mode != Mode.ANY) {
return true;
}
// Ensure that we reach this page
if (mValues.packageName == null) {
return false;
}
return super.isPageComplete();
}
@Override
public void modifyText(ModifyEvent e) {
if (mIgnore) {
return;
}
Object source = e.getSource();
if (source == mSdkCombo) {
mValues.minSdk = mSdkCombo.getText().trim();
IAndroidTarget[] targets = (IAndroidTarget[]) mSdkCombo.getData();
// An editable combo will treat item selection the same way as a user edit,
// so we need to see if the string looks like a labeled version
int index = mSdkCombo.getSelectionIndex();
if (index != -1) {
if (index >= 0 && index < targets.length) {
IAndroidTarget target = targets[index];
if (targetLabel(target).equals(mValues.minSdk)) {
mValues.minSdk = target.getVersion().getApiString();
}
}
}
// Ensure that we never pick up the (Android x.y) suffix shown in combobox
// for readability
int separator = mValues.minSdk.indexOf(' ');
if (separator != -1) {
mValues.minSdk = mValues.minSdk.substring(0, separator);
}
mValues.minSdkModifiedByUser = true;
mValues.updateSdkTargetToMatchMinSdkVersion();
} else if (source == mApplicationText) {
mValues.applicationName = mApplicationText.getText().trim();
mValues.applicationNameModifiedByUser = true;
if (!mValues.testApplicationNameModified) {
mValues.testApplicationName = suggestTestApplicationName(mValues.applicationName);
try {
mIgnore = true;
mTestApplicationText.setText(mValues.testApplicationName);
} finally {
mIgnore = false;
}
}
} else if (source == mPackageText) {
mValues.packageName = mPackageText.getText().trim();
mValues.packageNameModifiedByUser = true;
if (!mValues.testPackageModified) {
mValues.testPackageName = suggestTestPackage(mValues.packageName);
try {
mIgnore = true;
mTestPackageText.setText(mValues.testPackageName);
} finally {
mIgnore = false;
}
}
} else if (source == mActivityText) {
mValues.activityName = mActivityText.getText().trim();
mValues.activityNameModifiedByUser = true;
} else if (source == mTestApplicationText) {
mValues.testApplicationName = mTestApplicationText.getText().trim();
mValues.testApplicationNameModified = true;
} else if (source == mTestPackageText) {
mValues.testPackageName = mTestPackageText.getText().trim();
mValues.testPackageModified = true;
} else if (source == mTestProjectNameText) {
mValues.testProjectName = mTestProjectNameText.getText().trim();
mValues.testProjectModified = true;
}
validatePage();
}
@Override
public void widgetSelected(SelectionEvent e) {
if (mIgnore) {
return;
}
Object source = e.getSource();
if (source == mCreateActivityCheckbox) {
mValues.createActivity = mCreateActivityCheckbox.getSelection();
mActivityText.setEnabled(mValues.createActivity);
} else if (source == mSdkCombo) {
int index = mSdkCombo.getSelectionIndex();
IAndroidTarget[] targets = (IAndroidTarget[]) mSdkCombo.getData();
if (index != -1) {
if (index >= 0 && index < targets.length) {
IAndroidTarget target = targets[index];
// Even though we are showing the logical version name, we place the
// actual api number as the minimum SDK
mValues.minSdk = target.getVersion().getApiString();
}
} else {
String text = mSdkCombo.getText();
boolean found = false;
for (IAndroidTarget target : targets) {
if (targetLabel(target).equals(text)) {
mValues.minSdk = target.getVersion().getApiString();
found = true;
break;
}
}
if (!found) {
mValues.minSdk = text;
}
}
} else if (source == mCreateTestCheckbox) {
mValues.createPairProject = mCreateTestCheckbox.getSelection();
enableTestOptions(mValues.createPairProject);
if (mValues.createPairProject) {
if (mValues.testProjectName == null || mValues.testProjectName.length() == 0) {
mValues.testProjectName = suggestTestProjectName(mValues.projectName);
}
if (mValues.testApplicationName == null ||
mValues.testApplicationName.length() == 0) {
mValues.testApplicationName =
suggestTestApplicationName(mValues.applicationName);
}
if (mValues.testPackageName == null || mValues.testPackageName.length() == 0) {
mValues.testPackageName = suggestTestPackage(mValues.packageName);
}
try {
mIgnore = true;
mTestProjectNameText.setText(mValues.testProjectName);
mTestApplicationText.setText(mValues.testApplicationName);
mTestPackageText.setText(mValues.testPackageName);
} finally {
mIgnore = false;
}
}
}
validatePage();
}
@Override
public void widgetDefaultSelected(SelectionEvent e) {
}
private void validatePage() {
IStatus status = validatePackage(mValues.packageName);
if (status == null || status.getSeverity() != IStatus.ERROR) {
IStatus validActivity = validateActivity();
if (validActivity != null) {
status = validActivity;
}
}
if (status == null || status.getSeverity() != IStatus.ERROR) {
IStatus validMinSdk = validateMinSdk();
if (validMinSdk != null) {
status = validMinSdk;
}
}
if (status == null || status.getSeverity() != IStatus.ERROR) {
IStatus validSourceFolder = validateSourceFolder();
if (validSourceFolder != null) {
status = validSourceFolder;
}
}
// If creating a test project to go along with the main project, also validate
// the additional test project parameters
if (status == null || status.getSeverity() != IStatus.ERROR) {
if (mValues.createPairProject) {
IStatus validTestProject = ProjectNamePage.validateProjectName(
mValues.testProjectName);
if (validTestProject != null) {
status = validTestProject;
}
if (status == null || status.getSeverity() != IStatus.ERROR) {
IStatus validTestLocation = validateTestProjectLocation();
if (validTestLocation != null) {
status = validTestLocation;
}
}
if (status == null || status.getSeverity() != IStatus.ERROR) {
IStatus validTestPackage = validatePackage(mValues.testPackageName);
if (validTestPackage != null) {
status = new Status(validTestPackage.getSeverity(),
AdtPlugin.PLUGIN_ID,
validTestPackage.getMessage() + " (in test package)");
}
}
if (status == null || status.getSeverity() != IStatus.ERROR) {
if (mValues.projectName.equals(mValues.testProjectName)) {
status = new Status(IStatus.ERROR, AdtPlugin.PLUGIN_ID,
"The main project name and the test project name must be different.");
}
}
}
}
// -- update UI & enable finish if there's no error
setPageComplete(status == null || status.getSeverity() != IStatus.ERROR);
if (status != null) {
setMessage(status.getMessage(),
status.getSeverity() == IStatus.ERROR
? IMessageProvider.ERROR : IMessageProvider.WARNING);
} else {
setErrorMessage(null);
setMessage(null);
}
}
private IStatus validateTestProjectLocation() {
assert mValues.createPairProject;
// Validate location
Path path = new Path(mValues.projectLocation.getPath());
if (!mValues.useExisting) {
if (!mValues.useDefaultLocation) {
// If not using the default value validate the location.
URI uri = URIUtil.toURI(path.toOSString());
IWorkspace workspace = ResourcesPlugin.getWorkspace();
IProject handle = workspace.getRoot().getProject(mValues.testProjectName);
IStatus locationStatus = workspace.validateProjectLocationURI(handle, uri);
if (!locationStatus.isOK()) {
return locationStatus;
}
// The location is valid as far as Eclipse is concerned (i.e. mostly not
// an existing workspace project.) Check it either doesn't exist or is
// a directory that is empty.
File f = path.toFile();
if (f.exists() && !f.isDirectory()) {
return new Status(IStatus.ERROR, AdtPlugin.PLUGIN_ID,
"A directory name must be specified.");
} else if (f.isDirectory()) {
// However if the directory exists, we should put a
// warning if it is not empty. We don't put an error
// (we'll ask the user again for confirmation before
// using the directory.)
String[] l = f.list();
if (l != null && l.length != 0) {
return new Status(IStatus.WARNING, AdtPlugin.PLUGIN_ID,
"The selected output directory is not empty.");
}
}
} else {
IPath destPath = path.removeLastSegments(1).append(mValues.testProjectName);
File dest = destPath.toFile();
if (dest.exists()) {
return new Status(IStatus.ERROR, AdtPlugin.PLUGIN_ID,
String.format(
"There is already a file or directory named \"%1$s\" in the selected location.",
mValues.testProjectName));
}
}
}
return null;
}
private IStatus validateSourceFolder() {
// This check does nothing when creating a new project.
// This check is also useless when no activity is present or created.
mValues.sourceFolder = SdkConstants.FD_SOURCES;
if (!mValues.useExisting || !mValues.createActivity) {
return null;
}
String osTarget = mValues.activityName;
if (osTarget.indexOf('.') == -1) {
osTarget = mValues.packageName + File.separator + osTarget;
} else if (osTarget.indexOf('.') == 0) {
osTarget = mValues.packageName + osTarget;
}
osTarget = osTarget.replace('.', File.separatorChar) + SdkConstants.DOT_JAVA;
File projectDir = mValues.projectLocation;
File[] allDirs = projectDir.listFiles(new FileFilter() {
@Override
public boolean accept(File pathname) {
return pathname.isDirectory();
}
});
if (allDirs != null) {
boolean found = false;
for (File f : allDirs) {
Path path = new Path(f.getAbsolutePath());
File java_activity = path.append(osTarget).toFile();
if (java_activity.isFile()) {
mValues.sourceFolder = f.getName();
found = true;
break;
}
}
if (!found) {
String projectPath = projectDir.getPath();
if (allDirs.length > 0) {
return new Status(IStatus.ERROR, AdtPlugin.PLUGIN_ID,
String.format("%1$s can not be found under %2$s.", osTarget,
projectPath));
} else {
return new Status(IStatus.ERROR, AdtPlugin.PLUGIN_ID,
String.format("No source folders can be found in %1$s.",
projectPath));
}
}
}
return null;
}
private IStatus validateMinSdk() {
// Validate min SDK field
// If the min sdk version is empty, it is always accepted.
if (mValues.minSdk == null || mValues.minSdk.length() == 0) {
return null;
}
IAndroidTarget target = mValues.target;
if (target == null) {
return null;
}
// If the current target is a preview, explicitly indicate minSdkVersion
// must be set to this target name.
if (target.getVersion().isPreview() && !target.getVersion().equals(mValues.minSdk)) {
return new Status(IStatus.ERROR, AdtPlugin.PLUGIN_ID,
String.format(
"The SDK target is a preview. Min SDK Version must be set to '%s'.",
target.getVersion().getCodename()));
}
if (!target.getVersion().equals(mValues.minSdk)) {
return new Status(target.getVersion().isPreview() ? IStatus.ERROR : IStatus.WARNING,
AdtPlugin.PLUGIN_ID,
"The API level for the selected SDK target does not match the Min SDK Version."
);
}
return null;
}
public static IStatus validatePackage(String packageFieldContents) {
// Validate package
if (packageFieldContents == null || packageFieldContents.length() == 0) {
return new Status(IStatus.ERROR, AdtPlugin.PLUGIN_ID,
"Package name must be specified.");
} else if (packageFieldContents.equals(DUMMY_PACKAGE)) {
// The dummy package name is just a placeholder package (which isn't even valid
// because it contains the reserved Java keyword "package") but we want to
// make the error message say that a proper package should be entered rather than
// what's wrong with this specific package. (And the reason we provide a dummy
// package rather than a blank line is to make it more clear to beginners what
// we're looking for.
return new Status(IStatus.ERROR, AdtPlugin.PLUGIN_ID,
"Package name must be specified.");
}
// Check it's a valid package string
IStatus status = JavaConventions.validatePackageName(packageFieldContents, JDK_15,
JDK_15);
if (!status.isOK()) {
return status;
}
// The Android Activity Manager does not accept packages names with only one
// identifier. Check the package name has at least one dot in them (the previous rule
// validated that if such a dot exist, it's not the first nor last characters of the
// string.)
if (packageFieldContents.indexOf('.') == -1) {
return new Status(IStatus.ERROR, AdtPlugin.PLUGIN_ID,
"Package name must have at least two identifiers.");
}
return null;
}
public static IStatus validateClass(String className) {
if (className == null || className.length() == 0) {
return new Status(IStatus.ERROR, AdtPlugin.PLUGIN_ID,
"Class name must be specified.");
}
if (className.indexOf('.') != -1) {
return new Status(IStatus.ERROR, AdtPlugin.PLUGIN_ID,
"Enter just a class name, not a full package name");
}
return JavaConventions.validateJavaTypeName(className, JDK_15, JDK_15);
}
private IStatus validateActivity() {
// Validate activity (if creating an activity)
if (!mValues.createActivity) {
return null;
}
return validateActivity(mValues.activityName);
}
/**
* Validates the given activity name
*
* @param activityFieldContents the activity name to validate
* @return a status for whether the activity name is valid
*/
public static IStatus validateActivity(String activityFieldContents) {
// Validate activity field
if (activityFieldContents == null || activityFieldContents.length() == 0) {
return new Status(IStatus.ERROR, AdtPlugin.PLUGIN_ID,
"Activity name must be specified.");
} else if (ACTIVITY_NAME_SUFFIX.equals(activityFieldContents)) {
return new Status(IStatus.ERROR, AdtPlugin.PLUGIN_ID, "Enter a valid activity name");
} else if (activityFieldContents.contains("..")) { //$NON-NLS-1$
return new Status(IStatus.ERROR, AdtPlugin.PLUGIN_ID,
"Package segments in activity name cannot be empty (..)");
}
// The activity field can actually contain part of a sub-package name
// or it can start with a dot "." to indicates it comes from the parent package
// name.
String packageName = ""; //$NON-NLS-1$
int pos = activityFieldContents.lastIndexOf('.');
if (pos >= 0) {
packageName = activityFieldContents.substring(0, pos);
if (packageName.startsWith(".")) { //$NON-NLS-1$
packageName = packageName.substring(1);
}
activityFieldContents = activityFieldContents.substring(pos + 1);
}
// the activity field can contain a simple java identifier, or a
// package name or one that starts with a dot. So if it starts with a dot,
// ignore this dot -- the rest must look like a package name.
if (activityFieldContents.length() > 0 && activityFieldContents.charAt(0) == '.') {
activityFieldContents = activityFieldContents.substring(1);
}
// Check it's a valid activity string
IStatus status = JavaConventions.validateTypeVariableName(activityFieldContents, JDK_15,
JDK_15);
if (!status.isOK()) {
return status;
}
// Check it's a valid package string
if (packageName.length() > 0) {
status = JavaConventions.validatePackageName(packageName, JDK_15, JDK_15);
if (!status.isOK()) {
return new Status(IStatus.ERROR, AdtPlugin.PLUGIN_ID,
status.getMessage() + " (in the activity name)");
}
}
return null;
}
// ---- Implement ITargetChangeListener ----
@Override
public void onSdkLoaded() {
if (mSdkCombo == null) {
return;
}
// Update the sdk target selector with the new targets
// get the targets from the sdk
IAndroidTarget[] targets = null;
if (Sdk.getCurrent() != null) {
targets = Sdk.getCurrent().getTargets();
}
setSdkTargets(targets, mValues.target);
}
@Override
public void onProjectTargetChange(IProject changedProject) {
// Ignore
}
@Override
public void onTargetLoaded(IAndroidTarget target) {
// Ignore
}
public static String suggestTestApplicationName(String applicationName) {
if (applicationName == null) {
applicationName = ""; //$NON-NLS-1$
}
if (applicationName.indexOf(' ') != -1) {
return applicationName + " Test"; //$NON-NLS-1$
} else {
return applicationName + "Test"; //$NON-NLS-1$
}
}
public static String suggestTestProjectName(String projectName) {
if (projectName == null) {
projectName = ""; //$NON-NLS-1$
}
if (projectName.length() > 0 && Character.isUpperCase(projectName.charAt(0))) {
return projectName + "Test"; //$NON-NLS-1$
} else {
return projectName + "-test"; //$NON-NLS-1$
}
}
public static String suggestTestPackage(String packagePath) {
if (packagePath == null) {
packagePath = ""; //$NON-NLS-1$
}
return packagePath + ".test"; //$NON-NLS-1$
}
}