blob: 2f86f2d61cc6ca4e649a56696adfa2c692c2132f [file] [log] [blame]
package org.jetbrains.android.compiler.artifact;
import com.intellij.facet.FacetModel;
import com.intellij.icons.AllIcons;
import com.intellij.openapi.module.Module;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.roots.ui.configuration.artifacts.sourceItems.LibrarySourceItem;
import com.intellij.openapi.roots.ui.configuration.artifacts.sourceItems.ModuleOutputSourceItem;
import com.intellij.packaging.artifacts.Artifact;
import com.intellij.packaging.artifacts.ArtifactProperties;
import com.intellij.packaging.artifacts.ArtifactTemplate;
import com.intellij.packaging.artifacts.ArtifactType;
import com.intellij.packaging.elements.CompositePackagingElement;
import com.intellij.packaging.elements.PackagingElementFactory;
import com.intellij.packaging.elements.PackagingElementOutputKind;
import com.intellij.packaging.elements.PackagingElementResolvingContext;
import com.intellij.packaging.impl.artifacts.ArtifactUtil;
import com.intellij.packaging.ui.PackagingSourceItem;
import com.intellij.util.containers.ContainerUtil;
import org.jetbrains.android.facet.AndroidFacet;
import org.jetbrains.annotations.NotNull;
import javax.swing.*;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
/**
* @author Eugene.Kudelevsky
*/
public class AndroidApplicationArtifactType extends ArtifactType {
public AndroidApplicationArtifactType() {
super("apk", "Android Application");
}
@NotNull
@Override
public Icon getIcon() {
return AllIcons.Nodes.Artifact;
}
@Override
public String getDefaultPathFor(@NotNull PackagingElementOutputKind kind) {
return "/";
}
@Override
public boolean isSuitableItem(@NotNull PackagingSourceItem item) {
return !(item instanceof ModuleOutputSourceItem || item instanceof LibrarySourceItem);
}
@NotNull
@Override
public CompositePackagingElement<?> createRootElement(@NotNull String artifactName) {
return PackagingElementFactory.getInstance().createArchive(ArtifactUtil.suggestArtifactFileName(artifactName) + ".apk");
}
@NotNull
@Override
public List<? extends ArtifactTemplate> getNewArtifactTemplates(@NotNull PackagingElementResolvingContext context) {
final List<AndroidFacet> facets = new ArrayList<AndroidFacet>();
for (Module module : context.getModulesProvider().getModules()) {
final FacetModel facetModel = context.getModulesProvider().getFacetModel(module);
final AndroidFacet facet = facetModel.getFacetByType(AndroidFacet.ID);
if (facet != null && !facet.isLibraryProject()) {
facets.add(facet);
}
}
if (facets.size() == 0) {
return Collections.emptyList();
}
return Collections.singletonList(new MyTemplate(context.getProject(), facets));
}
public static ArtifactType getInstance() {
return ContainerUtil.findInstance(getAllTypes(), AndroidApplicationArtifactType.class);
}
private class MyTemplate extends ArtifactTemplate {
private final Project myProject;
private final List<AndroidFacet> myFacets;
private MyTemplate(@NotNull Project project, @NotNull List<AndroidFacet> facets) {
assert facets.size() > 0;
myProject = project;
myFacets = facets;
}
@Override
public String getPresentableName() {
return myFacets.size() == 1
? "From module '" + myFacets.get(0).getModule().getName() + "'"
: "From module...";
}
@Override
public NewArtifactConfiguration createArtifact() {
final AndroidFacet facet = myFacets.size() == 1
? myFacets.get(0)
: AndroidArtifactUtil.chooseAndroidApplicationModule(myProject, myFacets);
if (facet == null) {
return null;
}
final CompositePackagingElement<?> rootElement =
AndroidApplicationArtifactType.this.createRootElement(facet.getModule().getName());
rootElement.addFirstChild(new AndroidFinalPackageElement(myProject, facet));
return new NewArtifactConfiguration(rootElement, facet.getModule().getName(), AndroidApplicationArtifactType.this);
}
@Override
public void setUpArtifact(@NotNull Artifact artifact, @NotNull NewArtifactConfiguration configuration) {
final AndroidFacet facet = AndroidArtifactUtil.getPackagedFacet(myProject, artifact);
if (facet != null) {
final ArtifactProperties<?> properties = artifact.getProperties(AndroidArtifactPropertiesProvider.getInstance());
if (properties instanceof AndroidApplicationArtifactProperties) {
final AndroidApplicationArtifactProperties p = (AndroidApplicationArtifactProperties)properties;
p.setProGuardCfgFiles(facet.getProperties().myProGuardCfgFiles);
}
}
}
}
}