From 19cab919afd26c14d4df214f51ae05c49432e1d1 Mon Sep 17 00:00:00 2001 From: gogowitczak Date: Tue, 8 Apr 2014 23:59:41 +0200 Subject: [PATCH] Modified Spinner values for CreateKeyDialog. Added info for user about custom key length restrictions. --- .../ui/dialog/CreateKeyDialogFragment.java | 123 ++++++++++++------ .../src/main/res/layout/create_key_dialog.xml | 7 + OpenKeychain/src/main/res/values/arrays.xml | 17 ++- OpenKeychain/src/main/res/values/strings.xml | 7 +- 4 files changed, 112 insertions(+), 42 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 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 keySizeAdapter = new ArrayAdapter(context, android.R.layout.simple_spinner_item, + new ArrayList(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,20 +145,6 @@ public class CreateKeyDialogFragment extends DialogFragment { final AlertDialog alertDialog = dialog.create(); - final AdapterView.OnItemSelectedListener weakRsaListener = new AdapterView.OnItemSelectedListener() { - @Override - public void onItemSelected(AdapterView parent, View view, int position, long id) { - if (mKeySizeSpinner == parent) { - customKeySelectedLisener.onItemSelected(parent, view, position, id); - } - setOkButtonAvailability(alertDialog); - } - - @Override - public void onNothingSelected(AdapterView parent) { - } - }; - mCustomKeyEditText.addTextChangedListener(new TextWatcher() { @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { @@ -187,8 +160,31 @@ public class CreateKeyDialogFragment extends DialogFragment { } }); - mKeySizeSpinner.setOnItemSelectedListener(weakRsaListener); - mAlgorithmSpinner.setOnItemSelectedListener(weakRsaListener); + mKeySizeSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { + @Override + public void onItemSelected(AdapterView parent, View view, int position, long id) { + setCustomKeyVisibility(); + setOkButtonAvailability(alertDialog); + } + + @Override + public void onNothingSelected(AdapterView parent) { + } + }); + + 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 keySizeAdapter = (ArrayAdapter) 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 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"/> + + \ 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,14 +29,25 @@ 28800 -1 - - @string/key_size_512 - @string/key_size_1024 + @string/key_size_2048 @string/key_size_4096 @string/key_size_8192 @string/key_size_custom + + @string/key_size_1536 + @string/key_size_2048 + @string/key_size_3072 + @string/key_size_4096 + @string/key_size_8192 + + + @string/key_size_512 + @string/key_size_768 + @string/key_size_1024 + @string/key_size_custom + @string/menu_import_from_key_server @string/menu_import_from_file 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 @@ Successfully exported 1 key. Successfully exported %d keys. No keys exported. - Note: only subkeys support ElGamal, and for ElGamal the nearest keysize of 1536, 2048, 3072, 4096, or 8192 will be used. + Note: only subkeys support ElGamal. Note: generating RSA key with length 1024-bit and less is considered unsafe and it\'s disabled for generating new keys. Couldn\'t find key %08X. @@ -375,12 +375,17 @@ 512 + 768 1024 + 1536 2048 + 3072 4096 8192 Custom key size Type custom key length (in bits): + RSA key length must be greater than 1024 and at most 8192. Also it must be multiplicity of 8. + DSA key length must be at least 512 and at most 1024. Also it must be multiplicity of 64. fast