blob: 1d688973d3e09fd90571075fb28cd4569b6de630 [file] [log] [blame]
/*
* Copyright (C) 2012 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.motorola.studio.android.launch.ui;
import java.util.Collection;
import java.util.HashSet;
import java.util.Set;
import org.eclipse.core.commands.ExecutionEvent;
import org.eclipse.core.commands.ExecutionException;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Path;
import org.eclipse.core.runtime.Status;
import org.eclipse.debug.core.ILaunchConfiguration;
import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy;
import org.eclipse.debug.ui.AbstractLaunchConfigurationTab;
import org.eclipse.debug.ui.ILaunchConfigurationTab;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.sequoyah.device.framework.events.IInstanceListener;
import org.eclipse.sequoyah.device.framework.events.InstanceEvent;
import org.eclipse.sequoyah.device.framework.events.InstanceEventManager;
import org.eclipse.sequoyah.device.framework.model.IInstance;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Link;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.dialogs.ElementListSelectionDialog;
import org.eclipse.ui.dialogs.ISelectionStatusValidator;
import org.eclipse.ui.plugin.AbstractUIPlugin;
import com.android.ide.eclipse.adt.io.IFolderWrapper;
import com.android.sdklib.xml.AndroidManifestParser;
import com.android.sdklib.xml.ManifestData;
import com.android.sdklib.xml.ManifestData.Activity;
import com.motorola.studio.android.adt.ISerialNumbered;
import com.motorola.studio.android.adt.SdkUtils;
import com.motorola.studio.android.common.log.StudioLogger;
import com.motorola.studio.android.emulator.device.handlers.OpenNewDeviceWizardHandler;
import com.motorola.studio.android.emulator.device.refresh.InstancesListRefresh;
import com.motorola.studio.android.launch.ILaunchConfigurationConstants;
import com.motorola.studio.android.launch.LaunchPlugin;
import com.motorola.studio.android.launch.LaunchUtils;
import com.motorola.studio.android.launch.i18n.LaunchNLS;
/**
* DESCRIPTION: This class implements the tab that is shown when the user is
* editing the configuration to run a MOTODEV Studio for Android application
*
* RESPONSIBILITY: User interface to allow the user to enter information to
* launch the application.
*
* COLABORATORS: This class is one of the tabs of the
* LaunchConfigurationTabGroup
*
* USAGE: This class should be created/used by the LaunchConfigurationTabGroup
* only.
*/
@SuppressWarnings("restriction")
public class LaunchConfigurationTab extends AbstractLaunchConfigurationTab
{
private static final String NAME = LaunchNLS.UI_LaunchConfigurationTab_Tab_Name;
private static final Object UPDATE_WIDGETS_EVENT = new Object();
private Composite mainComposite;
private String projectName = ""; //$NON-NLS-1$
private String activityName = ""; //$NON-NLS-1$
private String deviceName = ""; //$NON-NLS-1$
private boolean activitySpecified = false;
private boolean runDefaultActivity = true;
private final String LAUNCH_DIALOG_HELP = LaunchPlugin.PLUGIN_ID + ".mainLaunchTab"; //$NON-NLS-1$
private Button defaultLauncherButton = null;
private Button vdlLauncherButton = null;
private Button deviceNameBrowseButton = null;
private final IInstanceListener instanceListener = new IInstanceListener()
{
private void fireUpdate()
{
Display currentDisplay = PlatformUI.getWorkbench().getDisplay();
if (!currentDisplay.isDisposed())
{
currentDisplay.syncExec(new Runnable()
{
public void run()
{
updateDeviceChooserButton();
updateLaunchConfigurationDialog();
}
});
}
}
public void instanceUpdated(InstanceEvent instanceevent)
{
fireUpdate();
}
public void instanceUnloaded(InstanceEvent instanceevent)
{
fireUpdate();
}
public void instanceTransitioned(InstanceEvent instanceevent)
{
fireUpdate();
}
public void instanceLoaded(InstanceEvent instanceevent)
{
fireUpdate();
}
public void instanceDeleted(InstanceEvent instanceevent)
{
fireUpdate();
}
public void instanceCreated(InstanceEvent instanceevent)
{
fireUpdate();
}
public void instanceAboutToTransition(InstanceEvent instanceevent)
{
fireUpdate();
}
};
/**
* @see org.eclipse.debug.ui.ILaunchConfigurationTab#createControl(org.eclipse.swt.widgets.Composite)
*/
public void createControl(Composite parent)
{
Composite main = new Composite(parent, SWT.NONE);
GridLayout layout = new GridLayout(1, false);
GridData gd = new GridData(SWT.FILL, SWT.FILL, true, true);
gd.widthHint = 430;
gd.heightHint = 130;
main.setLayout(layout);
main.setLayoutData(gd);
createMainInfoGroup(main);
setControl(main);
}
private void updateDeviceChooserButton()
{
// button is always enabled
if (!deviceNameBrowseButton.isDisposed())
{
deviceNameBrowseButton.setEnabled(true);
}
}
/**
* Create the main information selection group
* @param mainComposite: the parent composite
*/
private void createMainInfoGroup(Composite mainComposite)
{
this.mainComposite = mainComposite;
// create destination group
Group destinationGroup = new Group(mainComposite, SWT.NONE);
GridLayout layout = new GridLayout(3, false);
destinationGroup.setLayout(layout);
GridData defaultDestGridData = new GridData(SWT.FILL, SWT.CENTER, true, false, 3, 1);
destinationGroup.setLayoutData(defaultDestGridData);
destinationGroup.setText(LaunchNLS.LaunchComposite_UI_LaunchComposite_DestinationGroupText);
// Project Name Label
Label projectNameLabel = new Label(destinationGroup, SWT.NONE);
projectNameLabel.setText(LaunchNLS.UI_LaunchComposite_ProjectNameLabel);
GridData folderGridData = new GridData(SWT.LEFT, SWT.CENTER, false, false);
projectNameLabel.setLayoutData(folderGridData);
// Project Name Text
final Text projectNameText = new Text(destinationGroup, SWT.SINGLE | SWT.BORDER);
projectNameText.setText(projectName);
folderGridData = new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1);
projectNameText.setLayoutData(folderGridData);
projectNameText.addModifyListener(new ModifyListener()
{
/*
* (non-Javadoc)
* @see org.eclipse.swt.events.ModifyListener#modifyText(org.eclipse.swt.events.ModifyEvent)
*/
public void modifyText(ModifyEvent e)
{
if (e.data == UPDATE_WIDGETS_EVENT)
{
projectNameText.setText(projectName);
}
else
{
projectName = projectNameText.getText();
updateLaunchConfigurationDialog();
}
}
});
// Project Name Browse Button
Button projectNameBrowseButton = new Button(destinationGroup, SWT.PUSH);
folderGridData = new GridData(SWT.FILL, SWT.CENTER, false, false, 1, 1);
projectNameBrowseButton.setLayoutData(folderGridData);
projectNameBrowseButton.setText(LaunchNLS.UI_LaunchComposite_BrowseButton);
projectNameBrowseButton.addSelectionListener(new SelectionAdapter()
{
@Override
public void widgetSelected(SelectionEvent e)
{
AndroidProjectsSelectionDialog dialog =
new AndroidProjectsSelectionDialog(getShell());
int result = dialog.open();
if (result == Dialog.OK)
{
Object resultProject = dialog.getFirstResult();
if (resultProject instanceof IProject)
{
IProject project = (IProject) resultProject;
projectNameText.setText(project.getName());
}
}
}
});
Group activityGroup = new Group(mainComposite, SWT.NONE);
GridLayout activityLayout = new GridLayout(3, false);
activityGroup.setLayout(activityLayout);
GridData activityGrid = new GridData(SWT.FILL, SWT.CENTER, true, false, 3, 1);
activityGroup.setLayoutData(activityGrid);
activityGroup.setText(LaunchNLS.UI_LaunchComposite_ActivityGroupLabel);
final Button defaultActivityButton = new Button(activityGroup, SWT.RADIO);
defaultActivityButton.setText(LaunchNLS.UI_LaunchComposite_ActivityDefaultButton);
GridData gridData = new GridData(GridData.FILL_HORIZONTAL);
gridData.horizontalSpan = 3;
defaultActivityButton.setLayoutData(gridData);
// Activity Name Button
final Button specificActivityButton = new Button(activityGroup, SWT.RADIO);
specificActivityButton.setText(LaunchNLS.LaunchConfigurationTab_LaunchButton);
GridData activityData = new GridData(SWT.LEFT, SWT.CENTER, false, false);
specificActivityButton.setLayoutData(activityData);
// Activity Name Text
final Text activityNameText = new Text(activityGroup, SWT.SINGLE | SWT.BORDER);
activityNameText.setText(activityName);
activityData = new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1);
activityNameText.setLayoutData(activityData);
activityNameText.addModifyListener(new ModifyListener()
{
/*
* (non-Javadoc)
* @see org.eclipse.swt.events.ModifyListener#modifyText(org.eclipse.swt.events.ModifyEvent)
*/
public void modifyText(ModifyEvent e)
{
if (e.data == UPDATE_WIDGETS_EVENT)
{
activityNameText.setText(activityName);
}
else
{
activityName = activityNameText.getText();
updateLaunchConfigurationDialog();
}
}
});
// Activity Name Browse Button
final Button activityNameBrowseButton = new Button(activityGroup, SWT.PUSH);
activityData = new GridData(SWT.FILL, SWT.CENTER, false, false, 1, 1);
activityNameBrowseButton.setLayoutData(activityData);
activityNameBrowseButton.setText(LaunchNLS.UI_LaunchComposite_BrowseButton);
activityNameBrowseButton.addSelectionListener(new SelectionAdapter()
{
/**
* Retrieve all activities of a given project
* @return All the activities of a given project
*/
private Set<String> getAllActivities(String projectName)
{
String[] tempActivities = null;
Set<String> activities = new HashSet<String>();
if (projectName.length() != 0)
{
IProject selectedProject = LaunchUtils.getProject(projectName);
tempActivities = LaunchUtils.getProjectActivities(selectedProject);
for (String s : tempActivities)
{
activities.add(s);
}
}
return activities;
}
/*
* (non-Javadoc)
* @see org.eclipse.swt.events.SelectionAdapter#widgetSelected(org.eclipse.swt.events.SelectionEvent)
*/
@Override
public void widgetSelected(SelectionEvent e)
{
if (projectName.length() == 0)
{
IWorkbenchWindow ww = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
MessageDialog.openInformation(ww.getShell(),
LaunchNLS.UI_LaunchComposite_ProjectRequiredTitle,
LaunchNLS.UI_LaunchComposite_ProjectRequiredMessage);
}
else
{
ElementListSelectionDialog dialog =
new ElementListSelectionDialog(getShell(), new LabelProvider()
{
@Override
public String getText(Object element)
{
String activity = (String) element;
return activity;
}
})
{
/*
* (non-Javadoc)
* @see org.eclipse.ui.dialogs.ElementListSelectionDialog#createDialogArea(org.eclipse.swt.widgets.Composite)
*/
@Override
protected Control createDialogArea(Composite parent)
{
PlatformUI.getWorkbench().getHelpSystem()
.setHelp(parent, ACTIVITY_SELECTION_DIALOG_HELPID);
return super.createDialogArea(parent);
}
};
dialog.setTitle(LaunchNLS.UI_LaunchComposite_SelectActivityScreenTitle);
dialog.setMessage(LaunchNLS.UI_LaunchComposite_SelectActivityScreenMessage);
Object[] allActivities = getAllActivities(projectNameText.getText()).toArray();
if (allActivities.length == 0)
{
activityNameText.setText(""); //$NON-NLS-1$
}
else
{
dialog.setElements(getAllActivities(projectNameText.getText()).toArray());
int buttonId = dialog.open();
if (buttonId == IDialogConstants.OK_ID)
{
String activity = (String) dialog.getFirstResult();
activityNameText.setText(activity);
}
}
}
}
protected static final String ACTIVITY_SELECTION_DIALOG_HELPID =
"com.motorola.studio.android.launch.activitySelectionDialog"; //$NON-NLS-1$
});
final Button noActivityButton = new Button(activityGroup, SWT.RADIO);
noActivityButton.setText(LaunchNLS.LaunchConfigurationTab_DoNothingButton);
gridData = new GridData(GridData.FILL_HORIZONTAL);
gridData.horizontalSpan = 3;
noActivityButton.setLayoutData(gridData);
defaultActivityButton.addSelectionListener(new SelectionAdapter()
{
@Override
public void widgetSelected(SelectionEvent e)
{
if (e.data == UPDATE_WIDGETS_EVENT)
{
defaultActivityButton.setSelection(!activitySpecified && runDefaultActivity);
activityNameText.setEnabled(activitySpecified);
activityNameBrowseButton.setEnabled(activitySpecified);
}
else
{
// handle variables
handleActivityLauncherTypeVariables(defaultActivityButton,
specificActivityButton, activityNameText, activityNameBrowseButton);
}
}
});
specificActivityButton.addSelectionListener(new SelectionAdapter()
{
@Override
public void widgetSelected(SelectionEvent e)
{
if (e.data == UPDATE_WIDGETS_EVENT)
{
specificActivityButton.setSelection(activitySpecified && !runDefaultActivity);
activityNameText.setEnabled(activitySpecified);
activityNameBrowseButton.setEnabled(activitySpecified);
}
else
{
// handle variables
handleActivityLauncherTypeVariables(defaultActivityButton,
specificActivityButton, activityNameText, activityNameBrowseButton);
}
}
});
noActivityButton.addSelectionListener(new SelectionAdapter()
{
@Override
public void widgetSelected(SelectionEvent e)
{
if (e.data == UPDATE_WIDGETS_EVENT)
{
noActivityButton.setSelection(!activitySpecified && !runDefaultActivity);
activityNameText.setEnabled(activitySpecified);
activityNameBrowseButton.setEnabled(activitySpecified);
}
else
{
// handle variables
handleActivityLauncherTypeVariables(defaultActivityButton,
specificActivityButton, activityNameText, activityNameBrowseButton);
}
}
});
// Device Name Label
Label deviceNameLabel = new Label(destinationGroup, SWT.NONE);
deviceNameLabel.setText(LaunchNLS.UI_LaunchComposite_DeviceNameLabel);
GridData deviceGridData = new GridData(SWT.LEFT, SWT.CENTER, false, false);
deviceNameLabel.setLayoutData(deviceGridData);
// Device Name Text
final Text deviceNameText = new Text(destinationGroup, SWT.SINGLE | SWT.BORDER);
deviceNameText.setText(deviceName);
deviceGridData = new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1);
deviceNameText.setLayoutData(deviceGridData);
deviceNameText.addModifyListener(new ModifyListener()
{
/*
* (non-Javadoc)
* @see org.eclipse.swt.events.ModifyListener#modifyText(org.eclipse.swt.events.ModifyEvent)
*/
public void modifyText(ModifyEvent e)
{
if (e.data == UPDATE_WIDGETS_EVENT)
{
deviceNameText.setText(deviceName);
}
else
{
deviceName = deviceNameText.getText();
updateLaunchConfigurationDialog();
}
}
});
// Device Name Browse Button
deviceNameBrowseButton = new Button(destinationGroup, SWT.PUSH);
deviceGridData = new GridData(SWT.FILL, SWT.CENTER, false, false, 1, 1);
deviceNameBrowseButton.setLayoutData(deviceGridData);
deviceNameBrowseButton.setText(LaunchNLS.UI_LaunchComposite_BrowseButton);
deviceNameBrowseButton.addSelectionListener(new SelectionAdapter()
{
/*
* (non-Javadoc)
* @see org.eclipse.swt.events.SelectionAdapter#widgetSelected(org.eclipse.swt.events.SelectionEvent)
*/
@Override
public void widgetSelected(SelectionEvent e)
{
IProject selectedProject = LaunchUtils.getProject(projectNameText.getText());
DeviceSelectionDialog dialog =
new DeviceSelectionDialog(getShell(),
LaunchNLS.UI_LaunchComposite_SelectDeviceScreenMessage,
selectedProject);
dialog.setTitle(LaunchNLS.UI_LaunchComposite_SelectDeviceScreenTitle);
dialog.setMultipleSelection(false);
dialog.setValidator(new ISelectionStatusValidator()
{
public IStatus validate(Object[] selection)
{
IStatus status = new Status(IStatus.OK, LaunchPlugin.PLUGIN_ID, ""); //$NON-NLS-1$
if (selection.length == 0)
{
status =
new Status(IStatus.ERROR, LaunchPlugin.PLUGIN_ID,
"No selected instance"); //$NON-NLS-1$
}
return status;
}
});
int res = dialog.open();
if (res == IDialogConstants.OK_ID)
{
ISerialNumbered serialNumbered = (ISerialNumbered) dialog.getFirstResult();
String selectedDevice = ((IInstance) serialNumbered).getName();
deviceNameText.setText(selectedDevice);
}
}
});
InstanceEventManager.getInstance().addInstanceListener(instanceListener);
Link createNewAvdLink = new Link(destinationGroup, SWT.NONE);
deviceGridData = new GridData(SWT.RIGHT, SWT.CENTER, true, false, 3, 1);
createNewAvdLink.setLayoutData(deviceGridData);
createNewAvdLink.setText(LaunchNLS.LaunchConfigurationTab_CreateNewAVDLink);
createNewAvdLink.addSelectionListener(new SelectionAdapter()
{
@Override
public void widgetSelected(SelectionEvent e)
{
OpenNewDeviceWizardHandler handler = new OpenNewDeviceWizardHandler();
try
{
handler.execute(new ExecutionEvent());
}
catch (ExecutionException exception)
{
//do nothing
}
}
});
mainComposite.addListener(SWT.Modify, new Listener()
{
/*
* (non-Javadoc)
* @see org.eclipse.swt.widgets.Listener#handleEvent(org.eclipse.swt.widgets.Event)
*/
public void handleEvent(Event e)
{
projectNameText.notifyListeners(SWT.Modify, e);
activityNameText.notifyListeners(SWT.Modify, e);
deviceNameText.notifyListeners(SWT.Modify, e);
defaultActivityButton.notifyListeners(SWT.Selection, e);
specificActivityButton.notifyListeners(SWT.Selection, e);
noActivityButton.notifyListeners(SWT.Selection, e);
if (defaultLauncherButton != null)
{
defaultLauncherButton.notifyListeners(SWT.Selection, e);
}
if (vdlLauncherButton != null)
{
vdlLauncherButton.notifyListeners(SWT.Selection, e);
}
}
});
PlatformUI.getWorkbench().getHelpSystem().setHelp(mainComposite, LAUNCH_DIALOG_HELP); //$NON-NLS-1$
}
/**
* Handle the variables regarding Activity Launcher options.
*
* @param defaultActivityButton {@link Button} for Default Activity.
* @param specificActivityButton {@link Button} for Specific Activity.
* @param activityNameText {@link Text} holding the Activity to be launched name.
* @param activityNameBrowseButton Activity browser {@link Button}.
*/
private void handleActivityLauncherTypeVariables(final Button defaultActivityButton,
final Button specificActivityButton, final Text activityNameText,
final Button activityNameBrowseButton)
{
activitySpecified = specificActivityButton.getSelection();
runDefaultActivity = defaultActivityButton.getSelection();
activityNameText.setEnabled(activitySpecified);
activityNameBrowseButton.setEnabled(activitySpecified);
updateLaunchConfigurationDialog();
}
/**
* @see org.eclipse.debug.ui.ILaunchConfigurationTab#getName()
*/
public String getName()
{
return LaunchConfigurationTab.NAME;
}
/**
* @see org.eclipse.debug.ui.ILaunchConfigurationTab#getImage()
*/
@Override
public Image getImage()
{
return AbstractUIPlugin.imageDescriptorFromPlugin(LaunchPlugin.PLUGIN_ID,
ILaunchConfigurationConstants.MOTODEV_APP_ICO).createImage();
}
@Override
public void dispose()
{
InstanceEventManager.getInstance().removeInstanceListener(instanceListener);
super.dispose();
}
/**
* @see org.eclipse.debug.ui.ILaunchConfigurationTab#initializeFrom(org.eclipse.debug.core.ILaunchConfiguration)
*/
public void initializeFrom(ILaunchConfiguration configuration)
{
// Assure that when loading the configuration, the TmL devices are in sync with the
// AVD available at the SDK
InstancesListRefresh.refresh();
try
{
projectName =
configuration.getAttribute(ILaunchConfigurationConstants.ATTR_PROJECT_NAME,
ILaunchConfigurationConstants.DEFAULT_VALUE);
activityName =
configuration.getAttribute(ILaunchConfigurationConstants.ATTR_ACTIVITY,
ILaunchConfigurationConstants.DEFAULT_VALUE);
activitySpecified =
(configuration.getAttribute(ILaunchConfigurationConstants.ATTR_LAUNCH_ACTION,
ILaunchConfigurationConstants.ATTR_LAUNCH_ACTION_ACTIVITY)) == ILaunchConfigurationConstants.ATTR_LAUNCH_ACTION_ACTIVITY;
runDefaultActivity =
(configuration.getAttribute(ILaunchConfigurationConstants.ATTR_LAUNCH_ACTION,
ILaunchConfigurationConstants.ATTR_LAUNCH_ACTION_ACTIVITY)) == ILaunchConfigurationConstants.ATTR_LAUNCH_ACTION_DEFAULT;
deviceName =
configuration.getAttribute(
ILaunchConfigurationConstants.ATTR_DEVICE_INSTANCE_NAME,
ILaunchConfigurationConstants.DEFAULT_VALUE);
Event e = new Event();
e.type = SWT.Modify;
e.data = UPDATE_WIDGETS_EVENT;
mainComposite.notifyListeners(SWT.Modify, e);
}
catch (CoreException e)
{
// Do nothing for now
}
}
/**
* @see org.eclipse.debug.ui.ILaunchConfigurationTab#performApply(org.eclipse.debug.core.ILaunchConfigurationWorkingCopy)
*/
public void performApply(ILaunchConfigurationWorkingCopy configuration)
{
configuration.setAttribute(ILaunchConfigurationConstants.ATTR_PROJECT_NAME, projectName);
configuration.setAttribute(ILaunchConfigurationConstants.ATTR_ACTIVITY, activityName);
// For now we are not preventing the device chooser dialog to appear if the user choose a
// handset in the device field. However, if the user chooses an AVD, we set the preferred
// AVD field so that we force the launch to happen in the selected AVD without asking the
// user.
Collection<String> validAvds = SdkUtils.getAllValidVmNames();
if (validAvds.contains(deviceName))
{
configuration.setAttribute(ILaunchConfigurationConstants.ATTR_DEVICE_INSTANCE_NAME,
deviceName);
configuration.setAttribute(ILaunchConfigurationConstants.ATTR_ADT_DEVICE_INSTANCE_NAME,
deviceName);
}
else
{
configuration.setAttribute(ILaunchConfigurationConstants.ATTR_DEVICE_INSTANCE_NAME,
deviceName);
configuration
.removeAttribute(ILaunchConfigurationConstants.ATTR_ADT_DEVICE_INSTANCE_NAME);
}
if (activitySpecified)
{
configuration.setAttribute(ILaunchConfigurationConstants.ATTR_LAUNCH_ACTION,
ILaunchConfigurationConstants.ATTR_LAUNCH_ACTION_ACTIVITY);
}
else if (runDefaultActivity)
{
configuration.setAttribute(ILaunchConfigurationConstants.ATTR_LAUNCH_ACTION,
ILaunchConfigurationConstants.ATTR_LAUNCH_ACTION_DEFAULT);
}
else
{
configuration.setAttribute(ILaunchConfigurationConstants.ATTR_LAUNCH_ACTION,
ILaunchConfigurationConstants.ATTR_LAUNCH_ACTION_DO_NOTHING);
}
LaunchUtils.updateLaunchConfigurationDefaults(configuration);
IProject project = LaunchUtils.getProject(projectName);
IResource[] mappedResources = null;
if (project != null)
{
mappedResources = new IResource[]
{
project
};
}
configuration.setMappedResources(mappedResources);
}
/**
* @see org.eclipse.debug.ui.ILaunchConfigurationTab#setDefaults(org.eclipse.debug.core.ILaunchConfigurationWorkingCopy)
*/
public void setDefaults(ILaunchConfigurationWorkingCopy configuration)
{
configuration.setAttribute(ILaunchConfigurationConstants.ATTR_PROJECT_NAME,
ILaunchConfigurationConstants.DEFAULT_VALUE);
configuration.setAttribute(ILaunchConfigurationConstants.ATTR_ACTIVITY,
ILaunchConfigurationConstants.DEFAULT_VALUE);
configuration.setAttribute(ILaunchConfigurationConstants.ATTR_LAUNCH_ACTION,
ILaunchConfigurationConstants.ATTR_LAUNCH_ACTION_DEFAULT);
// It is default not to exist Preferred AVD attribute, so we just set the Studio's
// device instance name attribute here
configuration.setAttribute(ILaunchConfigurationConstants.ATTR_DEVICE_INSTANCE_NAME,
ILaunchConfigurationConstants.DEFAULT_VALUE);
LaunchUtils.setADTLaunchConfigurationDefaults(configuration);
projectName = ILaunchConfigurationConstants.DEFAULT_VALUE; //$NON-NLS-1$
activityName = ILaunchConfigurationConstants.DEFAULT_VALUE; //$NON-NLS-1$
deviceName = ILaunchConfigurationConstants.DEFAULT_VALUE; //$NON-NLS-1$
activitySpecified = ILaunchConfigurationConstants.DEFAULT_BOOL_VALUE;
runDefaultActivity = !ILaunchConfigurationConstants.DEFAULT_BOOL_VALUE;
if (mainComposite != null)
{
Event e = new Event();
e.type = SWT.Modify;
e.data = UPDATE_WIDGETS_EVENT;
mainComposite.notifyListeners(SWT.Modify, e);
}
}
/**
* @see ILaunchConfigurationTab#isValid(ILaunchConfiguration)
*/
@Override
public boolean isValid(ILaunchConfiguration launchConfig)
{
boolean isValid = true;
boolean hasWarning = false;
String projectName = ""; //$NON-NLS-1$
String instanceName = ""; //$NON-NLS-1$
String activityName = ""; //$NON-NLS-1$
try
{
projectName =
launchConfig.getAttribute(ILaunchConfigurationConstants.ATTR_PROJECT_NAME,
ILaunchConfigurationConstants.DEFAULT_VALUE);
instanceName =
launchConfig.getAttribute(
ILaunchConfigurationConstants.ATTR_DEVICE_INSTANCE_NAME, (String) null);
activityName =
launchConfig.getAttribute(ILaunchConfigurationConstants.ATTR_ACTIVITY,
ILaunchConfigurationConstants.DEFAULT_VALUE);
}
catch (CoreException e)
{
StudioLogger.error(LaunchConfigurationTab.class,
"Error validating launch configuration " + launchConfig.getName(), e); //$NON-NLS-1$
}
/* Validate current project */
IProject project = null;
if (isValid && (projectName.length() > 0))
{
Path projectPath = new Path(projectName);
if (!projectPath.isValidSegment(projectName))
{
isValid = false;
setErrorMessage(LaunchNLS.UI_LaunchConfigurationTab_ERR_PROJECT_NOT_EXIST);
}
project = ResourcesPlugin.getWorkspace().getRoot().getProject(projectName);
if ((project != null) && !project.exists())
{
isValid = false;
setErrorMessage(LaunchNLS.UI_LaunchConfigurationTab_ERR_PROJECT_NOT_EXIST);
}
else if ((project != null) && SdkUtils.isLibraryProject(project))
{
isValid = false;
setErrorMessage(LaunchNLS.UI_LaunchConfigurationTab_ERR_PROJECT_IS_LIBRARY);
}
else if (project == null)
{
isValid = false;
setErrorMessage(LaunchNLS.UI_LaunchConfigurationTab_ERR_PROJECT_NOT_EXIST);
}
}
else if (isValid && (projectName.length() == 0))
{
setErrorMessage(null);
}
// if we have a chosen project, enable/disable the device selection
if (project != null)
{
updateDeviceChooserButton();
}
/* Validate current device instance */
if (isValid && (instanceName != null) && (instanceName.length() > 0))
{
IStatus compatible = LaunchUtils.isCompatible(project, instanceName);
if (compatible == null)
{
setErrorMessage(LaunchNLS.UI_LaunchConfigurationTab_ERR_DEVICE_INEXISTENT);
isValid = false;
}
else if (compatible.getSeverity() == IStatus.ERROR)
{
setErrorMessage(compatible.getMessage());
isValid = false;
}
else if (compatible.getSeverity() == IStatus.WARNING)
{
setMessage(compatible.getMessage());
hasWarning = true;
}
}
else if (isValid && (instanceName != null) && (instanceName.length() == 0))
{
setErrorMessage(null);
}
/* Validate current activity */
if (isValid && (activityName.length() > 0) && activitySpecified)
{
/*
* Check if the activity is valid in the current METAINF project
* file
*/
Activity[] currentActivities = null;
boolean activityValid = false;
ManifestData manifestParser = null;
try
{
manifestParser = AndroidManifestParser.parse(new IFolderWrapper(project));
}
catch (Exception e)
{
StudioLogger.error(LaunchUtils.class,
"An error occurred trying to parse AndroidManifest", e); //$NON-NLS-1$
}
if (manifestParser != null)
{
currentActivities = manifestParser.getActivities();
}
else
{
// There's a problem with the manifest file / parser. Invalidate
// current settings.
isValid = false;
setErrorMessage(LaunchNLS.UI_LaunchConfigurationTab_ERR_INVALID_ACTIVITY);
}
/* See if the chosen activity is there */
for (Activity s : currentActivities)
{
if (s.getName().equals(activityName))
{
activityValid = true;
}
}
if (!activityValid)
{
isValid = false;
setErrorMessage(LaunchNLS.UI_LaunchConfigurationTab_ERR_ACTIVITY_NOT_EXIST);
}
}
else if (isValid && ((activityName.length() == 0) && activitySpecified))
{
setErrorMessage(null);
}
/* Wrap up validation */
if (isValid
&& ((projectName.length() == 0)
|| ((activitySpecified) && (activityName.length() == 0)) || (instanceName
.length() == 0)))
{
isValid = false;
if (projectName.length() == 0)
{
setMessage(LaunchNLS.UI_LaunchConfigurationTab_InfoSelectProject);
}
else if (instanceName.length() == 0)
{
setMessage(LaunchNLS.UI_LaunchConfigurationTab_InfoSelectInstance);
}
else if (activityName.length() == 0)
{
setMessage(LaunchNLS.UI_LaunchConfigurationTab_InfoSelectActivity);
}
}
if (isValid)
{
setErrorMessage(null);
if (!hasWarning)
{
setMessage(null);
}
}
return isValid;
}
}