package cn.mutils.app.task;
import android.os.Handler;
import android.os.Looper;
import cn.mutils.core.ILockable;
import cn.mutils.core.event.IListener;
import cn.mutils.core.task.Task;
@SuppressWarnings("unused")
public class AnimTask extends Task implements ILockable {
public static abstract class AnimTaskListener implements IListener {
public abstract void onUpdate(AnimTask task, double progress);
public void onComplete(AnimTask task) {
}
public void onStart(AnimTask task) {
}
public void onStop(AnimTask task) {
}
}
protected long mStep = 0;
protected long mSteps = 40;
protected long mStepMillis = 30;
protected Handler mHandler = new Handler(Looper.getMainLooper());
protected Runnable mRunnable = new AnimRunnable();
protected boolean mPaused = false;
public AnimTask() {
mRestartable = true;
}
@Override
public boolean isLocked() {
return true;
}
@Override
public void setLocked(boolean locked) {
}
public double getProgress() {
if (mSteps == 0) {
return 0;
}
double value = mStep;
value = value / mSteps;
return value < 1 ? value : 1;
}
public long getSteps() {
return mSteps;
}
public void setSteps(long steps) {
if (mStarted) {
return;
}
mSteps = steps > 0 ? steps : 1;
}
public long getStep() {
return mStep;
}
public long getStepMillis() {
return mStepMillis;
}
public void setStepMillis(long stepMillis) {
if (mStarted) {
return;
}
mStepMillis = stepMillis > 0 ? stepMillis : 1;
}
@Override
public void setRunInBackground(boolean runInBackground) {
}
@Override
protected void onStart() {
mStep = 0;
for (AnimTaskListener listener : getListeners(AnimTaskListener.class)) {
listener.onStart(this);
}
mHandler.post(mRunnable);
}
@Override
protected void onStop() {
mHandler.removeCallbacksAndMessages(null);
for (AnimTaskListener listener : getListeners(AnimTaskListener.class)) {
listener.onStop(this);
}
}
public void addListener(AnimTaskListener listener) {
super.addListener(listener);
}
@Override
public boolean start() {
if (isRunning()) {
stop();
}
mStarted = true;
mStopped = false;
mPaused = false;
onStart();
return true;
}
public boolean pause() {
if (isRunning()) {
if (!mPaused) {
mPaused = true;
mHandler.removeCallbacksAndMessages(null);
}
return true;
}
return false;
}
public boolean resume() {
if (isRunning()) {
if (mPaused) {
mPaused = false;
mHandler.postDelayed(mRunnable, mStepMillis);
}
return true;
}
return false;
}
class AnimRunnable implements Runnable {
@Override
public void run() {
double progress = getProgress();
for (AnimTaskListener listener : getListeners(AnimTaskListener.class)) {
if (mStep < mSteps) {
listener.onUpdate(AnimTask.this, progress);
} else if (mStep == mSteps) {
listener.onUpdate(AnimTask.this, progress);
listener.onComplete(AnimTask.this);
}
}
if (mStep < mSteps) {
mStep++;
mHandler.postDelayed(mRunnable, mStepMillis);
} else {
stop();
}
}
}
}