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 'package:location/data/repositories/account_repository.dart'; import 'package:location/data/repositories/config_repository.dart'; import 'package:location/utils/atmob_log.dart'; import 'package:location/utils/toast_util.dart'; import '../../data/api/response/member_status_response.dart'; import '../../data/consts/build_config.dart'; import '../../data/consts/payment_type.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 tag = 'GravityHelper'; static const String _keyCurrentDeviceId = "current_device_id"; static const bool _isShowToast = false; static String? _currentClientId; static bool? _isFromPromote; static bool isInit = false; static init() { if (isInit) { return; } isInit = true; _initialize(false); _uploadClientId(); } static _uploadClientId() { AsyncUtil.retryWithExponentialBackoff(() async { String deviceId = await _getDeviceId(false); ConfigRepository.getInstance().uploadClientId(deviceId); }, 5) .then((_) { AtmobLog.d(tag, 'gravity uploadClientId success'); }).catchError((error) { AtmobLog.d(tag, 'gravity uploadClientId error:$error'); }); } static _initialize(bool refreshDeviceId, {GravitySuccessCallback? callback}) async { AsyncUtil.retryWithExponentialBackoff(() async { String deviceId = await _getDeviceId(refreshDeviceId); CancelableFuture initFuture = _gravityInitialize(deviceId); return await initFuture; }, 5) .then((isPromote) { _isFromPromote = isPromote; callback?.call(); }).catchError((error) { if (error is CancelledError) { return; } _initialize(refreshDeviceId, callback: callback); }); } //目前返回deviceId static Future _getDeviceId(bool refreshDeviceId) async { String? currentDeviceId = _getCurrentDeviceId(); if (currentDeviceId == null || refreshDeviceId) { MemberStatusResponse response = await AccountRepository.getInstance().getMemberStatus(); KVUtil.putString(_keyCurrentDeviceId, response.deviceId); return response.deviceId; } return currentDeviceId; } static String? _getCurrentDeviceId() { return KVUtil.getString(_keyCurrentDeviceId, null); } static CancelableFuture _gravityInitialize(String deviceId) { return AsyncUtil.retryWithExponentialBackoff(() { return GravityEngine.initialize( GravityConfig.gravityAppId, GravityConfig.gravityAccessToken, deviceId, atmobPlatformInfo.channelName ?? '', BuildConfig.isDebug) .then((data) { _toast('gravity initialize success clientId:$deviceId'); debugPrint('gravity initialize success clientId:$deviceId'); GravityHelper._currentClientId = deviceId; return data; }); }, 5); } static void _toast(String msg) { if (_isShowToast) { ToastUtil.show(msg); } } static void onLogin() {} static void onLogout() async {} static void _clearCurrentDeviceId() { KVUtil.putString(_keyCurrentDeviceId, 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); } }