package com.taoke.autopay.android.ui;
|
|
import android.app.AlertDialog;
|
import android.content.DialogInterface;
|
import android.content.Intent;
|
import android.os.Bundle;
|
import android.view.LayoutInflater;
|
import android.view.View;
|
import android.widget.Toast;
|
|
import androidx.activity.EdgeToEdge;
|
import androidx.appcompat.app.AppCompatActivity;
|
import androidx.core.graphics.Insets;
|
import androidx.core.view.ViewCompat;
|
import androidx.core.view.WindowInsetsCompat;
|
import androidx.recyclerview.widget.LinearLayoutManager;
|
|
import com.apkfuns.logutils.LogUtils;
|
import com.lcjian.lib.recyclerview.LoadMoreAdapter;
|
import com.lcjian.lib.recyclerview.SlimAdapter;
|
import com.taoke.autopay.android.App;
|
import com.taoke.autopay.android.R;
|
import com.taoke.autopay.android.RxBus;
|
import com.taoke.autopay.android.data.entity.PageResult;
|
import com.taoke.autopay.android.data.local.LocalStore;
|
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.RestAPI;
|
import com.taoke.autopay.android.data.network.entity.Order;
|
import com.taoke.autopay.android.data.network.entity.User;
|
import com.taoke.autopay.android.databinding.ActivityMainBinding;
|
import com.taoke.autopay.android.ui.dialog.OrderProcessNotifyDialog;
|
import com.taoke.autopay.android.ui.dialog.PayCountLimitNotifyDialog;
|
|
import java.io.Serializable;
|
import java.util.ArrayList;
|
import java.util.List;
|
|
import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers;
|
import io.reactivex.rxjava3.core.Observable;
|
import io.reactivex.rxjava3.disposables.Disposable;
|
import io.reactivex.rxjava3.schedulers.Schedulers;
|
|
public class MainActivity extends AppCompatActivity {
|
|
private static final String TAG = "MainActivity";
|
private ActivityMainBinding mViewBinding;
|
|
private LoadMoreAdapter mLoadMoreAdapter;
|
private SlimAdapter mAdapter;
|
|
private List<Order> mData;
|
private List<Order> mPrePageData;
|
|
private Observable<PageResult<Order>> mObservable;
|
|
private Disposable mDisposable;
|
|
private Disposable mTaskDisposable;
|
|
private int mCurrentPage;
|
|
private int mPrePage;
|
|
private int mSortType;
|
private int mSubmitTime;
|
private int mStatus = 1;
|
private long latestEmptyTime = 0L;
|
private long latestPaySafeLimitTime = 0L;
|
|
// 支付次数超出限制提示
|
private PayCountLimitNotifyDialog mPayCountLimitNotifyDialog;
|
|
@Override
|
protected void onCreate(Bundle savedInstanceState) {
|
super.onCreate(savedInstanceState);
|
EdgeToEdge.enable(this);
|
mViewBinding = ActivityMainBinding.inflate(getLayoutInflater());
|
setContentView(mViewBinding.getRoot());
|
ViewCompat.setOnApplyWindowInsetsListener(mViewBinding.main, (v, insets) -> {
|
Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars());
|
v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom);
|
return insets;
|
});
|
mViewBinding.tvFilter.setOnClickListener(v -> new FilterFragment()
|
.setData(mSortType, mSubmitTime, mStatus)
|
.setListener((sortType, submitTime, status) -> {
|
MainActivity.this.mSortType = sortType;
|
MainActivity.this.mSubmitTime = submitTime;
|
MainActivity.this.mStatus = status;
|
refresh();
|
})
|
.show(getSupportFragmentManager(), "FilterFragment"));
|
// 设置账号
|
User user = LocalStore.getInstance().getUser();
|
if (user != null) {
|
mViewBinding.tvJobCenter.setText(String.format("操作中心(%s)", user.account));
|
}
|
|
|
mViewBinding.tvSetting.setOnClickListener(v -> startActivity(new Intent(this, SettingsActivity.class)));
|
mViewBinding.btnAutoRun.setOnCheckedChangeListener((buttonView, isChecked) -> {
|
if (isChecked) {
|
if (mStatus != 1) {
|
Toast.makeText(this, "只能筛选未执行的数据", Toast.LENGTH_SHORT).show();
|
mViewBinding.btnAutoRun.setChecked(false);
|
return;
|
}
|
mViewBinding.swipeRefreshLayout.setEnabled(false);
|
if (mData != null && !mData.isEmpty()) {
|
RxBus.getInstance().send(mData.get(0));
|
} else {
|
refresh();
|
}
|
} else {
|
mViewBinding.swipeRefreshLayout.setEnabled(true);
|
RxBus.getInstance().send(new QueueActionParams(QueueActionParams.ACTION_CLOSE));
|
}
|
});
|
mViewBinding.buttonReset.setOnClickListener(new View.OnClickListener() {
|
@Override
|
public void onClick(View v) {
|
new AlertDialog.Builder(MainActivity.this).setMessage("是否确定重置?").setPositiveButton("确定", new DialogInterface.OnClickListener() {
|
@Override
|
public void onClick(DialogInterface dialog, int which) {
|
dialog.dismiss();
|
LocalStore.getInstance().putPayedTimesBlocking(0);
|
showPayTimesInfo();
|
}
|
}).setNegativeButton("取消", new DialogInterface.OnClickListener() {
|
@Override
|
public void onClick(DialogInterface dialog, int which) {
|
dialog.dismiss();
|
}
|
}).create().show();
|
|
}
|
});
|
|
mData = new ArrayList<>();
|
mCurrentPage = 1;
|
|
mAdapter = SlimAdapter
|
.create()
|
.register(new SlimAdapter.SlimInjector<Order>() {
|
@Override
|
public int onGetLayoutResource() {
|
return R.layout.order_item;
|
}
|
|
@Override
|
public void onBind(Order data, SlimAdapter.SlimViewHolder<Order> viewHolder) {
|
String stateDesc = "";
|
if ("0".equalsIgnoreCase(data.state)) {
|
viewHolder.text(R.id.tv_job_status, "未执行").textColor(R.id.tv_job_status, 0xffff7800);
|
} else if ("1".equalsIgnoreCase(data.state)) {
|
viewHolder.text(R.id.tv_job_status, "已执行").textColor(R.id.tv_job_status, 0xffA1A0A0);
|
} else if ("2".equalsIgnoreCase(data.state)) {
|
viewHolder.text(R.id.tv_job_status, "执行出错").textColor(R.id.tv_job_status, 0xffFF2B4B);
|
}
|
|
viewHolder.text(R.id.tv_time, data.createTime)
|
.text(R.id.tv_clip_content, data.key);
|
|
viewHolder.itemView.setOnClickListener(new View.OnClickListener() {
|
@Override
|
public void onClick(View v) {
|
if (!"0".equalsIgnoreCase(viewHolder.itemData.state)) {
|
Toast.makeText(MainActivity.this, "订单尚未处于可执行状态", Toast.LENGTH_SHORT).show();
|
return;
|
}
|
|
if (mViewBinding.btnAutoRun.isChecked()) {
|
Toast.makeText(MainActivity.this, "请先关闭自动模式", Toast.LENGTH_SHORT).show();
|
} else {
|
new OrderProcessNotifyDialog.Builder(MainActivity.this).setNegativeButton(new DialogInterface.OnClickListener() {
|
@Override
|
public void onClick(DialogInterface dialog, int which) {
|
RestAPI.getInstance().apiService()
|
.rejectPay(
|
String.valueOf(LocalStore.getInstance().getUser().id),
|
viewHolder.itemData.id
|
)
|
.subscribeOn(Schedulers.io())
|
.observeOn(AndroidSchedulers.mainThread())
|
.subscribe(objectResponseData -> {
|
if (objectResponseData.code == 0) {
|
Toast.makeText(MainActivity.this, "驳回成功", Toast.LENGTH_SHORT).show();
|
} else {
|
Toast.makeText(MainActivity.this, objectResponseData.message, Toast.LENGTH_SHORT).show();
|
}
|
},
|
throwable -> {
|
Toast.makeText(MainActivity.this, throwable.getMessage(), Toast.LENGTH_SHORT).show();
|
});
|
}
|
}).setPositiveButton(new DialogInterface.OnClickListener() {
|
@Override
|
public void onClick(DialogInterface dialog, int which) {
|
RxBus.getInstance().send(viewHolder.itemData);
|
}
|
}).create().show();
|
}
|
}
|
});
|
}
|
});
|
mLoadMoreAdapter = new LoadMoreAdapter(mAdapter);
|
|
mViewBinding.swipeRefreshLayout.setOnRefreshListener(this::refresh);
|
mViewBinding.swipeRefreshLayout.setColorSchemeResources(R.color.color_primary);
|
mViewBinding.rvOrder.setLayoutManager(new LinearLayoutManager(this));
|
|
View loadFooter = LayoutInflater.from(this).inflate(R.layout.loading_footer, mViewBinding.rvOrder, false);
|
View errorFooter = LayoutInflater.from(this).inflate(R.layout.error_footer, mViewBinding.rvOrder, false);
|
mLoadMoreAdapter.setLoadingView(loadFooter).setErrorView(errorFooter);
|
mLoadMoreAdapter.setThreshold(2);
|
mLoadMoreAdapter.setOnLoadMoreListener(() -> {
|
createNewObservable();
|
getData();
|
});
|
|
mViewBinding.rvOrder.setAdapter(mLoadMoreAdapter);
|
mViewBinding.rvOrder.setHasFixedSize(true);
|
|
if (mObservable == null) {
|
createNewObservable();
|
}
|
|
mTaskDisposable = RxBus.getInstance().asFlowable()
|
.filter(o -> o instanceof TaskQueueInfo)
|
.observeOn(AndroidSchedulers.mainThread())
|
.subscribe(o -> {
|
processTaskQueueMsg((TaskQueueInfo) o);
|
});
|
|
getData();
|
// 创建支付限制提示
|
mPayCountLimitNotifyDialog = new PayCountLimitNotifyDialog.Builder(MainActivity.this).setPositiveButton("", new DialogInterface.OnClickListener() {
|
@Override
|
public void onClick(DialogInterface dialog, int which) {
|
LocalStore.getInstance().putPayedTimesBlocking(0);
|
showPayTimesInfo();
|
}
|
}).create();
|
// 显示支持次数信息
|
showPayTimesInfo();
|
|
try {
|
TaskQueueInfo info = (TaskQueueInfo) (getIntent().getSerializableExtra("data"));
|
if (info != null) {
|
processTaskQueueMsg(info);
|
}
|
} catch (Exception e) {
|
e.printStackTrace();
|
}
|
}
|
|
@Override
|
protected void onNewIntent(Intent intent) {
|
super.onNewIntent(intent);
|
LogUtils.tag(TAG).i("onNewIntent");
|
try {
|
TaskQueueInfo info = (TaskQueueInfo) (intent.getSerializableExtra("data"));
|
if (info != null) {
|
processTaskQueueMsg(info);
|
}
|
} catch (Exception e) {
|
e.printStackTrace();
|
}
|
}
|
|
private void processTaskQueueMsg(TaskQueueInfo info) {
|
switch (info.getState()) {
|
case TaskQueueInfo.STATE_EMPTY: {
|
|
runOnUiThread(new Runnable() {
|
@Override
|
public void run() {
|
|
if (mViewBinding.btnAutoRun.isChecked()) {
|
if (System.currentTimeMillis() - latestEmptyTime < 1000 * 5) {
|
return;
|
}
|
LogUtils.tag(TAG).i("开始刷新数据");
|
startActivity(new Intent(MainActivity.this, MainActivity.class));
|
latestEmptyTime = System.currentTimeMillis();
|
refresh();
|
}
|
}
|
});
|
}
|
break;
|
case TaskQueueInfo.STATE_PAY_COUNT_LIMIT: {
|
LogUtils.tag(TAG).i("接受支付次数受限");
|
// 弹出弹框, 关闭自动执行模式
|
runOnUiThread(new Runnable() {
|
@Override
|
public void run() {
|
LogUtils.tag(TAG).i("执行支付次数受限");
|
if (mViewBinding.btnAutoRun.isChecked()) {
|
mViewBinding.btnAutoRun.setChecked(false);
|
}
|
if (mPayCountLimitNotifyDialog != null && !mPayCountLimitNotifyDialog.isShowing()) {
|
mPayCountLimitNotifyDialog.show();
|
}
|
}
|
});
|
|
//
|
|
|
}
|
break;
|
case TaskQueueInfo.STATE_PAY_SAFE_LIMIT: {
|
if (System.currentTimeMillis() - latestPaySafeLimitTime < 1000 * 2L) {
|
return;
|
}
|
LogUtils.tag(TAG).i("接受支付安全受限");
|
latestPaySafeLimitTime = System.currentTimeMillis();
|
// 将当前页面置于顶部
|
runOnUiThread(new Runnable() {
|
@Override
|
public void run() {
|
LogUtils.tag(TAG).i("执行支付安全受限");
|
startActivity(new Intent(MainActivity.this, MainActivity.class));
|
mViewBinding.buttonReset.postDelayed(new Runnable() {
|
@Override
|
public void run() {
|
LogUtils.tag(TAG).i("再次进入支付宝");
|
startActivity(getPackageManager().getLaunchIntentForPackage("com.eg.android.AlipayGphone"));
|
}
|
}, 4000);
|
}
|
});
|
}
|
break;
|
case TaskQueueInfo.STATE_JOB_FINISH: {
|
startActivity(new Intent(MainActivity.this, MainActivity.class));
|
}
|
break;
|
}
|
|
}
|
|
private void createNewObservable() {
|
mObservable = onCreatePageObservable(mCurrentPage);
|
mPrePage = mCurrentPage;
|
}
|
|
private void showPayTimesInfo() {
|
Integer payedTimes = LocalStore.getInstance().getPayedTimes();
|
Integer payTimes = LocalStore.getInstance().getPayTimes();
|
if (payedTimes == null) {
|
payedTimes = 0;
|
}
|
if (payTimes == null) {
|
payTimes = 0;
|
}
|
mViewBinding.buttonReset.setText(String.format("重置支付次数(%d/%d)", payedTimes.intValue(), payTimes.intValue()));
|
}
|
|
private void getData() {
|
if (mObservable == null) {
|
return;
|
}
|
if (mDisposable != null) {
|
mDisposable.dispose();
|
}
|
if (mCurrentPage == 1) {
|
setRefreshing(true);
|
mLoadMoreAdapter.setState(LoadMoreAdapter.STATE_DEFAULT);
|
mLoadMoreAdapter.setEnabled(false);
|
} else {
|
mLoadMoreAdapter.setState(LoadMoreAdapter.STATE_LOADING);
|
}
|
mDisposable = mObservable
|
.subscribe(tPageResult -> {
|
mLoadMoreAdapter.setState(mPrePage < tPageResult.total_pages ? LoadMoreAdapter.STATE_DEFAULT : LoadMoreAdapter.STATE_END);
|
if (mCurrentPage == 1) {
|
setRefreshing(false);
|
}
|
|
if (tPageResult.total_pages == 0) {
|
mData.clear();
|
} else if (mCurrentPage <= tPageResult.total_pages && mCurrentPage == mPrePage) {
|
if (mCurrentPage == 1) {
|
mData.clear();
|
mData.addAll(tPageResult.elements);
|
mLoadMoreAdapter.setEnabled(true);
|
} else {
|
mData.addAll(tPageResult.elements);
|
}
|
|
mPrePageData = tPageResult.elements;
|
mCurrentPage++;
|
} else if (mPrePage == tPageResult.page_number) {
|
if (mPrePageData != null) {
|
mData.removeAll(mPrePageData);
|
mData.addAll(tPageResult.elements);
|
}
|
mPrePageData = tPageResult.elements;
|
}
|
mAdapter.updateData(new ArrayList<>(mData));
|
if (mViewBinding.btnAutoRun.isChecked()) {
|
if (mData != null && !mData.isEmpty()) {
|
for (Order order : mData) {
|
// 将请求到的列表加入执行队列
|
RxBus.getInstance().send(order);
|
}
|
}
|
}
|
}, throwable -> {
|
if (mCurrentPage == 1) {
|
setRefreshing(false);
|
mData.clear();
|
mAdapter.updateData(new ArrayList<>(mData));
|
mObservable = null;
|
} else {
|
mLoadMoreAdapter.setState(LoadMoreAdapter.STATE_ERROR);
|
}
|
Toast.makeText(App.getInstance(), throwable.getMessage(), Toast.LENGTH_SHORT).show();
|
});
|
}
|
|
private void refresh() {
|
mCurrentPage = 1;
|
createNewObservable();
|
getData();
|
}
|
|
protected void setRefreshing(final boolean refreshing) {
|
if (mViewBinding.swipeRefreshLayout.isEnabled()) {
|
mViewBinding.swipeRefreshLayout.post(() -> mViewBinding.swipeRefreshLayout.setRefreshing(refreshing));
|
}
|
}
|
|
@Override
|
protected void onDestroy() {
|
super.onDestroy();
|
if (mDisposable != null) {
|
mDisposable.dispose();
|
}
|
if (mTaskDisposable != null) {
|
mTaskDisposable.dispose();
|
}
|
mLoadMoreAdapter = null;
|
mAdapter = null;
|
mViewBinding.rvOrder.setAdapter(null);
|
}
|
|
@Override
|
protected void onResume() {
|
super.onResume();
|
if (LocalStore.getInstance().getUser() == null) {
|
finish();
|
}
|
showPayTimesInfo();
|
}
|
|
private Observable<PageResult<Order>> onCreatePageObservable(int currentPage) {
|
return RestAPI.getInstance().apiService()
|
.getOrders(String.valueOf(LocalStore.getInstance().getUser().id), mSortType, mSubmitTime, mStatus, currentPage, 20)
|
.map(responseData -> {
|
PageResult<Order> pageResult = new PageResult<>();
|
pageResult.elements = responseData.data.list;
|
pageResult.page_number = currentPage;
|
pageResult.page_size = 20;
|
pageResult.total_pages = responseData.data.total % 20 == 0
|
? responseData.data.total / 20
|
: responseData.data.total / 20 + 1;
|
pageResult.total_elements = responseData.data.total;
|
return pageResult;
|
})
|
.toObservable()
|
.subscribeOn(Schedulers.io())
|
.observeOn(AndroidSchedulers.mainThread())
|
.cache();
|
}
|
|
}
|