Use new ContactPhotoManager APIs for default avatars in Contacts

*Update the following uses of ContactPhotoManager.loadPhoto
and ContactPhotoManager.loadThumbnail
GroupEditorFragment
EmailAddressListAdapter
PostalAddressListAdapter

*Replace the following uses of R.drawable.ic_contact_picture_holo_light and
ContactPhotoManager.getDefaultAvatarResId with
ContactPhotoManager.getDefaultAvatarDrawableForContact
PhotoEditorView
AggregationSuggestionView
SuggestedMemberListAdapter
ConfirmAddDetailActivity
ImageViewDrawableSetter

*Protect against a null drawable in TransformableImageView()

*Add lookup fields to cursor projections in EmailAddressListAdapter
and PostalAddressListAdapter to correct construct a DefaultImageRequest
and assign LetterTileDrawables for contact photos

Bug: 13101785
Change-Id: I9c04ce81192913bf3c398a9a7a9368861bd93b59
(cherry picked from commit f677450d82e7b961fda2a18fea2ad51e88437e8b)
diff --git a/res/layout/confirm_add_detail_activity.xml b/res/layout/confirm_add_detail_activity.xml
index 8826b62..e26c917 100644
--- a/res/layout/confirm_add_detail_activity.xml
+++ b/res/layout/confirm_add_detail_activity.xml
@@ -33,8 +33,7 @@
             android:id="@+id/photo"
             android:layout_width="match_parent"
             android:layout_height="match_parent"
-            android:scaleType="centerCrop"
-            android:src="@drawable/ic_contact_picture_180_holo_light" />
+            android:scaleType="centerCrop"/>
 
         <View
             android:id="@+id/photo_text_bar"
diff --git a/res/layout/item_photo_editor.xml b/res/layout/item_photo_editor.xml
index 0a7f557..48af96c 100644
--- a/res/layout/item_photo_editor.xml
+++ b/res/layout/item_photo_editor.xml
@@ -29,7 +29,6 @@
             android:id="@+id/photo"
             android:layout_width="match_parent"
             android:layout_height="match_parent"
-            android:src="@drawable/ic_contact_picture_holo_light"
             android:cropToPadding="true"
             android:scaleType="centerCrop"
             android:gravity="start"
diff --git a/src/com/android/contacts/activities/ConfirmAddDetailActivity.java b/src/com/android/contacts/activities/ConfirmAddDetailActivity.java
index 3f9116f..e613ec1 100644
--- a/src/com/android/contacts/activities/ConfirmAddDetailActivity.java
+++ b/src/com/android/contacts/activities/ConfirmAddDetailActivity.java
@@ -62,6 +62,8 @@
 import com.android.contacts.editor.Editor;
 import com.android.contacts.editor.EditorUiUtils;
 import com.android.contacts.editor.ViewIdGenerator;
+import com.android.contacts.common.ContactPhotoManager;
+import com.android.contacts.common.ContactPhotoManager.DefaultImageRequest;
 import com.android.contacts.common.model.AccountTypeManager;
 import com.android.contacts.common.model.RawContact;
 import com.android.contacts.common.model.RawContactDelta;
@@ -121,6 +123,7 @@
     private Uri mContactUri;
     private long mContactId;
     private String mDisplayName;
+    private String mLookupKey;
     private boolean mIsReadOnly;
 
     private QueryHandler mQueryHandler;
@@ -268,6 +271,9 @@
         // Retrieve references to all the Views in the dialog activity.
         mDisplayNameView = (TextView) findViewById(R.id.name);
         mPhotoView = (ImageView) findViewById(R.id.photo);
+        mPhotoView.setImageDrawable(ContactPhotoManager.getDefaultAvatarDrawableForContact(
+                getResources(), false, null));
+
         mEditorContainerView = (ViewGroup) findViewById(R.id.editor_container);
 
         resetAsyncQueryHandler();
