Files
assistant-android/app/src/main/java/com/gh/gamecenter/geetest/GeetestUtils.java
2023-05-22 17:34:35 +08:00

246 lines
8.6 KiB
Java
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package com.gh.gamecenter.geetest;
import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.os.Build;
import com.gh.gamecenter.core.AppExecutor;
import com.gh.gamecenter.core.utils.AppDebugConfig;
import com.gh.gamecenter.common.retrofit.JSONObjectResponse;
import com.gh.gamecenter.retrofit.RetrofitManager;
import com.lightgame.utils.RuntimeUtils;
import com.lightgame.utils.Utils;
import org.json.JSONObject;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.schedulers.Schedulers;
import retrofit2.HttpException;
/**
* Created by khy on 2017/1/12.
* 验证码工具类
*/
public class GeetestUtils {
private boolean isOperating;
private ProgressDialog mProgressDialog;
private GeetestListener mGeetestListener;
private int mRetryCount = 0;
private final int RETRY_MAX_COUNT = 3;
public static GeetestUtils getInstance() {
return SingletonHolder.INSTANCE;
}
/**
* 由于后续webview textview 需要activity context所以此处传activity context
*
* @param context
* @param listener
*/
public void showDialog(Context context, GeetestListener listener) {
mProgressDialog = ProgressDialog.show(context, null, "Loading", true, true);
mGeetestListener = listener;
checkServer(context);
// mProgressDialog.setOnCancelListener(new DialogInterface.OnCancelListener() {
// @Override
// public void onCancel(DialogInterface dialog) {
//// toastMsg("user cancel progress dialog");
// // 用户主动退出验证
// }
// });
}
private void checkServer(final Context context) {
isOperating = true;
RetrofitManager.getInstance().getApi()
.getCaptchaData()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new JSONObjectResponse() {
@Override
public void onResponse(JSONObject info) {
super.onResponse(info);
isOperating = false;
try {
if (info.toString().length() > 0) {
Utils.log("验证模块返回:" + info.toString());
if (info.getInt("success") == 1) {
openGtTest(context, info);
} else {
// 从API_1获得极验服务宕机或不可用通知, 使用备用验证或静态验证
if (mProgressDialog.isShowing()) {
mProgressDialog.dismiss();
}
toastMsg(context, "从服务器不接受的验证");
}
}
} catch (Exception e) {
if (mProgressDialog.isShowing()) {
mProgressDialog.dismiss();
}
toastMsg(context, "从API接收到无效的JSON参数");
e.printStackTrace();
}
}
@Override
public void onFailure(HttpException e) {
super.onFailure(e);
if (mProgressDialog.isShowing()) {
mProgressDialog.dismiss();
}
toastMsg(context, "服务器返回错误/网络错误");
isOperating = false;
}
});
}
private void openGtTest(final Context context, JSONObject params) {
if (AppDebugConfig.IS_DEBUG) {
AppDebugConfig.logMethodWithParams(this, context, params);
}
mRetryCount = 0;
final GtDialog dialog = new GtDialog(context, params);
if (context instanceof Activity) {
dialog.setOwnerActivity((Activity) context);
}
// 启用debug可以在webview上看到验证过程的一些数据
dialog.setDebug(AppDebugConfig.IS_DEBUG);
// dialog.setOnCancelListener(new DialogInterface.OnCancelListener() {
// @Override
// public void onCancel(DialogInterface dialog) {
// // 用户取消验证
//// toastMsg("user close the geetest.");
// }
// });
dialog.setGtListener(new GtListener() {
@Override
public void gtCallReady(Boolean status) {
AppExecutor.getUiExecutor().execute(() -> {
if (AppDebugConfig.IS_DEBUG) {
AppDebugConfig.logMethodWithParams(this, status, mProgressDialog.isShowing());
}
mRetryCount = 0;
if (!mProgressDialog.isShowing()) {
//被手动取消了也就是其实用户想取消loading了那么即使回调也不弹出
return;
}
mProgressDialog.dismiss();
if (status) {
// 验证加载完成
Activity ownerActivity = dialog.getOwnerActivity();
if (ownerActivity != null
&& (ownerActivity.isFinishing()
|| (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) && ownerActivity.isDestroyed())) {
// activity 不可见
toastMsg(context, "验证加载超时,请重新尝试");
} else {
dialog.show();
}
} else {
// 验证加载超时,未准备完成
toastMsg(context, "验证加载超时,请重新尝试");
}
});
}
@Override
public void gtCallClose() {
AppExecutor.getUiExecutor().execute(() -> {
if (AppDebugConfig.IS_DEBUG) {
AppDebugConfig.logMethodWithParams(this);
}
if (dialog != null && dialog.isShowing()) {
dialog.dismiss();
}
});
}
@Override
public void gtError() {
AppExecutor.getUiExecutor().execute(() -> {
if (AppDebugConfig.IS_DEBUG) {
AppDebugConfig.logMethodWithParams(this);
}
if (mRetryCount < RETRY_MAX_COUNT) {
mRetryCount++;
checkServer(context);
} else {
if (mProgressDialog.isShowing()) {
mProgressDialog.dismiss();
}
}
});
}
@Override
public void gtResult(boolean success, String result) {
AppExecutor.getUiExecutor().execute(() -> {
if (AppDebugConfig.IS_DEBUG) {
AppDebugConfig.logMethodWithParams(this, success, result);
}
if (success) {
if (dialog != null && dialog.isShowing()) {
dialog.dismiss();
}
if (mGeetestListener != null) {
mGeetestListener.onVerified(result);
}
Utils.log("client captcha succeed:" + result);
} else {
// 验证失败
Utils.log("client captcha failed:" + result);
}
});
}
});
dialog.setOnDismissListener(new DialogInterface.OnDismissListener() {
@Override
public void onDismiss(DialogInterface dialog) {
// 需要重新get challenge
if (AppDebugConfig.IS_DEBUG) {
AppDebugConfig.logMethodWithParams(this);
}
}
});
dialog.init();
}
private void toastMsg(Context context, String msg) {
RuntimeUtils.getInstance().toast(context, msg);
}
private static class SingletonHolder {
private static final GeetestUtils INSTANCE = new GeetestUtils();
}
}