org.telegram.ui.Components.AvatarDrawable.java Source code

Java tutorial

Introduction

Here is the source code for org.telegram.ui.Components.AvatarDrawable.java

Source

/*
 * This is the source code of Telegram for Android v. 3.x.x.
 * It is licensed under GNU GPL v. 2 or later.
 * You should have received a copy of the license in this archive (see LICENSE).
 *
 * Copyright Nikolai Kudashov, 2013-2016.
 */

package org.telegram.ui.Components;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.ColorFilter;
import android.graphics.Paint;
import android.graphics.PixelFormat;
import android.graphics.Rect;
import android.graphics.drawable.Drawable;
import android.os.Build;
import android.support.v4.content.ContextCompat;
import android.text.Layout;
import android.text.StaticLayout;
import android.text.TextPaint;

import org.telegram.messenger.AndroidUtilities;
import org.telegram.messenger.FileLog;
import org.telegram.messenger.R;
import org.telegram.tgnet.TLRPC;
import org.telegram.messenger.ApplicationLoader;
import org.telegram.ui.ActionBar.Theme;

public class AvatarDrawable extends Drawable {

    private static Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
    private static TextPaint namePaint;
    private static TextPaint namePaintSmall;
    private static int[] arrColors = { 0xffe56555, 0xfff28c48, 0xff8e85ee, 0xff76c84d, 0xff5fbed5, 0xff549cdd,
            0xff8e85ee, 0xfff2749a };
    private static int[] arrColorsProfiles = { 0xffd86f65, 0xfff69d61, 0xff8c79d2, 0xff67b35d, 0xff56a2bb,
            Theme.ACTION_BAR_MAIN_AVATAR_COLOR, 0xff8c79d2, 0xfff37fa6 };
    private static int[] arrColorsProfilesBack = { 0xffca6056, 0xfff18944, 0xff7d6ac4, 0xff56a14c, 0xff4492ac,
            Theme.ACTION_BAR_PROFILE_COLOR, 0xff7d6ac4, 0xff4c84b6 };
    private static int[] arrColorsProfilesText = { 0xfff9cbc5, 0xfffdddc8, 0xffcdc4ed, 0xffc0edba, 0xffb8e2f0,
            Theme.ACTION_BAR_PROFILE_SUBTITLE_COLOR, 0xffcdc4ed, 0xffb3d7f7 };
    private static int[] arrColorsNames = { 0xffca5650, 0xffd87b29, 0xff4e92cc, 0xff50b232, 0xff42b1a8, 0xff4e92cc,
            0xff4e92cc, 0xff4e92cc };
    private static int[] arrColorsButtons = { Theme.ACTION_BAR_RED_SELECTOR_COLOR,
            Theme.ACTION_BAR_ORANGE_SELECTOR_COLOR, Theme.ACTION_BAR_VIOLET_SELECTOR_COLOR,
            Theme.ACTION_BAR_GREEN_SELECTOR_COLOR, Theme.ACTION_BAR_CYAN_SELECTOR_COLOR,
            Theme.ACTION_BAR_BLUE_SELECTOR_COLOR, Theme.ACTION_BAR_VIOLET_SELECTOR_COLOR,
            Theme.ACTION_BAR_BLUE_SELECTOR_COLOR };

    public static void resetColor(Context context) {
        // red, origin, purple, green, cyan, [ACTION BAR], purple, blue
        arrColors = new int[] { 0xffe56555, 0xfff28c48, 0xff8e85ee, 0xff76c84d, 0xff5fbed5, 0xff549cdd, 0xff8e85ee,
                0xfff2749a };
        arrColorsProfiles = new int[] { 0xffd86f65, 0xfff69d61, 0xff8c79d2, 0xff67b35d, 0xff56a2bb,
                Theme.ACTION_BAR_MAIN_AVATAR_COLOR, 0xff8c79d2, 0xfff37fa6 };

        arrColorsProfilesBack = new int[] { ContextCompat.getColor(context, R.color.avatar_profile_back_red),
                ContextCompat.getColor(context, R.color.avatar_profile_back_origin),
                ContextCompat.getColor(context, R.color.avatar_profile_back_purple),
                ContextCompat.getColor(context, R.color.avatar_profile_back_green),
                ContextCompat.getColor(context, R.color.avatar_profile_back_cyan), Theme.ACTION_BAR_PROFILE_COLOR,
                ContextCompat.getColor(context, R.color.avatar_profile_back_purple),
                ContextCompat.getColor(context, R.color.avatar_profile_back_blue) };

        arrColorsProfilesText = new int[] { 0xfff9cbc5, 0xfffdddc8, 0xffcdc4ed, 0xffc0edba, 0xffb8e2f0,
                Theme.ACTION_BAR_PROFILE_SUBTITLE_COLOR, 0xffcdc4ed, 0xffb3d7f7 };
        arrColorsNames = new int[] { ContextCompat.getColor(context, R.color.name_red),
                ContextCompat.getColor(context, R.color.name_origin),
                ContextCompat.getColor(context, R.color.name_blue),
                ContextCompat.getColor(context, R.color.name_green),
                ContextCompat.getColor(context, R.color.name_cyan),
                ContextCompat.getColor(context, R.color.name_blue),
                ContextCompat.getColor(context, R.color.name_blue),
                ContextCompat.getColor(context, R.color.name_blue) };
        arrColorsButtons = new int[] { Theme.ACTION_BAR_RED_SELECTOR_COLOR, Theme.ACTION_BAR_ORANGE_SELECTOR_COLOR,
                Theme.ACTION_BAR_VIOLET_SELECTOR_COLOR, Theme.ACTION_BAR_GREEN_SELECTOR_COLOR,
                Theme.ACTION_BAR_CYAN_SELECTOR_COLOR, Theme.ACTION_BAR_BLUE_SELECTOR_COLOR,
                Theme.ACTION_BAR_VIOLET_SELECTOR_COLOR, Theme.ACTION_BAR_BLUE_SELECTOR_COLOR };
    }