@@ -479,6 +485,8 @@
                         if (cursor != null && cursor.moveToFirst()) {
                             // Get the cursor values
                             mDisplayName = cursor.getString(ContactQuery.DISPLAY_NAME);
+                            mLookupKey = cursor.getString(ContactQuery.LOOKUP_KEY);
+                            setDefaultContactImage(mDisplayName, mLookupKey);
                             final long photoId = cursor.getLong(ContactQuery.PHOTO_ID);
 
                             // If there is no photo ID, then do a disambiguation
@@ -489,8 +497,7 @@
                                 startDisambiguationQuery(mDisplayName);
                             } else {
                                 // Otherwise do the photo query.
-                                Uri lookupUri = Contacts.getLookupUri(mContactId,
-                                        cursor.getString(ContactQuery.LOOKUP_KEY));
+                                Uri lookupUri = Contacts.getLookupUri(mContactId, mLookupKey);
                                 startPhotoQuery(photoId, lookupUri);
                                 // Display the name because there is no
                                 // disambiguation query.
@@ -737,6 +744,11 @@
         extraTextView.setText(value);
     }
 
+    private void setDefaultContactImage(String displayName, String lookupKey) {
+        mPhotoView.setImageDrawable(ContactPhotoManager.getDefaultAvatarDrawableForContact(
+                getResources(), false, new DefaultImageRequest(displayName, lookupKey)));
+    }
+
     /**
      * Shows all the contents of the dialog to the user at one time. This should only be called
      * once all the queries have completed, otherwise the screen will flash as additional data
diff --git a/src/com/android/contacts/activities/PhotoSelectionActivity.java b/src/com/android/contacts/activities/PhotoSelectionActivity.java
index 20892d6..c3b2eeb 100644
--- a/src/com/android/contacts/activities/PhotoSelectionActivity.java
+++ b/src/com/android/contacts/activities/PhotoSelectionActivity.java
@@ -28,7 +28,6 @@
 import android.net.Uri;
 import android.os.Bundle;
 import android.os.Parcelable;
-import android.support.v4.content.FileProvider;
 import android.view.View;
 import android.view.ViewGroup.MarginLayoutParams;
 import android.widget.FrameLayout.LayoutParams;
@@ -40,13 +39,8 @@
 import com.android.contacts.detail.PhotoSelectionHandler;
 import com.android.contacts.editor.PhotoActionPopup;
 import com.android.contacts.common.model.RawContactDeltaList;
-import com.android.contacts.util.ContactPhotoUtils;
 import com.android.contacts.util.SchedulingUtils;
 
-import java.io.File;
-import java.io.FileNotFoundException;
-
-
 /**
  * Popup activity for choosing a contact photo within the Contacts app.
  */
@@ -184,6 +178,7 @@
 
         mBackdrop = findViewById(R.id.backdrop);
         mPhotoView = (ImageView) findViewById(R.id.photo);
+
         mSourceBounds = intent.getSourceBounds();
 
         // Fade in the background.
