use of com.android.tools.idea.run.tasks.LaunchTasksProviderFactory in project android by JetBrains.
the class AndroidRunConfigurationBase method getState.
@Override
public RunProfileState getState(@NotNull final Executor executor, @NotNull ExecutionEnvironment env) throws ExecutionException {
validateBeforeRun(executor);
final Module module = getConfigurationModule().getModule();
assert module != null : "Enforced by fatal validation check in checkConfiguration.";
final AndroidFacet facet = AndroidFacet.getInstance(module);
assert facet != null : "Enforced by fatal validation check in checkConfiguration.";
Project project = env.getProject();
boolean forceColdswap = !InstantRunUtils.isInvokedViaHotswapAction(env);
boolean couldHaveHotswapped = false;
boolean debug = false;
if (executor instanceof DefaultDebugExecutor) {
if (!AndroidSdkUtils.activateDdmsIfNecessary(facet.getModule().getProject())) {
throw new ExecutionException("Unable to obtain debug bridge. Please check if there is a different tool using adb that is active.");
}
debug = true;
}
DeviceFutures deviceFutures = null;
AndroidSessionInfo info = AndroidSessionInfo.findOldSession(project, null, getUniqueID());
if (info != null && supportsInstantRun()) {
// if there is an existing previous session, then see if we can detect devices to fast deploy to
deviceFutures = getFastDeployDevices(executor, facet, info);
// that the ReRun is now a global action and doesn't really know much details about each run (and doing that seems like a hack too.)
if (InstantRunUtils.isReRun(env)) {
killSession(info);
info = null;
}
}
if (info != null && deviceFutures == null) {
// If we should not be fast deploying, but there is an existing session, then terminate those sessions. Otherwise, we might end up
// with 2 active sessions of the same launch, especially if we first think we can do a fast deploy, then end up doing a full launch
boolean continueLaunch = promptAndKillSession(executor, project, info);
if (!continueLaunch) {
return null;
}
} else if (info != null && forceColdswap) {
// the user could have invoked the hotswap action in this scenario, but they chose to force a coldswap (by pressing run)
couldHaveHotswapped = true;
// forcibly kill app in case of run action (which forces a cold swap)
// normally, installing the apk will force kill the app, but we need to forcibly kill it in the case that there were no changes
killSession(info);
}
// If we are not fast deploying, then figure out (prompting user if needed) where to deploy
if (deviceFutures == null) {
DeployTarget deployTarget = getDeployTarget(executor, env, debug, facet);
if (deployTarget == null) {
return null;
}
DeployTargetState deployTargetState = getDeployTargetContext().getCurrentDeployTargetState();
if (deployTarget.hasCustomRunProfileState(executor)) {
return deployTarget.getRunProfileState(executor, env, deployTargetState);
}
deviceFutures = deployTarget.getDevices(deployTargetState, facet, getDeviceCount(debug), debug, getUniqueID());
if (deviceFutures == null) {
// The user deliberately canceled, or some error was encountered and exposed by the chooser. Quietly exit.
return null;
}
}
if (deviceFutures.get().isEmpty()) {
throw new ExecutionException(AndroidBundle.message("deployment.target.not.found"));
}
ApplicationIdProvider applicationIdProvider = getApplicationIdProvider(facet);
InstantRunContext instantRunContext = null;
if (supportsInstantRun() && InstantRunSettings.isInstantRunEnabled()) {
InstantRunGradleSupport gradleSupport = canInstantRun(module, deviceFutures.getDevices());
if (gradleSupport == TARGET_PLATFORM_NOT_INSTALLED) {
AndroidVersion version = deviceFutures.getDevices().get(0).getVersion();
String message = AndroidBundle.message("instant.run.quickfix.missing.platform", SdkVersionInfo.getVersionWithCodename(version));
int result = Messages.showYesNoDialog(project, message, "Instant Run", // yes button
"Install and Continue", // no button
"Proceed without Instant Run", Messages.getQuestionIcon());
if (result == Messages.OK) {
// if ok, install platform and continue with instant run
ModelWizardDialog dialog = SdkQuickfixUtils.createDialogForPaths(project, ImmutableList.of(DetailsTypes.getPlatformPath(version)));
if (dialog == null) {
LOG.warn("Unable to get quick fix wizard to install missing platform required for instant run.");
} else if (dialog.showAndGet()) {
gradleSupport = SUPPORTED;
}
}
}
if (gradleSupport == SUPPORTED) {
if (!AndroidEnableAdbServiceAction.isAdbServiceEnabled()) {
throw new ExecutionException("Instant Run requires 'Tools | Android | Enable ADB integration' to be enabled.");
}
InstantRunUtils.setInstantRunEnabled(env, true);
instantRunContext = InstantRunGradleUtils.createGradleProjectContext(facet);
} else {
InstantRunManager.LOG.warn("Instant Run enabled, but not doing an instant run build since: " + gradleSupport);
String notificationText = gradleSupport.getUserNotification();
if (notificationText != null) {
InstantRunNotificationTask.showNotification(env.getProject(), null, notificationText);
}
}
} else {
String msg = "Not using instant run for this launch: ";
if (InstantRunSettings.isInstantRunEnabled()) {
msg += getType().getDisplayName() + " does not support instant run";
} else {
msg += "instant run is disabled";
}
InstantRunManager.LOG.info(msg);
}
// Store the chosen target on the execution environment so before-run tasks can access it.
AndroidRunConfigContext runConfigContext = new AndroidRunConfigContext();
env.putCopyableUserData(AndroidRunConfigContext.KEY, runConfigContext);
runConfigContext.setTargetDevices(deviceFutures);
runConfigContext.setSameExecutorAsPreviousSession(info != null && executor.getId().equals(info.getExecutorId()));
runConfigContext.setCleanRerun(InstantRunUtils.isCleanReRun(env));
runConfigContext.setForceColdSwap(forceColdswap, couldHaveHotswapped);
// Save the instant run context so that before-run task can access it
env.putCopyableUserData(InstantRunContext.KEY, instantRunContext);
if (debug) {
String error = canDebug(deviceFutures, facet, module.getName());
if (error != null) {
throw new ExecutionException(error);
}
}
LaunchOptions launchOptions = getLaunchOptions().setDebug(debug).build();
ProcessHandler processHandler = null;
if (info != null && info.getExecutorId().equals(executor.getId())) {
processHandler = info.getProcessHandler();
}
ApkProvider apkProvider = getApkProvider(facet, applicationIdProvider);
LaunchTasksProviderFactory providerFactory = new AndroidLaunchTasksProviderFactory(this, env, facet, applicationIdProvider, apkProvider, deviceFutures, launchOptions, processHandler, instantRunContext);
InstantRunStatsService.get(project).notifyBuildStarted();
return new AndroidRunState(env, getName(), module, applicationIdProvider, getConsoleProvider(), deviceFutures, providerFactory, processHandler);
}
Aggregations