blob: 7ad020a8592e4551313b999bf43ef32662f1ae5d [file] [log] [blame]
package org.jetbrains.android.compiler.artifact;
import com.android.annotations.NonNull;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.ui.ComboBox;
import com.intellij.openapi.ui.TextFieldWithBrowseButton;
import com.intellij.openapi.util.io.FileUtil;
import com.intellij.openapi.vfs.VfsUtilCore;
import com.intellij.packaging.artifacts.Artifact;
import com.intellij.packaging.ui.ArtifactPropertiesEditor;
import com.intellij.ui.EnumComboBoxModel;
import com.intellij.ui.IdeBorderFactory;
import com.intellij.ui.ListCellRendererWrapper;
import com.intellij.util.ui.UIUtil;
import org.jetbrains.android.facet.AndroidFacet;
import org.jetbrains.android.util.AndroidUiUtil;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
/**
* @author Eugene.Kudelevsky
*/
public class AndroidArtifactPropertiesEditor extends ArtifactPropertiesEditor implements ApkSigningSettingsForm {
private final AndroidApplicationArtifactProperties myProperties;
private JPanel myPanel;
private JPanel myCertificatePanel;
private JPasswordField myKeyStorePasswordField;
private JTextField myKeyStorePathField;
private JPasswordField myKeyPasswordField;
private TextFieldWithBrowseButton.NoPathCompletion myKeyAliasField;
private JButton myLoadKeyStoreButton;
private JButton myCreateKeyStoreButton;
private JCheckBox myProGuardCheckBox;
private JPanel myProGuardConfigPanel;
private JPanel myKeyStoreButtonsPanel;
private JPanel myProGuardPanel;
private ProGuardConfigFilesPanel myProGuardConfigFilesPanel;
private ComboBox myTypeCombo;
private final Artifact myArtifact;
private final Project myProject;
public AndroidArtifactPropertiesEditor(@Nullable final Artifact artifact,
@NonNull AndroidApplicationArtifactProperties properties,
@NotNull final Project project) {
myProperties = properties;
myArtifact = artifact;
myProject = project;
myKeyStoreButtonsPanel.setBorder(IdeBorderFactory.createEmptyBorder(0, 0, 5, 0));
myProGuardPanel.setBorder(IdeBorderFactory.createEmptyBorder(10, 0, 0, 0));
myTypeCombo.setRenderer(new ListCellRendererWrapper() {
@Override
public void customize(JList list, Object value, int index, boolean selected, boolean hasFocus) {
final AndroidArtifactSigningMode mode = (AndroidArtifactSigningMode)value;
setText(getPresentableText(mode));
}
});
//noinspection unchecked
myTypeCombo.setModel(new EnumComboBoxModel<AndroidArtifactSigningMode>(AndroidArtifactSigningMode.class));
myTypeCombo.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
final AndroidArtifactSigningMode mode = getSigningMode();
UIUtil.setEnabled(myCertificatePanel, mode == AndroidArtifactSigningMode.RELEASE_SIGNED ||
mode == AndroidArtifactSigningMode.DEBUG_WITH_CUSTOM_CERTIFICATE, true);
}
});
AndroidUiUtil.initSigningSettingsForm(project, this);
myProGuardCheckBox.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
UIUtil.setEnabled(myProGuardConfigPanel, myProGuardCheckBox.isSelected(), true);
}
});
}
@NotNull
private static String getPresentableText(@Nullable AndroidArtifactSigningMode mode) {
if (mode == null) {
return "";
}
switch (mode) {
case DEBUG:
return "Debug signed with default certificate";
case DEBUG_WITH_CUSTOM_CERTIFICATE:
return "Debug signed with custom certificate";
case RELEASE_UNSIGNED:
return "Release unsigned";
case RELEASE_SIGNED:
return "Release signed";
}
return "";
}
private String getKeyStorePath() {
return myKeyStorePathField.getText().trim();
}
@Override
public String getTabName() {
return "Android";
}
@Override
public JComponent createComponent() {
return myPanel;
}
@Override
public boolean isModified() {
return getSigningMode() != myProperties.getSigningMode() ||
!getKeyStoreFileUrl().equals(myProperties.getKeyStoreUrl()) ||
!getKeyStorePassword().equals(myProperties.getPlainKeystorePassword()) ||
!getKeyAlias().equals(myProperties.getKeyAlias()) ||
!getKeyPassword().equals(myProperties.getPlainKeyPassword()) ||
myProGuardCheckBox.isSelected() != myProperties.isRunProGuard() ||
!myProGuardConfigFilesPanel.getUrls().equals(myProperties.getProGuardCfgFiles());
}
@Override
public void apply() {
myProperties.setSigningMode(getSigningMode());
myProperties.setKeyStoreUrl(getKeyStoreFileUrl());
myProperties.setPlainKeystorePassword(getKeyStorePassword());
myProperties.setKeyAlias(getKeyAlias());
myProperties.setPlainKeyPassword(getKeyPassword());
myProperties.setRunProGuard(myProGuardCheckBox.isSelected());
myProperties.setProGuardCfgFiles(myProGuardConfigFilesPanel.getUrls());
}
@Override
public void reset() {
myTypeCombo.setSelectedItem(myProperties.getSigningMode());
final String keyStoreUrl = myProperties.getKeyStoreUrl();
myKeyStorePathField.setText(keyStoreUrl != null ? FileUtil.toSystemDependentName(VfsUtilCore.urlToPath(keyStoreUrl)) : "");
myKeyStorePasswordField.setText(myProperties.getPlainKeystorePassword());
final String keyAlias = myProperties.getKeyAlias();
myKeyAliasField.setText(keyAlias != null ? keyAlias : "");
myKeyPasswordField.setText(myProperties.getPlainKeyPassword());
myProGuardCheckBox.setSelected(myProperties.isRunProGuard());
myProGuardConfigFilesPanel.setUrls(myProperties.getProGuardCfgFiles());
UIUtil.setEnabled(myCertificatePanel, myProperties.getSigningMode() == AndroidArtifactSigningMode.RELEASE_SIGNED, true);
UIUtil.setEnabled(myProGuardConfigPanel, myProperties.isRunProGuard(), true);
}
@Override
public void disposeUIResources() {
}
@NotNull
private AndroidArtifactSigningMode getSigningMode() {
return (AndroidArtifactSigningMode)myTypeCombo.getSelectedItem();
}
@NotNull
private String getKeyStoreFileUrl() {
final String path = getKeyStorePath();
return VfsUtilCore.pathToUrl(FileUtil.toSystemIndependentName(path));
}
@NotNull
private String getKeyStorePassword() {
return String.valueOf(myKeyStorePasswordField.getPassword());
}
@NotNull
private String getKeyAlias() {
return myKeyAliasField.getText().trim();
}
@NotNull
private String getKeyPassword() {
return String.valueOf(myKeyPasswordField.getPassword());
}
@Override
public JButton getLoadKeyStoreButton() {
return myLoadKeyStoreButton;
}
@Override
public JTextField getKeyStorePathField() {
return myKeyStorePathField;
}
@Override
public JPanel getPanel() {
return myPanel;
}
@Override
public JButton getCreateKeyStoreButton() {
return myCreateKeyStoreButton;
}
@Override
public JPasswordField getKeyStorePasswordField() {
return myKeyStorePasswordField;
}
@Override
public TextFieldWithBrowseButton getKeyAliasField() {
return myKeyAliasField;
}
@Override
public JPasswordField getKeyPasswordField() {
return myKeyPasswordField;
}
private void createUIComponents() {
myProGuardConfigFilesPanel = new ProGuardConfigFilesPanel() {
@Nullable
@Override
protected AndroidFacet getFacet() {
return AndroidArtifactUtil.getPackagedFacet(myProject, myArtifact);
}
};
}
}