summaryrefslogtreecommitdiff
path: root/src/plugins/launch/src/com/motorola/studio/android/launch/ui/LaunchConfigurationTab.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/plugins/launch/src/com/motorola/studio/android/launch/ui/LaunchConfigurationTab.java')
-rw-r--r--src/plugins/launch/src/com/motorola/studio/android/launch/ui/LaunchConfigurationTab.java981
1 files changed, 981 insertions, 0 deletions
diff --git a/src/plugins/launch/src/com/motorola/studio/android/launch/ui/LaunchConfigurationTab.java b/src/plugins/launch/src/com/motorola/studio/android/launch/ui/LaunchConfigurationTab.java
new file mode 100644
index 0000000..1d68897
--- /dev/null
+++ b/src/plugins/launch/src/com/motorola/studio/android/launch/ui/LaunchConfigurationTab.java
@@ -0,0 +1,981 @@
+/*
+ * 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;
+ }
+}