Fix ShortcutIntentBuilder to use LetterTileDrawables
Use LetterTileDrawables, instead of Bitmap drawables when generating
shortcut icons for contacts without a contact photo.
To do this, the methods generatePhoneNumberIcon() and
generateQuickContactIcon have to be modified to draw a drawable on
the canvas instead of a bitmap.
Bug: 13279862
Change-Id: Ife7bbca27a7d1b942c8a8ea908dd9896c5fe063a
(cherry picked from commit 30dd6e7e1a9279b91e9ee0ad36c34545c5b6c45a)
diff --git a/src/com/android/contacts/common/list/ShortcutIntentBuilder.java b/src/com/android/contacts/common/list/ShortcutIntentBuilder.java
index 4ac0664..3189e9c 100644
--- a/src/com/android/contacts/common/list/ShortcutIntentBuilder.java
+++ b/src/com/android/contacts/common/list/ShortcutIntentBuilder.java
@@ -41,6 +41,8 @@
import android.text.TextUtils.TruncateAt;
import com.android.contacts.common.CallUtil;
+import com.android.contacts.common.ContactPhotoManager;
+import com.android.contacts.common.ContactPhotoManager.DefaultImageRequest;
import com.android.contacts.common.R;
/**
@@ -51,17 +53,20 @@
private static final String[] CONTACT_COLUMNS = {
Contacts.DISPLAY_NAME,
Contacts.PHOTO_ID,
+ Contacts.LOOKUP_KEY
};
private static final int CONTACT_DISPLAY_NAME_COLUMN_INDEX = 0;
private static final int CONTACT_PHOTO_ID_COLUMN_INDEX = 1;
+ private static final int CONTACT_LOOKUP_KEY_COLUMN_INDEX = 2;
private static final String[] PHONE_COLUMNS = {
Phone.DISPLAY_NAME,
Phone.PHOTO_ID,
Phone.NUMBER,
Phone.TYPE,
- Phone.LABEL
+ Phone.LABEL,
+ Phone.LOOKUP_KEY
};
private static final int PHONE_DISPLAY_NAME_COLUMN_INDEX = 0;
@@ -69,6 +74,7 @@
private static final int PHONE_NUMBER_COLUMN_INDEX = 2;
private static final int PHONE_TYPE_COLUMN_INDEX = 3;
private static final int PHONE_LABEL_COLUMN_INDEX = 4;
+ private static final int PHONE_LOOKUP_KEY_COLUMN_INDEX = 5;
private static final String[] PHOTO_COLUMNS = {
Photo.PHOTO,
@@ -139,6 +145,7 @@
protected Uri mUri;
protected String mContentType;
protected String mDisplayName;
+ protected String mLookupKey;
protected byte[] mBitmapData;
protected long mPhotoId;
@@ -190,6 +197,7 @@
if (cursor.moveToFirst()) {
mDisplayName = cursor.getString(CONTACT_DISPLAY_NAME_COLUMN_INDEX);
mPhotoId = cursor.getLong(CONTACT_PHOTO_ID_COLUMN_INDEX);
+ mLookupKey = cursor.getString(CONTACT_LOOKUP_KEY_COLUMN_INDEX);
}
} finally {
cursor.close();
@@ -198,7 +206,7 @@
}
@Override
protected void onPostExecute(Void result) {
- createContactShortcutIntent(mUri, mContentType, mDisplayName, mBitmapData);
+ createContactShortcutIntent(mUri, mContentType, mDisplayName, mLookupKey, mBitmapData);
}
}
@@ -225,6 +233,7 @@
mPhoneNumber = cursor.getString(PHONE_NUMBER_COLUMN_INDEX);
mPhoneType = cursor.getInt(PHONE_TYPE_COLUMN_INDEX);
mPhoneLabel = cursor.getString(PHONE_LABEL_COLUMN_INDEX);
+ mLookupKey = cursor.getString(PHONE_LOOKUP_KEY_COLUMN_INDEX);
}
} finally {
cursor.close();
@@ -234,25 +243,24 @@
@Override
protected void onPostExecute(Void result) {
- createPhoneNumberShortcutIntent(mUri, mDisplayName, mBitmapData, mPhoneNumber,
- mPhoneType, mPhoneLabel, mShortcutAction);
+ createPhoneNumberShortcutIntent(mUri, mDisplayName, mLookupKey, mBitmapData,
+ mPhoneNumber, mPhoneType, mPhoneLabel, mShortcutAction);
}
}
- private Bitmap getPhotoBitmap(byte[] bitmapData) {
- Bitmap bitmap;
+ private Drawable getPhotoDrawable(byte[] bitmapData, String displayName, String lookupKey) {
if (bitmapData != null) {
- bitmap = BitmapFactory.decodeByteArray(bitmapData, 0, bitmapData.length, null);
+ Bitmap bitmap = BitmapFactory.decodeByteArray(bitmapData, 0, bitmapData.length, null);
+ return new BitmapDrawable(mContext.getResources(), bitmap);
} else {
- bitmap = ((BitmapDrawable) mContext.getResources().getDrawableForDensity(
- R.drawable.ic_contact_picture_holo_light, mIconDensity)).getBitmap();
+ return ContactPhotoManager.getDefaultAvatarDrawableForContact(mContext.getResources(),
+ false, new DefaultImageRequest(displayName, lookupKey));
}
- return bitmap;
}
private void createContactShortcutIntent(Uri contactUri, String contentType, String displayName,
- byte[] bitmapData) {
- Bitmap bitmap = getPhotoBitmap(bitmapData);
+ String lookupKey, byte[] bitmapData) {
+ Drawable drawable = getPhotoDrawable(bitmapData, displayName, lookupKey);
Intent shortcutIntent = new Intent(ContactsContract.QuickContact.ACTION_QUICK_CONTACT);
@@ -271,7 +279,7 @@
shortcutIntent.putExtra(ContactsContract.QuickContact.EXTRA_EXCLUDE_MIMES,
(String[]) null);
- final Bitmap icon = generateQuickContactIcon(bitmap);
+ final Bitmap icon = generateQuickContactIcon(drawable);
Intent intent = new Intent();
intent.putExtra(Intent.EXTRA_SHORTCUT_ICON, icon);
@@ -286,19 +294,21 @@
mListener.onShortcutIntentCreated(contactUri, intent);
}
- private void createPhoneNumberShortcutIntent(Uri uri, String displayName, byte[] bitmapData,
- String phoneNumber, int phoneType, String phoneLabel, String shortcutAction) {
- Bitmap bitmap = getPhotoBitmap(bitmapData);
+ private void createPhoneNumberShortcutIntent(Uri uri, String displayName, String lookupKey,
+ byte[] bitmapData, String phoneNumber, int phoneType, String phoneLabel,
+ String shortcutAction) {
+ Drawable drawable = getPhotoDrawable(bitmapData, displayName, lookupKey);
+ Bitmap bitmap;
Uri phoneUri;
if (Intent.ACTION_CALL.equals(shortcutAction)) {
// Make the URI a direct tel: URI so that it will always continue to work
phoneUri = Uri.fromParts(CallUtil.SCHEME_TEL, phoneNumber, null);
- bitmap = generatePhoneNumberIcon(bitmap, phoneType, phoneLabel,
+ bitmap = generatePhoneNumberIcon(drawable, phoneType, phoneLabel,
R.drawable.badge_action_call);
} else {
phoneUri = Uri.fromParts(CallUtil.SCHEME_SMSTO, phoneNumber, null);
- bitmap = generatePhoneNumberIcon(bitmap, phoneType, phoneLabel,
+ bitmap = generatePhoneNumberIcon(drawable, phoneType, phoneLabel,
R.drawable.badge_action_sms);
}
@@ -324,7 +334,7 @@
canvas.drawRect(dst, workPaint);
}
- private Bitmap generateQuickContactIcon(Bitmap photo) {
+ private Bitmap generateQuickContactIcon(Drawable photo) {
// Setup the drawing classes
Bitmap icon = Bitmap.createBitmap(mIconSize, mIconSize, Bitmap.Config.ARGB_8888);
@@ -334,12 +344,13 @@
Paint photoPaint = new Paint();
photoPaint.setDither(true);
photoPaint.setFilterBitmap(true);
- Rect src = new Rect(0,0, photo.getWidth(),photo.getHeight());
Rect dst = new Rect(0,0, mIconSize, mIconSize);
- canvas.drawBitmap(photo, src, dst, photoPaint);
+ photo.setBounds(dst);
+ photo.draw(canvas);
drawBorder(canvas, dst);
+ // Now draw the overlay
Drawable overlay = mContext.getResources().getDrawableForDensity(
com.android.internal.R.drawable.quickcontact_badge_overlay_dark, mIconDensity);
@@ -354,7 +365,7 @@
* Generates a phone number shortcut icon. Adds an overlay describing the type of the phone
* number, and if there is a photo also adds the call action icon.
*/
- private Bitmap generatePhoneNumberIcon(Bitmap photo, int phoneType, String phoneLabel,
+ private Bitmap generatePhoneNumberIcon(Drawable photo, int phoneType, String phoneLabel,
int actionResId) {
final Resources r = mContext.getResources();
final float density = r.getDisplayMetrics().density;
@@ -370,9 +381,10 @@
Paint photoPaint = new Paint();
photoPaint.setDither(true);
photoPaint.setFilterBitmap(true);
- Rect src = new Rect(0, 0, photo.getWidth(), photo.getHeight());
Rect dst = new Rect(0, 0, mIconSize, mIconSize);
- canvas.drawBitmap(photo, src, dst, photoPaint);
+
+ photo.setBounds(dst);
+ photo.draw(canvas);
drawBorder(canvas, dst);
@@ -407,7 +419,7 @@
}
// Draw the phone action icon as an overlay
- src.set(0, 0, phoneIcon.getWidth(), phoneIcon.getHeight());
+ Rect src = new Rect(0, 0, phoneIcon.getWidth(), phoneIcon.getHeight());
int iconWidth = icon.getWidth();
dst.set(iconWidth - ((int) (20 * density)), -1,
iconWidth, ((int) (19 * density)));