    private static Drawable broadcastDrawable;
    private static Drawable photoDrawable;

    private int color;
    private StaticLayout textLayout;
    private float textWidth;
    private float textHeight;
    private float textLeft;
    private boolean isProfile;
    private boolean drawBrodcast;
    private boolean drawPhoto;
    private boolean smallStyle;
    private StringBuilder stringBuilder = new StringBuilder(5);

    public AvatarDrawable() {
        super();

        if (namePaint == null) {
            namePaint = new TextPaint(Paint.ANTI_ALIAS_FLAG);
            namePaint.setColor(0xffffffff);

            namePaintSmall = new TextPaint(Paint.ANTI_ALIAS_FLAG);
            namePaintSmall.setColor(0xffffffff);

            broadcastDrawable = ApplicationLoader.applicationContext.getResources()
                    .getDrawable(R.drawable.broadcast_w);
        }

        namePaint.setTextSize(AndroidUtilities.dp(20));
        namePaintSmall.setTextSize(AndroidUtilities.dp(14));
    }

    public AvatarDrawable(TLRPC.User user) {
        this(user, false);
    }

    public AvatarDrawable(TLRPC.Chat chat) {
        this(chat, false);
    }

    public AvatarDrawable(TLRPC.User user, boolean profile) {
        this();
        isProfile = profile;
        if (user != null) {
            setInfo(user.id, user.first_name, user.last_name, false, null);
        }
    }

    public AvatarDrawable(TLRPC.Chat chat, boolean profile) {
        this();
        isProfile = profile;
        if (chat != null) {
            setInfo(chat.id, chat.title, null, chat.id < 0, null);
        }
    }

    public void setProfile(boolean value) {
        isProfile = value;
    }

    public void setSmallStyle(boolean value) {
        smallStyle = value;
    }

    public static int getColorIndex(int id) {
        if (id >= 0 && id < 8) {
            return id;
        }
        /*try {
        String str;
        if (id >= 0) {
            str = String.format(Locale.US, "%d%d", id, UserConfig.getClientUserId());
        } else {
            str = String.format(Locale.US, "%d", id);
        }
        if (str.length() > 15) {
            str = str.substring(0, 15);
        }
        java.security.MessageDigest md = java.security.MessageDigest.getInstance("MD5");
        byte[] digest = md.digest(str.getBytes());
        int b = digest[Math.abs(id % 16)];
        if (b < 0) {
            b += 256;
        }
        return Math.abs(b) % arrColors.length;
        } catch (Exception e) {
        FileLog.e("tmessages", e);
        }*/
        return Math.abs(id % arrColors.length);
    }

    public static int getColorForId(int id) {
        return arrColors[getColorIndex(id)];
    }

    public static int getButtonColorForId(int id) {
        return arrColorsButtons[getColorIndex(id)];
    }

    public static int getProfileColorForId(int id) {
        return arrColorsProfiles[getColorIndex(id)];
    }

    public static int getProfileTextColorForId(int id) {
        return arrColorsProfilesText[getColorIndex(id)];
    }

    public static int getProfileBackColorForId(int id) {
        return arrColorsProfilesBack[getColorIndex(id)];
    }

    public static int getNameColorForId(int id) {
        return arrColorsNames[getColorIndex(id)];
    }

    public void setInfo(TLRPC.User user) {
        if (user != null) {
            setInfo(user.id, user.first_name, user.last_name, false, null);
        }
    }