@@ -324,11 +319,11 @@
         if (mPhotoUri != null) {
             // If we have a URI, the bitmap should be cached directly.
             ContactPhotoManager.getInstance(this).loadPhoto(mPhotoView, mPhotoUri, photoWidth,
-                    false);
+                    false, null);
         } else {
-            // Fall back to avatar image.
-            mPhotoView.setImageResource(ContactPhotoManager.getDefaultAvatarResId(this, photoWidth,
-                    false));
+            // If we don't have a URI, just display an empty ImageView. The default image from the
+            // ContactDetailFragment will show up in the background instead.
+            mPhotoView.setImageDrawable(null);
         }
 
         mPhotoView.addOnLayoutChangeListener(new View.OnLayoutChangeListener() {
diff --git a/src/com/android/contacts/detail/ContactDetailDisplayUtils.java b/src/com/android/contacts/detail/ContactDetailDisplayUtils.java
index e1aa217..5adc57a 100644
--- a/src/com/android/contacts/detail/ContactDetailDisplayUtils.java
+++ b/src/com/android/contacts/detail/ContactDetailDisplayUtils.java
@@ -236,8 +236,7 @@
         setDataOrHideIfNone(snippet, statusView);
         if (photoUri != null) {
             ContactPhotoManager.getInstance(context).loadPhoto(
-                    statusPhotoView, Uri.parse(photoUri), -1, false,
-                    ContactPhotoManager.DEFAULT_BLANK);
+                    statusPhotoView, Uri.parse(photoUri), -1, false, null);
             statusPhotoView.setVisibility(View.VISIBLE);
         } else {
             statusPhotoView.setVisibility(View.GONE);
@@ -342,7 +341,7 @@
             pushLayerView.setEnabled(false);
         }
         contactPhotoManager.loadPhoto(imageView, Uri.parse(streamItemPhoto.getPhotoUri()), -1,
-                false, ContactPhotoManager.DEFAULT_BLANK);
+                false, null);
     }
 
     @VisibleForTesting
