gravity_helper.dart 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. import 'dart:async';
  2. import 'package:flutter/widgets.dart';
  3. import 'package:gravity_engine/gravity_engine.dart';
  4. import 'package:gravity_engine/gravity_engine_method_channel.dart';
  5. import 'package:location/data/repositories/account_repository.dart';
  6. import 'package:location/data/repositories/config_repository.dart';
  7. import 'package:location/utils/atmob_log.dart';
  8. import '../../data/api/response/member_status_response.dart';
  9. import '../../data/consts/build_config.dart';
  10. import '../../data/consts/payment_type.dart';
  11. import '../../device/atmob_platform_info.dart';
  12. import '../../utils/async_util.dart';
  13. import '../../utils/mmkv_util.dart';
  14. typedef GravitySuccessCallback = void Function();
  15. class GravityHelper {
  16. static const String tag = 'GravityHelper';
  17. static const String _keyCurrentDeviceId = "current_device_id";
  18. static CancelableFuture<bool>? _initFuture;
  19. static String? _currentClientId;
  20. static bool? _isFromPromote;
  21. static init() {
  22. _initialize(false);
  23. _uploadClientId();
  24. }
  25. static _uploadClientId() {
  26. AsyncUtil.retryWithExponentialBackoff<void>(() async {
  27. String deviceId = await _getDeviceId(false);
  28. ConfigRepository.getInstance().uploadClientId(deviceId);
  29. }, 5)
  30. .then((_) {
  31. AtmobLog.d(tag, 'gravity uploadClientId success');
  32. }).catchError((error) {
  33. AtmobLog.d(tag, 'gravity uploadClientId error:$error');
  34. });
  35. }
  36. static _initialize(bool refreshDeviceId,
  37. {GravitySuccessCallback? callback}) async {
  38. _initFuture?.cancel();
  39. _initFuture = AsyncUtil.retryWithExponentialBackoff<bool>(() async {
  40. String deviceId = await _getDeviceId(refreshDeviceId);
  41. CancelableFuture<bool> initFuture = _gravityInitialize(deviceId);
  42. _initFuture = initFuture;
  43. return await initFuture;
  44. }, 5);
  45. _initFuture?.then((isPromote) {
  46. _isFromPromote = isPromote;
  47. callback?.call();
  48. }).catchError((error) {
  49. _initialize(refreshDeviceId, callback: callback);
  50. });
  51. }
  52. //目前返回deviceId
  53. static Future<String> _getDeviceId(bool refreshDeviceId) async {
  54. String? currentDeviceId = _getCurrentDeviceId();
  55. if (currentDeviceId == null || refreshDeviceId) {
  56. MemberStatusResponse response =
  57. await AccountRepository.getInstance().getMemberStatus();
  58. KVUtil.putString(_keyCurrentDeviceId, response.deviceId);
  59. return response.deviceId;
  60. }
  61. return currentDeviceId;
  62. }
  63. static String? _getCurrentDeviceId() {
  64. return KVUtil.getString(_keyCurrentDeviceId, null);
  65. }
  66. static CancelableFuture<bool> _gravityInitialize(String deviceId) {
  67. return AsyncUtil.retryWithExponentialBackoff<bool>(() {
  68. return GravityEngine.initialize(
  69. GravityConfig.gravityAppId,
  70. GravityConfig.gravityAccessToken,
  71. deviceId,
  72. atmobPlatformInfo.channelName ?? '',
  73. BuildConfig.isDebug)
  74. .then((data) {
  75. debugPrint('gravity initialize($deviceId) success');
  76. GravityHelper._currentClientId = deviceId;
  77. return data;
  78. });
  79. }, 5);
  80. }
  81. static void onLogin() {
  82. _clearCurrentDeviceId();
  83. _initialize(true, callback: () {
  84. if (_currentClientId != null) {
  85. GravityEngine.login(_currentClientId!);
  86. }
  87. });
  88. }
  89. static void onLogout() async {
  90. _currentClientId = null;
  91. await GravityEngine.logout();
  92. _initialize(false, callback: null);
  93. }
  94. static void _clearCurrentDeviceId() {
  95. KVUtil.putString(_keyCurrentDeviceId, null);
  96. }
  97. static bool? getIsFromPromote() {
  98. return _isFromPromote;
  99. }
  100. static void report(String eventId, {Map<String, dynamic>? params}) {
  101. GravityEngine.trackEvent(eventId, eventProperties: params);
  102. }
  103. static void reportPay(
  104. int payAmount, String orderNo, String productName, int payWay) {
  105. PayType payType;
  106. if (payWay == PayMethod.alipay) {
  107. payType = PayType.alipay;
  108. } else if (payWay == PayMethod.wechat) {
  109. payType = PayType.wechat;
  110. } else if (payWay == PayMethod.apple) {
  111. payType = PayType.apple;
  112. } else {
  113. payType = PayType.unknown;
  114. }
  115. GravityEngine.trackPay(
  116. orderNo, productName, payAmount, Currency.cny, payType);
  117. }
  118. }