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