88 lines
3.4 KiB
Dart
88 lines
3.4 KiB
Dart
|
|
import 'package:guru_app/financial/asset/assets_model.dart';
|
||
|
|
import 'package:guru_app/financial/asset/assets_store.dart';
|
||
|
|
import 'package:guru_app/financial/financial_manager.dart';
|
||
|
|
import 'package:guru_app/financial/iap/iap_manager.dart';
|
||
|
|
import 'package:guru_app/financial/iap/iap_model.dart';
|
||
|
|
import 'package:guru_app/financial/igc/igc_manager.dart';
|
||
|
|
import 'package:guru_app/financial/igc/igc_model.dart';
|
||
|
|
import 'package:guru_app/financial/product/product_store.dart';
|
||
|
|
import 'package:guru_app/financial/reward/reward_manager.dart';
|
||
|
|
import 'package:guru_app/financial/reward/reward_model.dart';
|
||
|
|
import 'package:guru_app/guru_app.dart';
|
||
|
|
import 'package:guru_app/test/test_guru_app_creator.dart';
|
||
|
|
import 'package:guru_utils/datetime/datetime_utils.dart';
|
||
|
|
import 'package:guru_utils/extensions/extensions.dart';
|
||
|
|
import 'package:guru_utils/controller/controller.dart';
|
||
|
|
|
||
|
|
/// Created by Haoyi on 2022/4/7
|
||
|
|
|
||
|
|
mixin AssetsAware on LifecycleController {
|
||
|
|
final BehaviorSubject<ProductStore<IapProduct>> _productStoreSubject =
|
||
|
|
BehaviorSubject.seeded(ProductStore());
|
||
|
|
|
||
|
|
ProductStore<IapProduct> get currentProductStore => _productStoreSubject.value;
|
||
|
|
|
||
|
|
AssetsStore<Asset> get currentIapAssetStore => IapManager.instance.purchasedStore;
|
||
|
|
|
||
|
|
AssetsStore<Asset> get currentRewardedStore => RewardManager.instance.rewardedStore;
|
||
|
|
|
||
|
|
Stream<ProductStore<IapProduct>> get observableProductStore => _productStoreSubject.stream;
|
||
|
|
|
||
|
|
Stream<AssetsStore<Asset>> get observableIapPurchased => IapManager.instance.observableAssetStore;
|
||
|
|
|
||
|
|
Stream<AssetsStore<Asset>> get observableRewarded => RewardManager.instance.observableAssetStore;
|
||
|
|
|
||
|
|
Stream<AssetsStore<Asset>> get observableAssets => FinancialManager.instance.observableAssets;
|
||
|
|
|
||
|
|
int _latestRefreshIapProductTimestamp = 0;
|
||
|
|
|
||
|
|
bool get isIapCanceled => IapManager.instance.latestIapCause == IapCause.canceled;
|
||
|
|
|
||
|
|
bool get isIapError => IapManager.instance.latestIapCause == IapCause.error;
|
||
|
|
|
||
|
|
int get currentIgcBalance => IgcManager.instance.currentBalance;
|
||
|
|
|
||
|
|
Stream<int> get observableIgcBalance => IgcManager.instance.observableCurrentBalance;
|
||
|
|
|
||
|
|
Future restorePurchases() async {
|
||
|
|
return await IapManager.instance.restorePurchases();
|
||
|
|
}
|
||
|
|
|
||
|
|
Future clearIapAssets() async {
|
||
|
|
return await IapManager.instance.clearAssetRecord();
|
||
|
|
}
|
||
|
|
|
||
|
|
void observeIapProducts(Set<TransactionIntent> intents) {
|
||
|
|
addSubscription(IapManager.instance.observableProductDetails.listen((details) async {
|
||
|
|
final productStore = await IapManager.instance.buildProducts(intents);
|
||
|
|
_productStoreSubject.addEx(productStore);
|
||
|
|
}));
|
||
|
|
}
|
||
|
|
|
||
|
|
void refreshIapProducts() async {
|
||
|
|
final now = DateTimeUtils.currentTimeInMillis();
|
||
|
|
if (now - _latestRefreshIapProductTimestamp > DateTimeUtils.minuteInMillis) {
|
||
|
|
IapManager.instance.refreshProducts();
|
||
|
|
_latestRefreshIapProductTimestamp = now;
|
||
|
|
} else {
|
||
|
|
Log.w("refreshIapProducts Too Frequency!", tag: "IAP");
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
Future<RewardProduct> buildRewardProduct(TransactionIntent intent) {
|
||
|
|
return RewardManager.instance.buildRewardProduct(intent);
|
||
|
|
}
|
||
|
|
|
||
|
|
Future<bool> requestProduct(Product product, {String from = ""}) async {
|
||
|
|
if (product is IapProduct) {
|
||
|
|
return await IapManager.instance.buy(product);
|
||
|
|
} else if (product is IgcProduct) {
|
||
|
|
return await IgcManager.instance.purchase(product);
|
||
|
|
} else if (product is RewardProduct) {
|
||
|
|
return await RewardManager.instance.claim(product);
|
||
|
|
} else {
|
||
|
|
return false;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|