import 'dart:async'; import 'package:flutter/widgets.dart'; import 'package:gravity_engine/gravity_engine.dart'; import 'package:gravity_engine/gravity_engine_method_channel.dart'; import '../../data/api/response/user_info_response.dart'; import '../../data/consts/build_config.dart'; import '../../data/consts/payment_type.dart'; import '../../data/repository/account_repository.dart'; import '../../device/atmob_platform_info.dart'; import '../../utils/async_util.dart'; import '../../utils/mmkv_util.dart'; typedef GravitySuccessCallback = void Function(); class GravityHelper { static const String _keyCurrentSsid = "current_ssid"; static CancelableFuture? _initFuture; static String? _currentClientId; static bool? _isFromPromote; static init() async { _initialize(false); } static _initialize(bool refreshSSID, {GravitySuccessCallback? callback}) async { if (_initFuture != null) { _initFuture?.cancel(); } _initFuture = AsyncUtil.retryWithExponentialBackoff(() async { String ssid = await _getSSID(refreshSSID); CancelableFuture initFuture = _gravityInitialize(ssid); _initFuture = initFuture; return await initFuture; }, 5); _initFuture?.then((isPromote) { _isFromPromote = isPromote; callback?.call(); }).catchError((error) { _initialize(refreshSSID, callback: callback); }); } static Future _getSSID(bool refreshSSID) async { String? currentSSID = _getCurrentSSID(); if (currentSSID == null || refreshSSID) { UserInfoResponse response = await AccountRepository.getInstance().getUserInfo(); // 要用的是deviceID KVUtil.putString(_keyCurrentSsid, response.deviceId); return response.deviceId; } return currentSSID; } static String? _getCurrentSSID() { return KVUtil.getString(_keyCurrentSsid, null); } static CancelableFuture _gravityInitialize(String ssid) { return AsyncUtil.retryWithExponentialBackoff(() { return GravityEngine.initialize( GravityConfig.gravityAppId, GravityConfig.gravityAccessToken, ssid, atmobPlatformInfo.channelName ?? '', BuildConfig.isDebug) .then((data) { debugPrint('gravity initialize($ssid) success'); GravityHelper._currentClientId = ssid; return data; }); }, 5); } static void onLogin() { _clearCurrentSSID(); _initialize(true, callback: () { if (_currentClientId != null) { GravityEngine.login(_currentClientId!); } }); } static void onLogout() async { _currentClientId = null; await GravityEngine.logout(); _initialize(false, callback: null); } static void _clearCurrentSSID() { KVUtil.putString(_keyCurrentSsid, null); } static bool? getIsFromPromote() { return _isFromPromote; } static void report(String eventId, {Map? params}) { GravityEngine.trackEvent(eventId, eventProperties: params); } static void reportPay( int payAmount, String orderNo, String productName, int payWay) { PayType payType; if (payWay == PayMethod.alipay) { payType = PayType.alipay; } else if (payWay == PayMethod.wechat) { payType = PayType.wechat; } else if (payWay == PayMethod.apple) { payType = PayType.apple; } else { payType = PayType.unknown; } GravityEngine.trackPay( orderNo, productName, payAmount, Currency.cny, payType); } }