|
@@ -1,10 +1,38 @@
|
|
|
package cn.yyxx.commsdk.base;
|
|
|
|
|
|
+import android.app.Activity;
|
|
|
+import android.app.Application;
|
|
|
+import android.content.Context;
|
|
|
+import android.content.Intent;
|
|
|
+import android.os.Build;
|
|
|
+import android.text.TextUtils;
|
|
|
+import android.webkit.WebView;
|
|
|
+
|
|
|
+import java.util.List;
|
|
|
+
|
|
|
+import cn.yyxx.commsdk.Version;
|
|
|
+import cn.yyxx.commsdk.base.entity.Function;
|
|
|
+import cn.yyxx.commsdk.base.entity.SdkChargeInfo;
|
|
|
+import cn.yyxx.commsdk.base.entity.SdkRoleInfo;
|
|
|
+import cn.yyxx.commsdk.base.internal.ICallback;
|
|
|
+import cn.yyxx.commsdk.base.internal.IInitialize;
|
|
|
+import cn.yyxx.commsdk.base.utils.Logger;
|
|
|
+import cn.yyxx.support.AppUtils;
|
|
|
+
|
|
|
/**
|
|
|
* @author #Suyghur.
|
|
|
* Created on 2021/12/25
|
|
|
*/
|
|
|
-public class YYXXCommSdk {
|
|
|
+public final class YYXXCommSdk {
|
|
|
+
|
|
|
+ private static final long CLICK_INTERVAL = 1500L;
|
|
|
+ private Object mSdkBridge = null;
|
|
|
+ private long clickLoginTime = 0L;
|
|
|
+ private long clickLogoutTime = 0L;
|
|
|
+ private long clickChargeTime = 0L;
|
|
|
+
|
|
|
+ private String processName = "";
|
|
|
+ private boolean doSdkInit = false;
|
|
|
|
|
|
private YYXXCommSdk() {
|
|
|
|
|
@@ -25,4 +53,394 @@ public class YYXXCommSdk {
|
|
|
return INSTANCE;
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
+ private Object getSdkBridgeManager(Context context) {
|
|
|
+ if (null == mSdkBridge) {
|
|
|
+ mSdkBridge = SdkBridgeManager.initSdkBridgeManager(context);
|
|
|
+ }
|
|
|
+ return mSdkBridge;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 同步Application中的attachBaseContext
|
|
|
+ *
|
|
|
+ * @param application Application上下文对象
|
|
|
+ * @param context Context上下文对象
|
|
|
+ */
|
|
|
+ public void attachBaseContext(Application application, Context context) {
|
|
|
+ if (TextUtils.isEmpty(processName)) {
|
|
|
+ processName = AppUtils.getProcessName(context);
|
|
|
+ }
|
|
|
+ if (TextUtils.isEmpty(processName) || !processName.equals(context.getPackageName())) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ if (mSdkBridge == null) {
|
|
|
+ mSdkBridge = getSdkBridgeManager(context);
|
|
|
+ }
|
|
|
+ SdkBridgeManager.call(Function.ATTACH_BASE_CONTEXT, new Class[]{Application.class, Context.class}, new Object[]{application, context});
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 同步Application中的onCreate
|
|
|
+ *
|
|
|
+ * @param application Application上下文对象
|
|
|
+ */
|
|
|
+ public void initApplication(Application application) {
|
|
|
+ if (TextUtils.isEmpty(processName)) {
|
|
|
+ processName = AppUtils.getProcessName(application);
|
|
|
+ }
|
|
|
+ if (TextUtils.isEmpty(processName) || !processName.equals(application.getPackageName())) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ //适配Android P WebView
|
|
|
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
|
|
|
+ try {
|
|
|
+ if (!application.getPackageName().equals(processName)) {
|
|
|
+ Logger.d("Android P 设置webView不同的目录");
|
|
|
+ WebView.setDataDirectorySuffix(processName);
|
|
|
+ }
|
|
|
+ } catch (Exception e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if (mSdkBridge == null) {
|
|
|
+ mSdkBridge = getSdkBridgeManager(application);
|
|
|
+ }
|
|
|
+ SdkBridgeManager.call(Function.INIT_APPLICATION, new Class[]{Application.class}, new Object[]{application});
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * SDK初始化
|
|
|
+ *
|
|
|
+ * @param activity Activity上下文
|
|
|
+ * @param isLandscape 是否横屏
|
|
|
+ * @param callback SDK初始化回调
|
|
|
+ */
|
|
|
+ public void initialize(Activity activity, Boolean isLandscape, final ICallback callback) {
|
|
|
+ if (checkSdkBridgeNull(Function.INITIALIZE, callback)) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ //有些CP自己请求了权限,导致回调权限2次,执行2次initFuseSdk,这里拦截一下
|
|
|
+ if (doSdkInit) {
|
|
|
+ Logger.e("QSGameSdk initialize 已经执行,拦截此次调用");
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ IInitialize initCallback = (code, result) -> {
|
|
|
+ doSdkInit = code == 0;
|
|
|
+ callback.onResult(code, result);
|
|
|
+ };
|
|
|
+ SdkBridgeManager.call(Function.INITIALIZE, new Class[]{Activity.class, Boolean.class, IInitialize.class}, new Object[]{activity, isLandscape, initCallback});
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * SDK用户登录
|
|
|
+ *
|
|
|
+ * @param activity Activity上下文
|
|
|
+ * @param callback 登录回调对象
|
|
|
+ */
|
|
|
+ public void login(Activity activity, ICallback callback) {
|
|
|
+ if (checkSdkBridgeNull(Function.LOGIN, callback)) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (checkSdkNonInit(Function.LOGIN, callback)) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (System.currentTimeMillis() - clickLoginTime < CLICK_INTERVAL) {
|
|
|
+ Logger.e("调用登录接口太频繁,拦截此次操作");
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ clickLoginTime = System.currentTimeMillis();
|
|
|
+ SdkBridgeManager.call(Function.LOGIN, new Class[]{Activity.class, ICallback.class}, new Object[]{activity, callback});
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * SDK用户登出账号
|
|
|
+ *
|
|
|
+ * @param activity Activity上下文
|
|
|
+ * @param callback 登出回调对象
|
|
|
+ */
|
|
|
+ public void logout(Activity activity, ICallback callback) {
|
|
|
+ if (checkSdkBridgeNull(Function.LOGOUT, callback)) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (checkSdkNonInit(Function.LOGOUT, callback)) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (System.currentTimeMillis() - clickLoginTime < CLICK_INTERVAL) {
|
|
|
+ Logger.e("调用登录接口后,调用登出账号接口间隔太短,拦截此次操作");
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ if (System.currentTimeMillis() - clickLogoutTime < CLICK_INTERVAL) {
|
|
|
+ Logger.e("调用登出账号接口太频繁,拦截此次操作");
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ clickLogoutTime = System.currentTimeMillis();
|
|
|
+ SdkBridgeManager.call(Function.LOGOUT, new Class[]{Activity.class, ICallback.class}, new Object[]{activity, callback});
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * SDK用户支付
|
|
|
+ *
|
|
|
+ * @param activity Activity上下文
|
|
|
+ * @param chargeInfo 支付信息实体对象
|
|
|
+ * @param callback 支付回调对象
|
|
|
+ */
|
|
|
+ public void charge(Activity activity, SdkChargeInfo chargeInfo, ICallback callback) {
|
|
|
+ if (checkSdkBridgeNull(Function.CHARGE, callback)) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (checkSdkNonInit(Function.CHARGE, callback)) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (System.currentTimeMillis() - clickChargeTime < CLICK_INTERVAL) {
|
|
|
+ Logger.e("调用充值接口太频繁,拦截此次操作");
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ clickChargeTime = System.currentTimeMillis();
|
|
|
+ SdkBridgeManager.call(Function.CHARGE, new Class[]{Activity.class, SdkChargeInfo.class, ICallback.class}, new Object[]{activity, chargeInfo, callback});
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ /**
|
|
|
+ * SDK角色创建信息上报
|
|
|
+ *
|
|
|
+ * @param activity Activity上下文
|
|
|
+ * @param roleInfo 角色信息实体
|
|
|
+ * @param callback 角色信息上报回调对象
|
|
|
+ */
|
|
|
+ public void roleCreate(Activity activity, SdkRoleInfo roleInfo, ICallback callback) {
|
|
|
+ if (checkSdkBridgeNull(Function.ROLE_CREATE, callback)) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (checkSdkNonInit(Function.ROLE_CREATE, callback)) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ SdkBridgeManager.call(Function.ROLE_CREATE, new Class[]{Activity.class, SdkRoleInfo.class, ICallback.class}, new Object[]{activity, roleInfo, callback});
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * SDK角色登录信息上报
|
|
|
+ *
|
|
|
+ * @param activity Activity上下文
|
|
|
+ * @param roleInfo 角色信息实体
|
|
|
+ * @param callback 角色信息上报回调对象
|
|
|
+ */
|
|
|
+ public void roleLauncher(Activity activity, SdkRoleInfo roleInfo, ICallback callback) {
|
|
|
+ if (checkSdkBridgeNull(Function.ROLE_LAUNCHER, callback)) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (checkSdkNonInit(Function.ROLE_LAUNCHER, callback)) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ SdkBridgeManager.call(Function.ROLE_LAUNCHER, new Class[]{Activity.class, SdkRoleInfo.class, ICallback.class}, new Object[]{activity, roleInfo, callback});
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * SDK角色升级信息上报
|
|
|
+ *
|
|
|
+ * @param activity Activity上下文
|
|
|
+ * @param roleInfo 角色信息实体
|
|
|
+ * @param callback 角色信息上报回调对象
|
|
|
+ */
|
|
|
+ public void roleUpgrade(Activity activity, SdkRoleInfo roleInfo, ICallback callback) {
|
|
|
+ if (checkSdkBridgeNull(Function.ROLE_UPGRADE, callback)) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (checkSdkNonInit(Function.ROLE_UPGRADE, callback)) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ SdkBridgeManager.call(Function.ROLE_UPGRADE, new Class[]{Activity.class, SdkRoleInfo.class, ICallback.class}, new Object[]{activity, roleInfo, callback});
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 是否显示SDK退出框
|
|
|
+ *
|
|
|
+ * @param activity Activity上下文
|
|
|
+ */
|
|
|
+ public Boolean hasExitView(Activity activity) {
|
|
|
+ if (checkSdkBridgeNull(Function.HAS_EXIT_VIEW, null)) {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (checkSdkNonInit(Function.HAS_EXIT_VIEW, null)) {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ return (Boolean) SdkBridgeManager.callback(Function.HAS_EXIT_VIEW, new Class[]{Activity.class}, new Object[]{activity});
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 显示退出框
|
|
|
+ *
|
|
|
+ * @param activity Activity上下文
|
|
|
+ * @param callback 退出回调对象
|
|
|
+ */
|
|
|
+ public void openExitView(Activity activity, ICallback callback) {
|
|
|
+ if (checkSdkBridgeNull(Function.OPEN_EXIT_VIEW, null)) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (checkSdkNonInit(Function.OPEN_EXIT_VIEW, null)) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ SdkBridgeManager.call(Function.OPEN_EXIT_VIEW, new Class[]{Activity.class, ICallback.class}, new Object[]{activity, callback});
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 同步游戏Activity的onStart
|
|
|
+ */
|
|
|
+ public void onStart(Activity activity) {
|
|
|
+ if (checkSdkBridgeNull(Function.ON_START, null)) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ SdkBridgeManager.call(Function.ON_START, new Class[]{Activity.class}, new Object[]{activity});
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 同步游戏Activity的onRestart
|
|
|
+ */
|
|
|
+ public void onRestart(Activity activity) {
|
|
|
+ if (checkSdkBridgeNull(Function.ON_RESTART, null)) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ SdkBridgeManager.call(Function.ON_RESTART, new Class[]{Activity.class}, new Object[]{activity});
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 同步游戏Activity的onResume
|
|
|
+ */
|
|
|
+ public void onResume(Activity activity) {
|
|
|
+ if (checkSdkBridgeNull(Function.ON_RESUME, null)) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ SdkBridgeManager.call(Function.ON_RESUME, new Class[]{Activity.class}, new Object[]{activity});
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 同步游戏Activity的onPause
|
|
|
+ */
|
|
|
+ public void onPause(Activity activity) {
|
|
|
+ if (checkSdkBridgeNull(Function.ON_PAUSE, null)) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ SdkBridgeManager.call(Function.ON_PAUSE, new Class[]{Activity.class}, new Object[]{activity});
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 同步游戏Activity的onStop
|
|
|
+ */
|
|
|
+ public void onStop(Activity activity) {
|
|
|
+ if (checkSdkBridgeNull(Function.ON_STOP, null)) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ SdkBridgeManager.call(Function.ON_STOP, new Class[]{Activity.class}, new Object[]{activity});
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 同步游戏Activity的onDestroy
|
|
|
+ */
|
|
|
+ public void onDestroy(Activity activity) {
|
|
|
+ if (checkSdkBridgeNull(Function.ON_DESTROY, null)) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ SdkBridgeManager.call(Function.ON_DESTROY, new Class[]{Activity.class}, new Object[]{activity});
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 同步游戏Activity的onActivityResult
|
|
|
+ */
|
|
|
+ public void onActivityResult(Activity activity, int requestCode, int resultCode, Intent intent) {
|
|
|
+ if (checkSdkBridgeNull(Function.ON_ACTIVITY_RESULT, null)) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ SdkBridgeManager.call(Function.ON_ACTIVITY_RESULT,
|
|
|
+ new Class[]{Activity.class, Integer.class, Integer.class, Intent.class},
|
|
|
+ new Object[]{activity, requestCode, resultCode, intent});
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 同步游戏Activity的onNewIntent
|
|
|
+ */
|
|
|
+ public void onNewIntent(Activity activity, Intent intent) {
|
|
|
+ if (checkSdkBridgeNull(Function.ON_NEW_INTENT, null)) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ SdkBridgeManager.call(Function.ON_NEW_INTENT, new Class[]{Activity.class, Intent.class}, new Object[]{activity, intent});
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 权限请求
|
|
|
+ *
|
|
|
+ * @param activity Activity上下文
|
|
|
+ * @param permissions 权限列表
|
|
|
+ * @param callback 权限请求回调对象
|
|
|
+ */
|
|
|
+ public void requestPermission(Activity activity, List<String> permissions, ICallback callback) {
|
|
|
+ if (checkSdkBridgeNull(Function.REQUEST_PERMISSION, null)) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ SdkBridgeManager.call(Function.REQUEST_PERMISSION,
|
|
|
+ new Class[]{Activity.class, List.class, ICallback.class},
|
|
|
+ new Object[]{activity, permissions, callback});
|
|
|
+ }
|
|
|
+
|
|
|
+ public String getCurrentOpenId() {
|
|
|
+ if (checkSdkBridgeNull(Function.GET_CURRENT_USER_ID, null)) {
|
|
|
+ return "";
|
|
|
+ }
|
|
|
+
|
|
|
+ if (checkSdkNonInit(Function.GET_CURRENT_USER_ID, null)) {
|
|
|
+ return "";
|
|
|
+ }
|
|
|
+
|
|
|
+ return (String) SdkBridgeManager.callback(Function.GET_CURRENT_USER_ID, null, null);
|
|
|
+ }
|
|
|
+
|
|
|
+ public String getCurrentSdkVersion() {
|
|
|
+ return Version.VERSION_NAME;
|
|
|
+ }
|
|
|
+
|
|
|
+ private boolean checkSdkBridgeNull(String function, ICallback callback) {
|
|
|
+ if (mSdkBridge == null) {
|
|
|
+ Logger.e("invoke " + function + " error ... SdkBridge is null");
|
|
|
+ if (callback != null) {
|
|
|
+ callback.onResult(-1, "QSGameSdk初始化失败");
|
|
|
+ }
|
|
|
+ return true;
|
|
|
+ } else {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ private boolean checkSdkNonInit(String function, ICallback callback) {
|
|
|
+ if (!doSdkInit) {
|
|
|
+ Logger.e("invoke " + function + " error ... QSGameSdk not initialized yet");
|
|
|
+ if (callback != null) {
|
|
|
+ callback.onResult(-1, "QSGameSdk还未进行初始化");
|
|
|
+ }
|
|
|
+ return true;
|
|
|
+ } else {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|