diff --git a/src/com/android/contacts/detail/ContactDetailPhotoSetter.java b/src/com/android/contacts/detail/ContactDetailPhotoSetter.java
index 112621a..437de45 100644
--- a/src/com/android/contacts/detail/ContactDetailPhotoSetter.java
+++ b/src/com/android/contacts/detail/ContactDetailPhotoSetter.java
@@ -38,8 +38,7 @@
 public class ContactDetailPhotoSetter extends ImageViewDrawableSetter {
     public OnClickListener setupContactPhotoForClick(Context context, Contact contactData,
             ImageView photoView, boolean expandPhotoOnClick) {
-        setTarget(photoView);
-        Bitmap bitmap = setCompressedImage(contactData.getPhotoBinaryData());
+        Bitmap bitmap = setupContactPhoto(contactData, photoView);
         return setupClickListener(context, contactData, bitmap, expandPhotoOnClick);
     }
 
diff --git a/src/com/android/contacts/detail/TransformableImageView.java b/src/com/android/contacts/detail/TransformableImageView.java
index 241df41..1eb35aa 100644
--- a/src/com/android/contacts/detail/TransformableImageView.java
+++ b/src/com/android/contacts/detail/TransformableImageView.java
@@ -40,6 +40,9 @@
 
     @Override
     protected void onDraw(Canvas canvas) {
+        if (getDrawable() == null) {
+            return;
+        }
         int saveCount = canvas.getSaveCount();
         canvas.save();
         canvas.translate(mPaddingLeft, mPaddingTop);
diff --git a/src/com/android/contacts/editor/AggregationSuggestionView.java b/src/com/android/contacts/editor/AggregationSuggestionView.java
index 439b1df..a3d04e4 100644
--- a/src/com/android/contacts/editor/AggregationSuggestionView.java
+++ b/src/com/android/contacts/editor/AggregationSuggestionView.java
@@ -28,8 +28,10 @@
 import com.android.contacts.R;
 import com.android.contacts.editor.AggregationSuggestionEngine.RawContact;
 import com.android.contacts.editor.AggregationSuggestionEngine.Suggestion;
+import com.android.contacts.common.ContactPhotoManager;
 import com.android.contacts.common.model.AccountTypeManager;
 import com.android.contacts.common.model.account.AccountType;
+
 import com.google.common.collect.Lists;
 
 import java.util.ArrayList;
@@ -86,7 +88,8 @@
             photo.setImageBitmap(BitmapFactory.decodeByteArray(
                     suggestion.photo, 0, suggestion.photo.length));
         } else {
-            photo.setImageResource(R.drawable.ic_contact_picture_holo_light);
+            photo.setImageDrawable(ContactPhotoManager.getDefaultAvatarDrawableForContact(
+                    getResources(), false, null));
         }
 
         TextView name = (TextView) findViewById(R.id.aggregation_suggestion_name);
diff --git a/src/com/android/contacts/editor/PhotoEditorView.java b/src/com/android/contacts/editor/PhotoEditorView.java
index bee61f4..a74e159 100644
--- a/src/com/android/contacts/editor/PhotoEditorView.java
+++ b/src/com/android/contacts/editor/PhotoEditorView.java
@@ -27,6 +27,7 @@
 
 import com.android.contacts.R;
 import com.android.contacts.common.model.RawContactDelta;
+import com.android.contacts.common.ContactPhotoManager;
 import com.android.contacts.common.ContactsUtils;
 import com.android.contacts.common.model.ValuesDelta;
 import com.android.contacts.common.model.dataitem.DataKind;
@@ -166,7 +167,8 @@
 
     protected void resetDefault() {
         // Invalid photo, show default "add photo" place-holder
-        mPhotoImageView.setImageResource(R.drawable.ic_contact_picture_holo_light);
+        mPhotoImageView.setImageDrawable(
+                ContactPhotoManager.getDefaultAvatarDrawableForContact(getResources(), false, null));
         mFrameView.setEnabled(!mReadOnly && isEnabled());
         mHasSetPhoto = false;
         mEntry.setFromTemplate(true);
diff --git a/src/com/android/contacts/group/GroupEditorFragment.java b/src/com/android/contacts/group/GroupEditorFragment.java
index acc99f4..91800f8 100644
--- a/src/com/android/contacts/group/GroupEditorFragment.java
+++ b/src/com/android/contacts/group/GroupEditorFragment.java
@@ -64,6 +64,7 @@
 import com.android.contacts.R;
 import com.android.contacts.activities.GroupEditorActivity;
 import com.android.contacts.common.ContactPhotoManager;
+import com.android.contacts.common.ContactPhotoManager.DefaultImageRequest;
 import com.android.contacts.common.model.account.AccountType;
 import com.android.contacts.common.model.account.AccountWithDataSet;
 import com.android.contacts.common.editor.SelectAccountDialogFragment;
@@ -71,6 +72,7 @@
 import com.android.contacts.common.model.AccountTypeManager;
 import com.android.contacts.common.util.AccountsListAdapter.AccountListFilter;
 import com.android.contacts.common.util.ViewUtil;
+
 import com.google.common.base.Objects;
 
 import java.util.ArrayList;
@@ -849,11 +851,13 @@
         private final Uri mLookupUri;
         private final String mDisplayName;
         private final Uri mPhotoUri;
+        private final String mLookupKey;
 
         public Member(long rawContactId, String lookupKey, long contactId, String displayName,
                 String photoUri) {
             mRawContactId = rawContactId;
             mContactId = contactId;
+            mLookupKey = lookupKey;
             mLookupUri = Contacts.getLookupUri(contactId, lookupKey);
             mDisplayName = displayName;
             mPhotoUri = (photoUri != null) ? Uri.parse(photoUri) : null;
@@ -871,6 +875,10 @@
             return mLookupUri;
         }
 
+        public String getLookupKey() {
+            return mLookupKey;
+        }
+
         public String getDisplayName() {
             return mDisplayName;
         }
@@ -904,6 +912,7 @@
             dest.writeLong(mRawContactId);
             dest.writeLong(mContactId);
             dest.writeParcelable(mLookupUri, flags);
+            dest.writeString(mLookupKey);
             dest.writeString(mDisplayName);
             dest.writeParcelable(mPhotoUri, flags);
         }
@@ -912,6 +921,7 @@
             mRawContactId = in.readLong();
             mContactId = in.readLong();
             mLookupUri = in.readParcelable(getClass().getClassLoader());
+            mLookupKey = in.readString();
             mDisplayName = in.readString();
             mPhotoUri = in.readParcelable(getClass().getClassLoader());
         }
@@ -963,9 +973,10 @@
                     }
                 });
             }
