| /* |
| * 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; |
| } |
| } |