aboutsummaryrefslogtreecommitdiffstats
path: root/OpenKeychain
diff options
context:
space:
mode:
authorDominik Schürmann <dominik@dominikschuermann.de>2014-04-09 00:51:58 +0200
committerDominik Schürmann <dominik@dominikschuermann.de>2014-04-09 00:51:58 +0200
commite9efd0ec8793069add0ae41e22ebb78fc9df147c (patch)
tree0a5d87f357e6c934bbb1b52c2faaa70872d9963f /OpenKeychain
parentb682cb2ae54631de23b77efe50aee8340a95cd6f (diff)
parent19cab919afd26c14d4df214f51ae05c49432e1d1 (diff)
downloadopen-keychain-e9efd0ec8793069add0ae41e22ebb78fc9df147c.tar.gz
open-keychain-e9efd0ec8793069add0ae41e22ebb78fc9df147c.tar.bz2
open-keychain-e9efd0ec8793069add0ae41e22ebb78fc9df147c.zip
Merge pull request #539 from gogowitczak/custom-key-length-info
Modified Spinner values for CreateKeyDialog. Added info for user about custom key length restrictions.
Diffstat (limited to 'OpenKeychain')
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/CreateKeyDialogFragment.java121
-rw-r--r--OpenKeychain/src/main/res/layout/create_key_dialog.xml7
-rw-r--r--OpenKeychain/src/main/res/values/arrays.xml17
-rw-r--r--OpenKeychain/src/main/res/values/strings.xml7
4 files changed, 111 insertions, 41 deletions
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/CreateKeyDialogFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/CreateKeyDialogFragment.java
index 78223379b..183f569f1 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/CreateKeyDialogFragment.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/CreateKeyDialogFragment.java
@@ -20,6 +20,7 @@ package org.sufficientlysecure.keychain.ui.dialog;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.DialogInterface;
+import android.os.Build;
import android.os.Bundle;
import android.support.v4.app.DialogFragment;
import android.support.v4.app.FragmentActivity;
@@ -37,6 +38,7 @@ import org.sufficientlysecure.keychain.R;
import org.sufficientlysecure.keychain.util.Choice;
import java.util.ArrayList;
+import java.util.Arrays;
public class CreateKeyDialogFragment extends DialogFragment {
@@ -53,6 +55,7 @@ public class CreateKeyDialogFragment extends DialogFragment {
private Spinner mKeySizeSpinner;
private TextView mCustomKeyTextView;
private EditText mCustomKeyEditText;
+ private TextView mCustomKeyInfoTextView;
public void setOnAlgorithmSelectedListener(OnAlgorithmSelectedListener listener) {
mAlgorithmSelectedListener = listener;
@@ -110,32 +113,16 @@ public class CreateKeyDialogFragment extends DialogFragment {
}
mKeySizeSpinner = (Spinner) view.findViewById(R.id.create_key_size);
- ArrayAdapter<CharSequence> keySizeAdapter = ArrayAdapter.createFromResource(
- context, R.array.key_size_spinner_values,
- android.R.layout.simple_spinner_item);
- keySizeAdapter
- .setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
+ // dynamic ArrayAdapter must be created (instead of ArrayAdapter.getFromResource), because it's content may change
+ ArrayAdapter<CharSequence> keySizeAdapter = new ArrayAdapter<CharSequence>(context, android.R.layout.simple_spinner_item,
+ new ArrayList<CharSequence>(Arrays.asList(getResources().getStringArray(R.array.rsa_key_size_spinner_values))));
+ keySizeAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
mKeySizeSpinner.setAdapter(keySizeAdapter);
- mKeySizeSpinner.setSelection(3); // Default to 4096 for the key length
+ mKeySizeSpinner.setSelection(1); // Default to 4096 for the key length
mCustomKeyTextView = (TextView) view.findViewById(R.id.custom_key_size_label);
mCustomKeyEditText = (EditText) view.findViewById(R.id.custom_key_size_input);
-
- final AdapterView.OnItemSelectedListener customKeySelectedLisener = new AdapterView.OnItemSelectedListener() {
- @Override
- public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
- final String selectedItemString = (String) parent.getSelectedItem();
- final String customLengthString = getResources().getString(R.string.key_size_custom);
- final boolean customSelected = customLengthString.equals(selectedItemString);
- final int visibility = customSelected ? View.VISIBLE : View.GONE;
- mCustomKeyEditText.setVisibility(visibility);
- mCustomKeyTextView.setVisibility(visibility);
- }
-
- @Override
- public void onNothingSelected(AdapterView<?> parent) {
- }
- };
+ mCustomKeyInfoTextView = (TextView) view.findViewById(R.id.custom_key_size_info);
dialog.setPositiveButton(android.R.string.ok,
new DialogInterface.OnClickListener() {
@@ -158,37 +145,46 @@ public class CreateKeyDialogFragment extends DialogFragment {
final AlertDialog alertDialog = dialog.create();
- final AdapterView.OnItemSelectedListener weakRsaListener = new AdapterView.OnItemSelectedListener() {
+ mCustomKeyEditText.addTextChangedListener(new TextWatcher() {
@Override
- public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
- if (mKeySizeSpinner == parent) {
- customKeySelectedLisener.onItemSelected(parent, view, position, id);
- }
- setOkButtonAvailability(alertDialog);
+ public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
- public void onNothingSelected(AdapterView<?> parent) {
+ public void onTextChanged(CharSequence s, int start, int before, int count) {
}
- };
- mCustomKeyEditText.addTextChangedListener(new TextWatcher() {
@Override
- public void beforeTextChanged(CharSequence s, int start, int count, int after) {
+ public void afterTextChanged(Editable s) {
+ setOkButtonAvailability(alertDialog);
}
+ });
+ mKeySizeSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
- public void onTextChanged(CharSequence s, int start, int before, int count) {
+ public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
+ setCustomKeyVisibility();
+ setOkButtonAvailability(alertDialog);
}
@Override
- public void afterTextChanged(Editable s) {
- setOkButtonAvailability(alertDialog);
+ public void onNothingSelected(AdapterView<?> parent) {
}
});
- mKeySizeSpinner.setOnItemSelectedListener(weakRsaListener);
- mAlgorithmSpinner.setOnItemSelectedListener(weakRsaListener);
+ mAlgorithmSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
+ @Override
+ public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
+ setKeyLengthSpinnerValuesForAlgorithm(((Choice) parent.getSelectedItem()).getId());
+
+ setCustomKeyVisibility();
+ setOkButtonAvailability(alertDialog);
+ }
+
+ @Override
+ public void onNothingSelected(AdapterView<?> parent) {
+ }
+ });
return alertDialog;
}
@@ -263,4 +259,55 @@ public class CreateKeyDialogFragment extends DialogFragment {
alertDialog.getButton(AlertDialog.BUTTON_POSITIVE).setEnabled(properKeyLength > 0);
}
+ private void setCustomKeyVisibility() {
+ final String selectedItemString = (String) mKeySizeSpinner.getSelectedItem();
+ final String customLengthString = getResources().getString(R.string.key_size_custom);
+ final boolean customSelected = customLengthString.equals(selectedItemString);
+ final int visibility = customSelected ? View.VISIBLE : View.GONE;
+
+ mCustomKeyEditText.setVisibility(visibility);
+ mCustomKeyTextView.setVisibility(visibility);
+ mCustomKeyInfoTextView.setVisibility(visibility);
+ }
+
+ private void setKeyLengthSpinnerValuesForAlgorithm(int algorithmId) {
+ final ArrayAdapter<CharSequence> keySizeAdapter = (ArrayAdapter<CharSequence>) mKeySizeSpinner.getAdapter();
+ final Object selectedItem = mKeySizeSpinner.getSelectedItem();
+ keySizeAdapter.clear();
+ switch (algorithmId) {
+ case Id.choice.algorithm.rsa:
+ replaceArrayAdapterContent(keySizeAdapter, R.array.rsa_key_size_spinner_values);
+ mCustomKeyInfoTextView.setText(getResources().getString(R.string.key_size_custom_info_rsa));
+ break;
+ case Id.choice.algorithm.elgamal:
+ replaceArrayAdapterContent(keySizeAdapter, R.array.elgamal_key_size_spinner_values);
+ mCustomKeyInfoTextView.setText(""); // ElGamal does not support custom key length
+ break;
+ case Id.choice.algorithm.dsa:
+ replaceArrayAdapterContent(keySizeAdapter, R.array.dsa_key_size_spinner_values);
+ mCustomKeyInfoTextView.setText(getResources().getString(R.string.key_size_custom_info_dsa));
+ break;
+ }
+ keySizeAdapter.notifyDataSetChanged();
+
+ // when switching algorithm, try to select same key length as before
+ for (int i = 0; i < keySizeAdapter.getCount(); i++) {
+ if (selectedItem.equals(keySizeAdapter.getItem(i))) {
+ mKeySizeSpinner.setSelection(i);
+ break;
+ }
+ }
+ }
+
+ private void replaceArrayAdapterContent(ArrayAdapter<CharSequence> arrayAdapter, int stringArrayResourceId) {
+ final String[] spinnerValuesStringArray = getResources().getStringArray(stringArrayResourceId);
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
+ arrayAdapter.addAll(spinnerValuesStringArray);
+ } else {
+ for (final String value : spinnerValuesStringArray) {
+ arrayAdapter.add(value);
+ }
+ }
+ }
+
}
diff --git a/OpenKeychain/src/main/res/layout/create_key_dialog.xml b/OpenKeychain/src/main/res/layout/create_key_dialog.xml
index da884ceb5..16eef08c4 100644
--- a/OpenKeychain/src/main/res/layout/create_key_dialog.xml
+++ b/OpenKeychain/src/main/res/layout/create_key_dialog.xml
@@ -74,6 +74,13 @@
android:inputType="number"
android:visibility="gone"/>
+ <TextView
+ android:id="@+id/custom_key_size_info"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_gravity="center_vertical"
+ android:padding="4dp" />
+
</TableLayout>
</ScrollView> \ No newline at end of file
diff --git a/OpenKeychain/src/main/res/values/arrays.xml b/OpenKeychain/src/main/res/values/arrays.xml
index b16973f90..4173d49e4 100644
--- a/OpenKeychain/src/main/res/values/arrays.xml
+++ b/OpenKeychain/src/main/res/values/arrays.xml
@@ -29,12 +29,23 @@
<item>28800</item>
<item>-1</item>
</string-array>
- <string-array name="key_size_spinner_values" translatable="false">
- <item>@string/key_size_512</item>
- <item>@string/key_size_1024</item>
+ <string-array name="rsa_key_size_spinner_values" translatable="false">
+ <item>@string/key_size_2048</item>
+ <item>@string/key_size_4096</item>
+ <item>@string/key_size_8192</item>
+ <item>@string/key_size_custom</item>
+ </string-array>
+ <string-array name="elgamal_key_size_spinner_values" translatable="false">
+ <item>@string/key_size_1536</item>
<item>@string/key_size_2048</item>
+ <item>@string/key_size_3072</item>
<item>@string/key_size_4096</item>
<item>@string/key_size_8192</item>
+ </string-array>
+ <string-array name="dsa_key_size_spinner_values" translatable="false">
+ <item>@string/key_size_512</item>
+ <item>@string/key_size_768</item>
+ <item>@string/key_size_1024</item>
<item>@string/key_size_custom</item>
</string-array>
<string-array name="import_action_list" translatable="false">
diff --git a/OpenKeychain/src/main/res/values/strings.xml b/OpenKeychain/src/main/res/values/strings.xml
index c1d62fd52..d0959f255 100644
--- a/OpenKeychain/src/main/res/values/strings.xml
+++ b/OpenKeychain/src/main/res/values/strings.xml
@@ -249,7 +249,7 @@
<string name="key_exported">Successfully exported 1 key.</string>
<string name="keys_exported">Successfully exported %d keys.</string>
<string name="no_keys_exported">No keys exported.</string>
- <string name="key_creation_el_gamal_info">Note: only subkeys support ElGamal, and for ElGamal the nearest keysize of 1536, 2048, 3072, 4096, or 8192 will be used.</string>
+ <string name="key_creation_el_gamal_info">Note: only subkeys support ElGamal.</string>
<string name="key_creation_weak_rsa_info">Note: generating RSA key with length 1024-bit and less is considered unsafe and it\'s disabled for generating new keys.</string>
<string name="key_not_found">Couldn\'t find key %08X.</string>
@@ -375,12 +375,17 @@
<!-- key bit length selections -->
<string name="key_size_512">512</string>
+ <string name="key_size_768">768</string>
<string name="key_size_1024">1024</string>
+ <string name="key_size_1536">1536</string>
<string name="key_size_2048">2048</string>
+ <string name="key_size_3072">3072</string>
<string name="key_size_4096">4096</string>
<string name="key_size_8192">8192</string>
<string name="key_size_custom">Custom key size</string>
<string name="key_size_custom_info">Type custom key length (in bits):</string>
+ <string name="key_size_custom_info_rsa">RSA key length must be greater than 1024 and at most 8192. Also it must be multiplicity of 8.</string>
+ <string name="key_size_custom_info_dsa">DSA key length must be at least 512 and at most 1024. Also it must be multiplicity of 64.</string>
<!-- compression -->
<string name="compression_fast">fast</string>