-
+            DefaultImageRequest request = new DefaultImageRequest(member.getDisplayName(),
+                    member.getLookupKey());
             mPhotoManager.loadPhoto(badge, member.getPhotoUri(),
-                    ViewUtil.getConstantPreLayoutWidth(badge), false);
+                    ViewUtil.getConstantPreLayoutWidth(badge), false, request);
             return result;
         }
 
diff --git a/src/com/android/contacts/group/SuggestedMemberListAdapter.java b/src/com/android/contacts/group/SuggestedMemberListAdapter.java
index 6d60a3e..19ff611 100644
--- a/src/com/android/contacts/group/SuggestedMemberListAdapter.java
+++ b/src/com/android/contacts/group/SuggestedMemberListAdapter.java
@@ -37,6 +37,7 @@
 import android.widget.TextView;
 
 import com.android.contacts.R;
+import com.android.contacts.common.ContactPhotoManager;
 import com.android.contacts.group.SuggestedMemberListAdapter.SuggestedMember;
 
 import java.util.ArrayList;
@@ -143,7 +144,8 @@
         }
         byte[] byteArray = member.getPhotoByteArray();
         if (byteArray == null) {
-            icon.setImageResource(R.drawable.ic_contact_picture_holo_light);
+            icon.setImageDrawable(ContactPhotoManager.getDefaultAvatarDrawableForContact(
+                    icon.getResources(), false, null));
         } else {
             Bitmap bitmap = BitmapFactory.decodeByteArray(byteArray, 0, byteArray.length);
             icon.setImageBitmap(bitmap);
diff --git a/src/com/android/contacts/list/EmailAddressListAdapter.java b/src/com/android/contacts/list/EmailAddressListAdapter.java
index 4a32ae3..960f29a 100644
--- a/src/com/android/contacts/list/EmailAddressListAdapter.java
+++ b/src/com/android/contacts/list/EmailAddressListAdapter.java
@@ -29,6 +29,7 @@
 import android.view.View;
 import android.view.ViewGroup;
 
+import com.android.contacts.common.ContactPhotoManager.DefaultImageRequest;
 import com.android.contacts.common.list.ContactEntryListAdapter;
 import com.android.contacts.common.list.ContactListItemView;
 
@@ -44,7 +45,8 @@
             Email.LABEL,                     // 2
             Email.DATA,                      // 3
             Email.PHOTO_ID,                  // 4
-            Email.DISPLAY_NAME_PRIMARY,      // 5
+            Email.LOOKUP_KEY,                // 5
+            Email.DISPLAY_NAME_PRIMARY,      // 6
         };
 
         private static final String[] PROJECTION_ALTERNATIVE = new String[] {
@@ -53,7 +55,8 @@
             Email.LABEL,                     // 2
             Email.DATA,                      // 3
             Email.PHOTO_ID,                  // 4
-            Email.DISPLAY_NAME_ALTERNATIVE,  // 5
+            Email.LOOKUP_KEY,                // 5
+            Email.DISPLAY_NAME_ALTERNATIVE,  // 6
         };
 
         public static final int EMAIL_ID           = 0;
@@ -61,7 +64,8 @@
         public static final int EMAIL_LABEL        = 2;
         public static final int EMAIL_ADDRESS      = 3;
         public static final int EMAIL_PHOTO_ID     = 4;
-        public static final int EMAIL_DISPLAY_NAME = 5;
+        public static final int EMAIL_LOOKUP_KEY   = 5;
+        public static final int EMAIL_DISPLAY_NAME = 6;
     }
 
     private final CharSequence mUnknownNameText;
@@ -175,8 +179,12 @@
         if (!cursor.isNull(EmailQuery.EMAIL_PHOTO_ID)) {
             photoId = cursor.getLong(EmailQuery.EMAIL_PHOTO_ID);
         }
