Use icon with colored background for sender image.

Fixes b/8794452. Instead of defaulting to boring grey man,
we now use the same colored background when
we don't have a sender image and draw a generic
white icon on top of the color.

Also, deleted LetterTileUtils since we no longer
use it.

Change-Id: I3b905afdffbc70eeeca4f030dc57f5ab3748ee64
diff --git a/res/drawable-hdpi/ic_generic_man.png b/res/drawable-hdpi/ic_generic_man.png
new file mode 100644
index 0000000..b6b3129
--- /dev/null
+++ b/res/drawable-hdpi/ic_generic_man.png
Binary files differ
diff --git a/res/drawable-mdpi/ic_generic_man.png b/res/drawable-mdpi/ic_generic_man.png
new file mode 100644
index 0000000..f763dd2
--- /dev/null
+++ b/res/drawable-mdpi/ic_generic_man.png
Binary files differ
diff --git a/res/drawable-xhdpi/ic_generic_man.png b/res/drawable-xhdpi/ic_generic_man.png
new file mode 100644
index 0000000..212293d
--- /dev/null
+++ b/res/drawable-xhdpi/ic_generic_man.png
Binary files differ
diff --git a/src/com/android/mail/browse/LetterTileUtils.java b/src/com/android/mail/browse/LetterTileUtils.java
deleted file mode 100644
index ae2f6e7..0000000
--- a/src/com/android/mail/browse/LetterTileUtils.java
+++ /dev/null
@@ -1,128 +0,0 @@
-/*
- * Copyright (C) 2013 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.mail.browse;
-
-import android.content.Context;
-import android.content.res.Resources;
-import android.content.res.TypedArray;
-import android.graphics.Bitmap;
-import android.graphics.BitmapFactory;
-import android.graphics.Canvas;
-import android.graphics.Rect;
-import android.graphics.Typeface;
-import android.graphics.Paint.Align;
-import android.text.TextPaint;
-import android.text.TextUtils;
-
-import com.android.mail.R;
-import java.util.Locale;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-/**
- * LetterTileUtils is a static-use class for getting a bitmap corresponding
- * to a given account. Spits out a colored tile with a single letter, which
- * is the default for when a contact photo is missing (or if the language is
- * one without English letters, uses the default grey character image).
- */
-public class LetterTileUtils {
-    private static Typeface sSansSerifLight;
-    private static Rect sBounds;
-    private static int sTileLetterFontSize = -1;
-    private static int sTileLetterFontSizeSmall;
-    private static int sTileFontColor;
-    private static final TextPaint sPaint = new TextPaint();
-    private static final int DEFAULT_AVATAR_DRAWABLE = R.drawable.ic_contact_picture;
-    private static final Pattern ALPHABET = Pattern.compile("[A-Z0-9]");
-
-    // This should match the total number of colors defined in colors.xml for letter_tile_color
-    private static final int NUM_OF_TILE_COLORS = 7;
-
-    /**
-     * Creates a letter tile to act as an account/contact photo based on the account address/name
-     * in the given width & height.
-     *
-     * @param displayName account's custom name
-     * @param address account email address
-     * @param context current context of the app
-     * @param width width of final bitmap in px (input converted number)
-     * @param height height of final bitmap in px (input converted number)
-     * @return Bitmap with a colored background and a letter tile corresponding to the account
-     */
-    public static Bitmap generateLetterTile(
-            String displayName, String address, Context context, int width, int height) {
-        Bitmap bitmap = null;
-        final String display = !TextUtils.isEmpty(displayName) ? displayName : address;
-        final String firstChar = display.substring(0, 1).toUpperCase(Locale.US);
-
-        // If its a valid English alphabet letter...
-        if (isLetter(firstChar)) {
-            // Generate letter tile bitmap based on the first letter in name
-            final Resources res = context.getResources();
-            if (sTileLetterFontSize == -1) {
-                sTileLetterFontSize = res.getDimensionPixelSize(R.dimen.tile_letter_font_size);
-                sTileLetterFontSizeSmall = res
-                        .getDimensionPixelSize(R.dimen.tile_letter_font_size_small);
-                sTileFontColor = res.getColor(R.color.letter_tile_font_color);
-                sSansSerifLight = Typeface.create("sans-serif-light", Typeface.NORMAL);
-                sBounds = new Rect();
-                sPaint.setTypeface(sSansSerifLight);
-                sPaint.setColor(sTileFontColor);
-                sPaint.setTextAlign(Align.CENTER);
-                sPaint.setAntiAlias(true);
-            }
-            bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
-            final Canvas c = new Canvas(bitmap);
-            c.drawColor(pickColor(res, address));
-            sPaint.setTextSize(sTileLetterFontSize);
-            sPaint.getTextBounds(firstChar, 0, firstChar.length(), sBounds);
-            c.drawText(firstChar, 0 + width / 2, 0 + height / 2 + (sBounds.bottom - sBounds.top)
-                    / 2, sPaint);
-        } else {
-            // Use default image
-            final BitmapFactory.Options options = new BitmapFactory.Options();
-            bitmap = BitmapFactory.decodeResource(context.getResources(),
-                    DEFAULT_AVATAR_DRAWABLE, options);
-        }
-        return bitmap;
-    }
-
-    /**
-     * Check against the English alphabet regex if the letter is usable for the bitmap.
-     *
-     * @param letter Letter to test against
-     * @return true if usable in Letter Tile, false otherwise
-     */
-    private static boolean isLetter(final String letter) {
-        final Matcher m = ALPHABET.matcher(letter);
-        return m.matches();
-    }
-
-    /**
-     * Choose a color based on the given resource and the email address's hashCode.
-     *
-     * @param emailAddress Address for which we are choosing a color
-     * @return Color for the tile represented as an int
-     */
-    private static int pickColor(Resources res, String emailAddress) {
-        // String.hashCode() implementation is not supposed to change across java versions, so
-        // this should guarantee the same email address always maps to the same color.
-        int color = Math.abs(emailAddress.hashCode()) % NUM_OF_TILE_COLORS;
-        TypedArray colors = res.obtainTypedArray(R.array.letter_tile_colors);
-        return colors.getColor(color, R.color.letter_tile_default_color);
-    }
-}
diff --git a/src/com/android/mail/photomanager/LetterTileProvider.java b/src/com/android/mail/photomanager/LetterTileProvider.java
index cf752c2..39d9a40 100644
--- a/src/com/android/mail/photomanager/LetterTileProvider.java
+++ b/src/com/android/mail/photomanager/LetterTileProvider.java
@@ -22,6 +22,7 @@
 import android.graphics.Bitmap;
 import android.graphics.BitmapFactory;
 import android.graphics.Canvas;
