// Path: Chatting/src/cn/jmessage/android/uikit/chatting/utils/IdHelper.java
// public class IdHelper {
// 
//     public static int getLayout(Context context, String layoutName) {
//         return context.getResources().getIdentifier(layoutName, "layout",
//                 context.getApplicationContext().getPackageName());
//     }
// 
//     public static int getViewID(Context context, String IDName) {
//         return context.getResources().getIdentifier(IDName, "id",
//                 context.getApplicationContext().getPackageName());
//     }
// 
//     public static int getDrawable(Context context, String drawableName) {
//         return context.getResources().getIdentifier(drawableName, "drawable",
//                 context.getApplicationContext().getPackageName());
//     }
// 
//     public static int getAttr(Context context, String attrName) {
//         return context.getResources().getIdentifier(attrName, "attr",
//                 context.getApplicationContext().getPackageName());
//     }
// 
//     public static int getString(Context context, String stringName) {
//         return context.getResources().getIdentifier(stringName, "string",
//                 context.getApplicationContext().getPackageName());
//     }
// 
//     public static int getStyle(Context context, String styleName) {
//         return context.getResources().getIdentifier(styleName, "style",
//                 context.getApplicationContext().getPackageName());
//     }
// 
//     public static int[] getResourceDeclareStyleableIntArray(Context context, String name) {
//         try {
//             Field[] fields2 = Class.forName(context.getPackageName() + ".R$styleable").getFields();
// 
//             //browse all fields
//             for (Field f : fields2) {
//                 //pick matching field
//                 if (f.getName().equals(name)) {
//                     //return as int array
//                     return (int[]) f.get(null);
//                 }
//             }
//         } catch (Throwable t) {
//             t.printStackTrace();
//         }
// 
//         return null;
//     }
// 
//     public static int getAnim(Context context, String animName) {
//         return context.getResources().getIdentifier(animName, "anim",
//                 context.getApplicationContext().getPackageName());
//     }
// }


import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Bitmap;
import android.graphics.BitmapShader;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.graphics.Shader;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import android.util.DisplayMetrics;
import cn.jmessage.android.uikit.R;
import cn.jmessage.android.uikit.chatting.utils.IdHelper;
    protected BitmapShader shader;
    protected Drawable drawable;
    protected final Matrix matrix = new Matrix();

    public ShaderHelper() {
        borderPaint = new Paint();
        borderPaint.setStyle(Paint.Style.STROKE);
        borderPaint.setAntiAlias(true);

        imagePaint = new Paint();
        imagePaint.setAntiAlias(true);
    }

    public abstract void draw(Canvas canvas, Paint imagePaint, Paint borderPaint);
    public abstract void reset();
    @SuppressWarnings("UnusedParameters")
    public abstract void calculate(int bitmapWidth, int bitmapHeight, float width, float height, float scale, float translateX, float translateY);


    @SuppressWarnings("SameParameterValue")
    protected final int dpToPx(DisplayMetrics displayMetrics, int dp) {
        return Math.round(dp * (displayMetrics.xdpi / DisplayMetrics.DENSITY_DEFAULT));
    }

    public boolean isSquare() {
        return square;
    }

    public void init(Context context, AttributeSet attrs, int defStyle) {
        if(attrs != null){
// Path: Chatting/src/cn/jmessage/android/uikit/chatting/utils/IdHelper.java
// public class IdHelper {
// 
//     public static int getLayout(Context context, String layoutName) {
//         return context.getResources().getIdentifier(layoutName, "layout",
//                 context.getApplicationContext().getPackageName());
//     }
// 
//     public static int getViewID(Context context, String IDName) {
//         return context.getResources().getIdentifier(IDName, "id",
//                 context.getApplicationContext().getPackageName());
//     }
// 
//     public static int getDrawable(Context context, String drawableName) {
//         return context.getResources().getIdentifier(drawableName, "drawable",
//                 context.getApplicationContext().getPackageName());
//     }
// 
//     public static int getAttr(Context context, String attrName) {
//         return context.getResources().getIdentifier(attrName, "attr",
//                 context.getApplicationContext().getPackageName());
//     }
// 
//     public static int getString(Context context, String stringName) {
//         return context.getResources().getIdentifier(stringName, "string",
//                 context.getApplicationContext().getPackageName());
//     }
// 
//     public static int getStyle(Context context, String styleName) {
//         return context.getResources().getIdentifier(styleName, "style",
//                 context.getApplicationContext().getPackageName());
//     }
// 
//     public static int[] getResourceDeclareStyleableIntArray(Context context, String name) {
//         try {
//             Field[] fields2 = Class.forName(context.getPackageName() + ".R$styleable").getFields();
// 
//             //browse all fields
//             for (Field f : fields2) {
//                 //pick matching field
//                 if (f.getName().equals(name)) {
//                     //return as int array
//                     return (int[]) f.get(null);
//                 }
//             }
//         } catch (Throwable t) {
//             t.printStackTrace();
//         }
// 
//         return null;
//     }
// 
//     public static int getAnim(Context context, String animName) {
//         return context.getResources().getIdentifier(animName, "anim",
//                 context.getApplicationContext().getPackageName());
//     }
// }


// Path: Chatting/src/cn/jmessage/android/uikit/chatting/shader/ShaderHelper.java
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Bitmap;
import android.graphics.BitmapShader;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.graphics.Shader;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import android.util.DisplayMetrics;
import cn.jmessage.android.uikit.R;
import cn.jmessage.android.uikit.chatting.utils.IdHelper;

    protected BitmapShader shader;
    protected Drawable drawable;
    protected final Matrix matrix = new Matrix();

    public ShaderHelper() {
        borderPaint = new Paint();
        borderPaint.setStyle(Paint.Style.STROKE);
        borderPaint.setAntiAlias(true);

        imagePaint = new Paint();
        imagePaint.setAntiAlias(true);
    }

    public abstract void draw(Canvas canvas, Paint imagePaint, Paint borderPaint);
    public abstract void reset();
    @SuppressWarnings("UnusedParameters")
    public abstract void calculate(int bitmapWidth, int bitmapHeight, float width, float height, float scale, float translateX, float translateY);


    @SuppressWarnings("SameParameterValue")
    protected final int dpToPx(DisplayMetrics displayMetrics, int dp) {
        return Math.round(dp * (displayMetrics.xdpi / DisplayMetrics.DENSITY_DEFAULT));
    }

    public boolean isSquare() {
        return square;
    }

    public void init(Context context, AttributeSet attrs, int defStyle) {
        if(attrs != null){
            int[] declareStyleableArray = IdHelper.getResourceDeclareStyleableIntArray(context, "ShaderImageView");