Small code cleanup

This commit is contained in:
cketti 2018-02-22 05:45:16 +01:00
parent 9abc815d8b
commit 335ebe85db
3 changed files with 43 additions and 56 deletions

View file

@ -85,6 +85,22 @@ public class RecipientLoader extends AsyncTaskLoader<List<Recipient>> {
private static final int CRYPTO_PROVIDER_STATUS_UNTRUSTED = 1; private static final int CRYPTO_PROVIDER_STATUS_UNTRUSTED = 1;
private static final int CRYPTO_PROVIDER_STATUS_TRUSTED = 2; private static final int CRYPTO_PROVIDER_STATUS_TRUSTED = 2;
private static final Comparator<Recipient> RECIPIENT_COMPARATOR = new Comparator<Recipient>() {
@Override
public int compare(Recipient lhs, Recipient rhs) {
int timesContactedDiff = rhs.timesContacted - lhs.timesContacted;
if (timesContactedDiff != 0) {
return timesContactedDiff;
}
if (lhs.sortKey == null || rhs.sortKey == null) {
return 0;
}
return lhs.sortKey.compareTo(rhs.sortKey);
}
};
private final String query; private final String query;
private final Address[] addresses; private final Address[] addresses;
@ -266,22 +282,7 @@ public class RecipientLoader extends AsyncTaskLoader<List<Recipient>> {
foundValidCursor |= fillContactDataFromNameAndEmail(query, recipients, recipientMap); foundValidCursor |= fillContactDataFromNameAndEmail(query, recipients, recipientMap);
if (foundValidCursor) { if (foundValidCursor) {
//nicknames should be sorted as the others - by timesContacted,keyPrimary Collections.sort(recipients, RECIPIENT_COMPARATOR);
Collections.sort(recipients, new Comparator<Recipient>() {
@Override
public int compare(Recipient o1, Recipient o2) {
int x = o2.getTimesContacted();
int y = o1.getTimesContacted();
int compTimesContacted = (x < y) ? -1 : ((x == y) ? 0 : 1);
if (compTimesContacted != 0) {
return compTimesContacted;
}
return o2.getKeyPrimary().compareTo(o1.getKeyPrimary());
}
});
registerContentObserver(); registerContentObserver();
} }
@ -361,8 +362,6 @@ public class RecipientLoader extends AsyncTaskLoader<List<Recipient>> {
String name = prefilledName != null ? prefilledName : cursor.getString(INDEX_NAME); String name = prefilledName != null ? prefilledName : cursor.getString(INDEX_NAME);
String email = cursor.getString(INDEX_EMAIL); String email = cursor.getString(INDEX_EMAIL);
long contactId = cursor.getLong(INDEX_CONTACT_ID);
String lookupKey = cursor.getString(INDEX_LOOKUP_KEY);
// already exists? just skip then // already exists? just skip then
if (email == null || recipientMap.containsKey(email)) { if (email == null || recipientMap.containsKey(email)) {
@ -370,6 +369,11 @@ public class RecipientLoader extends AsyncTaskLoader<List<Recipient>> {
continue; continue;
} }
long contactId = cursor.getLong(INDEX_CONTACT_ID);
String lookupKey = cursor.getString(INDEX_LOOKUP_KEY);
int timesContacted = cursor.getInt(INDEX_TIMES_CONTACTED);
String sortKey = cursor.getString(INDEX_KEY_PRIMARY);
int addressType = cursor.getInt(INDEX_EMAIL_TYPE); int addressType = cursor.getInt(INDEX_EMAIL_TYPE);
String addressLabel = null; String addressLabel = null;
switch (addressType) { switch (addressType) {
@ -395,10 +399,9 @@ public class RecipientLoader extends AsyncTaskLoader<List<Recipient>> {
break; break;
} }
} }
Recipient recipient = new Recipient(name, email, addressLabel, contactId, lookupKey);
recipient.setTimesContacted(cursor.getInt(INDEX_TIMES_CONTACTED));
recipient.setKeyPrimary(cursor.getString(INDEX_KEY_PRIMARY));
Recipient recipient = new Recipient(name, email, addressLabel, contactId, lookupKey,
timesContacted, sortKey);
if (recipient.isValidEmailAddress()) { if (recipient.isValidEmailAddress()) {

View file

@ -583,8 +583,8 @@ public class RecipientSelectView extends TokenCompleteTextView<Recipient> implem
public Address address; public Address address;
public String addressLabel; public String addressLabel;
private int timesContacted; public final int timesContacted;
private String keyPrimary; public final String sortKey;
@Nullable // null if the contact has no photo. transient because we serialize this manually, see below. @Nullable // null if the contact has no photo. transient because we serialize this manually, see below.
public transient Uri photoThumbnailUri; public transient Uri photoThumbnailUri;
@ -597,14 +597,23 @@ public class RecipientSelectView extends TokenCompleteTextView<Recipient> implem
this.contactId = null; this.contactId = null;
this.cryptoStatus = RecipientCryptoStatus.UNDEFINED; this.cryptoStatus = RecipientCryptoStatus.UNDEFINED;
this.contactLookupKey = null; this.contactLookupKey = null;
timesContacted = 0;
sortKey = null;
} }
public Recipient(String name, String email, String addressLabel, long contactId, String lookupKey) { public Recipient(String name, String email, String addressLabel, long contactId, String lookupKey) {
this(name, email, addressLabel, contactId, lookupKey, 0, null);
}
public Recipient(String name, String email, String addressLabel, long contactId, String lookupKey,
int timesContacted, String sortKey) {
this.address = new Address(email, name); this.address = new Address(email, name);
this.contactId = contactId; this.contactId = contactId;
this.addressLabel = addressLabel; this.addressLabel = addressLabel;
this.cryptoStatus = RecipientCryptoStatus.UNDEFINED; this.cryptoStatus = RecipientCryptoStatus.UNDEFINED;
this.contactLookupKey = lookupKey; this.contactLookupKey = lookupKey;
this.timesContacted = timesContacted;
this.sortKey = sortKey;
} }
public String getDisplayNameOrAddress() { public String getDisplayNameOrAddress() {
@ -697,21 +706,5 @@ public class RecipientSelectView extends TokenCompleteTextView<Recipient> implem
photoThumbnailUri = Uri.parse(uriString); photoThumbnailUri = Uri.parse(uriString);
} }
} }
public void setTimesContacted(int timesContacted) {
this.timesContacted = timesContacted;
}
public int getTimesContacted() {
return timesContacted;
}
public void setKeyPrimary(String keyPrimary) {
this.keyPrimary = keyPrimary;
}
public String getKeyPrimary() {
return keyPrimary;
}
} }
} }

