blob: f0a5e611e530694e4c36566abcebc3abca7db112 [file] [log] [blame]
package org.jetbrains.android.util;
import com.intellij.CommonBundle;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.fileChooser.FileChooser;
import com.intellij.openapi.fileChooser.FileChooserDescriptor;
import com.intellij.openapi.fileChooser.FileChooserDescriptorFactory;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.ui.DialogWrapper;
import com.intellij.openapi.ui.Messages;
import com.intellij.openapi.util.io.FileUtil;
import com.intellij.openapi.vfs.LocalFileSystem;
import com.intellij.openapi.vfs.VirtualFile;
import org.jetbrains.android.compiler.artifact.ApkSigningSettingsForm;
import org.jetbrains.android.compiler.artifact.ChooseKeyDialog;
import org.jetbrains.android.compiler.artifact.NewKeyStoreDialog;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.*;
import java.security.KeyStore;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import java.security.cert.CertificateException;
import java.util.List;
/**
* @author Eugene.Kudelevsky
*/
public class AndroidUiUtil {
private static final Logger LOG = Logger.getInstance("org.jetbrains.android.util.AndroidUiUtil");
private AndroidUiUtil() {
}
@Nullable
private static List<String> loadExistingKeys(@NotNull ApkSigningSettingsForm form) {
final String errorPrefix = "Cannot load key store: ";
InputStream is = null;
try {
//noinspection IOResourceOpenedButNotSafelyClosed
is = new FileInputStream(new File(form.getKeyStorePathField().getText().trim()));
final KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());
keyStore.load(is, form.getKeyStorePasswordField().getPassword());
return AndroidUtils.toList(keyStore.aliases());
}
catch (KeyStoreException e) {
Messages.showErrorDialog(form.getPanel(), errorPrefix + e.getMessage(), CommonBundle.getErrorTitle());
return null;
}
catch (FileNotFoundException e) {
Messages.showErrorDialog(form.getPanel(), errorPrefix + e.getMessage(), CommonBundle.getErrorTitle());
return null;
}
catch (CertificateException e) {
Messages.showErrorDialog(form.getPanel(), errorPrefix + e.getMessage(), CommonBundle.getErrorTitle());
return null;
}
catch (NoSuchAlgorithmException e) {
Messages.showErrorDialog(form.getPanel(), errorPrefix + e.getMessage(), CommonBundle.getErrorTitle());
return null;
}
catch (IOException e) {
Messages.showErrorDialog(form.getPanel(), errorPrefix + e.getMessage(), CommonBundle.getErrorTitle());
return null;
}
finally {
if (is != null) {
try {
is.close();
}
catch (IOException e) {
LOG.info(e);
}
}
}
}
public static void initSigningSettingsForm(@NotNull final Project project, @NotNull final ApkSigningSettingsForm form) {
form.getLoadKeyStoreButton().addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
final String defaultPath = form.getKeyStorePathField().getText().trim();
final VirtualFile defaultFile = LocalFileSystem.getInstance().findFileByPath(defaultPath);
final FileChooserDescriptor descriptor = FileChooserDescriptorFactory.createSingleFileNoJarsDescriptor();
final VirtualFile file = FileChooser.chooseFile(descriptor, form.getPanel(), project, defaultFile);
if (file != null) {
form.getKeyStorePathField().setText(FileUtil.toSystemDependentName(file.getPath()));
}
}
});
form.getCreateKeyStoreButton().addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
final NewKeyStoreDialog dialog = new NewKeyStoreDialog(project, form.getKeyStorePathField().getText());
dialog.show();
if (dialog.getExitCode() == DialogWrapper.OK_EXIT_CODE) {
form.getKeyStorePathField().setText(dialog.getKeyStorePath());
form.getKeyStorePasswordField().setText(String.valueOf(dialog.getKeyStorePassword()));
form.getKeyAliasField().setText(dialog.getKeyAlias());
form.getKeyPasswordField().setText(String.valueOf(dialog.getKeyPassword()));
}
}
});
form.getKeyAliasField().getButton().addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
final List<String> keys = loadExistingKeys(form);
if (keys == null) {
return;
}
final ChooseKeyDialog dialog =
new ChooseKeyDialog(project, form.getKeyStorePathField().getText().trim(), form.getKeyStorePasswordField().getPassword(), keys,
form.getKeyAliasField().getText().trim());
dialog.show();
if (dialog.getExitCode() == DialogWrapper.OK_EXIT_CODE) {
final String chosenKey = dialog.getChosenKey();
if (chosenKey != null) {
form.getKeyAliasField().setText(chosenKey);
}
final char[] password = dialog.getChosenKeyPassword();
if (password != null) {
form.getKeyPasswordField().setText(String.valueOf(password));
}
}
}
});
}
}