Merge "Disable quick contact badge for unknown contacts."
diff --git a/res/layout/call_log_contact_photo.xml b/res/layout/call_log_contact_photo.xml
index 91b0743..6afb1ab 100644
--- a/res/layout/call_log_contact_photo.xml
+++ b/res/layout/call_log_contact_photo.xml
@@ -1,10 +1,21 @@
 <?xml version="1.0" encoding="utf-8"?>
 <merge xmlns:android="http://schemas.android.com/apk/res/android">
-    <QuickContactBadge
+    <FrameLayout
         android:id="@+id/contact_photo"
         android:layout_width="@dimen/call_log_list_contact_photo_size"
         android:layout_height="@dimen/call_log_list_contact_photo_size"
         android:layout_alignParentLeft="true"
         android:layout_centerInParent="true"
-    />
+    >
+        <QuickContactBadge
+            android:id="@+id/quick_contact_photo"
+            android:layout_width="@dimen/call_log_list_contact_photo_size"
+            android:layout_height="@dimen/call_log_list_contact_photo_size"
+        />
+        <ImageView
+            android:id="@+id/plain_contact_photo"
+            android:layout_width="@dimen/call_log_list_contact_photo_size"
+            android:layout_height="@dimen/call_log_list_contact_photo_size"
+        />
+    </FrameLayout>
 </merge>
diff --git a/src/com/android/contacts/calllog/CallLogFragment.java b/src/com/android/contacts/calllog/CallLogFragment.java
index 046988b..3f3fd8d 100644
--- a/src/com/android/contacts/calllog/CallLogFragment.java
+++ b/src/com/android/contacts/calllog/CallLogFragment.java
@@ -63,7 +63,6 @@
 import android.view.ViewGroup;
 import android.view.ViewTreeObserver;
 import android.widget.ListView;
-import android.widget.QuickContactBadge;
 import android.widget.TextView;
 
 import java.util.LinkedList;
@@ -176,7 +175,7 @@
     private TextView mStatusMessageAction;
 
     public static final class ContactInfo {
-        public long personId;
+        public long personId = -1;
         public String name;
         public int type;
         public String label;
@@ -657,6 +656,8 @@
             // Get the views to bind to.
             CallLogListItemViews views = CallLogListItemViews.fromView(view);
             views.callView.setOnClickListener(this);
+            // Do nothing when a plain photo is clicked. Without this, the list item will fire.
+            views.plainPhotoView.setOnClickListener(null);
             view.setTag(views);
         }
 
@@ -763,10 +764,7 @@
             // New items also use the highlighted version of the text.
             final boolean isHighlighted = isNew;
             mCallLogViewsHelper.setPhoneCallDetails(views, details, useIcons, isHighlighted);
-            if (views.photoView != null) {
-                bindQuickContact(views.photoView, thumbnailUri, personId, lookupKey);
-            }
-
+            setPhoto(views, thumbnailUri, personId, lookupKey);
 
             // Listen for the first draw
             if (mPreDrawListener == null) {
@@ -794,14 +792,20 @@
             return callTypes;
         }
 
