admin
2024-07-03 a40e0e51331e5e6f69e8bed5940512b29150c7a9
代码精简
3个文件已修改
115 ■■■■■ 已修改文件
app/src/main/java/com/taoke/autopay/android/Constant.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/taoke/autopay/android/service/ZfbJob.java 96 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/taoke/autopay/android/ui/SettingsActivity.java 17 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/taoke/autopay/android/Constant.java
@@ -1,5 +1,5 @@
package com.taoke.autopay.android;
public class Constant {
    public final static boolean TEST = false;
    public final static boolean TEST = true;
}
app/src/main/java/com/taoke/autopay/android/service/ZfbJob.java
@@ -8,7 +8,6 @@
import android.os.Handler;
import android.os.Message;
import android.text.TextUtils;
import android.util.Log;
import android.util.Pair;
import android.view.accessibility.AccessibilityEvent;
import android.view.accessibility.AccessibilityNodeInfo;
@@ -20,7 +19,6 @@
import com.apkfuns.logutils.LogUtils;
import com.taoke.autopay.android.App;
import com.taoke.autopay.android.Constant;
import com.taoke.autopay.android.RxBus;
import com.taoke.autopay.android.data.local.LocalStore;
import com.taoke.autopay.android.data.local.entity.TaskQueueInfo;
import com.taoke.autopay.android.data.network.RestAPI;
@@ -33,7 +31,9 @@
import com.taoke.autopay.android.utils.accessibility.TextContainsNodeFilter;
import com.taoke.autopay.android.utils.accessibility.TextNodeFilter;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.TimeUnit;
import java.util.regex.Matcher;
@@ -61,11 +61,11 @@
    private final Subject<Pair<AccessibilityService, AccessibilityEvent>> subject = PublishSubject.create();
    private Disposable mDisposableTimeout;
    private Disposable mDisposable;
    private Disposable mDisposableClipboardTimeout;
    private List<Disposable> mDisposableList;
    public ZfbJob(Order order) {
        mDisposableList = new ArrayList<>();
        this.order = order;
        this.payTimes = LocalStore.getInstance().getPayTimes();
        this.payedTimes = LocalStore.getInstance().getPayedTimes();
@@ -108,11 +108,11 @@
        }
        extraState = 0;
        mDisposableTimeout = Single
        mDisposableList.add(Single
                .just(true)
                .delay(40, TimeUnit.SECONDS)
                .subscribe(aBoolean -> notifyCancel()); // 一分钟超时,自动取消。
        mDisposableClipboardTimeout = Single
                .subscribe(aBoolean -> notifyCancel())); // 一分钟超时,自动取消。
        mDisposableList.add(Single
                .just(true)
                .delay(15, TimeUnit.SECONDS)
                .subscribe(aBoolean -> {
@@ -120,8 +120,8 @@
                        LogUtils.tag(TAG).w("支付宝粘贴板弹出超时");
                        notifyCancel();
                    }
                });// 任务启动到支付宝粘贴板推荐弹出超时时间
        mDisposable = subject
                }));// 任务启动到支付宝粘贴板推荐弹出超时时间
        Disposable mDisposable = subject
                .debounce(2, TimeUnit.SECONDS)
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(pair -> {
@@ -162,7 +162,7 @@
                            btnPay.performAction(AccessibilityNodeInfoCompat.ACTION_CLICK);
                        }
                    } else {
                        Disposable mDisposable = RestAPI.getInstance().apiService()
                        Disposable mDisposable1 = RestAPI.getInstance().apiService()
                                .setOrderNo(
                                        String.valueOf(LocalStore.getInstance().getUser().id),
                                        order.id,
@@ -185,11 +185,11 @@
                                                    extraState = 2;
                                                    btnPay.performAction(AccessibilityNodeInfoCompat.ACTION_CLICK);
                                                    // 防止弹出不是好友
                                                    Single
                                                    mDisposableList.add(Single
                                                            .just(true)
                                                            .delay(5, TimeUnit.SECONDS)
                                                            .subscribe(aBoolean -> {
                                                                if(extraState==2){
                                                                if (extraState == 2) {
                                                                    AccessibilityNodeInfoUtils
                                                                            .getSelfOrMatchingAncestor(
                                                                                    service,
@@ -197,7 +197,7 @@
                                                                                    AccessibilityNodeInfoUtils.FILTER_CLICKABLE)
                                                                            .performAction(AccessibilityNodeInfoCompat.ACTION_CLICK);
                                                                }
                                                            });// 任务启动到支付宝粘贴板推荐弹出超时时间
                                                            }));// 任务启动到支付宝粘贴板推荐弹出超时时间
                                                }
                                            } else {
@@ -209,8 +209,10 @@
                                            notifyCancel();
                                            Toast.makeText(service.getApplicationContext(), throwable.getMessage(), Toast.LENGTH_SHORT).show();
                                        });
                        mDisposableList.add(mDisposable1);
                    }
                });
        mDisposableList.add(mDisposable);
        // 下面代码避免内存泄漏和设置自动运行结果
        addJobListener(new JobListener() {
@@ -219,9 +221,15 @@
                // 100表示任务终止
                extraState = 100;
                sendUIMsg(new TaskQueueInfo(TaskQueueInfo.STATE_JOB_FINISH));
                mDisposableTimeout.dispose();
                mDisposableClipboardTimeout.dispose();
                mDisposable.dispose();
                for (Disposable d : mDisposableList) {
                    try {
                        if (d != null) {
                            d.dispose();
                        }
                    } catch (Exception ignored) {
                    }
                }
                removeJobListener(this);
                // 调用设置结果接口
                RestAPI.getInstance().apiService()
@@ -241,9 +249,14 @@
            public void onFinished() {
                extraState = 100;
                sendUIMsg(new TaskQueueInfo(TaskQueueInfo.STATE_JOB_FINISH));
                mDisposableTimeout.dispose();
                mDisposableClipboardTimeout.dispose();
                mDisposable.dispose();
                for (Disposable d : mDisposableList) {
                    try {
                        if (d != null) {
                            d.dispose();
                        }
                    } catch (Exception ignored) {
                    }
                }
                removeJobListener(this);
                // 调用设置结果接口
                RestAPI.getInstance().apiService()
@@ -266,9 +279,14 @@
            @Override
            public void onPayCountLimit() {
                extraState = 100;
                mDisposableTimeout.dispose();
                mDisposableClipboardTimeout.dispose();
                mDisposable.dispose();
                for (Disposable d : mDisposableList) {
                    try {
                        if (d != null) {
                            d.dispose();
                        }
                    } catch (Exception ignored) {
                    }
                }
                removeJobListener(this);
                // 通知页面弹出更改支付宝
                sendUIMsg(new TaskQueueInfo(TaskQueueInfo.STATE_PAY_COUNT_LIMIT));
@@ -327,6 +345,7 @@
    /**
     * 获取字母输入键盘(简版)
     *
     * @param service
     * @param rootNodeInfoCompat
     * @return
@@ -363,6 +382,7 @@
    /**
     * 获取字母输入键盘
     *
     * @param service
     * @param rootNodeInfoCompat
     * @return
@@ -396,7 +416,7 @@
            for (int i = 1; i < count; i++) {
                AccessibilityNodeInfoCompat info = keyboardNode.getChild(i);
                if (letters.length() > i) {
                    lettersMap.put(String.valueOf(letters.charAt(i-1)), info);
                    lettersMap.put(String.valueOf(letters.charAt(i - 1)), info);
                }
            }
            return lettersMap;
@@ -463,7 +483,19 @@
        } else if (extraState == 2 && TextUtils.equals("com.alipay.android.msp.ui.views.MspContainerActivity", className)) {//eventType == AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED
            extraState = 3;
            LogUtils.tag(TAG).i("支付页面弹出");
        } else if (extraState == 3) {
            //判断是否长久没进入下一步
            mDisposableList.add(Single
                    .just(true)
                    .delay(4, TimeUnit.SECONDS)
                    .subscribe(aBoolean -> {
                        if (extraState == 3) {
                            LogUtils.tag(TAG).i("长时间没检测到键盘");
                            // 支付被手机安全保护,无法获取到节点,需要回到支付宝界面才能重新开启节点
                            sendUIMsg(new TaskQueueInfo(TaskQueueInfo.STATE_PAY_SAFE_LIMIT));
                        }
                    }));
        } else if (extraState == 3 || extraState == 31) {
            extraState = 31;
            AccessibilityNodeInfoCompat btnConfirm = AccessibilityNodeInfoUtils
                    .getSelfOrMatchingAncestor(
                            service,
@@ -495,7 +527,7 @@
                        try {
                            for (int i = 0; i < businessPayPwd.length(); i++) {
                                String k = businessPayPwd.charAt(i) + "";
                                if(letterMap.get(k)==null){
                                if (letterMap.get(k) == null) {
                                    throw new Exception("密码对应的键盘字母没找到");
                                }
                            }
@@ -511,23 +543,23 @@
                        } catch (Exception e) {
                            LogUtils.tag(TAG).e("企业支付宝密码输入出错:" + e.getMessage());
                            // 重新查找支付宝键盘
                            Map<String, AccessibilityNodeInfoCompat> allLettersMap =  getLetterKeyboard(service, rootNodeInfoCompat);
                            if(allLettersMap!=null&&allLettersMap.size() >= 26){
                                LogUtils.tag(TAG).i("找到键盘26个字母组合:"+allLettersMap.size());
                            Map<String, AccessibilityNodeInfoCompat> allLettersMap = getLetterKeyboard(service, rootNodeInfoCompat);
                            if (allLettersMap != null && allLettersMap.size() >= 26) {
                                LogUtils.tag(TAG).i("找到键盘26个字母组合:" + allLettersMap.size());
                                try {
                                    // 超过26个字母
                                    for (int i = 0; i < businessPayPwd.length(); i++) {
                                        letterMap.get(businessPayPwd.charAt(i) + "").performAction(AccessibilityNodeInfo.ACTION_CLICK);
                                    }
                                    LogUtils.tag(TAG).e("企业支付宝全键盘密码输入完成");
                                }catch(Exception ee){
                                } catch (Exception ee) {
                                    LogUtils.tag(TAG).e("企业支付宝全键盘密码输入出错:" + e.getMessage());
                                }
                            }
                        }
                        extraState = 4;
                        LogUtils.tag(TAG).i("企业支付宝密码输入成功");
                        Single
                        mDisposableList.add(Single
                                .just(true)
                                .delay(5, TimeUnit.SECONDS)
                                .subscribe(aBoolean -> {
@@ -540,7 +572,7 @@
                                        surePayBtn.performAction(AccessibilityNodeInfo.ACTION_CLICK);
                                        extraState = 5;
                                    }
                                });// 任务启动到支付宝粘贴板推荐弹出超时时间
                                }));// 任务启动到支付宝粘贴板推荐弹出超时时间
                        // 获取确认按钮
                    }
                } else {
app/src/main/java/com/taoke/autopay/android/ui/SettingsActivity.java
@@ -100,11 +100,22 @@
        mViewBinding.tvTest.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
//                startActivity(new Intent()
//                        .setAction(Intent.ACTION_MAIN)
//                        .addCategory(Intent.CATEGORY_HOME)
//                        .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED | Intent.FLAG_ACTIVITY_CLEAR_TOP)
//                        .setClassName("com.eg.android.AlipayGphone", "com.alipay.mobile.security.accountmanager.ui.AccountManagerV2Activity"));
//                Intent intent =   new Intent(Intent.ACTION_VIEW, Uri.parse(String.format("alipays://platformapi/startapp?appId=20000067&url=%s", URLEncoder.encode("https://ur.alipay.com/_qHNy1BGCl0hq70u17PWl4"))));
//                startActivity(intent);
//                if(1>0){
//                    return;
//                }
                Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("intent://platformapi/startapp?appId=20000027&launchKey=754b2de6-e20b-4bf4-b82a-c9613f668024-1719452266547#Intent;scheme=alipays;package=com.eg.android.AlipayGphone;end"));
                startActivity(intent);
                if(1>0){
                    return;
                }
                //