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