package com.v7lin.android.env.widget;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Arrays;
import android.content.Context;
import android.content.res.Resources;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import android.widget.ProgressBar;
import com.v7lin.android.env.EnvRes;
import com.v7lin.android.env.EnvTypedArray;
/**
*
*
* @author v7lin Email:v7lin@qq.com
*/
public class EnvProgressBarChanger<PB extends ProgressBar, PBC extends XProgressBarCall> extends EnvViewChanger<PB, PBC> {
private static final int[] ATTRS = {
//
android.R.attr.indeterminateDrawable,
//
android.R.attr.progressDrawable
};
static {
Arrays.sort(ATTRS);
}
private EnvRes mIndeterminateDrawableEnvRes;
private EnvRes mProgressDrawableEnvRes;
public EnvProgressBarChanger(Context context) {
super(context);
}
@Override
protected void onApplyStyle(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes, boolean allowSysRes) {
super.onApplyStyle(context, attrs, defStyleAttr, defStyleRes, allowSysRes);
EnvTypedArray array = EnvTypedArray.obtainStyledAttributes(context, attrs, ATTRS, defStyleAttr, defStyleRes);
mIndeterminateDrawableEnvRes = array.getEnvRes(Arrays.binarySearch(ATTRS, android.R.attr.indeterminateDrawable), allowSysRes);
mProgressDrawableEnvRes = array.getEnvRes(Arrays.binarySearch(ATTRS, android.R.attr.progressDrawable), allowSysRes);
array.recycle();
}
@Override
protected void onApplyAttr(Context context, int attr, int resid, boolean allowSysRes) {
super.onApplyAttr(context, attr, resid, allowSysRes);
switch (attr) {
case android.R.attr.indeterminateDrawable: {
EnvRes res = new EnvRes(resid);
mIndeterminateDrawableEnvRes = res.isValid(context, allowSysRes) ? res : null;
break;
}
case android.R.attr.progressDrawable: {
EnvRes res = new EnvRes(resid);
mProgressDrawableEnvRes = res.isValid(context, allowSysRes) ? res : null;
break;
}
default: {
break;
}
}
}
@Override
protected void onScheduleSkin(PB view, PBC call) {
super.onScheduleSkin(view, call);
scheduleIndeterminateDrawable(view, call);
scheduleProgressDrawable(view, call);
}
private void scheduleIndeterminateDrawable(PB view, PBC call) {
Resources res = view.getResources();
if (mIndeterminateDrawableEnvRes != null) {
Drawable drawable = res.getDrawable(mIndeterminateDrawableEnvRes.getResid());
if (drawable != null) {
final int left = 0;
final int top = 0;
final int right = drawable.getIntrinsicWidth();
final int bottom = drawable.getIntrinsicHeight();
drawable.setBounds(left, top, right, bottom);
call.scheduleIndeterminateDrawable(drawable);
}
}
}
private void scheduleProgressDrawable(PB view, PBC call) {
Resources res = view.getResources();
if (mProgressDrawableEnvRes != null) {
Drawable drawable = res.getDrawable(mProgressDrawableEnvRes.getResid());
if (drawable != null) {
call.scheduleProgressDrawable(drawable);
forceRefreshProgress(view, call);
}
}
}
private void forceRefreshProgress(PB view, PBC call) {
try {
int progress = view.getProgress();
Method mRefreshProgressMethod = ProgressBar.class.getDeclaredMethod("refreshProgress", new Class[] { int.class, int.class, Boolean.TYPE });
mRefreshProgressMethod.setAccessible(true);
// mRefreshProgressMethod.invoke(view, com.android.internal.R.id.progress, progress, false);
mRefreshProgressMethod.invoke(view, InternalTransfer.transferId(view.getContext(), "progress"), progress, false);
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
}