Merge "Fix incall image for local contacts." into klp-dev
diff --git a/InCallUI/src/com/android/incallui/CallCardFragment.java b/InCallUI/src/com/android/incallui/CallCardFragment.java
index 6009036..bf3c42c 100644
--- a/InCallUI/src/com/android/incallui/CallCardFragment.java
+++ b/InCallUI/src/com/android/incallui/CallCardFragment.java
@@ -215,6 +215,13 @@
     }
 
     @Override
+    public void setSecondaryImage(Bitmap bitmap) {
+        if (bitmap != null) {
+            setDrawableToImageView(mSecondaryPhoto, new BitmapDrawable(getResources(), bitmap));
+        }
+    }
+
+    @Override
     public void setCallState(int state, Call.DisconnectCause cause, boolean bluetoothOn) {
         String callStateLabel = null;
 
diff --git a/InCallUI/src/com/android/incallui/CallCardPresenter.java b/InCallUI/src/com/android/incallui/CallCardPresenter.java
index a0ad3ce..5b6520d 100644
--- a/InCallUI/src/com/android/incallui/CallCardPresenter.java
+++ b/InCallUI/src/com/android/incallui/CallCardPresenter.java
@@ -259,6 +259,16 @@
                         updateContactEntry(entry, isPrimary, isConference);
                     }
                 }
+
+                @Override
+                public void onImageLoadComplete(int callId, Bitmap photo) {
+                    if (callId == mPrimary.getCallId()) {
+                        getUi().setPrimaryImage(photo);
+                    } else if (callId == mSecondary.getCallId()) {
+                        getUi().setSecondaryImage(photo);
+                    }
+
+                }
             });
         } else {
             Log.d(TAG, "Contact lookup. Found in memory cache: " + entry);
@@ -481,6 +491,7 @@
         void setPrimary(String number, String name, boolean nameIsNumber, String label,
                 Drawable photo, boolean isConference, String gatewayLabel, String gatewayNumber);
         void setSecondary(boolean show, String name, String label, Drawable photo);
+        void setSecondaryImage(Bitmap bitmap);
         void setCallState(int state, Call.DisconnectCause cause, boolean bluetoothOn);
 
         void setPrimaryCallElapsedTime(boolean show, String duration);
diff --git a/InCallUI/src/com/android/incallui/ContactInfoCache.java b/InCallUI/src/com/android/incallui/ContactInfoCache.java
index 0796794..aa96a90 100644
--- a/InCallUI/src/com/android/incallui/ContactInfoCache.java
+++ b/InCallUI/src/com/android/incallui/ContactInfoCache.java
@@ -174,7 +174,22 @@
             entry.photo = null;
         }
 
-        sendNotification(callId, entry);
+        final List<ContactInfoCacheCallback> callBacks;
+        synchronized (mCallBackLock) {
+            callBacks = mCallBacksGuarded.get(callId);
+            // Do not clear mInfoMap here because we still need the data.
+            mCallBacksGuarded.clear();
+        }
+        if (callBacks != null) {
+            for (ContactInfoCacheCallback callBack : callBacks) {
+                if (entry.photo == null) {
+                    callBack.onImageLoadComplete(callId, null);
+                } else {
+                    callBack.onImageLoadComplete(callId, ((BitmapDrawable) entry.photo)
+                            .getBitmap());
+                }
+            }
+        }
     }
 
     /**
@@ -342,12 +357,7 @@
      * Sends the updated information to call the callbacks for the entry.
      */
     private void sendNotification(int callId, ContactCacheEntry entry) {
-        final List<ContactInfoCacheCallback> callBacks;
-        synchronized (mCallBackLock) {
-            callBacks = mCallBacksGuarded.get(callId);
-            // Do not clear mInfoMap here because we still need the data.
-            mCallBacksGuarded.clear();
-        }
+        final List<ContactInfoCacheCallback> callBacks = mCallBacksGuarded.get(callId);;
         if (callBacks != null) {
             for (ContactInfoCacheCallback callBack : callBacks) {
                 callBack.onContactInfoComplete(callId, entry);
@@ -373,6 +383,7 @@
      */
     public interface ContactInfoCacheCallback {
         public void onContactInfoComplete(int callId, ContactCacheEntry entry);
+        public void onImageLoadComplete(int callId, Bitmap photo);
     }
 
     public static class ContactCacheEntry {
diff --git a/InCallUI/src/com/android/incallui/StatusBarNotifier.java b/InCallUI/src/com/android/incallui/StatusBarNotifier.java
index 658eac9..ecdf532 100644
--- a/InCallUI/src/com/android/incallui/StatusBarNotifier.java
+++ b/InCallUI/src/com/android/incallui/StatusBarNotifier.java
@@ -26,6 +26,7 @@
 import android.content.Intent;
 import android.graphics.Bitmap;
 import android.graphics.drawable.BitmapDrawable;
+import android.graphics.drawable.Drawable;
 import android.text.TextUtils;
 
 import com.android.incallui.ContactInfoCache.ContactCacheEntry;
@@ -93,10 +94,19 @@
         // it has available, and may make a subsequent call later (same thread) if it had to
         // call into the contacts provider for more data.
         mContactInfoCache.findInfo(call.getIdentification(), true, new ContactInfoCacheCallback() {
+            private ContactCacheEntry mEntry;
+
             @Override
             public void onContactInfoComplete(int callId, ContactCacheEntry entry) {
+                mEntry = entry;
                 buildAndSendNotification(InCallState.INCOMING, call, entry, false);
             }
+
+            @Override
+            public void onImageLoadComplete(int callId, Bitmap photo) {
+                mEntry.photo = new BitmapDrawable(mContext.getResources(), photo);
+                buildAndSendNotification(InCallState.INCOMING, call, mEntry, false);
+            }
         });
     }