package com.taoke.autopay.android.service;
|
|
import android.accessibilityservice.AccessibilityService;
|
import android.os.Handler;
|
import android.os.Looper;
|
import android.util.Log;
|
import android.view.accessibility.AccessibilityEvent;
|
|
import com.taoke.autopay.android.RxBus;
|
import com.taoke.autopay.android.data.local.entity.QueueActionParams;
|
import com.taoke.autopay.android.data.local.entity.TaskQueueInfo;
|
import com.taoke.autopay.android.data.network.entity.Order;
|
|
import java.util.Stack;
|
|
import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers;
|
import io.reactivex.rxjava3.disposables.Disposable;
|
import timber.log.Timber;
|
|
public class SimulationService extends AccessibilityService {
|
|
private String TAG = "SimulationService";
|
|
private Stack<Job> mJobsQueue;
|
|
private Job mCurrentJob;
|
|
private Disposable mDisposable;
|
|
private Disposable mDisposableNotify;
|
|
private static SimulationService service;
|
|
private Handler mHandler;
|
private Runnable mRunnable;
|
|
private void addJob(Order order) {
|
Log.i(TAG, "addJob");
|
mJobsQueue.push(new ZfbJob(order));
|
}
|
|
@Override
|
public void onCreate() {
|
Timber.d("onCreate");
|
mJobsQueue = new Stack<>();
|
mDisposable = RxBus.getInstance().asFlowable()
|
.filter(o -> o instanceof Order)
|
.observeOn(AndroidSchedulers.mainThread())
|
.subscribe(o -> addJob((Order) o));
|
|
mDisposableNotify = RxBus.getInstance().asFlowable()
|
.filter(o -> o instanceof QueueActionParams)
|
.observeOn(AndroidSchedulers.mainThread())
|
.subscribe(o -> {
|
QueueActionParams params = (QueueActionParams) o;
|
if (params.getAction() == QueueActionParams.ACTION_CLOSE) {
|
if (mCurrentJob != null) {
|
// 结束当前任务
|
mCurrentJob = null;
|
}
|
mJobsQueue.empty();
|
}
|
});
|
|
mHandler = new Handler(Looper.getMainLooper());
|
mRunnable = new Runnable() {
|
@Override
|
public void run() {
|
try {
|
if (mCurrentJob == null || mCurrentJob.isCancelled() || mCurrentJob.isFinished()) {
|
if (!mJobsQueue.isEmpty()) {
|
mCurrentJob = mJobsQueue.pop();
|
mCurrentJob.start();
|
} else {
|
// 已经空了
|
// 通知空事件
|
RxBus.getInstance().send(new TaskQueueInfo(TaskQueueInfo.STATE_EMPTY));
|
}
|
}
|
} catch (Throwable e) {
|
e.printStackTrace();
|
}
|
mHandler.postDelayed(this, 1 * 1000); // 隔1秒检测一次,取下一个任务
|
}
|
};
|
mHandler.post(mRunnable);
|
super.onCreate();
|
service = this;
|
}
|
|
@Override
|
public void onAccessibilityEvent(AccessibilityEvent event) {
|
Timber.d(event.toString());
|
if (mCurrentJob != null && !mCurrentJob.isFinished() && !mCurrentJob.isCancelled()) {
|
mCurrentJob.doWithEvent(this, event);
|
}
|
}
|
|
@Override
|
public void onInterrupt() {
|
Timber.d("onInterrupt");
|
}
|
|
@Override
|
public void onDestroy() {
|
Timber.d("onDestroy");
|
service = null;
|
mDisposable.dispose();
|
mDisposableNotify.dispose();
|
mHandler.removeCallbacks(mRunnable);
|
super.onDestroy();
|
}
|
|
public static boolean isRunning() { // UI页面可以调用这个判断是否正在运行
|
return service != null;
|
}
|
}
|