| /* |
| * Copyright 2016 The Bazel Authors. All rights reserved. |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| package com.google.idea.blaze.android.run.binary; |
| |
| import com.android.ddmlib.IDevice; |
| import com.android.tools.idea.run.ApkInfo; |
| import com.android.tools.idea.run.ApkProvisionException; |
| import com.android.tools.idea.run.ApplicationIdProvider; |
| import com.android.tools.idea.run.ConsolePrinter; |
| import com.android.tools.idea.run.ConsoleProvider; |
| import com.android.tools.idea.run.LaunchOptions; |
| import com.android.tools.idea.run.activity.DefaultStartActivityFlagsProvider; |
| import com.android.tools.idea.run.activity.StartActivityFlagsProvider; |
| import com.android.tools.idea.run.editor.AndroidDebugger; |
| import com.android.tools.idea.run.editor.AndroidDebuggerState; |
| import com.android.tools.idea.run.tasks.DebugConnectorTask; |
| import com.android.tools.idea.run.tasks.DeployApkTask; |
| import com.android.tools.idea.run.tasks.LaunchTask; |
| import com.android.tools.idea.run.tasks.LaunchTasksProvider; |
| import com.android.tools.idea.run.util.ProcessHandlerLaunchStatus; |
| import com.google.common.collect.ImmutableList; |
| import com.google.common.util.concurrent.Futures; |
| import com.google.idea.blaze.android.run.deployinfo.BlazeAndroidDeployInfo; |
| import com.google.idea.blaze.android.run.deployinfo.BlazeApkProvider; |
| import com.google.idea.blaze.android.run.runner.BlazeAndroidDeviceSelector; |
| import com.google.idea.blaze.android.run.runner.BlazeAndroidLaunchTasksProvider; |
| import com.google.idea.blaze.android.run.runner.BlazeAndroidRunConfigurationDebuggerManager; |
| import com.google.idea.blaze.android.run.runner.BlazeAndroidRunContext; |
| import com.google.idea.blaze.android.run.runner.BlazeApkBuildStep; |
| import com.google.idea.blaze.android.run.runner.BlazeApkBuildStepNormalBuild; |
| import com.google.idea.blaze.base.model.primitives.Label; |
| import com.intellij.execution.ExecutionException; |
| import com.intellij.execution.configurations.RunConfiguration; |
| import com.intellij.execution.runners.ExecutionEnvironment; |
| import com.intellij.openapi.project.Project; |
| import java.util.Collection; |
| import java.util.Set; |
| import javax.annotation.Nullable; |
| import org.jetbrains.android.facet.AndroidFacet; |
| import org.jetbrains.annotations.NotNull; |
| |
| /** Run context for android_binary. */ |
| class BlazeAndroidBinaryNormalBuildRunContext implements BlazeAndroidRunContext { |
| |
| private final Project project; |
| private final AndroidFacet facet; |
| private final RunConfiguration runConfiguration; |
| private final ExecutionEnvironment env; |
| private final BlazeAndroidBinaryRunConfigurationState configState; |
| private final ConsoleProvider consoleProvider; |
| private final BlazeApkBuildStepNormalBuild buildStep; |
| private final BlazeApkProvider apkProvider; |
| private final ApplicationIdProvider applicationIdProvider; |
| |
| public BlazeAndroidBinaryNormalBuildRunContext( |
| Project project, |
| AndroidFacet facet, |
| RunConfiguration runConfiguration, |
| ExecutionEnvironment env, |
| BlazeAndroidBinaryRunConfigurationState configState, |
| Label label, |
| ImmutableList<String> buildFlags) { |
| this.project = project; |
| this.facet = facet; |
| this.runConfiguration = runConfiguration; |
| this.env = env; |
| this.configState = configState; |
| this.consoleProvider = new BlazeAndroidBinaryConsoleProvider(project); |
| this.buildStep = new BlazeApkBuildStepNormalBuild(project, label, buildFlags); |
| this.apkProvider = new BlazeApkProvider(project, buildStep.getDeployInfo()); |
| this.applicationIdProvider = |
| new BlazeAndroidBinaryApplicationIdProvider(project, buildStep.getDeployInfo()); |
| } |
| |
| @Override |
| public void augmentEnvironment(ExecutionEnvironment env) {} |
| |
| @Override |
| public BlazeAndroidDeviceSelector getDeviceSelector() { |
| return new BlazeAndroidDeviceSelector.NormalDeviceSelector(); |
| } |
| |
| @Override |
| public void augmentLaunchOptions(@NotNull LaunchOptions.Builder options) { |
| options.setDeploy(true).setOpenLogcatAutomatically(true); |
| } |
| |
| @NotNull |
| @Override |
| public ConsoleProvider getConsoleProvider() { |
| return consoleProvider; |
| } |
| |
| @Override |
| public ApplicationIdProvider getApplicationIdProvider() throws ExecutionException { |
| return applicationIdProvider; |
| } |
| |
| @Override |
| public BlazeApkBuildStep getBuildStep() { |
| return buildStep; |
| } |
| |
| @Override |
| public LaunchTasksProvider getLaunchTasksProvider( |
| LaunchOptions.Builder launchOptionsBuilder, |
| boolean isDebug, |
| BlazeAndroidRunConfigurationDebuggerManager debuggerManager) |
| throws ExecutionException { |
| return new BlazeAndroidLaunchTasksProvider( |
| project, this, applicationIdProvider, launchOptionsBuilder, isDebug, debuggerManager); |
| } |
| |
| @Nullable |
| @Override |
| public ImmutableList<LaunchTask> getDeployTasks(IDevice device, LaunchOptions launchOptions) |
| throws ExecutionException { |
| Collection<ApkInfo> apks; |
| try { |
| apks = apkProvider.getApks(device); |
| } catch (ApkProvisionException e) { |
| throw new ExecutionException(e); |
| } |
| return ImmutableList.of(new DeployApkTask(project, launchOptions, apks)); |
| } |
| |
| @Override |
| public LaunchTask getApplicationLaunchTask( |
| LaunchOptions launchOptions, |
| @Nullable Integer userId, |
| AndroidDebugger androidDebugger, |
| AndroidDebuggerState androidDebuggerState, |
| ProcessHandlerLaunchStatus processHandlerLaunchStatus) |
| throws ExecutionException { |
| final StartActivityFlagsProvider startActivityFlagsProvider = |
| new DefaultStartActivityFlagsProvider( |
| androidDebugger, |
| androidDebuggerState, |
| project, |
| launchOptions.isDebug(), |
| UserIdHelper.getFlagsFromUserId(userId)); |
| |
| BlazeAndroidDeployInfo deployInfo = |
| Futures.get(buildStep.getDeployInfo(), ExecutionException.class); |
| |
| return BlazeAndroidBinaryApplicationLaunchTaskProvider.getApplicationLaunchTask( |
| project, |
| applicationIdProvider, |
| deployInfo.getMergedManifestFile(), |
| configState, |
| startActivityFlagsProvider, |
| processHandlerLaunchStatus); |
| } |
| |
| @Nullable |
| @Override |
| public DebugConnectorTask getDebuggerTask( |
| AndroidDebugger androidDebugger, |
| AndroidDebuggerState androidDebuggerState, |
| Set<String> packageIds) |
| throws ExecutionException { |
| //noinspection unchecked |
| return androidDebugger.getConnectDebuggerTask( |
| env, null, packageIds, facet, androidDebuggerState, runConfiguration.getType().getId()); |
| } |
| |
| @Nullable |
| @Override |
| public Integer getUserId(IDevice device, ConsolePrinter consolePrinter) |
| throws ExecutionException { |
| return UserIdHelper.getUserIdFromConfigurationState(device, consolePrinter, configState); |
| } |
| } |