-
-        getPhotoLoader().loadThumbnail(view.getPhotoView(), photoId, false);
+        DefaultImageRequest request = null;
+        if (photoId == 0) {
+             request = getDefaultImageRequestFromCursor(cursor, EmailQuery.EMAIL_DISPLAY_NAME,
+                    EmailQuery.EMAIL_LOOKUP_KEY);
+        }
+        getPhotoLoader().loadThumbnail(view.getPhotoView(), photoId, false, request);
     }
 //
 //    protected void bindSearchSnippet(final ContactListItemView view, Cursor cursor) {
diff --git a/src/com/android/contacts/list/PostalAddressListAdapter.java b/src/com/android/contacts/list/PostalAddressListAdapter.java
index a800c00..42c73bc 100644
--- a/src/com/android/contacts/list/PostalAddressListAdapter.java
+++ b/src/com/android/contacts/list/PostalAddressListAdapter.java
@@ -28,6 +28,7 @@
 import android.view.View;
 import android.view.ViewGroup;
 
+import com.android.contacts.common.ContactPhotoManager.DefaultImageRequest;
 import com.android.contacts.common.list.ContactEntryListAdapter;
 import com.android.contacts.common.list.ContactListItemView;
 
@@ -43,7 +44,8 @@
             StructuredPostal.LABEL,                     // 2
             StructuredPostal.DATA,                      // 3
             StructuredPostal.PHOTO_ID,                  // 4
-            StructuredPostal.DISPLAY_NAME_PRIMARY,      // 5
+            StructuredPostal.LOOKUP_KEY,                // 5
+            StructuredPostal.DISPLAY_NAME_PRIMARY,      // 6
         };
 
         private static final String[] PROJECTION_ALTERNATIVE = new String[] {
@@ -52,7 +54,8 @@
             StructuredPostal.LABEL,                     // 2
             StructuredPostal.DATA,                      // 3
             StructuredPostal.PHOTO_ID,                  // 4
-            StructuredPostal.DISPLAY_NAME_ALTERNATIVE,  // 5
+            StructuredPostal.LOOKUP_KEY,                // 5
+            StructuredPostal.DISPLAY_NAME_ALTERNATIVE,  // 6
         };
 
         public static final int POSTAL_ID           = 0;
@@ -60,7 +63,8 @@
         public static final int POSTAL_LABEL        = 2;
         public static final int POSTAL_ADDRESS      = 3;
         public static final int POSTAL_PHOTO_ID     = 4;
-        public static final int POSTAL_DISPLAY_NAME = 5;
+        public static final int POSTAL_LOOKUP_KEY   = 5;
+        public static final int POSTAL_DISPLAY_NAME = 6;
     }
 
     private final CharSequence mUnknownNameText;
@@ -166,7 +170,13 @@
             photoId = cursor.getLong(PostalQuery.POSTAL_PHOTO_ID);
         }
 
-        getPhotoLoader().loadThumbnail(view.getPhotoView(), photoId, false);
+        DefaultImageRequest request = null;
+        if (photoId == 0) {
+            request = getDefaultImageRequestFromCursor(cursor, PostalQuery.POSTAL_DISPLAY_NAME,
+                    PostalQuery.POSTAL_LOOKUP_KEY);
+        }
+
+        getPhotoLoader().loadThumbnail(view.getPhotoView(), photoId, false, request);
     }
 //
 //    protected void bindSearchSnippet(final ContactListItemView view, Cursor cursor) {
diff --git a/src/com/android/contacts/util/ContactBadgeUtil.java b/src/com/android/contacts/util/ContactBadgeUtil.java
index 82a6820..fe792d7 100644
--- a/src/com/android/contacts/util/ContactBadgeUtil.java
+++ b/src/com/android/contacts/util/ContactBadgeUtil.java
@@ -110,6 +110,6 @@
 
     public static Bitmap loadDefaultAvatarPhoto(Context context, boolean hires, boolean darkTheme) {
         return BitmapFactory.decodeResource(context.getResources(),
-                ContactPhotoManager.getDefaultAvatarResId(hires, darkTheme));
+                R.drawable.ic_contacts_holo_dark);
     }
 }
