EYuanCommSdk.kt 9.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342
  1. package cn.yyxx.eyuancomm.comm
  2. import android.app.Activity
  3. import android.app.Application
  4. import android.content.Context
  5. import android.content.Intent
  6. import android.os.Build
  7. import android.text.TextUtils
  8. import android.webkit.WebView
  9. import cn.yyxx.eyuancomm.Version
  10. import cn.yyxx.eyuancomm.comm.entity.Function
  11. import cn.yyxx.eyuancomm.comm.entity.SdkChargeInfo
  12. import cn.yyxx.eyuancomm.comm.entity.SdkEvent
  13. import cn.yyxx.eyuancomm.comm.entity.SdkRoleInfo
  14. import cn.yyxx.eyuancomm.comm.impl.CommSdkImpl
  15. import cn.yyxx.eyuancomm.comm.internal.ICallback
  16. import cn.yyxx.eyuancomm.comm.utils.Logger
  17. import cn.yyxx.support.AppUtils
  18. /**
  19. * @author #Suyghur.
  20. * Created on 2021/06/09
  21. */
  22. class EYuanCommSdk private constructor() {
  23. private var commSdkImpl: CommSdkImpl? = null
  24. private var processName: String = ""
  25. private var clickLoginTime = 0L
  26. private var clickLogoutTime = 0L
  27. private var clickChargeTime = 0L
  28. companion object {
  29. private const val CLICK_INTERVAL: Int = 1500
  30. @JvmStatic
  31. fun getInstance(): EYuanCommSdk {
  32. return EYuanCommSdkHolder.INSTANCE
  33. }
  34. private object EYuanCommSdkHolder {
  35. val INSTANCE: EYuanCommSdk = EYuanCommSdk()
  36. }
  37. /**
  38. * 防止单例对象在反序列化时重新生成对象
  39. */
  40. private fun readResolve(): Any {
  41. return EYuanCommSdkHolder.INSTANCE
  42. }
  43. }
  44. /**
  45. * 同步Application中的attachBaseContext
  46. */
  47. fun attachBaseContext(application: Application, context: Context) {
  48. if (TextUtils.isEmpty(processName)) {
  49. this.processName = AppUtils.getProcessName(application)
  50. }
  51. if (TextUtils.isEmpty(processName) || processName != context.packageName) {
  52. return
  53. }
  54. if (commSdkImpl == null) {
  55. commSdkImpl = CommSdkImpl(application)
  56. }
  57. commSdkImpl?.attachBaseContext(application, context)
  58. }
  59. /**
  60. * 同步Application中的onCreate
  61. */
  62. fun initApplication(application: Application) {
  63. if (TextUtils.isEmpty(processName)) {
  64. this.processName = AppUtils.getProcessName(application)
  65. }
  66. //处理Android P webView的坑
  67. if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
  68. try {
  69. if (application.packageName != processName) {
  70. WebView.setDataDirectorySuffix(processName)
  71. }
  72. } catch (e: Exception) {
  73. e.printStackTrace()
  74. }
  75. }
  76. if (TextUtils.isEmpty(processName) || processName != application.packageName) {
  77. return
  78. }
  79. if (commSdkImpl == null) {
  80. commSdkImpl = CommSdkImpl(application)
  81. }
  82. commSdkImpl?.initApplication(application)
  83. }
  84. /**
  85. * SDK初始化
  86. *
  87. * @param activity Activity上下文
  88. * @param isLandscape 是否横屏
  89. * @param callback SDK初始化回调
  90. */
  91. fun initialize(activity: Activity, isLandscape: Boolean, callback: ICallback) {
  92. if (checkSdkImplNull(Function.INITIALIZE, callback)) {
  93. return
  94. }
  95. commSdkImpl?.initialize(activity, isLandscape, callback)
  96. }
  97. /**
  98. * SDK用户登录
  99. *
  100. * @param activity Activity上下文
  101. * @param callback 登录回调对象
  102. */
  103. fun login(activity: Activity, callback: ICallback) {
  104. if (checkSdkImplNull(Function.LOGIN, callback)) {
  105. return
  106. }
  107. if (System.currentTimeMillis() - clickLoginTime < CLICK_INTERVAL) {
  108. Logger.e("调用登录接口太频繁,拦截此次操作")
  109. callback.onResult(-1, "调用登录接口太频繁")
  110. return
  111. }
  112. clickLoginTime = System.currentTimeMillis()
  113. commSdkImpl?.login(activity, callback)
  114. }
  115. /**
  116. * SDK用户登出账号
  117. *
  118. * @param activity Activity上下文
  119. * @param callback 登出回调对象
  120. */
  121. fun logout(activity: Activity, callback: ICallback) {
  122. if (checkSdkImplNull(Function.LOGOUT, callback)) {
  123. return
  124. }
  125. if (System.currentTimeMillis() - clickLoginTime < CLICK_INTERVAL) {
  126. Logger.e("调用登录接口后,调用登出账号接口间隔太短,拦截此次操作")
  127. callback.onResult(-1, "调用登录接口后,调用登出账号接口间隔太短")
  128. return
  129. }
  130. if (System.currentTimeMillis() - clickLogoutTime < CLICK_INTERVAL) {
  131. Logger.e("调用登出账号接口太频繁,拦截此次操作")
  132. callback.onResult(-1, "调用登出账号接口太频繁")
  133. return
  134. }
  135. clickLogoutTime = System.currentTimeMillis()
  136. commSdkImpl?.logout(activity, callback)
  137. }
  138. /**
  139. * SDK浮窗账号切换
  140. *
  141. * @param callback 切换回调对象
  142. */
  143. fun setOnFloatBallLogout(callback: ICallback) {
  144. if (checkSdkImplNull(Function.SET_ON_FLOAT_BALL_LOGOUT, callback)) {
  145. return
  146. }
  147. commSdkImpl?.setOnFloatBallLogout(callback)
  148. }
  149. /**
  150. * SDK用户支付
  151. *
  152. * @param activity Activity上下文
  153. * @param chargeInfo 支付信息实体对象
  154. * @param callback 支付回调对象
  155. */
  156. fun charge(activity: Activity, chargeInfo: SdkChargeInfo, callback: ICallback) {
  157. if (checkSdkImplNull(Function.CHARGE, callback)) {
  158. return
  159. }
  160. if (System.currentTimeMillis() - clickChargeTime < CLICK_INTERVAL) {
  161. Logger.e("调用充值接口太频繁,拦截此次操作")
  162. callback.onResult(-1, "调用充值接口太频繁")
  163. return
  164. }
  165. clickChargeTime = System.currentTimeMillis()
  166. commSdkImpl?.charge(activity, chargeInfo, callback)
  167. }
  168. /**
  169. * SDK角色创建信息上报
  170. *
  171. * @param activity Activity上下文
  172. * @param roleInfo 角色信息实体
  173. */
  174. fun roleCreate(activity: Activity, roleInfo: SdkRoleInfo) {
  175. if (checkSdkImplNull(Function.ROLE_CREATE, null)) {
  176. return
  177. }
  178. commSdkImpl?.roleCreate(activity, roleInfo)
  179. }
  180. /**
  181. * SDK角色登录信息上报
  182. *
  183. * @param activity Activity上下文
  184. * @param roleInfo 角色信息实体
  185. */
  186. fun roleLauncher(activity: Activity, roleInfo: SdkRoleInfo) {
  187. if (checkSdkImplNull(Function.ROLE_LAUNCHER, null)) {
  188. return
  189. }
  190. commSdkImpl?.roleLauncher(activity, roleInfo)
  191. }
  192. /**
  193. * SDK角色升级信息上报
  194. *
  195. * @param activity Activity上下文
  196. * @param roleInfo 角色信息实体
  197. */
  198. fun roleLevelUp(activity: Activity, roleInfo: SdkRoleInfo) {
  199. if (checkSdkImplNull(Function.ROLE_LEVEL_UP, null)) {
  200. return
  201. }
  202. commSdkImpl?.roleLevelUp(activity, roleInfo)
  203. }
  204. /**
  205. * 是否有渠道退出框
  206. *
  207. * @param activity Activity上下文
  208. */
  209. fun hasExitView(activity: Activity): Boolean {
  210. return if (checkSdkImplNull(Function.HAS_EXIT_VIEW, null)) {
  211. false
  212. } else {
  213. commSdkImpl!!.hasExitView(activity)
  214. }
  215. }
  216. /**
  217. * 显示退出框
  218. *
  219. * @param activity Activity上下文
  220. * @param callback 退出回调对象
  221. */
  222. fun openExitView(activity: Activity, callback: ICallback) {
  223. if (checkSdkImplNull(Function.OPEN_EXIT_VIEW, callback)) {
  224. return
  225. }
  226. commSdkImpl?.openExitView(activity, callback)
  227. }
  228. fun traceEvent(context: Context, sdkEvent: SdkEvent) {
  229. if (checkSdkImplNull(Function.TRACE_EVENT, null)) {
  230. return
  231. }
  232. commSdkImpl?.traceEvent(context, sdkEvent)
  233. }
  234. fun onStart(activity: Activity) {
  235. if (checkSdkImplNull(Function.ON_START, null)) {
  236. return
  237. }
  238. commSdkImpl?.onStart(activity)
  239. }
  240. fun onRestart(activity: Activity) {
  241. if (checkSdkImplNull(Function.ON_RESTART, null)) {
  242. return
  243. }
  244. commSdkImpl?.onRestart(activity)
  245. }
  246. fun onResume(activity: Activity) {
  247. if (checkSdkImplNull(Function.ON_RESUME, null)) {
  248. return
  249. }
  250. commSdkImpl?.onResume(activity)
  251. }
  252. fun onPause(activity: Activity) {
  253. if (checkSdkImplNull(Function.ON_PAUSE, null)) {
  254. return
  255. }
  256. commSdkImpl?.onPause(activity)
  257. }
  258. fun onStop(activity: Activity) {
  259. if (checkSdkImplNull(Function.ON_STOP, null)) {
  260. return
  261. }
  262. commSdkImpl?.onStop(activity)
  263. }
  264. fun onDestroy(activity: Activity) {
  265. if (checkSdkImplNull(Function.ON_DESTROY, null)) {
  266. return
  267. }
  268. commSdkImpl?.onDestroy(activity)
  269. }
  270. fun onActivityResult(activity: Activity, requestCode: Int, resultCode: Int, data: Intent?) {
  271. if (checkSdkImplNull(Function.ON_ACTIVITY_RESULT, null)) {
  272. return
  273. }
  274. commSdkImpl?.onActivityResult(activity, requestCode, resultCode, data)
  275. }
  276. fun onNewIntent(activity: Activity, intent: Intent?) {
  277. if (checkSdkImplNull(Function.ON_NEW_INTENT, null)) {
  278. return
  279. }
  280. commSdkImpl?.onNewIntent(activity, intent)
  281. }
  282. fun getCurrentUserId(): String {
  283. return if (checkSdkImplNull(Function.GET_CURRENT_USER_ID, null)) {
  284. return ""
  285. } else {
  286. commSdkImpl!!.getCurrentUserId()
  287. }
  288. }
  289. fun getSdkVersion(): String {
  290. return Version.VERSION_NAME
  291. }
  292. private fun checkSdkImplNull(function: String, callback: ICallback?): Boolean {
  293. return if (commSdkImpl == null) {
  294. Logger.e("invoke $function error ... EYuanCommSdk initialized failed or not initialized yet")
  295. callback?.onResult(-1, "EYuanCommSdk 初始化失败或还未进行初始化")
  296. true
  297. } else {
  298. false
  299. }
  300. }
  301. }