Remove display of key id in other lists

This commit is contained in:
Dominik Schürmann 2015-03-15 18:40:52 +01:00
parent 81d6da899f
commit fd5719ff6b
6 changed files with 70 additions and 19 deletions

View file

@ -205,6 +205,8 @@ public class AppSettingsAllowedKeysListFragment extends ListFragmentWorkaround i
KeyRings.HAS_ENCRYPT, KeyRings.HAS_ENCRYPT,
KeyRings.VERIFIED, KeyRings.VERIFIED,
KeyRings.HAS_ANY_SECRET, KeyRings.HAS_ANY_SECRET,
KeyRings.HAS_DUPLICATE_USER_ID,
KeyRings.CREATION,
}; };
String inMasterKeyList = null; String inMasterKeyList = null;

View file

@ -154,6 +154,8 @@ public class SelectSignKeyIdListFragment extends ListFragmentWorkaround implemen
KeyRings.HAS_ENCRYPT, KeyRings.HAS_ENCRYPT,
KeyRings.VERIFIED, KeyRings.VERIFIED,
KeyRings.HAS_ANY_SECRET, KeyRings.HAS_ANY_SECRET,
KeyRings.HAS_DUPLICATE_USER_ID,
KeyRings.CREATION,
}; };
String selection = KeyRings.HAS_ANY_SECRET + " != 0"; String selection = KeyRings.HAS_ANY_SECRET + " != 0";

View file

@ -263,6 +263,8 @@ public class SelectPublicKeyFragment extends ListFragmentWorkaround implements T
KeyRings.IS_REVOKED, KeyRings.IS_REVOKED,
KeyRings.HAS_ENCRYPT, KeyRings.HAS_ENCRYPT,
KeyRings.VERIFIED, KeyRings.VERIFIED,
KeyRings.HAS_DUPLICATE_USER_ID,
KeyRings.CREATION,
}; };
String inMasterKeyList = null; String inMasterKeyList = null;

View file

