19df5e19332197900e8af8c5349a614be9b6c032aYorke Lee/* 29df5e19332197900e8af8c5349a614be9b6c032aYorke Lee * Copyright (C) 2013 The Android Open Source Project 39df5e19332197900e8af8c5349a614be9b6c032aYorke Lee * 49df5e19332197900e8af8c5349a614be9b6c032aYorke Lee * Licensed under the Apache License, Version 2.0 (the "License"); 59df5e19332197900e8af8c5349a614be9b6c032aYorke Lee * you may not use this file except in compliance with the License. 69df5e19332197900e8af8c5349a614be9b6c032aYorke Lee * You may obtain a copy of the License at 79df5e19332197900e8af8c5349a614be9b6c032aYorke Lee * 89df5e19332197900e8af8c5349a614be9b6c032aYorke Lee * http://www.apache.org/licenses/LICENSE-2.0 99df5e19332197900e8af8c5349a614be9b6c032aYorke Lee * 109df5e19332197900e8af8c5349a614be9b6c032aYorke Lee * Unless required by applicable law or agreed to in writing, software 119df5e19332197900e8af8c5349a614be9b6c032aYorke Lee * distributed under the License is distributed on an "AS IS" BASIS, 129df5e19332197900e8af8c5349a614be9b6c032aYorke Lee * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139df5e19332197900e8af8c5349a614be9b6c032aYorke Lee * See the License for the specific language governing permissions and 149df5e19332197900e8af8c5349a614be9b6c032aYorke Lee * limitations under the License. 159df5e19332197900e8af8c5349a614be9b6c032aYorke Lee */ 169df5e19332197900e8af8c5349a614be9b6c032aYorke Lee 1769c182afb0e6d82a341a28b4317aa703af768906Gary Maipackage com.android.contacts.lettertiles; 189df5e19332197900e8af8c5349a614be9b6c032aYorke Lee 199df5e19332197900e8af8c5349a614be9b6c032aYorke Leeimport android.content.res.Resources; 209df5e19332197900e8af8c5349a614be9b6c032aYorke Leeimport android.content.res.TypedArray; 21f71ca7763607fb99594ca11e84818b3c902d5b61Brian Attwellimport android.graphics.Bitmap; 22f71ca7763607fb99594ca11e84818b3c902d5b61Brian Attwellimport android.graphics.BitmapFactory; 239df5e19332197900e8af8c5349a614be9b6c032aYorke Leeimport android.graphics.Canvas; 249df5e19332197900e8af8c5349a614be9b6c032aYorke Leeimport android.graphics.ColorFilter; 259df5e19332197900e8af8c5349a614be9b6c032aYorke Leeimport android.graphics.Paint; 269df5e19332197900e8af8c5349a614be9b6c032aYorke Leeimport android.graphics.Paint.Align; 279df5e19332197900e8af8c5349a614be9b6c032aYorke Leeimport android.graphics.Rect; 289df5e19332197900e8af8c5349a614be9b6c032aYorke Leeimport android.graphics.Typeface; 2902c3dee53a1be051bc7369d401585cfe87e7c5d7Gary Maiimport android.graphics.drawable.AdaptiveIconDrawable; 309df5e19332197900e8af8c5349a614be9b6c032aYorke Leeimport android.graphics.drawable.Drawable; 319df5e19332197900e8af8c5349a614be9b6c032aYorke Leeimport android.text.TextUtils; 329df5e19332197900e8af8c5349a614be9b6c032aYorke Lee 333f6a2444e0134b7380cdb2e13abf4bf1163336d0Arthur Wangimport com.android.contacts.R; 349df5e19332197900e8af8c5349a614be9b6c032aYorke Lee 3534ae3fcd89e75cc59dd5b268ee5cc470bf15a21bWalter Jangimport com.google.common.base.Preconditions; 369df5e19332197900e8af8c5349a614be9b6c032aYorke Lee 379df5e19332197900e8af8c5349a614be9b6c032aYorke Lee/** 389df5e19332197900e8af8c5349a614be9b6c032aYorke Lee * A drawable that encapsulates all the functionality needed to display a letter tile to 399df5e19332197900e8af8c5349a614be9b6c032aYorke Lee * represent a contact image. 409df5e19332197900e8af8c5349a614be9b6c032aYorke Lee */ 419df5e19332197900e8af8c5349a614be9b6c032aYorke Leepublic class LetterTileDrawable extends Drawable { 429df5e19332197900e8af8c5349a614be9b6c032aYorke Lee 439df5e19332197900e8af8c5349a614be9b6c032aYorke Lee private final String TAG = LetterTileDrawable.class.getSimpleName(); 449df5e19332197900e8af8c5349a614be9b6c032aYorke Lee 459df5e19332197900e8af8c5349a614be9b6c032aYorke Lee private final Paint mPaint; 469df5e19332197900e8af8c5349a614be9b6c032aYorke Lee 479df5e19332197900e8af8c5349a614be9b6c032aYorke Lee /** Letter tile */ 489df5e19332197900e8af8c5349a614be9b6c032aYorke Lee private static TypedArray sColors; 499df5e19332197900e8af8c5349a614be9b6c032aYorke Lee private static int sDefaultColor; 509df5e19332197900e8af8c5349a614be9b6c032aYorke Lee private static int sTileFontColor; 519df5e19332197900e8af8c5349a614be9b6c032aYorke Lee private static float sLetterToTileRatio; 52f71ca7763607fb99594ca11e84818b3c902d5b61Brian Attwell private static Bitmap DEFAULT_PERSON_AVATAR; 53f71ca7763607fb99594ca11e84818b3c902d5b61Brian Attwell private static Bitmap DEFAULT_BUSINESS_AVATAR; 54f71ca7763607fb99594ca11e84818b3c902d5b61Brian Attwell private static Bitmap DEFAULT_VOICEMAIL_AVATAR; 559df5e19332197900e8af8c5349a614be9b6c032aYorke Lee 569df5e19332197900e8af8c5349a614be9b6c032aYorke Lee /** Reusable components to avoid new allocations */ 579df5e19332197900e8af8c5349a614be9b6c032aYorke Lee private static final Paint sPaint = new Paint(); 589df5e19332197900e8af8c5349a614be9b6c032aYorke Lee private static final Rect sRect = new Rect(); 599df5e19332197900e8af8c5349a614be9b6c032aYorke Lee private static final char[] sFirstChar = new char[1]; 609df5e19332197900e8af8c5349a614be9b6c032aYorke Lee 619df5e19332197900e8af8c5349a614be9b6c032aYorke Lee /** Contact type constants */ 629df5e19332197900e8af8c5349a614be9b6c032aYorke Lee public static final int TYPE_PERSON = 1; 639df5e19332197900e8af8c5349a614be9b6c032aYorke Lee public static final int TYPE_BUSINESS = 2; 649df5e19332197900e8af8c5349a614be9b6c032aYorke Lee public static final int TYPE_VOICEMAIL = 3; 659df5e19332197900e8af8c5349a614be9b6c032aYorke Lee public static final int TYPE_DEFAULT = TYPE_PERSON; 669df5e19332197900e8af8c5349a614be9b6c032aYorke Lee 677c30f7ba026c4415286d8338453aa08319ba954fguanxiongliu /** 54% opacity */ 687c30f7ba026c4415286d8338453aa08319ba954fguanxiongliu private static final int ALPHA = 138; 697c30f7ba026c4415286d8338453aa08319ba954fguanxiongliu 709df5e19332197900e8af8c5349a614be9b6c032aYorke Lee private int mContactType = TYPE_DEFAULT; 719df5e19332197900e8af8c5349a614be9b6c032aYorke Lee private float mScale = 1.0f; 729df5e19332197900e8af8c5349a614be9b6c032aYorke Lee private float mOffset = 0.0f; 73c4a2a23bda2fdbbf9de43ffca7948bb7721a9e50Yorke Lee private boolean mIsCircle = false; 749df5e19332197900e8af8c5349a614be9b6c032aYorke Lee 7575bd9344d364b69281a55f524a793aa5db98480fTa-wei Yen private int mColor; 7675bd9344d364b69281a55f524a793aa5db98480fTa-wei Yen private Character mLetter = null; 779df5e19332197900e8af8c5349a614be9b6c032aYorke Lee 7875bd9344d364b69281a55f524a793aa5db98480fTa-wei Yen public LetterTileDrawable(final Resources res) { 799df5e19332197900e8af8c5349a614be9b6c032aYorke Lee if (sColors == null) { 809df5e19332197900e8af8c5349a614be9b6c032aYorke Lee sColors = res.obtainTypedArray(R.array.letter_tile_colors); 819df5e19332197900e8af8c5349a614be9b6c032aYorke Lee sDefaultColor = res.getColor(R.color.letter_tile_default_color); 829df5e19332197900e8af8c5349a614be9b6c032aYorke Lee sTileFontColor = res.getColor(R.color.letter_tile_font_color); 839df5e19332197900e8af8c5349a614be9b6c032aYorke Lee sLetterToTileRatio = res.getFraction(R.dimen.letter_to_tile_ratio, 1, 1); 84f71ca7763607fb99594ca11e84818b3c902d5b61Brian Attwell DEFAULT_PERSON_AVATAR = BitmapFactory.decodeResource(res, 857c30f7ba026c4415286d8338453aa08319ba954fguanxiongliu R.drawable.ic_person_avatar); 86f71ca7763607fb99594ca11e84818b3c902d5b61Brian Attwell DEFAULT_BUSINESS_AVATAR = BitmapFactory.decodeResource(res, 87a8fa55d88996d452d4ccc043092924a49279bfadBrian Attwell R.drawable.ic_business_white_120dp); 88f71ca7763607fb99594ca11e84818b3c902d5b61Brian Attwell DEFAULT_VOICEMAIL_AVATAR = BitmapFactory.decodeResource(res, 89f71ca7763607fb99594ca11e84818b3c902d5b61Brian Attwell R.drawable.ic_voicemail_avatar); 909df5e19332197900e8af8c5349a614be9b6c032aYorke Lee sPaint.setTypeface(Typeface.create( 919df5e19332197900e8af8c5349a614be9b6c032aYorke Lee res.getString(R.string.letter_tile_letter_font_family), Typeface.NORMAL)); 929df5e19332197900e8af8c5349a614be9b6c032aYorke Lee sPaint.setTextAlign(Align.CENTER); 939df5e19332197900e8af8c5349a614be9b6c032aYorke Lee sPaint.setAntiAlias(true); 949df5e19332197900e8af8c5349a614be9b6c032aYorke Lee } 9575bd9344d364b69281a55f524a793aa5db98480fTa-wei Yen mPaint = new Paint(); 9675bd9344d364b69281a55f524a793aa5db98480fTa-wei Yen mPaint.setFilterBitmap(true); 9775bd9344d364b69281a55f524a793aa5db98480fTa-wei Yen mPaint.setDither(true); 9875bd9344d364b69281a55f524a793aa5db98480fTa-wei Yen mColor = sDefaultColor; 999df5e19332197900e8af8c5349a614be9b6c032aYorke Lee } 1009df5e19332197900e8af8c5349a614be9b6c032aYorke Lee 1019df5e19332197900e8af8c5349a614be9b6c032aYorke Lee @Override 1029df5e19332197900e8af8c5349a614be9b6c032aYorke Lee public void draw(final Canvas canvas) { 1039df5e19332197900e8af8c5349a614be9b6c032aYorke Lee final Rect bounds = getBounds(); 1049df5e19332197900e8af8c5349a614be9b6c032aYorke Lee if (!isVisible() || bounds.isEmpty()) { 1059df5e19332197900e8af8c5349a614be9b6c032aYorke Lee return; 1069df5e19332197900e8af8c5349a614be9b6c032aYorke Lee } 1079df5e19332197900e8af8c5349a614be9b6c032aYorke Lee // Draw letter tile. 1089df5e19332197900e8af8c5349a614be9b6c032aYorke Lee drawLetterTile(canvas); 1099df5e19332197900e8af8c5349a614be9b6c032aYorke Lee } 1109df5e19332197900e8af8c5349a614be9b6c032aYorke Lee 1119df5e19332197900e8af8c5349a614be9b6c032aYorke Lee /** 112f71ca7763607fb99594ca11e84818b3c902d5b61Brian Attwell * Draw the bitmap onto the canvas at the current bounds taking into account the current scale. 1139df5e19332197900e8af8c5349a614be9b6c032aYorke Lee */ 114f71ca7763607fb99594ca11e84818b3c902d5b61Brian Attwell private void drawBitmap(final Bitmap bitmap, final int width, final int height, 115f71ca7763607fb99594ca11e84818b3c902d5b61Brian Attwell final Canvas canvas) { 116f71ca7763607fb99594ca11e84818b3c902d5b61Brian Attwell // The bitmap should be drawn in the middle of the canvas without changing its width to 1179df5e19332197900e8af8c5349a614be9b6c032aYorke Lee // height ratio. 1189df5e19332197900e8af8c5349a614be9b6c032aYorke Lee final Rect destRect = copyBounds(); 1199df5e19332197900e8af8c5349a614be9b6c032aYorke Lee 1209df5e19332197900e8af8c5349a614be9b6c032aYorke Lee // Crop the destination bounds into a square, scaled and offset as appropriate 1219df5e19332197900e8af8c5349a614be9b6c032aYorke Lee final int halfLength = (int) (mScale * Math.min(destRect.width(), destRect.height()) / 2); 1229df5e19332197900e8af8c5349a614be9b6c032aYorke Lee 1239df5e19332197900e8af8c5349a614be9b6c032aYorke Lee destRect.set(destRect.centerX() - halfLength, 1249df5e19332197900e8af8c5349a614be9b6c032aYorke Lee (int) (destRect.centerY() - halfLength + mOffset * destRect.height()), 1259df5e19332197900e8af8c5349a614be9b6c032aYorke Lee destRect.centerX() + halfLength, 1269df5e19332197900e8af8c5349a614be9b6c032aYorke Lee (int) (destRect.centerY() + halfLength + mOffset * destRect.height())); 1279df5e19332197900e8af8c5349a614be9b6c032aYorke Lee 128f71ca7763607fb99594ca11e84818b3c902d5b61Brian Attwell // Source rectangle remains the entire bounds of the source bitmap. 129f71ca7763607fb99594ca11e84818b3c902d5b61Brian Attwell sRect.set(0, 0, width, height); 130f71ca7763607fb99594ca11e84818b3c902d5b61Brian Attwell 1317c30f7ba026c4415286d8338453aa08319ba954fguanxiongliu sPaint.setTextAlign(Align.CENTER); 1327c30f7ba026c4415286d8338453aa08319ba954fguanxiongliu sPaint.setAntiAlias(true); 1337c30f7ba026c4415286d8338453aa08319ba954fguanxiongliu sPaint.setAlpha(ALPHA); 1347c30f7ba026c4415286d8338453aa08319ba954fguanxiongliu 1357c30f7ba026c4415286d8338453aa08319ba954fguanxiongliu canvas.drawBitmap(bitmap, sRect, destRect, sPaint); 1369df5e19332197900e8af8c5349a614be9b6c032aYorke Lee } 1379df5e19332197900e8af8c5349a614be9b6c032aYorke Lee 1389df5e19332197900e8af8c5349a614be9b6c032aYorke Lee private void drawLetterTile(final Canvas canvas) { 1399df5e19332197900e8af8c5349a614be9b6c032aYorke Lee // Draw background color. 14075bd9344d364b69281a55f524a793aa5db98480fTa-wei Yen sPaint.setColor(mColor); 1419df5e19332197900e8af8c5349a614be9b6c032aYorke Lee 1429df5e19332197900e8af8c5349a614be9b6c032aYorke Lee sPaint.setAlpha(mPaint.getAlpha()); 143c4a2a23bda2fdbbf9de43ffca7948bb7721a9e50Yorke Lee final Rect bounds = getBounds(); 144c4a2a23bda2fdbbf9de43ffca7948bb7721a9e50Yorke Lee final int minDimension = Math.min(bounds.width(), bounds.height()); 145c4a2a23bda2fdbbf9de43ffca7948bb7721a9e50Yorke Lee 146c4a2a23bda2fdbbf9de43ffca7948bb7721a9e50Yorke Lee if (mIsCircle) { 147c4a2a23bda2fdbbf9de43ffca7948bb7721a9e50Yorke Lee canvas.drawCircle(bounds.centerX(), bounds.centerY(), minDimension / 2, sPaint); 148c4a2a23bda2fdbbf9de43ffca7948bb7721a9e50Yorke Lee } else { 149c4a2a23bda2fdbbf9de43ffca7948bb7721a9e50Yorke Lee canvas.drawRect(bounds, sPaint); 150c4a2a23bda2fdbbf9de43ffca7948bb7721a9e50Yorke Lee } 1519df5e19332197900e8af8c5349a614be9b6c032aYorke Lee 15275bd9344d364b69281a55f524a793aa5db98480fTa-wei Yen // Draw letter/digit only if the first character is an english letter or there's a override 15375bd9344d364b69281a55f524a793aa5db98480fTa-wei Yen 15475bd9344d364b69281a55f524a793aa5db98480fTa-wei Yen if (mLetter != null) { 1559df5e19332197900e8af8c5349a614be9b6c032aYorke Lee // Draw letter or digit. 15675bd9344d364b69281a55f524a793aa5db98480fTa-wei Yen sFirstChar[0] = mLetter; 1579df5e19332197900e8af8c5349a614be9b6c032aYorke Lee 1589df5e19332197900e8af8c5349a614be9b6c032aYorke Lee // Scale text by canvas bounds and user selected scaling factor 1599df5e19332197900e8af8c5349a614be9b6c032aYorke Lee sPaint.setTextSize(mScale * sLetterToTileRatio * minDimension); 1609df5e19332197900e8af8c5349a614be9b6c032aYorke Lee sPaint.getTextBounds(sFirstChar, 0, 1, sRect); 1617c30f7ba026c4415286d8338453aa08319ba954fguanxiongliu sPaint.setTypeface(Typeface.create("sans-serif", Typeface.NORMAL)); 1629df5e19332197900e8af8c5349a614be9b6c032aYorke Lee sPaint.setColor(sTileFontColor); 1637c30f7ba026c4415286d8338453aa08319ba954fguanxiongliu sPaint.setAlpha(ALPHA); 1649df5e19332197900e8af8c5349a614be9b6c032aYorke Lee 1659df5e19332197900e8af8c5349a614be9b6c032aYorke Lee // Draw the letter in the canvas, vertically shifted up or down by the user-defined 1669df5e19332197900e8af8c5349a614be9b6c032aYorke Lee // offset 1679df5e19332197900e8af8c5349a614be9b6c032aYorke Lee canvas.drawText(sFirstChar, 0, 1, bounds.centerX(), 16875bd9344d364b69281a55f524a793aa5db98480fTa-wei Yen bounds.centerY() + mOffset * bounds.height() - sRect.exactCenterY(), 1699df5e19332197900e8af8c5349a614be9b6c032aYorke Lee sPaint); 1709df5e19332197900e8af8c5349a614be9b6c032aYorke Lee } else { 1719df5e19332197900e8af8c5349a614be9b6c032aYorke Lee // Draw the default image if there is no letter/digit to be drawn 172f71ca7763607fb99594ca11e84818b3c902d5b61Brian Attwell final Bitmap bitmap = getBitmapForContactType(mContactType); 173f71ca7763607fb99594ca11e84818b3c902d5b61Brian Attwell drawBitmap(bitmap, bitmap.getWidth(), bitmap.getHeight(), 174f71ca7763607fb99594ca11e84818b3c902d5b61Brian Attwell canvas); 1759df5e19332197900e8af8c5349a614be9b6c032aYorke Lee } 1769df5e19332197900e8af8c5349a614be9b6c032aYorke Lee } 1779df5e19332197900e8af8c5349a614be9b6c032aYorke Lee 178c15a4d184a8aa63f639932fb7bf564d574003035Brian Attwell public int getColor() { 17975bd9344d364b69281a55f524a793aa5db98480fTa-wei Yen return mColor; 180c15a4d184a8aa63f639932fb7bf564d574003035Brian Attwell } 181c15a4d184a8aa63f639932fb7bf564d574003035Brian Attwell 1829df5e19332197900e8af8c5349a614be9b6c032aYorke Lee /** 1839df5e19332197900e8af8c5349a614be9b6c032aYorke Lee * Returns a deterministic color based on the provided contact identifier string. 1849df5e19332197900e8af8c5349a614be9b6c032aYorke Lee */ 1859df5e19332197900e8af8c5349a614be9b6c032aYorke Lee private int pickColor(final String identifier) { 1869df5e19332197900e8af8c5349a614be9b6c032aYorke Lee if (TextUtils.isEmpty(identifier) || mContactType == TYPE_VOICEMAIL) { 1879df5e19332197900e8af8c5349a614be9b6c032aYorke Lee return sDefaultColor; 1889df5e19332197900e8af8c5349a614be9b6c032aYorke Lee } 1899df5e19332197900e8af8c5349a614be9b6c032aYorke Lee // String.hashCode() implementation is not supposed to change across java versions, so 1909df5e19332197900e8af8c5349a614be9b6c032aYorke Lee // this should guarantee the same email address always maps to the same color. 1919df5e19332197900e8af8c5349a614be9b6c032aYorke Lee // The email should already have been normalized by the ContactRequest. 1925ca1b1d12b8e535a7ca04a9039872ed4c3d7c05dBrian Attwell final int color = Math.abs(identifier.hashCode()) % sColors.length(); 1939df5e19332197900e8af8c5349a614be9b6c032aYorke Lee return sColors.getColor(color, sDefaultColor); 1949df5e19332197900e8af8c5349a614be9b6c032aYorke Lee } 1959df5e19332197900e8af8c5349a614be9b6c032aYorke Lee 196f71ca7763607fb99594ca11e84818b3c902d5b61Brian Attwell private static Bitmap getBitmapForContactType(int contactType) { 1979df5e19332197900e8af8c5349a614be9b6c032aYorke Lee switch (contactType) { 1989df5e19332197900e8af8c5349a614be9b6c032aYorke Lee case TYPE_PERSON: 1999df5e19332197900e8af8c5349a614be9b6c032aYorke Lee return DEFAULT_PERSON_AVATAR; 2009df5e19332197900e8af8c5349a614be9b6c032aYorke Lee case TYPE_BUSINESS: 2019df5e19332197900e8af8c5349a614be9b6c032aYorke Lee return DEFAULT_BUSINESS_AVATAR; 2029df5e19332197900e8af8c5349a614be9b6c032aYorke Lee case TYPE_VOICEMAIL: 2039df5e19332197900e8af8c5349a614be9b6c032aYorke Lee return DEFAULT_VOICEMAIL_AVATAR; 2049df5e19332197900e8af8c5349a614be9b6c032aYorke Lee default: 2059df5e19332197900e8af8c5349a614be9b6c032aYorke Lee return DEFAULT_PERSON_AVATAR; 2069df5e19332197900e8af8c5349a614be9b6c032aYorke Lee } 2079df5e19332197900e8af8c5349a614be9b6c032aYorke Lee } 2089df5e19332197900e8af8c5349a614be9b6c032aYorke Lee 2099df5e19332197900e8af8c5349a614be9b6c032aYorke Lee private static boolean isEnglishLetter(final char c) { 2109df5e19332197900e8af8c5349a614be9b6c032aYorke Lee return ('A' <= c && c <= 'Z') || ('a' <= c && c <= 'z'); 2119df5e19332197900e8af8c5349a614be9b6c032aYorke Lee } 2129df5e19332197900e8af8c5349a614be9b6c032aYorke Lee 2139df5e19332197900e8af8c5349a614be9b6c032aYorke Lee @Override 2149df5e19332197900e8af8c5349a614be9b6c032aYorke Lee public void setAlpha(final int alpha) { 2159df5e19332197900e8af8c5349a614be9b6c032aYorke Lee mPaint.setAlpha(alpha); 2169df5e19332197900e8af8c5349a614be9b6c032aYorke Lee } 2179df5e19332197900e8af8c5349a614be9b6c032aYorke Lee 2189df5e19332197900e8af8c5349a614be9b6c032aYorke Lee @Override 2199df5e19332197900e8af8c5349a614be9b6c032aYorke Lee public void setColorFilter(final ColorFilter cf) { 2209df5e19332197900e8af8c5349a614be9b6c032aYorke Lee mPaint.setColorFilter(cf); 2219df5e19332197900e8af8c5349a614be9b6c032aYorke Lee } 2229df5e19332197900e8af8c5349a614be9b6c032aYorke Lee 2239df5e19332197900e8af8c5349a614be9b6c032aYorke Lee @Override 2249df5e19332197900e8af8c5349a614be9b6c032aYorke Lee public int getOpacity() { 2259df5e19332197900e8af8c5349a614be9b6c032aYorke Lee return android.graphics.PixelFormat.OPAQUE; 2269df5e19332197900e8af8c5349a614be9b6c032aYorke Lee } 2279df5e19332197900e8af8c5349a614be9b6c032aYorke Lee 2289df5e19332197900e8af8c5349a614be9b6c032aYorke Lee /** 2299df5e19332197900e8af8c5349a614be9b6c032aYorke Lee * Scale the drawn letter tile to a ratio of its default size 2309df5e19332197900e8af8c5349a614be9b6c032aYorke Lee * 2319df5e19332197900e8af8c5349a614be9b6c032aYorke Lee * @param scale The ratio the letter tile should be scaled to as a percentage of its default 2329df5e19332197900e8af8c5349a614be9b6c032aYorke Lee * size, from a scale of 0 to 2.0f. The default is 1.0f. 2339df5e19332197900e8af8c5349a614be9b6c032aYorke Lee */ 23475bd9344d364b69281a55f524a793aa5db98480fTa-wei Yen public LetterTileDrawable setScale(float scale) { 2359df5e19332197900e8af8c5349a614be9b6c032aYorke Lee mScale = scale; 23675bd9344d364b69281a55f524a793aa5db98480fTa-wei Yen return this; 2379df5e19332197900e8af8c5349a614be9b6c032aYorke Lee } 2389df5e19332197900e8af8c5349a614be9b6c032aYorke Lee 2399df5e19332197900e8af8c5349a614be9b6c032aYorke Lee /** 2409df5e19332197900e8af8c5349a614be9b6c032aYorke Lee * Assigns the vertical offset of the position of the letter tile to the ContactDrawable 2419df5e19332197900e8af8c5349a614be9b6c032aYorke Lee * 2429df5e19332197900e8af8c5349a614be9b6c032aYorke Lee * @param offset The provided offset must be within the range of -0.5f to 0.5f. 2439df5e19332197900e8af8c5349a614be9b6c032aYorke Lee * If set to -0.5f, the letter will be shifted upwards by 0.5 times the height of the canvas 2449df5e19332197900e8af8c5349a614be9b6c032aYorke Lee * it is being drawn on, which means it will be drawn with the center of the letter starting 2459df5e19332197900e8af8c5349a614be9b6c032aYorke Lee * at the top edge of the canvas. 2469df5e19332197900e8af8c5349a614be9b6c032aYorke Lee * If set to 0.5f, the letter will be shifted downwards by 0.5 times the height of the canvas 2479df5e19332197900e8af8c5349a614be9b6c032aYorke Lee * it is being drawn on, which means it will be drawn with the center of the letter starting 2489df5e19332197900e8af8c5349a614be9b6c032aYorke Lee * at the bottom edge of the canvas. 2499df5e19332197900e8af8c5349a614be9b6c032aYorke Lee * The default is 0.0f. 2509df5e19332197900e8af8c5349a614be9b6c032aYorke Lee */ 25175bd9344d364b69281a55f524a793aa5db98480fTa-wei Yen public LetterTileDrawable setOffset(float offset) { 25234ae3fcd89e75cc59dd5b268ee5cc470bf15a21bWalter Jang Preconditions.checkArgument(offset >= -0.5f && offset <= 0.5f); 2539df5e19332197900e8af8c5349a614be9b6c032aYorke Lee mOffset = offset; 25475bd9344d364b69281a55f524a793aa5db98480fTa-wei Yen return this; 25575bd9344d364b69281a55f524a793aa5db98480fTa-wei Yen } 25675bd9344d364b69281a55f524a793aa5db98480fTa-wei Yen 25775bd9344d364b69281a55f524a793aa5db98480fTa-wei Yen public LetterTileDrawable setLetter(Character letter){ 25875bd9344d364b69281a55f524a793aa5db98480fTa-wei Yen mLetter = letter; 25975bd9344d364b69281a55f524a793aa5db98480fTa-wei Yen return this; 2609df5e19332197900e8af8c5349a614be9b6c032aYorke Lee } 2619df5e19332197900e8af8c5349a614be9b6c032aYorke Lee 26275bd9344d364b69281a55f524a793aa5db98480fTa-wei Yen public LetterTileDrawable setColor(int color){ 26375bd9344d364b69281a55f524a793aa5db98480fTa-wei Yen mColor = color; 26475bd9344d364b69281a55f524a793aa5db98480fTa-wei Yen return this; 26575bd9344d364b69281a55f524a793aa5db98480fTa-wei Yen } 26675bd9344d364b69281a55f524a793aa5db98480fTa-wei Yen 26775bd9344d364b69281a55f524a793aa5db98480fTa-wei Yen public LetterTileDrawable setLetterAndColorFromContactDetails(final String displayName, 26875bd9344d364b69281a55f524a793aa5db98480fTa-wei Yen final String identifier) { 26975bd9344d364b69281a55f524a793aa5db98480fTa-wei Yen if (displayName != null && displayName.length() > 0 27075bd9344d364b69281a55f524a793aa5db98480fTa-wei Yen && isEnglishLetter(displayName.charAt(0))) { 27175bd9344d364b69281a55f524a793aa5db98480fTa-wei Yen mLetter = Character.toUpperCase(displayName.charAt(0)); 27275bd9344d364b69281a55f524a793aa5db98480fTa-wei Yen }else{ 27375bd9344d364b69281a55f524a793aa5db98480fTa-wei Yen mLetter = null; 27475bd9344d364b69281a55f524a793aa5db98480fTa-wei Yen } 27575bd9344d364b69281a55f524a793aa5db98480fTa-wei Yen mColor = pickColor(identifier); 27675bd9344d364b69281a55f524a793aa5db98480fTa-wei Yen return this; 2779df5e19332197900e8af8c5349a614be9b6c032aYorke Lee } 2789df5e19332197900e8af8c5349a614be9b6c032aYorke Lee 27975bd9344d364b69281a55f524a793aa5db98480fTa-wei Yen public LetterTileDrawable setContactType(int contactType) { 2809df5e19332197900e8af8c5349a614be9b6c032aYorke Lee mContactType = contactType; 28175bd9344d364b69281a55f524a793aa5db98480fTa-wei Yen return this; 2829df5e19332197900e8af8c5349a614be9b6c032aYorke Lee } 283c4a2a23bda2fdbbf9de43ffca7948bb7721a9e50Yorke Lee 28475bd9344d364b69281a55f524a793aa5db98480fTa-wei Yen public LetterTileDrawable setIsCircular(boolean isCircle) { 285c4a2a23bda2fdbbf9de43ffca7948bb7721a9e50Yorke Lee mIsCircle = isCircle; 28675bd9344d364b69281a55f524a793aa5db98480fTa-wei Yen return this; 287c4a2a23bda2fdbbf9de43ffca7948bb7721a9e50Yorke Lee } 28802c3dee53a1be051bc7369d401585cfe87e7c5d7Gary Mai 28902c3dee53a1be051bc7369d401585cfe87e7c5d7Gary Mai /** 29002c3dee53a1be051bc7369d401585cfe87e7c5d7Gary Mai * Returns the scale percentage as a float for LetterTileDrawables used in AdaptiveIcons. 29102c3dee53a1be051bc7369d401585cfe87e7c5d7Gary Mai */ 29202c3dee53a1be051bc7369d401585cfe87e7c5d7Gary Mai public static float getAdaptiveIconScale() { 29302c3dee53a1be051bc7369d401585cfe87e7c5d7Gary Mai return 1 / (1 + (2 * AdaptiveIconDrawable.getExtraInsetFraction())); 29402c3dee53a1be051bc7369d401585cfe87e7c5d7Gary Mai } 2959df5e19332197900e8af8c5349a614be9b6c032aYorke Lee} 296