Work on edit

This commit is contained in:
Dominik Schürmann 2014-07-03 15:05:43 +02:00
parent 8cbdf7b1c5
commit 55f067b063
8 changed files with 68 additions and 59 deletions

View file

@ -55,10 +55,10 @@ public class SaveKeyringParcel implements Parcelable {
// performance gain for using Parcelable here would probably be negligible, // performance gain for using Parcelable here would probably be negligible,
// use Serializable instead. // use Serializable instead.
public static class SubkeyAdd implements Serializable { public static class SubkeyAdd implements Serializable {
public final int mAlgorithm; public int mAlgorithm;
public final int mKeysize; public int mKeysize;
public final int mFlags; public int mFlags;
public final Long mExpiry; public Long mExpiry;
public SubkeyAdd(int algorithm, int keysize, int flags, Long expiry) { public SubkeyAdd(int algorithm, int keysize, int flags, Long expiry) {
mAlgorithm = algorithm; mAlgorithm = algorithm;
mKeysize = keysize; mKeysize = keysize;
@ -68,9 +68,9 @@ public class SaveKeyringParcel implements Parcelable {
} }
public static class SubkeyChange implements Serializable { public static class SubkeyChange implements Serializable {
public final long mKeyId; public long mKeyId;
public final Integer mFlags; public Integer mFlags;
public final Long mExpiry; public Long mExpiry;
public SubkeyChange(long keyId, Integer flags, Long expiry) { public SubkeyChange(long keyId, Integer flags, Long expiry) {
mKeyId = keyId; mKeyId = keyId;
mFlags = flags; mFlags = flags;

View file

@ -37,6 +37,7 @@ import android.widget.AdapterView;
import android.widget.ListView; import android.widget.ListView;
import android.widget.Toast; import android.widget.Toast;
import org.spongycastle.bcpg.sig.KeyFlags;
import org.sufficientlysecure.keychain.Constants; import org.sufficientlysecure.keychain.Constants;
import org.sufficientlysecure.keychain.R; import org.sufficientlysecure.keychain.R;
import org.sufficientlysecure.keychain.compatibility.DialogFragmentWorkaround; import org.sufficientlysecure.keychain.compatibility.DialogFragmentWorkaround;
@ -50,6 +51,7 @@ import org.sufficientlysecure.keychain.service.OperationResults;
import org.sufficientlysecure.keychain.service.PassphraseCacheService; import org.sufficientlysecure.keychain.service.PassphraseCacheService;
import org.sufficientlysecure.keychain.service.SaveKeyringParcel; import org.sufficientlysecure.keychain.service.SaveKeyringParcel;
import org.sufficientlysecure.keychain.ui.adapter.SubkeysAdapter; import org.sufficientlysecure.keychain.ui.adapter.SubkeysAdapter;
import org.sufficientlysecure.keychain.ui.adapter.SubkeysAddedAdapter;
import org.sufficientlysecure.keychain.ui.adapter.UserIdsAdapter; import org.sufficientlysecure.keychain.ui.adapter.UserIdsAdapter;
import org.sufficientlysecure.keychain.ui.adapter.UserIdsAddedAdapter; import org.sufficientlysecure.keychain.ui.adapter.UserIdsAddedAdapter;
import org.sufficientlysecure.keychain.ui.dialog.EditUserIdDialogFragment; import org.sufficientlysecure.keychain.ui.dialog.EditUserIdDialogFragment;
@ -67,17 +69,22 @@ public class EditKeyFragment extends LoaderFragment implements
private ListView mUserIdsList; private ListView mUserIdsList;
private ListView mSubkeysList; private ListView mSubkeysList;
private ListView mUserIdsAddedList; private ListView mUserIdsAddedList;
private ListView mKeysAddedList; private ListView mSubkeysAddedList;
private View mChangePassphrase; private View mChangePassphrase;
private View mAddUserId; private View mAddUserId;
private View mAddKey; private View mAddSubkey;
private static final int LOADER_ID_USER_IDS = 0; private static final int LOADER_ID_USER_IDS = 0;
private static final int LOADER_ID_SUBKEYS = 1; private static final int LOADER_ID_SUBKEYS = 1;
// cursor adapter
private UserIdsAdapter mUserIdsAdapter; private UserIdsAdapter mUserIdsAdapter;
private SubkeysAdapter mSubkeysAdapter; private SubkeysAdapter mSubkeysAdapter;
// array adapter
private UserIdsAddedAdapter mUserIdsAddedAdapter; private UserIdsAddedAdapter mUserIdsAddedAdapter;
private SubkeysAddedAdapter mSubkeysAddedAdapter;
private ArrayList<UserIdsAddedAdapter.UserIdModel> mUserIdsAddedData; private ArrayList<UserIdsAddedAdapter.UserIdModel> mUserIdsAddedData;
private Uri mDataUri; private Uri mDataUri;
@ -106,10 +113,10 @@ public class EditKeyFragment extends LoaderFragment implements
mUserIdsList = (ListView) view.findViewById(R.id.edit_key_user_ids); mUserIdsList = (ListView) view.findViewById(R.id.edit_key_user_ids);
mSubkeysList = (ListView) view.findViewById(R.id.edit_key_keys); mSubkeysList = (ListView) view.findViewById(R.id.edit_key_keys);
mUserIdsAddedList = (ListView) view.findViewById(R.id.edit_key_user_ids_added); mUserIdsAddedList = (ListView) view.findViewById(R.id.edit_key_user_ids_added);
mKeysAddedList = (ListView) view.findViewById(R.id.edit_key_keys_added); mSubkeysAddedList = (ListView) view.findViewById(R.id.edit_key_keys_added);
mChangePassphrase = view.findViewById(R.id.edit_key_action_change_passphrase); mChangePassphrase = view.findViewById(R.id.edit_key_action_change_passphrase);
mAddUserId = view.findViewById(R.id.edit_key_action_add_user_id); mAddUserId = view.findViewById(R.id.edit_key_action_add_user_id);
mAddKey = view.findViewById(R.id.edit_key_action_add_key); mAddSubkey = view.findViewById(R.id.edit_key_action_add_key);
return root; return root;
} }
@ -180,6 +187,13 @@ public class EditKeyFragment extends LoaderFragment implements
} }
}); });
mAddSubkey.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
addSubkey();
}
});
mUserIdsAdapter = new UserIdsAdapter(getActivity(), null, 0, mSaveKeyringParcel); mUserIdsAdapter = new UserIdsAdapter(getActivity(), null, 0, mSaveKeyringParcel);
mUserIdsList.setAdapter(mUserIdsAdapter); mUserIdsList.setAdapter(mUserIdsAdapter);
@ -199,6 +213,9 @@ public class EditKeyFragment extends LoaderFragment implements
mSubkeysAdapter = new SubkeysAdapter(getActivity(), null, 0); mSubkeysAdapter = new SubkeysAdapter(getActivity(), null, 0);
mSubkeysList.setAdapter(mSubkeysAdapter); mSubkeysList.setAdapter(mSubkeysAdapter);
mSubkeysAddedAdapter = new SubkeysAddedAdapter(getActivity(), mSaveKeyringParcel.addSubKeys);
mSubkeysAddedList.setAdapter(mSubkeysAddedAdapter);
// Prepare the loaders. Either re-connect with an existing ones, // Prepare the loaders. Either re-connect with an existing ones,
// or start new ones. // or start new ones.
getLoaderManager().initLoader(LOADER_ID_USER_IDS, null, this); getLoaderManager().initLoader(LOADER_ID_USER_IDS, null, this);
@ -327,6 +344,11 @@ public class EditKeyFragment extends LoaderFragment implements
mUserIdsAddedAdapter.add(new UserIdsAddedAdapter.UserIdModel()); mUserIdsAddedAdapter.add(new UserIdsAddedAdapter.UserIdModel());
} }
private void addSubkey() {
// default values
mSubkeysAddedAdapter.add(new SaveKeyringParcel.SubkeyAdd(Constants.choice.algorithm.rsa, 4096, KeyFlags.SIGN_DATA, null));
}
private void save() { private void save() {
String passphrase = PassphraseCacheService.getCachedPassphrase(getActivity(), String passphrase = PassphraseCacheService.getCachedPassphrase(getActivity(),
mSaveKeyringParcel.mMasterKeyId); mSaveKeyringParcel.mMasterKeyId);

View file

@ -107,7 +107,6 @@ public class UserIdsAdapter extends CursorAdapter implements AdapterView.OnItemC
TextView vAddress = (TextView) view.findViewById(R.id.address); TextView vAddress = (TextView) view.findViewById(R.id.address);
TextView vComment = (TextView) view.findViewById(R.id.comment); TextView vComment = (TextView) view.findViewById(R.id.comment);
ImageView vVerified = (ImageView) view.findViewById(R.id.certified); ImageView vVerified = (ImageView) view.findViewById(R.id.certified);
ImageView vHasChanges = (ImageView) view.findViewById(R.id.has_changes);
ImageView vEditImage = (ImageView) view.findViewById(R.id.edit_image); ImageView vEditImage = (ImageView) view.findViewById(R.id.edit_image);
String userId = cursor.getString(INDEX_USER_ID); String userId = cursor.getString(INDEX_USER_ID);
@ -135,27 +134,23 @@ public class UserIdsAdapter extends CursorAdapter implements AdapterView.OnItemC
// for edit key // for edit key
if (mSaveKeyringParcel != null) { if (mSaveKeyringParcel != null) {
boolean changeUserId = (mSaveKeyringParcel.changePrimaryUserId != null boolean changeAnyPrimaryUserId = (mSaveKeyringParcel.changePrimaryUserId != null);
boolean changeThisPrimaryUserId = (mSaveKeyringParcel.changePrimaryUserId != null
&& mSaveKeyringParcel.changePrimaryUserId.equals(userId)); && mSaveKeyringParcel.changePrimaryUserId.equals(userId));
boolean revoke = (mSaveKeyringParcel.revokeUserIds.contains(userId)); boolean revokeThisUserId = (mSaveKeyringParcel.revokeUserIds.contains(userId));
if (changeUserId) { if (changeAnyPrimaryUserId) {
isPrimary = !isPrimary; // change all user ids, only this one should be primary
isPrimary = changeThisPrimaryUserId;
} }
if (revoke) { if (revokeThisUserId) {
if (!isRevoked) { if (!isRevoked) {
isRevoked = true; isRevoked = true;
} }
} }
if (changeUserId || revoke) {
vHasChanges.setVisibility(View.VISIBLE);
} else {
vHasChanges.setVisibility(View.GONE);
}
vEditImage.setVisibility(View.VISIBLE); vEditImage.setVisibility(View.VISIBLE);
} else { } else {
vHasChanges.setVisibility(View.GONE);
vEditImage.setVisibility(View.GONE); vEditImage.setVisibility(View.GONE);
} }
@ -166,11 +161,14 @@ public class UserIdsAdapter extends CursorAdapter implements AdapterView.OnItemC
// disable and strike through text for revoked user ids // disable and strike through text for revoked user ids
vName.setEnabled(false); vName.setEnabled(false);
vAddress.setEnabled(false); vAddress.setEnabled(false);
vComment.setEnabled(false);
vName.setText(OtherHelper.strikeOutText(vName.getText())); vName.setText(OtherHelper.strikeOutText(vName.getText()));
vAddress.setText(OtherHelper.strikeOutText(vAddress.getText())); vAddress.setText(OtherHelper.strikeOutText(vAddress.getText()));
vComment.setText(OtherHelper.strikeOutText(vComment.getText()));
} else { } else {
vName.setEnabled(true); vName.setEnabled(true);
vAddress.setEnabled(true); vAddress.setEnabled(true);
vComment.setEnabled(true);
// verified: has been verified // verified: has been verified
// isPrimary: show small star icon for primary user ids // isPrimary: show small star icon for primary user ids

View file

@ -106,14 +106,14 @@ public class UserIdsAddedAdapter extends ArrayAdapter<UserIdsAddedAdapter.UserId
if (convertView == null) { if (convertView == null) {
// Not recycled, inflate a new view // Not recycled, inflate a new view
convertView = mInflater.inflate(R.layout.edit_key_user_id_added_item, null); convertView = mInflater.inflate(R.layout.edit_key_user_id_added_item, null);
final ViewHolder viewHolder = new ViewHolder(); final ViewHolder holder = new ViewHolder();
viewHolder.vAddress = (AutoCompleteTextView) convertView.findViewById(R.id.user_id_added_item_address); holder.vAddress = (AutoCompleteTextView) convertView.findViewById(R.id.user_id_added_item_address);
viewHolder.vName = (AutoCompleteTextView) convertView.findViewById(R.id.user_id_added_item_name); holder.vName = (AutoCompleteTextView) convertView.findViewById(R.id.user_id_added_item_name);
viewHolder.vComment = (EditText) convertView.findViewById(R.id.user_id_added_item_comment); holder.vComment = (EditText) convertView.findViewById(R.id.user_id_added_item_comment);
viewHolder.vDelete = (ImageButton) convertView.findViewById(R.id.user_id_added_item_delete); holder.vDelete = (ImageButton) convertView.findViewById(R.id.user_id_added_item_delete);
convertView.setTag(viewHolder); convertView.setTag(holder);
viewHolder.vAddress.addTextChangedListener(new TextWatcher() { holder.vAddress.addTextChangedListener(new TextWatcher() {
@Override @Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) { public void beforeTextChanged(CharSequence s, int start, int count, int after) {
} }
@ -125,26 +125,26 @@ public class UserIdsAddedAdapter extends ArrayAdapter<UserIdsAddedAdapter.UserId
@Override @Override
public void afterTextChanged(Editable s) { public void afterTextChanged(Editable s) {
// update referenced item in view holder // update referenced item in view holder
viewHolder.mModel.address = s.toString(); holder.mModel.address = s.toString();
// show icon on valid email addresses // show icon on valid email addresses
if (viewHolder.mModel.address.length() > 0) { if (holder.mModel.address.length() > 0) {
Matcher emailMatcher = Patterns.EMAIL_ADDRESS.matcher(viewHolder.mModel.address); Matcher emailMatcher = Patterns.EMAIL_ADDRESS.matcher(holder.mModel.address);
if (emailMatcher.matches()) { if (emailMatcher.matches()) {
viewHolder.vAddress.setCompoundDrawablesWithIntrinsicBounds(0, 0, holder.vAddress.setCompoundDrawablesWithIntrinsicBounds(0, 0,
R.drawable.uid_mail_ok, 0); R.drawable.uid_mail_ok, 0);
} else { } else {
viewHolder.vAddress.setCompoundDrawablesWithIntrinsicBounds(0, 0, holder.vAddress.setCompoundDrawablesWithIntrinsicBounds(0, 0,
R.drawable.uid_mail_bad, 0); R.drawable.uid_mail_bad, 0);
} }
} else { } else {
// remove drawable if email is empty // remove drawable if email is empty
viewHolder.vAddress.setCompoundDrawablesWithIntrinsicBounds(0, 0, 0, 0); holder.vAddress.setCompoundDrawablesWithIntrinsicBounds(0, 0, 0, 0);
} }
} }
}); });
viewHolder.vName.addTextChangedListener(new TextWatcher() { holder.vName.addTextChangedListener(new TextWatcher() {
@Override @Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) { public void beforeTextChanged(CharSequence s, int start, int count, int after) {
} }
@ -156,11 +156,11 @@ public class UserIdsAddedAdapter extends ArrayAdapter<UserIdsAddedAdapter.UserId
@Override @Override
public void afterTextChanged(Editable s) { public void afterTextChanged(Editable s) {
// update referenced item in view holder // update referenced item in view holder
viewHolder.mModel.name = s.toString(); holder.mModel.name = s.toString();
} }
}); });
viewHolder.vComment.addTextChangedListener(new TextWatcher() { holder.vComment.addTextChangedListener(new TextWatcher() {
@Override @Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) { public void beforeTextChanged(CharSequence s, int start, int count, int after) {
} }
@ -172,15 +172,15 @@ public class UserIdsAddedAdapter extends ArrayAdapter<UserIdsAddedAdapter.UserId
@Override @Override
public void afterTextChanged(Editable s) { public void afterTextChanged(Editable s) {
// update referenced item in view holder // update referenced item in view holder
viewHolder.mModel.comment = s.toString(); holder.mModel.comment = s.toString();
} }
}); });
viewHolder.vDelete.setOnClickListener(new View.OnClickListener() { holder.vDelete.setOnClickListener(new View.OnClickListener() {
@Override @Override
public void onClick(View v) { public void onClick(View v) {
// remove reference model item from adapter (data and notify about change) // remove reference model item from adapter (data and notify about change)
UserIdsAddedAdapter.this.remove(viewHolder.mModel); UserIdsAddedAdapter.this.remove(holder.mModel);
} }
}); });

View file

@ -51,8 +51,6 @@ public class CreateKeyDialogFragment extends DialogFragment {
private static final String ARG_EDITOR_CHILD_COUNT = "child_count"; private static final String ARG_EDITOR_CHILD_COUNT = "child_count";
private int mNewKeySize;
private Choice mNewKeyAlgorithmChoice;
private OnAlgorithmSelectedListener mAlgorithmSelectedListener; private OnAlgorithmSelectedListener mAlgorithmSelectedListener;
private Spinner mAlgorithmSpinner; private Spinner mAlgorithmSpinner;
private Spinner mKeySizeSpinner; private Spinner mKeySizeSpinner;
@ -131,9 +129,9 @@ public class CreateKeyDialogFragment extends DialogFragment {
new DialogInterface.OnClickListener() { new DialogInterface.OnClickListener() {
public void onClick(DialogInterface di, int id) { public void onClick(DialogInterface di, int id) {
di.dismiss(); di.dismiss();
mNewKeyAlgorithmChoice = (Choice) mAlgorithmSpinner.getSelectedItem(); Choice newKeyAlgorithmChoice = (Choice) mAlgorithmSpinner.getSelectedItem();
mNewKeySize = getProperKeyLength(mNewKeyAlgorithmChoice.getId(), getSelectedKeyLength()); int newKeySize = getProperKeyLength(newKeyAlgorithmChoice.getId(), getSelectedKeyLength());
mAlgorithmSelectedListener.onAlgorithmSelected(mNewKeyAlgorithmChoice, mNewKeySize); mAlgorithmSelectedListener.onAlgorithmSelected(newKeyAlgorithmChoice, newKeySize);
} }
} }
); );

View file

@ -7,7 +7,6 @@
android:singleLine="true"> android:singleLine="true">
<ImageView <ImageView
android:id="@+id/has_changes"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="match_parent" android:layout_height="match_parent"
android:minWidth="10dp" android:minWidth="10dp"

View file

@ -6,13 +6,6 @@
android:orientation="horizontal" android:orientation="horizontal"
android:singleLine="true"> android:singleLine="true">
<ImageView
android:id="@+id/has_changes"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:minWidth="10dp"
android:background="@color/result_green" />
<CheckBox <CheckBox
android:id="@+id/checkBox" android:id="@+id/checkBox"
android:layout_width="wrap_content" android:layout_width="wrap_content"

View file

@ -222,7 +222,6 @@
<string name="keys_exported">Successfully exported %d keys.</string> <string name="keys_exported">Successfully exported %d keys.</string>
<string name="no_keys_exported">No keys exported.</string> <string name="no_keys_exported">No keys exported.</string>
<string name="key_creation_el_gamal_info">Note: only subkeys support ElGamal.</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> <string name="key_not_found">Couldn\'t find key %08X.</string>
<plurals name="bad_keys_encountered"> <plurals name="bad_keys_encountered">
@ -626,8 +625,8 @@
<!-- modifySecretKeyRing --> <!-- modifySecretKeyRing -->
<string name="msg_mr">Modifying keyring %s</string> <string name="msg_mr">Modifying keyring %s</string>
<string name="msg_mf_error_encode">Encoding exception!</string> <string name="msg_mf_error_encode">Encoding exception!</string>
<string name="msg_mf_error_fingerprint">Actual key fingerprint does not match expected!</string> <string name="msg_mf_error_fingerprint">Actual key fingerprint does not match the expected one!</string>
<string name="msg_mf_error_keyid">No keyid. This is a programming error, please file a bug report!</string> <string name="msg_mf_error_keyid">No key ID. This is an internal error, please file a bug report!</string>
<string name="msg_mf_error_integrity">Internal error, integrity check failed!</string> <string name="msg_mf_error_integrity">Internal error, integrity check failed!</string>
<string name="msg_mf_error_revoked_primary">Revoked user ids cannot be primary!</string> <string name="msg_mf_error_revoked_primary">Revoked user ids cannot be primary!</string>
<string name="msg_mf_error_pgp">PGP internal exception!</string> <string name="msg_mf_error_pgp">PGP internal exception!</string>
@ -636,7 +635,7 @@
<string name="msg_mf_subkey_change">Modifying subkey %s</string> <string name="msg_mf_subkey_change">Modifying subkey %s</string>
<string name="msg_mf_subkey_missing">Tried to operate on missing subkey %s!</string> <string name="msg_mf_subkey_missing">Tried to operate on missing subkey %s!</string>
<string name="msg_mf_subkey_new">Generating new %1$s bit %2$s subkey</string> <string name="msg_mf_subkey_new">Generating new %1$s bit %2$s subkey</string>
<string name="msg_mf_subkey_new_id">New subkey id: %s</string> <string name="msg_mf_subkey_new_id">New subkey ID: %s</string>
<string name="msg_mf_subkey_past_expiry">Expiry date cannot be in the past!</string> <string name="msg_mf_subkey_past_expiry">Expiry date cannot be in the past!</string>
<string name="msg_mf_subkey_revoke">Revoking subkey %s</string> <string name="msg_mf_subkey_revoke">Revoking subkey %s</string>
<string name="msg_mf_success">Keyring successfully modified</string> <string name="msg_mf_success">Keyring successfully modified</string>