summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNancy Chen <nancychen@google.com>2015-11-16 18:26:58 +0000
committerAndroid (Google) Code Review <android-gerrit@google.com>2015-11-16 18:26:58 +0000
commit8730597df2d2c69c32d09c696b6fe76f4f3a565e (patch)
tree44307445d227919a153f34edaaa57fd90c8f8e96
parenta5ed684de06428895ba704299e9e8fbe00e66de2 (diff)
parent250bbb0e04747f162beb7490ce3f7ef05a0ce841 (diff)
Merge "Fix NPE with contact cache, and guard against race condition." into ub-contactsdialer-a-dev
-rw-r--r--InCallUI/src/com/android/incallui/ContactInfoCache.java46
1 files changed, 36 insertions, 10 deletions
diff --git a/InCallUI/src/com/android/incallui/ContactInfoCache.java b/InCallUI/src/com/android/incallui/ContactInfoCache.java
index c5176b1a1..6bbe52f46 100644
--- a/InCallUI/src/com/android/incallui/ContactInfoCache.java
+++ b/InCallUI/src/com/android/incallui/ContactInfoCache.java
@@ -241,6 +241,7 @@ public class ContactInfoCache implements ContactsAsyncHelper.OnImageLoadComplete
Log.d(TAG, "Contact lookup. Local contact found, starting image load");
// Load the image with a callback to update the image state.
// When the load is finished, onImageLoadComplete() will be called.
+ cacheEntry.isLoadingPhoto = true;
ContactsAsyncHelper.startObtainPhotoAsync(TOKEN_UPDATE_PHOTO_FOR_CALL_STATE,
mContext, cacheEntry.displayPhotoUri, ContactInfoCache.this, callId);
} else {
@@ -302,19 +303,21 @@ public class ContactInfoCache implements ContactsAsyncHelper.OnImageLoadComplete
entry.photo = mContext.getResources().getDrawable(R.drawable.img_business);
}
- boolean hasContactInteractions = false;
+ mInfoMap.put(mCallId, entry);
+ sendInfoNotifications(mCallId, entry);
+
if (mContactUtils != null) {
// This method will callback "onContactInteractionsFound".
- hasContactInteractions = mContactUtils.retrieveContactInteractionsFromLookupKey(
- info.getLookupKey(), this);
+ entry.isLoadingContactInteractions =
+ mContactUtils.retrieveContactInteractionsFromLookupKey(
+ info.getLookupKey(), this);
}
- // Add the contact info to the cache.
- mInfoMap.put(mCallId, entry);
- sendInfoNotifications(mCallId, entry);
+ entry.isLoadingPhoto = info.getImageUrl() != null;
- // If there is no image then we should not expect another callback.
- if (info.getImageUrl() == null && !hasContactInteractions) {
+ // If there is no image or contact interactions then we should not expect another
+ // callback.
+ if (!entry.isLoadingPhoto && !entry.isLoadingContactInteractions) {
// We're done, so clear callbacks
clearCallbacks(mCallId);
}
@@ -329,10 +332,23 @@ public class ContactInfoCache implements ContactsAsyncHelper.OnImageLoadComplete
public void onContactInteractionsFound(Address address,
List<Pair<Calendar, Calendar>> openingHours) {
final ContactCacheEntry entry = mInfoMap.get(mCallId);
+ if (entry == null) {
+ Log.e(this, "Contact context received for empty search entry.");
+ clearCallbacks(mCallId);
+ return;
+ }
+
+ entry.isLoadingContactInteractions = false;
+
+ Log.v(ContactInfoCache.this, "Setting contact interactions for entry: ", entry);
+
entry.locationAddress = address;
entry.openingHours = openingHours;
sendContactInteractionsNotifications(mCallId, entry);
- clearCallbacks(mCallId);
+
+ if (!entry.isLoadingPhoto) {
+ clearCallbacks(mCallId);
+ }
}
}
@@ -354,6 +370,9 @@ public class ContactInfoCache implements ContactsAsyncHelper.OnImageLoadComplete
clearCallbacks(callId);
return;
}
+
+ entry.isLoadingPhoto = false;
+
Log.d(this, "setting photo for entry: ", entry);
// Conference call icons are being handled in CallCardPresenter.
@@ -369,7 +388,10 @@ public class ContactInfoCache implements ContactsAsyncHelper.OnImageLoadComplete
}
sendImageNotifications(callId, entry);
- clearCallbacks(callId);
+
+ if (!entry.isLoadingContactInteractions) {
+ clearCallbacks(callId);
+ }
}
/**
@@ -617,6 +639,10 @@ public class ContactInfoCache implements ContactsAsyncHelper.OnImageLoadComplete
public String label;
public Drawable photo;
public boolean isSipCall;
+ // Note in cache entry whether this is a pending async loading action to know whether to
+ // wait for its callback or not.
+ public boolean isLoadingPhoto;
+ public boolean isLoadingContactInteractions;
/** This will be used for the "view" notification. */
public Uri contactUri;
/** Either a display photo or a thumbnail URI. */