Don't return unresolved asynchronous recipients for non-async callers

Fixes #6082
// FREEBIE
This commit is contained in:
Moxie Marlinspike 2017-01-22 21:57:23 -08:00
parent dadc8d0183
commit 21a0fe3a48
3 changed files with 24 additions and 3 deletions

View File

@ -46,6 +46,7 @@ public class Recipient {
private @NonNull String number; private @NonNull String number;
private @Nullable String name; private @Nullable String name;
private boolean stale; private boolean stale;
private boolean resolving;
private ContactPhoto contactPhoto; private ContactPhoto contactPhoto;
private Uri contactUri; private Uri contactUri;
@ -61,6 +62,7 @@ public class Recipient {
this.number = number; this.number = number;
this.contactPhoto = ContactPhotoFactory.getLoadingPhoto(); this.contactPhoto = ContactPhotoFactory.getLoadingPhoto();
this.color = null; this.color = null;
this.resolving = true;
if (stale != null) { if (stale != null) {
this.name = stale.name; this.name = stale.name;
@ -79,6 +81,7 @@ public class Recipient {
Recipient.this.contactUri = result.contactUri; Recipient.this.contactUri = result.contactUri;
Recipient.this.contactPhoto = result.avatar; Recipient.this.contactPhoto = result.avatar;
Recipient.this.color = result.color; Recipient.this.color = result.color;
Recipient.this.resolving = false;
} }
notifyListeners(); notifyListeners();
@ -99,6 +102,7 @@ public class Recipient {
this.name = details.name; this.name = details.name;
this.contactPhoto = details.avatar; this.contactPhoto = details.avatar;
this.color = details.color; this.color = details.color;
this.resolving = false;
} }
public synchronized @Nullable Uri getContactUri() { public synchronized @Nullable Uri getContactUri() {
@ -193,4 +197,9 @@ public class Recipient {
void setStale() { void setStale() {
this.stale = true; this.stale = true;
} }
synchronized boolean isResolving() {
return resolving;
}
} }

View File

@ -49,7 +49,7 @@ import java.util.Map;
import java.util.concurrent.Callable; import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService; import java.util.concurrent.ExecutorService;
public class RecipientProvider { class RecipientProvider {
private static final String TAG = RecipientProvider.class.getSimpleName(); private static final String TAG = RecipientProvider.class.getSimpleName();
@ -72,7 +72,9 @@ public class RecipientProvider {
@NonNull Recipient getRecipient(Context context, long recipientId, boolean asynchronous) { @NonNull Recipient getRecipient(Context context, long recipientId, boolean asynchronous) {
Recipient cachedRecipient = recipientCache.get(recipientId); Recipient cachedRecipient = recipientCache.get(recipientId);
if (cachedRecipient != null && !cachedRecipient.isStale()) return cachedRecipient; if (cachedRecipient != null && !cachedRecipient.isStale() && (asynchronous || !cachedRecipient.isResolving())) {
return cachedRecipient;
}
String number = CanonicalAddressDatabase.getInstance(context).getAddressFromId(recipientId); String number = CanonicalAddressDatabase.getInstance(context).getAddressFromId(recipientId);
@ -88,7 +90,9 @@ public class RecipientProvider {
@NonNull Recipients getRecipients(Context context, long[] recipientIds, boolean asynchronous) { @NonNull Recipients getRecipients(Context context, long[] recipientIds, boolean asynchronous) {
Recipients cachedRecipients = recipientsCache.get(new RecipientIds(recipientIds)); Recipients cachedRecipients = recipientsCache.get(new RecipientIds(recipientIds));
if (cachedRecipients != null && !cachedRecipients.isStale()) return cachedRecipients; if (cachedRecipients != null && !cachedRecipients.isStale() && (asynchronous || !cachedRecipients.isResolving())) {
return cachedRecipients;
}
List<Recipient> recipientList = new LinkedList<>(); List<Recipient> recipientList = new LinkedList<>();

View File

@ -344,6 +344,14 @@ public class Recipients implements Iterable<Recipient>, RecipientModifiedListene
this.stale = true; this.stale = true;
} }
boolean isResolving() {
for (Recipient recipient : recipients) {
if (recipient.isResolving()) return true;
}
return false;
}
public interface RecipientsModifiedListener { public interface RecipientsModifiedListener {
public void onModified(Recipients recipient); public void onModified(Recipients recipient);
} }