-        private void bindQuickContact(QuickContactBadge view, Uri thumbnailUri, long contactId,
+        private void setPhoto(CallLogListItemViews views, Uri thumbnailUri, long contactId,
                 String lookupKey) {
-            view.assignContactUri(getContactUri(contactId, lookupKey));
-            mContactPhotoManager.loadPhoto(view, thumbnailUri);
-        }
-
-        private Uri getContactUri(long contactId, String lookupKey) {
-            return Contacts.getLookupUri(contactId, lookupKey);
+            if (contactId == -1) {
+                // This does not correspond to a contact, do not use the QuickContactBadge.
+                mContactPhotoManager.loadPhoto(views.plainPhotoView, thumbnailUri);
+                views.plainPhotoView.setVisibility(View.VISIBLE);
+                views.quickContactView.setVisibility(View.GONE);
+            } else {
+                views.quickContactView.assignContactUri(
+                        Contacts.getLookupUri(contactId, lookupKey));
+                mContactPhotoManager.loadPhoto(views.quickContactView, thumbnailUri);
+                views.quickContactView.setVisibility(View.VISIBLE);
+                views.plainPhotoView.setVisibility(View.GONE);
+            }
         }
 
         /**
diff --git a/src/com/android/contacts/calllog/CallLogListItemViews.java b/src/com/android/contacts/calllog/CallLogListItemViews.java
index 51bc535..90f78f7 100644
--- a/src/com/android/contacts/calllog/CallLogListItemViews.java
+++ b/src/com/android/contacts/calllog/CallLogListItemViews.java
@@ -21,6 +21,7 @@
 
 import android.content.Context;
 import android.view.View;
+import android.widget.ImageView;
 import android.widget.QuickContactBadge;
 import android.widget.TextView;
 
@@ -28,8 +29,10 @@
  * Simple value object containing the various views within a call log entry.
  */
 public final class CallLogListItemViews {
-    /** The quick contact badge for the contact. Only present for group and stand alone entries. */
-    public final QuickContactBadge photoView;
+    /** The quick contact badge for the contact. */
+    public final QuickContactBadge quickContactView;
+    /** The photo view without quick contact badge. */
+    public final ImageView plainPhotoView;
     /** The main action button on the entry. */
     public final View callView;
     /** The play action button used for voicemail. */
@@ -47,11 +50,12 @@
     /** The text of the header in a stand-alone row, or null for other types of rows. */
     public final TextView listHeaderTextView;
 
-    private CallLogListItemViews(QuickContactBadge photoView, View callView,
-            View playView, View unheardView, View dividerView,
+    private CallLogListItemViews(QuickContactBadge quickContactView, ImageView photoView,
+            View callView, View playView, View unheardView, View dividerView,
             PhoneCallDetailsViews phoneCallDetailsViews, View listItemView, View listHeaderView,
             TextView listHeaderTextView) {
-        this.photoView = photoView;
+        this.quickContactView = quickContactView;
+        this.plainPhotoView = photoView;
         this.callView = callView;
         this.playView = playView;
         this.unheardView = unheardView;
@@ -63,7 +67,9 @@
     }
 
     public static CallLogListItemViews fromView(View view) {
-        return new CallLogListItemViews((QuickContactBadge) view.findViewById(R.id.contact_photo),
+        return new CallLogListItemViews(
+                (QuickContactBadge) view.findViewById(R.id.quick_contact_photo),
+                (ImageView) view.findViewById(R.id.plain_contact_photo),
                 view.findViewById(R.id.call_icon),
                 view.findViewById(R.id.play_icon),
                 view.findViewById(R.id.unheard_icon),
@@ -77,6 +83,7 @@
     public static CallLogListItemViews createForTest(Context context) {
         return new CallLogListItemViews(
                 new QuickContactBadge(context),
+                new ImageView(context),
                 new View(context),
                 new View(context),
                 new View(context),
diff --git a/tests/src/com/android/contacts/activities/CallLogActivityTests.java b/tests/src/com/android/contacts/activities/CallLogActivityTests.java
index 8372d9c..b642ffe 100644
--- a/tests/src/com/android/contacts/activities/CallLogActivityTests.java
+++ b/tests/src/com/android/contacts/activities/CallLogActivityTests.java
@@ -266,6 +266,31 @@
         assertNumberAndLabelAre(views, TEST_FORMATTED_NUMBER, numberLabel);
     }
 
+    @MediumTest
+    public void testBindView_WithQuickContactBadge() {
+        mCursor.moveToFirst();
+        insertWithCachedValues(TEST_NUMBER, NOW, 0, Calls.INCOMING_TYPE,
+                "John Doe", Phone.TYPE_HOME, "");
+        View view = mAdapter.newStandAloneView(getActivity(), mParentView);
+        mAdapter.bindStandAloneView(view, getActivity(), mCursor);
+
+        CallLogListItemViews views = (CallLogListItemViews) view.getTag();
+        assertEquals(View.VISIBLE, views.quickContactView.getVisibility());
+        assertEquals(View.GONE, views.plainPhotoView.getVisibility());
+    }
+
+    @MediumTest
+    public void testBindView_WithoutQuickContactBadge() {
+        mCursor.moveToFirst();
+        insert(TEST_NUMBER, NOW, 0, Calls.INCOMING_TYPE);
+        View view = mAdapter.newStandAloneView(getActivity(), mParentView);
+        mAdapter.bindStandAloneView(view, getActivity(), mCursor);
+
+        CallLogListItemViews views = (CallLogListItemViews) view.getTag();
+        assertEquals(View.GONE, views.quickContactView.getVisibility());
+        assertEquals(View.VISIBLE, views.plainPhotoView.getVisibility());
+    }
+
     /** Returns the label associated with a given phone type. */
     private CharSequence getTypeLabel(int phoneType) {
         return Phone.getTypeLabel(getActivity().getResources(), phoneType, "");