+import android.graphics.Matrix;
 import android.graphics.Paint.Align;
 import android.graphics.Rect;
 import android.graphics.Typeface;
@@ -82,7 +83,7 @@
         mPaint.setAntiAlias(true);
         mBitmapBackgroundCache = new Bitmap[POSSIBLE_BITMAP_SIZES];
 
-        mDefaultBitmap = BitmapFactory.decodeResource(res, R.drawable.ic_contact_picture);
+        mDefaultBitmap = BitmapFactory.decodeResource(res, R.drawable.ic_generic_man);
         mDefaultBitmapCache = new Bitmap[POSSIBLE_BITMAP_SIZES];
 
         mColors = res.obtainTypedArray(R.array.letter_tile_colors);
@@ -106,27 +107,33 @@
         final String display = !TextUtils.isEmpty(displayName) ? displayName : address;
         final char firstChar = display.charAt(0);
         dividedImageView.getDesiredDimensions(address, mDims);
-        // If its a valid English alphabet letter...
+
+        // get an empty bitmap
+        bitmap = getBitmap(mDims, false /* getDefault */);
+        if (bitmap == null) {
+            LogUtils.w(TAG, "LetterTileProvider width(%d) or height(%d) is 0" +
+                    " for name %s and address %s.",
+                    dividedImageView.getWidth(), dividedImageView.getHeight(), displayName,
+                    address);
+            return;
+        }
+
+        final Canvas c = mCanvas;
+        c.setBitmap(bitmap);
+        c.drawColor(pickColor(address));
+
+        // If its a valid English alphabet letter,
+        // draw the letter on top of the color
         if (isEnglishLetterOrDigit(firstChar)) {
             mFirstChar[0] = Character.toUpperCase(firstChar);
-            bitmap = getBitmap(mDims, false /* getDefault */);
-            if (bitmap == null) {
-                LogUtils.w(TAG, "LetterTileProvider width(%d) or height(%d) is 0" +
-                        " for name %s and address %s.",
-                        dividedImageView.getWidth(), dividedImageView.getHeight(), displayName,
-                        address);
-                return;
-            }
-            final Canvas c = mCanvas;
-            c.setBitmap(bitmap);
-            c.drawColor(pickColor(address));
             mPaint.setTextSize(getFontSize(mDims.scale));
             mPaint.getTextBounds(mFirstChar, 0, 1, mBounds);
             c.drawText(mFirstChar, 0, 1, 0 + mDims.width / 2,
                     0 + mDims.height / 2 + (mBounds.bottom - mBounds.top) / 2, mPaint);
-        } else {
-            bitmap = getBitmap(mDims, true /* getDefault */);
+        } else { // draw the generic icon on top
+            c.drawBitmap(getBitmap(mDims, true /* getDefault */), 0, 0, null);
         }
+
         dividedImageView.addDivisionImage(bitmap, address);
     }