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

import com.google.common.collect.ImmutableList;
import com.google.idea.blaze.android.run.runner.BlazeAndroidRunConfigurationRunner;
import com.google.idea.blaze.android.run.runner.BlazeAndroidRunContext;
import com.google.idea.blaze.base.model.primitives.Label;
import com.google.idea.blaze.base.run.BlazeRunConfiguration;
import com.intellij.execution.runners.ExecutionEnvironment;
import com.intellij.openapi.project.Project;
import org.jetbrains.android.facet.AndroidFacet;

/**
 * Common interface between android_binary and android_test configurations.
 */
public interface BlazeAndroidRunConfiguration extends BlazeRunConfiguration {

  BlazeAndroidRunContext createRunContext(Project project,
                                          AndroidFacet facet,
                                          ExecutionEnvironment env,
                                          ImmutableList<String> buildFlags);

  BlazeAndroidRunConfigurationRunner getRunner();

  BlazeAndroidRunConfigurationCommonState getCommonState();

  @Override
  Label getTarget();
}
