diff options
Diffstat (limited to 'OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget')
4 files changed, 97 insertions, 32 deletions
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/CertifyKeySpinner.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/CertifyKeySpinner.java index fc912fccb..460163a47 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/CertifyKeySpinner.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/CertifyKeySpinner.java @@ -68,7 +68,9 @@ public class CertifyKeySpinner extends KeySpinner { KeychainContract.KeyRings.IS_REVOKED, KeychainContract.KeyRings.IS_EXPIRED, KeychainContract.KeyRings.HAS_CERTIFY, - KeychainContract.KeyRings.HAS_ANY_SECRET + KeychainContract.KeyRings.HAS_ANY_SECRET, + KeychainContract.KeyRings.HAS_DUPLICATE_USER_ID, + KeychainContract.KeyRings.CREATION }; String where = KeychainContract.KeyRings.HAS_ANY_SECRET + " = 1 AND " @@ -91,16 +93,31 @@ public class CertifyKeySpinner extends KeySpinner { mIndexIsRevoked = data.getColumnIndex(KeychainContract.KeyRings.IS_REVOKED); mIndexIsExpired = data.getColumnIndex(KeychainContract.KeyRings.IS_EXPIRED); - // If there is only one choice, pick it by default - if (mAdapter.getCount() == 2) { + // If: + // - no key has been pre-selected (e.g. by SageSlinger) + // - there are actually keys (not just "none" entry) + // Then: + // - select key that is capable of certifying, but only if there is only one key capable of it + if (mSelectedKeyId == Constants.key.none && mAdapter.getCount() > 1) { // preselect if key can certify - if (data.moveToPosition(0) && !data.isNull(mIndexHasCertify)) { - setSelection(1); + int selection = -1; + while (data.moveToNext()) { + if (!data.isNull(mIndexHasCertify)) { + if (selection == -1) { + selection = data.getPosition() + 1; + } else { + // if selection is already set, we have more than one certify key! + // get back to "none"! + selection = 0; + } + } } + setSelection(selection); } } } + @Override boolean setStatus(Context context, Cursor cursor, ImageView statusView) { if (cursor.getInt(mIndexIsRevoked) != 0) { diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/EncryptKeyCompletionView.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/EncryptKeyCompletionView.java index d20e2bc99..94a321f29 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/EncryptKeyCompletionView.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/EncryptKeyCompletionView.java @@ -28,6 +28,7 @@ import android.support.v4.app.FragmentActivity; import android.support.v4.app.LoaderManager; import android.support.v4.content.CursorLoader; import android.support.v4.content.Loader; +import android.text.format.DateFormat; import android.util.AttributeSet; import android.view.LayoutInflater; import android.view.View; @@ -51,9 +52,12 @@ import org.sufficientlysecure.keychain.util.ContactHelper; import org.sufficientlysecure.keychain.util.Log; import java.util.ArrayList; +import java.util.Calendar; import java.util.Collections; +import java.util.Date; import java.util.List; import java.util.Locale; +import java.util.TimeZone; public class EncryptKeyCompletionView extends TokenCompleteTextView { public EncryptKeyCompletionView(Context context) { @@ -125,7 +129,9 @@ public class EncryptKeyCompletionView extends TokenCompleteTextView { KeyRings.USER_ID, KeyRings.FINGERPRINT, KeyRings.IS_EXPIRED, - KeyRings.HAS_ENCRYPT + KeyRings.HAS_ENCRYPT, + KeyRings.HAS_DUPLICATE_USER_ID, + KeyRings.CREATION }; String where = KeyRings.HAS_ENCRYPT + " NOT NULL AND " + KeyRings.IS_EXPIRED + " = 0 AND " @@ -153,7 +159,7 @@ public class EncryptKeyCompletionView extends TokenCompleteTextView { public void onFocusChanged(boolean hasFocus, int direction, Rect previous) { super.onFocusChanged(hasFocus, direction, previous); if (hasFocus) { - ((InputMethodManager)getContext().getSystemService(Context.INPUT_METHOD_SERVICE)) + ((InputMethodManager) getContext().getSystemService(Context.INPUT_METHOD_SERVICE)) .showSoftInput(this, InputMethodManager.SHOW_IMPLICIT); } } @@ -180,25 +186,30 @@ public class EncryptKeyCompletionView extends TokenCompleteTextView { private String mUserIdFull; private String[] mUserId; private long mKeyId; + private boolean mHasDuplicate; + private Date mCreation; private String mFingerprint; - public EncryptionKey(String userId, long keyId, String fingerprint) { - this.mUserId = KeyRing.splitUserId(userId); - this.mUserIdFull = userId; - this.mKeyId = keyId; - this.mFingerprint = fingerprint; + public EncryptionKey(String userId, long keyId, boolean hasDuplicate, Date creation, String fingerprint) { + mUserId = KeyRing.splitUserId(userId); + mUserIdFull = userId; + mKeyId = keyId; + mHasDuplicate = hasDuplicate; + mCreation = creation; + mFingerprint = fingerprint; } public EncryptionKey(Cursor cursor) { this(cursor.getString(cursor.getColumnIndexOrThrow(KeyRings.USER_ID)), cursor.getLong(cursor.getColumnIndexOrThrow(KeyRings.KEY_ID)), + cursor.getLong(cursor.getColumnIndexOrThrow(KeyRings.HAS_DUPLICATE_USER_ID)) > 0, + new Date(cursor.getLong(cursor.getColumnIndexOrThrow(KeyRings.CREATION)) * 1000), KeyFormattingUtils.convertFingerprintToHex( cursor.getBlob(cursor.getColumnIndexOrThrow(KeyRings.FINGERPRINT)))); - } public EncryptionKey(CachedPublicKeyRing ring) throws PgpKeyNotFoundException { - this(ring.getPrimaryUserId(), ring.extractOrGetMasterKeyId(), + this(ring.getPrimaryUserId(), ring.extractOrGetMasterKeyId(), false, null, KeyFormattingUtils.convertFingerprintToHex(ring.getFingerprint())); } @@ -222,13 +233,13 @@ public class EncryptKeyCompletionView extends TokenCompleteTextView { if (mUserId[1] != null) { return mUserId[1]; } else { - return getKeyIdHex(); + return getCreationDate(); } } public String getTertiary() { if (mUserId[0] != null) { - return getKeyIdHex(); + return getCreationDate(); } else { return null; } @@ -238,6 +249,20 @@ public class EncryptKeyCompletionView extends TokenCompleteTextView { return mKeyId; } + public String getCreationDate() { + if (mHasDuplicate) { + Calendar creationCal = Calendar.getInstance(TimeZone.getTimeZone("UTC")); + creationCal.setTime(mCreation); + // convert from UTC to time zone of device + creationCal.setTimeZone(TimeZone.getDefault()); + + return getContext().getString(R.string.label_creation) + ": " + + DateFormat.getDateFormat(getContext()).format(creationCal.getTime()); + } else { + return null; + } + } + public String getKeyIdHex() { return KeyFormattingUtils.beautifyKeyIdWithPrefix(getContext(), mKeyId); } @@ -278,7 +303,7 @@ public class EncryptKeyCompletionView extends TokenCompleteTextView { protected boolean keepObject(EncryptionKey obj, String mask) { String m = mask.toLowerCase(Locale.ENGLISH); return obj.getUserId().toLowerCase(Locale.ENGLISH).contains(m) || - obj.getKeyIdHex().toString().contains(m) || + obj.getKeyIdHex().contains(m) || obj.getKeyIdHexShort().startsWith(m); } } diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/KeySpinner.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/KeySpinner.java index 364712a48..aeb013c71 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/KeySpinner.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/KeySpinner.java @@ -25,6 +25,7 @@ import android.support.v4.app.LoaderManager; import android.support.v4.content.Loader; import android.support.v4.widget.CursorAdapter; import android.support.v7.internal.widget.TintSpinner; +import android.text.format.DateFormat; import android.util.AttributeSet; import android.view.View; import android.view.ViewGroup; @@ -41,6 +42,10 @@ import org.sufficientlysecure.keychain.provider.KeychainContract; import org.sufficientlysecure.keychain.ui.util.KeyFormattingUtils; import org.sufficientlysecure.keychain.util.Log; +import java.util.Calendar; +import java.util.Date; +import java.util.TimeZone; + /** * Use TintSpinner from AppCompat lib instead of Spinner. Fixes white dropdown icon. * Related: http://stackoverflow.com/a/27713090 @@ -50,7 +55,7 @@ public abstract class KeySpinner extends TintSpinner implements LoaderManager.Lo public void onKeyChanged(long masterKeyId); } - protected long mSelectedKeyId; + protected long mSelectedKeyId = Constants.key.none; protected SelectKeyAdapter mAdapter = new SelectKeyAdapter(); protected OnKeyChangedListener mListener; @@ -135,11 +140,12 @@ public abstract class KeySpinner extends TintSpinner implements LoaderManager.Lo protected class SelectKeyAdapter extends BaseAdapter implements SpinnerAdapter { private CursorAdapter inner; private int mIndexUserId; - private int mIndexKeyId; + private int mIndexDuplicate; private int mIndexMasterKeyId; + private int mIndexCreationDate; public SelectKeyAdapter() { - inner = new CursorAdapter(null, null, 0) { + inner = new CursorAdapter(getContext(), null, 0) { @Override public View newView(Context context, Cursor cursor, ViewGroup parent) { return View.inflate(getContext(), R.layout.keyspinner_item, null); @@ -150,12 +156,26 @@ public abstract class KeySpinner extends TintSpinner implements LoaderManager.Lo TextView vKeyName = (TextView) view.findViewById(R.id.keyspinner_key_name); ImageView vKeyStatus = (ImageView) view.findViewById(R.id.keyspinner_key_status); TextView vKeyEmail = (TextView) view.findViewById(R.id.keyspinner_key_email); - TextView vKeyId = (TextView) view.findViewById(R.id.keyspinner_key_id); + TextView vDuplicate = (TextView) view.findViewById(R.id.keyspinner_duplicate); String[] userId = KeyRing.splitUserId(cursor.getString(mIndexUserId)); vKeyName.setText(userId[2] == null ? userId[0] : (userId[0] + " (" + userId[2] + ")")); vKeyEmail.setText(userId[1]); - vKeyId.setText(KeyFormattingUtils.beautifyKeyIdWithPrefix(getContext(), cursor.getLong(mIndexKeyId))); + + boolean duplicate = cursor.getLong(mIndexDuplicate) > 0; + if (duplicate) { + Date creationDate = new Date(cursor.getLong(mIndexCreationDate) * 1000); + Calendar creationCal = Calendar.getInstance(TimeZone.getTimeZone("UTC")); + creationCal.setTime(creationDate); + // convert from UTC to time zone of device + creationCal.setTimeZone(TimeZone.getDefault()); + + vDuplicate.setText(context.getString(R.string.label_creation) + ": " + + DateFormat.getDateFormat(context).format(creationCal.getTime())); + vDuplicate.setVisibility(View.VISIBLE); + } else { + vDuplicate.setVisibility(View.GONE); + } boolean valid = setStatus(getContext(), cursor, vKeyStatus); setItemEnabled(view, valid); @@ -177,18 +197,18 @@ public abstract class KeySpinner extends TintSpinner implements LoaderManager.Lo TextView vKeyName = (TextView) view.findViewById(R.id.keyspinner_key_name); ImageView vKeyStatus = (ImageView) view.findViewById(R.id.keyspinner_key_status); TextView vKeyEmail = (TextView) view.findViewById(R.id.keyspinner_key_email); - TextView vKeyId = (TextView) view.findViewById(R.id.keyspinner_key_id); + TextView vKeyDuplicate = (TextView) view.findViewById(R.id.keyspinner_duplicate); if (enabled) { vKeyName.setTextColor(Color.BLACK); vKeyEmail.setTextColor(Color.BLACK); - vKeyId.setTextColor(Color.BLACK); + vKeyDuplicate.setTextColor(Color.BLACK); vKeyStatus.setVisibility(View.GONE); view.setClickable(false); } else { vKeyName.setTextColor(Color.GRAY); vKeyEmail.setTextColor(Color.GRAY); - vKeyId.setTextColor(Color.GRAY); + vKeyDuplicate.setTextColor(Color.GRAY); vKeyStatus.setVisibility(View.VISIBLE); // this is a HACK. the trick is, if the element itself is clickable, the // click is not passed on to the view list @@ -199,10 +219,13 @@ public abstract class KeySpinner extends TintSpinner implements LoaderManager.Lo public Cursor swapCursor(Cursor newCursor) { if (newCursor == null) return inner.swapCursor(null); - mIndexKeyId = newCursor.getColumnIndex(KeychainContract.KeyRings.KEY_ID); + mIndexDuplicate = newCursor.getColumnIndex(KeychainContract.KeyRings.HAS_DUPLICATE_USER_ID); mIndexUserId = newCursor.getColumnIndex(KeychainContract.KeyRings.USER_ID); mIndexMasterKeyId = newCursor.getColumnIndex(KeychainContract.KeyRings.MASTER_KEY_ID); - if (newCursor.moveToFirst()) { + mIndexCreationDate = newCursor.getColumnIndex(KeychainContract.KeyRings.CREATION); + + // pre-select key if mSelectedKeyId is given + if (mSelectedKeyId != Constants.key.none && newCursor.moveToFirst()) { do { if (newCursor.getLong(mIndexMasterKeyId) == mSelectedKeyId) { setSelection(newCursor.getPosition() + 1); @@ -253,19 +276,17 @@ public abstract class KeySpinner extends TintSpinner implements LoaderManager.Lo TextView vKeyName = (TextView) view.findViewById(R.id.keyspinner_key_name); ImageView vKeyStatus = (ImageView) view.findViewById(R.id.keyspinner_key_status); TextView vKeyEmail = (TextView) view.findViewById(R.id.keyspinner_key_email); - TextView vKeyId = (TextView) view.findViewById(R.id.keyspinner_key_id); + TextView vKeyDuplicate = (TextView) view.findViewById(R.id.keyspinner_duplicate); vKeyName.setText(R.string.choice_none); vKeyEmail.setVisibility(View.GONE); - vKeyId.setVisibility(View.GONE); + vKeyDuplicate.setVisibility(View.GONE); vKeyStatus.setVisibility(View.GONE); setItemEnabled(view, true); } else { view = inner.getView(position - 1, convertView, parent); TextView vKeyEmail = (TextView) view.findViewById(R.id.keyspinner_key_email); - TextView vKeyId = (TextView) view.findViewById(R.id.keyspinner_key_id); vKeyEmail.setVisibility(View.VISIBLE); - vKeyId.setVisibility(View.VISIBLE); } return view; } diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/SignKeySpinner.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/SignKeySpinner.java index 10327a6a4..df7347fa4 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/SignKeySpinner.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/SignKeySpinner.java @@ -59,7 +59,9 @@ public class SignKeySpinner extends KeySpinner { KeychainContract.KeyRings.IS_REVOKED, KeychainContract.KeyRings.IS_EXPIRED, KeychainContract.KeyRings.HAS_SIGN, - KeychainContract.KeyRings.HAS_ANY_SECRET + KeychainContract.KeyRings.HAS_ANY_SECRET, + KeychainContract.KeyRings.HAS_DUPLICATE_USER_ID, + KeychainContract.KeyRings.CREATION }; String where = KeychainContract.KeyRings.HAS_ANY_SECRET + " = 1"; |