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