package android.widget;
import android.content.Context;
import android.content.res.Resources;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.RectF;
import android.util.AttributeSet;
import android.util.DisplayMetrics;
import android.util.TypedValue;
import android.view.MotionEvent;
import android.view.ViewGroup;
import com.bootstrap.BaseApplication;
import com.bootstrap.R;
import javax.inject.Inject;
public class MaterialButton extends Button {
@Inject TypefaceManager typefaceManager;
@Inject DisplayMetrics displayMetrics;
@Inject Resources resources;
private boolean pressed;
private int height;
private int touchTarget;
private int externalPadding;
private float radius;
private RectF bgRect;
private Paint bgPaint;
public MaterialButton(final Context context) {
super(context);
init(context, null);
}
public MaterialButton(final Context context, final AttributeSet attrs) {
super(context, attrs);
init(context, attrs);
}
public MaterialButton(final Context context, final AttributeSet attrs, final int defStyleAttr) {
super(context, attrs, defStyleAttr);
init(context, attrs);
}
public MaterialButton(final Context context, final AttributeSet attrs, final int defStyleAttr, final int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
init(context, attrs);
}
private void init(final Context context, final AttributeSet attrs) {
bgRect = new RectF();
bgPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
bgPaint.setColor(0xffcccccc);
if (!isInEditMode()) {
BaseApplication.from(context).getComponent().inject(this);
setTypeface(typefaceManager.getMedium());
final int minWidth = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 64.0f, displayMetrics);
final int internalPadding = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 8.0f, displayMetrics);
height = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 36.0f, displayMetrics);
touchTarget = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 48.0f, displayMetrics);
externalPadding = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 4.0f, displayMetrics);
radius = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 3.0f, displayMetrics);
setMinWidth(minWidth);
setPadding(internalPadding, 0, internalPadding, 0);
setTextSize(TypedValue.COMPLEX_UNIT_PX, resources.getDimension(R.dimen.abc_text_size_button_material));
}
if (attrs != null) {
final TypedArray styleValues = context.obtainStyledAttributes(attrs, new int[]{android.R.attr.textColor});
setTextColor(styleValues.getColor(0, Color.BLACK));
styleValues.recycle();
} else {
setTextColor(Color.BLACK);
}
setAllCaps(true);
setBackgroundColor(Color.TRANSPARENT);
ViewGroup.LayoutParams lp = getLayoutParams();
if (lp == null) {
lp = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
setLayoutParams(lp);
}
}
@Override protected void onMeasure(final int widthMeasureSpec, final int heightMeasureSpec) {
final int height = MeasureSpec.makeMeasureSpec(touchTarget, MeasureSpec.EXACTLY);
super.onMeasure(widthMeasureSpec, height);
}
@Override protected void onSizeChanged(final int w, final int h, final int oldw, final int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
bgRect.set(0, 0, w, h);
bgRect.inset(externalPadding, (touchTarget - height) / 2);
}
@Override public boolean onTouchEvent(final MotionEvent event) {
final int action = event.getAction();
switch (action) {
case MotionEvent.ACTION_DOWN:
pressed = true;
invalidate();
break;
case MotionEvent.ACTION_UP:
case MotionEvent.ACTION_CANCEL:
pressed = false;
invalidate();
break;
}
return super.onTouchEvent(event);
}
@Override protected void onDraw(final Canvas canvas) {
if (pressed) {
canvas.drawRoundRect(bgRect, radius, radius, bgPaint);
}
super.onDraw(canvas);
}
}