diff --git a/src/com/android/contacts/util/ImageViewDrawableSetter.java b/src/com/android/contacts/util/ImageViewDrawableSetter.java
index a189f58..4dfa66c 100644
--- a/src/com/android/contacts/util/ImageViewDrawableSetter.java
+++ b/src/com/android/contacts/util/ImageViewDrawableSetter.java
@@ -23,10 +23,14 @@
 import android.graphics.drawable.BitmapDrawable;
 import android.graphics.drawable.Drawable;
 import android.graphics.drawable.TransitionDrawable;
+import android.provider.ContactsContract.DisplayNameSources;
+import android.text.TextUtils;
 import android.util.Log;
 import android.widget.ImageView;
 
 import com.android.contacts.common.ContactPhotoManager;
+import com.android.contacts.common.ContactPhotoManager.DefaultImageRequest;
+import com.android.contacts.common.lettertiles.LetterTileDrawable;
 import com.android.contacts.common.model.Contact;
 
 import java.util.Arrays;
@@ -40,6 +44,7 @@
     private byte[] mCompressed;
     private Drawable mPreviousDrawable;
     private int mDurationInMillis = 0;
+    private Contact mContact;
     private static final String TAG = "ImageViewDrawableSetter";
 
     public ImageViewDrawableSetter() {
@@ -49,9 +54,10 @@
         mTarget = target;
     }
 
-    public void setupContactPhoto(Contact contactData, ImageView photoView) {
+    public Bitmap setupContactPhoto(Contact contactData, ImageView photoView) {
+        mContact = contactData;
         setTarget(photoView);
-        setCompressedImage(contactData.getPhotoBinaryData());
+        return setCompressedImage(contactData.getPhotoBinaryData());
     }
 
     public void setTransitionDuration(int durationInMillis) {
@@ -122,23 +128,33 @@
     }
 
     private Bitmap previousBitmap() {
-        return (mPreviousDrawable == null)
-                ? null
+        return (mPreviousDrawable == null) ? null
+                : mPreviousDrawable instanceof LetterTileDrawable ? null
                 : ((BitmapDrawable) mPreviousDrawable).getBitmap();
     }
 
     /**
-     * Obtain the default drawable for a contact when no photo is available.
+     * Obtain the default drawable for a contact when no photo is available. If this is a local
+     * contact, then use the contact's display name and lookup key (as a unique identifier) to
+     * retrieve a default drawable for this contact. If not, then use the name as the contact
+     * identifier instead.
      */
     private Drawable defaultDrawable() {
         Resources resources = mTarget.getResources();
-        final int resId = ContactPhotoManager.getDefaultAvatarResId(true, false);
-        try {
-            return resources.getDrawable(resId);
-        } catch (NotFoundException e) {
-            Log.wtf(TAG, "Cannot load default avatar resource.");
-            return null;
+        DefaultImageRequest request;
+        int contactType = ContactPhotoManager.TYPE_DEFAULT;
+
+        if (mContact.isDisplayNameFromOrganization()) {
+            contactType = ContactPhotoManager.TYPE_BUSINESS;
         }
+
+        if (TextUtils.isEmpty(mContact.getLookupKey())) {
+            request = new DefaultImageRequest(null, mContact.getDisplayName(), contactType);
+        } else {
+            request = new DefaultImageRequest(mContact.getDisplayName(), mContact.getLookupKey(),
+                    contactType);
+        }
+        return ContactPhotoManager.getDefaultAvatarDrawableForContact(resources, true, request);
     }
 
     private BitmapDrawable decodedBitmapDrawable(byte[] compressed) {
@@ -146,5 +162,4 @@
         Bitmap bitmap = BitmapFactory.decodeByteArray(compressed, 0, compressed.length);
         return new BitmapDrawable(rsrc, bitmap);
     }
-
 }