155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project/*
255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project * Copyright (C) 2007 The Android Open Source Project
355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project *
455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project * Licensed under the Eclipse Public License, Version 1.0 (the "License");
555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project * you may not use this file except in compliance with the License.
655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project * You may obtain a copy of the License at
755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project *
855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project *      http://www.eclipse.org/org/documents/epl-v10.php
955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project *
1055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project * Unless required by applicable law or agreed to in writing, software
1155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
1255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project * See the License for the specific language governing permissions and
1455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project * limitations under the License.
1555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project */
1655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
1785211cd176c655f245e46b753926089adaf2a6fdXavier Ducrohetpackage com.android.ide.eclipse.adt.internal.launch;
1855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
1955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Projectimport com.android.ddmlib.AndroidDebugBridge;
2081cefe2a26dd6db8a878e30874d12cdcbff0e83bXavier Ducrohetimport com.android.ide.common.xml.ManifestData;
2181cefe2a26dd6db8a878e30874d12cdcbff0e83bXavier Ducrohetimport com.android.ide.common.xml.ManifestData.Activity;
22c3105b949cd2a0f6cbf8a12ec4f30e49b5b5a502Xavier Ducrohetimport com.android.ide.eclipse.adt.AdtConstants;
23a1aa60efc6ed4f86846804936c0d947994b3d3fbJosiah Gaskinimport com.android.ide.eclipse.adt.AdtPlugin;
2485211cd176c655f245e46b753926089adaf2a6fdXavier Ducrohetimport com.android.ide.eclipse.adt.internal.launch.AndroidLaunchConfiguration.TargetMode;
25d5579c79e7dcb1eda9835f5a2c7299be7eab28b0Xavier Ducrohetimport com.android.ide.eclipse.adt.internal.project.AndroidManifestHelper;
2699b9ad2143e5e9e626879309ecc6f883403bdcaeXavier Ducrohetimport com.android.ide.eclipse.adt.internal.project.ProjectHelper;
2755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
2855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Projectimport org.eclipse.core.resources.IFile;
2955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Projectimport org.eclipse.core.resources.IProject;
3055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Projectimport org.eclipse.core.resources.IWorkspace;
3155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Projectimport org.eclipse.core.resources.ResourcesPlugin;
3255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Projectimport org.eclipse.core.runtime.CoreException;
3355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Projectimport org.eclipse.core.runtime.IProgressMonitor;
3455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Projectimport org.eclipse.debug.core.ILaunch;
3555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Projectimport org.eclipse.debug.core.ILaunchConfiguration;
3655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Projectimport org.eclipse.debug.core.model.LaunchConfigurationDelegate;
3755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Projectimport org.eclipse.jdt.core.JavaCore;
3855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Projectimport org.eclipse.jdt.launching.IJavaLaunchConfigurationConstants;
3955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
4055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project/**
4155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project * Implementation of an eclipse LauncConfigurationDelegate to launch android
4255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project * application in debug.
4355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project */
4455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Projectpublic class LaunchConfigDelegate extends LaunchConfigurationDelegate {
4555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    final static int INVALID_DEBUG_PORT = -1;
462084837bba5a7534b90697263d82a197854cf226Xavier Ducrohet
4755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    public final static String ANDROID_LAUNCH_TYPE_ID =
4855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        "com.android.ide.eclipse.adt.debug.LaunchConfigType"; //$NON-NLS-1$
4955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
5055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    /** Target mode parameters: true is automatic, false is manual */
5155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    public static final String ATTR_TARGET_MODE = AdtPlugin.PLUGIN_ID + ".target"; //$NON-NLS-1$
52fe41de20dcfdca14bddaa57d728e79550c3336abXavier Ducrohet    public static final TargetMode DEFAULT_TARGET_MODE = TargetMode.AUTO;
5355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
54d43a349cecbf4c35b5d7286af4fe34a0a5aa693eSiva Velusamy    /** Flag indicating whether the last used device should be used for future launches. */
55d43a349cecbf4c35b5d7286af4fe34a0a5aa693eSiva Velusamy    public static final String ATTR_REUSE_LAST_USED_DEVICE =
56d43a349cecbf4c35b5d7286af4fe34a0a5aa693eSiva Velusamy            AdtPlugin.PLUGIN_ID + ".reuse.last.used.device"; //$NON-NLS-1$
57d43a349cecbf4c35b5d7286af4fe34a0a5aa693eSiva Velusamy
58d43a349cecbf4c35b5d7286af4fe34a0a5aa693eSiva Velusamy    /** Device on which the last launch happened. */
59d43a349cecbf4c35b5d7286af4fe34a0a5aa693eSiva Velusamy    public static final String ATTR_LAST_USED_DEVICE =
60d43a349cecbf4c35b5d7286af4fe34a0a5aa693eSiva Velusamy            AdtPlugin.PLUGIN_ID + ".last.used.device"; //$NON-NLS-1$
61d43a349cecbf4c35b5d7286af4fe34a0a5aa693eSiva Velusamy
6255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    /**
6355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project     * Launch action:
6455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project     * <ul>
6555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project     * <li>0: launch default activity</li>
6655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project     * <li>1: launch specified activity. See {@link #ATTR_ACTIVITY}</li>
6755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project     * <li>2: Do Nothing</li>
6855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project     * </ul>
6955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project     */
7055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    public final static String ATTR_LAUNCH_ACTION = AdtPlugin.PLUGIN_ID + ".action"; //$NON-NLS-1$
712084837bba5a7534b90697263d82a197854cf226Xavier Ducrohet
7255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    /** Default launch action. This launches the activity that is setup to be found in the HOME
7355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project     * screen.
7455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project     */
7555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    public final static int ACTION_DEFAULT = 0;
7655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    /** Launch action starting a specific activity. */
7755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    public final static int ACTION_ACTIVITY = 1;
7855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    /** Launch action that does nothing. */
7955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    public final static int ACTION_DO_NOTHING = 2;
8055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    /** Default launch action value. */
8155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    public final static int DEFAULT_LAUNCH_ACTION = ACTION_DEFAULT;
8255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
8355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    /**
8455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project     * Activity to be launched if {@link #ATTR_LAUNCH_ACTION} is 1
8555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project     */
8655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    public static final String ATTR_ACTIVITY = AdtPlugin.PLUGIN_ID + ".activity"; //$NON-NLS-1$
8755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
8855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    public static final String ATTR_AVD_NAME = AdtPlugin.PLUGIN_ID + ".avd"; //$NON-NLS-1$
892084837bba5a7534b90697263d82a197854cf226Xavier Ducrohet
9055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    public static final String ATTR_SPEED = AdtPlugin.PLUGIN_ID + ".speed"; //$NON-NLS-1$
9155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
9255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    /**
9355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project     * Index of the default network speed setting for the emulator.<br>
9455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project     * Get the emulator option with <code>EmulatorConfigTab.getSpeed(index)</code>
9555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project     */
9655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    public static final int DEFAULT_SPEED = 0;
9755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
9855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    public static final String ATTR_DELAY = AdtPlugin.PLUGIN_ID + ".delay"; //$NON-NLS-1$
9955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
10055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    /**
10155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project     * Index of the default network latency setting for the emulator.<br>
10255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project     * Get the emulator option with <code>EmulatorConfigTab.getDelay(index)</code>
10355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project     */
10455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    public static final int DEFAULT_DELAY = 0;
10555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
10655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    public static final String ATTR_COMMANDLINE = AdtPlugin.PLUGIN_ID + ".commandline"; //$NON-NLS-1$
10755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
10855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    public static final String ATTR_WIPE_DATA = AdtPlugin.PLUGIN_ID + ".wipedata"; //$NON-NLS-1$
10955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    public static final boolean DEFAULT_WIPE_DATA = false;
11055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
11155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    public static final String ATTR_NO_BOOT_ANIM = AdtPlugin.PLUGIN_ID + ".nobootanim"; //$NON-NLS-1$
11255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    public static final boolean DEFAULT_NO_BOOT_ANIM = false;
11355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
1142084837bba5a7534b90697263d82a197854cf226Xavier Ducrohet    public static final String ATTR_DEBUG_PORT =
11555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        AdtPlugin.PLUGIN_ID + ".debugPort"; //$NON-NLS-1$
11655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
117ab36f4e7488358dea4ab6b54ee2b7bef3da0232bTor Norbye    @Override
11855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    public void launch(ILaunchConfiguration configuration, String mode,
11955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            ILaunch launch, IProgressMonitor monitor) throws CoreException {
12055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        // We need to check if it's a standard launch or if it's a launch
12155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        // to debug an application already running.
12255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        int debugPort = AndroidLaunchController.getPortForConfig(configuration);
12355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
12455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        // get the project
12555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        IProject project = getProject(configuration);
12655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
12755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        // first we make sure the launch is of the proper type
12855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        AndroidLaunch androidLaunch = null;
12955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        if (launch instanceof AndroidLaunch) {
13055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            androidLaunch = (AndroidLaunch)launch;
13155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        } else {
13255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            // wrong type, not sure how we got there, but we don't do
13355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            // anything else
13455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            AdtPlugin.printErrorToConsole(project, "Wrong Launch Type!");
13555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            return;
13655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        }
13755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
13855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        // if we have a valid debug port, this means we're debugging an app
13955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        // that's already launched.
14055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        if (debugPort != INVALID_DEBUG_PORT) {
14155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            AndroidLaunchController.launchRemoteDebugger(debugPort, androidLaunch, monitor);
14255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            return;
14355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        }
14455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
14555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        if (project == null) {
14655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            AdtPlugin.printErrorToConsole("Couldn't get project object!");
14755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            androidLaunch.stopLaunch();
14855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            return;
14955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        }
15055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
151d45f7f6410f02f884fd640cb218c511835c0130bJosiah Gaskin        // make sure the project and its dependencies are built
152d45f7f6410f02f884fd640cb218c511835c0130bJosiah Gaskin        // and PostCompilerBuilder runs.
153a1aa60efc6ed4f86846804936c0d947994b3d3fbJosiah Gaskin        // This is a synchronous call which returns when the
1546f43b416d2abc4d9dc73785c6c893d5259a717c4Xavier Ducrohet        // build is done.
1553056c8e00f7c36d022cc00f227c22d53d6113733Xavier Ducrohet        ProjectHelper.doFullIncrementalDebugBuild(project, monitor);
1566f43b416d2abc4d9dc73785c6c893d5259a717c4Xavier Ducrohet
15755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        // check if the project has errors, and abort in this case.
15855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        if (ProjectHelper.hasError(project, true)) {
15955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            AdtPlugin.displayError("Android Launch",
16055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                    "Your project contains error(s), please fix them before running your application.");
16155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            return;
16255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        }
16355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
16455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        AdtPlugin.printToConsole(project, "------------------------------"); //$NON-NLS-1$
16555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        AdtPlugin.printToConsole(project, "Android Launch!");
16655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
16755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        // check if the project is using the proper sdk.
168d278a4533bbce2e4edbf1928b51fc87c3ab6bfddRicky Ng-Adam        // if that throws an exception, we simply let it propagate to the caller.
16955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        if (checkAndroidProject(project) == false) {
17055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            AdtPlugin.printErrorToConsole(project, "Project is not an Android Project. Aborting!");
17155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            androidLaunch.stopLaunch();
17255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            return;
17355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        }
17455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
17555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        // Check adb status and abort if needed.
17655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        AndroidDebugBridge bridge = AndroidDebugBridge.getBridge();
17755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        if (bridge == null || bridge.isConnected() == false) {
17855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            try {
17955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                int connections = -1;
18055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                int restarts = -1;
18155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                if (bridge != null) {
18255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                    connections = bridge.getConnectionAttemptCount();
18355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                    restarts = bridge.getRestartAttemptCount();
18455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                }
18555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
18655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                // if we get -1, the device monitor is not even setup (anymore?).
18755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                // We need to ask the user to restart eclipse.
18855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                // This shouldn't happen, but it's better to let the user know in case it does.
18955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                if (connections == -1 || restarts == -1) {
1902084837bba5a7534b90697263d82a197854cf226Xavier Ducrohet                    AdtPlugin.printErrorToConsole(project,
19155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                            "The connection to adb is down, and a severe error has occured.",
19255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                            "You must restart adb and Eclipse.",
19355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                            String.format(
19455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                                    "Please ensure that adb is correctly located at '%1$s' and can be executed.",
19555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                                    AdtPlugin.getOsAbsoluteAdb()));
19655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                    return;
19755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                }
1982084837bba5a7534b90697263d82a197854cf226Xavier Ducrohet
19955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                if (restarts == 0) {
20055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                    AdtPlugin.printErrorToConsole(project,
20155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                            "Connection with adb was interrupted.",
20255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                            String.format("%1$s attempts have been made to reconnect.", connections),
20355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                            "You may want to manually restart adb from the Devices view.");
20455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                } else {
20555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                    AdtPlugin.printErrorToConsole(project,
20655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                            "Connection with adb was interrupted, and attempts to reconnect have failed.",
20755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                            String.format("%1$s attempts have been made to restart adb.", restarts),
20855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                            "You may want to manually restart adb from the Devices view.");
2092084837bba5a7534b90697263d82a197854cf226Xavier Ducrohet
21055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                }
21155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                return;
21255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            } finally {
21355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                androidLaunch.stopLaunch();
21455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            }
21555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        }
2162084837bba5a7534b90697263d82a197854cf226Xavier Ducrohet
21755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        // since adb is working, we let the user know
21855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        // TODO have a verbose mode for launch with more info (or some of the less useful info we now have).
21955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        AdtPlugin.printToConsole(project, "adb is running normally.");
22055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
22155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        // make a config class
22255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        AndroidLaunchConfiguration config = new AndroidLaunchConfiguration();
22355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
22455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        // fill it with the config coming from the ILaunchConfiguration object
22555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        config.set(configuration);
22655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
22755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        // get the launch controller singleton
22855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        AndroidLaunchController controller = AndroidLaunchController.getInstance();
22955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
23055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        // get the application package
231d278a4533bbce2e4edbf1928b51fc87c3ab6bfddRicky Ng-Adam        IFile applicationPackage = ProjectHelper.getApplicationPackage(project);
23255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        if (applicationPackage == null) {
23355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            androidLaunch.stopLaunch();
23455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            return;
23555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        }
23655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
23755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        // we need some information from the manifest
238d5579c79e7dcb1eda9835f5a2c7299be7eab28b0Xavier Ducrohet        ManifestData manifestData = AndroidManifestHelper.parseForData(project);
2392084837bba5a7534b90697263d82a197854cf226Xavier Ducrohet
240d5579c79e7dcb1eda9835f5a2c7299be7eab28b0Xavier Ducrohet        if (manifestData == null) {
24155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            AdtPlugin.printErrorToConsole(project, "Failed to parse AndroidManifest: aborting!");
24255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            androidLaunch.stopLaunch();
24355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            return;
24455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        }
24555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
246763ca7d5803d8088e192f4d226ff9e96820c7aceThe Android Open Source Project        doLaunch(configuration, mode, monitor, project, androidLaunch, config, controller,
247d5579c79e7dcb1eda9835f5a2c7299be7eab28b0Xavier Ducrohet                applicationPackage, manifestData);
248763ca7d5803d8088e192f4d226ff9e96820c7aceThe Android Open Source Project    }
249763ca7d5803d8088e192f4d226ff9e96820c7aceThe Android Open Source Project
250763ca7d5803d8088e192f4d226ff9e96820c7aceThe Android Open Source Project    protected void doLaunch(ILaunchConfiguration configuration, String mode,
251763ca7d5803d8088e192f4d226ff9e96820c7aceThe Android Open Source Project            IProgressMonitor monitor, IProject project, AndroidLaunch androidLaunch,
252763ca7d5803d8088e192f4d226ff9e96820c7aceThe Android Open Source Project            AndroidLaunchConfiguration config, AndroidLaunchController controller,
253d5579c79e7dcb1eda9835f5a2c7299be7eab28b0Xavier Ducrohet            IFile applicationPackage, ManifestData manifestData) {
2542084837bba5a7534b90697263d82a197854cf226Xavier Ducrohet
255763ca7d5803d8088e192f4d226ff9e96820c7aceThe Android Open Source Project       String activityName = null;
2562084837bba5a7534b90697263d82a197854cf226Xavier Ducrohet
2572084837bba5a7534b90697263d82a197854cf226Xavier Ducrohet        if (config.mLaunchAction == ACTION_ACTIVITY) {
25855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            // Get the activity name defined in the config
25955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            activityName = getActivityName(configuration);
2602084837bba5a7534b90697263d82a197854cf226Xavier Ducrohet
26155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            // Get the full activity list and make sure the one we got matches.
262d5579c79e7dcb1eda9835f5a2c7299be7eab28b0Xavier Ducrohet            Activity[] activities = manifestData.getActivities();
2632084837bba5a7534b90697263d82a197854cf226Xavier Ducrohet
26455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            // first we check that there are, in fact, activities.
26555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            if (activities.length == 0) {
26655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                // if the activities list is null, then the manifest is empty
26755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                // and we can't launch the app. We'll revert to a sync-only launch
26855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                AdtPlugin.printErrorToConsole(project,
26955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                        "The Manifest defines no activity!",
27055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                        "The launch will only sync the application package on the device!");
27155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                config.mLaunchAction = ACTION_DO_NOTHING;
27255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            } else if (activityName == null) {
27355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                // if the activity we got is null, we look for the default one.
27455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                AdtPlugin.printErrorToConsole(project,
27555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                        "No activity specified! Getting the launcher activity.");
276d5579c79e7dcb1eda9835f5a2c7299be7eab28b0Xavier Ducrohet                Activity launcherActivity = manifestData.getLauncherActivity();
277f0c2f2f8a611a5b3eccc2690f71c8dc514d516a6Xavier Ducrohet                if (launcherActivity != null) {
278f0c2f2f8a611a5b3eccc2690f71c8dc514d516a6Xavier Ducrohet                    activityName = launcherActivity.getName();
279f0c2f2f8a611a5b3eccc2690f71c8dc514d516a6Xavier Ducrohet                }
280f0c2f2f8a611a5b3eccc2690f71c8dc514d516a6Xavier Ducrohet
28155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                // if there's no default activity. We revert to a sync-only launch.
28255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                if (activityName == null) {
28355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                    revertToNoActionLaunch(project, config);
28455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                }
28555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            } else {
2862084837bba5a7534b90697263d82a197854cf226Xavier Ducrohet
28755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                // check the one we got from the config matches any from the list
28855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                boolean match = false;
289f0c2f2f8a611a5b3eccc2690f71c8dc514d516a6Xavier Ducrohet                for (Activity a : activities) {
290f0c2f2f8a611a5b3eccc2690f71c8dc514d516a6Xavier Ducrohet                    if (a != null && a.getName().equals(activityName)) {
29155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                        match = true;
29255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                        break;
29355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                    }
29455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                }
2952084837bba5a7534b90697263d82a197854cf226Xavier Ducrohet
29655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                // if we didn't find a match, we revert to the default activity if any.
29755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                if (match == false) {
29855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                    AdtPlugin.printErrorToConsole(project,
29955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                            "The specified activity does not exist! Getting the launcher activity.");
300d5579c79e7dcb1eda9835f5a2c7299be7eab28b0Xavier Ducrohet                    Activity launcherActivity = manifestData.getLauncherActivity();
301f0c2f2f8a611a5b3eccc2690f71c8dc514d516a6Xavier Ducrohet                    if (launcherActivity != null) {
302f0c2f2f8a611a5b3eccc2690f71c8dc514d516a6Xavier Ducrohet                        activityName = launcherActivity.getName();
3032084837bba5a7534b90697263d82a197854cf226Xavier Ducrohet                    } else {
3042084837bba5a7534b90697263d82a197854cf226Xavier Ducrohet                        // if there's no default activity. We revert to a sync-only launch.
30555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                        revertToNoActionLaunch(project, config);
30655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                    }
30755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                }
30855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            }
30955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        } else if (config.mLaunchAction == ACTION_DEFAULT) {
310d5579c79e7dcb1eda9835f5a2c7299be7eab28b0Xavier Ducrohet            Activity launcherActivity = manifestData.getLauncherActivity();
311f0c2f2f8a611a5b3eccc2690f71c8dc514d516a6Xavier Ducrohet            if (launcherActivity != null) {
312f0c2f2f8a611a5b3eccc2690f71c8dc514d516a6Xavier Ducrohet                activityName = launcherActivity.getName();
313f0c2f2f8a611a5b3eccc2690f71c8dc514d516a6Xavier Ducrohet            }
3142084837bba5a7534b90697263d82a197854cf226Xavier Ducrohet
31555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            // if there's no default activity. We revert to a sync-only launch.
31655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            if (activityName == null) {
31755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                revertToNoActionLaunch(project, config);
31855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            }
31955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        }
32055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
3212084837bba5a7534b90697263d82a197854cf226Xavier Ducrohet        IAndroidLaunchAction launchAction = null;
3222084837bba5a7534b90697263d82a197854cf226Xavier Ducrohet        if (config.mLaunchAction == ACTION_DO_NOTHING || activityName == null) {
3232084837bba5a7534b90697263d82a197854cf226Xavier Ducrohet            launchAction = new EmptyLaunchAction();
3242084837bba5a7534b90697263d82a197854cf226Xavier Ducrohet        } else {
325763ca7d5803d8088e192f4d226ff9e96820c7aceThe Android Open Source Project            launchAction = new ActivityLaunchAction(activityName, controller);
326763ca7d5803d8088e192f4d226ff9e96820c7aceThe Android Open Source Project        }
327763ca7d5803d8088e192f4d226ff9e96820c7aceThe Android Open Source Project
32855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        // everything seems fine, we ask the launch controller to handle
32955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        // the rest
330d5579c79e7dcb1eda9835f5a2c7299be7eab28b0Xavier Ducrohet        controller.launch(project, mode, applicationPackage,manifestData.getPackage(),
331d5579c79e7dcb1eda9835f5a2c7299be7eab28b0Xavier Ducrohet                manifestData.getPackage(), manifestData.getDebuggable(),
3328582ede3e8ae8db27819922fa1f6e083788e10bdXavier Ducrohet                manifestData.getMinSdkVersionString(), launchAction, config, androidLaunch,
3332cd46c07ec6b9ac3913ad6fca0426843ded58f35Brett Chabot                monitor);
33455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    }
3352084837bba5a7534b90697263d82a197854cf226Xavier Ducrohet
33655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    @Override
33755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    public boolean buildForLaunch(ILaunchConfiguration configuration,
33855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            String mode, IProgressMonitor monitor) throws CoreException {
3396f43b416d2abc4d9dc73785c6c893d5259a717c4Xavier Ducrohet        // if this returns true, this forces a full workspace rebuild which is not
3406f43b416d2abc4d9dc73785c6c893d5259a717c4Xavier Ducrohet        // what we want.
3416f43b416d2abc4d9dc73785c6c893d5259a717c4Xavier Ducrohet        // Instead in the #launch method, we'll rebuild only the launching project.
3426f43b416d2abc4d9dc73785c6c893d5259a717c4Xavier Ducrohet        return false;
34355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    }
34455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
34555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    /**
34655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project     * {@inheritDoc}
34755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project     * @throws CoreException
34855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project     */
34955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    @Override
35055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    public ILaunch getLaunch(ILaunchConfiguration configuration, String mode)
35155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            throws CoreException {
35255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        return new AndroidLaunch(configuration, mode, null);
35355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    }
35455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
35555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    /**
35655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project     * Returns the IProject object matching the name found in the configuration
35755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project     * object under the name
35855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project     * <code>IJavaLaunchConfigurationConstants.ATTR_PROJECT_NAME</code>
35955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project     * @param configuration
36055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project     * @return The IProject object or null
36155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project     */
36255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    private IProject getProject(ILaunchConfiguration configuration){
36355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        // get the project name from the config
36455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        String projectName;
36555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        try {
36655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            projectName = configuration.getAttribute(
36755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                    IJavaLaunchConfigurationConstants.ATTR_PROJECT_NAME, "");
36855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        } catch (CoreException e) {
36955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            return null;
37055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        }
37155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
37255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        // get the current workspace
37355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        IWorkspace workspace = ResourcesPlugin.getWorkspace();
37455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
37555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        // and return the project with the name from the config
37655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        return workspace.getRoot().getProject(projectName);
37755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    }
37855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
37955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    /**
38055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project     * Checks the project is an android project.
38155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project     * @param project The project to check
38255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project     * @return true if the project is an android SDK.
38355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project     * @throws CoreException
38455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project     */
38555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    private boolean checkAndroidProject(IProject project) throws CoreException {
38655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        // check if the project is a java and an android project.
38755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        if (project.hasNature(JavaCore.NATURE_ID) == false) {
38855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            String msg = String.format("%1$s is not a Java project!", project.getName());
38955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            AdtPlugin.displayError("Android Launch", msg);
39055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            return false;
39155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        }
39255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
393c3105b949cd2a0f6cbf8a12ec4f30e49b5b5a502Xavier Ducrohet        if (project.hasNature(AdtConstants.NATURE_DEFAULT) == false) {
39455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            String msg = String.format("%1$s is not an Android project!", project.getName());
39555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            AdtPlugin.displayError("Android Launch", msg);
39655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            return false;
39755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        }
39855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
39955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        return true;
40055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    }
40155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
40255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
40355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    /**
40455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project     * Returns the name of the activity.
40555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project     */
40655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    private String getActivityName(ILaunchConfiguration configuration) {
40755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        String empty = "";
40855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        String activityName;
40955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        try {
41055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            activityName = configuration.getAttribute(ATTR_ACTIVITY, empty);
41155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        } catch (CoreException e) {
41255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            return null;
41355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        }
41455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
41555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        return (activityName != empty) ? activityName : null;
41655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    }
4172084837bba5a7534b90697263d82a197854cf226Xavier Ducrohet
41855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    private final void revertToNoActionLaunch(IProject project, AndroidLaunchConfiguration config) {
41955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        AdtPlugin.printErrorToConsole(project,
42055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                "No Launcher activity found!",
42155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                "The launch will only sync the application package on the device!");
42255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        config.mLaunchAction = ACTION_DO_NOTHING;
42355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    }
42455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project}
425