| 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); |
| } |
| } |
| } |
| } |
| } |