IAP: Always check

Disable the optimization of not checking for pro mode on boot. The
optimization fails and pro members cannot always get the pro features.
This is not good.

As a workaround, opening the but pro mode page also checks if already
purchased.
This commit is contained in:
Vishesh Handa
2020-07-05 20:38:06 +02:00
parent 4767f743d1
commit bb8cb5e442
5 changed files with 22 additions and 11 deletions

View File

@ -7,6 +7,7 @@ import 'package:flutter/material.dart';
import 'package:flutter/foundation.dart' as foundation; import 'package:flutter/foundation.dart' as foundation;
import 'package:gitjournal/analytics.dart'; import 'package:gitjournal/analytics.dart';
import 'package:gitjournal/iap.dart';
import 'package:gitjournal/screens/filesystem_screen.dart'; import 'package:gitjournal/screens/filesystem_screen.dart';
import 'package:gitjournal/screens/folder_listing.dart'; import 'package:gitjournal/screens/folder_listing.dart';
import 'package:gitjournal/screens/tag_listing.dart'; import 'package:gitjournal/screens/tag_listing.dart';
@ -96,6 +97,8 @@ class JournalApp extends StatefulWidget {
), ),
); );
InAppPurchases.confirmProPurchase();
runApp(EasyLocalization( runApp(EasyLocalization(
child: app, child: app,
supportedLocales: [ supportedLocales: [

View File

@ -7,17 +7,15 @@ import 'package:in_app_purchase/in_app_purchase.dart';
import 'package:gitjournal/settings.dart'; import 'package:gitjournal/settings.dart';
class InAppPurchases { class InAppPurchases {
static void confirmProPurchase() async { static Future<void> confirmProPurchase() async {
Log.i("Checking if ProMode should be enabled");
var currentDt = DateTime.now().toUtc().toIso8601String(); var currentDt = DateTime.now().toUtc().toIso8601String();
var exp = Settings.instance.proExpirationDate; var exp = Settings.instance.proExpirationDate;
if (exp != null && exp.isNotEmpty && exp.compareTo(currentDt) > 0) { if (exp != null && exp.isNotEmpty && exp.compareTo(currentDt) > 0) {
Log.i("Not checking PurchaseInfo as exp = $exp and cur = $currentDt"); Log.i("Not checking PurchaseInfo as exp = $exp and cur = $currentDt");
return; return;
} }
if (exp == "-") {
Log.d("Ignoring IAP pro check - already checked");
return;
}
if (JournalApp.isInDebugMode) { if (JournalApp.isInDebugMode) {
Log.d("Ignoring IAP pro check - debug mode"); Log.d("Ignoring IAP pro check - debug mode");
@ -26,15 +24,16 @@ class InAppPurchases {
var sub = await _subscriptionStatus(); var sub = await _subscriptionStatus();
var isPro = sub == null ? false : sub.isPro; var isPro = sub == null ? false : sub.isPro;
Log.i("IsPro $isPro"); var expiryDate = sub == null ? "" : sub.expiryDate.toIso8601String();
Log.i(sub.toString());
if (Settings.instance.proMode != isPro) { if (Settings.instance.proMode != isPro) {
Log.i("Pro mode changed to $isPro"); Log.i("Pro mode changed to $isPro");
Settings.instance.proMode = isPro; Settings.instance.proMode = isPro;
Settings.instance.proExpirationDate = expiryDate;
Settings.instance.save(); Settings.instance.save();
} else { } else {
Settings.instance.proExpirationDate = Settings.instance.proExpirationDate = expiryDate;
sub != null ? sub.expiryDate.toIso8601String() : "-";
Settings.instance.save(); Settings.instance.save();
} }
} }
@ -48,6 +47,7 @@ class InAppPurchases {
} else if (Platform.isAndroid) { } else if (Platform.isAndroid) {
var response = await iapConn.queryPastPurchases(); var response = await iapConn.queryPastPurchases();
if (response.pastPurchases.isEmpty) { if (response.pastPurchases.isEmpty) {
Log.i("No Past Purchases Found");
return null; return null;
} }
@ -83,4 +83,8 @@ class SubscriptionStatus {
final DateTime expiryDate; final DateTime expiryDate;
SubscriptionStatus(this.isPro, this.expiryDate); SubscriptionStatus(this.isPro, this.expiryDate);
@override
String toString() =>
"SubscriptionStatus{isPro: $isPro, expiryDate: $expiryDate}";
} }

View File

@ -1,7 +1,6 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:gitjournal/core/flattened_notes_folder.dart'; import 'package:gitjournal/core/flattened_notes_folder.dart';
import 'package:gitjournal/core/notes_folder.dart'; import 'package:gitjournal/core/notes_folder.dart';
import 'package:gitjournal/iap.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import 'package:intl/date_symbol_data_local.dart'; import 'package:intl/date_symbol_data_local.dart';
@ -22,8 +21,6 @@ class _HomeScreenState extends State<HomeScreen> {
super.initState(); super.initState();
initializeDateFormatting(); initializeDateFormatting();
InAppPurchases.confirmProPurchase();
Future.delayed(Duration.zero, _initFolder); Future.delayed(Duration.zero, _initFolder);
} }

View File

@ -7,6 +7,7 @@ import 'package:flutter/services.dart';
import 'package:gitjournal/analytics.dart'; import 'package:gitjournal/analytics.dart';
import 'package:gitjournal/.env.dart'; import 'package:gitjournal/.env.dart';
import 'package:gitjournal/iap.dart';
import 'package:gitjournal/settings.dart'; import 'package:gitjournal/settings.dart';
import 'package:purchases_flutter/purchases_flutter.dart'; import 'package:purchases_flutter/purchases_flutter.dart';
@ -28,6 +29,11 @@ class _PurchaseScreenState extends State<PurchaseScreen> {
} }
Future<void> initPlatformState() async { Future<void> initPlatformState() async {
await InAppPurchases.confirmProPurchase();
if (Settings.instance.proMode) {
Navigator.of(context).pop();
}
await Purchases.setup( await Purchases.setup(
environment['revenueCat'], environment['revenueCat'],
appUserId: Settings.instance.pseudoId, appUserId: Settings.instance.pseudoId,

View File

@ -220,6 +220,7 @@ class Settings {
"folderViewHeaderType": folderViewHeaderType, "folderViewHeaderType": folderViewHeaderType,
"version": version.toString(), "version": version.toString(),
"proMode": proMode.toString(), "proMode": proMode.toString(),
'proExpirationDate': proExpirationDate,
'pseudoId': pseudoId, 'pseudoId': pseudoId,
'markdownDefaultView': markdownDefaultView.toInternalString(), 'markdownDefaultView': markdownDefaultView.toInternalString(),
'homeScreen': homeScreen.toInternalString(), 'homeScreen': homeScreen.toInternalString(),