aboutsummaryrefslogtreecommitdiff
path: root/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/export/KeySelectionPage.java
diff options
context:
space:
mode:
Diffstat (limited to 'eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/export/KeySelectionPage.java')
-rw-r--r--eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/export/KeySelectionPage.java268
1 files changed, 268 insertions, 0 deletions
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/export/KeySelectionPage.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/export/KeySelectionPage.java
new file mode 100644
index 000000000..604a208e6
--- /dev/null
+++ b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/export/KeySelectionPage.java
@@ -0,0 +1,268 @@
+/*
+ * Copyright (C) 2008 The Android Open Source Project
+ *
+ * Licensed under the Eclipse Public License, Version 1.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.eclipse.org/org/documents/epl-v10.php
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.ide.eclipse.adt.internal.wizards.export;
+
+import com.android.ide.eclipse.adt.internal.project.ProjectHelper;
+import com.android.ide.eclipse.adt.internal.wizards.export.ExportWizard.ExportWizardPage;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.jface.wizard.IWizardPage;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.ModifyEvent;
+import org.eclipse.swt.events.ModifyListener;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Combo;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Text;
+
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.security.KeyStore;
+import java.security.KeyStoreException;
+import java.security.NoSuchAlgorithmException;
+import java.security.cert.CertificateException;
+import java.util.ArrayList;
+import java.util.Enumeration;
+
+/**
+ * Key Selection Page. This is used when an existing keystore is used.
+ */
+final class KeySelectionPage extends ExportWizardPage {
+
+ private final ExportWizard mWizard;
+ private Label mKeyAliasesLabel;
+ private Combo mKeyAliases;
+ private Label mKeyPasswordLabel;
+ private Text mKeyPassword;
+ private boolean mDisableOnChange = false;
+ private Button mUseExistingKey;
+ private Button mCreateKey;
+
+ protected KeySelectionPage(ExportWizard wizard, String pageName) {
+ super(pageName);
+ mWizard = wizard;
+
+ setTitle("Key alias selection");
+ setDescription(""); // TODO
+ }
+
+ @Override
+ public void createControl(Composite parent) {
+ Composite composite = new Composite(parent, SWT.NULL);
+ composite.setLayoutData(new GridData(GridData.FILL_BOTH));
+ GridLayout gl = new GridLayout(3, false);
+ composite.setLayout(gl);
+
+ GridData gd;
+
+ mUseExistingKey = new Button(composite, SWT.RADIO);
+ mUseExistingKey.setText("Use existing key");
+ mUseExistingKey.setLayoutData(gd = new GridData(GridData.FILL_HORIZONTAL));
+ gd.horizontalSpan = 3;
+ mUseExistingKey.setSelection(true);
+
+ new Composite(composite, SWT.NONE).setLayoutData(gd = new GridData());
+ gd.heightHint = 0;
+ gd.widthHint = 50;
+ mKeyAliasesLabel = new Label(composite, SWT.NONE);
+ mKeyAliasesLabel.setText("Alias:");
+ mKeyAliases = new Combo(composite, SWT.READ_ONLY);
+ mKeyAliases.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+
+ new Composite(composite, SWT.NONE).setLayoutData(gd = new GridData());
+ gd.heightHint = 0;
+ gd.widthHint = 50;
+ mKeyPasswordLabel = new Label(composite, SWT.NONE);
+ mKeyPasswordLabel.setText("Password:");
+ mKeyPassword = new Text(composite, SWT.BORDER | SWT.PASSWORD);
+ mKeyPassword.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+
+ mCreateKey = new Button(composite, SWT.RADIO);
+ mCreateKey.setText("Create new key");
+ mCreateKey.setLayoutData(gd = new GridData(GridData.FILL_HORIZONTAL));
+ gd.horizontalSpan = 3;
+
+ // Show description the first time
+ setErrorMessage(null);
+ setMessage(null);
+ setControl(composite);
+
+ mUseExistingKey.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ mWizard.setKeyCreationMode(!mUseExistingKey.getSelection());
+ enableWidgets();
+ onChange();
+ }
+ });
+
+ mKeyAliases.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ mWizard.setKeyAlias(mKeyAliases.getItem(mKeyAliases.getSelectionIndex()));
+ onChange();
+ }
+ });
+
+ mKeyPassword.addModifyListener(new ModifyListener() {
+ @Override
+ public void modifyText(ModifyEvent e) {
+ mWizard.setKeyPassword(mKeyPassword.getText());
+ onChange();
+ }
+ });
+ }
+
+ @Override
+ void onShow() {
+ // fill the texts with information loaded from the project.
+ if ((mProjectDataChanged & (DATA_PROJECT | DATA_KEYSTORE)) != 0) {
+ // disable onChange for now. we'll call it once at the end.
+ mDisableOnChange = true;
+
+ // reset the alias from the content of the project
+ try {
+ // reset to using a key
+ mWizard.setKeyCreationMode(false);
+ mUseExistingKey.setSelection(true);
+ mCreateKey.setSelection(false);
+ enableWidgets();
+
+ // remove the content of the alias combo always and first, in case the
+ // keystore password is wrong
+ mKeyAliases.removeAll();
+
+ // get the alias list (also used as a keystore password test)
+ KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());
+ FileInputStream fis = new FileInputStream(mWizard.getKeystore());
+ keyStore.load(fis, mWizard.getKeystorePassword().toCharArray());
+ fis.close();
+
+ Enumeration<String> aliases = keyStore.aliases();
+
+ // get the alias from the project previous export, and look for a match as
+ // we add the aliases to the combo.
+ IProject project = mWizard.getProject();
+
+ String keyAlias = ProjectHelper.loadStringProperty(project,
+ ExportWizard.PROPERTY_ALIAS);
+
+ ArrayList<String> aliasList = new ArrayList<String>();
+
+ int selection = -1;
+ int count = 0;
+ while (aliases.hasMoreElements()) {
+ String alias = aliases.nextElement();
+ mKeyAliases.add(alias);
+ aliasList.add(alias);
+ if (selection == -1 && alias.equalsIgnoreCase(keyAlias)) {
+ selection = count;
+ }
+ count++;
+ }
+
+ mWizard.setExistingAliases(aliasList);
+
+ if (selection != -1) {
+ mKeyAliases.select(selection);
+
+ // since a match was found and is selected, we need to give it to
+ // the wizard as well
+ mWizard.setKeyAlias(keyAlias);
+ } else {
+ mKeyAliases.clearSelection();
+ }
+
+ // reset the password
+ mKeyPassword.setText(""); //$NON-NLS-1$
+
+ // enable onChange, and call it to display errors and enable/disable pageCompleted.
+ mDisableOnChange = false;
+ onChange();
+ } catch (KeyStoreException e) {
+ onException(e);
+ } catch (FileNotFoundException e) {
+ onException(e);
+ } catch (NoSuchAlgorithmException e) {
+ onException(e);
+ } catch (CertificateException e) {
+ onException(e);
+ } catch (IOException e) {
+ onException(e);
+ } finally {
+ // in case we exit with an exception, we need to reset this
+ mDisableOnChange = false;
+ }
+ }
+ }
+
+ @Override
+ public IWizardPage getPreviousPage() {
+ return mWizard.getKeystoreSelectionPage();
+ }
+
+ @Override
+ public IWizardPage getNextPage() {
+ if (mWizard.getKeyCreationMode()) {
+ return mWizard.getKeyCreationPage();
+ }
+
+ return mWizard.getKeyCheckPage();
+ }
+
+ /**
+ * Handles changes and update the error message and calls {@link #setPageComplete(boolean)}.
+ */
+ private void onChange() {
+ if (mDisableOnChange) {
+ return;
+ }
+
+ setErrorMessage(null);
+ setMessage(null);
+
+ if (mWizard.getKeyCreationMode() == false) {
+ if (mKeyAliases.getSelectionIndex() == -1) {
+ setErrorMessage("Select a key alias.");
+ setPageComplete(false);
+ return;
+ }
+
+ if (mKeyPassword.getText().trim().length() == 0) {
+ setErrorMessage("Enter key password.");
+ setPageComplete(false);
+ return;
+ }
+ }
+
+ setPageComplete(true);
+ }
+
+ private void enableWidgets() {
+ boolean useKey = !mWizard.getKeyCreationMode();
+ mKeyAliasesLabel.setEnabled(useKey);
+ mKeyAliases.setEnabled(useKey);
+ mKeyPassword.setEnabled(useKey);
+ mKeyPasswordLabel.setEnabled(useKey);
+ }
+}