package com.hkm.ui.processbutton;
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.drawable.Drawable;
import android.graphics.drawable.GradientDrawable;
import android.graphics.drawable.LayerDrawable;
import android.os.Parcel;
import android.os.Parcelable;
import android.util.AttributeSet;
import android.view.View;
public abstract class ProcessButton extends FlatButton {
private int mProgress;
private int mMaxProgress;
private int mMinProgress;
private GradientDrawable mProgressDrawable;
private GradientDrawable mCompleteDrawable;
private GradientDrawable mErrorDrawable;
protected CharSequence mLoadingText;
protected CharSequence mCompleteText;
protected CharSequence mErrorText;
public static final int
NORMAL = 0,
FULL = 100,
FULLBUTTON = -8,
PROGRESS = -3,
ERROR = -1;
public ProcessButton(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
init(context, attrs);
}
public ProcessButton(Context context, AttributeSet attrs) {
super(context, attrs);
init(context, attrs);
}
public ProcessButton(Context context) {
super(context);
init(context, null);
}
private void init(Context context, AttributeSet attrs) {
mMinProgress = 0;
mMaxProgress = 100;
mProgressDrawable = (GradientDrawable) getDrawable(R.drawable.rect_progress).mutate();
mProgressDrawable.setCornerRadius(getCornerRadius());
mCompleteDrawable = (GradientDrawable) getDrawable(R.drawable.rect_complete).mutate();
mCompleteDrawable.setCornerRadius(getCornerRadius());
mErrorDrawable = (GradientDrawable) getDrawable(R.drawable.rect_error).mutate();
mErrorDrawable.setCornerRadius(getCornerRadius());
if (attrs != null) {
initAttributes(context, attrs);
}
}
private int getColorXML(int colorResId, int styleIdColor) {
int default_color = getResources().getColor(colorResId);
return xmlData.getColor(styleIdColor, default_color);
}
private TypedArray xmlData;
private void initAttributes(Context context, AttributeSet attributeSet) {
xmlData = getTypedArray(context, attributeSet, R.styleable.ProcessButton);
if (xmlData == null) {
return;
}
try {
mLoadingText = xmlData.getString(R.styleable.ProcessButton_pb_textProgress);
mCompleteText = xmlData.getString(R.styleable.ProcessButton_pb_textComplete);
mErrorText = xmlData.getString(R.styleable.ProcessButton_pb_textError);
mProgressDrawable.setColor(getColorXML(R.color.purple_progress, R.styleable.ProcessButton_pb_colorProgress));
mCompleteDrawable.setColor(getColorXML(R.color.green_complete, R.styleable.ProcessButton_pb_colorComplete));
mErrorDrawable.setColor(getColorXML(R.color.red_error, R.styleable.ProcessButton_pb_colorError));
} finally {
xmlData.recycle();
}
}
public void setProgress(int progress) {
mProgress = progress;
if (mProgress == mMinProgress) {
onNormalState();
} else if (mProgress == mMaxProgress) {
onCompleteState();
} else if (mProgress == FULLBUTTON) {
onCompleteStateButton();
} else if (mProgress < mMinProgress) {
onErrorState();
} else {
onProgress();
}
invalidate();
}
/* protected void onDisable() {
setBackgroundCompat(getDisableDrawable());
}
protected void onEnable() {
setProgress(mProgress);
}
@Override
public void setEnabled(boolean enabled) {
if (enabled) {
onEnable();
} else {
onDisable();
}
super.setEnabled(enabled);
}
@Override
public boolean isEnabled() {
return super.isEnabled();
}
*/
private OnClickListener normal_state_click, complete_state_click, error_state_click, process_state_click;
private LayerDrawable complete_layerdrawable;
public ProcessButton setOnClickCompleteState(OnClickListener listener) {
complete_state_click = listener;
return this;
}
public ProcessButton setOnErrorClickState(OnClickListener listener) {
error_state_click = listener;
return this;
}
public ProcessButton setOnProcessState(OnClickListener listener) {
process_state_click = listener;
return this;
}
public ProcessButton setOnClickNormalState(OnClickListener listener) {
normal_state_click = listener;
return this;
}
public ProcessButton setOnCompleteColorButton(int top, int bottom) {
complete_layerdrawable = creatNormalDrawable(top, bottom);
return this;
}
public ProcessButton setText(CharSequence word, final int state_integer) {
if (state_integer == FULLBUTTON || state_integer == mMaxProgress || state_integer == FULL) {
mCompleteText = word;
} else if (state_integer == NORMAL) {
mNormalText = word;
} else if (state_integer == ERROR) {
mErrorText = word;
} else if (state_integer == PROGRESS) {
mLoadingText = word;
}
return this;
}
/**
* Register a callback to be invoked when this view is clicked. If this view is not
* clickable, it becomes clickable. Please do not use this one because this button is not used for making set click listener. Instead please consider
* - setOnClickNormalState
* - setOnClickCompleteState
*
* @param l The callback that will run
* @see #setClickable(boolean)
*/
@Deprecated
@Override
public void setOnClickListener(OnClickListener l) {
}
public void build() {
onNormalState();
}
protected void onErrorState() {
if (getErrorText() != null) {
setText(getErrorText());
}
setBackgroundCompat(getErrorDrawable());
super.setOnClickListener(error_state_click);
}
protected void onProgress() {
if (getLoadingText() != null) {
setText(getLoadingText());
}
setBackgroundCompat(getNormalDrawable());
if (process_state_click != null) {
super.setOnClickListener(process_state_click);
} else {
setEnabled(false);
}
}
protected void onCompleteStateButton() {
if (complete_state_click != null) {
super.setOnClickListener(complete_state_click);
setEnabled(true);
}
if (complete_layerdrawable != null) {
setBackgroundCompat(complete_layerdrawable);
} else {
setBackgroundCompat(getCompleteDrawable());
}
setText(getCompleteText());
}
protected void onCompleteState() {
if (getCompleteText() != null) {
setText(getCompleteText());
}
setBackgroundCompat(getCompleteDrawable());
super.setOnClickListener(complete_state_click);
}
protected void onNormalState() {
if (getNormalText() != null) {
setText(getNormalText());
}
setBackgroundCompat(getNormalDrawable());
if (normal_state_click != null) {
super.setOnClickListener(normal_state_click);
setEnabled(true);
}
}
@Override
protected void onDraw(Canvas canvas) {
// progress
if (mProgress > mMinProgress && mProgress < mMaxProgress) {
drawProgress(canvas);
}
super.onDraw(canvas);
}
public abstract void drawProgress(Canvas canvas);
public int getProgress() {
return mProgress;
}
public int getMaxProgress() {
return mMaxProgress;
}
public int getMinProgress() {
return mMinProgress;
}
public GradientDrawable getProgressDrawable() {
return mProgressDrawable;
}
public GradientDrawable getCompleteDrawable() {
return mCompleteDrawable;
}
public CharSequence getLoadingText() {
return mLoadingText;
}
public CharSequence getCompleteText() {
return mCompleteText;
}
public void setProgressDrawable(GradientDrawable progressDrawable) {
mProgressDrawable = progressDrawable;
}
public void setCompleteDrawable(GradientDrawable completeDrawable) {
mCompleteDrawable = completeDrawable;
}
/* public void setCompleteDrawable(Drawable completeDrawable) {
mCompleteDrawabled = completeDrawable;
}*/
public void setLoadingText(CharSequence loadingText) {
mLoadingText = loadingText;
}
public void setCompleteText(CharSequence completeText) {
mCompleteText = completeText;
}
public GradientDrawable getErrorDrawable() {
return mErrorDrawable;
}
public void setErrorDrawable(GradientDrawable errorDrawable) {
mErrorDrawable = errorDrawable;
}
public CharSequence getErrorText() {
return mErrorText;
}
public void setErrorText(CharSequence errorText) {
mErrorText = errorText;
}
@Override
public Parcelable onSaveInstanceState() {
Parcelable superState = super.onSaveInstanceState();
SavedState savedState = new SavedState(superState);
savedState.mProgress = mProgress;
return savedState;
}
@Override
public void onRestoreInstanceState(Parcelable state) {
if (state instanceof SavedState) {
SavedState savedState = (SavedState) state;
mProgress = savedState.mProgress;
super.onRestoreInstanceState(savedState.getSuperState());
setProgress(mProgress);
} else {
super.onRestoreInstanceState(state);
}
}
/**
* A {@link android.os.Parcelable} representing the {@link ProcessButton}'s
* state.
*/
public static class SavedState extends BaseSavedState {
private int mProgress;
public SavedState(Parcelable parcel) {
super(parcel);
}
private SavedState(Parcel in) {
super(in);
mProgress = in.readInt();
}
@Override
public void writeToParcel(Parcel out, int flags) {
super.writeToParcel(out, flags);
out.writeInt(mProgress);
}
public static final Creator<SavedState> CREATOR = new Creator<SavedState>() {
@Override
public SavedState createFromParcel(Parcel in) {
return new SavedState(in);
}
@Override
public SavedState[] newArray(int size) {
return new SavedState[size];
}
};
}
}