View file

@ -44,6 +44,10 @@ public class RecipientLoaderTest {
ContactsContract.CommonDataKinds.Email.TIMES_CONTACTED, ContactsContract.CommonDataKinds.Email.TIMES_CONTACTED,
ContactsContract.Contacts.SORT_KEY_PRIMARY ContactsContract.Contacts.SORT_KEY_PRIMARY
}; };
static final String[] PROJECTION_NICKNAME = {
ContactsContract.Data.CONTACT_ID,
ContactsContract.CommonDataKinds.Nickname.NAME
};
static final String[] PROJECTION_CRYPTO_ADDRESSES = { "address", "uid_address" }; static final String[] PROJECTION_CRYPTO_ADDRESSES = { "address", "uid_address" };
static final String[] PROJECTION_CRYPTO_STATUS = { "address", "uid_key_status", "autocrypt_key_status" }; static final String[] PROJECTION_CRYPTO_STATUS = { "address", "uid_key_status", "autocrypt_key_status" };
static final Address CONTACT_ADDRESS_1 = Address.parse("Contact Name <address@example.org>")[0]; static final Address CONTACT_ADDRESS_1 = Address.parse("Contact Name <address@example.org>")[0];
@ -61,12 +65,6 @@ public class RecipientLoaderTest {
static final String QUERYSTRING = "querystring"; static final String QUERYSTRING = "querystring";
private static final String[] PROJECTION_NICKNAME = {
ContactsContract.Data.CONTACT_ID,
ContactsContract.CommonDataKinds.Nickname.NAME
};
Context context; Context context;
ContentResolver contentResolver; ContentResolver contentResolver;
@ -188,7 +186,7 @@ public class RecipientLoaderTest {
any(String.class))).thenReturn(cursor); any(String.class))).thenReturn(cursor);
} }
private void setupNicknameContactProvider(String queriedAddress, String[]... contactsWithNickname) { private void setupNicknameContactProvider(String[]... contactsWithNickname) {
MatrixCursor cursor = new MatrixCursor(PROJECTION_NICKNAME); MatrixCursor cursor = new MatrixCursor(PROJECTION_NICKNAME);
for (String[] contact : contactsWithNickname) { for (String[] contact : contactsWithNickname) {
cursor.addRow(contact); cursor.addRow(contact);
@ -199,11 +197,8 @@ public class RecipientLoaderTest {
any(String.class), any(String.class),
any(String[].class), any(String[].class),
any(String.class))).thenReturn(cursor); any(String.class))).thenReturn(cursor);
} }
private void setupContactProviderForId(String id, String[]... contacts) { private void setupContactProviderForId(String id, String[]... contacts) {
MatrixCursor cursor = new MatrixCursor(PROJECTION); MatrixCursor cursor = new MatrixCursor(PROJECTION);
for (String[] contact : contacts) { for (String[] contact : contacts) {
@ -239,15 +234,11 @@ public class RecipientLoaderTest {
assertEquals(0, recipients.size()); assertEquals(0, recipients.size());
} }
/**
* Nickname should be sorted as querying others (more times contacted first)
*/
@Test @Test
public void queryContactProvider_sortByContactedForNickname() throws Exception { public void queryContactProvider_sortByTimesContactedForNickname() throws Exception {
RecipientLoader recipientLoader = new RecipientLoader(context, null, QUERYSTRING); RecipientLoader recipientLoader = new RecipientLoader(context, null, QUERYSTRING);
setupContactProvider("%" + QUERYSTRING + "%", CONTACT_1); setupContactProvider("%" + QUERYSTRING + "%", CONTACT_1);
setupNicknameContactProvider("%" + QUERYSTRING + "%", NICKNAME_NOT_CONTACTED); setupNicknameContactProvider(NICKNAME_NOT_CONTACTED);
setupContactProviderForId(NICKNAME_NOT_CONTACTED[0], CONTACT_WITH_NICKNAME_NOT_CONTACTED); setupContactProviderForId(NICKNAME_NOT_CONTACTED[0], CONTACT_WITH_NICKNAME_NOT_CONTACTED);
List<Recipient> recipients = recipientLoader.loadInBackground(); List<Recipient> recipients = recipientLoader.loadInBackground();
@ -256,4 +247,4 @@ public class RecipientLoaderTest {
assertEquals("bob@host.com", recipients.get(0).address.getAddress()); assertEquals("bob@host.com", recipients.get(0).address.getAddress());
assertEquals("eve_notContacted@host.com", recipients.get(1).address.getAddress()); assertEquals("eve_notContacted@host.com", recipients.get(1).address.getAddress());
} }
} }