diff --git a/lib/services/billing_service.dart b/lib/services/billing_service.dart index f750f4077..6350047a9 100644 --- a/lib/services/billing_service.dart +++ b/lib/services/billing_service.dart @@ -1,6 +1,7 @@ import 'dart:io'; import 'package:dio/dio.dart'; +import 'package:in_app_purchase/in_app_purchase.dart'; import 'package:logging/logging.dart'; import 'package:photos/core/configuration.dart'; import 'package:photos/core/network.dart'; @@ -9,7 +10,7 @@ import 'package:photos/models/subscription.dart'; import 'package:shared_preferences/shared_preferences.dart'; class BillingService { - BillingService._privateConstructor() {} + BillingService._privateConstructor(); static final BillingService instance = BillingService._privateConstructor(); static const subscriptionKey = "subscription"; @@ -18,11 +19,33 @@ class BillingService { final _dio = Network.instance.getDio(); final _config = Configuration.instance; + bool _isOnSubscriptionPage = false; + SharedPreferences _prefs; Future> _future; Future init() async { _prefs = await SharedPreferences.getInstance(); + InAppPurchaseConnection.instance.purchaseUpdatedStream + .listen((event) async { + if (_isOnSubscriptionPage) { + return; + } + for (final e in event) { + if (e.status == PurchaseStatus.purchased) { + try { + await verifySubscription( + e.productID, e.verificationData.serverVerificationData); + } catch (e) { + _logger.warning("Could not complete payment ", e); + return; + } + await InAppPurchaseConnection.instance.completePurchase(e); + } else if (Platform.isIOS && e.pendingCompletePurchase) { + await InAppPurchaseConnection.instance.completePurchase(e); + } + } + }); } Future> getBillingPlans() { @@ -84,4 +107,8 @@ class BillingService { await _prefs.setString( subscriptionKey, subscription == null ? null : subscription.toJson()); } + + void setIsOnSubscriptionPage(bool isOnSubscriptionPage) { + _isOnSubscriptionPage = isOnSubscriptionPage; + } } diff --git a/lib/ui/subscription_page.dart b/lib/ui/subscription_page.dart index 7b7f494dd..705ea5ab8 100644 --- a/lib/ui/subscription_page.dart +++ b/lib/ui/subscription_page.dart @@ -27,7 +27,7 @@ class _SubscriptionPageState extends State { @override void initState() { - InAppPurchaseConnection.enablePendingPurchases(); + BillingService.instance.setIsOnSubscriptionPage(true); _purchaseUpdateSubscription = InAppPurchaseConnection .instance.purchaseUpdatedStream .listen((event) async { @@ -81,6 +81,7 @@ class _SubscriptionPageState extends State { @override void dispose() { _purchaseUpdateSubscription.cancel(); + BillingService.instance.setIsOnSubscriptionPage(false); super.dispose(); }