@ -20,6 +20,7 @@ package org.sufficientlysecure.keychain.ui.adapter;
import android.content.Context; import android.content.Context;
import android.database.Cursor; import android.database.Cursor;
import android.support.v4.widget.CursorAdapter; import android.support.v4.widget.CursorAdapter;
import android.text.format.DateFormat;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
@ -35,6 +36,10 @@ import org.sufficientlysecure.keychain.ui.util.Highlighter;
import org.sufficientlysecure.keychain.ui.util.KeyFormattingUtils; import org.sufficientlysecure.keychain.ui.util.KeyFormattingUtils;
import org.sufficientlysecure.keychain.ui.util.KeyFormattingUtils.State; import org.sufficientlysecure.keychain.ui.util.KeyFormattingUtils.State;
import java.util.Calendar;
import java.util.Date;
import java.util.TimeZone;
/** /**
* Yes this class is abstract! * Yes this class is abstract!
@ -44,7 +49,8 @@ abstract public class SelectKeyCursorAdapter extends CursorAdapter {
private String mQuery; private String mQuery;
private LayoutInflater mInflater; private LayoutInflater mInflater;
protected int mIndexUserId, mIndexMasterKeyId, mIndexIsExpiry, mIndexIsRevoked; protected int mIndexUserId, mIndexMasterKeyId, mIndexIsExpiry, mIndexIsRevoked,
mIndexDuplicateUserId, mIndexCreation;
public SelectKeyCursorAdapter(Context context, Cursor c, int flags, ListView listView) { public SelectKeyCursorAdapter(Context context, Cursor c, int flags, ListView listView) {
super(context, c, flags); super(context, c, flags);
@ -75,6 +81,8 @@ abstract public class SelectKeyCursorAdapter extends CursorAdapter {
mIndexMasterKeyId = cursor.getColumnIndexOrThrow(KeyRings.MASTER_KEY_ID); mIndexMasterKeyId = cursor.getColumnIndexOrThrow(KeyRings.MASTER_KEY_ID);
mIndexIsExpiry = cursor.getColumnIndexOrThrow(KeyRings.IS_EXPIRED); mIndexIsExpiry = cursor.getColumnIndexOrThrow(KeyRings.IS_EXPIRED);
mIndexIsRevoked = cursor.getColumnIndexOrThrow(KeyRings.IS_REVOKED); mIndexIsRevoked = cursor.getColumnIndexOrThrow(KeyRings.IS_REVOKED);
mIndexDuplicateUserId = cursor.getColumnIndexOrThrow(KeyRings.HAS_DUPLICATE_USER_ID);
mIndexCreation = cursor.getColumnIndexOrThrow(KeyRings.CREATION);
} }
} }
@ -90,7 +98,7 @@ abstract public class SelectKeyCursorAdapter extends CursorAdapter {
public static class ViewHolderItem { public static class ViewHolderItem {
public View view; public View view;
public TextView mainUserId, mainUserIdRest, keyId; public TextView mainUserId, mainUserIdRest, creation;
public ImageView statusIcon; public ImageView statusIcon;
public CheckBox selected; public CheckBox selected;
@ -99,7 +107,7 @@ abstract public class SelectKeyCursorAdapter extends CursorAdapter {
selected.setEnabled(enabled); selected.setEnabled(enabled);
mainUserId.setEnabled(enabled); mainUserId.setEnabled(enabled);
mainUserIdRest.setEnabled(enabled); mainUserIdRest.setEnabled(enabled);
keyId.setEnabled(enabled); creation.setEnabled(enabled);
statusIcon.setEnabled(enabled); statusIcon.setEnabled(enabled);
// Sorta special: We set an item as clickable to disable it in the ListView. This works // Sorta special: We set an item as clickable to disable it in the ListView. This works
@ -128,8 +136,20 @@ abstract public class SelectKeyCursorAdapter extends CursorAdapter {
h.mainUserIdRest.setVisibility(View.GONE); h.mainUserIdRest.setVisibility(View.GONE);
} }
long masterKeyId = cursor.getLong(mIndexMasterKeyId); boolean duplicate = cursor.getLong(mIndexDuplicateUserId) > 0;
h.keyId.setText(KeyFormattingUtils.beautifyKeyIdWithPrefix(mContext, masterKeyId)); if (duplicate) {
Date creationDate = new Date(cursor.getLong(mIndexCreation) * 1000);
Calendar creationCal = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
creationCal.setTime(creationDate);
// convert from UTC to time zone of device
creationCal.setTimeZone(TimeZone.getDefault());
h.creation.setText(context.getString(R.string.label_creation) + ": "
+ DateFormat.getDateFormat(context).format(creationCal.getTime()));
h.creation.setVisibility(View.VISIBLE);
} else {
h.creation.setVisibility(View.GONE);
}
boolean enabled; boolean enabled;
if (cursor.getInt(mIndexIsRevoked) != 0) { if (cursor.getInt(mIndexIsRevoked) != 0) {
@ -155,7 +175,7 @@ abstract public class SelectKeyCursorAdapter extends CursorAdapter {
holder.view = view; holder.view = view;
holder.mainUserId = (TextView) view.findViewById(R.id.select_key_item_name); holder.mainUserId = (TextView) view.findViewById(R.id.select_key_item_name);
holder.mainUserIdRest = (TextView) view.findViewById(R.id.select_key_item_email); holder.mainUserIdRest = (TextView) view.findViewById(R.id.select_key_item_email);
holder.keyId = (TextView) view.findViewById(R.id.select_key_item_key_id); holder.creation = (TextView) view.findViewById(R.id.select_key_item_creation);
holder.statusIcon = (ImageView) view.findViewById(R.id.select_key_item_status_icon); holder.statusIcon = (ImageView) view.findViewById(R.id.select_key_item_status_icon);
holder.selected = (CheckBox) view.findViewById(R.id.selected); holder.selected = (CheckBox) view.findViewById(R.id.selected);
view.setTag(holder); view.setTag(holder);

View file

@ -28,6 +28,7 @@ import android.support.v4.app.FragmentActivity;
import android.support.v4.app.LoaderManager; import android.support.v4.app.LoaderManager;
import android.support.v4.content.CursorLoader; import android.support.v4.content.CursorLoader;
import android.support.v4.content.Loader; import android.support.v4.content.Loader;
import android.text.format.DateFormat;
import android.util.AttributeSet; import android.util.AttributeSet;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.View; import android.view.View;
@ -51,9 +52,12 @@ import org.sufficientlysecure.keychain.util.ContactHelper;
import org.sufficientlysecure.keychain.util.Log; import org.sufficientlysecure.keychain.util.Log;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collections; import java.util.Collections;
import java.util.Date;
import java.util.List; import java.util.List;
import java.util.Locale; import java.util.Locale;
import java.util.TimeZone;
public class EncryptKeyCompletionView extends TokenCompleteTextView { public class EncryptKeyCompletionView extends TokenCompleteTextView {
public EncryptKeyCompletionView(Context context) { public EncryptKeyCompletionView(Context context) {
@ -125,7 +129,9 @@ public class EncryptKeyCompletionView extends TokenCompleteTextView {
KeyRings.USER_ID, KeyRings.USER_ID,
KeyRings.FINGERPRINT, KeyRings.FINGERPRINT,
KeyRings.IS_EXPIRED, 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 " 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) { public void onFocusChanged(boolean hasFocus, int direction, Rect previous) {
super.onFocusChanged(hasFocus, direction, previous); super.onFocusChanged(hasFocus, direction, previous);
if (hasFocus) { if (hasFocus) {
((InputMethodManager)getContext().getSystemService(Context.INPUT_METHOD_SERVICE)) ((InputMethodManager) getContext().getSystemService(Context.INPUT_METHOD_SERVICE))
.showSoftInput(this, InputMethodManager.SHOW_IMPLICIT); .showSoftInput(this, InputMethodManager.SHOW_IMPLICIT);
} }
} }
@ -180,25 +186,30 @@ public class EncryptKeyCompletionView extends TokenCompleteTextView {
private String mUserIdFull; private String mUserIdFull;
private String[] mUserId; private String[] mUserId;
private long mKeyId; private long mKeyId;
private boolean mHasDuplicate;
private Date mCreation;
private String mFingerprint; private String mFingerprint;
public EncryptionKey(String userId, long keyId, String fingerprint) { public EncryptionKey(String userId, long keyId, boolean hasDuplicate, Date creation, String fingerprint) {
this.mUserId = KeyRing.splitUserId(userId); mUserId = KeyRing.splitUserId(userId);
this.mUserIdFull = userId; mUserIdFull = userId;
this.mKeyId = keyId; mKeyId = keyId;
this.mFingerprint = fingerprint; mHasDuplicate = hasDuplicate;
mCreation = creation;
mFingerprint = fingerprint;
} }
public EncryptionKey(Cursor cursor) { public EncryptionKey(Cursor cursor) {
this(cursor.getString(cursor.getColumnIndexOrThrow(KeyRings.USER_ID)), this(cursor.getString(cursor.getColumnIndexOrThrow(KeyRings.USER_ID)),
cursor.getLong(cursor.getColumnIndexOrThrow(KeyRings.KEY_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( KeyFormattingUtils.convertFingerprintToHex(
cursor.getBlob(cursor.getColumnIndexOrThrow(KeyRings.FINGERPRINT)))); cursor.getBlob(cursor.getColumnIndexOrThrow(KeyRings.FINGERPRINT))));
} }
public EncryptionKey(CachedPublicKeyRing ring) throws PgpKeyNotFoundException { public EncryptionKey(CachedPublicKeyRing ring) throws PgpKeyNotFoundException {
this(ring.getPrimaryUserId(), ring.extractOrGetMasterKeyId(), this(ring.getPrimaryUserId(), ring.extractOrGetMasterKeyId(), false, null,
KeyFormattingUtils.convertFingerprintToHex(ring.getFingerprint())); KeyFormattingUtils.convertFingerprintToHex(ring.getFingerprint()));
} }
@ -222,13 +233,13 @@ public class EncryptKeyCompletionView extends TokenCompleteTextView {
if (mUserId[1] != null) { if (mUserId[1] != null) {
return mUserId[1]; return mUserId[1];
} else { } else {
return getKeyIdHex(); return getCreationDate();
} }
} }
public String getTertiary() { public String getTertiary() {
if (mUserId[0] != null) { if (mUserId[0] != null) {
return getKeyIdHex(); return getCreationDate();
} else { } else {
return null; return null;
} }
@ -238,6 +249,20 @@ public class EncryptKeyCompletionView extends TokenCompleteTextView {
return mKeyId; 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() { public String getKeyIdHex() {
return KeyFormattingUtils.beautifyKeyIdWithPrefix(getContext(), mKeyId); return KeyFormattingUtils.beautifyKeyIdWithPrefix(getContext(), mKeyId);
} }
@ -278,7 +303,7 @@ public class EncryptKeyCompletionView extends TokenCompleteTextView {
protected boolean keepObject(EncryptionKey obj, String mask) { protected boolean keepObject(EncryptionKey obj, String mask) {
String m = mask.toLowerCase(Locale.ENGLISH); String m = mask.toLowerCase(Locale.ENGLISH);
return obj.getUserId().toLowerCase(Locale.ENGLISH).contains(m) || return obj.getUserId().toLowerCase(Locale.ENGLISH).contains(m) ||
obj.getKeyIdHex().toString().contains(m) || obj.getKeyIdHex().contains(m) ||
obj.getKeyIdHexShort().startsWith(m); obj.getKeyIdHexShort().startsWith(m);
} }
} }

View file

@ -38,7 +38,7 @@
android:textAppearance="?android:attr/textAppearanceSmall" /> android:textAppearance="?android:attr/textAppearanceSmall" />
<TextView <TextView
android:id="@+id/select_key_item_key_id" android:id="@+id/select_key_item_creation"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:text="0xBBBBBBBBBBBBBBB" android:text="0xBBBBBBBBBBBBBBB"