    public void setInfo(TLRPC.Chat chat) {
        if (chat != null) {
            setInfo(chat.id, chat.title, null, chat.id < 0, null);
        }
    }

    public void setColor(int value) {
        color = value;
    }

    public void setInfo(int id, String firstName, String lastName, boolean isBroadcast) {
        setInfo(id, firstName, lastName, isBroadcast, null);
    }

    public void setInfo(int id, String firstName, String lastName, boolean isBroadcast, String custom) {
        if (isProfile) {
            color = arrColorsProfiles[getColorIndex(id)];
        } else {
            color = arrColors[getColorIndex(id)];
        }

        drawBrodcast = isBroadcast;

        if (firstName == null || firstName.length() == 0) {
            firstName = lastName;
            lastName = null;
        }

        stringBuilder.setLength(0);
        if (custom != null) {
            stringBuilder.append(custom);
        } else {
            if (firstName != null && firstName.length() > 0) {
                stringBuilder.append(firstName.substring(0, 1));
            }
            if (lastName != null && lastName.length() > 0) {
                String lastch = null;
                for (int a = lastName.length() - 1; a >= 0; a--) {
                    if (lastch != null && lastName.charAt(a) == ' ') {
                        break;
                    }
                    lastch = lastName.substring(a, a + 1);
                }
                if (Build.VERSION.SDK_INT >= 16) {
                    stringBuilder.append("\u200C");
                }
                stringBuilder.append(lastch);
            } else if (firstName != null && firstName.length() > 0) {
                for (int a = firstName.length() - 1; a >= 0; a--) {
                    if (firstName.charAt(a) == ' ') {
                        if (a != firstName.length() - 1 && firstName.charAt(a + 1) != ' ') {
                            if (Build.VERSION.SDK_INT >= 16) {
                                stringBuilder.append("\u200C");
                            }
                            stringBuilder.append(firstName.substring(a + 1, a + 2));
                            break;
                        }
                    }
                }
            }
        }

        if (stringBuilder.length() > 0) {
            String text = stringBuilder.toString().toUpperCase();
            try {
                textLayout = new StaticLayout(text, (smallStyle ? namePaintSmall : namePaint),
                        AndroidUtilities.dp(100), Layout.Alignment.ALIGN_NORMAL, 1.0f, 0.0f, false);
                if (textLayout.getLineCount() > 0) {
                    textLeft = textLayout.getLineLeft(0);
                    textWidth = textLayout.getLineWidth(0);
                    textHeight = textLayout.getLineBottom(0);
                }
            } catch (Exception e) {
                FileLog.e("tmessages", e);
            }
        } else {
            textLayout = null;
        }
    }

    public void setDrawPhoto(boolean value) {
        if (value && photoDrawable == null) {
            photoDrawable = ApplicationLoader.applicationContext.getResources().getDrawable(R.drawable.photo_w);
        }
        drawPhoto = value;
    }

    @Override
    public void draw(Canvas canvas) {
        Rect bounds = getBounds();
        if (bounds == null) {
            return;
        }
        int size = bounds.width();
        paint.setColor(color);
        canvas.save();
        canvas.translate(bounds.left, bounds.top);
        canvas.drawCircle(size / 2, size / 2, size / 2, paint);

        if (drawBrodcast && broadcastDrawable != null) {
            int x = (size - broadcastDrawable.getIntrinsicWidth()) / 2;
            int y = (size - broadcastDrawable.getIntrinsicHeight()) / 2;
            broadcastDrawable.setBounds(x, y, x + broadcastDrawable.getIntrinsicWidth(),
                    y + broadcastDrawable.getIntrinsicHeight());
            broadcastDrawable.draw(canvas);
        } else {
            if (textLayout != null) {
                canvas.translate((size - textWidth) / 2 - textLeft, (size - textHeight) / 2);
                textLayout.draw(canvas);
            } else if (drawPhoto && photoDrawable != null) {
                int x = (size - photoDrawable.getIntrinsicWidth()) / 2;
                int y = (size - photoDrawable.getIntrinsicHeight()) / 2;
                photoDrawable.setBounds(x, y, x + photoDrawable.getIntrinsicWidth(),
                        y + photoDrawable.getIntrinsicHeight());
                photoDrawable.draw(canvas);
            }
        }
        canvas.restore();
    }

    @Override
    public void setAlpha(int alpha) {

    }

    @Override
    public void setColorFilter(ColorFilter cf) {

    }

    @Override
    public int getOpacity() {
        return PixelFormat.TRANSPARENT;
    }

    @Override
    public int getIntrinsicWidth() {
        return 0;
    }

    @Override
    public int getIntrinsicHeight() {
        return 0;
    }
}