YYXXCommSdk.java 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466
  1. package cn.yyxx.commsdk.base;
  2. import android.app.Activity;
  3. import android.app.Application;
  4. import android.content.Context;
  5. import android.content.Intent;
  6. import android.content.res.Configuration;
  7. import android.os.Build;
  8. import android.text.TextUtils;
  9. import android.webkit.WebView;
  10. import java.util.List;
  11. import cn.yyxx.commsdk.Version;
  12. import cn.yyxx.commsdk.base.entity.Function;
  13. import cn.yyxx.commsdk.base.entity.SdkChargeInfo;
  14. import cn.yyxx.commsdk.base.entity.SdkRoleInfo;
  15. import cn.yyxx.commsdk.base.internal.ICallback;
  16. import cn.yyxx.commsdk.base.internal.IInitialize;
  17. import cn.yyxx.commsdk.base.utils.Logger;
  18. import cn.yyxx.support.AppUtils;
  19. /**
  20. * @author #Suyghur.
  21. * Created on 2021/12/25
  22. */
  23. public final class YYXXCommSdk {
  24. private static final long CLICK_INTERVAL = 1500L;
  25. private Object mSdkBridge = null;
  26. private long clickLoginTime = 0L;
  27. private long clickLogoutTime = 0L;
  28. private long clickChargeTime = 0L;
  29. private String processName = "";
  30. private boolean doSdkInit = false;
  31. private YYXXCommSdk() {
  32. }
  33. public static YYXXCommSdk getInstance() {
  34. return YYXXCommSdkHolder.INSTANCE;
  35. }
  36. private static final class YYXXCommSdkHolder {
  37. private static final YYXXCommSdk INSTANCE = new YYXXCommSdk();
  38. /**
  39. * 防止单例对象在反序列化时重新生成对象
  40. */
  41. private static Object readResolve() {
  42. return INSTANCE;
  43. }
  44. }
  45. private Object getSdkBridgeManager(Context context) {
  46. if (null == mSdkBridge) {
  47. mSdkBridge = SdkBridgeManager.initSdkBridgeManager(context);
  48. }
  49. return mSdkBridge;
  50. }
  51. /**
  52. * 同步Application中的attachBaseContext
  53. *
  54. * @param application Application上下文对象
  55. * @param context Context上下文对象
  56. */
  57. public void attachBaseContext(Application application, Context context) {
  58. if (TextUtils.isEmpty(processName)) {
  59. processName = AppUtils.getProcessName(context);
  60. }
  61. if (TextUtils.isEmpty(processName) || !processName.equals(context.getPackageName())) {
  62. return;
  63. }
  64. if (mSdkBridge == null) {
  65. mSdkBridge = getSdkBridgeManager(context);
  66. }
  67. SdkBridgeManager.call(Function.ATTACH_BASE_CONTEXT, new Class[]{Application.class, Context.class}, new Object[]{application, context});
  68. }
  69. /**
  70. * 同步Application中的onCreate
  71. *
  72. * @param application Application上下文对象
  73. */
  74. public void initApplication(Application application) {
  75. if (TextUtils.isEmpty(processName)) {
  76. processName = AppUtils.getProcessName(application);
  77. }
  78. if (TextUtils.isEmpty(processName) || !processName.equals(application.getPackageName())) {
  79. return;
  80. }
  81. //适配Android P WebView
  82. if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
  83. try {
  84. if (!application.getPackageName().equals(processName)) {
  85. Logger.d("Android P 设置webView不同的目录");
  86. WebView.setDataDirectorySuffix(processName);
  87. }
  88. } catch (Exception e) {
  89. e.printStackTrace();
  90. }
  91. }
  92. if (mSdkBridge == null) {
  93. mSdkBridge = getSdkBridgeManager(application);
  94. }
  95. SdkBridgeManager.call(Function.INIT_APPLICATION, new Class[]{Application.class}, new Object[]{application});
  96. }
  97. /**
  98. * SDK初始化
  99. *
  100. * @param activity Activity上下文
  101. * @param isLandscape 是否横屏
  102. * @param callback SDK初始化回调
  103. */
  104. public void initialize(Activity activity, Boolean isLandscape, final ICallback callback) {
  105. if (checkSdkBridgeNull(Function.INITIALIZE, callback)) {
  106. return;
  107. }
  108. //有些CP自己请求了权限,导致回调权限2次,执行2次initFuseSdk,这里拦截一下
  109. if (doSdkInit) {
  110. Logger.e("QSGameSdk initialize 已经执行,拦截此次调用");
  111. return;
  112. }
  113. IInitialize initCallback = (code, result) -> {
  114. doSdkInit = code == 0;
  115. callback.onResult(code, result);
  116. };
  117. SdkBridgeManager.call(Function.INITIALIZE, new Class[]{Activity.class, Boolean.class, IInitialize.class}, new Object[]{activity, isLandscape, initCallback});
  118. }
  119. /**
  120. * SDK用户登录
  121. *
  122. * @param activity Activity上下文
  123. * @param callback 登录回调对象
  124. */
  125. public void login(Activity activity, ICallback callback) {
  126. if (checkSdkBridgeNull(Function.LOGIN, callback)) {
  127. return;
  128. }
  129. if (checkSdkNonInit(Function.LOGIN, callback)) {
  130. return;
  131. }
  132. if (System.currentTimeMillis() - clickLoginTime < CLICK_INTERVAL) {
  133. Logger.e("调用登录接口太频繁,拦截此次操作");
  134. return;
  135. }
  136. clickLoginTime = System.currentTimeMillis();
  137. SdkBridgeManager.call(Function.LOGIN, new Class[]{Activity.class, ICallback.class}, new Object[]{activity, callback});
  138. }
  139. /**
  140. * SDK用户登出账号
  141. *
  142. * @param activity Activity上下文
  143. * @param callback 登出回调对象
  144. */
  145. public void logout(Activity activity, ICallback callback) {
  146. if (checkSdkBridgeNull(Function.LOGOUT, callback)) {
  147. return;
  148. }
  149. if (checkSdkNonInit(Function.LOGOUT, callback)) {
  150. return;
  151. }
  152. if (System.currentTimeMillis() - clickLoginTime < CLICK_INTERVAL) {
  153. Logger.e("调用登录接口后,调用登出账号接口间隔太短,拦截此次操作");
  154. return;
  155. }
  156. if (System.currentTimeMillis() - clickLogoutTime < CLICK_INTERVAL) {
  157. Logger.e("调用登出账号接口太频繁,拦截此次操作");
  158. return;
  159. }
  160. clickLogoutTime = System.currentTimeMillis();
  161. SdkBridgeManager.call(Function.LOGOUT, new Class[]{Activity.class, ICallback.class}, new Object[]{activity, callback});
  162. }
  163. /**
  164. * SDK用户支付
  165. *
  166. * @param activity Activity上下文
  167. * @param chargeInfo 支付信息实体对象
  168. * @param callback 支付回调对象
  169. */
  170. public void charge(Activity activity, SdkChargeInfo chargeInfo, ICallback callback) {
  171. if (checkSdkBridgeNull(Function.CHARGE, callback)) {
  172. return;
  173. }
  174. if (checkSdkNonInit(Function.CHARGE, callback)) {
  175. return;
  176. }
  177. if (System.currentTimeMillis() - clickChargeTime < CLICK_INTERVAL) {
  178. Logger.e("调用充值接口太频繁,拦截此次操作");
  179. return;
  180. }
  181. clickChargeTime = System.currentTimeMillis();
  182. SdkBridgeManager.call(Function.CHARGE, new Class[]{Activity.class, SdkChargeInfo.class, ICallback.class}, new Object[]{activity, chargeInfo, callback});
  183. }
  184. /**
  185. * SDK角色创建信息上报
  186. *
  187. * @param activity Activity上下文
  188. * @param roleInfo 角色信息实体
  189. * @param callback 角色信息上报回调对象
  190. */
  191. public void roleCreate(Activity activity, SdkRoleInfo roleInfo, ICallback callback) {
  192. if (checkSdkBridgeNull(Function.ROLE_CREATE, callback)) {
  193. return;
  194. }
  195. if (checkSdkNonInit(Function.ROLE_CREATE, callback)) {
  196. return;
  197. }
  198. SdkBridgeManager.call(Function.ROLE_CREATE, new Class[]{Activity.class, SdkRoleInfo.class, ICallback.class}, new Object[]{activity, roleInfo, callback});
  199. }
  200. /**
  201. * SDK角色登录信息上报
  202. *
  203. * @param activity Activity上下文
  204. * @param roleInfo 角色信息实体
  205. * @param callback 角色信息上报回调对象
  206. */
  207. public void roleLauncher(Activity activity, SdkRoleInfo roleInfo, ICallback callback) {
  208. if (checkSdkBridgeNull(Function.ROLE_LAUNCHER, callback)) {
  209. return;
  210. }
  211. if (checkSdkNonInit(Function.ROLE_LAUNCHER, callback)) {
  212. return;
  213. }
  214. SdkBridgeManager.call(Function.ROLE_LAUNCHER, new Class[]{Activity.class, SdkRoleInfo.class, ICallback.class}, new Object[]{activity, roleInfo, callback});
  215. }
  216. /**
  217. * SDK角色升级信息上报
  218. *
  219. * @param activity Activity上下文
  220. * @param roleInfo 角色信息实体
  221. * @param callback 角色信息上报回调对象
  222. */
  223. public void roleUpgrade(Activity activity, SdkRoleInfo roleInfo, ICallback callback) {
  224. if (checkSdkBridgeNull(Function.ROLE_UPGRADE, callback)) {
  225. return;
  226. }
  227. if (checkSdkNonInit(Function.ROLE_UPGRADE, callback)) {
  228. return;
  229. }
  230. SdkBridgeManager.call(Function.ROLE_UPGRADE, new Class[]{Activity.class, SdkRoleInfo.class, ICallback.class}, new Object[]{activity, roleInfo, callback});
  231. }
  232. /**
  233. * 是否显示SDK退出框
  234. *
  235. * @param activity Activity上下文
  236. */
  237. public Boolean hasExitView(Activity activity) {
  238. if (checkSdkBridgeNull(Function.HAS_EXIT_VIEW, null)) {
  239. return false;
  240. }
  241. if (checkSdkNonInit(Function.HAS_EXIT_VIEW, null)) {
  242. return false;
  243. }
  244. return (Boolean) SdkBridgeManager.callback(Function.HAS_EXIT_VIEW, new Class[]{Activity.class}, new Object[]{activity});
  245. }
  246. /**
  247. * 显示退出框
  248. *
  249. * @param activity Activity上下文
  250. * @param callback 退出回调对象
  251. */
  252. public void openExitView(Activity activity, ICallback callback) {
  253. if (checkSdkBridgeNull(Function.OPEN_EXIT_VIEW, null)) {
  254. return;
  255. }
  256. if (checkSdkNonInit(Function.OPEN_EXIT_VIEW, null)) {
  257. return;
  258. }
  259. SdkBridgeManager.call(Function.OPEN_EXIT_VIEW, new Class[]{Activity.class, ICallback.class}, new Object[]{activity, callback});
  260. }
  261. /**
  262. * 同步游戏Activity的onStart
  263. */
  264. public void onStart(Activity activity) {
  265. if (checkSdkBridgeNull(Function.ON_START, null)) {
  266. return;
  267. }
  268. SdkBridgeManager.call(Function.ON_START, new Class[]{Activity.class}, new Object[]{activity});
  269. }
  270. /**
  271. * 同步游戏Activity的onRestart
  272. */
  273. public void onRestart(Activity activity) {
  274. if (checkSdkBridgeNull(Function.ON_RESTART, null)) {
  275. return;
  276. }
  277. SdkBridgeManager.call(Function.ON_RESTART, new Class[]{Activity.class}, new Object[]{activity});
  278. }
  279. /**
  280. * 同步游戏Activity的onResume
  281. */
  282. public void onResume(Activity activity) {
  283. if (checkSdkBridgeNull(Function.ON_RESUME, null)) {
  284. return;
  285. }
  286. SdkBridgeManager.call(Function.ON_RESUME, new Class[]{Activity.class}, new Object[]{activity});
  287. }
  288. /**
  289. * 同步游戏Activity的onPause
  290. */
  291. public void onPause(Activity activity) {
  292. if (checkSdkBridgeNull(Function.ON_PAUSE, null)) {
  293. return;
  294. }
  295. SdkBridgeManager.call(Function.ON_PAUSE, new Class[]{Activity.class}, new Object[]{activity});
  296. }
  297. /**
  298. * 同步游戏Activity的onStop
  299. */
  300. public void onStop(Activity activity) {
  301. if (checkSdkBridgeNull(Function.ON_STOP, null)) {
  302. return;
  303. }
  304. SdkBridgeManager.call(Function.ON_STOP, new Class[]{Activity.class}, new Object[]{activity});
  305. }
  306. /**
  307. * 同步游戏Activity的onDestroy
  308. */
  309. public void onDestroy(Activity activity) {
  310. if (checkSdkBridgeNull(Function.ON_DESTROY, null)) {
  311. return;
  312. }
  313. SdkBridgeManager.call(Function.ON_DESTROY, new Class[]{Activity.class}, new Object[]{activity});
  314. }
  315. /**
  316. * 同步游戏Activity的onActivityResult
  317. */
  318. public void onActivityResult(Activity activity, int requestCode, int resultCode, Intent intent) {
  319. if (checkSdkBridgeNull(Function.ON_ACTIVITY_RESULT, null)) {
  320. return;
  321. }
  322. SdkBridgeManager.call(Function.ON_ACTIVITY_RESULT,
  323. new Class[]{Activity.class, Integer.class, Integer.class, Intent.class},
  324. new Object[]{activity, requestCode, resultCode, intent});
  325. }
  326. /**
  327. * 同步游戏Activity的onNewIntent
  328. */
  329. public void onNewIntent(Activity activity, Intent intent) {
  330. if (checkSdkBridgeNull(Function.ON_NEW_INTENT, null)) {
  331. return;
  332. }
  333. SdkBridgeManager.call(Function.ON_NEW_INTENT, new Class[]{Activity.class, Intent.class}, new Object[]{activity, intent});
  334. }
  335. /**
  336. * 权限请求
  337. *
  338. * @param activity Activity上下文
  339. * @param permissions 权限列表
  340. * @param callback 权限请求回调对象
  341. */
  342. public void requestPermission(Activity activity, List<String> permissions, ICallback callback) {
  343. if (checkSdkBridgeNull(Function.REQUEST_PERMISSION, null)) {
  344. return;
  345. }
  346. SdkBridgeManager.call(Function.REQUEST_PERMISSION,
  347. new Class[]{Activity.class, List.class, ICallback.class},
  348. new Object[]{activity, permissions, callback});
  349. }
  350. public void onConfigurationChanged(Configuration newConfigs) {
  351. if (checkSdkBridgeNull(Function.ON_CONFIGURATION_CHANGED, null)) {
  352. return;
  353. }
  354. SdkBridgeManager.call(Function.ON_CONFIGURATION_CHANGED, new Class[]{Intent.class}, new Object[]{newConfigs});
  355. }
  356. public void onRequestPermissionsResult(int requestCode,String[] permissions,int[] grantResults){
  357. if (checkSdkBridgeNull(Function.ON_REQUEST_PERMISSIONS_RESULT, null)) {
  358. return;
  359. }
  360. SdkBridgeManager.call(Function.ON_REQUEST_PERMISSIONS_RESULT, new Class[]{int.class,String[].class,int[].class}, new Object[]{requestCode,permissions,grantResults});
  361. }
  362. public String getCurrentOpenId() {
  363. if (checkSdkBridgeNull(Function.GET_CURRENT_USER_ID, null)) {
  364. return "";
  365. }
  366. if (checkSdkNonInit(Function.GET_CURRENT_USER_ID, null)) {
  367. return "";
  368. }
  369. return (String) SdkBridgeManager.callback(Function.GET_CURRENT_USER_ID, null, null);
  370. }
  371. public String getCurrentSdkVersion() {
  372. return Version.VERSION_NAME;
  373. }
  374. private boolean checkSdkBridgeNull(String function, ICallback callback) {
  375. if (mSdkBridge == null) {
  376. Logger.e("invoke " + function + " error ... SdkBridge is null");
  377. if (callback != null) {
  378. callback.onResult(-1, "QSGameSdk初始化失败");
  379. }
  380. return true;
  381. } else {
  382. return false;
  383. }
  384. }
  385. private boolean checkSdkNonInit(String function, ICallback callback) {
  386. if (!doSdkInit) {
  387. Logger.e("invoke " + function + " error ... QSGameSdk not initialized yet");
  388. if (callback != null) {
  389. callback.onResult(-1, "QSGameSdk还未进行初始化");
  390. }
  391. return true;
  392. } else {
  393. return false;
  394. }
  395. }
  396. }